From 7c220ed9d64ddfdb9971e4a6a55cd8f0011080b8 Mon Sep 17 00:00:00 2001 From: Felix Brendel Date: Tue, 18 Feb 2020 10:52:05 +0100 Subject: [PATCH] Work transfer --- .gitignore | 52 +- .gitmodules | 6 +- 3rd/ftb | 2 +- bin/alist.slime | 380 +- bin/automata.slime | 24 +- bin/emoji.slime | 7662 ++++++++--------- bin/generate-docs.slime | 16 +- bin/interpolation.slime | 90 +- bin/math.slime | 120 +- bin/oo.slime | 50 +- bin/pre.slime | 1015 ++- bin/pre.slime.expanded | 212 +- bin/sets.slime | 62 +- bin/tests/alists.slime | 202 +- bin/tests/class_macro.slime.expanded | 28 +- bin/tests/evaluation_of_default_args.slime | 30 +- bin/tests/hashmaps.slime | 50 +- bin/tests/import1.slime | 6 +- bin/tests/import2.slime | 14 +- bin/tests/lexical_scope.slime | 118 +- bin/tests/lexical_scope.slime.expanded | 108 +- bin/tests/modules.slime | 35 +- bin/tests/sicp.slime | 688 +- bin/tests/simple_built_ins.slime | 58 + bin/tests/singular_imports.slime | 40 +- build.bat | 68 +- build.sh | 38 +- compile_flags.txt | 10 +- include/assert.hpp | 108 +- include/define_macros.hpp | 308 +- include/libslime.h | 474 +- include/parse.cpp | 796 +- integration/emacs/slime-mode.el | 488 +- manual/build.sh | 34 +- manual/built-in-docs.org | 3792 ++++---- manual/manual.html | 6472 +++++++------- manual/manual.org | 1958 ++--- me-management.org | 72 +- profiler_vis/report2tracing.py | 126 +- profiler_vis/speedscope/LICENSE | 42 +- profiler_vis/speedscope/README | 4 +- .../speedscope/demangle-cpp.6caf93ee.js | 6 +- .../speedscope/file-format-schema.json | 648 +- profiler_vis/speedscope/import.0a51feeb.js | 224 +- ...vertx-stacks-01-collapsed-all.1841aedb.txt | 398 +- profiler_vis/speedscope/release.txt | 6 +- .../speedscope/speedscope.f741b731.js | 344 +- src/assert.hpp | 111 +- src/built_ins.cpp | 2343 ++--- src/define_macros.hpp | 312 +- src/defines.cpp | 46 +- src/docgeneration.cpp | 284 +- src/env.cpp | 250 +- src/error.cpp | 114 +- src/eval.cpp | 1231 +-- src/forward_decls.cpp | 173 +- src/globals.cpp | 42 +- src/io.cpp | 845 +- src/libslime.cpp | 240 +- src/lisp_object.cpp | 93 +- src/main.cpp | 66 +- src/memory.cpp | 1108 +-- src/parse.cpp | 798 +- src/platform.cpp | 340 +- src/structs.cpp | 4 - src/testing.cpp | 1243 ++- src/visualization.cpp | 1112 +-- tests/fullslime/build.sh | 22 +- tests/fullslime/main.cpp | 12 +- tests/libslime/build.sh | 42 +- tests/libslime/main.cpp | 12 +- todo.org | 18 +- 72 files changed, 19254 insertions(+), 19091 deletions(-) create mode 100644 bin/tests/simple_built_ins.slime diff --git a/.gitignore b/.gitignore index 031a541..d10969b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,26 @@ -/vs/*/* -*.ilk -*.aux -*.fls -*.log -*.toc -*.fdb_latexmk -*.pdb -*.obj -*.exe -*.user -*.psess -*.vspx -todo.html -*.expanded -/bin/vgcore.* -/manual/manual.pdf -/manual/manual.tex -*.out -/bin/slime -*.report -*.svg -/tests/libslime/main -/tests/fullslime/main -*.o -/bin/slime_d +/vs/*/* +*.ilk +*.aux +*.fls +*.log +*.toc +*.fdb_latexmk +*.pdb +*.obj +*.exe +*.user +*.psess +*.vspx +todo.html +*.expanded +/bin/vgcore.* +/manual/manual.pdf +/manual/manual.tex +*.out +/bin/slime +*.report +*.svg +/tests/libslime/main +/tests/fullslime/main +*.o +/bin/slime_d diff --git a/.gitmodules b/.gitmodules index 0d3d24f..89d7e46 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "src/ftb"] - path = 3rd/ftb - url = https://github.com/FelixBrendel/ftb +[submodule "src/ftb"] + path = 3rd/ftb + url = https://github.com/FelixBrendel/ftb diff --git a/3rd/ftb b/3rd/ftb index 60e3253..8b50444 160000 --- a/3rd/ftb +++ b/3rd/ftb @@ -1 +1 @@ -Subproject commit 60e32530367957861d503d2b6228d650d7f3b6ac +Subproject commit 8b50444d9ea34f264fdf8ec400ea9d304bf81a3c diff --git a/bin/alist.slime b/bin/alist.slime index 9d39ca5..f9cccc0 100644 --- a/bin/alist.slime +++ b/bin/alist.slime @@ -1,190 +1,190 @@ -(define-module ds - :exports - (alist::make alist::print alist::get alist::find alist::key-exists? alist::remove! alist::set! alist::set-overwrite! - plist::make plist::print plist::get plist::find plist::prop-exists? plist::remove! plist::set! plist::set-overwrite!) - - - (define-module alist - :imports ("cxr.slime") - :exports (make print get find key-exists? remove! set! set-overwrite!) - (define key-not-found-index -1) - - (define (make) - (set-type! - '(()) - :alist)) - - (define (print alist) - (let ((associations (first alist))) - (define (pprint-intern associations) - (when associations - (print " " - (caar associations) "->" - (cdar associations)) - (pprint-intern (rest associations)))) - (print "(") - (when associations - (print "\n") - (pprint-intern associations)) - (print ")\n"))) - - - (define (get alist key) - (let ((associations (first alist))) - (define (alist-get-intern associations key) - (cond ((null? associations) - (error :key-not-found "key was not found in alist")) - ((= (caar associations) key) - (cdar associations)) - (else (alist-get-intern (rest associations) key)))) - (alist-get-intern associations key))) - - - (define (find alist key) - (let ((associations (first alist))) - (define (alist-find-intern associations key current-index) - (cond ((null? associations) key-not-found-index) - ((= (caar associations) key) current-index) - (else (alist-find-intern (rest associations) - key - (+ 1 current-index))))) - (alist-find-intern associations key 0))) - - - (define (key-exists? alist key) - (not (= (find alist key) - key-not-found-index))) - - - (define (remove! alist key) - (let ((index (find alist key))) - (define (alist-remove!-internal asociations index) - ;; reminder: we only get called if we are not replacing the - ;; first element in the alist - ;; reminder2: we know that the key exists - (if (= index 1) - ;; we want to remove the next one, so we set our - ;; cdr to the next next one - (mutate associations (pair (first associations) - (rest (rest associations)))) - ;; else cdr-recurse - (alist-remove!-internal (rest asociations) (- index 1)))) - - (cond ((= index key-not-found-index) (error :key-not-found "key to remove was not found")) - ((= index 0) (mutate alist (pair (cdar alist) ()))) - (else (alist-remove!-internal alist index)))) - alist) - - - (define (set! alist key value) - (mutate alist (set-type! (pair (pair (pair key value) - (car alist)) - ()) - :alist))) - - (define (set-overwrite! alist key value) - (let ((associations (first alist))) - (define (alist-set-overwrite-intern associations key value) - (cond ((= (caar associations) key) - (mutate (car associations) (pair key value))) - ((null? associations) (set! alist key value)) - (else (alist-set-overwrite-intern - (rest associations) key value)))) - (alist-set-overwrite-intern associations key value)) - alist) - ) - - (define-module plist - :imports ("cxr.slime") - :exports (make print get find prop-exists? remove! set! set-overwrite!) - ;; plist: - ;; [ |/] - ;; | - ;; V - ;; [ | ]------------->[ | ]-------------> ... - ;; | | - ;; V V - ;; :key1 value1 - ;; - ;; '((:key1 value1 :key2 value2)) - - (define key-not-found-index -1) - - (define (make) - (set-type! - '(()) - :plist)) - - (define (print plist) - (let ((props (first plist))) - (define (pprint-intern props) - (when props - (print " " - (car props) "->" - (cadr props)) - (pprint-intern (cddr props)))) - (print "(") - (when props - (print "\n") - (pprint-intern props)) - (print ")\n"))) - - (define (get plist prop) - (let ((props (first plist))) - (define (plist-get-intern props prop) - (cond ((null? props) - (error :key-not-found "property was not found in plist")) - ((= (car props) prop) - (cadr props)) - (else (plist-get-intern (cddr props) prop)))) - (plist-get-intern props prop))) - - (define (set! plist prop value) - (mutate plist (set-type! (pair (pair prop (pair value (first plist))) ()) - :plist))) - - (define (set-overwrite! plist prop value) - (let ((props (first plist))) - (define (plist-set-overwrite-intern props prop value) - (cond ((= (car props) prop) - (mutate (cdr props) (pair value (cddr props)))) - ((null? props) (plist-set! plist prop value)) - (else (plist-set-overwrite-intern - (cddr props) prop value)))) - (plist-set-overwrite-intern props prop value)) - plist) - - (define (find plist prop) - (let ((props (first plist))) - (define (plist-find-intern props prop current-index) - (cond ((null? props) key-not-found-index) - ((= (car props) prop) current-index) - (else (plist-find-intern (cddr props) prop - (+ 1 current-index))))) - (plist-find-intern props prop 0))) - - (define (prop-exists? plist prop) - (not (= (find plist prop) - key-not-found-index))) - - (define (remove! plist prop) - (let ((index (find plist prop))) - (define (plist-remove!-internal props index) - ;; reminder: we only get called if we are not replacing the - ;; first element in the alist - ;; reminder2: we know that the key exists - (if (= index 1) - ;; we want to remove the next one, so we set our - ;; cdr to the next next one - (mutate (cdar props) (pair (cadar props) ;; xD nice meme dude!!! - (cdr (cdr (cdr (cdar props)))))) - ;; else cdr-recurse - (plist-remove!-internal (cddr props) (- index 1)))) - - (cond ((= index key-not-found-index) (error :key-not-found "prop to remove was not found")) - ((= index 0) (mutate plist (pair (cddar plist) ()))) - (else (plist-remove!-internal plist index)))) - plist) - - ) - ) +(define-module ds + :exports + (alist::make alist::print alist::get alist::find alist::key-exists? alist::remove! alist::set! alist::set-overwrite! + plist::make plist::print plist::get plist::find plist::prop-exists? plist::remove! plist::set! plist::set-overwrite!) + + + (define-module alist + :imports ("cxr.slime") + :exports (make print get find key-exists? remove! set! set-overwrite!) + (define key-not-found-index -1) + + (define (make) + (set-type! + '(()) + :alist)) + + (define (print alist) + (let ((associations (first alist))) + (define (pprint-intern associations) + (when associations + (print " " + (caar associations) "->" + (cdar associations)) + (pprint-intern (rest associations)))) + (print "(") + (when associations + (print "\n") + (pprint-intern associations)) + (print ")\n"))) + + + (define (get alist key) + (let ((associations (first alist))) + (define (alist-get-intern associations key) + (cond ((null? associations) + (error :key-not-found "key was not found in alist")) + ((= (caar associations) key) + (cdar associations)) + (else (alist-get-intern (rest associations) key)))) + (alist-get-intern associations key))) + + + (define (find alist key) + (let ((associations (first alist))) + (define (alist-find-intern associations key current-index) + (cond ((null? associations) key-not-found-index) + ((= (caar associations) key) current-index) + (else (alist-find-intern (rest associations) + key + (+ 1 current-index))))) + (alist-find-intern associations key 0))) + + + (define (key-exists? alist key) + (not (= (find alist key) + key-not-found-index))) + + + (define (remove! alist key) + (let ((index (find alist key))) + (define (alist-remove!-internal asociations index) + ;; reminder: we only get called if we are not replacing the + ;; first element in the alist + ;; reminder2: we know that the key exists + (if (= index 1) + ;; we want to remove the next one, so we set our + ;; cdr to the next next one + (mutate associations (pair (first associations) + (rest (rest associations)))) + ;; else cdr-recurse + (alist-remove!-internal (rest asociations) (- index 1)))) + + (cond ((= index key-not-found-index) (error :key-not-found "key to remove was not found")) + ((= index 0) (mutate alist (pair (cdar alist) ()))) + (else (alist-remove!-internal alist index)))) + alist) + + + (define (set! alist key value) + (mutate alist (set-type! (pair (pair (pair key value) + (car alist)) + ()) + :alist))) + + (define (set-overwrite! alist key value) + (let ((associations (first alist))) + (define (alist-set-overwrite-intern associations key value) + (cond ((= (caar associations) key) + (mutate (car associations) (pair key value))) + ((null? associations) (set! alist key value)) + (else (alist-set-overwrite-intern + (rest associations) key value)))) + (alist-set-overwrite-intern associations key value)) + alist) + ) + + (define-module plist + :imports ("cxr.slime") + :exports (make print get find prop-exists? remove! set! set-overwrite!) + ;; plist: + ;; [ |/] + ;; | + ;; V + ;; [ | ]------------->[ | ]-------------> ... + ;; | | + ;; V V + ;; :key1 value1 + ;; + ;; '((:key1 value1 :key2 value2)) + + (define key-not-found-index -1) + + (define (make) + (set-type! + '(()) + :plist)) + + (define (print plist) + (let ((props (first plist))) + (define (pprint-intern props) + (when props + (print " " + (car props) "->" + (cadr props)) + (pprint-intern (cddr props)))) + (print "(") + (when props + (print "\n") + (pprint-intern props)) + (print ")\n"))) + + (define (get plist prop) + (let ((props (first plist))) + (define (plist-get-intern props prop) + (cond ((null? props) + (error :key-not-found "property was not found in plist")) + ((= (car props) prop) + (cadr props)) + (else (plist-get-intern (cddr props) prop)))) + (plist-get-intern props prop))) + + (define (set! plist prop value) + (mutate plist (set-type! (pair (pair prop (pair value (first plist))) ()) + :plist))) + + (define (set-overwrite! plist prop value) + (let ((props (first plist))) + (define (plist-set-overwrite-intern props prop value) + (cond ((= (car props) prop) + (mutate (cdr props) (pair value (cddr props)))) + ((null? props) (plist-set! plist prop value)) + (else (plist-set-overwrite-intern + (cddr props) prop value)))) + (plist-set-overwrite-intern props prop value)) + plist) + + (define (find plist prop) + (let ((props (first plist))) + (define (plist-find-intern props prop current-index) + (cond ((null? props) key-not-found-index) + ((= (car props) prop) current-index) + (else (plist-find-intern (cddr props) prop + (+ 1 current-index))))) + (plist-find-intern props prop 0))) + + (define (prop-exists? plist prop) + (not (= (find plist prop) + key-not-found-index))) + + (define (remove! plist prop) + (let ((index (find plist prop))) + (define (plist-remove!-internal props index) + ;; reminder: we only get called if we are not replacing the + ;; first element in the alist + ;; reminder2: we know that the key exists + (if (= index 1) + ;; we want to remove the next one, so we set our + ;; cdr to the next next one + (mutate (cdar props) (pair (cadar props) ;; xD nice meme dude!!! + (cdr (cdr (cdr (cdar props)))))) + ;; else cdr-recurse + (plist-remove!-internal (cddr props) (- index 1)))) + + (cond ((= index key-not-found-index) (error :key-not-found "prop to remove was not found")) + ((= index 0) (mutate plist (pair (cddar plist) ()))) + (else (plist-remove!-internal plist index)))) + plist) + + ) + ) diff --git a/bin/automata.slime b/bin/automata.slime index c65a083..83641b1 100644 --- a/bin/automata.slime +++ b/bin/automata.slime @@ -1,12 +1,12 @@ -(define-module automata - :imports ("sets.slime") - :exports (make-dfa) - - (define (make-dfa Q S delta q0 F) - (let ((q q0)) - (set-type! (lambda (s) - (set! q (delta q s)) - (list (if (set::contains? F q) :accept :fail) q)) - :automaton))) - - ) +(define-module automata + :imports ("sets.slime") + :exports (make-dfa) + + (define (make-dfa Q S delta q0 F) + (let ((q q0)) + (set-type! (lambda (s) + (set! q (delta q s)) + (list (if (set::contains? F q) :accept :fail) q)) + :automaton))) + + ) diff --git a/bin/emoji.slime b/bin/emoji.slime index 16cb6f2..778ae7d 100644 --- a/bin/emoji.slime +++ b/bin/emoji.slime @@ -1,3831 +1,3831 @@ -(define-module emoji - :exports (get) - - (define emoji-map (hash-map)) - (hm/set! emoji-map :grinning-face '๐Ÿ˜€) - (hm/set! emoji-map :grinning-face-with-big-eyes '๐Ÿ˜ƒ) - (hm/set! emoji-map :grinning-face-with-smiling-eyes '๐Ÿ˜„) - (hm/set! emoji-map :beaming-face-with-smiling-eyes '๐Ÿ˜) - (hm/set! emoji-map :grinning-squinting-face '๐Ÿ˜†) - (hm/set! emoji-map :grinning-face-with-sweat '๐Ÿ˜…) - (hm/set! emoji-map :rolling-on-the-floor-laughing '๐Ÿคฃ) - (hm/set! emoji-map :face-with-tears-of-joy '๐Ÿ˜‚) - (hm/set! emoji-map :slightly-smiling-face '๐Ÿ™‚) - (hm/set! emoji-map :upside-down-face '๐Ÿ™ƒ) - (hm/set! emoji-map :winking-face '๐Ÿ˜‰) - (hm/set! emoji-map :smiling-face-with-smiling-eyes '๐Ÿ˜Š) - (hm/set! emoji-map :smiling-face-with-halo '๐Ÿ˜‡) - (hm/set! emoji-map :smiling-face-with-hearts '๐Ÿฅฐ) - (hm/set! emoji-map :smiling-face-with-heart-eyes '๐Ÿ˜) - (hm/set! emoji-map :star-struck '๐Ÿคฉ) - (hm/set! emoji-map :face-blowing-a-kiss '๐Ÿ˜˜) - (hm/set! emoji-map :kissing-face '๐Ÿ˜—) - (hm/set! emoji-map :smiling-face 'โ˜บ๏ธ) - (hm/set! emoji-map :smiling-face 'โ˜บ) - (hm/set! emoji-map :kissing-face-with-closed-eyes '๐Ÿ˜š) - (hm/set! emoji-map :kissing-face-with-smiling-eyes '๐Ÿ˜™) - (hm/set! emoji-map :face-savoring-food '๐Ÿ˜‹) - (hm/set! emoji-map :face-with-tongue '๐Ÿ˜›) - (hm/set! emoji-map :winking-face-with-tongue '๐Ÿ˜œ) - (hm/set! emoji-map :zany-face '๐Ÿคช) - (hm/set! emoji-map :squinting-face-with-tongue '๐Ÿ˜) - (hm/set! emoji-map :money-mouth-face '๐Ÿค‘) - (hm/set! emoji-map :hugging-face '๐Ÿค—) - (hm/set! emoji-map :face-with-hand-over-mouth '๐Ÿคญ) - (hm/set! emoji-map :shushing-face '๐Ÿคซ) - (hm/set! emoji-map :thinking-face '๐Ÿค”) - (hm/set! emoji-map :zipper-mouth-face '๐Ÿค) - (hm/set! emoji-map :face-with-raised-eyebrow '๐Ÿคจ) - (hm/set! emoji-map :neutral-face '๐Ÿ˜) - (hm/set! emoji-map :expressionless-face '๐Ÿ˜‘) - (hm/set! emoji-map :face-without-mouth '๐Ÿ˜ถ) - (hm/set! emoji-map :smirking-face '๐Ÿ˜) - (hm/set! emoji-map :unamused-face '๐Ÿ˜’) - (hm/set! emoji-map :face-with-rolling-eyes '๐Ÿ™„) - (hm/set! emoji-map :grimacing-face '๐Ÿ˜ฌ) - (hm/set! emoji-map :lying-face '๐Ÿคฅ) - (hm/set! emoji-map :relieved-face '๐Ÿ˜Œ) - (hm/set! emoji-map :pensive-face '๐Ÿ˜”) - (hm/set! emoji-map :sleepy-face '๐Ÿ˜ช) - (hm/set! emoji-map :drooling-face '๐Ÿคค) - (hm/set! emoji-map :sleeping-face '๐Ÿ˜ด) - (hm/set! emoji-map :face-with-medical-mask '๐Ÿ˜ท) - (hm/set! emoji-map :face-with-thermometer '๐Ÿค’) - (hm/set! emoji-map :face-with-head-bandage '๐Ÿค•) - (hm/set! emoji-map :nauseated-face '๐Ÿคข) - (hm/set! emoji-map :face-vomiting '๐Ÿคฎ) - (hm/set! emoji-map :sneezing-face '๐Ÿคง) - (hm/set! emoji-map :hot-face '๐Ÿฅต) - (hm/set! emoji-map :cold-face '๐Ÿฅถ) - (hm/set! emoji-map :woozy-face '๐Ÿฅด) - (hm/set! emoji-map :dizzy-face '๐Ÿ˜ต) - (hm/set! emoji-map :exploding-head '๐Ÿคฏ) - (hm/set! emoji-map :cowboy-hat-face '๐Ÿค ) - (hm/set! emoji-map :partying-face '๐Ÿฅณ) - (hm/set! emoji-map :smiling-face-with-sunglasses '๐Ÿ˜Ž) - (hm/set! emoji-map :nerd-face '๐Ÿค“) - (hm/set! emoji-map :face-with-monocle '๐Ÿง) - (hm/set! emoji-map :confused-face '๐Ÿ˜•) - (hm/set! emoji-map :worried-face '๐Ÿ˜Ÿ) - (hm/set! emoji-map :slightly-frowning-face '๐Ÿ™) - (hm/set! emoji-map :frowning-face 'โ˜น๏ธ) - (hm/set! emoji-map :frowning-face 'โ˜น) - (hm/set! emoji-map :face-with-open-mouth '๐Ÿ˜ฎ) - (hm/set! emoji-map :hushed-face '๐Ÿ˜ฏ) - (hm/set! emoji-map :astonished-face '๐Ÿ˜ฒ) - (hm/set! emoji-map :flushed-face '๐Ÿ˜ณ) - (hm/set! emoji-map :pleading-face '๐Ÿฅบ) - (hm/set! emoji-map :frowning-face-with-open-mouth '๐Ÿ˜ฆ) - (hm/set! emoji-map :anguished-face '๐Ÿ˜ง) - (hm/set! emoji-map :fearful-face '๐Ÿ˜จ) - (hm/set! emoji-map :anxious-face-with-sweat '๐Ÿ˜ฐ) - (hm/set! emoji-map :sad-but-relieved-face '๐Ÿ˜ฅ) - (hm/set! emoji-map :crying-face '๐Ÿ˜ข) - (hm/set! emoji-map :loudly-crying-face '๐Ÿ˜ญ) - (hm/set! emoji-map :face-screaming-in-fear '๐Ÿ˜ฑ) - (hm/set! emoji-map :confounded-face '๐Ÿ˜–) - (hm/set! emoji-map :persevering-face '๐Ÿ˜ฃ) - (hm/set! emoji-map :disappointed-face '๐Ÿ˜ž) - (hm/set! emoji-map :downcast-face-with-sweat '๐Ÿ˜“) - (hm/set! emoji-map :weary-face '๐Ÿ˜ฉ) - (hm/set! emoji-map :tired-face '๐Ÿ˜ซ) - (hm/set! emoji-map :yawning-face '๐Ÿฅฑ) - (hm/set! emoji-map :face-with-steam-from-nose '๐Ÿ˜ค) - (hm/set! emoji-map :pouting-face '๐Ÿ˜ก) - (hm/set! emoji-map :angry-face '๐Ÿ˜ ) - (hm/set! emoji-map :face-with-symbols-on-mouth '๐Ÿคฌ) - (hm/set! emoji-map :smiling-face-with-horns '๐Ÿ˜ˆ) - (hm/set! emoji-map :angry-face-with-horns '๐Ÿ‘ฟ) - (hm/set! emoji-map :skull '๐Ÿ’€) - (hm/set! emoji-map :skull-and-crossbones 'โ˜ ๏ธ) - (hm/set! emoji-map :skull-and-crossbones 'โ˜ ) - (hm/set! emoji-map :pile-of-poo '๐Ÿ’ฉ) - (hm/set! emoji-map :clown-face '๐Ÿคก) - (hm/set! emoji-map :ogre '๐Ÿ‘น) - (hm/set! emoji-map :goblin '๐Ÿ‘บ) - (hm/set! emoji-map :ghost '๐Ÿ‘ป) - (hm/set! emoji-map :alien '๐Ÿ‘ฝ) - (hm/set! emoji-map :alien-monster '๐Ÿ‘พ) - (hm/set! emoji-map :robot '๐Ÿค–) - (hm/set! emoji-map :grinning-cat '๐Ÿ˜บ) - (hm/set! emoji-map :grinning-cat-with-smiling-eyes '๐Ÿ˜ธ) - (hm/set! emoji-map :cat-with-tears-of-joy '๐Ÿ˜น) - (hm/set! emoji-map :smiling-cat-with-heart-eyes '๐Ÿ˜ป) - (hm/set! emoji-map :cat-with-wry-smile '๐Ÿ˜ผ) - (hm/set! emoji-map :kissing-cat '๐Ÿ˜ฝ) - (hm/set! emoji-map :weary-cat '๐Ÿ™€) - (hm/set! emoji-map :crying-cat '๐Ÿ˜ฟ) - (hm/set! emoji-map :pouting-cat '๐Ÿ˜พ) - (hm/set! emoji-map :see-no-evil-monkey '๐Ÿ™ˆ) - (hm/set! emoji-map :hear-no-evil-monkey '๐Ÿ™‰) - (hm/set! emoji-map :speak-no-evil-monkey '๐Ÿ™Š) - (hm/set! emoji-map :kiss-mark '๐Ÿ’‹) - (hm/set! emoji-map :love-letter '๐Ÿ’Œ) - (hm/set! emoji-map :heart-with-arrow '๐Ÿ’˜) - (hm/set! emoji-map :heart-with-ribbon '๐Ÿ’) - (hm/set! emoji-map :sparkling-heart '๐Ÿ’–) - (hm/set! emoji-map :growing-heart '๐Ÿ’—) - (hm/set! emoji-map :beating-heart '๐Ÿ’“) - (hm/set! emoji-map :revolving-hearts '๐Ÿ’ž) - (hm/set! emoji-map :two-hearts '๐Ÿ’•) - (hm/set! emoji-map :heart-decoration '๐Ÿ’Ÿ) - (hm/set! emoji-map :heart-exclamation 'โฃ๏ธ) - (hm/set! emoji-map :heart-exclamation 'โฃ) - (hm/set! emoji-map :broken-heart '๐Ÿ’”) - (hm/set! emoji-map :red-heart 'โค๏ธ) - (hm/set! emoji-map :red-heart 'โค) - (hm/set! emoji-map :orange-heart '๐Ÿงก) - (hm/set! emoji-map :yellow-heart '๐Ÿ’›) - (hm/set! emoji-map :green-heart '๐Ÿ’š) - (hm/set! emoji-map :blue-heart '๐Ÿ’™) - (hm/set! emoji-map :purple-heart '๐Ÿ’œ) - (hm/set! emoji-map :brown-heart '๐ŸคŽ) - (hm/set! emoji-map :black-heart '๐Ÿ–ค) - (hm/set! emoji-map :white-heart '๐Ÿค) - (hm/set! emoji-map :hundred-points '๐Ÿ’ฏ) - (hm/set! emoji-map :anger-symbol '๐Ÿ’ข) - (hm/set! emoji-map :collision '๐Ÿ’ฅ) - (hm/set! emoji-map :dizzy '๐Ÿ’ซ) - (hm/set! emoji-map :sweat-droplets '๐Ÿ’ฆ) - (hm/set! emoji-map :dashing-away '๐Ÿ’จ) - (hm/set! emoji-map :hole '๐Ÿ•ณ๏ธ) - (hm/set! emoji-map :hole '๐Ÿ•ณ) - (hm/set! emoji-map :bomb '๐Ÿ’ฃ) - (hm/set! emoji-map :speech-balloon '๐Ÿ’ฌ) - (hm/set! emoji-map :eye-in-speech-bubble '๐Ÿ‘๏ธ๐Ÿ—จ๏ธ) - (hm/set! emoji-map :eye-in-speech-bubble '๐Ÿ‘๐Ÿ—จ๏ธ) - (hm/set! emoji-map :eye-in-speech-bubble '๐Ÿ‘๏ธ๐Ÿ—จ) - (hm/set! emoji-map :eye-in-speech-bubble '๐Ÿ‘๐Ÿ—จ) - (hm/set! emoji-map :left-speech-bubble '๐Ÿ—จ๏ธ) - (hm/set! emoji-map :left-speech-bubble '๐Ÿ—จ) - (hm/set! emoji-map :right-anger-bubble '๐Ÿ—ฏ๏ธ) - (hm/set! emoji-map :right-anger-bubble '๐Ÿ—ฏ) - (hm/set! emoji-map :thought-balloon '๐Ÿ’ญ) - (hm/set! emoji-map :zzz '๐Ÿ’ค) - (hm/set! emoji-map :waving-hand:-light-skin-toneg1F44B-1F3FC '๐Ÿ‘‹๐Ÿป) - (hm/set! emoji-map :waving-hand:-medium-light-skin-tone '๐Ÿ‘‹๐Ÿผ) - (hm/set! emoji-map :waving-hand:-medium-skin-tone '๐Ÿ‘‹๐Ÿฝ) - (hm/set! emoji-map :waving-hand:-medium-dark-skin-tone '๐Ÿ‘‹๐Ÿพ) - (hm/set! emoji-map :waving-hand:-dark-skin-tone '๐Ÿ‘‹๐Ÿฟ) - (hm/set! emoji-map :raised-back-of-hand '๐Ÿคš) - (hm/set! emoji-map :raised-back-of-hand:-light-skin-tone '๐Ÿคš๐Ÿป) - (hm/set! emoji-map :raised-back-of-hand:-medium-light-skin-tone '๐Ÿคš๐Ÿผ) - (hm/set! emoji-map :raised-back-of-hand:-medium-skin-tone '๐Ÿคš๐Ÿฝ) - (hm/set! emoji-map :raised-back-of-hand:-medium-dark-skin-tone '๐Ÿคš๐Ÿพ) - (hm/set! emoji-map :raised-back-of-hand:-dark-skin-tone '๐Ÿคš๐Ÿฟ) - (hm/set! emoji-map :hand-with-fingers-splayed '๐Ÿ–๏ธ) - (hm/set! emoji-map :hand-with-fingers-splayed '๐Ÿ–) - (hm/set! emoji-map :hand-with-fingers-splayed:-light-skin-tone '๐Ÿ–๐Ÿป) - (hm/set! emoji-map :hand-with-fingers-splayed:-medium-light-skin-tone '๐Ÿ–๐Ÿผ) - (hm/set! emoji-map :hand-with-fingers-splayed:-medium-skin-tone '๐Ÿ–๐Ÿฝ) - (hm/set! emoji-map :hand-with-fingers-splayed:-medium-dark-skin-tone '๐Ÿ–๐Ÿพ) - (hm/set! emoji-map :hand-with-fingers-splayed:-dark-skin-tone '๐Ÿ–๐Ÿฟ) - (hm/set! emoji-map :raised-hand 'โœ‹) - (hm/set! emoji-map :raised-hand:-light-skin-tone 'โœ‹๐Ÿป) - (hm/set! emoji-map :raised-hand:-medium-light-skin-tone 'โœ‹๐Ÿผ) - (hm/set! emoji-map :raised-hand:-medium-skin-tone 'โœ‹๐Ÿฝ) - (hm/set! emoji-map :raised-hand:-medium-dark-skin-tone 'โœ‹๐Ÿพ) - (hm/set! emoji-map :raised-hand:-dark-skin-tone 'โœ‹๐Ÿฟ) - (hm/set! emoji-map :vulcan-salute '๐Ÿ––) - (hm/set! emoji-map :vulcan-salute:-light-skin-tone '๐Ÿ––๐Ÿป) - (hm/set! emoji-map :vulcan-salute:-medium-light-skin-tone '๐Ÿ––๐Ÿผ) - (hm/set! emoji-map :vulcan-salute:-medium-skin-tone '๐Ÿ––๐Ÿฝ) - (hm/set! emoji-map :vulcan-salute:-medium-dark-skin-tone '๐Ÿ––๐Ÿพ) - (hm/set! emoji-map :vulcan-salute:-dark-skin-tone '๐Ÿ––๐Ÿฟ) - (hm/set! emoji-map :OK-hand '๐Ÿ‘Œ) - (hm/set! emoji-map :OK-hand:-light-skin-tone '๐Ÿ‘Œ๐Ÿป) - (hm/set! emoji-map :OK-hand:-medium-light-skin-tone '๐Ÿ‘Œ๐Ÿผ) - (hm/set! emoji-map :OK-hand:-medium-skin-tone '๐Ÿ‘Œ๐Ÿฝ) - (hm/set! emoji-map :OK-hand:-medium-dark-skin-tone '๐Ÿ‘Œ๐Ÿพ) - (hm/set! emoji-map :OK-hand:-dark-skin-tone '๐Ÿ‘Œ๐Ÿฟ) - (hm/set! emoji-map :pinching-hand '๐Ÿค) - (hm/set! emoji-map :pinching-hand:-light-skin-tone '๐Ÿค๐Ÿป) - (hm/set! emoji-map :pinching-hand:-medium-light-skin-tone '๐Ÿค๐Ÿผ) - (hm/set! emoji-map :pinching-hand:-medium-skin-tone '๐Ÿค๐Ÿฝ) - (hm/set! emoji-map :pinching-hand:-medium-dark-skin-tone '๐Ÿค๐Ÿพ) - (hm/set! emoji-map :pinching-hand:-dark-skin-tone '๐Ÿค๐Ÿฟ) - (hm/set! emoji-map :victory-hand 'โœŒ๏ธ) - (hm/set! emoji-map :victory-hand 'โœŒ) - (hm/set! emoji-map :victory-hand:-light-skin-tone 'โœŒ๐Ÿป) - (hm/set! emoji-map :victory-hand:-medium-light-skin-tone 'โœŒ๐Ÿผ) - (hm/set! emoji-map :victory-hand:-medium-skin-tone 'โœŒ๐Ÿฝ) - (hm/set! emoji-map :victory-hand:-medium-dark-skin-tone 'โœŒ๐Ÿพ) - (hm/set! emoji-map :victory-hand:-dark-skin-tone 'โœŒ๐Ÿฟ) - (hm/set! emoji-map :crossed-fingers '๐Ÿคž) - (hm/set! emoji-map :crossed-fingers:-light-skin-tone '๐Ÿคž๐Ÿป) - (hm/set! emoji-map :crossed-fingers:-medium-light-skin-tone '๐Ÿคž๐Ÿผ) - (hm/set! emoji-map :crossed-fingers:-medium-skin-tone '๐Ÿคž๐Ÿฝ) - (hm/set! emoji-map :crossed-fingers:-medium-dark-skin-tone '๐Ÿคž๐Ÿพ) - (hm/set! emoji-map :crossed-fingers:-dark-skin-tone '๐Ÿคž๐Ÿฟ) - (hm/set! emoji-map :love-you-gesture '๐ŸคŸ) - (hm/set! emoji-map :love-you-gesture:-light-skin-tone '๐ŸคŸ๐Ÿป) - (hm/set! emoji-map :love-you-gesture:-medium-light-skin-tone '๐ŸคŸ๐Ÿผ) - (hm/set! emoji-map :love-you-gesture:-medium-skin-tone '๐ŸคŸ๐Ÿฝ) - (hm/set! emoji-map :love-you-gesture:-medium-dark-skin-tone '๐ŸคŸ๐Ÿพ) - (hm/set! emoji-map :love-you-gesture:-dark-skin-tone '๐ŸคŸ๐Ÿฟ) - (hm/set! emoji-map :sign-of-the-horns '๐Ÿค˜) - (hm/set! emoji-map :sign-of-the-horns:-light-skin-tone '๐Ÿค˜๐Ÿป) - (hm/set! emoji-map :sign-of-the-horns:-medium-light-skin-tone '๐Ÿค˜๐Ÿผ) - (hm/set! emoji-map :sign-of-the-horns:-medium-skin-tone '๐Ÿค˜๐Ÿฝ) - (hm/set! emoji-map :sign-of-the-horns:-medium-dark-skin-tone '๐Ÿค˜๐Ÿพ) - (hm/set! emoji-map :sign-of-the-horns:-dark-skin-tone '๐Ÿค˜๐Ÿฟ) - (hm/set! emoji-map :call-me-hand '๐Ÿค™) - (hm/set! emoji-map :call-me-hand:-light-skin-tone '๐Ÿค™๐Ÿป) - (hm/set! emoji-map :call-me-hand:-medium-light-skin-tone '๐Ÿค™๐Ÿผ) - (hm/set! emoji-map :call-me-hand:-medium-skin-tone '๐Ÿค™๐Ÿฝ) - (hm/set! emoji-map :call-me-hand:-medium-dark-skin-tone '๐Ÿค™๐Ÿพ) - (hm/set! emoji-map :call-me-hand:-dark-skin-tone '๐Ÿค™๐Ÿฟ) - (hm/set! emoji-map :backhand-index-pointing-left '๐Ÿ‘ˆ) - (hm/set! emoji-map :backhand-index-pointing-left:-light-skin-tone '๐Ÿ‘ˆ๐Ÿป) - (hm/set! emoji-map :backhand-index-pointing-left:-medium-light-skin-tone '๐Ÿ‘ˆ๐Ÿผ) - (hm/set! emoji-map :backhand-index-pointing-left:-medium-skin-tone '๐Ÿ‘ˆ๐Ÿฝ) - (hm/set! emoji-map :backhand-index-pointing-left:-medium-dark-skin-tone '๐Ÿ‘ˆ๐Ÿพ) - (hm/set! emoji-map :backhand-index-pointing-left:-dark-skin-tone '๐Ÿ‘ˆ๐Ÿฟ) - (hm/set! emoji-map :backhand-index-pointing-right '๐Ÿ‘‰) - (hm/set! emoji-map :backhand-index-pointing-right:-light-skin-tone '๐Ÿ‘‰๐Ÿป) - (hm/set! emoji-map :backhand-index-pointing-right:-medium-light-skin-tone '๐Ÿ‘‰๐Ÿผ) - (hm/set! emoji-map :backhand-index-pointing-right:-medium-skin-tone '๐Ÿ‘‰๐Ÿฝ) - (hm/set! emoji-map :backhand-index-pointing-right:-medium-dark-skin-tone '๐Ÿ‘‰๐Ÿพ) - (hm/set! emoji-map :backhand-index-pointing-right:-dark-skin-tone '๐Ÿ‘‰๐Ÿฟ) - (hm/set! emoji-map :backhand-index-pointing-up '๐Ÿ‘†) - (hm/set! emoji-map :backhand-index-pointing-up:-light-skin-tone '๐Ÿ‘†๐Ÿป) - (hm/set! emoji-map :backhand-index-pointing-up:-medium-light-skin-tone '๐Ÿ‘†๐Ÿผ) - (hm/set! emoji-map :backhand-index-pointing-up:-medium-skin-tone '๐Ÿ‘†๐Ÿฝ) - (hm/set! emoji-map :backhand-index-pointing-up:-medium-dark-skin-tone '๐Ÿ‘†๐Ÿพ) - (hm/set! emoji-map :backhand-index-pointing-up:-dark-skin-tone '๐Ÿ‘†๐Ÿฟ) - (hm/set! emoji-map :middle-finger '๐Ÿ–•) - (hm/set! emoji-map :middle-finger:-light-skin-tone '๐Ÿ–•๐Ÿป) - (hm/set! emoji-map :middle-finger:-medium-light-skin-tone '๐Ÿ–•๐Ÿผ) - (hm/set! emoji-map :middle-finger:-medium-skin-tone '๐Ÿ–•๐Ÿฝ) - (hm/set! emoji-map :middle-finger:-medium-dark-skin-tone '๐Ÿ–•๐Ÿพ) - (hm/set! emoji-map :middle-finger:-dark-skin-tone '๐Ÿ–•๐Ÿฟ) - (hm/set! emoji-map :backhand-index-pointing-down '๐Ÿ‘‡) - (hm/set! emoji-map :backhand-index-pointing-down:-light-skin-tone '๐Ÿ‘‡๐Ÿป) - (hm/set! emoji-map :backhand-index-pointing-down:-medium-light-skin-tone '๐Ÿ‘‡๐Ÿผ) - (hm/set! emoji-map :backhand-index-pointing-down:-medium-skin-tone '๐Ÿ‘‡๐Ÿฝ) - (hm/set! emoji-map :backhand-index-pointing-down:-medium-dark-skin-tone '๐Ÿ‘‡๐Ÿพ) - (hm/set! emoji-map :backhand-index-pointing-down:-dark-skin-tone '๐Ÿ‘‡๐Ÿฟ) - (hm/set! emoji-map :index-pointing-up 'โ˜๏ธ) - (hm/set! emoji-map :index-pointing-up 'โ˜) - (hm/set! emoji-map :index-pointing-up:-light-skin-tone 'โ˜๐Ÿป) - (hm/set! emoji-map :index-pointing-up:-medium-light-skin-tone 'โ˜๐Ÿผ) - (hm/set! emoji-map :index-pointing-up:-medium-skin-tone 'โ˜๐Ÿฝ) - (hm/set! emoji-map :index-pointing-up:-medium-dark-skin-tone 'โ˜๐Ÿพ) - (hm/set! emoji-map :index-pointing-up:-dark-skin-tone 'โ˜๐Ÿฟ) - (hm/set! emoji-map :thumbs-up '๐Ÿ‘) - (hm/set! emoji-map :thumbs-up:-light-skin-tone '๐Ÿ‘๐Ÿป) - (hm/set! emoji-map :thumbs-up:-medium-light-skin-tone '๐Ÿ‘๐Ÿผ) - (hm/set! emoji-map :thumbs-up:-medium-skin-tone '๐Ÿ‘๐Ÿฝ) - (hm/set! emoji-map :thumbs-up:-medium-dark-skin-tone '๐Ÿ‘๐Ÿพ) - (hm/set! emoji-map :thumbs-up:-dark-skin-tone '๐Ÿ‘๐Ÿฟ) - (hm/set! emoji-map :thumbs-down '๐Ÿ‘Ž) - (hm/set! emoji-map :thumbs-down:-light-skin-tone '๐Ÿ‘Ž๐Ÿป) - (hm/set! emoji-map :thumbs-down:-medium-light-skin-tone '๐Ÿ‘Ž๐Ÿผ) - (hm/set! emoji-map :thumbs-down:-medium-skin-tone '๐Ÿ‘Ž๐Ÿฝ) - (hm/set! emoji-map :thumbs-down:-medium-dark-skin-tone '๐Ÿ‘Ž๐Ÿพ) - (hm/set! emoji-map :thumbs-down:-dark-skin-tone '๐Ÿ‘Ž๐Ÿฟ) - (hm/set! emoji-map :raised-fist 'โœŠ) - (hm/set! emoji-map :raised-fist:-light-skin-tone 'โœŠ๐Ÿป) - (hm/set! emoji-map :raised-fist:-medium-light-skin-tone 'โœŠ๐Ÿผ) - (hm/set! emoji-map :raised-fist:-medium-skin-tone 'โœŠ๐Ÿฝ) - (hm/set! emoji-map :raised-fist:-medium-dark-skin-tone 'โœŠ๐Ÿพ) - (hm/set! emoji-map :raised-fist:-dark-skin-tone 'โœŠ๐Ÿฟ) - (hm/set! emoji-map :oncoming-fist '๐Ÿ‘Š) - (hm/set! emoji-map :oncoming-fist:-light-skin-tone '๐Ÿ‘Š๐Ÿป) - (hm/set! emoji-map :oncoming-fist:-medium-light-skin-tone '๐Ÿ‘Š๐Ÿผ) - (hm/set! emoji-map :oncoming-fist:-medium-skin-tone '๐Ÿ‘Š๐Ÿฝ) - (hm/set! emoji-map :oncoming-fist:-medium-dark-skin-tone '๐Ÿ‘Š๐Ÿพ) - (hm/set! emoji-map :oncoming-fist:-dark-skin-tone '๐Ÿ‘Š๐Ÿฟ) - (hm/set! emoji-map :left-facing-fist '๐Ÿค›) - (hm/set! emoji-map :left-facing-fist:-light-skin-tone '๐Ÿค›๐Ÿป) - (hm/set! emoji-map :left-facing-fist:-medium-light-skin-tone '๐Ÿค›๐Ÿผ) - (hm/set! emoji-map :left-facing-fist:-medium-skin-tone '๐Ÿค›๐Ÿฝ) - (hm/set! emoji-map :left-facing-fist:-medium-dark-skin-tone '๐Ÿค›๐Ÿพ) - (hm/set! emoji-map :left-facing-fist:-dark-skin-tone '๐Ÿค›๐Ÿฟ) - (hm/set! emoji-map :right-facing-fist '๐Ÿคœ) - (hm/set! emoji-map :right-facing-fist:-light-skin-tone '๐Ÿคœ๐Ÿป) - (hm/set! emoji-map :right-facing-fist:-medium-light-skin-tone '๐Ÿคœ๐Ÿผ) - (hm/set! emoji-map :right-facing-fist:-medium-skin-tone '๐Ÿคœ๐Ÿฝ) - (hm/set! emoji-map :right-facing-fist:-medium-dark-skin-tone '๐Ÿคœ๐Ÿพ) - (hm/set! emoji-map :right-facing-fist:-dark-skin-tone '๐Ÿคœ๐Ÿฟ) - (hm/set! emoji-map :clapping-hands '๐Ÿ‘) - (hm/set! emoji-map :clapping-hands:-light-skin-tone '๐Ÿ‘๐Ÿป) - (hm/set! emoji-map :clapping-hands:-medium-light-skin-tone '๐Ÿ‘๐Ÿผ) - (hm/set! emoji-map :clapping-hands:-medium-skin-tone '๐Ÿ‘๐Ÿฝ) - (hm/set! emoji-map :clapping-hands:-medium-dark-skin-tone '๐Ÿ‘๐Ÿพ) - (hm/set! emoji-map :clapping-hands:-dark-skin-tone '๐Ÿ‘๐Ÿฟ) - (hm/set! emoji-map :raising-hands '๐Ÿ™Œ) - (hm/set! emoji-map :raising-hands:-light-skin-tone '๐Ÿ™Œ๐Ÿป) - (hm/set! emoji-map :raising-hands:-medium-light-skin-tone '๐Ÿ™Œ๐Ÿผ) - (hm/set! emoji-map :raising-hands:-medium-skin-tone '๐Ÿ™Œ๐Ÿฝ) - (hm/set! emoji-map :raising-hands:-medium-dark-skin-tone '๐Ÿ™Œ๐Ÿพ) - (hm/set! emoji-map :raising-hands:-dark-skin-tone '๐Ÿ™Œ๐Ÿฟ) - (hm/set! emoji-map :open-hands '๐Ÿ‘) - (hm/set! emoji-map :open-hands:-light-skin-tone '๐Ÿ‘๐Ÿป) - (hm/set! emoji-map :open-hands:-medium-light-skin-tone '๐Ÿ‘๐Ÿผ) - (hm/set! emoji-map :open-hands:-medium-skin-tone '๐Ÿ‘๐Ÿฝ) - (hm/set! emoji-map :open-hands:-medium-dark-skin-tone '๐Ÿ‘๐Ÿพ) - (hm/set! emoji-map :open-hands:-dark-skin-tone '๐Ÿ‘๐Ÿฟ) - (hm/set! emoji-map :palms-up-together '๐Ÿคฒ) - (hm/set! emoji-map :palms-up-together:-light-skin-tone '๐Ÿคฒ๐Ÿป) - (hm/set! emoji-map :palms-up-together:-medium-light-skin-tone '๐Ÿคฒ๐Ÿผ) - (hm/set! emoji-map :palms-up-together:-medium-skin-tone '๐Ÿคฒ๐Ÿฝ) - (hm/set! emoji-map :palms-up-together:-medium-dark-skin-tone '๐Ÿคฒ๐Ÿพ) - (hm/set! emoji-map :palms-up-together:-dark-skin-tone '๐Ÿคฒ๐Ÿฟ) - (hm/set! emoji-map :handshake '๐Ÿค) - (hm/set! emoji-map :folded-hands '๐Ÿ™) - (hm/set! emoji-map :folded-hands:-light-skin-tone '๐Ÿ™๐Ÿป) - (hm/set! emoji-map :folded-hands:-medium-light-skin-tone '๐Ÿ™๐Ÿผ) - (hm/set! emoji-map :folded-hands:-medium-skin-tone '๐Ÿ™๐Ÿฝ) - (hm/set! emoji-map :folded-hands:-medium-dark-skin-tone '๐Ÿ™๐Ÿพ) - (hm/set! emoji-map :folded-hands:-dark-skin-tone '๐Ÿ™๐Ÿฟ) - (hm/set! emoji-map :writing-hand 'โœ๏ธ) - (hm/set! emoji-map :writing-hand 'โœ) - (hm/set! emoji-map :writing-hand:-light-skin-tone 'โœ๐Ÿป) - (hm/set! emoji-map :writing-hand:-medium-light-skin-tone 'โœ๐Ÿผ) - (hm/set! emoji-map :writing-hand:-medium-skin-tone 'โœ๐Ÿฝ) - (hm/set! emoji-map :writing-hand:-medium-dark-skin-tone 'โœ๐Ÿพ) - (hm/set! emoji-map :writing-hand:-dark-skin-tone 'โœ๐Ÿฟ) - (hm/set! emoji-map :nail-polish '๐Ÿ’…) - (hm/set! emoji-map :nail-polish:-light-skin-tone '๐Ÿ’…๐Ÿป) - (hm/set! emoji-map :nail-polish:-medium-light-skin-tone '๐Ÿ’…๐Ÿผ) - (hm/set! emoji-map :nail-polish:-medium-skin-tone '๐Ÿ’…๐Ÿฝ) - (hm/set! emoji-map :nail-polish:-medium-dark-skin-tone '๐Ÿ’…๐Ÿพ) - (hm/set! emoji-map :nail-polish:-dark-skin-tone '๐Ÿ’…๐Ÿฟ) - (hm/set! emoji-map :selfie '๐Ÿคณ) - (hm/set! emoji-map :selfie:-light-skin-tone '๐Ÿคณ๐Ÿป) - (hm/set! emoji-map :selfie:-medium-light-skin-tone '๐Ÿคณ๐Ÿผ) - (hm/set! emoji-map :selfie:-medium-skin-tone '๐Ÿคณ๐Ÿฝ) - (hm/set! emoji-map :selfie:-medium-dark-skin-tone '๐Ÿคณ๐Ÿพ) - (hm/set! emoji-map :selfie:-dark-skin-tone '๐Ÿคณ๐Ÿฟ) - (hm/set! emoji-map :flexed-biceps '๐Ÿ’ช) - (hm/set! emoji-map :flexed-biceps:-light-skin-tone '๐Ÿ’ช๐Ÿป) - (hm/set! emoji-map :flexed-biceps:-medium-light-skin-tone '๐Ÿ’ช๐Ÿผ) - (hm/set! emoji-map :flexed-biceps:-medium-skin-tone '๐Ÿ’ช๐Ÿฝ) - (hm/set! emoji-map :flexed-biceps:-medium-dark-skin-tone '๐Ÿ’ช๐Ÿพ) - (hm/set! emoji-map :flexed-biceps:-dark-skin-tone '๐Ÿ’ช๐Ÿฟ) - (hm/set! emoji-map :mechanical-arm '๐Ÿฆพ) - (hm/set! emoji-map :mechanical-leg '๐Ÿฆฟ) - (hm/set! emoji-map :leg '๐Ÿฆต) - (hm/set! emoji-map :leg:-light-skin-tone '๐Ÿฆต๐Ÿป) - (hm/set! emoji-map :leg:-medium-light-skin-tone '๐Ÿฆต๐Ÿผ) - (hm/set! emoji-map :leg:-medium-skin-tone '๐Ÿฆต๐Ÿฝ) - (hm/set! emoji-map :leg:-medium-dark-skin-tone '๐Ÿฆต๐Ÿพ) - (hm/set! emoji-map :leg:-dark-skin-tone '๐Ÿฆต๐Ÿฟ) - (hm/set! emoji-map :foot '๐Ÿฆถ) - (hm/set! emoji-map :foot:-light-skin-tone '๐Ÿฆถ๐Ÿป) - (hm/set! emoji-map :foot:-medium-light-skin-tone '๐Ÿฆถ๐Ÿผ) - (hm/set! emoji-map :foot:-medium-skin-tone '๐Ÿฆถ๐Ÿฝ) - (hm/set! emoji-map :foot:-medium-dark-skin-tone '๐Ÿฆถ๐Ÿพ) - (hm/set! emoji-map :foot:-dark-skin-tone '๐Ÿฆถ๐Ÿฟ) - (hm/set! emoji-map :ear '๐Ÿ‘‚) - (hm/set! emoji-map :ear:-light-skin-tone '๐Ÿ‘‚๐Ÿป) - (hm/set! emoji-map :ear:-medium-light-skin-tone '๐Ÿ‘‚๐Ÿผ) - (hm/set! emoji-map :ear:-medium-skin-tone '๐Ÿ‘‚๐Ÿฝ) - (hm/set! emoji-map :ear:-medium-dark-skin-tone '๐Ÿ‘‚๐Ÿพ) - (hm/set! emoji-map :ear:-dark-skin-tone '๐Ÿ‘‚๐Ÿฟ) - (hm/set! emoji-map :ear-with-hearing-aid '๐Ÿฆป) - (hm/set! emoji-map :ear-with-hearing-aid:-light-skin-tone '๐Ÿฆป๐Ÿป) - (hm/set! emoji-map :ear-with-hearing-aid:-medium-light-skin-tone '๐Ÿฆป๐Ÿผ) - (hm/set! emoji-map :ear-with-hearing-aid:-medium-skin-tone '๐Ÿฆป๐Ÿฝ) - (hm/set! emoji-map :ear-with-hearing-aid:-medium-dark-skin-tone '๐Ÿฆป๐Ÿพ) - (hm/set! emoji-map :ear-with-hearing-aid:-dark-skin-tone '๐Ÿฆป๐Ÿฟ) - (hm/set! emoji-map :nose '๐Ÿ‘ƒ) - (hm/set! emoji-map :nose:-light-skin-tone '๐Ÿ‘ƒ๐Ÿป) - (hm/set! emoji-map :nose:-medium-light-skin-tone '๐Ÿ‘ƒ๐Ÿผ) - (hm/set! emoji-map :nose:-medium-skin-tone '๐Ÿ‘ƒ๐Ÿฝ) - (hm/set! emoji-map :nose:-medium-dark-skin-tone '๐Ÿ‘ƒ๐Ÿพ) - (hm/set! emoji-map :nose:-dark-skin-tone '๐Ÿ‘ƒ๐Ÿฟ) - (hm/set! emoji-map :brain '๐Ÿง ) - (hm/set! emoji-map :tooth '๐Ÿฆท) - (hm/set! emoji-map :bone '๐Ÿฆด) - (hm/set! emoji-map :eyes '๐Ÿ‘€) - (hm/set! emoji-map :eye '๐Ÿ‘๏ธ) - (hm/set! emoji-map :eye '๐Ÿ‘) - (hm/set! emoji-map :tongue '๐Ÿ‘…) - (hm/set! emoji-map :mouth '๐Ÿ‘„) - (hm/set! emoji-map :baby '๐Ÿ‘ถ) - (hm/set! emoji-map :baby:-light-skin-tone '๐Ÿ‘ถ๐Ÿป) - (hm/set! emoji-map :baby:-medium-light-skin-tone '๐Ÿ‘ถ๐Ÿผ) - (hm/set! emoji-map :baby:-medium-skin-tone '๐Ÿ‘ถ๐Ÿฝ) - (hm/set! emoji-map :baby:-medium-dark-skin-tone '๐Ÿ‘ถ๐Ÿพ) - (hm/set! emoji-map :baby:-dark-skin-tone '๐Ÿ‘ถ๐Ÿฟ) - (hm/set! emoji-map :child '๐Ÿง’) - (hm/set! emoji-map :child:-light-skin-tone '๐Ÿง’๐Ÿป) - (hm/set! emoji-map :child:-medium-light-skin-tone '๐Ÿง’๐Ÿผ) - (hm/set! emoji-map :child:-medium-skin-tone '๐Ÿง’๐Ÿฝ) - (hm/set! emoji-map :child:-medium-dark-skin-tone '๐Ÿง’๐Ÿพ) - (hm/set! emoji-map :child:-dark-skin-tone '๐Ÿง’๐Ÿฟ) - (hm/set! emoji-map :boy '๐Ÿ‘ฆ) - (hm/set! emoji-map :boy:-light-skin-tone '๐Ÿ‘ฆ๐Ÿป) - (hm/set! emoji-map :boy:-medium-light-skin-tone '๐Ÿ‘ฆ๐Ÿผ) - (hm/set! emoji-map :boy:-medium-skin-tone '๐Ÿ‘ฆ๐Ÿฝ) - (hm/set! emoji-map :boy:-medium-dark-skin-tone '๐Ÿ‘ฆ๐Ÿพ) - (hm/set! emoji-map :boy:-dark-skin-tone '๐Ÿ‘ฆ๐Ÿฟ) - (hm/set! emoji-map :girl '๐Ÿ‘ง) - (hm/set! emoji-map :girl:-light-skin-tone '๐Ÿ‘ง๐Ÿป) - (hm/set! emoji-map :girl:-medium-light-skin-tone '๐Ÿ‘ง๐Ÿผ) - (hm/set! emoji-map :girl:-medium-skin-tone '๐Ÿ‘ง๐Ÿฝ) - (hm/set! emoji-map :girl:-medium-dark-skin-tone '๐Ÿ‘ง๐Ÿพ) - (hm/set! emoji-map :girl:-dark-skin-tone '๐Ÿ‘ง๐Ÿฟ) - (hm/set! emoji-map :person '๐Ÿง‘) - (hm/set! emoji-map :person:-light-skin-tone '๐Ÿง‘๐Ÿป) - (hm/set! emoji-map :person:-medium-light-skin-tone '๐Ÿง‘๐Ÿผ) - (hm/set! emoji-map :person:-medium-skin-tone '๐Ÿง‘๐Ÿฝ) - (hm/set! emoji-map :person:-medium-dark-skin-tone '๐Ÿง‘๐Ÿพ) - (hm/set! emoji-map :person:-dark-skin-tone '๐Ÿง‘๐Ÿฟ) - (hm/set! emoji-map :person:-blond-hair '๐Ÿ‘ฑ) - (hm/set! emoji-map :person:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿป) - (hm/set! emoji-map :person:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผ) - (hm/set! emoji-map :person:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝ) - (hm/set! emoji-map :person:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพ) - (hm/set! emoji-map :person:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟ) - (hm/set! emoji-map :man '๐Ÿ‘จ) - (hm/set! emoji-map :man:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :man:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :man:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :man:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :man:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :man:-beard '๐Ÿง”) - (hm/set! emoji-map :man:-light-skin-tone-beard '๐Ÿง”๐Ÿป) - (hm/set! emoji-map :man:-medium-light-skin-tone-beard '๐Ÿง”๐Ÿผ) - (hm/set! emoji-map :man:-medium-skin-tone-beard '๐Ÿง”๐Ÿฝ) - (hm/set! emoji-map :man:-medium-dark-skin-tone-beard '๐Ÿง”๐Ÿพ) - (hm/set! emoji-map :man:-dark-skin-tone-beard '๐Ÿง”๐Ÿฟ) - (hm/set! emoji-map :man:-blond-hair '๐Ÿ‘ฑโ™‚๏ธ) - (hm/set! emoji-map :man:-blond-hair '๐Ÿ‘ฑโ™‚) - (hm/set! emoji-map :man:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿปโ™‚) - (hm/set! emoji-map :man:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผโ™‚) - (hm/set! emoji-map :man:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝโ™‚) - (hm/set! emoji-map :man:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพโ™‚) - (hm/set! emoji-map :man:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟโ™‚) - (hm/set! emoji-map :man:-red-hair '๐Ÿ‘จ๐Ÿฆฐ) - (hm/set! emoji-map :man:-light-skin-tone-red-hair '๐Ÿ‘จ๐Ÿป๐Ÿฆฐ) - (hm/set! emoji-map :man:-medium-light-skin-tone-red-hair '๐Ÿ‘จ๐Ÿผ๐Ÿฆฐ) - (hm/set! emoji-map :man:-medium-skin-tone-red-hair '๐Ÿ‘จ๐Ÿฝ๐Ÿฆฐ) - (hm/set! emoji-map :man:-medium-dark-skin-tone-red-hair '๐Ÿ‘จ๐Ÿพ๐Ÿฆฐ) - (hm/set! emoji-map :man:-dark-skin-tone-red-hair '๐Ÿ‘จ๐Ÿฟ๐Ÿฆฐ) - (hm/set! emoji-map :man:-curly-hair '๐Ÿ‘จ๐Ÿฆฑ) - (hm/set! emoji-map :man:-light-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿป๐Ÿฆฑ) - (hm/set! emoji-map :man:-medium-light-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿผ๐Ÿฆฑ) - (hm/set! emoji-map :man:-medium-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿฝ๐Ÿฆฑ) - (hm/set! emoji-map :man:-medium-dark-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿพ๐Ÿฆฑ) - (hm/set! emoji-map :man:-dark-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿฟ๐Ÿฆฑ) - (hm/set! emoji-map :man:-white-hair '๐Ÿ‘จ๐Ÿฆณ) - (hm/set! emoji-map :man:-light-skin-tone-white-hair '๐Ÿ‘จ๐Ÿป๐Ÿฆณ) - (hm/set! emoji-map :man:-medium-light-skin-tone-white-hair '๐Ÿ‘จ๐Ÿผ๐Ÿฆณ) - (hm/set! emoji-map :man:-medium-skin-tone-white-hair '๐Ÿ‘จ๐Ÿฝ๐Ÿฆณ) - (hm/set! emoji-map :man:-medium-dark-skin-tone-white-hair '๐Ÿ‘จ๐Ÿพ๐Ÿฆณ) - (hm/set! emoji-map :man:-dark-skin-tone-white-hair '๐Ÿ‘จ๐Ÿฟ๐Ÿฆณ) - (hm/set! emoji-map :man:-bald '๐Ÿ‘จ๐Ÿฆฒ) - (hm/set! emoji-map :man:-light-skin-tone-bald '๐Ÿ‘จ๐Ÿป๐Ÿฆฒ) - (hm/set! emoji-map :man:-medium-light-skin-tone-bald '๐Ÿ‘จ๐Ÿผ๐Ÿฆฒ) - (hm/set! emoji-map :man:-medium-skin-tone-bald '๐Ÿ‘จ๐Ÿฝ๐Ÿฆฒ) - (hm/set! emoji-map :man:-medium-dark-skin-tone-bald '๐Ÿ‘จ๐Ÿพ๐Ÿฆฒ) - (hm/set! emoji-map :man:-dark-skin-tone-bald '๐Ÿ‘จ๐Ÿฟ๐Ÿฆฒ) - (hm/set! emoji-map :woman '๐Ÿ‘ฉ) - (hm/set! emoji-map :woman:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :woman:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :woman:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :woman:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :woman:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :woman:-blond-hair '๐Ÿ‘ฑโ™€๏ธ) - (hm/set! emoji-map :woman:-blond-hair '๐Ÿ‘ฑโ™€) - (hm/set! emoji-map :woman:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿปโ™€) - (hm/set! emoji-map :woman:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผโ™€) - (hm/set! emoji-map :woman:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝโ™€) - (hm/set! emoji-map :woman:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพโ™€) - (hm/set! emoji-map :woman:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟโ™€) - (hm/set! emoji-map :woman:-red-hair '๐Ÿ‘ฉ๐Ÿฆฐ) - (hm/set! emoji-map :woman:-light-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿป๐Ÿฆฐ) - (hm/set! emoji-map :woman:-medium-light-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿผ๐Ÿฆฐ) - (hm/set! emoji-map :woman:-medium-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿฝ๐Ÿฆฐ) - (hm/set! emoji-map :woman:-medium-dark-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿพ๐Ÿฆฐ) - (hm/set! emoji-map :woman:-dark-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿฟ๐Ÿฆฐ) - (hm/set! emoji-map :woman:-curly-hair '๐Ÿ‘ฉ๐Ÿฆฑ) - (hm/set! emoji-map :woman:-light-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿป๐Ÿฆฑ) - (hm/set! emoji-map :woman:-medium-light-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿผ๐Ÿฆฑ) - (hm/set! emoji-map :woman:-medium-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿฝ๐Ÿฆฑ) - (hm/set! emoji-map :woman:-medium-dark-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿพ๐Ÿฆฑ) - (hm/set! emoji-map :woman:-dark-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿฟ๐Ÿฆฑ) - (hm/set! emoji-map :woman:-white-hair '๐Ÿ‘ฉ๐Ÿฆณ) - (hm/set! emoji-map :woman:-light-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿป๐Ÿฆณ) - (hm/set! emoji-map :woman:-medium-light-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿผ๐Ÿฆณ) - (hm/set! emoji-map :woman:-medium-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿฝ๐Ÿฆณ) - (hm/set! emoji-map :woman:-medium-dark-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿพ๐Ÿฆณ) - (hm/set! emoji-map :woman:-dark-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿฟ๐Ÿฆณ) - (hm/set! emoji-map :woman:-bald '๐Ÿ‘ฉ๐Ÿฆฒ) - (hm/set! emoji-map :woman:-light-skin-tone-bald '๐Ÿ‘ฉ๐Ÿป๐Ÿฆฒ) - (hm/set! emoji-map :woman:-medium-light-skin-tone-bald '๐Ÿ‘ฉ๐Ÿผ๐Ÿฆฒ) - (hm/set! emoji-map :woman:-medium-skin-tone-bald '๐Ÿ‘ฉ๐Ÿฝ๐Ÿฆฒ) - (hm/set! emoji-map :woman:-medium-dark-skin-tone-bald '๐Ÿ‘ฉ๐Ÿพ๐Ÿฆฒ) - (hm/set! emoji-map :woman:-dark-skin-tone-bald '๐Ÿ‘ฉ๐Ÿฟ๐Ÿฆฒ) - (hm/set! emoji-map :older-person '๐Ÿง“) - (hm/set! emoji-map :older-person:-light-skin-tone '๐Ÿง“๐Ÿป) - (hm/set! emoji-map :older-person:-medium-light-skin-tone '๐Ÿง“๐Ÿผ) - (hm/set! emoji-map :older-person:-medium-skin-tone '๐Ÿง“๐Ÿฝ) - (hm/set! emoji-map :older-person:-medium-dark-skin-tone '๐Ÿง“๐Ÿพ) - (hm/set! emoji-map :older-person:-dark-skin-tone '๐Ÿง“๐Ÿฟ) - (hm/set! emoji-map :old-man '๐Ÿ‘ด) - (hm/set! emoji-map :old-man:-light-skin-tone '๐Ÿ‘ด๐Ÿป) - (hm/set! emoji-map :old-man:-medium-light-skin-tone '๐Ÿ‘ด๐Ÿผ) - (hm/set! emoji-map :old-man:-medium-skin-tone '๐Ÿ‘ด๐Ÿฝ) - (hm/set! emoji-map :old-man:-medium-dark-skin-tone '๐Ÿ‘ด๐Ÿพ) - (hm/set! emoji-map :old-man:-dark-skin-tone '๐Ÿ‘ด๐Ÿฟ) - (hm/set! emoji-map :old-woman '๐Ÿ‘ต) - (hm/set! emoji-map :old-woman:-light-skin-tone '๐Ÿ‘ต๐Ÿป) - (hm/set! emoji-map :old-woman:-medium-light-skin-tone '๐Ÿ‘ต๐Ÿผ) - (hm/set! emoji-map :old-woman:-medium-skin-tone '๐Ÿ‘ต๐Ÿฝ) - (hm/set! emoji-map :old-woman:-medium-dark-skin-tone '๐Ÿ‘ต๐Ÿพ) - (hm/set! emoji-map :old-woman:-dark-skin-tone '๐Ÿ‘ต๐Ÿฟ) - (hm/set! emoji-map :person-frowning '๐Ÿ™) - (hm/set! emoji-map :person-frowning:-light-skin-tone '๐Ÿ™๐Ÿป) - (hm/set! emoji-map :person-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผ) - (hm/set! emoji-map :person-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝ) - (hm/set! emoji-map :person-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพ) - (hm/set! emoji-map :person-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟ) - (hm/set! emoji-map :man-frowning '๐Ÿ™โ™‚๏ธ) - (hm/set! emoji-map :man-frowning '๐Ÿ™โ™‚) - (hm/set! emoji-map :man-frowning:-light-skin-tone '๐Ÿ™๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-frowning:-light-skin-tone '๐Ÿ™๐Ÿปโ™‚) - (hm/set! emoji-map :man-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผโ™‚) - (hm/set! emoji-map :man-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝโ™‚) - (hm/set! emoji-map :man-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพโ™‚) - (hm/set! emoji-map :man-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-frowning '๐Ÿ™โ™€๏ธ) - (hm/set! emoji-map :woman-frowning '๐Ÿ™โ™€) - (hm/set! emoji-map :woman-frowning:-light-skin-tone '๐Ÿ™๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-frowning:-light-skin-tone '๐Ÿ™๐Ÿปโ™€) - (hm/set! emoji-map :woman-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผโ™€) - (hm/set! emoji-map :woman-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝโ™€) - (hm/set! emoji-map :woman-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพโ™€) - (hm/set! emoji-map :woman-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟโ™€) - (hm/set! emoji-map :person-pouting '๐Ÿ™Ž) - (hm/set! emoji-map :person-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿป) - (hm/set! emoji-map :person-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผ) - (hm/set! emoji-map :person-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝ) - (hm/set! emoji-map :person-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพ) - (hm/set! emoji-map :person-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟ) - (hm/set! emoji-map :man-pouting '๐Ÿ™Žโ™‚๏ธ) - (hm/set! emoji-map :man-pouting '๐Ÿ™Žโ™‚) - (hm/set! emoji-map :man-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿปโ™‚) - (hm/set! emoji-map :man-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผโ™‚) - (hm/set! emoji-map :man-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝโ™‚) - (hm/set! emoji-map :man-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพโ™‚) - (hm/set! emoji-map :man-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-pouting '๐Ÿ™Žโ™€๏ธ) - (hm/set! emoji-map :woman-pouting '๐Ÿ™Žโ™€) - (hm/set! emoji-map :woman-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿปโ™€) - (hm/set! emoji-map :woman-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผโ™€) - (hm/set! emoji-map :woman-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝโ™€) - (hm/set! emoji-map :woman-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพโ™€) - (hm/set! emoji-map :woman-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟโ™€) - (hm/set! emoji-map :person-gesturing-NO '๐Ÿ™…) - (hm/set! emoji-map :person-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿป) - (hm/set! emoji-map :person-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผ) - (hm/set! emoji-map :person-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝ) - (hm/set! emoji-map :person-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพ) - (hm/set! emoji-map :person-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟ) - (hm/set! emoji-map :man-gesturing-NO '๐Ÿ™…โ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-NO '๐Ÿ™…โ™‚) - (hm/set! emoji-map :man-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿปโ™‚) - (hm/set! emoji-map :man-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผโ™‚) - (hm/set! emoji-map :man-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝโ™‚) - (hm/set! emoji-map :man-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพโ™‚) - (hm/set! emoji-map :man-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-gesturing-NO '๐Ÿ™…โ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-NO '๐Ÿ™…โ™€) - (hm/set! emoji-map :woman-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿปโ™€) - (hm/set! emoji-map :woman-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผโ™€) - (hm/set! emoji-map :woman-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝโ™€) - (hm/set! emoji-map :woman-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพโ™€) - (hm/set! emoji-map :woman-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟโ™€) - (hm/set! emoji-map :person-gesturing-OK '๐Ÿ™†) - (hm/set! emoji-map :person-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿป) - (hm/set! emoji-map :person-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผ) - (hm/set! emoji-map :person-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝ) - (hm/set! emoji-map :person-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพ) - (hm/set! emoji-map :person-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟ) - (hm/set! emoji-map :man-gesturing-OK '๐Ÿ™†โ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-OK '๐Ÿ™†โ™‚) - (hm/set! emoji-map :man-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿปโ™‚) - (hm/set! emoji-map :man-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผโ™‚) - (hm/set! emoji-map :man-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝโ™‚) - (hm/set! emoji-map :man-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพโ™‚) - (hm/set! emoji-map :man-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-gesturing-OK '๐Ÿ™†โ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-OK '๐Ÿ™†โ™€) - (hm/set! emoji-map :woman-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿปโ™€) - (hm/set! emoji-map :woman-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผโ™€) - (hm/set! emoji-map :woman-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝโ™€) - (hm/set! emoji-map :woman-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพโ™€) - (hm/set! emoji-map :woman-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟโ™€) - (hm/set! emoji-map :person-tipping-hand '๐Ÿ’) - (hm/set! emoji-map :person-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿป) - (hm/set! emoji-map :person-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผ) - (hm/set! emoji-map :person-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝ) - (hm/set! emoji-map :person-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพ) - (hm/set! emoji-map :person-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟ) - (hm/set! emoji-map :man-tipping-hand '๐Ÿ’โ™‚๏ธ) - (hm/set! emoji-map :man-tipping-hand '๐Ÿ’โ™‚) - (hm/set! emoji-map :man-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿปโ™‚) - (hm/set! emoji-map :man-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผโ™‚) - (hm/set! emoji-map :man-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝโ™‚) - (hm/set! emoji-map :man-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพโ™‚) - (hm/set! emoji-map :man-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-tipping-hand '๐Ÿ’โ™€๏ธ) - (hm/set! emoji-map :woman-tipping-hand '๐Ÿ’โ™€) - (hm/set! emoji-map :woman-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿปโ™€) - (hm/set! emoji-map :woman-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผโ™€) - (hm/set! emoji-map :woman-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝโ™€) - (hm/set! emoji-map :woman-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพโ™€) - (hm/set! emoji-map :woman-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟโ™€) - (hm/set! emoji-map :person-raising-hand '๐Ÿ™‹) - (hm/set! emoji-map :person-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿป) - (hm/set! emoji-map :person-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผ) - (hm/set! emoji-map :person-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝ) - (hm/set! emoji-map :person-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพ) - (hm/set! emoji-map :person-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟ) - (hm/set! emoji-map :man-raising-hand '๐Ÿ™‹โ™‚๏ธ) - (hm/set! emoji-map :man-raising-hand '๐Ÿ™‹โ™‚) - (hm/set! emoji-map :man-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿปโ™‚) - (hm/set! emoji-map :man-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผโ™‚) - (hm/set! emoji-map :man-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝโ™‚) - (hm/set! emoji-map :man-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพโ™‚) - (hm/set! emoji-map :man-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-raising-hand '๐Ÿ™‹โ™€๏ธ) - (hm/set! emoji-map :woman-raising-hand '๐Ÿ™‹โ™€) - (hm/set! emoji-map :woman-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿปโ™€) - (hm/set! emoji-map :woman-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผโ™€) - (hm/set! emoji-map :woman-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝโ™€) - (hm/set! emoji-map :woman-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพโ™€) - (hm/set! emoji-map :woman-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟโ™€) - (hm/set! emoji-map :deaf-person '๐Ÿง) - (hm/set! emoji-map :deaf-person:-light-skin-tone '๐Ÿง๐Ÿป) - (hm/set! emoji-map :deaf-person:-medium-light-skin-tone '๐Ÿง๐Ÿผ) - (hm/set! emoji-map :deaf-person:-medium-skin-tone '๐Ÿง๐Ÿฝ) - (hm/set! emoji-map :deaf-person:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) - (hm/set! emoji-map :deaf-person:-dark-skin-tone '๐Ÿง๐Ÿฟ) - (hm/set! emoji-map :deaf-man '๐Ÿงโ™‚๏ธ) - (hm/set! emoji-map :deaf-man '๐Ÿงโ™‚) - (hm/set! emoji-map :deaf-man:-light-skin-tone '๐Ÿง๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :deaf-man:-light-skin-tone '๐Ÿง๐Ÿปโ™‚) - (hm/set! emoji-map :deaf-man:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :deaf-man:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚) - (hm/set! emoji-map :deaf-man:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :deaf-man:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚) - (hm/set! emoji-map :deaf-man:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :deaf-man:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚) - (hm/set! emoji-map :deaf-man:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :deaf-man:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚) - (hm/set! emoji-map :deaf-woman '๐Ÿงโ™€๏ธ) - (hm/set! emoji-map :deaf-woman '๐Ÿงโ™€) - (hm/set! emoji-map :deaf-woman:-light-skin-tone '๐Ÿง๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :deaf-woman:-light-skin-tone '๐Ÿง๐Ÿปโ™€) - (hm/set! emoji-map :deaf-woman:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :deaf-woman:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™€) - (hm/set! emoji-map :deaf-woman:-medium-skin-tone '๐Ÿง๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :deaf-woman:-medium-skin-tone '๐Ÿง๐Ÿฝโ™€) - (hm/set! emoji-map :deaf-woman:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :deaf-woman:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™€) - (hm/set! emoji-map :deaf-woman:-dark-skin-tone '๐Ÿง๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :deaf-woman:-dark-skin-tone '๐Ÿง๐Ÿฟโ™€) - (hm/set! emoji-map :person-bowing '๐Ÿ™‡) - (hm/set! emoji-map :person-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿป) - (hm/set! emoji-map :person-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผ) - (hm/set! emoji-map :person-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝ) - (hm/set! emoji-map :person-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพ) - (hm/set! emoji-map :person-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟ) - (hm/set! emoji-map :man-bowing '๐Ÿ™‡โ™‚๏ธ) - (hm/set! emoji-map :man-bowing '๐Ÿ™‡โ™‚) - (hm/set! emoji-map :man-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿปโ™‚) - (hm/set! emoji-map :man-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผโ™‚) - (hm/set! emoji-map :man-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝโ™‚) - (hm/set! emoji-map :man-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพโ™‚) - (hm/set! emoji-map :man-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-bowing '๐Ÿ™‡โ™€๏ธ) - (hm/set! emoji-map :woman-bowing '๐Ÿ™‡โ™€) - (hm/set! emoji-map :woman-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿปโ™€) - (hm/set! emoji-map :woman-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผโ™€) - (hm/set! emoji-map :woman-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝโ™€) - (hm/set! emoji-map :woman-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพโ™€) - (hm/set! emoji-map :woman-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟโ™€) - (hm/set! emoji-map :person-facepalming '๐Ÿคฆ) - (hm/set! emoji-map :person-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿป) - (hm/set! emoji-map :person-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผ) - (hm/set! emoji-map :person-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝ) - (hm/set! emoji-map :person-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพ) - (hm/set! emoji-map :person-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟ) - (hm/set! emoji-map :man-facepalming '๐Ÿคฆโ™‚๏ธ) - (hm/set! emoji-map :man-facepalming '๐Ÿคฆโ™‚) - (hm/set! emoji-map :man-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿปโ™‚) - (hm/set! emoji-map :man-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผโ™‚) - (hm/set! emoji-map :man-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพโ™‚) - (hm/set! emoji-map :man-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-facepalming '๐Ÿคฆโ™€๏ธ) - (hm/set! emoji-map :woman-facepalming '๐Ÿคฆโ™€) - (hm/set! emoji-map :woman-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿปโ™€) - (hm/set! emoji-map :woman-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผโ™€) - (hm/set! emoji-map :woman-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝโ™€) - (hm/set! emoji-map :woman-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพโ™€) - (hm/set! emoji-map :woman-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟโ™€) - (hm/set! emoji-map :person-shrugging '๐Ÿคท) - (hm/set! emoji-map :person-shrugging:-light-skin-tone '๐Ÿคท๐Ÿป) - (hm/set! emoji-map :person-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผ) - (hm/set! emoji-map :person-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝ) - (hm/set! emoji-map :person-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพ) - (hm/set! emoji-map :person-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟ) - (hm/set! emoji-map :man-shrugging '๐Ÿคทโ™‚๏ธ) - (hm/set! emoji-map :man-shrugging '๐Ÿคทโ™‚) - (hm/set! emoji-map :man-shrugging:-light-skin-tone '๐Ÿคท๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-shrugging:-light-skin-tone '๐Ÿคท๐Ÿปโ™‚) - (hm/set! emoji-map :man-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผโ™‚) - (hm/set! emoji-map :man-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝโ™‚) - (hm/set! emoji-map :man-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพโ™‚) - (hm/set! emoji-map :man-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-shrugging '๐Ÿคทโ™€๏ธ) - (hm/set! emoji-map :woman-shrugging '๐Ÿคทโ™€) - (hm/set! emoji-map :woman-shrugging:-light-skin-tone '๐Ÿคท๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-shrugging:-light-skin-tone '๐Ÿคท๐Ÿปโ™€) - (hm/set! emoji-map :woman-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผโ™€) - (hm/set! emoji-map :woman-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝโ™€) - (hm/set! emoji-map :woman-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพโ™€) - (hm/set! emoji-map :woman-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟโ™€) - (hm/set! emoji-map :โš•๏ธ-man-health-worker '๐Ÿ‘จ) - (hm/set! emoji-map :โš•-man-health-worker '๐Ÿ‘จ) - (hm/set! emoji-map :โš•๏ธ-man-health-worker:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :โš•-man-health-worker:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :โš•๏ธ-man-health-worker:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :โš•-man-health-worker:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :โš•๏ธ-man-health-worker:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :โš•-man-health-worker:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :โš•๏ธ-man-health-worker:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :โš•-man-health-worker:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :โš•๏ธ-man-health-worker:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :โš•-man-health-worker:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :โš•๏ธ-woman-health-worker '๐Ÿ‘ฉ) - (hm/set! emoji-map :โš•-woman-health-worker '๐Ÿ‘ฉ) - (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :โš•-woman-health-worker:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :โš•-woman-health-worker:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :โš•-woman-health-worker:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :โš•-woman-health-worker:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :โš•-woman-health-worker:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐ŸŽ“-man-student '๐Ÿ‘จ) - (hm/set! emoji-map :๐ŸŽ“-man-student:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐ŸŽ“-man-student:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐ŸŽ“-man-student:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐ŸŽ“-man-student:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐ŸŽ“-man-student:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐ŸŽ“-woman-student '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐ŸŽ“-woman-student:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐ŸŽ“-woman-student:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐ŸŽ“-woman-student:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐ŸŽ“-woman-student:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐ŸŽ“-woman-student:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿซ-man-teacher '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿซ-man-teacher:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿซ-man-teacher:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿซ-man-teacher:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿซ-man-teacher:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿซ-man-teacher:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿซ-woman-teacher '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿซ-woman-teacher:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿซ-woman-teacher:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿซ-woman-teacher:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿซ-woman-teacher:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿซ-woman-teacher:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :โš–๏ธ-man-judge '๐Ÿ‘จ) - (hm/set! emoji-map :โš–-man-judge '๐Ÿ‘จ) - (hm/set! emoji-map :โš–๏ธ-man-judge:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :โš–-man-judge:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :โš–๏ธ-man-judge:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :โš–-man-judge:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :โš–๏ธ-man-judge:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :โš–-man-judge:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :โš–๏ธ-man-judge:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :โš–-man-judge:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :โš–๏ธ-man-judge:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :โš–-man-judge:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :โš–๏ธ-woman-judge '๐Ÿ‘ฉ) - (hm/set! emoji-map :โš–-woman-judge '๐Ÿ‘ฉ) - (hm/set! emoji-map :โš–๏ธ-woman-judge:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :โš–-woman-judge:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :โš–๏ธ-woman-judge:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :โš–-woman-judge:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :โš–๏ธ-woman-judge:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :โš–-woman-judge:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :โš–๏ธ-woman-judge:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :โš–-woman-judge:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :โš–๏ธ-woman-judge:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :โš–-woman-judge:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐ŸŒพ-man-farmer '๐Ÿ‘จ) - (hm/set! emoji-map :๐ŸŒพ-man-farmer:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐ŸŒพ-man-farmer:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐ŸŒพ-man-farmer:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐ŸŒพ-man-farmer:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐ŸŒพ-man-farmer:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐ŸŒพ-woman-farmer '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿณ-man-cook '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿณ-man-cook:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿณ-man-cook:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿณ-man-cook:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿณ-man-cook:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿณ-man-cook:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿณ-woman-cook '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿณ-woman-cook:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿณ-woman-cook:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿณ-woman-cook:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿณ-woman-cook:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿณ-woman-cook:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿ”ง-man-mechanic '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿญ-man-factory-worker '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿญ-woman-factory-worker '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿ’ป-man-technologist '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿ’ป-woman-technologist '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐ŸŽค-man-singer '๐Ÿ‘จ) - (hm/set! emoji-map :๐ŸŽค-man-singer:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐ŸŽค-man-singer:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐ŸŽค-man-singer:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐ŸŽค-man-singer:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐ŸŽค-man-singer:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐ŸŽค-woman-singer '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐ŸŽค-woman-singer:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐ŸŽค-woman-singer:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐ŸŽค-woman-singer:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐ŸŽค-woman-singer:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐ŸŽค-woman-singer:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐ŸŽจ-man-artist '๐Ÿ‘จ) - (hm/set! emoji-map :๐ŸŽจ-man-artist:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐ŸŽจ-man-artist:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐ŸŽจ-man-artist:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐ŸŽจ-man-artist:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐ŸŽจ-man-artist:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐ŸŽจ-woman-artist '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐ŸŽจ-woman-artist:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐ŸŽจ-woman-artist:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐ŸŽจ-woman-artist:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐ŸŽจ-woman-artist:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐ŸŽจ-woman-artist:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :โœˆ๏ธ-man-pilot '๐Ÿ‘จ) - (hm/set! emoji-map :โœˆ-man-pilot '๐Ÿ‘จ) - (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :โœˆ-man-pilot:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :โœˆ-man-pilot:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :โœˆ-man-pilot:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :โœˆ-man-pilot:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :โœˆ-man-pilot:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :โœˆ๏ธ-woman-pilot '๐Ÿ‘ฉ) - (hm/set! emoji-map :โœˆ-woman-pilot '๐Ÿ‘ฉ) - (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :โœˆ-woman-pilot:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :โœˆ-woman-pilot:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :โœˆ-woman-pilot:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :โœˆ-woman-pilot:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :โœˆ-woman-pilot:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿš€-man-astronaut '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿš€-man-astronaut:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿš€-man-astronaut:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿš€-man-astronaut:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿš€-man-astronaut:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿš€-man-astronaut:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿš€-woman-astronaut '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿš’-man-firefighter '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿš’-man-firefighter:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿš’-man-firefighter:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿš’-man-firefighter:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿš’-man-firefighter:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿš’-man-firefighter:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿš’-woman-firefighter '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :police-officer '๐Ÿ‘ฎ) - (hm/set! emoji-map :police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿป) - (hm/set! emoji-map :police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผ) - (hm/set! emoji-map :police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝ) - (hm/set! emoji-map :police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพ) - (hm/set! emoji-map :police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟ) - (hm/set! emoji-map :man-police-officer '๐Ÿ‘ฎโ™‚๏ธ) - (hm/set! emoji-map :man-police-officer '๐Ÿ‘ฎโ™‚) - (hm/set! emoji-map :man-police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿปโ™‚) - (hm/set! emoji-map :man-police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผโ™‚) - (hm/set! emoji-map :man-police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพโ™‚) - (hm/set! emoji-map :man-police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟโ™‚) - (hm/set! emoji-map :woman-police-officer '๐Ÿ‘ฎโ™€๏ธ) - (hm/set! emoji-map :woman-police-officer '๐Ÿ‘ฎโ™€) - (hm/set! emoji-map :woman-police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿปโ™€๏ธ) - (hm/set! emoji-map :woman-police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿปโ™€) - (hm/set! emoji-map :woman-police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผโ™€๏ธ) - (hm/set! emoji-map :woman-police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผโ™€) - (hm/set! emoji-map :woman-police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝโ™€๏ธ) - (hm/set! emoji-map :woman-police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝโ™€) - (hm/set! emoji-map :woman-police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพโ™€๏ธ) - (hm/set! emoji-map :woman-police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพโ™€) - (hm/set! emoji-map :woman-police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟโ™€๏ธ) - (hm/set! emoji-map :woman-police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟโ™€) - (hm/set! emoji-map :detective '๐Ÿ•ต๏ธ) - (hm/set! emoji-map :detective '๐Ÿ•ต) - (hm/set! emoji-map :detective:-light-skin-tone '๐Ÿ•ต๐Ÿป) - (hm/set! emoji-map :detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผ) - (hm/set! emoji-map :detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝ) - (hm/set! emoji-map :detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพ) - (hm/set! emoji-map :detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟ) - (hm/set! emoji-map :man-detective '๐Ÿ•ต๏ธโ™‚๏ธ) - (hm/set! emoji-map :man-detective '๐Ÿ•ตโ™‚๏ธ) - (hm/set! emoji-map :man-detective '๐Ÿ•ต๏ธโ™‚) - (hm/set! emoji-map :man-detective '๐Ÿ•ตโ™‚) - (hm/set! emoji-map :man-detective:-light-skin-tone '๐Ÿ•ต๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-detective:-light-skin-tone '๐Ÿ•ต๐Ÿปโ™‚) - (hm/set! emoji-map :man-detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผโ™‚) - (hm/set! emoji-map :man-detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝโ™‚) - (hm/set! emoji-map :man-detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพโ™‚) - (hm/set! emoji-map :man-detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-detective '๐Ÿ•ต๏ธ) - (hm/set! emoji-map :โ™€๏ธ-woman-detective '๐Ÿ•ต) - (hm/set! emoji-map :woman-detective '๐Ÿ•ต๏ธโ™€) - (hm/set! emoji-map :woman-detective '๐Ÿ•ตโ™€) - (hm/set! emoji-map :โ™€๏ธ-woman-detective:-light-skin-tone '๐Ÿ•ต๐Ÿป) - (hm/set! emoji-map :woman-detective:-light-skin-tone '๐Ÿ•ต๐Ÿปโ™€) - (hm/set! emoji-map :โ™€๏ธ-woman-detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผ) - (hm/set! emoji-map :woman-detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผโ™€) - (hm/set! emoji-map :โ™€๏ธ-woman-detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝ) - (hm/set! emoji-map :woman-detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝโ™€) - (hm/set! emoji-map :โ™€๏ธ-woman-detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพ) - (hm/set! emoji-map :woman-detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพโ™€) - (hm/set! emoji-map :โ™€๏ธ-woman-detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟ) - (hm/set! emoji-map :woman-detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟโ™€) - (hm/set! emoji-map :guard '๐Ÿ’‚) - (hm/set! emoji-map :guard:-light-skin-tone '๐Ÿ’‚๐Ÿป) - (hm/set! emoji-map :guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผ) - (hm/set! emoji-map :guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝ) - (hm/set! emoji-map :guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพ) - (hm/set! emoji-map :guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟ) - (hm/set! emoji-map :man-guard '๐Ÿ’‚โ™‚๏ธ) - (hm/set! emoji-map :man-guard '๐Ÿ’‚โ™‚) - (hm/set! emoji-map :man-guard:-light-skin-tone '๐Ÿ’‚๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-guard:-light-skin-tone '๐Ÿ’‚๐Ÿปโ™‚) - (hm/set! emoji-map :man-guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผโ™‚) - (hm/set! emoji-map :man-guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝโ™‚) - (hm/set! emoji-map :man-guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพโ™‚) - (hm/set! emoji-map :man-guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-guard '๐Ÿ’‚) - (hm/set! emoji-map :โ™€-woman-guard '๐Ÿ’‚) - (hm/set! emoji-map :โ™€๏ธ-woman-guard:-light-skin-tone '๐Ÿ’‚๐Ÿป) - (hm/set! emoji-map :โ™€-woman-guard:-light-skin-tone '๐Ÿ’‚๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟ) - (hm/set! emoji-map :construction-worker '๐Ÿ‘ท) - (hm/set! emoji-map :construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿป) - (hm/set! emoji-map :construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผ) - (hm/set! emoji-map :construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝ) - (hm/set! emoji-map :construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพ) - (hm/set! emoji-map :construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟ) - (hm/set! emoji-map :man-construction-worker '๐Ÿ‘ทโ™‚๏ธ) - (hm/set! emoji-map :man-construction-worker '๐Ÿ‘ทโ™‚) - (hm/set! emoji-map :man-construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿปโ™‚) - (hm/set! emoji-map :man-construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผโ™‚) - (hm/set! emoji-map :man-construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝโ™‚) - (hm/set! emoji-map :man-construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพโ™‚) - (hm/set! emoji-map :man-construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker '๐Ÿ‘ท) - (hm/set! emoji-map :โ™€-woman-construction-worker '๐Ÿ‘ท) - (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿป) - (hm/set! emoji-map :โ™€-woman-construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟ) - (hm/set! emoji-map :prince '๐Ÿคด) - (hm/set! emoji-map :prince:-light-skin-tone '๐Ÿคด๐Ÿป) - (hm/set! emoji-map :prince:-medium-light-skin-tone '๐Ÿคด๐Ÿผ) - (hm/set! emoji-map :prince:-medium-skin-tone '๐Ÿคด๐Ÿฝ) - (hm/set! emoji-map :prince:-medium-dark-skin-tone '๐Ÿคด๐Ÿพ) - (hm/set! emoji-map :prince:-dark-skin-tone '๐Ÿคด๐Ÿฟ) - (hm/set! emoji-map :princess '๐Ÿ‘ธ) - (hm/set! emoji-map :princess:-light-skin-tone '๐Ÿ‘ธ๐Ÿป) - (hm/set! emoji-map :princess:-medium-light-skin-tone '๐Ÿ‘ธ๐Ÿผ) - (hm/set! emoji-map :princess:-medium-skin-tone '๐Ÿ‘ธ๐Ÿฝ) - (hm/set! emoji-map :princess:-medium-dark-skin-tone '๐Ÿ‘ธ๐Ÿพ) - (hm/set! emoji-map :princess:-dark-skin-tone '๐Ÿ‘ธ๐Ÿฟ) - (hm/set! emoji-map :person-wearing-turban '๐Ÿ‘ณ) - (hm/set! emoji-map :person-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿป) - (hm/set! emoji-map :person-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผ) - (hm/set! emoji-map :person-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝ) - (hm/set! emoji-map :person-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพ) - (hm/set! emoji-map :person-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟ) - (hm/set! emoji-map :man-wearing-turban '๐Ÿ‘ณโ™‚๏ธ) - (hm/set! emoji-map :man-wearing-turban '๐Ÿ‘ณโ™‚) - (hm/set! emoji-map :man-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿปโ™‚) - (hm/set! emoji-map :man-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผโ™‚) - (hm/set! emoji-map :man-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพโ™‚) - (hm/set! emoji-map :man-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban '๐Ÿ‘ณ) - (hm/set! emoji-map :โ™€-woman-wearing-turban '๐Ÿ‘ณ) - (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟ) - (hm/set! emoji-map :man-with-Chinese-cap '๐Ÿ‘ฒ) - (hm/set! emoji-map :man-with-Chinese-cap:-light-skin-tone '๐Ÿ‘ฒ๐Ÿป) - (hm/set! emoji-map :man-with-Chinese-cap:-medium-light-skin-tone '๐Ÿ‘ฒ๐Ÿผ) - (hm/set! emoji-map :man-with-Chinese-cap:-medium-skin-tone '๐Ÿ‘ฒ๐Ÿฝ) - (hm/set! emoji-map :man-with-Chinese-cap:-medium-dark-skin-tone '๐Ÿ‘ฒ๐Ÿพ) - (hm/set! emoji-map :man-with-Chinese-cap:-dark-skin-tone '๐Ÿ‘ฒ๐Ÿฟ) - (hm/set! emoji-map :woman-with-headscarf '๐Ÿง•) - (hm/set! emoji-map :woman-with-headscarf:-light-skin-tone '๐Ÿง•๐Ÿป) - (hm/set! emoji-map :woman-with-headscarf:-medium-light-skin-tone '๐Ÿง•๐Ÿผ) - (hm/set! emoji-map :woman-with-headscarf:-medium-skin-tone '๐Ÿง•๐Ÿฝ) - (hm/set! emoji-map :woman-with-headscarf:-medium-dark-skin-tone '๐Ÿง•๐Ÿพ) - (hm/set! emoji-map :woman-with-headscarf:-dark-skin-tone '๐Ÿง•๐Ÿฟ) - (hm/set! emoji-map :man-in-tuxedo '๐Ÿคต) - (hm/set! emoji-map :man-in-tuxedo:-light-skin-tone '๐Ÿคต๐Ÿป) - (hm/set! emoji-map :man-in-tuxedo:-medium-light-skin-tone '๐Ÿคต๐Ÿผ) - (hm/set! emoji-map :man-in-tuxedo:-medium-skin-tone '๐Ÿคต๐Ÿฝ) - (hm/set! emoji-map :man-in-tuxedo:-medium-dark-skin-tone '๐Ÿคต๐Ÿพ) - (hm/set! emoji-map :man-in-tuxedo:-dark-skin-tone '๐Ÿคต๐Ÿฟ) - (hm/set! emoji-map :bride-with-veil '๐Ÿ‘ฐ) - (hm/set! emoji-map :bride-with-veil:-light-skin-tone '๐Ÿ‘ฐ๐Ÿป) - (hm/set! emoji-map :bride-with-veil:-medium-light-skin-tone '๐Ÿ‘ฐ๐Ÿผ) - (hm/set! emoji-map :bride-with-veil:-medium-skin-tone '๐Ÿ‘ฐ๐Ÿฝ) - (hm/set! emoji-map :bride-with-veil:-medium-dark-skin-tone '๐Ÿ‘ฐ๐Ÿพ) - (hm/set! emoji-map :bride-with-veil:-dark-skin-tone '๐Ÿ‘ฐ๐Ÿฟ) - (hm/set! emoji-map :pregnant-woman '๐Ÿคฐ) - (hm/set! emoji-map :pregnant-woman:-light-skin-tone '๐Ÿคฐ๐Ÿป) - (hm/set! emoji-map :pregnant-woman:-medium-light-skin-tone '๐Ÿคฐ๐Ÿผ) - (hm/set! emoji-map :pregnant-woman:-medium-skin-tone '๐Ÿคฐ๐Ÿฝ) - (hm/set! emoji-map :pregnant-woman:-medium-dark-skin-tone '๐Ÿคฐ๐Ÿพ) - (hm/set! emoji-map :pregnant-woman:-dark-skin-tone '๐Ÿคฐ๐Ÿฟ) - (hm/set! emoji-map :breast-feeding '๐Ÿคฑ) - (hm/set! emoji-map :breast-feeding:-light-skin-tone '๐Ÿคฑ๐Ÿป) - (hm/set! emoji-map :breast-feeding:-medium-light-skin-tone '๐Ÿคฑ๐Ÿผ) - (hm/set! emoji-map :breast-feeding:-medium-skin-tone '๐Ÿคฑ๐Ÿฝ) - (hm/set! emoji-map :breast-feeding:-medium-dark-skin-tone '๐Ÿคฑ๐Ÿพ) - (hm/set! emoji-map :breast-feeding:-dark-skin-tone '๐Ÿคฑ๐Ÿฟ) - (hm/set! emoji-map :baby-angel '๐Ÿ‘ผ) - (hm/set! emoji-map :baby-angel:-light-skin-tone '๐Ÿ‘ผ๐Ÿป) - (hm/set! emoji-map :baby-angel:-medium-light-skin-tone '๐Ÿ‘ผ๐Ÿผ) - (hm/set! emoji-map :baby-angel:-medium-skin-tone '๐Ÿ‘ผ๐Ÿฝ) - (hm/set! emoji-map :baby-angel:-medium-dark-skin-tone '๐Ÿ‘ผ๐Ÿพ) - (hm/set! emoji-map :baby-angel:-dark-skin-tone '๐Ÿ‘ผ๐Ÿฟ) - (hm/set! emoji-map :Santa-Claus '๐ŸŽ…) - (hm/set! emoji-map :Santa-Claus:-light-skin-tone '๐ŸŽ…๐Ÿป) - (hm/set! emoji-map :Santa-Claus:-medium-light-skin-tone '๐ŸŽ…๐Ÿผ) - (hm/set! emoji-map :Santa-Claus:-medium-skin-tone '๐ŸŽ…๐Ÿฝ) - (hm/set! emoji-map :Santa-Claus:-medium-dark-skin-tone '๐ŸŽ…๐Ÿพ) - (hm/set! emoji-map :Santa-Claus:-dark-skin-tone '๐ŸŽ…๐Ÿฟ) - (hm/set! emoji-map :Mrs.-Claus '๐Ÿคถ) - (hm/set! emoji-map :Mrs.-Claus:-light-skin-tone '๐Ÿคถ๐Ÿป) - (hm/set! emoji-map :Mrs.-Claus:-medium-light-skin-tone '๐Ÿคถ๐Ÿผ) - (hm/set! emoji-map :Mrs.-Claus:-medium-skin-tone '๐Ÿคถ๐Ÿฝ) - (hm/set! emoji-map :Mrs.-Claus:-medium-dark-skin-tone '๐Ÿคถ๐Ÿพ) - (hm/set! emoji-map :Mrs.-Claus:-dark-skin-tone '๐Ÿคถ๐Ÿฟ) - (hm/set! emoji-map :superhero '๐Ÿฆธ) - (hm/set! emoji-map :superhero:-light-skin-tone '๐Ÿฆธ๐Ÿป) - (hm/set! emoji-map :superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผ) - (hm/set! emoji-map :superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝ) - (hm/set! emoji-map :superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพ) - (hm/set! emoji-map :superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟ) - (hm/set! emoji-map :man-superhero '๐Ÿฆธโ™‚๏ธ) - (hm/set! emoji-map :man-superhero '๐Ÿฆธโ™‚) - (hm/set! emoji-map :man-superhero:-light-skin-tone '๐Ÿฆธ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-superhero:-light-skin-tone '๐Ÿฆธ๐Ÿปโ™‚) - (hm/set! emoji-map :man-superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผโ™‚) - (hm/set! emoji-map :man-superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพโ™‚) - (hm/set! emoji-map :man-superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-superhero '๐Ÿฆธ) - (hm/set! emoji-map :โ™€-woman-superhero '๐Ÿฆธ) - (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-light-skin-tone '๐Ÿฆธ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-superhero:-light-skin-tone '๐Ÿฆธ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟ) - (hm/set! emoji-map :supervillain '๐Ÿฆน) - (hm/set! emoji-map :supervillain:-light-skin-tone '๐Ÿฆน๐Ÿป) - (hm/set! emoji-map :supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผ) - (hm/set! emoji-map :supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝ) - (hm/set! emoji-map :supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพ) - (hm/set! emoji-map :supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟ) - (hm/set! emoji-map :man-supervillain '๐Ÿฆนโ™‚๏ธ) - (hm/set! emoji-map :man-supervillain '๐Ÿฆนโ™‚) - (hm/set! emoji-map :man-supervillain:-light-skin-tone '๐Ÿฆน๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-supervillain:-light-skin-tone '๐Ÿฆน๐Ÿปโ™‚) - (hm/set! emoji-map :man-supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผโ™‚) - (hm/set! emoji-map :man-supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝโ™‚) - (hm/set! emoji-map :man-supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพโ™‚) - (hm/set! emoji-map :man-supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-supervillain '๐Ÿฆน) - (hm/set! emoji-map :โ™€-woman-supervillain '๐Ÿฆน) - (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-light-skin-tone '๐Ÿฆน๐Ÿป) - (hm/set! emoji-map :โ™€-woman-supervillain:-light-skin-tone '๐Ÿฆน๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟ) - (hm/set! emoji-map :mage '๐Ÿง™) - (hm/set! emoji-map :mage:-light-skin-tone '๐Ÿง™๐Ÿป) - (hm/set! emoji-map :mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผ) - (hm/set! emoji-map :mage:-medium-skin-tone '๐Ÿง™๐Ÿฝ) - (hm/set! emoji-map :mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพ) - (hm/set! emoji-map :mage:-dark-skin-tone '๐Ÿง™๐Ÿฟ) - (hm/set! emoji-map :man-mage '๐Ÿง™โ™‚๏ธ) - (hm/set! emoji-map :man-mage '๐Ÿง™โ™‚) - (hm/set! emoji-map :man-mage:-light-skin-tone '๐Ÿง™๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-mage:-light-skin-tone '๐Ÿง™๐Ÿปโ™‚) - (hm/set! emoji-map :man-mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผโ™‚) - (hm/set! emoji-map :man-mage:-medium-skin-tone '๐Ÿง™๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-mage:-medium-skin-tone '๐Ÿง™๐Ÿฝโ™‚) - (hm/set! emoji-map :man-mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพโ™‚) - (hm/set! emoji-map :man-mage:-dark-skin-tone '๐Ÿง™๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-mage:-dark-skin-tone '๐Ÿง™๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-mage '๐Ÿง™) - (hm/set! emoji-map :โ™€-woman-mage '๐Ÿง™) - (hm/set! emoji-map :โ™€๏ธ-woman-mage:-light-skin-tone '๐Ÿง™๐Ÿป) - (hm/set! emoji-map :โ™€-woman-mage:-light-skin-tone '๐Ÿง™๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-mage:-medium-skin-tone '๐Ÿง™๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-mage:-medium-skin-tone '๐Ÿง™๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-mage:-dark-skin-tone '๐Ÿง™๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-mage:-dark-skin-tone '๐Ÿง™๐Ÿฟ) - (hm/set! emoji-map :fairy '๐Ÿงš) - (hm/set! emoji-map :fairy:-light-skin-tone '๐Ÿงš๐Ÿป) - (hm/set! emoji-map :fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผ) - (hm/set! emoji-map :fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝ) - (hm/set! emoji-map :fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพ) - (hm/set! emoji-map :fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟ) - (hm/set! emoji-map :man-fairy '๐Ÿงšโ™‚๏ธ) - (hm/set! emoji-map :man-fairy '๐Ÿงšโ™‚) - (hm/set! emoji-map :man-fairy:-light-skin-tone '๐Ÿงš๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-fairy:-light-skin-tone '๐Ÿงš๐Ÿปโ™‚) - (hm/set! emoji-map :man-fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผโ™‚) - (hm/set! emoji-map :man-fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝโ™‚) - (hm/set! emoji-map :man-fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพโ™‚) - (hm/set! emoji-map :man-fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-fairy '๐Ÿงš) - (hm/set! emoji-map :โ™€-woman-fairy '๐Ÿงš) - (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-light-skin-tone '๐Ÿงš๐Ÿป) - (hm/set! emoji-map :โ™€-woman-fairy:-light-skin-tone '๐Ÿงš๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟ) - (hm/set! emoji-map :vampire '๐Ÿง›) - (hm/set! emoji-map :vampire:-light-skin-tone '๐Ÿง›๐Ÿป) - (hm/set! emoji-map :vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผ) - (hm/set! emoji-map :vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝ) - (hm/set! emoji-map :vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพ) - (hm/set! emoji-map :vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟ) - (hm/set! emoji-map :man-vampire '๐Ÿง›โ™‚๏ธ) - (hm/set! emoji-map :man-vampire '๐Ÿง›โ™‚) - (hm/set! emoji-map :man-vampire:-light-skin-tone '๐Ÿง›๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-vampire:-light-skin-tone '๐Ÿง›๐Ÿปโ™‚) - (hm/set! emoji-map :man-vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผโ™‚) - (hm/set! emoji-map :man-vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝโ™‚) - (hm/set! emoji-map :man-vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพโ™‚) - (hm/set! emoji-map :man-vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-vampire '๐Ÿง›) - (hm/set! emoji-map :โ™€-woman-vampire '๐Ÿง›) - (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-light-skin-tone '๐Ÿง›๐Ÿป) - (hm/set! emoji-map :โ™€-woman-vampire:-light-skin-tone '๐Ÿง›๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟ) - (hm/set! emoji-map :merperson '๐Ÿงœ) - (hm/set! emoji-map :merperson:-light-skin-tone '๐Ÿงœ๐Ÿป) - (hm/set! emoji-map :merperson:-medium-light-skin-tone '๐Ÿงœ๐Ÿผ) - (hm/set! emoji-map :merperson:-medium-skin-tone '๐Ÿงœ๐Ÿฝ) - (hm/set! emoji-map :merperson:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพ) - (hm/set! emoji-map :merperson:-dark-skin-tone '๐Ÿงœ๐Ÿฟ) - (hm/set! emoji-map :merman '๐Ÿงœโ™‚๏ธ) - (hm/set! emoji-map :merman '๐Ÿงœโ™‚) - (hm/set! emoji-map :merman:-light-skin-tone '๐Ÿงœ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :merman:-light-skin-tone '๐Ÿงœ๐Ÿปโ™‚) - (hm/set! emoji-map :merman:-medium-light-skin-tone '๐Ÿงœ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :merman:-medium-light-skin-tone '๐Ÿงœ๐Ÿผโ™‚) - (hm/set! emoji-map :merman:-medium-skin-tone '๐Ÿงœ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :merman:-medium-skin-tone '๐Ÿงœ๐Ÿฝโ™‚) - (hm/set! emoji-map :merman:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :merman:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพโ™‚) - (hm/set! emoji-map :merman:-dark-skin-tone '๐Ÿงœ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :merman:-dark-skin-tone '๐Ÿงœ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-mermaid '๐Ÿงœ) - (hm/set! emoji-map :โ™€-mermaid '๐Ÿงœ) - (hm/set! emoji-map :โ™€๏ธ-mermaid:-light-skin-tone '๐Ÿงœ๐Ÿป) - (hm/set! emoji-map :โ™€-mermaid:-light-skin-tone '๐Ÿงœ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-mermaid:-medium-light-skin-tone '๐Ÿงœ๐Ÿผ) - (hm/set! emoji-map :โ™€-mermaid:-medium-light-skin-tone '๐Ÿงœ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-mermaid:-medium-skin-tone '๐Ÿงœ๐Ÿฝ) - (hm/set! emoji-map :โ™€-mermaid:-medium-skin-tone '๐Ÿงœ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-mermaid:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพ) - (hm/set! emoji-map :โ™€-mermaid:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-mermaid:-dark-skin-tone '๐Ÿงœ๐Ÿฟ) - (hm/set! emoji-map :โ™€-mermaid:-dark-skin-tone '๐Ÿงœ๐Ÿฟ) - (hm/set! emoji-map :elf '๐Ÿง) - (hm/set! emoji-map :elf:-light-skin-tone '๐Ÿง๐Ÿป) - (hm/set! emoji-map :elf:-medium-light-skin-tone '๐Ÿง๐Ÿผ) - (hm/set! emoji-map :elf:-medium-skin-tone '๐Ÿง๐Ÿฝ) - (hm/set! emoji-map :elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) - (hm/set! emoji-map :elf:-dark-skin-tone '๐Ÿง๐Ÿฟ) - (hm/set! emoji-map :man-elf '๐Ÿงโ™‚๏ธ) - (hm/set! emoji-map :man-elf '๐Ÿงโ™‚) - (hm/set! emoji-map :man-elf:-light-skin-tone '๐Ÿง๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-elf:-light-skin-tone '๐Ÿง๐Ÿปโ™‚) - (hm/set! emoji-map :man-elf:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-elf:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚) - (hm/set! emoji-map :man-elf:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-elf:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚) - (hm/set! emoji-map :man-elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚) - (hm/set! emoji-map :man-elf:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-elf:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-elf '๐Ÿง) - (hm/set! emoji-map :โ™€-woman-elf '๐Ÿง) - (hm/set! emoji-map :โ™€๏ธ-woman-elf:-light-skin-tone '๐Ÿง๐Ÿป) - (hm/set! emoji-map :โ™€-woman-elf:-light-skin-tone '๐Ÿง๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-elf:-medium-light-skin-tone '๐Ÿง๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-elf:-medium-light-skin-tone '๐Ÿง๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-elf:-medium-skin-tone '๐Ÿง๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-elf:-medium-skin-tone '๐Ÿง๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-elf:-dark-skin-tone '๐Ÿง๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-elf:-dark-skin-tone '๐Ÿง๐Ÿฟ) - (hm/set! emoji-map :genie '๐Ÿงž) - (hm/set! emoji-map :man-genie '๐Ÿงžโ™‚๏ธ) - (hm/set! emoji-map :man-genie '๐Ÿงžโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-genie '๐Ÿงž) - (hm/set! emoji-map :โ™€-woman-genie '๐Ÿงž) - (hm/set! emoji-map :zombie '๐ŸงŸ) - (hm/set! emoji-map :man-zombie '๐ŸงŸโ™‚๏ธ) - (hm/set! emoji-map :man-zombie '๐ŸงŸโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-zombie '๐ŸงŸ) - (hm/set! emoji-map :โ™€-woman-zombie '๐ŸงŸ) - (hm/set! emoji-map :person-getting-massage '๐Ÿ’†) - (hm/set! emoji-map :person-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿป) - (hm/set! emoji-map :person-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผ) - (hm/set! emoji-map :person-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝ) - (hm/set! emoji-map :person-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพ) - (hm/set! emoji-map :person-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟ) - (hm/set! emoji-map :man-getting-massage '๐Ÿ’†โ™‚๏ธ) - (hm/set! emoji-map :man-getting-massage '๐Ÿ’†โ™‚) - (hm/set! emoji-map :man-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿปโ™‚) - (hm/set! emoji-map :man-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผโ™‚) - (hm/set! emoji-map :man-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝโ™‚) - (hm/set! emoji-map :man-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพโ™‚) - (hm/set! emoji-map :man-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage '๐Ÿ’†) - (hm/set! emoji-map :โ™€-woman-getting-massage '๐Ÿ’†) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿป) - (hm/set! emoji-map :โ™€-woman-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟ) - (hm/set! emoji-map :person-getting-haircut '๐Ÿ’‡) - (hm/set! emoji-map :person-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿป) - (hm/set! emoji-map :person-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผ) - (hm/set! emoji-map :person-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝ) - (hm/set! emoji-map :person-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพ) - (hm/set! emoji-map :person-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟ) - (hm/set! emoji-map :man-getting-haircut '๐Ÿ’‡โ™‚๏ธ) - (hm/set! emoji-map :man-getting-haircut '๐Ÿ’‡โ™‚) - (hm/set! emoji-map :man-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿปโ™‚) - (hm/set! emoji-map :man-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผโ™‚) - (hm/set! emoji-map :man-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝโ™‚) - (hm/set! emoji-map :man-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพโ™‚) - (hm/set! emoji-map :man-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut '๐Ÿ’‡) - (hm/set! emoji-map :โ™€-woman-getting-haircut '๐Ÿ’‡) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿป) - (hm/set! emoji-map :โ™€-woman-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟ) - (hm/set! emoji-map :person-walking '๐Ÿšถ) - (hm/set! emoji-map :person-walking:-light-skin-tone '๐Ÿšถ๐Ÿป) - (hm/set! emoji-map :person-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผ) - (hm/set! emoji-map :person-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝ) - (hm/set! emoji-map :person-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพ) - (hm/set! emoji-map :person-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟ) - (hm/set! emoji-map :man-walking '๐Ÿšถโ™‚๏ธ) - (hm/set! emoji-map :man-walking '๐Ÿšถโ™‚) - (hm/set! emoji-map :man-walking:-light-skin-tone '๐Ÿšถ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-walking:-light-skin-tone '๐Ÿšถ๐Ÿปโ™‚) - (hm/set! emoji-map :man-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผโ™‚) - (hm/set! emoji-map :man-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพโ™‚) - (hm/set! emoji-map :man-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-walking '๐Ÿšถ) - (hm/set! emoji-map :โ™€-woman-walking '๐Ÿšถ) - (hm/set! emoji-map :โ™€๏ธ-woman-walking:-light-skin-tone '๐Ÿšถ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-walking:-light-skin-tone '๐Ÿšถ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟ) - (hm/set! emoji-map :person-standing '๐Ÿง) - (hm/set! emoji-map :person-standing:-light-skin-tone '๐Ÿง๐Ÿป) - (hm/set! emoji-map :person-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผ) - (hm/set! emoji-map :person-standing:-medium-skin-tone '๐Ÿง๐Ÿฝ) - (hm/set! emoji-map :person-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) - (hm/set! emoji-map :person-standing:-dark-skin-tone '๐Ÿง๐Ÿฟ) - (hm/set! emoji-map :man-standing '๐Ÿงโ™‚๏ธ) - (hm/set! emoji-map :man-standing '๐Ÿงโ™‚) - (hm/set! emoji-map :man-standing:-light-skin-tone '๐Ÿง๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-standing:-light-skin-tone '๐Ÿง๐Ÿปโ™‚) - (hm/set! emoji-map :man-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚) - (hm/set! emoji-map :man-standing:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-standing:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚) - (hm/set! emoji-map :man-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚) - (hm/set! emoji-map :man-standing:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-standing:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-standing '๐Ÿง) - (hm/set! emoji-map :โ™€-woman-standing '๐Ÿง) - (hm/set! emoji-map :โ™€๏ธ-woman-standing:-light-skin-tone '๐Ÿง๐Ÿป) - (hm/set! emoji-map :โ™€-woman-standing:-light-skin-tone '๐Ÿง๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-standing:-medium-skin-tone '๐Ÿง๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-standing:-medium-skin-tone '๐Ÿง๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-standing:-dark-skin-tone '๐Ÿง๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-standing:-dark-skin-tone '๐Ÿง๐Ÿฟ) - (hm/set! emoji-map :person-kneeling '๐ŸงŽ) - (hm/set! emoji-map :person-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿป) - (hm/set! emoji-map :person-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผ) - (hm/set! emoji-map :person-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝ) - (hm/set! emoji-map :person-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพ) - (hm/set! emoji-map :person-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟ) - (hm/set! emoji-map :man-kneeling '๐ŸงŽโ™‚๏ธ) - (hm/set! emoji-map :man-kneeling '๐ŸงŽโ™‚) - (hm/set! emoji-map :man-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿปโ™‚) - (hm/set! emoji-map :man-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผโ™‚) - (hm/set! emoji-map :man-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพโ™‚) - (hm/set! emoji-map :man-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-kneeling '๐ŸงŽ) - (hm/set! emoji-map :โ™€-woman-kneeling '๐ŸงŽ) - (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-light-skin-tone '๐Ÿ‘จ๐Ÿป) - (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :person-running '๐Ÿƒ) - (hm/set! emoji-map :person-running:-light-skin-tone '๐Ÿƒ๐Ÿป) - (hm/set! emoji-map :person-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผ) - (hm/set! emoji-map :person-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝ) - (hm/set! emoji-map :person-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพ) - (hm/set! emoji-map :person-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟ) - (hm/set! emoji-map :man-running '๐Ÿƒโ™‚๏ธ) - (hm/set! emoji-map :man-running '๐Ÿƒโ™‚) - (hm/set! emoji-map :man-running:-light-skin-tone '๐Ÿƒ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-running:-light-skin-tone '๐Ÿƒ๐Ÿปโ™‚) - (hm/set! emoji-map :man-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผโ™‚) - (hm/set! emoji-map :man-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพโ™‚) - (hm/set! emoji-map :man-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-running '๐Ÿƒ) - (hm/set! emoji-map :โ™€-woman-running '๐Ÿƒ) - (hm/set! emoji-map :โ™€๏ธ-woman-running:-light-skin-tone '๐Ÿƒ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-running:-light-skin-tone '๐Ÿƒ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟ) - (hm/set! emoji-map :woman-dancing '๐Ÿ’ƒ) - (hm/set! emoji-map :woman-dancing:-light-skin-tone '๐Ÿ’ƒ๐Ÿป) - (hm/set! emoji-map :woman-dancing:-medium-light-skin-tone '๐Ÿ’ƒ๐Ÿผ) - (hm/set! emoji-map :woman-dancing:-medium-skin-tone '๐Ÿ’ƒ๐Ÿฝ) - (hm/set! emoji-map :woman-dancing:-medium-dark-skin-tone '๐Ÿ’ƒ๐Ÿพ) - (hm/set! emoji-map :woman-dancing:-dark-skin-tone '๐Ÿ’ƒ๐Ÿฟ) - (hm/set! emoji-map :man-dancing '๐Ÿ•บ) - (hm/set! emoji-map :man-dancing:-light-skin-tone '๐Ÿ•บ๐Ÿป) - (hm/set! emoji-map :man-dancing:-medium-light-skin-tone '๐Ÿ•บ๐Ÿผ) - (hm/set! emoji-map :man-dancing:-medium-skin-tone '๐Ÿ•บ๐Ÿฝ) - (hm/set! emoji-map :man-dancing:-medium-dark-skin-tone '๐Ÿ•บ๐Ÿพ) - (hm/set! emoji-map :man-dancing:-dark-skin-tone '๐Ÿ•บ๐Ÿฟ) - (hm/set! emoji-map :man-in-suit-levitating '๐Ÿ•ด๏ธ) - (hm/set! emoji-map :man-in-suit-levitating '๐Ÿ•ด) - (hm/set! emoji-map :man-in-suit-levitating:-light-skin-tone '๐Ÿ•ด๐Ÿป) - (hm/set! emoji-map :man-in-suit-levitating:-medium-light-skin-tone '๐Ÿ•ด๐Ÿผ) - (hm/set! emoji-map :man-in-suit-levitating:-medium-skin-tone '๐Ÿ•ด๐Ÿฝ) - (hm/set! emoji-map :man-in-suit-levitating:-medium-dark-skin-tone '๐Ÿ•ด๐Ÿพ) - (hm/set! emoji-map :man-in-suit-levitating:-dark-skin-tone '๐Ÿ•ด๐Ÿฟ) - (hm/set! emoji-map :people-with-bunny-ears '๐Ÿ‘ฏ) - (hm/set! emoji-map :men-with-bunny-ears '๐Ÿ‘ฏโ™‚๏ธ) - (hm/set! emoji-map :men-with-bunny-ears '๐Ÿ‘ฏโ™‚) - (hm/set! emoji-map :โ™€๏ธ-women-with-bunny-ears '๐Ÿ‘ฏ) - (hm/set! emoji-map :โ™€-women-with-bunny-ears '๐Ÿ‘ฏ) - (hm/set! emoji-map :person-in-steamy-room '๐Ÿง–) - (hm/set! emoji-map :person-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿป) - (hm/set! emoji-map :person-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผ) - (hm/set! emoji-map :person-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝ) - (hm/set! emoji-map :person-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพ) - (hm/set! emoji-map :person-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟ) - (hm/set! emoji-map :man-in-steamy-room '๐Ÿง–โ™‚๏ธ) - (hm/set! emoji-map :man-in-steamy-room '๐Ÿง–โ™‚) - (hm/set! emoji-map :man-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿปโ™‚) - (hm/set! emoji-map :man-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผโ™‚) - (hm/set! emoji-map :man-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝโ™‚) - (hm/set! emoji-map :man-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพโ™‚) - (hm/set! emoji-map :man-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room '๐Ÿง–) - (hm/set! emoji-map :โ™€-woman-in-steamy-room '๐Ÿง–) - (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿป) - (hm/set! emoji-map :โ™€-woman-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟ) - (hm/set! emoji-map :person-climbing '๐Ÿง—) - (hm/set! emoji-map :person-climbing:-light-skin-tone '๐Ÿง—๐Ÿป) - (hm/set! emoji-map :person-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผ) - (hm/set! emoji-map :person-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝ) - (hm/set! emoji-map :person-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพ) - (hm/set! emoji-map :person-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟ) - (hm/set! emoji-map :man-climbing '๐Ÿง—โ™‚๏ธ) - (hm/set! emoji-map :man-climbing '๐Ÿง—โ™‚) - (hm/set! emoji-map :man-climbing:-light-skin-tone '๐Ÿง—๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-climbing:-light-skin-tone '๐Ÿง—๐Ÿปโ™‚) - (hm/set! emoji-map :man-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผโ™‚) - (hm/set! emoji-map :man-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝโ™‚) - (hm/set! emoji-map :man-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพโ™‚) - (hm/set! emoji-map :man-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-climbing '๐Ÿง—) - (hm/set! emoji-map :โ™€-woman-climbing '๐Ÿง—) - (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-light-skin-tone '๐Ÿง—๐Ÿป) - (hm/set! emoji-map :โ™€-woman-climbing:-light-skin-tone '๐Ÿง—๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟ) - (hm/set! emoji-map :person-fencing '๐Ÿคบ) - (hm/set! emoji-map :horse-racing '๐Ÿ‡) - (hm/set! emoji-map :horse-racing:-light-skin-tone '๐Ÿ‡๐Ÿป) - (hm/set! emoji-map :horse-racing:-medium-light-skin-tone '๐Ÿ‡๐Ÿผ) - (hm/set! emoji-map :horse-racing:-medium-skin-tone '๐Ÿ‡๐Ÿฝ) - (hm/set! emoji-map :horse-racing:-medium-dark-skin-tone '๐Ÿ‡๐Ÿพ) - (hm/set! emoji-map :horse-racing:-dark-skin-tone '๐Ÿ‡๐Ÿฟ) - (hm/set! emoji-map :skier 'โ›ท๏ธ) - (hm/set! emoji-map :skier 'โ›ท) - (hm/set! emoji-map :snowboarder '๐Ÿ‚) - (hm/set! emoji-map :snowboarder:-light-skin-tone '๐Ÿ‚๐Ÿป) - (hm/set! emoji-map :snowboarder:-medium-light-skin-tone '๐Ÿ‚๐Ÿผ) - (hm/set! emoji-map :snowboarder:-medium-skin-tone '๐Ÿ‚๐Ÿฝ) - (hm/set! emoji-map :snowboarder:-medium-dark-skin-tone '๐Ÿ‚๐Ÿพ) - (hm/set! emoji-map :snowboarder:-dark-skin-tone '๐Ÿ‚๐Ÿฟ) - (hm/set! emoji-map :person-golfing '๐ŸŒ๏ธ) - (hm/set! emoji-map :person-golfing '๐ŸŒ) - (hm/set! emoji-map :person-golfing:-light-skin-tone '๐ŸŒ๐Ÿป) - (hm/set! emoji-map :person-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผ) - (hm/set! emoji-map :person-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝ) - (hm/set! emoji-map :person-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพ) - (hm/set! emoji-map :person-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟ) - (hm/set! emoji-map :man-golfing '๐ŸŒ๏ธโ™‚๏ธ) - (hm/set! emoji-map :man-golfing '๐ŸŒโ™‚๏ธ) - (hm/set! emoji-map :man-golfing '๐ŸŒ๏ธโ™‚) - (hm/set! emoji-map :man-golfing '๐ŸŒโ™‚) - (hm/set! emoji-map :man-golfing:-light-skin-tone '๐ŸŒ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-golfing:-light-skin-tone '๐ŸŒ๐Ÿปโ™‚) - (hm/set! emoji-map :man-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผโ™‚) - (hm/set! emoji-map :man-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพโ™‚) - (hm/set! emoji-map :man-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-golfing '๐ŸŒ๏ธ) - (hm/set! emoji-map :โ™€๏ธ-woman-golfing '๐ŸŒ) - (hm/set! emoji-map :โ™€-woman-golfing '๐ŸŒ๏ธ) - (hm/set! emoji-map :โ™€-woman-golfing '๐ŸŒ) - (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-light-skin-tone '๐ŸŒ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-golfing:-light-skin-tone '๐ŸŒ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟ) - (hm/set! emoji-map :person-surfing '๐Ÿ„) - (hm/set! emoji-map :person-surfing:-light-skin-tone '๐Ÿ„๐Ÿป) - (hm/set! emoji-map :person-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผ) - (hm/set! emoji-map :person-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝ) - (hm/set! emoji-map :person-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพ) - (hm/set! emoji-map :person-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟ) - (hm/set! emoji-map :man-surfing '๐Ÿ„โ™‚๏ธ) - (hm/set! emoji-map :man-surfing '๐Ÿ„โ™‚) - (hm/set! emoji-map :man-surfing:-light-skin-tone '๐Ÿ„๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-surfing:-light-skin-tone '๐Ÿ„๐Ÿปโ™‚) - (hm/set! emoji-map :man-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผโ™‚) - (hm/set! emoji-map :man-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝโ™‚) - (hm/set! emoji-map :man-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพโ™‚) - (hm/set! emoji-map :man-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-surfing '๐Ÿ„) - (hm/set! emoji-map :โ™€-woman-surfing '๐Ÿ„) - (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-light-skin-tone '๐Ÿ„๐Ÿป) - (hm/set! emoji-map :โ™€-woman-surfing:-light-skin-tone '๐Ÿ„๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟ) - (hm/set! emoji-map :person-rowing-boat '๐Ÿšฃ) - (hm/set! emoji-map :person-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿป) - (hm/set! emoji-map :person-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผ) - (hm/set! emoji-map :person-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝ) - (hm/set! emoji-map :person-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพ) - (hm/set! emoji-map :person-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟ) - (hm/set! emoji-map :man-rowing-boat '๐Ÿšฃโ™‚๏ธ) - (hm/set! emoji-map :man-rowing-boat '๐Ÿšฃโ™‚) - (hm/set! emoji-map :man-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿปโ™‚) - (hm/set! emoji-map :man-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผโ™‚) - (hm/set! emoji-map :man-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพโ™‚) - (hm/set! emoji-map :man-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat '๐Ÿšฃ) - (hm/set! emoji-map :โ™€-woman-rowing-boat '๐Ÿšฃ) - (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟ) - (hm/set! emoji-map :person-swimming '๐ŸŠ) - (hm/set! emoji-map :person-swimming:-light-skin-tone '๐ŸŠ๐Ÿป) - (hm/set! emoji-map :person-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผ) - (hm/set! emoji-map :person-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝ) - (hm/set! emoji-map :person-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพ) - (hm/set! emoji-map :person-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟ) - (hm/set! emoji-map :man-swimming '๐ŸŠโ™‚๏ธ) - (hm/set! emoji-map :man-swimming '๐ŸŠโ™‚) - (hm/set! emoji-map :man-swimming:-light-skin-tone '๐ŸŠ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-swimming:-light-skin-tone '๐ŸŠ๐Ÿปโ™‚) - (hm/set! emoji-map :man-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผโ™‚) - (hm/set! emoji-map :man-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพโ™‚) - (hm/set! emoji-map :man-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-swimming '๐ŸŠ) - (hm/set! emoji-map :โ™€-woman-swimming '๐ŸŠ) - (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-light-skin-tone '๐ŸŠ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-swimming:-light-skin-tone '๐ŸŠ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟ) - (hm/set! emoji-map :person-bouncing-ball 'โ›น๏ธ) - (hm/set! emoji-map :person-bouncing-ball 'โ›น) - (hm/set! emoji-map :person-bouncing-ball:-light-skin-tone 'โ›น๐Ÿป) - (hm/set! emoji-map :person-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผ) - (hm/set! emoji-map :person-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝ) - (hm/set! emoji-map :person-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพ) - (hm/set! emoji-map :person-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟ) - (hm/set! emoji-map :man-bouncing-ball 'โ›น๏ธโ™‚๏ธ) - (hm/set! emoji-map :man-bouncing-ball 'โ›นโ™‚๏ธ) - (hm/set! emoji-map :man-bouncing-ball 'โ›น๏ธโ™‚) - (hm/set! emoji-map :man-bouncing-ball 'โ›นโ™‚) - (hm/set! emoji-map :man-bouncing-ball:-light-skin-tone 'โ›น๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-bouncing-ball:-light-skin-tone 'โ›น๐Ÿปโ™‚) - (hm/set! emoji-map :man-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผโ™‚) - (hm/set! emoji-map :man-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝโ™‚) - (hm/set! emoji-map :man-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพโ™‚) - (hm/set! emoji-map :man-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball 'โ›น๏ธ) - (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball 'โ›น) - (hm/set! emoji-map :โ™€-woman-bouncing-ball 'โ›น๏ธ) - (hm/set! emoji-map :โ™€-woman-bouncing-ball 'โ›น) - (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-light-skin-tone 'โ›น๐Ÿป) - (hm/set! emoji-map :โ™€-woman-bouncing-ball:-light-skin-tone 'โ›น๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟ) - (hm/set! emoji-map :person-lifting-weights '๐Ÿ‹๏ธ) - (hm/set! emoji-map :person-lifting-weights '๐Ÿ‹) - (hm/set! emoji-map :person-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿป) - (hm/set! emoji-map :person-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผ) - (hm/set! emoji-map :person-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝ) - (hm/set! emoji-map :person-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพ) - (hm/set! emoji-map :person-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟ) - (hm/set! emoji-map :man-lifting-weights '๐Ÿ‹๏ธโ™‚๏ธ) - (hm/set! emoji-map :man-lifting-weights '๐Ÿ‹โ™‚๏ธ) - (hm/set! emoji-map :man-lifting-weights '๐Ÿ‹๏ธโ™‚) - (hm/set! emoji-map :man-lifting-weights '๐Ÿ‹โ™‚) - (hm/set! emoji-map :man-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿปโ™‚) - (hm/set! emoji-map :man-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผโ™‚) - (hm/set! emoji-map :man-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝโ™‚) - (hm/set! emoji-map :man-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพโ™‚) - (hm/set! emoji-map :man-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights '๐Ÿ‹๏ธ) - (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights '๐Ÿ‹) - (hm/set! emoji-map :โ™€-woman-lifting-weights '๐Ÿ‹๏ธ) - (hm/set! emoji-map :โ™€-woman-lifting-weights '๐Ÿ‹) - (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿป) - (hm/set! emoji-map :โ™€-woman-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟ) - (hm/set! emoji-map :person-biking '๐Ÿšด) - (hm/set! emoji-map :person-biking:-light-skin-tone '๐Ÿšด๐Ÿป) - (hm/set! emoji-map :person-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผ) - (hm/set! emoji-map :person-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝ) - (hm/set! emoji-map :person-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพ) - (hm/set! emoji-map :person-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟ) - (hm/set! emoji-map :man-biking '๐Ÿšดโ™‚๏ธ) - (hm/set! emoji-map :man-biking '๐Ÿšดโ™‚) - (hm/set! emoji-map :man-biking:-light-skin-tone '๐Ÿšด๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-biking:-light-skin-tone '๐Ÿšด๐Ÿปโ™‚) - (hm/set! emoji-map :man-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผโ™‚) - (hm/set! emoji-map :man-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝโ™‚) - (hm/set! emoji-map :man-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพโ™‚) - (hm/set! emoji-map :man-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-biking '๐Ÿšด) - (hm/set! emoji-map :โ™€-woman-biking '๐Ÿšด) - (hm/set! emoji-map :โ™€๏ธ-woman-biking:-light-skin-tone '๐Ÿšด๐Ÿป) - (hm/set! emoji-map :โ™€-woman-biking:-light-skin-tone '๐Ÿšด๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟ) - (hm/set! emoji-map :person-mountain-biking '๐Ÿšต) - (hm/set! emoji-map :person-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿป) - (hm/set! emoji-map :person-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผ) - (hm/set! emoji-map :person-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝ) - (hm/set! emoji-map :person-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพ) - (hm/set! emoji-map :person-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟ) - (hm/set! emoji-map :man-mountain-biking '๐Ÿšตโ™‚๏ธ) - (hm/set! emoji-map :man-mountain-biking '๐Ÿšตโ™‚) - (hm/set! emoji-map :man-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿปโ™‚) - (hm/set! emoji-map :man-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผโ™‚) - (hm/set! emoji-map :man-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝโ™‚) - (hm/set! emoji-map :man-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพโ™‚) - (hm/set! emoji-map :man-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking '๐Ÿšต) - (hm/set! emoji-map :โ™€-woman-mountain-biking '๐Ÿšต) - (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿป) - (hm/set! emoji-map :โ™€-woman-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟ) - (hm/set! emoji-map :person-cartwheeling '๐Ÿคธ) - (hm/set! emoji-map :person-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿป) - (hm/set! emoji-map :person-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผ) - (hm/set! emoji-map :person-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝ) - (hm/set! emoji-map :person-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพ) - (hm/set! emoji-map :person-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟ) - (hm/set! emoji-map :man-cartwheeling '๐Ÿคธโ™‚๏ธ) - (hm/set! emoji-map :man-cartwheeling '๐Ÿคธโ™‚) - (hm/set! emoji-map :man-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿปโ™‚) - (hm/set! emoji-map :man-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผโ™‚) - (hm/set! emoji-map :man-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพโ™‚) - (hm/set! emoji-map :man-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling '๐Ÿคธ) - (hm/set! emoji-map :โ™€-woman-cartwheeling '๐Ÿคธ) - (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟ) - (hm/set! emoji-map :people-wrestling '๐Ÿคผ) - (hm/set! emoji-map :men-wrestling '๐Ÿคผโ™‚๏ธ) - (hm/set! emoji-map :men-wrestling '๐Ÿคผโ™‚) - (hm/set! emoji-map :โ™€๏ธ-women-wrestling '๐Ÿคผ) - (hm/set! emoji-map :โ™€-women-wrestling '๐Ÿคผ) - (hm/set! emoji-map :person-playing-water-polo '๐Ÿคฝ) - (hm/set! emoji-map :person-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿป) - (hm/set! emoji-map :person-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผ) - (hm/set! emoji-map :person-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝ) - (hm/set! emoji-map :person-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพ) - (hm/set! emoji-map :person-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟ) - (hm/set! emoji-map :man-playing-water-polo '๐Ÿคฝโ™‚๏ธ) - (hm/set! emoji-map :man-playing-water-polo '๐Ÿคฝโ™‚) - (hm/set! emoji-map :man-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿปโ™‚) - (hm/set! emoji-map :man-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผโ™‚) - (hm/set! emoji-map :man-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพโ™‚) - (hm/set! emoji-map :man-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo '๐Ÿคฝ) - (hm/set! emoji-map :โ™€-woman-playing-water-polo '๐Ÿคฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟ) - (hm/set! emoji-map :person-playing-handball '๐Ÿคพ) - (hm/set! emoji-map :person-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿป) - (hm/set! emoji-map :person-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผ) - (hm/set! emoji-map :person-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝ) - (hm/set! emoji-map :person-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพ) - (hm/set! emoji-map :person-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟ) - (hm/set! emoji-map :man-playing-handball '๐Ÿคพโ™‚๏ธ) - (hm/set! emoji-map :man-playing-handball '๐Ÿคพโ™‚) - (hm/set! emoji-map :man-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿปโ™‚) - (hm/set! emoji-map :man-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผโ™‚) - (hm/set! emoji-map :man-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝโ™‚) - (hm/set! emoji-map :man-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพโ™‚) - (hm/set! emoji-map :man-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball '๐Ÿคพ) - (hm/set! emoji-map :โ™€-woman-playing-handball '๐Ÿคพ) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿป) - (hm/set! emoji-map :โ™€-woman-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟ) - (hm/set! emoji-map :person-juggling '๐Ÿคน) - (hm/set! emoji-map :person-juggling:-light-skin-tone '๐Ÿคน๐Ÿป) - (hm/set! emoji-map :person-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผ) - (hm/set! emoji-map :person-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝ) - (hm/set! emoji-map :person-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพ) - (hm/set! emoji-map :person-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟ) - (hm/set! emoji-map :man-juggling '๐Ÿคนโ™‚๏ธ) - (hm/set! emoji-map :man-juggling '๐Ÿคนโ™‚) - (hm/set! emoji-map :man-juggling:-light-skin-tone '๐Ÿคน๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-juggling:-light-skin-tone '๐Ÿคน๐Ÿปโ™‚) - (hm/set! emoji-map :man-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผโ™‚) - (hm/set! emoji-map :man-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝโ™‚) - (hm/set! emoji-map :man-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพโ™‚) - (hm/set! emoji-map :man-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-juggling '๐Ÿคน) - (hm/set! emoji-map :โ™€-woman-juggling '๐Ÿคน) - (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-light-skin-tone '๐Ÿคน๐Ÿป) - (hm/set! emoji-map :โ™€-woman-juggling:-light-skin-tone '๐Ÿคน๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟ) - (hm/set! emoji-map :person-in-lotus-position '๐Ÿง˜) - (hm/set! emoji-map :person-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿป) - (hm/set! emoji-map :person-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผ) - (hm/set! emoji-map :person-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝ) - (hm/set! emoji-map :person-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพ) - (hm/set! emoji-map :person-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟ) - (hm/set! emoji-map :man-in-lotus-position '๐Ÿง˜โ™‚๏ธ) - (hm/set! emoji-map :man-in-lotus-position '๐Ÿง˜โ™‚) - (hm/set! emoji-map :man-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿปโ™‚๏ธ) - (hm/set! emoji-map :man-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿปโ™‚) - (hm/set! emoji-map :man-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผโ™‚๏ธ) - (hm/set! emoji-map :man-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผโ™‚) - (hm/set! emoji-map :man-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝโ™‚๏ธ) - (hm/set! emoji-map :man-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝโ™‚) - (hm/set! emoji-map :man-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพโ™‚๏ธ) - (hm/set! emoji-map :man-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพโ™‚) - (hm/set! emoji-map :man-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟโ™‚๏ธ) - (hm/set! emoji-map :man-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟโ™‚) - (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position '๐Ÿง˜) - (hm/set! emoji-map :โ™€-woman-in-lotus-position '๐Ÿง˜) - (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿป) - (hm/set! emoji-map :โ™€-woman-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿป) - (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผ) - (hm/set! emoji-map :โ™€-woman-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผ) - (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝ) - (hm/set! emoji-map :โ™€-woman-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝ) - (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพ) - (hm/set! emoji-map :โ™€-woman-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพ) - (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟ) - (hm/set! emoji-map :โ™€-woman-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟ) - (hm/set! emoji-map :person-taking-bath '๐Ÿ›€) - (hm/set! emoji-map :person-taking-bath:-light-skin-tone '๐Ÿ›€๐Ÿป) - (hm/set! emoji-map :person-taking-bath:-medium-light-skin-tone '๐Ÿ›€๐Ÿผ) - (hm/set! emoji-map :person-taking-bath:-medium-skin-tone '๐Ÿ›€๐Ÿฝ) - (hm/set! emoji-map :person-taking-bath:-medium-dark-skin-tone '๐Ÿ›€๐Ÿพ) - (hm/set! emoji-map :person-taking-bath:-dark-skin-tone '๐Ÿ›€๐Ÿฟ) - (hm/set! emoji-map :person-in-bed '๐Ÿ›Œ) - (hm/set! emoji-map :person-in-bed:-light-skin-tone '๐Ÿ›Œ๐Ÿป) - (hm/set! emoji-map :person-in-bed:-medium-light-skin-tone '๐Ÿ›Œ๐Ÿผ) - (hm/set! emoji-map :person-in-bed:-medium-skin-tone '๐Ÿ›Œ๐Ÿฝ) - (hm/set! emoji-map :person-in-bed:-medium-dark-skin-tone '๐Ÿ›Œ๐Ÿพ) - (hm/set! emoji-map :person-in-bed:-dark-skin-tone '๐Ÿ›Œ๐Ÿฟ) - (hm/set! emoji-map :people-holding-hands '๐Ÿง‘๐Ÿคโ€๐Ÿง‘) - (hm/set! emoji-map :people-holding-hands:-light-skin-tone '๐Ÿง‘๐Ÿป๐Ÿคโ€๐Ÿง‘๐Ÿป) - (hm/set! emoji-map :people-holding-hands:-medium-light-skin-tone-light-skin-tone '๐Ÿง‘๐Ÿผ๐Ÿคโ€๐Ÿง‘๐Ÿป) - (hm/set! emoji-map :people-holding-hands:-medium-light-skin-tone '๐Ÿง‘๐Ÿผ๐Ÿคโ€๐Ÿง‘๐Ÿผ) - (hm/set! emoji-map :people-holding-hands:-medium-skin-tone-light-skin-tone '๐Ÿง‘๐Ÿฝ๐Ÿคโ€๐Ÿง‘๐Ÿป) - (hm/set! emoji-map :people-holding-hands:-medium-skin-tone-medium-light-skin-tone '๐Ÿง‘๐Ÿฝ๐Ÿคโ€๐Ÿง‘๐Ÿผ) - (hm/set! emoji-map :people-holding-hands:-medium-skin-tone '๐Ÿง‘๐Ÿฝ๐Ÿคโ€๐Ÿง‘๐Ÿฝ) - (hm/set! emoji-map :people-holding-hands:-medium-dark-skin-tone-light-skin-tone '๐Ÿง‘๐Ÿพ๐Ÿคโ€๐Ÿง‘๐Ÿป) - (hm/set! emoji-map :people-holding-hands:-medium-dark-skin-tone-medium-light-skin-tone '๐Ÿง‘๐Ÿพ๐Ÿคโ€๐Ÿง‘๐Ÿผ) - (hm/set! emoji-map :people-holding-hands:-medium-dark-skin-tone-medium-skin-tone '๐Ÿง‘๐Ÿพ๐Ÿคโ€๐Ÿง‘๐Ÿฝ) - (hm/set! emoji-map :people-holding-hands:-medium-dark-skin-tone '๐Ÿง‘๐Ÿพ๐Ÿคโ€๐Ÿง‘๐Ÿพ) - (hm/set! emoji-map :people-holding-hands:-dark-skin-tone-light-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿป) - (hm/set! emoji-map :people-holding-hands:-dark-skin-tone-medium-light-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿผ) - (hm/set! emoji-map :people-holding-hands:-dark-skin-tone-medium-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿฝ) - (hm/set! emoji-map :people-holding-hands:-dark-skin-tone-medium-dark-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿพ) - (hm/set! emoji-map :people-holding-hands:-dark-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿฟ) - (hm/set! emoji-map :women-holding-hands '๐Ÿ‘ญ) - (hm/set! emoji-map :women-holding-hands:-light-skin-tone '๐Ÿ‘ญ๐Ÿป) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป-women-holding-hands:-medium-light-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :women-holding-hands:-medium-light-skin-tone '๐Ÿ‘ญ๐Ÿผ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป-women-holding-hands:-medium-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ-women-holding-hands:-medium-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :women-holding-hands:-medium-skin-tone '๐Ÿ‘ญ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป-women-holding-hands:-medium-dark-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ-women-holding-hands:-medium-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ-women-holding-hands:-medium-dark-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :women-holding-hands:-medium-dark-skin-tone '๐Ÿ‘ญ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป-women-holding-hands:-dark-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ-women-holding-hands:-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ-women-holding-hands:-dark-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ-women-holding-hands:-dark-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :women-holding-hands:-dark-skin-tone '๐Ÿ‘ญ๐Ÿฟ) - (hm/set! emoji-map :woman-and-man-holding-hands '๐Ÿ‘ซ) - (hm/set! emoji-map :woman-and-man-holding-hands:-light-skin-tone '๐Ÿ‘ซ๐Ÿป) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-woman-and-man-holding-hands:-light-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-woman-and-man-holding-hands:-light-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-woman-and-man-holding-hands:-light-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ-woman-and-man-holding-hands:-light-skin-tone-dark-skin-tone '๐Ÿ‘ฉ๐Ÿป) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-woman-and-man-holding-hands:-medium-light-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :woman-and-man-holding-hands:-medium-light-skin-tone '๐Ÿ‘ซ๐Ÿผ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-woman-and-man-holding-hands:-medium-light-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-woman-and-man-holding-hands:-medium-light-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ-woman-and-man-holding-hands:-medium-light-skin-tone-dark-skin-tone '๐Ÿ‘ฉ๐Ÿผ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-woman-and-man-holding-hands:-medium-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-woman-and-man-holding-hands:-medium-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :woman-and-man-holding-hands:-medium-skin-tone '๐Ÿ‘ซ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-woman-and-man-holding-hands:-medium-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ-woman-and-man-holding-hands:-medium-skin-tone-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-woman-and-man-holding-hands:-medium-dark-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-woman-and-man-holding-hands:-medium-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-woman-and-man-holding-hands:-medium-dark-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :woman-and-man-holding-hands:-medium-dark-skin-tone '๐Ÿ‘ซ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ-woman-and-man-holding-hands:-medium-dark-skin-tone-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-woman-and-man-holding-hands:-dark-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-woman-and-man-holding-hands:-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-woman-and-man-holding-hands:-dark-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-woman-and-man-holding-hands:-dark-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) - (hm/set! emoji-map :woman-and-man-holding-hands:-dark-skin-tone '๐Ÿ‘ซ๐Ÿฟ) - (hm/set! emoji-map :men-holding-hands '๐Ÿ‘ฌ) - (hm/set! emoji-map :men-holding-hands:-light-skin-tone '๐Ÿ‘ฌ๐Ÿป) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-men-holding-hands:-medium-light-skin-tone-light-skin-tone '๐Ÿ‘จ๐Ÿผ) - (hm/set! emoji-map :men-holding-hands:-medium-light-skin-tone '๐Ÿ‘ฌ๐Ÿผ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-men-holding-hands:-medium-skin-tone-light-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-men-holding-hands:-medium-skin-tone-medium-light-skin-tone '๐Ÿ‘จ๐Ÿฝ) - (hm/set! emoji-map :men-holding-hands:-medium-skin-tone '๐Ÿ‘ฌ๐Ÿฝ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-men-holding-hands:-medium-dark-skin-tone-light-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-men-holding-hands:-medium-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-men-holding-hands:-medium-dark-skin-tone-medium-skin-tone '๐Ÿ‘จ๐Ÿพ) - (hm/set! emoji-map :men-holding-hands:-medium-dark-skin-tone '๐Ÿ‘ฌ๐Ÿพ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-men-holding-hands:-dark-skin-tone-light-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-men-holding-hands:-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-men-holding-hands:-dark-skin-tone-medium-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-men-holding-hands:-dark-skin-tone-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) - (hm/set! emoji-map :men-holding-hands:-dark-skin-tone '๐Ÿ‘ฌ๐Ÿฟ) - (hm/set! emoji-map :kiss '๐Ÿ’) - (hm/set! emoji-map :โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ-kiss:-woman-man '๐Ÿ‘ฉ) - (hm/set! emoji-map :โคโ€๐Ÿ’‹โ€๐Ÿ‘จ-kiss:-woman-man '๐Ÿ‘ฉ) - (hm/set! emoji-map :โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ-kiss:-man-man '๐Ÿ‘จ) - (hm/set! emoji-map :โคโ€๐Ÿ’‹โ€๐Ÿ‘จ-kiss:-man-man '๐Ÿ‘จ) - (hm/set! emoji-map :โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ-kiss:-woman-woman '๐Ÿ‘ฉ) - (hm/set! emoji-map :โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ-kiss:-woman-woman '๐Ÿ‘ฉ) - (hm/set! emoji-map :couple-with-heart '๐Ÿ’‘) - (hm/set! emoji-map :โค๏ธโ€๐Ÿ‘จ-couple-with-heart:-woman-man '๐Ÿ‘ฉ) - (hm/set! emoji-map :โคโ€๐Ÿ‘จ-couple-with-heart:-woman-man '๐Ÿ‘ฉ) - (hm/set! emoji-map :โค๏ธโ€๐Ÿ‘จ-couple-with-heart:-man-man '๐Ÿ‘จ) - (hm/set! emoji-map :โคโ€๐Ÿ‘จ-couple-with-heart:-man-man '๐Ÿ‘จ) - (hm/set! emoji-map :โค๏ธโ€๐Ÿ‘ฉ-couple-with-heart:-woman-woman '๐Ÿ‘ฉ) - (hm/set! emoji-map :โคโ€๐Ÿ‘ฉ-couple-with-heart:-woman-woman '๐Ÿ‘ฉ) - (hm/set! emoji-map :family '๐Ÿ‘ช) - (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ฆ-family:-man-woman-boy '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ง-family:-man-woman-girl '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ-family:-man-woman-girl-boy '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ-family:-man-woman-boy-boy '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง-family:-man-woman-girl-girl '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘ฆ-family:-man-man-boy '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘ง-family:-man-man-girl '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ-family:-man-man-girl-boy '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ-family:-man-man-boy-boy '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง-family:-man-man-girl-girl '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ฆ-family:-woman-woman-boy '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ง-family:-woman-woman-girl '๐Ÿ‘ฉ) - (hm/set! emoji-map :family:-woman-woman-girl-boy '๐Ÿ‘ฉ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ) - (hm/set! emoji-map :family:-woman-woman-boy-boy '๐Ÿ‘ฉ๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ) - (hm/set! emoji-map :family:-woman-woman-girl-girl '๐Ÿ‘ฉ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง) - (hm/set! emoji-map :๐Ÿ‘ฆ-family:-man-boy '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘ฆโ€๐Ÿ‘ฆ-family:-man-boy-boy '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘ง-family:-man-girl '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘งโ€๐Ÿ‘ฆ-family:-man-girl-boy '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘งโ€๐Ÿ‘ง-family:-man-girl-girl '๐Ÿ‘จ) - (hm/set! emoji-map :๐Ÿ‘ฆ-family:-woman-boy '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿ‘ฆโ€๐Ÿ‘ฆ-family:-woman-boy-boy '๐Ÿ‘ฉ) - (hm/set! emoji-map :๐Ÿ‘ง-family:-woman-girl '๐Ÿ‘ฉ) - (hm/set! emoji-map :family:-woman-girl-boy '๐Ÿ‘ฉ๐Ÿ‘งโ€๐Ÿ‘ฆ) - (hm/set! emoji-map :family:-woman-girl-girl '๐Ÿ‘ฉ๐Ÿ‘งโ€๐Ÿ‘ง) - (hm/set! emoji-map :speaking-head '๐Ÿ—ฃ๏ธ) - (hm/set! emoji-map :speaking-head '๐Ÿ—ฃ) - (hm/set! emoji-map :bust-in-silhouette '๐Ÿ‘ค) - (hm/set! emoji-map :busts-in-silhouette '๐Ÿ‘ฅ) - (hm/set! emoji-map :footprints '๐Ÿ‘ฃ) - (hm/set! emoji-map :medium-light-skin-tone '๐Ÿผ) - (hm/set! emoji-map :medium-skin-tone '๐Ÿฝ) - (hm/set! emoji-map :medium-dark-skin-tone '๐Ÿพ) - (hm/set! emoji-map :dark-skin-tone '๐Ÿฟ) - (hm/set! emoji-map :red-hair '๐Ÿฆฐ) - (hm/set! emoji-map :curly-hair '๐Ÿฆฑ) - (hm/set! emoji-map :white-hair '๐Ÿฆณ) - (hm/set! emoji-map :bald '๐Ÿฆฒ) - (hm/set! emoji-map :monkey '๐Ÿ’) - (hm/set! emoji-map :gorilla '๐Ÿฆ) - (hm/set! emoji-map :orangutan '๐Ÿฆง) - (hm/set! emoji-map :dog-face '๐Ÿถ) - (hm/set! emoji-map :dog '๐Ÿ•) - (hm/set! emoji-map :guide-dog '๐Ÿฆฎ) - (hm/set! emoji-map :๐Ÿฆบ-service-dog '๐Ÿ•) - (hm/set! emoji-map :poodle '๐Ÿฉ) - (hm/set! emoji-map :wolf '๐Ÿบ) - (hm/set! emoji-map :fox '๐ŸฆŠ) - (hm/set! emoji-map :raccoon '๐Ÿฆ) - (hm/set! emoji-map :cat-face '๐Ÿฑ) - (hm/set! emoji-map :cat '๐Ÿˆ) - (hm/set! emoji-map :lion '๐Ÿฆ) - (hm/set! emoji-map :tiger-face '๐Ÿฏ) - (hm/set! emoji-map :tiger '๐Ÿ…) - (hm/set! emoji-map :leopard '๐Ÿ†) - (hm/set! emoji-map :horse-face '๐Ÿด) - (hm/set! emoji-map :horse '๐ŸŽ) - (hm/set! emoji-map :unicorn '๐Ÿฆ„) - (hm/set! emoji-map :zebra '๐Ÿฆ“) - (hm/set! emoji-map :deer '๐ŸฆŒ) - (hm/set! emoji-map :cow-face '๐Ÿฎ) - (hm/set! emoji-map :ox '๐Ÿ‚) - (hm/set! emoji-map :water-buffalo '๐Ÿƒ) - (hm/set! emoji-map :cow '๐Ÿ„) - (hm/set! emoji-map :pig-face '๐Ÿท) - (hm/set! emoji-map :pig '๐Ÿ–) - (hm/set! emoji-map :boar '๐Ÿ—) - (hm/set! emoji-map :pig-nose '๐Ÿฝ) - (hm/set! emoji-map :ram '๐Ÿ) - (hm/set! emoji-map :ewe '๐Ÿ‘) - (hm/set! emoji-map :goat '๐Ÿ) - (hm/set! emoji-map :camel '๐Ÿช) - (hm/set! emoji-map :two-hump-camel '๐Ÿซ) - (hm/set! emoji-map :llama '๐Ÿฆ™) - (hm/set! emoji-map :giraffe '๐Ÿฆ’) - (hm/set! emoji-map :elephant '๐Ÿ˜) - (hm/set! emoji-map :rhinoceros '๐Ÿฆ) - (hm/set! emoji-map :hippopotamus '๐Ÿฆ›) - (hm/set! emoji-map :mouse-face '๐Ÿญ) - (hm/set! emoji-map :mouse '๐Ÿ) - (hm/set! emoji-map :rat '๐Ÿ€) - (hm/set! emoji-map :hamster '๐Ÿน) - (hm/set! emoji-map :rabbit-face '๐Ÿฐ) - (hm/set! emoji-map :rabbit '๐Ÿ‡) - (hm/set! emoji-map :chipmunk '๐Ÿฟ๏ธ) - (hm/set! emoji-map :chipmunk '๐Ÿฟ) - (hm/set! emoji-map :hedgehog '๐Ÿฆ”) - (hm/set! emoji-map :bat '๐Ÿฆ‡) - (hm/set! emoji-map :bear '๐Ÿป) - (hm/set! emoji-map :koala '๐Ÿจ) - (hm/set! emoji-map :panda '๐Ÿผ) - (hm/set! emoji-map :sloth '๐Ÿฆฅ) - (hm/set! emoji-map :otter '๐Ÿฆฆ) - (hm/set! emoji-map :skunk '๐Ÿฆจ) - (hm/set! emoji-map :kangaroo '๐Ÿฆ˜) - (hm/set! emoji-map :badger '๐Ÿฆก) - (hm/set! emoji-map :paw-prints '๐Ÿพ) - (hm/set! emoji-map :turkey '๐Ÿฆƒ) - (hm/set! emoji-map :chicken '๐Ÿ”) - (hm/set! emoji-map :rooster '๐Ÿ“) - (hm/set! emoji-map :hatching-chick '๐Ÿฃ) - (hm/set! emoji-map :baby-chick '๐Ÿค) - (hm/set! emoji-map :front-facing-baby-chick '๐Ÿฅ) - (hm/set! emoji-map :bird '๐Ÿฆ) - (hm/set! emoji-map :penguin '๐Ÿง) - (hm/set! emoji-map :dove '๐Ÿ•Š๏ธ) - (hm/set! emoji-map :dove '๐Ÿ•Š) - (hm/set! emoji-map :eagle '๐Ÿฆ…) - (hm/set! emoji-map :duck '๐Ÿฆ†) - (hm/set! emoji-map :swan '๐Ÿฆข) - (hm/set! emoji-map :owl '๐Ÿฆ‰) - (hm/set! emoji-map :flamingo '๐Ÿฆฉ) - (hm/set! emoji-map :peacock '๐Ÿฆš) - (hm/set! emoji-map :parrot '๐Ÿฆœ) - (hm/set! emoji-map :frog '๐Ÿธ) - (hm/set! emoji-map :crocodile '๐ŸŠ) - (hm/set! emoji-map :turtle '๐Ÿข) - (hm/set! emoji-map :lizard '๐ŸฆŽ) - (hm/set! emoji-map :snake '๐Ÿ) - (hm/set! emoji-map :dragon-face '๐Ÿฒ) - (hm/set! emoji-map :dragon '๐Ÿ‰) - (hm/set! emoji-map :sauropod '๐Ÿฆ•) - (hm/set! emoji-map :T-Rex '๐Ÿฆ–) - (hm/set! emoji-map :spouting-whale '๐Ÿณ) - (hm/set! emoji-map :whale '๐Ÿ‹) - (hm/set! emoji-map :dolphin '๐Ÿฌ) - (hm/set! emoji-map :fish '๐ŸŸ) - (hm/set! emoji-map :tropical-fish '๐Ÿ ) - (hm/set! emoji-map :blowfish '๐Ÿก) - (hm/set! emoji-map :shark '๐Ÿฆˆ) - (hm/set! emoji-map :octopus '๐Ÿ™) - (hm/set! emoji-map :spiral-shell '๐Ÿš) - (hm/set! emoji-map :snail '๐ŸŒ) - (hm/set! emoji-map :butterfly '๐Ÿฆ‹) - (hm/set! emoji-map :bug '๐Ÿ›) - (hm/set! emoji-map :ant '๐Ÿœ) - (hm/set! emoji-map :honeybee '๐Ÿ) - (hm/set! emoji-map :lady-beetle '๐Ÿž) - (hm/set! emoji-map :cricket '๐Ÿฆ—) - (hm/set! emoji-map :spider '๐Ÿ•ท๏ธ) - (hm/set! emoji-map :spider '๐Ÿ•ท) - (hm/set! emoji-map :spider-web '๐Ÿ•ธ๏ธ) - (hm/set! emoji-map :spider-web '๐Ÿ•ธ) - (hm/set! emoji-map :scorpion '๐Ÿฆ‚) - (hm/set! emoji-map :mosquito '๐ŸฆŸ) - (hm/set! emoji-map :microbe '๐Ÿฆ ) - (hm/set! emoji-map :bouquet '๐Ÿ’) - (hm/set! emoji-map :cherry-blossom '๐ŸŒธ) - (hm/set! emoji-map :white-flower '๐Ÿ’ฎ) - (hm/set! emoji-map :rosette '๐Ÿต๏ธ) - (hm/set! emoji-map :rosette '๐Ÿต) - (hm/set! emoji-map :rose '๐ŸŒน) - (hm/set! emoji-map :wilted-flower '๐Ÿฅ€) - (hm/set! emoji-map :hibiscus '๐ŸŒบ) - (hm/set! emoji-map :sunflower '๐ŸŒป) - (hm/set! emoji-map :blossom '๐ŸŒผ) - (hm/set! emoji-map :tulip '๐ŸŒท) - (hm/set! emoji-map :seedling '๐ŸŒฑ) - (hm/set! emoji-map :evergreen-tree '๐ŸŒฒ) - (hm/set! emoji-map :deciduous-tree '๐ŸŒณ) - (hm/set! emoji-map :palm-tree '๐ŸŒด) - (hm/set! emoji-map :cactus '๐ŸŒต) - (hm/set! emoji-map :sheaf-of-rice '๐ŸŒพ) - (hm/set! emoji-map :herb '๐ŸŒฟ) - (hm/set! emoji-map :shamrock 'โ˜˜๏ธ) - (hm/set! emoji-map :shamrock 'โ˜˜) - (hm/set! emoji-map :four-leaf-clover '๐Ÿ€) - (hm/set! emoji-map :maple-leaf '๐Ÿ) - (hm/set! emoji-map :fallen-leaf '๐Ÿ‚) - (hm/set! emoji-map :leaf-fluttering-in-wind '๐Ÿƒ) - (hm/set! emoji-map :melon '๐Ÿˆ) - (hm/set! emoji-map :watermelon '๐Ÿ‰) - (hm/set! emoji-map :tangerine '๐ŸŠ) - (hm/set! emoji-map :lemon '๐Ÿ‹) - (hm/set! emoji-map :banana '๐ŸŒ) - (hm/set! emoji-map :pineapple '๐Ÿ) - (hm/set! emoji-map :mango '๐Ÿฅญ) - (hm/set! emoji-map :red-apple '๐ŸŽ) - (hm/set! emoji-map :green-apple '๐Ÿ) - (hm/set! emoji-map :pear '๐Ÿ) - (hm/set! emoji-map :peach '๐Ÿ‘) - (hm/set! emoji-map :cherries '๐Ÿ’) - (hm/set! emoji-map :strawberry '๐Ÿ“) - (hm/set! emoji-map :kiwi-fruit '๐Ÿฅ) - (hm/set! emoji-map :tomato '๐Ÿ…) - (hm/set! emoji-map :coconut '๐Ÿฅฅ) - (hm/set! emoji-map :avocado '๐Ÿฅ‘) - (hm/set! emoji-map :eggplant '๐Ÿ†) - (hm/set! emoji-map :potato '๐Ÿฅ”) - (hm/set! emoji-map :carrot '๐Ÿฅ•) - (hm/set! emoji-map :ear-of-corn '๐ŸŒฝ) - (hm/set! emoji-map :hot-pepper '๐ŸŒถ๏ธ) - (hm/set! emoji-map :hot-pepper '๐ŸŒถ) - (hm/set! emoji-map :cucumber '๐Ÿฅ’) - (hm/set! emoji-map :leafy-green '๐Ÿฅฌ) - (hm/set! emoji-map :broccoli '๐Ÿฅฆ) - (hm/set! emoji-map :garlic '๐Ÿง„) - (hm/set! emoji-map :onion '๐Ÿง…) - (hm/set! emoji-map :mushroom '๐Ÿ„) - (hm/set! emoji-map :peanuts '๐Ÿฅœ) - (hm/set! emoji-map :chestnut '๐ŸŒฐ) - (hm/set! emoji-map :bread '๐Ÿž) - (hm/set! emoji-map :croissant '๐Ÿฅ) - (hm/set! emoji-map :baguette-bread '๐Ÿฅ–) - (hm/set! emoji-map :pretzel '๐Ÿฅจ) - (hm/set! emoji-map :bagel '๐Ÿฅฏ) - (hm/set! emoji-map :pancakes '๐Ÿฅž) - (hm/set! emoji-map :waffle '๐Ÿง‡) - (hm/set! emoji-map :cheese-wedge '๐Ÿง€) - (hm/set! emoji-map :meat-on-bone '๐Ÿ–) - (hm/set! emoji-map :poultry-leg '๐Ÿ—) - (hm/set! emoji-map :cut-of-meat '๐Ÿฅฉ) - (hm/set! emoji-map :bacon '๐Ÿฅ“) - (hm/set! emoji-map :hamburger '๐Ÿ”) - (hm/set! emoji-map :french-fries '๐ŸŸ) - (hm/set! emoji-map :pizza '๐Ÿ•) - (hm/set! emoji-map :hot-dog '๐ŸŒญ) - (hm/set! emoji-map :sandwich '๐Ÿฅช) - (hm/set! emoji-map :taco '๐ŸŒฎ) - (hm/set! emoji-map :burrito '๐ŸŒฏ) - (hm/set! emoji-map :stuffed-flatbread '๐Ÿฅ™) - (hm/set! emoji-map :falafel '๐Ÿง†) - (hm/set! emoji-map :egg '๐Ÿฅš) - (hm/set! emoji-map :cooking '๐Ÿณ) - (hm/set! emoji-map :shallow-pan-of-food '๐Ÿฅ˜) - (hm/set! emoji-map :pot-of-food '๐Ÿฒ) - (hm/set! emoji-map :bowl-with-spoon '๐Ÿฅฃ) - (hm/set! emoji-map :green-salad '๐Ÿฅ—) - (hm/set! emoji-map :popcorn '๐Ÿฟ) - (hm/set! emoji-map :butter '๐Ÿงˆ) - (hm/set! emoji-map :salt '๐Ÿง‚) - (hm/set! emoji-map :canned-food '๐Ÿฅซ) - (hm/set! emoji-map :bento-box '๐Ÿฑ) - (hm/set! emoji-map :rice-cracker '๐Ÿ˜) - (hm/set! emoji-map :rice-ball '๐Ÿ™) - (hm/set! emoji-map :cooked-rice '๐Ÿš) - (hm/set! emoji-map :curry-rice '๐Ÿ›) - (hm/set! emoji-map :steaming-bowl '๐Ÿœ) - (hm/set! emoji-map :spaghetti '๐Ÿ) - (hm/set! emoji-map :roasted-sweet-potato '๐Ÿ ) - (hm/set! emoji-map :oden '๐Ÿข) - (hm/set! emoji-map :sushi '๐Ÿฃ) - (hm/set! emoji-map :fried-shrimp '๐Ÿค) - (hm/set! emoji-map :fish-cake-with-swirl '๐Ÿฅ) - (hm/set! emoji-map :moon-cake '๐Ÿฅฎ) - (hm/set! emoji-map :dango '๐Ÿก) - (hm/set! emoji-map :dumpling '๐ŸฅŸ) - (hm/set! emoji-map :fortune-cookie '๐Ÿฅ ) - (hm/set! emoji-map :takeout-box '๐Ÿฅก) - (hm/set! emoji-map :crab '๐Ÿฆ€) - (hm/set! emoji-map :lobster '๐Ÿฆž) - (hm/set! emoji-map :shrimp '๐Ÿฆ) - (hm/set! emoji-map :squid '๐Ÿฆ‘) - (hm/set! emoji-map :oyster '๐Ÿฆช) - (hm/set! emoji-map :soft-ice-cream '๐Ÿฆ) - (hm/set! emoji-map :shaved-ice '๐Ÿง) - (hm/set! emoji-map :ice-cream '๐Ÿจ) - (hm/set! emoji-map :doughnut '๐Ÿฉ) - (hm/set! emoji-map :cookie '๐Ÿช) - (hm/set! emoji-map :birthday-cake '๐ŸŽ‚) - (hm/set! emoji-map :shortcake '๐Ÿฐ) - (hm/set! emoji-map :cupcake '๐Ÿง) - (hm/set! emoji-map :pie '๐Ÿฅง) - (hm/set! emoji-map :chocolate-bar '๐Ÿซ) - (hm/set! emoji-map :candy '๐Ÿฌ) - (hm/set! emoji-map :lollipop '๐Ÿญ) - (hm/set! emoji-map :custard '๐Ÿฎ) - (hm/set! emoji-map :honey-pot '๐Ÿฏ) - (hm/set! emoji-map :baby-bottle '๐Ÿผ) - (hm/set! emoji-map :glass-of-milk '๐Ÿฅ›) - (hm/set! emoji-map :hot-beverage 'โ˜•) - (hm/set! emoji-map :teacup-without-handle '๐Ÿต) - (hm/set! emoji-map :sake '๐Ÿถ) - (hm/set! emoji-map :bottle-with-popping-cork '๐Ÿพ) - (hm/set! emoji-map :wine-glass '๐Ÿท) - (hm/set! emoji-map :cocktail-glass '๐Ÿธ) - (hm/set! emoji-map :tropical-drink '๐Ÿน) - (hm/set! emoji-map :beer-mug '๐Ÿบ) - (hm/set! emoji-map :clinking-beer-mugs '๐Ÿป) - (hm/set! emoji-map :clinking-glasses '๐Ÿฅ‚) - (hm/set! emoji-map :tumbler-glass '๐Ÿฅƒ) - (hm/set! emoji-map :cup-with-straw '๐Ÿฅค) - (hm/set! emoji-map :beverage-box '๐Ÿงƒ) - (hm/set! emoji-map :mate '๐Ÿง‰) - (hm/set! emoji-map :ice-cube '๐ŸงŠ) - (hm/set! emoji-map :chopsticks '๐Ÿฅข) - (hm/set! emoji-map :fork-and-knife-with-plate '๐Ÿฝ๏ธ) - (hm/set! emoji-map :fork-and-knife-with-plate '๐Ÿฝ) - (hm/set! emoji-map :fork-and-knife '๐Ÿด) - (hm/set! emoji-map :spoon '๐Ÿฅ„) - (hm/set! emoji-map :kitchen-knife '๐Ÿ”ช) - (hm/set! emoji-map :amphora '๐Ÿบ) - (hm/set! emoji-map :globe-showing-Americas '๐ŸŒŽ) - (hm/set! emoji-map :globe-showing-Asia-Australia '๐ŸŒ) - (hm/set! emoji-map :globe-with-meridians '๐ŸŒ) - (hm/set! emoji-map :world-map '๐Ÿ—บ๏ธ) - (hm/set! emoji-map :world-map '๐Ÿ—บ) - (hm/set! emoji-map :map-of-Japan '๐Ÿ—พ) - (hm/set! emoji-map :compass '๐Ÿงญ) - (hm/set! emoji-map :snow-capped-mountain '๐Ÿ”๏ธ) - (hm/set! emoji-map :snow-capped-mountain '๐Ÿ”) - (hm/set! emoji-map :mountain 'โ›ฐ๏ธ) - (hm/set! emoji-map :mountain 'โ›ฐ) - (hm/set! emoji-map :volcano '๐ŸŒ‹) - (hm/set! emoji-map :mount-fuji '๐Ÿ—ป) - (hm/set! emoji-map :camping '๐Ÿ•๏ธ) - (hm/set! emoji-map :camping '๐Ÿ•) - (hm/set! emoji-map :beach-with-umbrella '๐Ÿ–๏ธ) - (hm/set! emoji-map :beach-with-umbrella '๐Ÿ–) - (hm/set! emoji-map :desert '๐Ÿœ๏ธ) - (hm/set! emoji-map :desert '๐Ÿœ) - (hm/set! emoji-map :desert-island '๐Ÿ๏ธ) - (hm/set! emoji-map :desert-island '๐Ÿ) - (hm/set! emoji-map :national-park '๐Ÿž๏ธ) - (hm/set! emoji-map :national-park '๐Ÿž) - (hm/set! emoji-map :stadium '๐ŸŸ๏ธ) - (hm/set! emoji-map :stadium '๐ŸŸ) - (hm/set! emoji-map :classical-building '๐Ÿ›๏ธ) - (hm/set! emoji-map :classical-building '๐Ÿ›) - (hm/set! emoji-map :building-construction '๐Ÿ—๏ธ) - (hm/set! emoji-map :building-construction '๐Ÿ—) - (hm/set! emoji-map :brick '๐Ÿงฑ) - (hm/set! emoji-map :houses '๐Ÿ˜๏ธ) - (hm/set! emoji-map :houses '๐Ÿ˜) - (hm/set! emoji-map :derelict-house '๐Ÿš๏ธ) - (hm/set! emoji-map :derelict-house '๐Ÿš) - (hm/set! emoji-map :house '๐Ÿ ) - (hm/set! emoji-map :house-with-garden '๐Ÿก) - (hm/set! emoji-map :office-building '๐Ÿข) - (hm/set! emoji-map :Japanese-post-office '๐Ÿฃ) - (hm/set! emoji-map :post-office '๐Ÿค) - (hm/set! emoji-map :hospital '๐Ÿฅ) - (hm/set! emoji-map :bank '๐Ÿฆ) - (hm/set! emoji-map :hotel '๐Ÿจ) - (hm/set! emoji-map :love-hotel '๐Ÿฉ) - (hm/set! emoji-map :convenience-store '๐Ÿช) - (hm/set! emoji-map :school '๐Ÿซ) - (hm/set! emoji-map :department-store '๐Ÿฌ) - (hm/set! emoji-map :factory '๐Ÿญ) - (hm/set! emoji-map :Japanese-castle '๐Ÿฏ) - (hm/set! emoji-map :castle '๐Ÿฐ) - (hm/set! emoji-map :wedding '๐Ÿ’’) - (hm/set! emoji-map :Tokyo-tower '๐Ÿ—ผ) - (hm/set! emoji-map :Statue-of-Liberty '๐Ÿ—ฝ) - (hm/set! emoji-map :church 'โ›ช) - (hm/set! emoji-map :mosque '๐Ÿ•Œ) - (hm/set! emoji-map :hindu-temple '๐Ÿ›•) - (hm/set! emoji-map :synagogue '๐Ÿ•) - (hm/set! emoji-map :shinto-shrine 'โ›ฉ๏ธ) - (hm/set! emoji-map :shinto-shrine 'โ›ฉ) - (hm/set! emoji-map :kaaba '๐Ÿ•‹) - (hm/set! emoji-map :fountain 'โ›ฒ) - (hm/set! emoji-map :tent 'โ›บ) - (hm/set! emoji-map :foggy '๐ŸŒ) - (hm/set! emoji-map :night-with-stars '๐ŸŒƒ) - (hm/set! emoji-map :cityscape '๐Ÿ™๏ธ) - (hm/set! emoji-map :cityscape '๐Ÿ™) - (hm/set! emoji-map :sunrise-over-mountains '๐ŸŒ„) - (hm/set! emoji-map :sunrise '๐ŸŒ…) - (hm/set! emoji-map :cityscape-at-dusk '๐ŸŒ†) - (hm/set! emoji-map :sunset '๐ŸŒ‡) - (hm/set! emoji-map :bridge-at-night '๐ŸŒ‰) - (hm/set! emoji-map :hot-springs 'โ™จ๏ธ) - (hm/set! emoji-map :springs 'โ™จ-hot) - (hm/set! emoji-map :carousel-horse '๐ŸŽ ) - (hm/set! emoji-map :ferris-wheel '๐ŸŽก) - (hm/set! emoji-map :roller-coaster '๐ŸŽข) - (hm/set! emoji-map :barber-pole '๐Ÿ’ˆ) - (hm/set! emoji-map :circus-tent '๐ŸŽช) - (hm/set! emoji-map :locomotive '๐Ÿš‚) - (hm/set! emoji-map :railway-car '๐Ÿšƒ) - (hm/set! emoji-map :high-speed-train '๐Ÿš„) - (hm/set! emoji-map :bullet-train '๐Ÿš…) - (hm/set! emoji-map :train '๐Ÿš†) - (hm/set! emoji-map :metro '๐Ÿš‡) - (hm/set! emoji-map :light-rail '๐Ÿšˆ) - (hm/set! emoji-map :station '๐Ÿš‰) - (hm/set! emoji-map :tram '๐ŸšŠ) - (hm/set! emoji-map :monorail '๐Ÿš) - (hm/set! emoji-map :mountain-railway '๐Ÿšž) - (hm/set! emoji-map :tram-car '๐Ÿš‹) - (hm/set! emoji-map :bus '๐ŸšŒ) - (hm/set! emoji-map :oncoming-bus '๐Ÿš) - (hm/set! emoji-map :trolleybus '๐ŸšŽ) - (hm/set! emoji-map :minibus '๐Ÿš) - (hm/set! emoji-map :ambulance '๐Ÿš‘) - (hm/set! emoji-map :fire-engine '๐Ÿš’) - (hm/set! emoji-map :police-car '๐Ÿš“) - (hm/set! emoji-map :oncoming-police-car '๐Ÿš”) - (hm/set! emoji-map :taxi '๐Ÿš•) - (hm/set! emoji-map :oncoming-taxi '๐Ÿš–) - (hm/set! emoji-map :automobile '๐Ÿš—) - (hm/set! emoji-map :oncoming-automobile '๐Ÿš˜) - (hm/set! emoji-map :sport-utility-vehicle '๐Ÿš™) - (hm/set! emoji-map :delivery-truck '๐Ÿšš) - (hm/set! emoji-map :articulated-lorry '๐Ÿš›) - (hm/set! emoji-map :tractor '๐Ÿšœ) - (hm/set! emoji-map :racing-car '๐ŸŽ๏ธ) - (hm/set! emoji-map :racing-car '๐ŸŽ) - (hm/set! emoji-map :motorcycle '๐Ÿ๏ธ) - (hm/set! emoji-map :motorcycle '๐Ÿ) - (hm/set! emoji-map :motor-scooter '๐Ÿ›ต) - (hm/set! emoji-map :manual-wheelchair '๐Ÿฆฝ) - (hm/set! emoji-map :motorized-wheelchair '๐Ÿฆผ) - (hm/set! emoji-map :auto-rickshaw '๐Ÿ›บ) - (hm/set! emoji-map :bicycle '๐Ÿšฒ) - (hm/set! emoji-map :kick-scooter '๐Ÿ›ด) - (hm/set! emoji-map :skateboard '๐Ÿ›น) - (hm/set! emoji-map :bus-stop '๐Ÿš) - (hm/set! emoji-map :motorway '๐Ÿ›ฃ๏ธ) - (hm/set! emoji-map :motorway '๐Ÿ›ฃ) - (hm/set! emoji-map :railway-track '๐Ÿ›ค๏ธ) - (hm/set! emoji-map :railway-track '๐Ÿ›ค) - (hm/set! emoji-map :oil-drum '๐Ÿ›ข๏ธ) - (hm/set! emoji-map :oil-drum '๐Ÿ›ข) - (hm/set! emoji-map :fuel-pump 'โ›ฝ) - (hm/set! emoji-map :police-car-light '๐Ÿšจ) - (hm/set! emoji-map :horizontal-traffic-light '๐Ÿšฅ) - (hm/set! emoji-map :vertical-traffic-light '๐Ÿšฆ) - (hm/set! emoji-map :stop-sign '๐Ÿ›‘) - (hm/set! emoji-map :construction '๐Ÿšง) - (hm/set! emoji-map :anchor 'โš“) - (hm/set! emoji-map :sailboat 'โ›ต) - (hm/set! emoji-map :canoe '๐Ÿ›ถ) - (hm/set! emoji-map :speedboat '๐Ÿšค) - (hm/set! emoji-map :passenger-ship '๐Ÿ›ณ๏ธ) - (hm/set! emoji-map :passenger-ship '๐Ÿ›ณ) - (hm/set! emoji-map :ferry 'โ›ด๏ธ) - (hm/set! emoji-map :ferry 'โ›ด) - (hm/set! emoji-map :motor-boat '๐Ÿ›ฅ๏ธ) - (hm/set! emoji-map :motor-boat '๐Ÿ›ฅ) - (hm/set! emoji-map :ship '๐Ÿšข) - (hm/set! emoji-map :airplane 'โœˆ๏ธ) - (hm/set! emoji-map :airplane 'โœˆ) - (hm/set! emoji-map :small-airplane '๐Ÿ›ฉ๏ธ) - (hm/set! emoji-map :small-airplane '๐Ÿ›ฉ) - (hm/set! emoji-map :airplane-departure '๐Ÿ›ซ) - (hm/set! emoji-map :airplane-arrival '๐Ÿ›ฌ) - (hm/set! emoji-map :parachute '๐Ÿช‚) - (hm/set! emoji-map :seat '๐Ÿ’บ) - (hm/set! emoji-map :helicopter '๐Ÿš) - (hm/set! emoji-map :suspension-railway '๐ŸšŸ) - (hm/set! emoji-map :mountain-cableway '๐Ÿš ) - (hm/set! emoji-map :aerial-tramway '๐Ÿšก) - (hm/set! emoji-map :satellite '๐Ÿ›ฐ๏ธ) - (hm/set! emoji-map :satellite '๐Ÿ›ฐ) - (hm/set! emoji-map :rocket '๐Ÿš€) - (hm/set! emoji-map :flying-saucer '๐Ÿ›ธ) - (hm/set! emoji-map :bellhop-bell '๐Ÿ›Ž๏ธ) - (hm/set! emoji-map :bellhop-bell '๐Ÿ›Ž) - (hm/set! emoji-map :luggage '๐Ÿงณ) - (hm/set! emoji-map :done 'โŒ›-hourglass) - (hm/set! emoji-map :not-done 'โณ-hourglass) - (hm/set! emoji-map :clock 'โŒš-watch) - (hm/set! emoji-map :stopwatch 'โฑ๏ธ) - (hm/set! emoji-map :timer-clock 'โฑ-stopwatch) - (hm/set! emoji-map :clock 'โฒ-timer) - (hm/set! emoji-map :mantelpiece-clock '๐Ÿ•ฐ๏ธ) - (hm/set! emoji-map :mantelpiece-clock '๐Ÿ•ฐ) - (hm/set! emoji-map :twelve-o-clock '๐Ÿ•›) - (hm/set! emoji-map :twelve-thirty '๐Ÿ•ง) - (hm/set! emoji-map :one-o-clock '๐Ÿ•) - (hm/set! emoji-map :one-thirty '๐Ÿ•œ) - (hm/set! emoji-map :two-o-clock '๐Ÿ•‘) - (hm/set! emoji-map :two-thirty '๐Ÿ•) - (hm/set! emoji-map :three-o-clock '๐Ÿ•’) - (hm/set! emoji-map :three-thirty '๐Ÿ•ž) - (hm/set! emoji-map :four-o-clock '๐Ÿ•“) - (hm/set! emoji-map :four-thirty '๐Ÿ•Ÿ) - (hm/set! emoji-map :five-o-clock '๐Ÿ•”) - (hm/set! emoji-map :five-thirty '๐Ÿ• ) - (hm/set! emoji-map :six-o-clock '๐Ÿ••) - (hm/set! emoji-map :six-thirty '๐Ÿ•ก) - (hm/set! emoji-map :seven-o-clock '๐Ÿ•–) - (hm/set! emoji-map :seven-thirty '๐Ÿ•ข) - (hm/set! emoji-map :eight-o-clock '๐Ÿ•—) - (hm/set! emoji-map :eight-thirty '๐Ÿ•ฃ) - (hm/set! emoji-map :nine-o-clock '๐Ÿ•˜) - (hm/set! emoji-map :nine-thirty '๐Ÿ•ค) - (hm/set! emoji-map :ten-o-clock '๐Ÿ•™) - (hm/set! emoji-map :ten-thirty '๐Ÿ•ฅ) - (hm/set! emoji-map :eleven-o-clock '๐Ÿ•š) - (hm/set! emoji-map :eleven-thirty '๐Ÿ•ฆ) - (hm/set! emoji-map :new-moon '๐ŸŒ‘) - (hm/set! emoji-map :waxing-crescent-moon '๐ŸŒ’) - (hm/set! emoji-map :first-quarter-moon '๐ŸŒ“) - (hm/set! emoji-map :waxing-gibbous-moon '๐ŸŒ”) - (hm/set! emoji-map :full-moon '๐ŸŒ•) - (hm/set! emoji-map :waning-gibbous-moon '๐ŸŒ–) - (hm/set! emoji-map :last-quarter-moon '๐ŸŒ—) - (hm/set! emoji-map :waning-crescent-moon '๐ŸŒ˜) - (hm/set! emoji-map :crescent-moon '๐ŸŒ™) - (hm/set! emoji-map :new-moon-face '๐ŸŒš) - (hm/set! emoji-map :first-quarter-moon-face '๐ŸŒ›) - (hm/set! emoji-map :last-quarter-moon-face '๐ŸŒœ) - (hm/set! emoji-map :thermometer '๐ŸŒก๏ธ) - (hm/set! emoji-map :thermometer '๐ŸŒก) - (hm/set! emoji-map :sun 'โ˜€๏ธ) - (hm/set! emoji-map :sun 'โ˜€) - (hm/set! emoji-map :full-moon-face '๐ŸŒ) - (hm/set! emoji-map :sun-with-face '๐ŸŒž) - (hm/set! emoji-map :ringed-planet '๐Ÿช) - (hm/set! emoji-map :glowing-star '๐ŸŒŸ) - (hm/set! emoji-map :shooting-star '๐ŸŒ ) - (hm/set! emoji-map :milky-way '๐ŸŒŒ) - (hm/set! emoji-map :cloud 'โ˜๏ธ) - (hm/set! emoji-map :cloud 'โ˜) - (hm/set! emoji-map :sun-behind-cloud 'โ›…) - (hm/set! emoji-map :cloud-with-lightning-and-rain 'โ›ˆ๏ธ) - (hm/set! emoji-map :cloud-with-lightning-and-rain 'โ›ˆ) - (hm/set! emoji-map :sun-behind-small-cloud '๐ŸŒค๏ธ) - (hm/set! emoji-map :sun-behind-small-cloud '๐ŸŒค) - (hm/set! emoji-map :sun-behind-large-cloud '๐ŸŒฅ๏ธ) - (hm/set! emoji-map :sun-behind-large-cloud '๐ŸŒฅ) - (hm/set! emoji-map :sun-behind-rain-cloud '๐ŸŒฆ๏ธ) - (hm/set! emoji-map :sun-behind-rain-cloud '๐ŸŒฆ) - (hm/set! emoji-map :cloud-with-rain '๐ŸŒง๏ธ) - (hm/set! emoji-map :cloud-with-rain '๐ŸŒง) - (hm/set! emoji-map :cloud-with-snow '๐ŸŒจ๏ธ) - (hm/set! emoji-map :cloud-with-snow '๐ŸŒจ) - (hm/set! emoji-map :cloud-with-lightning '๐ŸŒฉ๏ธ) - (hm/set! emoji-map :cloud-with-lightning '๐ŸŒฉ) - (hm/set! emoji-map :tornado '๐ŸŒช๏ธ) - (hm/set! emoji-map :tornado '๐ŸŒช) - (hm/set! emoji-map :fog '๐ŸŒซ๏ธ) - (hm/set! emoji-map :fog '๐ŸŒซ) - (hm/set! emoji-map :wind-face '๐ŸŒฌ๏ธ) - (hm/set! emoji-map :wind-face '๐ŸŒฌ) - (hm/set! emoji-map :cyclone '๐ŸŒ€) - (hm/set! emoji-map :rainbow '๐ŸŒˆ) - (hm/set! emoji-map :closed-umbrella '๐ŸŒ‚) - (hm/set! emoji-map :umbrella 'โ˜‚๏ธ) - (hm/set! emoji-map :umbrella 'โ˜‚) - (hm/set! emoji-map :umbrella-with-rain-drops 'โ˜”) - (hm/set! emoji-map :umbrella-on-ground 'โ›ฑ๏ธ) - (hm/set! emoji-map :umbrella-on-ground 'โ›ฑ) - (hm/set! emoji-map :high-voltage 'โšก) - (hm/set! emoji-map :snowflake 'โ„๏ธ) - (hm/set! emoji-map :snowflake 'โ„) - (hm/set! emoji-map :snowman 'โ˜ƒ๏ธ) - (hm/set! emoji-map :snowman 'โ˜ƒ) - (hm/set! emoji-map :snowman-without-snow 'โ›„) - (hm/set! emoji-map :comet 'โ˜„๏ธ) - (hm/set! emoji-map :comet 'โ˜„) - (hm/set! emoji-map :fire '๐Ÿ”ฅ) - (hm/set! emoji-map :droplet '๐Ÿ’ง) - (hm/set! emoji-map :water-wave '๐ŸŒŠ) - (hm/set! emoji-map :Christmas-tree '๐ŸŽ„) - (hm/set! emoji-map :fireworks '๐ŸŽ†) - (hm/set! emoji-map :sparkler '๐ŸŽ‡) - (hm/set! emoji-map :firecracker '๐Ÿงจ) - (hm/set! emoji-map :sparkles 'โœจ) - (hm/set! emoji-map :balloon '๐ŸŽˆ) - (hm/set! emoji-map :party-popper '๐ŸŽ‰) - (hm/set! emoji-map :confetti-ball '๐ŸŽŠ) - (hm/set! emoji-map :tanabata-tree '๐ŸŽ‹) - (hm/set! emoji-map :pine-decoration '๐ŸŽ) - (hm/set! emoji-map :Japanese-dolls '๐ŸŽŽ) - (hm/set! emoji-map :carp-streamer '๐ŸŽ) - (hm/set! emoji-map :wind-chime '๐ŸŽ) - (hm/set! emoji-map :moon-viewing-ceremony '๐ŸŽ‘) - (hm/set! emoji-map :red-envelope '๐Ÿงง) - (hm/set! emoji-map :ribbon '๐ŸŽ€) - (hm/set! emoji-map :wrapped-gift '๐ŸŽ) - (hm/set! emoji-map :reminder-ribbon '๐ŸŽ—๏ธ) - (hm/set! emoji-map :reminder-ribbon '๐ŸŽ—) - (hm/set! emoji-map :admission-tickets '๐ŸŽŸ๏ธ) - (hm/set! emoji-map :admission-tickets '๐ŸŽŸ) - (hm/set! emoji-map :ticket '๐ŸŽซ) - (hm/set! emoji-map :military-medal '๐ŸŽ–๏ธ) - (hm/set! emoji-map :military-medal '๐ŸŽ–) - (hm/set! emoji-map :trophy '๐Ÿ†) - (hm/set! emoji-map :sports-medal '๐Ÿ…) - (hm/set! emoji-map :1st-place-medal '๐Ÿฅ‡) - (hm/set! emoji-map :2nd-place-medal '๐Ÿฅˆ) - (hm/set! emoji-map :3rd-place-medal '๐Ÿฅ‰) - (hm/set! emoji-map :soccer-ball 'โšฝ) - (hm/set! emoji-map :baseball 'โšพ) - (hm/set! emoji-map :softball '๐ŸฅŽ) - (hm/set! emoji-map :basketball '๐Ÿ€) - (hm/set! emoji-map :volleyball '๐Ÿ) - (hm/set! emoji-map :american-football '๐Ÿˆ) - (hm/set! emoji-map :rugby-football '๐Ÿ‰) - (hm/set! emoji-map :tennis '๐ŸŽพ) - (hm/set! emoji-map :flying-disc '๐Ÿฅ) - (hm/set! emoji-map :bowling '๐ŸŽณ) - (hm/set! emoji-map :cricket-game '๐Ÿ) - (hm/set! emoji-map :field-hockey '๐Ÿ‘) - (hm/set! emoji-map :ice-hockey '๐Ÿ’) - (hm/set! emoji-map :lacrosse '๐Ÿฅ) - (hm/set! emoji-map :ping-pong '๐Ÿ“) - (hm/set! emoji-map :badminton '๐Ÿธ) - (hm/set! emoji-map :boxing-glove '๐ŸฅŠ) - (hm/set! emoji-map :martial-arts-uniform '๐Ÿฅ‹) - (hm/set! emoji-map :goal-net '๐Ÿฅ…) - (hm/set! emoji-map :flag-in-hole 'โ›ณ) - (hm/set! emoji-map :ice-skate 'โ›ธ๏ธ) - (hm/set! emoji-map :ice-skate 'โ›ธ) - (hm/set! emoji-map :fishing-pole '๐ŸŽฃ) - (hm/set! emoji-map :diving-mask '๐Ÿคฟ) - (hm/set! emoji-map :running-shirt '๐ŸŽฝ) - (hm/set! emoji-map :skis '๐ŸŽฟ) - (hm/set! emoji-map :sled '๐Ÿ›ท) - (hm/set! emoji-map :curling-stone '๐ŸฅŒ) - (hm/set! emoji-map :direct-hit '๐ŸŽฏ) - (hm/set! emoji-map :yo-yo '๐Ÿช€) - (hm/set! emoji-map :kite '๐Ÿช) - (hm/set! emoji-map :pool-8-ball '๐ŸŽฑ) - (hm/set! emoji-map :crystal-ball '๐Ÿ”ฎ) - (hm/set! emoji-map :nazar-amulet '๐Ÿงฟ) - (hm/set! emoji-map :video-game '๐ŸŽฎ) - (hm/set! emoji-map :joystick '๐Ÿ•น๏ธ) - (hm/set! emoji-map :joystick '๐Ÿ•น) - (hm/set! emoji-map :slot-machine '๐ŸŽฐ) - (hm/set! emoji-map :game-die '๐ŸŽฒ) - (hm/set! emoji-map :puzzle-piece '๐Ÿงฉ) - (hm/set! emoji-map :teddy-bear '๐Ÿงธ) - (hm/set! emoji-map :spade-suit 'โ™ ๏ธ) - (hm/set! emoji-map :suit 'โ™ -spade) - (hm/set! emoji-map :heart-suit 'โ™ฅ๏ธ) - (hm/set! emoji-map :suit 'โ™ฅ-heart) - (hm/set! emoji-map :diamond-suit 'โ™ฆ๏ธ) - (hm/set! emoji-map :diamond-suit 'โ™ฆ) - (hm/set! emoji-map :club-suit 'โ™ฃ๏ธ) - (hm/set! emoji-map :suit 'โ™ฃ-club) - (hm/set! emoji-map :chess-pawn 'โ™Ÿ๏ธ) - (hm/set! emoji-map :chess-pawn 'โ™Ÿ) - (hm/set! emoji-map :joker '๐Ÿƒ) - (hm/set! emoji-map :mahjong-red-dragon '๐Ÿ€„) - (hm/set! emoji-map :flower-playing-cards '๐ŸŽด) - (hm/set! emoji-map :performing-arts '๐ŸŽญ) - (hm/set! emoji-map :framed-picture '๐Ÿ–ผ๏ธ) - (hm/set! emoji-map :framed-picture '๐Ÿ–ผ) - (hm/set! emoji-map :artist-palette '๐ŸŽจ) - (hm/set! emoji-map :thread '๐Ÿงต) - (hm/set! emoji-map :yarn '๐Ÿงถ) - (hm/set! emoji-map :sunglasses '๐Ÿ•ถ๏ธ) - (hm/set! emoji-map :sunglasses '๐Ÿ•ถ) - (hm/set! emoji-map :goggles '๐Ÿฅฝ) - (hm/set! emoji-map :lab-coat '๐Ÿฅผ) - (hm/set! emoji-map :safety-vest '๐Ÿฆบ) - (hm/set! emoji-map :necktie '๐Ÿ‘”) - (hm/set! emoji-map :t-shirt '๐Ÿ‘•) - (hm/set! emoji-map :jeans '๐Ÿ‘–) - (hm/set! emoji-map :scarf '๐Ÿงฃ) - (hm/set! emoji-map :gloves '๐Ÿงค) - (hm/set! emoji-map :coat '๐Ÿงฅ) - (hm/set! emoji-map :socks '๐Ÿงฆ) - (hm/set! emoji-map :dress '๐Ÿ‘—) - (hm/set! emoji-map :kimono '๐Ÿ‘˜) - (hm/set! emoji-map :sari '๐Ÿฅป) - (hm/set! emoji-map :one-piece-swimsuit '๐Ÿฉฑ) - (hm/set! emoji-map :swim-brief '๐Ÿฉฒ) - (hm/set! emoji-map :shorts '๐Ÿฉณ) - (hm/set! emoji-map :bikini '๐Ÿ‘™) - (hm/set! emoji-map :woman-s-clothes '๐Ÿ‘š) - (hm/set! emoji-map :purse '๐Ÿ‘›) - (hm/set! emoji-map :handbag '๐Ÿ‘œ) - (hm/set! emoji-map :clutch-bag '๐Ÿ‘) - (hm/set! emoji-map :shopping-bags '๐Ÿ›๏ธ) - (hm/set! emoji-map :shopping-bags '๐Ÿ›) - (hm/set! emoji-map :backpack '๐ŸŽ’) - (hm/set! emoji-map :man-s-shoe '๐Ÿ‘ž) - (hm/set! emoji-map :running-shoe '๐Ÿ‘Ÿ) - (hm/set! emoji-map :hiking-boot '๐Ÿฅพ) - (hm/set! emoji-map :flat-shoe '๐Ÿฅฟ) - (hm/set! emoji-map :high-heeled-shoe '๐Ÿ‘ ) - (hm/set! emoji-map :woman-s-sandal '๐Ÿ‘ก) - (hm/set! emoji-map :ballet-shoes '๐Ÿฉฐ) - (hm/set! emoji-map :woman-s-boot '๐Ÿ‘ข) - (hm/set! emoji-map :crown '๐Ÿ‘‘) - (hm/set! emoji-map :woman-s-hat '๐Ÿ‘’) - (hm/set! emoji-map :top-hat '๐ŸŽฉ) - (hm/set! emoji-map :graduation-cap '๐ŸŽ“) - (hm/set! emoji-map :billed-cap '๐Ÿงข) - (hm/set! emoji-map :rescue-worker-s-helmet 'โ›‘๏ธ) - (hm/set! emoji-map :rescue-worker-s-helmet 'โ›‘) - (hm/set! emoji-map :prayer-beads '๐Ÿ“ฟ) - (hm/set! emoji-map :lipstick '๐Ÿ’„) - (hm/set! emoji-map :ring '๐Ÿ’) - (hm/set! emoji-map :gem-stone '๐Ÿ’Ž) - (hm/set! emoji-map :muted-speaker '๐Ÿ”‡) - (hm/set! emoji-map :speaker-low-volume '๐Ÿ”ˆ) - (hm/set! emoji-map :speaker-medium-volume '๐Ÿ”‰) - (hm/set! emoji-map :speaker-high-volume '๐Ÿ”Š) - (hm/set! emoji-map :loudspeaker '๐Ÿ“ข) - (hm/set! emoji-map :megaphone '๐Ÿ“ฃ) - (hm/set! emoji-map :postal-horn '๐Ÿ“ฏ) - (hm/set! emoji-map :bell '๐Ÿ””) - (hm/set! emoji-map :bell-with-slash '๐Ÿ”•) - (hm/set! emoji-map :musical-score '๐ŸŽผ) - (hm/set! emoji-map :musical-note '๐ŸŽต) - (hm/set! emoji-map :musical-notes '๐ŸŽถ) - (hm/set! emoji-map :studio-microphone '๐ŸŽ™๏ธ) - (hm/set! emoji-map :studio-microphone '๐ŸŽ™) - (hm/set! emoji-map :level-slider '๐ŸŽš๏ธ) - (hm/set! emoji-map :level-slider '๐ŸŽš) - (hm/set! emoji-map :control-knobs '๐ŸŽ›๏ธ) - (hm/set! emoji-map :control-knobs '๐ŸŽ›) - (hm/set! emoji-map :microphone '๐ŸŽค) - (hm/set! emoji-map :headphone '๐ŸŽง) - (hm/set! emoji-map :radio '๐Ÿ“ป) - (hm/set! emoji-map :saxophone '๐ŸŽท) - (hm/set! emoji-map :guitar '๐ŸŽธ) - (hm/set! emoji-map :musical-keyboard '๐ŸŽน) - (hm/set! emoji-map :trumpet '๐ŸŽบ) - (hm/set! emoji-map :violin '๐ŸŽป) - (hm/set! emoji-map :banjo '๐Ÿช•) - (hm/set! emoji-map :drum '๐Ÿฅ) - (hm/set! emoji-map :mobile-phone '๐Ÿ“ฑ) - (hm/set! emoji-map :mobile-phone-with-arrow '๐Ÿ“ฒ) - (hm/set! emoji-map :telephone 'โ˜Ž๏ธ) - (hm/set! emoji-map :telephone-receiver '๐Ÿ“ž) - (hm/set! emoji-map :pager '๐Ÿ“Ÿ) - (hm/set! emoji-map :fax-machine '๐Ÿ“ ) - (hm/set! emoji-map :battery '๐Ÿ”‹) - (hm/set! emoji-map :electric-plug '๐Ÿ”Œ) - (hm/set! emoji-map :laptop-computer '๐Ÿ’ป) - (hm/set! emoji-map :desktop-computer '๐Ÿ–ฅ๏ธ) - (hm/set! emoji-map :desktop-computer '๐Ÿ–ฅ) - (hm/set! emoji-map :printer '๐Ÿ–จ๏ธ) - (hm/set! emoji-map :printer '๐Ÿ–จ) - (hm/set! emoji-map :keyboard 'โŒจ๏ธ) - (hm/set! emoji-map :computer-mouse '๐Ÿ–ฑ๏ธ) - (hm/set! emoji-map :computer-mouse '๐Ÿ–ฑ) - (hm/set! emoji-map :trackball '๐Ÿ–ฒ๏ธ) - (hm/set! emoji-map :trackball '๐Ÿ–ฒ) - (hm/set! emoji-map :computer-disk '๐Ÿ’ฝ) - (hm/set! emoji-map :floppy-disk '๐Ÿ’พ) - (hm/set! emoji-map :optical-disk '๐Ÿ’ฟ) - (hm/set! emoji-map :dvd '๐Ÿ“€) - (hm/set! emoji-map :abacus '๐Ÿงฎ) - (hm/set! emoji-map :movie-camera '๐ŸŽฅ) - (hm/set! emoji-map :film-frames '๐ŸŽž๏ธ) - (hm/set! emoji-map :film-frames '๐ŸŽž) - (hm/set! emoji-map :film-projector '๐Ÿ“ฝ๏ธ) - (hm/set! emoji-map :film-projector '๐Ÿ“ฝ) - (hm/set! emoji-map :clapper-board '๐ŸŽฌ) - (hm/set! emoji-map :television '๐Ÿ“บ) - (hm/set! emoji-map :camera '๐Ÿ“ท) - (hm/set! emoji-map :camera-with-flash '๐Ÿ“ธ) - (hm/set! emoji-map :video-camera '๐Ÿ“น) - (hm/set! emoji-map :videocassette '๐Ÿ“ผ) - (hm/set! emoji-map :magnifying-glass-tilted-left '๐Ÿ”) - (hm/set! emoji-map :magnifying-glass-tilted-right '๐Ÿ”Ž) - (hm/set! emoji-map :candle '๐Ÿ•ฏ๏ธ) - (hm/set! emoji-map :candle '๐Ÿ•ฏ) - (hm/set! emoji-map :light-bulb '๐Ÿ’ก) - (hm/set! emoji-map :flashlight '๐Ÿ”ฆ) - (hm/set! emoji-map :red-paper-lantern '๐Ÿฎ) - (hm/set! emoji-map :diya-lamp '๐Ÿช”) - (hm/set! emoji-map :notebook-with-decorative-cover '๐Ÿ“”) - (hm/set! emoji-map :closed-book '๐Ÿ“•) - (hm/set! emoji-map :open-book '๐Ÿ“–) - (hm/set! emoji-map :green-book '๐Ÿ“—) - (hm/set! emoji-map :blue-book '๐Ÿ“˜) - (hm/set! emoji-map :orange-book '๐Ÿ“™) - (hm/set! emoji-map :books '๐Ÿ“š) - (hm/set! emoji-map :notebook '๐Ÿ““) - (hm/set! emoji-map :ledger '๐Ÿ“’) - (hm/set! emoji-map :page-with-curl '๐Ÿ“ƒ) - (hm/set! emoji-map :scroll '๐Ÿ“œ) - (hm/set! emoji-map :page-facing-up '๐Ÿ“„) - (hm/set! emoji-map :newspaper '๐Ÿ“ฐ) - (hm/set! emoji-map :rolled-up-newspaper '๐Ÿ—ž๏ธ) - (hm/set! emoji-map :rolled-up-newspaper '๐Ÿ—ž) - (hm/set! emoji-map :bookmark-tabs '๐Ÿ“‘) - (hm/set! emoji-map :bookmark '๐Ÿ”–) - (hm/set! emoji-map :label '๐Ÿท๏ธ) - (hm/set! emoji-map :label '๐Ÿท) - (hm/set! emoji-map :money-bag '๐Ÿ’ฐ) - (hm/set! emoji-map :yen-banknote '๐Ÿ’ด) - (hm/set! emoji-map :dollar-banknote '๐Ÿ’ต) - (hm/set! emoji-map :euro-banknote '๐Ÿ’ถ) - (hm/set! emoji-map :pound-banknote '๐Ÿ’ท) - (hm/set! emoji-map :money-with-wings '๐Ÿ’ธ) - (hm/set! emoji-map :credit-card '๐Ÿ’ณ) - (hm/set! emoji-map :receipt '๐Ÿงพ) - (hm/set! emoji-map :chart-increasing-with-yen '๐Ÿ’น) - (hm/set! emoji-map :currency-exchange '๐Ÿ’ฑ) - (hm/set! emoji-map :heavy-dollar-sign '๐Ÿ’ฒ) - (hm/set! emoji-map :envelope 'โœ‰๏ธ) - (hm/set! emoji-map :envelope 'โœ‰) - (hm/set! emoji-map :e-mail '๐Ÿ“ง) - (hm/set! emoji-map :incoming-envelope '๐Ÿ“จ) - (hm/set! emoji-map :envelope-with-arrow '๐Ÿ“ฉ) - (hm/set! emoji-map :outbox-tray '๐Ÿ“ค) - (hm/set! emoji-map :inbox-tray '๐Ÿ“ฅ) - (hm/set! emoji-map :package '๐Ÿ“ฆ) - (hm/set! emoji-map :closed-mailbox-with-raised-flag '๐Ÿ“ซ) - (hm/set! emoji-map :closed-mailbox-with-lowered-flag '๐Ÿ“ช) - (hm/set! emoji-map :open-mailbox-with-raised-flag '๐Ÿ“ฌ) - (hm/set! emoji-map :open-mailbox-with-lowered-flag '๐Ÿ“ญ) - (hm/set! emoji-map :postbox '๐Ÿ“ฎ) - (hm/set! emoji-map :ballot-box-with-ballot '๐Ÿ—ณ๏ธ) - (hm/set! emoji-map :ballot-box-with-ballot '๐Ÿ—ณ) - (hm/set! emoji-map :pencil 'โœ๏ธ) - (hm/set! emoji-map :pencil 'โœ) - (hm/set! emoji-map :black-nib 'โœ’๏ธ) - (hm/set! emoji-map :black-nib 'โœ’) - (hm/set! emoji-map :fountain-pen '๐Ÿ–‹๏ธ) - (hm/set! emoji-map :fountain-pen '๐Ÿ–‹) - (hm/set! emoji-map :pen '๐Ÿ–Š๏ธ) - (hm/set! emoji-map :pen '๐Ÿ–Š) - (hm/set! emoji-map :paintbrush '๐Ÿ–Œ๏ธ) - (hm/set! emoji-map :paintbrush '๐Ÿ–Œ) - (hm/set! emoji-map :crayon '๐Ÿ–๏ธ) - (hm/set! emoji-map :crayon '๐Ÿ–) - (hm/set! emoji-map :memo '๐Ÿ“) - (hm/set! emoji-map :briefcase '๐Ÿ’ผ) - (hm/set! emoji-map :file-folder '๐Ÿ“) - (hm/set! emoji-map :open-file-folder '๐Ÿ“‚) - (hm/set! emoji-map :card-index-dividers '๐Ÿ—‚๏ธ) - (hm/set! emoji-map :card-index-dividers '๐Ÿ—‚) - (hm/set! emoji-map :calendar '๐Ÿ“…) - (hm/set! emoji-map :tear-off-calendar '๐Ÿ“†) - (hm/set! emoji-map :spiral-notepad '๐Ÿ—’๏ธ) - (hm/set! emoji-map :spiral-notepad '๐Ÿ—’) - (hm/set! emoji-map :spiral-calendar '๐Ÿ—“๏ธ) - (hm/set! emoji-map :spiral-calendar '๐Ÿ—“) - (hm/set! emoji-map :card-index '๐Ÿ“‡) - (hm/set! emoji-map :chart-increasing '๐Ÿ“ˆ) - (hm/set! emoji-map :chart-decreasing '๐Ÿ“‰) - (hm/set! emoji-map :bar-chart '๐Ÿ“Š) - (hm/set! emoji-map :clipboard '๐Ÿ“‹) - (hm/set! emoji-map :pushpin '๐Ÿ“Œ) - (hm/set! emoji-map :round-pushpin '๐Ÿ“) - (hm/set! emoji-map :paperclip '๐Ÿ“Ž) - (hm/set! emoji-map :linked-paperclips '๐Ÿ–‡๏ธ) - (hm/set! emoji-map :linked-paperclips '๐Ÿ–‡) - (hm/set! emoji-map :straight-ruler '๐Ÿ“) - (hm/set! emoji-map :triangular-ruler '๐Ÿ“) - (hm/set! emoji-map :scissors 'โœ‚๏ธ) - (hm/set! emoji-map :scissors 'โœ‚) - (hm/set! emoji-map :card-file-box '๐Ÿ—ƒ๏ธ) - (hm/set! emoji-map :card-file-box '๐Ÿ—ƒ) - (hm/set! emoji-map :file-cabinet '๐Ÿ—„๏ธ) - (hm/set! emoji-map :file-cabinet '๐Ÿ—„) - (hm/set! emoji-map :wastebasket '๐Ÿ—‘๏ธ) - (hm/set! emoji-map :wastebasket '๐Ÿ—‘) - (hm/set! emoji-map :locked '๐Ÿ”’) - (hm/set! emoji-map :unlocked '๐Ÿ”“) - (hm/set! emoji-map :locked-with-pen '๐Ÿ”) - (hm/set! emoji-map :locked-with-key '๐Ÿ”) - (hm/set! emoji-map :key '๐Ÿ”‘) - (hm/set! emoji-map :old-key '๐Ÿ—๏ธ) - (hm/set! emoji-map :old-key '๐Ÿ—) - (hm/set! emoji-map :hammer '๐Ÿ”จ) - (hm/set! emoji-map :axe '๐Ÿช“) - (hm/set! emoji-map :pick 'โ›๏ธ) - (hm/set! emoji-map :pick 'โ›) - (hm/set! emoji-map :hammer-and-pick 'โš’๏ธ) - (hm/set! emoji-map :hammer-and-pick 'โš’) - (hm/set! emoji-map :hammer-and-wrench '๐Ÿ› ๏ธ) - (hm/set! emoji-map :hammer-and-wrench '๐Ÿ› ) - (hm/set! emoji-map :dagger '๐Ÿ—ก๏ธ) - (hm/set! emoji-map :dagger '๐Ÿ—ก) - (hm/set! emoji-map :crossed-swords 'โš”๏ธ) - (hm/set! emoji-map :crossed-swords 'โš”) - (hm/set! emoji-map :pistol '๐Ÿ”ซ) - (hm/set! emoji-map :bow-and-arrow '๐Ÿน) - (hm/set! emoji-map :shield '๐Ÿ›ก๏ธ) - (hm/set! emoji-map :shield '๐Ÿ›ก) - (hm/set! emoji-map :wrench '๐Ÿ”ง) - (hm/set! emoji-map :nut-and-bolt '๐Ÿ”ฉ) - (hm/set! emoji-map :gear 'โš™๏ธ) - (hm/set! emoji-map :gear 'โš™) - (hm/set! emoji-map :clamp '๐Ÿ—œ๏ธ) - (hm/set! emoji-map :clamp '๐Ÿ—œ) - (hm/set! emoji-map :balance-scale 'โš–๏ธ) - (hm/set! emoji-map :balance-scale 'โš–) - (hm/set! emoji-map :probing-cane '๐Ÿฆฏ) - (hm/set! emoji-map :link '๐Ÿ”—) - (hm/set! emoji-map :chains 'โ›“๏ธ) - (hm/set! emoji-map :chains 'โ›“) - (hm/set! emoji-map :toolbox '๐Ÿงฐ) - (hm/set! emoji-map :magnet '๐Ÿงฒ) - (hm/set! emoji-map :alembic 'โš—๏ธ) - (hm/set! emoji-map :alembic 'โš—) - (hm/set! emoji-map :test-tube '๐Ÿงช) - (hm/set! emoji-map :petri-dish '๐Ÿงซ) - (hm/set! emoji-map :dna '๐Ÿงฌ) - (hm/set! emoji-map :microscope '๐Ÿ”ฌ) - (hm/set! emoji-map :telescope '๐Ÿ”ญ) - (hm/set! emoji-map :satellite-antenna '๐Ÿ“ก) - (hm/set! emoji-map :syringe '๐Ÿ’‰) - (hm/set! emoji-map :drop-of-blood '๐Ÿฉธ) - (hm/set! emoji-map :pill '๐Ÿ’Š) - (hm/set! emoji-map :adhesive-bandage '๐Ÿฉน) - (hm/set! emoji-map :stethoscope '๐Ÿฉบ) - (hm/set! emoji-map :door '๐Ÿšช) - (hm/set! emoji-map :bed '๐Ÿ›๏ธ) - (hm/set! emoji-map :bed '๐Ÿ›) - (hm/set! emoji-map :couch-and-lamp '๐Ÿ›‹๏ธ) - (hm/set! emoji-map :couch-and-lamp '๐Ÿ›‹) - (hm/set! emoji-map :chair '๐Ÿช‘) - (hm/set! emoji-map :toilet '๐Ÿšฝ) - (hm/set! emoji-map :shower '๐Ÿšฟ) - (hm/set! emoji-map :bathtub '๐Ÿ›) - (hm/set! emoji-map :razor '๐Ÿช’) - (hm/set! emoji-map :lotion-bottle '๐Ÿงด) - (hm/set! emoji-map :safety-pin '๐Ÿงท) - (hm/set! emoji-map :broom '๐Ÿงน) - (hm/set! emoji-map :basket '๐Ÿงบ) - (hm/set! emoji-map :roll-of-paper '๐Ÿงป) - (hm/set! emoji-map :soap '๐Ÿงผ) - (hm/set! emoji-map :sponge '๐Ÿงฝ) - (hm/set! emoji-map :fire-extinguisher '๐Ÿงฏ) - (hm/set! emoji-map :shopping-cart '๐Ÿ›’) - (hm/set! emoji-map :cigarette '๐Ÿšฌ) - (hm/set! emoji-map :coffin 'โšฐ๏ธ) - (hm/set! emoji-map :coffin 'โšฐ) - (hm/set! emoji-map :funeral-urn 'โšฑ๏ธ) - (hm/set! emoji-map :funeral-urn 'โšฑ) - (hm/set! emoji-map :moai '๐Ÿ—ฟ) - (hm/set! emoji-map :ATM-sign '๐Ÿง) - (hm/set! emoji-map :litter-in-bin-sign '๐Ÿšฎ) - (hm/set! emoji-map :potable-water '๐Ÿšฐ) - (hm/set! emoji-map :wheelchair-symbol 'โ™ฟ) - (hm/set! emoji-map :men-s-room '๐Ÿšน) - (hm/set! emoji-map :women-s-room '๐Ÿšบ) - (hm/set! emoji-map :restroom '๐Ÿšป) - (hm/set! emoji-map :baby-symbol '๐Ÿšผ) - (hm/set! emoji-map :water-closet '๐Ÿšพ) - (hm/set! emoji-map :passport-control '๐Ÿ›‚) - (hm/set! emoji-map :customs '๐Ÿ›ƒ) - (hm/set! emoji-map :baggage-claim '๐Ÿ›„) - (hm/set! emoji-map :left-luggage '๐Ÿ›…) - (hm/set! emoji-map :warning 'โš ๏ธ) - (hm/set! emoji-map :warning 'โš ) - (hm/set! emoji-map :children-crossing '๐Ÿšธ) - (hm/set! emoji-map :no-entry 'โ›”) - (hm/set! emoji-map :prohibited '๐Ÿšซ) - (hm/set! emoji-map :no-bicycles '๐Ÿšณ) - (hm/set! emoji-map :no-smoking '๐Ÿšญ) - (hm/set! emoji-map :no-littering '๐Ÿšฏ) - (hm/set! emoji-map :non-potable-water '๐Ÿšฑ) - (hm/set! emoji-map :no-pedestrians '๐Ÿšท) - (hm/set! emoji-map :no-mobile-phones '๐Ÿ“ต) - (hm/set! emoji-map :no-one-under-eighteen '๐Ÿ”ž) - (hm/set! emoji-map :radioactive 'โ˜ข๏ธ) - (hm/set! emoji-map :radioactive 'โ˜ข) - (hm/set! emoji-map :biohazard 'โ˜ฃ๏ธ) - (hm/set! emoji-map :biohazard 'โ˜ฃ) - (hm/set! emoji-map :up-arrow 'โฌ†๏ธ) - (hm/set! emoji-map :arrow 'โฌ†-up) - (hm/set! emoji-map :up-right-arrow 'โ†—๏ธ) - (hm/set! emoji-map :right-arrow 'โ†—-up) - (hm/set! emoji-map :right-arrow 'โžก๏ธ) - (hm/set! emoji-map :right-arrow 'โžก) - (hm/set! emoji-map :down-right-arrow 'โ†˜๏ธ) - (hm/set! emoji-map :right-arrow 'โ†˜-down) - (hm/set! emoji-map :down-arrow 'โฌ‡๏ธ) - (hm/set! emoji-map :arrow 'โฌ‡-down) - (hm/set! emoji-map :down-left-arrow 'โ†™๏ธ) - (hm/set! emoji-map :left-arrow 'โ†™-down) - (hm/set! emoji-map :left-arrow 'โฌ…๏ธ) - (hm/set! emoji-map :arrow 'โฌ…-left) - (hm/set! emoji-map :up-left-arrow 'โ†–๏ธ) - (hm/set! emoji-map :left-arrow 'โ†–-up) - (hm/set! emoji-map :up-down-arrow 'โ†•๏ธ) - (hm/set! emoji-map :down-arrow 'โ†•-up) - (hm/set! emoji-map :left-right-arrow 'โ†”๏ธ) - (hm/set! emoji-map :right-arrow 'โ†”-left) - (hm/set! emoji-map :right-arrow-curving-left 'โ†ฉ๏ธ) - (hm/set! emoji-map :arrow-curving-left 'โ†ฉ-right) - (hm/set! emoji-map :left-arrow-curving-right 'โ†ช๏ธ) - (hm/set! emoji-map :arrow-curving-right 'โ†ช-left) - (hm/set! emoji-map :right-arrow-curving-up 'โคด๏ธ) - (hm/set! emoji-map :right-arrow-curving-up 'โคด) - (hm/set! emoji-map :right-arrow-curving-down 'โคต๏ธ) - (hm/set! emoji-map :right-arrow-curving-down 'โคต) - (hm/set! emoji-map :clockwise-vertical-arrows '๐Ÿ”ƒ) - (hm/set! emoji-map :counterclockwise-arrows-button '๐Ÿ”„) - (hm/set! emoji-map :BACK-arrow '๐Ÿ”™) - (hm/set! emoji-map :END-arrow '๐Ÿ”š) - (hm/set! emoji-map :ON!-arrow '๐Ÿ”›) - (hm/set! emoji-map :SOON-arrow '๐Ÿ”œ) - (hm/set! emoji-map :TOP-arrow '๐Ÿ”) - (hm/set! emoji-map :place-of-worship '๐Ÿ›) - (hm/set! emoji-map :atom-symbol 'โš›๏ธ) - (hm/set! emoji-map :atom-symbol 'โš›) - (hm/set! emoji-map :om '๐Ÿ•‰๏ธ) - (hm/set! emoji-map :om '๐Ÿ•‰) - (hm/set! emoji-map :star-of-David 'โœก๏ธ) - (hm/set! emoji-map :star-of-David 'โœก) - (hm/set! emoji-map :wheel-of-dharma 'โ˜ธ๏ธ) - (hm/set! emoji-map :wheel-of-dharma 'โ˜ธ) - (hm/set! emoji-map :yin-yang 'โ˜ฏ๏ธ) - (hm/set! emoji-map :yin-yang 'โ˜ฏ) - (hm/set! emoji-map :latin-cross 'โœ๏ธ) - (hm/set! emoji-map :latin-cross 'โœ) - (hm/set! emoji-map :orthodox-cross 'โ˜ฆ๏ธ) - (hm/set! emoji-map :orthodox-cross 'โ˜ฆ) - (hm/set! emoji-map :star-and-crescent 'โ˜ช๏ธ) - (hm/set! emoji-map :star-and-crescent 'โ˜ช) - (hm/set! emoji-map :peace-symbol 'โ˜ฎ๏ธ) - (hm/set! emoji-map :peace-symbol 'โ˜ฎ) - (hm/set! emoji-map :menorah '๐Ÿ•Ž) - (hm/set! emoji-map :dotted-six-pointed-star '๐Ÿ”ฏ) - (hm/set! emoji-map :Aries 'โ™ˆ) - (hm/set! emoji-map :Taurus 'โ™‰) - (hm/set! emoji-map :Gemini 'โ™Š) - (hm/set! emoji-map :Cancer 'โ™‹) - (hm/set! emoji-map :Leo 'โ™Œ) - (hm/set! emoji-map :Virgo 'โ™) - (hm/set! emoji-map :Libra 'โ™Ž) - (hm/set! emoji-map :Scorpio 'โ™) - (hm/set! emoji-map :Sagittarius 'โ™) - (hm/set! emoji-map :Capricorn 'โ™‘) - (hm/set! emoji-map :Aquarius 'โ™’) - (hm/set! emoji-map :Pisces 'โ™“) - (hm/set! emoji-map :Ophiuchus 'โ›Ž) - (hm/set! emoji-map :shuffle-tracks-button '๐Ÿ”€) - (hm/set! emoji-map :repeat-button '๐Ÿ”) - (hm/set! emoji-map :repeat-single-button '๐Ÿ”‚) - (hm/set! emoji-map :play-button 'โ–ถ๏ธ) - (hm/set! emoji-map :button 'โ–ถ-play) - (hm/set! emoji-map :forward-button 'โฉ-fast) - (hm/set! emoji-map :next-track-button 'โญ๏ธ) - (hm/set! emoji-map :track-button 'โญ-next) - (hm/set! emoji-map :play-or-pause-button 'โฏ๏ธ) - (hm/set! emoji-map :or-pause-button 'โฏ-play) - (hm/set! emoji-map :reverse-button 'โ—€๏ธ) - (hm/set! emoji-map :button 'โ—€-reverse) - (hm/set! emoji-map :reverse-button 'โช-fast) - (hm/set! emoji-map :last-track-button 'โฎ๏ธ) - (hm/set! emoji-map :track-button 'โฎ-last) - (hm/set! emoji-map :upwards-button '๐Ÿ”ผ) - (hm/set! emoji-map :up-button 'โซ-fast) - (hm/set! emoji-map :downwards-button '๐Ÿ”ฝ) - (hm/set! emoji-map :down-button 'โฌ-fast) - (hm/set! emoji-map :pause-button 'โธ๏ธ) - (hm/set! emoji-map :button 'โธ-pause) - (hm/set! emoji-map :stop-button 'โน๏ธ) - (hm/set! emoji-map :button 'โน-stop) - (hm/set! emoji-map :record-button 'โบ๏ธ) - (hm/set! emoji-map :button 'โบ-record) - (hm/set! emoji-map :eject-button 'โ๏ธ) - (hm/set! emoji-map :button 'โ-eject) - (hm/set! emoji-map :cinema '๐ŸŽฆ) - (hm/set! emoji-map :dim-button '๐Ÿ”…) - (hm/set! emoji-map :bright-button '๐Ÿ”†) - (hm/set! emoji-map :antenna-bars '๐Ÿ“ถ) - (hm/set! emoji-map :vibration-mode '๐Ÿ“ณ) - (hm/set! emoji-map :mobile-phone-off '๐Ÿ“ด) - (hm/set! emoji-map :female-sign 'โ™€๏ธ) - (hm/set! emoji-map :sign 'โ™€-female) - (hm/set! emoji-map :male-sign 'โ™‚๏ธ) - (hm/set! emoji-map :sign 'โ™‚-male) - (hm/set! emoji-map :medical-symbol 'โš•๏ธ) - (hm/set! emoji-map :medical-symbol 'โš•) - (hm/set! emoji-map :infinity 'โ™พ๏ธ) - (hm/set! emoji-map :infinity 'โ™พ) - (hm/set! emoji-map :recycling-symbol 'โ™ป๏ธ) - (hm/set! emoji-map :recycling-symbol 'โ™ป) - (hm/set! emoji-map :fleur-de-lis 'โšœ๏ธ) - (hm/set! emoji-map :fleur-de-lis 'โšœ) - (hm/set! emoji-map :trident-emblem '๐Ÿ”ฑ) - (hm/set! emoji-map :name-badge '๐Ÿ“›) - (hm/set! emoji-map :Japanese-symbol-for-beginner '๐Ÿ”ฐ) - (hm/set! emoji-map :red-circle 'โญ•-hollow) - (hm/set! emoji-map :check-mark-button 'โœ…) - (hm/set! emoji-map :check-box-with-check 'โ˜‘๏ธ) - (hm/set! emoji-map :check-box-with-check 'โ˜‘) - (hm/set! emoji-map :check-mark 'โœ”๏ธ) - (hm/set! emoji-map :check-mark 'โœ”) - (hm/set! emoji-map :multiplication-sign 'โœ–๏ธ) - (hm/set! emoji-map :multiplication-sign 'โœ–) - (hm/set! emoji-map :cross-mark 'โŒ) - (hm/set! emoji-map :cross-mark-button 'โŽ) - (hm/set! emoji-map :plus-sign 'โž•) - (hm/set! emoji-map :minus-sign 'โž–) - (hm/set! emoji-map :division-sign 'โž—) - (hm/set! emoji-map :curly-loop 'โžฐ) - (hm/set! emoji-map :double-curly-loop 'โžฟ) - (hm/set! emoji-map :part-alternation-mark 'ใ€ฝ๏ธ) - (hm/set! emoji-map :part-alternation-mark 'ใ€ฝ) - (hm/set! emoji-map :eight-spoked-asterisk 'โœณ๏ธ) - (hm/set! emoji-map :eight-spoked-asterisk 'โœณ) - (hm/set! emoji-map :eight-pointed-star 'โœด๏ธ) - (hm/set! emoji-map :eight-pointed-star 'โœด) - (hm/set! emoji-map :sparkle 'โ‡๏ธ) - (hm/set! emoji-map :sparkle 'โ‡) - (hm/set! emoji-map :double-exclamation-mark 'โ€ผ๏ธ) - (hm/set! emoji-map :exclamation-mark 'โ€ผ-double) - (hm/set! emoji-map :exclamation-question-mark 'โ‰๏ธ) - (hm/set! emoji-map :question-mark 'โ‰-exclamation) - (hm/set! emoji-map :question-mark 'โ“) - (hm/set! emoji-map :white-question-mark 'โ”) - (hm/set! emoji-map :white-exclamation-mark 'โ•) - (hm/set! emoji-map :exclamation-mark 'โ—) - (hm/set! emoji-map :wavy-dash 'ใ€ฐ๏ธ) - (hm/set! emoji-map :wavy-dash 'ใ€ฐ) - (hm/set! emoji-map :copyright 'ยฉ๏ธ) - (hm/set! emoji-map :registered 'ยฎ๏ธ) - (hm/set! emoji-map :trade-mark 'โ„ข๏ธ) - (hm/set! emoji-map :mark 'โ„ข-trade) - (hm/set! emoji-map :-keycap:-# '#๏ธ) - (hm/set! emoji-map :keycap:-# '#โƒฃ) - (hm/set! emoji-map :-keycap:-* '*๏ธ) - (hm/set! emoji-map :keycap:-* '*โƒฃ) - (hm/set! emoji-map :-keycap:-0 '0๏ธ) - (hm/set! emoji-map :keycap:-0 '0โƒฃ) - (hm/set! emoji-map :-keycap:-1 '1๏ธ) - (hm/set! emoji-map :keycap:-1 '1โƒฃ) - (hm/set! emoji-map :-keycap:-2 '2๏ธ) - (hm/set! emoji-map :keycap:-2 '2โƒฃ) - (hm/set! emoji-map :-keycap:-3 '3๏ธ) - (hm/set! emoji-map :keycap:-3 '3โƒฃ) - (hm/set! emoji-map :-keycap:-4 '4๏ธ) - (hm/set! emoji-map :keycap:-4 '4โƒฃ) - (hm/set! emoji-map :-keycap:-5 '5๏ธ) - (hm/set! emoji-map :keycap:-5 '5โƒฃ) - (hm/set! emoji-map :-keycap:-6 '6๏ธ) - (hm/set! emoji-map :keycap:-6 '6โƒฃ) - (hm/set! emoji-map :-keycap:-7 '7๏ธ) - (hm/set! emoji-map :keycap:-7 '7โƒฃ) - (hm/set! emoji-map :-keycap:-8 '8๏ธ) - (hm/set! emoji-map :keycap:-8 '8โƒฃ) - (hm/set! emoji-map :-keycap:-9 '9๏ธ) - (hm/set! emoji-map :keycap:-9 '9โƒฃ) - (hm/set! emoji-map :keycap:-10 '๐Ÿ”Ÿ) - (hm/set! emoji-map :input-latin-uppercase '๐Ÿ” ) - (hm/set! emoji-map :input-latin-lowercase '๐Ÿ”ก) - (hm/set! emoji-map :input-numbers '๐Ÿ”ข) - (hm/set! emoji-map :input-symbols '๐Ÿ”ฃ) - (hm/set! emoji-map :input-latin-letters '๐Ÿ”ค) - (hm/set! emoji-map :A-button-blood-type '๐Ÿ…ฐ๏ธ) - (hm/set! emoji-map :A-button-blood-type '๐Ÿ…ฐ) - (hm/set! emoji-map :AB-button-blood-type '๐Ÿ†Ž) - (hm/set! emoji-map :B-button-blood-type '๐Ÿ…ฑ๏ธ) - (hm/set! emoji-map :B-button-blood-type '๐Ÿ…ฑ) - (hm/set! emoji-map :CL-button '๐Ÿ†‘) - (hm/set! emoji-map :COOL-button '๐Ÿ†’) - (hm/set! emoji-map :FREE-button '๐Ÿ†“) - (hm/set! emoji-map :information 'โ„น๏ธ) - (hm/set! emoji-map :information 'โ„น) - (hm/set! emoji-map :ID-button '๐Ÿ†”) - (hm/set! emoji-map :circled-M 'โ“‚๏ธ) - (hm/set! emoji-map :circled-M 'โ“‚) - (hm/set! emoji-map :NEW-button '๐Ÿ†•) - (hm/set! emoji-map :NG-button '๐Ÿ†–) - (hm/set! emoji-map :O-button-blood-type '๐Ÿ…พ๏ธ) - (hm/set! emoji-map :O-button-blood-type '๐Ÿ…พ) - (hm/set! emoji-map :OK-button '๐Ÿ†—) - (hm/set! emoji-map :P-button '๐Ÿ…ฟ๏ธ) - (hm/set! emoji-map :P-button '๐Ÿ…ฟ) - (hm/set! emoji-map :SOS-button '๐Ÿ†˜) - (hm/set! emoji-map :UP!-button '๐Ÿ†™) - (hm/set! emoji-map :VS-button '๐Ÿ†š) - (hm/set! emoji-map :Japanese--here--button '๐Ÿˆ) - (hm/set! emoji-map :Japanese--service-charge--button '๐Ÿˆ‚๏ธ) - (hm/set! emoji-map :Japanese--service-charge--button '๐Ÿˆ‚) - (hm/set! emoji-map :Japanese--monthly-amount--button '๐Ÿˆท๏ธ) - (hm/set! emoji-map :Japanese--monthly-amount--button '๐Ÿˆท) - (hm/set! emoji-map :Japanese--not-free-of-charge--button '๐Ÿˆถ) - (hm/set! emoji-map :Japanese--reserved--button '๐Ÿˆฏ) - (hm/set! emoji-map :Japanese--bargain--button '๐Ÿ‰) - (hm/set! emoji-map :Japanese--discount--button '๐Ÿˆน) - (hm/set! emoji-map :Japanese--free-of-charge--button '๐Ÿˆš) - (hm/set! emoji-map :Japanese--prohibited--button '๐Ÿˆฒ) - (hm/set! emoji-map :Japanese--acceptable--button '๐Ÿ‰‘) - (hm/set! emoji-map :Japanese--application--button '๐Ÿˆธ) - (hm/set! emoji-map :Japanese--passing-grade--button '๐Ÿˆด) - (hm/set! emoji-map :Japanese--vacancy--button '๐Ÿˆณ) - (hm/set! emoji-map :Japanese--congratulations--button 'ใŠ—๏ธ) - (hm/set! emoji-map :Japanese--congratulations--button 'ใŠ—) - (hm/set! emoji-map :Japanese--secret--button 'ใŠ™๏ธ) - (hm/set! emoji-map :Japanese--secret--button 'ใŠ™) - (hm/set! emoji-map :Japanese--open-for-business--button '๐Ÿˆบ) - (hm/set! emoji-map :Japanese--no-vacancy--button '๐Ÿˆต) - (hm/set! emoji-map :red-circle '๐Ÿ”ด) - (hm/set! emoji-map :orange-circle '๐ŸŸ ) - (hm/set! emoji-map :yellow-circle '๐ŸŸก) - (hm/set! emoji-map :green-circle '๐ŸŸข) - (hm/set! emoji-map :blue-circle '๐Ÿ”ต) - (hm/set! emoji-map :purple-circle '๐ŸŸฃ) - (hm/set! emoji-map :brown-circle '๐ŸŸค) - (hm/set! emoji-map :black-circle 'โšซ) - (hm/set! emoji-map :white-circle 'โšช) - (hm/set! emoji-map :red-square '๐ŸŸฅ) - (hm/set! emoji-map :orange-square '๐ŸŸง) - (hm/set! emoji-map :yellow-square '๐ŸŸจ) - (hm/set! emoji-map :green-square '๐ŸŸฉ) - (hm/set! emoji-map :blue-square '๐ŸŸฆ) - (hm/set! emoji-map :purple-square '๐ŸŸช) - (hm/set! emoji-map :brown-square '๐ŸŸซ) - (hm/set! emoji-map :large-square 'โฌ›-black) - (hm/set! emoji-map :large-square 'โฌœ-white) - (hm/set! emoji-map :black-medium-square 'โ—ผ๏ธ) - (hm/set! emoji-map :black-medium-square 'โ—ผ) - (hm/set! emoji-map :white-medium-square 'โ—ป๏ธ) - (hm/set! emoji-map :white-medium-square 'โ—ป) - (hm/set! emoji-map :black-medium-small-square 'โ—พ) - (hm/set! emoji-map :white-medium-small-square 'โ—ฝ) - (hm/set! emoji-map :black-small-square 'โ–ช๏ธ) - (hm/set! emoji-map :black-small-square 'โ–ช) - (hm/set! emoji-map :white-small-square 'โ–ซ๏ธ) - (hm/set! emoji-map :white-small-square 'โ–ซ) - (hm/set! emoji-map :large-orange-diamond '๐Ÿ”ถ) - (hm/set! emoji-map :large-blue-diamond '๐Ÿ”ท) - (hm/set! emoji-map :small-orange-diamond '๐Ÿ”ธ) - (hm/set! emoji-map :small-blue-diamond '๐Ÿ”น) - (hm/set! emoji-map :red-triangle-pointed-up '๐Ÿ”บ) - (hm/set! emoji-map :red-triangle-pointed-down '๐Ÿ”ป) - (hm/set! emoji-map :diamond-with-a-dot '๐Ÿ’ ) - (hm/set! emoji-map :radio-button '๐Ÿ”˜) - (hm/set! emoji-map :white-square-button '๐Ÿ”ณ) - (hm/set! emoji-map :black-square-button '๐Ÿ”ฒ) - (hm/set! emoji-map :chequered-flag '๐Ÿ) - (hm/set! emoji-map :triangular-flag '๐Ÿšฉ) - (hm/set! emoji-map :crossed-flags '๐ŸŽŒ) - (hm/set! emoji-map :black-flag '๐Ÿด) - (hm/set! emoji-map :white-flag '๐Ÿณ๏ธ) - (hm/set! emoji-map :white-flag '๐Ÿณ) - (hm/set! emoji-map :๐ŸŒˆ-rainbow-flag '๐Ÿณ๏ธ) - (hm/set! emoji-map :๐ŸŒˆ-rainbow-flag '๐Ÿณ) - (hm/set! emoji-map :โ˜ ๏ธ-pirate-flag '๐Ÿด) - (hm/set! emoji-map :โ˜ -pirate-flag '๐Ÿด) - (hm/set! emoji-map :flag:-Ascension-Island '๐Ÿ‡ฆ๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Andorra '๐Ÿ‡ฆ๐Ÿ‡ฉ) - (hm/set! emoji-map :flag:-United-Arab-Emirates '๐Ÿ‡ฆ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Afghanistan '๐Ÿ‡ฆ๐Ÿ‡ซ) - (hm/set! emoji-map :flag:-Antigua-&-Barbuda '๐Ÿ‡ฆ๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Anguilla '๐Ÿ‡ฆ๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Albania '๐Ÿ‡ฆ๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-Armenia '๐Ÿ‡ฆ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Angola '๐Ÿ‡ฆ๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Antarctica '๐Ÿ‡ฆ๐Ÿ‡ถ) - (hm/set! emoji-map :flag:-Argentina '๐Ÿ‡ฆ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-American-Samoa '๐Ÿ‡ฆ๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Austria '๐Ÿ‡ฆ๐Ÿ‡น) - (hm/set! emoji-map :flag:-Australia '๐Ÿ‡ฆ๐Ÿ‡บ) - (hm/set! emoji-map :flag:-Aruba '๐Ÿ‡ฆ๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-ร…land-Islands '๐Ÿ‡ฆ๐Ÿ‡ฝ) - (hm/set! emoji-map :flag:-Azerbaijan '๐Ÿ‡ฆ๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Bosnia-&-Herzegovina '๐Ÿ‡ง๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Barbados '๐Ÿ‡ง๐Ÿ‡ง) - (hm/set! emoji-map :flag:-Bangladesh '๐Ÿ‡ง๐Ÿ‡ฉ) - (hm/set! emoji-map :flag:-Belgium '๐Ÿ‡ง๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Burkina-Faso '๐Ÿ‡ง๐Ÿ‡ซ) - (hm/set! emoji-map :flag:-Bulgaria '๐Ÿ‡ง๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Bahrain '๐Ÿ‡ง๐Ÿ‡ญ) - (hm/set! emoji-map :flag:-Burundi '๐Ÿ‡ง๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Benin '๐Ÿ‡ง๐Ÿ‡ฏ) - (hm/set! emoji-map :flag:-St.-Barthรฉlemy '๐Ÿ‡ง๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-Bermuda '๐Ÿ‡ง๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Brunei '๐Ÿ‡ง๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-Bolivia '๐Ÿ‡ง๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Caribbean-Netherlands '๐Ÿ‡ง๐Ÿ‡ถ) - (hm/set! emoji-map :flag:-Brazil '๐Ÿ‡ง๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Bahamas '๐Ÿ‡ง๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Bhutan '๐Ÿ‡ง๐Ÿ‡น) - (hm/set! emoji-map :flag:-Bouvet-Island '๐Ÿ‡ง๐Ÿ‡ป) - (hm/set! emoji-map :flag:-Botswana '๐Ÿ‡ง๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-Belarus '๐Ÿ‡ง๐Ÿ‡พ) - (hm/set! emoji-map :flag:-Belize '๐Ÿ‡ง๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Canada '๐Ÿ‡จ๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Cocos-Keeling-Islands '๐Ÿ‡จ๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Congo---Kinshasa '๐Ÿ‡จ๐Ÿ‡ฉ) - (hm/set! emoji-map :flag:-Central-African-Republic '๐Ÿ‡จ๐Ÿ‡ซ) - (hm/set! emoji-map :flag:-Congo---Brazzaville '๐Ÿ‡จ๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Switzerland '๐Ÿ‡จ๐Ÿ‡ญ) - (hm/set! emoji-map :flag:-Cรดte-d-Ivoire '๐Ÿ‡จ๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Cook-Islands '๐Ÿ‡จ๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Chile '๐Ÿ‡จ๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-Cameroon '๐Ÿ‡จ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-China '๐Ÿ‡จ๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-Colombia '๐Ÿ‡จ๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Clipperton-Island '๐Ÿ‡จ๐Ÿ‡ต) - (hm/set! emoji-map :flag:-Costa-Rica '๐Ÿ‡จ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Cuba '๐Ÿ‡จ๐Ÿ‡บ) - (hm/set! emoji-map :flag:-Cape-Verde '๐Ÿ‡จ๐Ÿ‡ป) - (hm/set! emoji-map :flag:-Curaรงao '๐Ÿ‡จ๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-Christmas-Island '๐Ÿ‡จ๐Ÿ‡ฝ) - (hm/set! emoji-map :flag:-Cyprus '๐Ÿ‡จ๐Ÿ‡พ) - (hm/set! emoji-map :flag:-Czechia '๐Ÿ‡จ๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Germany '๐Ÿ‡ฉ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Diego-Garcia '๐Ÿ‡ฉ๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Djibouti '๐Ÿ‡ฉ๐Ÿ‡ฏ) - (hm/set! emoji-map :flag:-Denmark '๐Ÿ‡ฉ๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Dominica '๐Ÿ‡ฉ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Dominican-Republic '๐Ÿ‡ฉ๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Algeria '๐Ÿ‡ฉ๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Ceuta-&-Melilla '๐Ÿ‡ช๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Ecuador '๐Ÿ‡ช๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Estonia '๐Ÿ‡ช๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Egypt '๐Ÿ‡ช๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Western-Sahara '๐Ÿ‡ช๐Ÿ‡ญ) - (hm/set! emoji-map :flag:-Eritrea '๐Ÿ‡ช๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Spain '๐Ÿ‡ช๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Ethiopia '๐Ÿ‡ช๐Ÿ‡น) - (hm/set! emoji-map :flag:-European-Union '๐Ÿ‡ช๐Ÿ‡บ) - (hm/set! emoji-map :flag:-Finland '๐Ÿ‡ซ๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Fiji '๐Ÿ‡ซ๐Ÿ‡ฏ) - (hm/set! emoji-map :flag:-Falkland-Islands '๐Ÿ‡ซ๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Micronesia '๐Ÿ‡ซ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Faroe-Islands '๐Ÿ‡ซ๐Ÿ‡ด) - (hm/set! emoji-map :flag:-France '๐Ÿ‡ซ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Gabon '๐Ÿ‡ฌ๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-United-Kingdom '๐Ÿ‡ฌ๐Ÿ‡ง) - (hm/set! emoji-map :flag:-Grenada '๐Ÿ‡ฌ๐Ÿ‡ฉ) - (hm/set! emoji-map :flag:-Georgia '๐Ÿ‡ฌ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-French-Guiana '๐Ÿ‡ฌ๐Ÿ‡ซ) - (hm/set! emoji-map :flag:-Guernsey '๐Ÿ‡ฌ๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Ghana '๐Ÿ‡ฌ๐Ÿ‡ญ) - (hm/set! emoji-map :flag:-Gibraltar '๐Ÿ‡ฌ๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Greenland '๐Ÿ‡ฌ๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-Gambia '๐Ÿ‡ฌ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Guinea '๐Ÿ‡ฌ๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-Guadeloupe '๐Ÿ‡ฌ๐Ÿ‡ต) - (hm/set! emoji-map :flag:-Equatorial-Guinea '๐Ÿ‡ฌ๐Ÿ‡ถ) - (hm/set! emoji-map :flag:-Greece '๐Ÿ‡ฌ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-South-Georgia-&-South-Sandwich-Islands '๐Ÿ‡ฌ๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Guatemala '๐Ÿ‡ฌ๐Ÿ‡น) - (hm/set! emoji-map :flag:-Guam '๐Ÿ‡ฌ๐Ÿ‡บ) - (hm/set! emoji-map :flag:-Guinea-Bissau '๐Ÿ‡ฌ๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-Guyana '๐Ÿ‡ฌ๐Ÿ‡พ) - (hm/set! emoji-map :flag:-Hong-Kong-SAR-China '๐Ÿ‡ญ๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Heard-&-McDonald-Islands '๐Ÿ‡ญ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Honduras '๐Ÿ‡ญ๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-Croatia '๐Ÿ‡ญ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Haiti '๐Ÿ‡ญ๐Ÿ‡น) - (hm/set! emoji-map :flag:-Hungary '๐Ÿ‡ญ๐Ÿ‡บ) - (hm/set! emoji-map :flag:-Canary-Islands '๐Ÿ‡ฎ๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Indonesia '๐Ÿ‡ฎ๐Ÿ‡ฉ) - (hm/set! emoji-map :flag:-Ireland '๐Ÿ‡ฎ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Israel '๐Ÿ‡ฎ๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-Isle-of-Man '๐Ÿ‡ฎ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-India '๐Ÿ‡ฎ๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-British-Indian-Ocean-Territory '๐Ÿ‡ฎ๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Iraq '๐Ÿ‡ฎ๐Ÿ‡ถ) - (hm/set! emoji-map :flag:-Iran '๐Ÿ‡ฎ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Iceland '๐Ÿ‡ฎ๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Italy '๐Ÿ‡ฎ๐Ÿ‡น) - (hm/set! emoji-map :flag:-Jersey '๐Ÿ‡ฏ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Jamaica '๐Ÿ‡ฏ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Jordan '๐Ÿ‡ฏ๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Japan '๐Ÿ‡ฏ๐Ÿ‡ต) - (hm/set! emoji-map :flag:-Kenya '๐Ÿ‡ฐ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Kyrgyzstan '๐Ÿ‡ฐ๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Cambodia '๐Ÿ‡ฐ๐Ÿ‡ญ) - (hm/set! emoji-map :flag:-Kiribati '๐Ÿ‡ฐ๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Comoros '๐Ÿ‡ฐ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-St.-Kitts-&-Nevis '๐Ÿ‡ฐ๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-North-Korea '๐Ÿ‡ฐ๐Ÿ‡ต) - (hm/set! emoji-map :flag:-South-Korea '๐Ÿ‡ฐ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Kuwait '๐Ÿ‡ฐ๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-Cayman-Islands '๐Ÿ‡ฐ๐Ÿ‡พ) - (hm/set! emoji-map :flag:-Kazakhstan '๐Ÿ‡ฐ๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Laos '๐Ÿ‡ฑ๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Lebanon '๐Ÿ‡ฑ๐Ÿ‡ง) - (hm/set! emoji-map :flag:-St.-Lucia '๐Ÿ‡ฑ๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Liechtenstein '๐Ÿ‡ฑ๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Sri-Lanka '๐Ÿ‡ฑ๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Liberia '๐Ÿ‡ฑ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Lesotho '๐Ÿ‡ฑ๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Lithuania '๐Ÿ‡ฑ๐Ÿ‡น) - (hm/set! emoji-map :flag:-Luxembourg '๐Ÿ‡ฑ๐Ÿ‡บ) - (hm/set! emoji-map :flag:-Latvia '๐Ÿ‡ฑ๐Ÿ‡ป) - (hm/set! emoji-map :flag:-Libya '๐Ÿ‡ฑ๐Ÿ‡พ) - (hm/set! emoji-map :flag:-Morocco '๐Ÿ‡ฒ๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Monaco '๐Ÿ‡ฒ๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Moldova '๐Ÿ‡ฒ๐Ÿ‡ฉ) - (hm/set! emoji-map :flag:-Montenegro '๐Ÿ‡ฒ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-St.-Martin '๐Ÿ‡ฒ๐Ÿ‡ซ) - (hm/set! emoji-map :flag:-Madagascar '๐Ÿ‡ฒ๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Marshall-Islands '๐Ÿ‡ฒ๐Ÿ‡ญ) - (hm/set! emoji-map :flag:-Macedonia '๐Ÿ‡ฒ๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Mali '๐Ÿ‡ฒ๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-Myanmar-Burma '๐Ÿ‡ฒ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Mongolia '๐Ÿ‡ฒ๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-Macao-SAR-China '๐Ÿ‡ฒ๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Northern-Mariana-Islands '๐Ÿ‡ฒ๐Ÿ‡ต) - (hm/set! emoji-map :flag:-Martinique '๐Ÿ‡ฒ๐Ÿ‡ถ) - (hm/set! emoji-map :flag:-Mauritania '๐Ÿ‡ฒ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Montserrat '๐Ÿ‡ฒ๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Malta '๐Ÿ‡ฒ๐Ÿ‡น) - (hm/set! emoji-map :flag:-Mauritius '๐Ÿ‡ฒ๐Ÿ‡บ) - (hm/set! emoji-map :flag:-Maldives '๐Ÿ‡ฒ๐Ÿ‡ป) - (hm/set! emoji-map :flag:-Malawi '๐Ÿ‡ฒ๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-Mexico '๐Ÿ‡ฒ๐Ÿ‡ฝ) - (hm/set! emoji-map :flag:-Malaysia '๐Ÿ‡ฒ๐Ÿ‡พ) - (hm/set! emoji-map :flag:-Mozambique '๐Ÿ‡ฒ๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Namibia '๐Ÿ‡ณ๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-New-Caledonia '๐Ÿ‡ณ๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Niger '๐Ÿ‡ณ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Norfolk-Island '๐Ÿ‡ณ๐Ÿ‡ซ) - (hm/set! emoji-map :flag:-Nigeria '๐Ÿ‡ณ๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Nicaragua '๐Ÿ‡ณ๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Netherlands '๐Ÿ‡ณ๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-Norway '๐Ÿ‡ณ๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Nepal '๐Ÿ‡ณ๐Ÿ‡ต) - (hm/set! emoji-map :flag:-Nauru '๐Ÿ‡ณ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Niue '๐Ÿ‡ณ๐Ÿ‡บ) - (hm/set! emoji-map :flag:-New-Zealand '๐Ÿ‡ณ๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Oman '๐Ÿ‡ด๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Panama '๐Ÿ‡ต๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Peru '๐Ÿ‡ต๐Ÿ‡ช) - (hm/set! emoji-map :flag:-French-Polynesia '๐Ÿ‡ต๐Ÿ‡ซ) - (hm/set! emoji-map :flag:-Papua-New-Guinea '๐Ÿ‡ต๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Philippines '๐Ÿ‡ต๐Ÿ‡ญ) - (hm/set! emoji-map :flag:-Pakistan '๐Ÿ‡ต๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Poland '๐Ÿ‡ต๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-St.-Pierre-&-Miquelon '๐Ÿ‡ต๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Pitcairn-Islands '๐Ÿ‡ต๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-Puerto-Rico '๐Ÿ‡ต๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Palestinian-Territories '๐Ÿ‡ต๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Portugal '๐Ÿ‡ต๐Ÿ‡น) - (hm/set! emoji-map :flag:-Palau '๐Ÿ‡ต๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-Paraguay '๐Ÿ‡ต๐Ÿ‡พ) - (hm/set! emoji-map :flag:-Qatar '๐Ÿ‡ถ๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Rรฉunion '๐Ÿ‡ท๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Romania '๐Ÿ‡ท๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Serbia '๐Ÿ‡ท๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Russia '๐Ÿ‡ท๐Ÿ‡บ) - (hm/set! emoji-map :flag:-Rwanda '๐Ÿ‡ท๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-Saudi-Arabia '๐Ÿ‡ธ๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Solomon-Islands '๐Ÿ‡ธ๐Ÿ‡ง) - (hm/set! emoji-map :flag:-Seychelles '๐Ÿ‡ธ๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Sudan '๐Ÿ‡ธ๐Ÿ‡ฉ) - (hm/set! emoji-map :flag:-Sweden '๐Ÿ‡ธ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Singapore '๐Ÿ‡ธ๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-St.-Helena '๐Ÿ‡ธ๐Ÿ‡ญ) - (hm/set! emoji-map :flag:-Slovenia '๐Ÿ‡ธ๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Svalbard-&-Jan-Mayen '๐Ÿ‡ธ๐Ÿ‡ฏ) - (hm/set! emoji-map :flag:-Slovakia '๐Ÿ‡ธ๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Sierra-Leone '๐Ÿ‡ธ๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-San-Marino '๐Ÿ‡ธ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Senegal '๐Ÿ‡ธ๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-Somalia '๐Ÿ‡ธ๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Suriname '๐Ÿ‡ธ๐Ÿ‡ท) - (hm/set! emoji-map :flag:-South-Sudan '๐Ÿ‡ธ๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Sรฃo-Tomรฉ-&-Prรญncipe '๐Ÿ‡ธ๐Ÿ‡น) - (hm/set! emoji-map :flag:-El-Salvador '๐Ÿ‡ธ๐Ÿ‡ป) - (hm/set! emoji-map :flag:-Sint-Maarten '๐Ÿ‡ธ๐Ÿ‡ฝ) - (hm/set! emoji-map :flag:-Syria '๐Ÿ‡ธ๐Ÿ‡พ) - (hm/set! emoji-map :flag:-Eswatini '๐Ÿ‡ธ๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Tristan-da-Cunha '๐Ÿ‡น๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Turks-&-Caicos-Islands '๐Ÿ‡น๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Chad '๐Ÿ‡น๐Ÿ‡ฉ) - (hm/set! emoji-map :flag:-French-Southern-Territories '๐Ÿ‡น๐Ÿ‡ซ) - (hm/set! emoji-map :flag:-Togo '๐Ÿ‡น๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-Thailand '๐Ÿ‡น๐Ÿ‡ญ) - (hm/set! emoji-map :flag:-Tajikistan '๐Ÿ‡น๐Ÿ‡ฏ) - (hm/set! emoji-map :flag:-Tokelau '๐Ÿ‡น๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Timor-Leste '๐Ÿ‡น๐Ÿ‡ฑ) - (hm/set! emoji-map :flag:-Turkmenistan '๐Ÿ‡น๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Tunisia '๐Ÿ‡น๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-Tonga '๐Ÿ‡น๐Ÿ‡ด) - (hm/set! emoji-map :flag:-Turkey '๐Ÿ‡น๐Ÿ‡ท) - (hm/set! emoji-map :flag:-Trinidad-&-Tobago '๐Ÿ‡น๐Ÿ‡น) - (hm/set! emoji-map :flag:-Tuvalu '๐Ÿ‡น๐Ÿ‡ป) - (hm/set! emoji-map :flag:-Taiwan '๐Ÿ‡น๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-Tanzania '๐Ÿ‡น๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Ukraine '๐Ÿ‡บ๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Uganda '๐Ÿ‡บ๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-U.S.-Outlying-Islands '๐Ÿ‡บ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-United-Nations '๐Ÿ‡บ๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-United-States '๐Ÿ‡บ๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Uruguay '๐Ÿ‡บ๐Ÿ‡พ) - (hm/set! emoji-map :flag:-Uzbekistan '๐Ÿ‡บ๐Ÿ‡ฟ) - (hm/set! emoji-map :flag:-Vatican-City '๐Ÿ‡ป๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-St.-Vincent-&-Grenadines '๐Ÿ‡ป๐Ÿ‡จ) - (hm/set! emoji-map :flag:-Venezuela '๐Ÿ‡ป๐Ÿ‡ช) - (hm/set! emoji-map :flag:-British-Virgin-Islands '๐Ÿ‡ป๐Ÿ‡ฌ) - (hm/set! emoji-map :flag:-U.S.-Virgin-Islands '๐Ÿ‡ป๐Ÿ‡ฎ) - (hm/set! emoji-map :flag:-Vietnam '๐Ÿ‡ป๐Ÿ‡ณ) - (hm/set! emoji-map :flag:-Vanuatu '๐Ÿ‡ป๐Ÿ‡บ) - (hm/set! emoji-map :flag:-Wallis-&-Futuna '๐Ÿ‡ผ๐Ÿ‡ซ) - (hm/set! emoji-map :flag:-Samoa '๐Ÿ‡ผ๐Ÿ‡ธ) - (hm/set! emoji-map :flag:-Kosovo '๐Ÿ‡ฝ๐Ÿ‡ฐ) - (hm/set! emoji-map :flag:-Yemen '๐Ÿ‡พ๐Ÿ‡ช) - (hm/set! emoji-map :flag:-Mayotte '๐Ÿ‡พ๐Ÿ‡น) - (hm/set! emoji-map :flag:-South-Africa '๐Ÿ‡ฟ๐Ÿ‡ฆ) - (hm/set! emoji-map :flag:-Zambia '๐Ÿ‡ฟ๐Ÿ‡ฒ) - (hm/set! emoji-map :flag:-Zimbabwe '๐Ÿ‡ฟ๐Ÿ‡ผ) - (hm/set! emoji-map :flag:-England '๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ) - (hm/set! emoji-map :flag:-Scotland '๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ) - (hm/set! emoji-map :flag:-Wales '๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ) - - (define (get emoji-name) - (mytry - (hm/get emoji-map emoji-name) - (error :not-found "emoji was not found")))) +(define-module emoji + :exports (get) + + (define emoji-map (hash-map)) + (hm/set! emoji-map :grinning-face '๐Ÿ˜€) + (hm/set! emoji-map :grinning-face-with-big-eyes '๐Ÿ˜ƒ) + (hm/set! emoji-map :grinning-face-with-smiling-eyes '๐Ÿ˜„) + (hm/set! emoji-map :beaming-face-with-smiling-eyes '๐Ÿ˜) + (hm/set! emoji-map :grinning-squinting-face '๐Ÿ˜†) + (hm/set! emoji-map :grinning-face-with-sweat '๐Ÿ˜…) + (hm/set! emoji-map :rolling-on-the-floor-laughing '๐Ÿคฃ) + (hm/set! emoji-map :face-with-tears-of-joy '๐Ÿ˜‚) + (hm/set! emoji-map :slightly-smiling-face '๐Ÿ™‚) + (hm/set! emoji-map :upside-down-face '๐Ÿ™ƒ) + (hm/set! emoji-map :winking-face '๐Ÿ˜‰) + (hm/set! emoji-map :smiling-face-with-smiling-eyes '๐Ÿ˜Š) + (hm/set! emoji-map :smiling-face-with-halo '๐Ÿ˜‡) + (hm/set! emoji-map :smiling-face-with-hearts '๐Ÿฅฐ) + (hm/set! emoji-map :smiling-face-with-heart-eyes '๐Ÿ˜) + (hm/set! emoji-map :star-struck '๐Ÿคฉ) + (hm/set! emoji-map :face-blowing-a-kiss '๐Ÿ˜˜) + (hm/set! emoji-map :kissing-face '๐Ÿ˜—) + (hm/set! emoji-map :smiling-face 'โ˜บ๏ธ) + (hm/set! emoji-map :smiling-face 'โ˜บ) + (hm/set! emoji-map :kissing-face-with-closed-eyes '๐Ÿ˜š) + (hm/set! emoji-map :kissing-face-with-smiling-eyes '๐Ÿ˜™) + (hm/set! emoji-map :face-savoring-food '๐Ÿ˜‹) + (hm/set! emoji-map :face-with-tongue '๐Ÿ˜›) + (hm/set! emoji-map :winking-face-with-tongue '๐Ÿ˜œ) + (hm/set! emoji-map :zany-face '๐Ÿคช) + (hm/set! emoji-map :squinting-face-with-tongue '๐Ÿ˜) + (hm/set! emoji-map :money-mouth-face '๐Ÿค‘) + (hm/set! emoji-map :hugging-face '๐Ÿค—) + (hm/set! emoji-map :face-with-hand-over-mouth '๐Ÿคญ) + (hm/set! emoji-map :shushing-face '๐Ÿคซ) + (hm/set! emoji-map :thinking-face '๐Ÿค”) + (hm/set! emoji-map :zipper-mouth-face '๐Ÿค) + (hm/set! emoji-map :face-with-raised-eyebrow '๐Ÿคจ) + (hm/set! emoji-map :neutral-face '๐Ÿ˜) + (hm/set! emoji-map :expressionless-face '๐Ÿ˜‘) + (hm/set! emoji-map :face-without-mouth '๐Ÿ˜ถ) + (hm/set! emoji-map :smirking-face '๐Ÿ˜) + (hm/set! emoji-map :unamused-face '๐Ÿ˜’) + (hm/set! emoji-map :face-with-rolling-eyes '๐Ÿ™„) + (hm/set! emoji-map :grimacing-face '๐Ÿ˜ฌ) + (hm/set! emoji-map :lying-face '๐Ÿคฅ) + (hm/set! emoji-map :relieved-face '๐Ÿ˜Œ) + (hm/set! emoji-map :pensive-face '๐Ÿ˜”) + (hm/set! emoji-map :sleepy-face '๐Ÿ˜ช) + (hm/set! emoji-map :drooling-face '๐Ÿคค) + (hm/set! emoji-map :sleeping-face '๐Ÿ˜ด) + (hm/set! emoji-map :face-with-medical-mask '๐Ÿ˜ท) + (hm/set! emoji-map :face-with-thermometer '๐Ÿค’) + (hm/set! emoji-map :face-with-head-bandage '๐Ÿค•) + (hm/set! emoji-map :nauseated-face '๐Ÿคข) + (hm/set! emoji-map :face-vomiting '๐Ÿคฎ) + (hm/set! emoji-map :sneezing-face '๐Ÿคง) + (hm/set! emoji-map :hot-face '๐Ÿฅต) + (hm/set! emoji-map :cold-face '๐Ÿฅถ) + (hm/set! emoji-map :woozy-face '๐Ÿฅด) + (hm/set! emoji-map :dizzy-face '๐Ÿ˜ต) + (hm/set! emoji-map :exploding-head '๐Ÿคฏ) + (hm/set! emoji-map :cowboy-hat-face '๐Ÿค ) + (hm/set! emoji-map :partying-face '๐Ÿฅณ) + (hm/set! emoji-map :smiling-face-with-sunglasses '๐Ÿ˜Ž) + (hm/set! emoji-map :nerd-face '๐Ÿค“) + (hm/set! emoji-map :face-with-monocle '๐Ÿง) + (hm/set! emoji-map :confused-face '๐Ÿ˜•) + (hm/set! emoji-map :worried-face '๐Ÿ˜Ÿ) + (hm/set! emoji-map :slightly-frowning-face '๐Ÿ™) + (hm/set! emoji-map :frowning-face 'โ˜น๏ธ) + (hm/set! emoji-map :frowning-face 'โ˜น) + (hm/set! emoji-map :face-with-open-mouth '๐Ÿ˜ฎ) + (hm/set! emoji-map :hushed-face '๐Ÿ˜ฏ) + (hm/set! emoji-map :astonished-face '๐Ÿ˜ฒ) + (hm/set! emoji-map :flushed-face '๐Ÿ˜ณ) + (hm/set! emoji-map :pleading-face '๐Ÿฅบ) + (hm/set! emoji-map :frowning-face-with-open-mouth '๐Ÿ˜ฆ) + (hm/set! emoji-map :anguished-face '๐Ÿ˜ง) + (hm/set! emoji-map :fearful-face '๐Ÿ˜จ) + (hm/set! emoji-map :anxious-face-with-sweat '๐Ÿ˜ฐ) + (hm/set! emoji-map :sad-but-relieved-face '๐Ÿ˜ฅ) + (hm/set! emoji-map :crying-face '๐Ÿ˜ข) + (hm/set! emoji-map :loudly-crying-face '๐Ÿ˜ญ) + (hm/set! emoji-map :face-screaming-in-fear '๐Ÿ˜ฑ) + (hm/set! emoji-map :confounded-face '๐Ÿ˜–) + (hm/set! emoji-map :persevering-face '๐Ÿ˜ฃ) + (hm/set! emoji-map :disappointed-face '๐Ÿ˜ž) + (hm/set! emoji-map :downcast-face-with-sweat '๐Ÿ˜“) + (hm/set! emoji-map :weary-face '๐Ÿ˜ฉ) + (hm/set! emoji-map :tired-face '๐Ÿ˜ซ) + (hm/set! emoji-map :yawning-face '๐Ÿฅฑ) + (hm/set! emoji-map :face-with-steam-from-nose '๐Ÿ˜ค) + (hm/set! emoji-map :pouting-face '๐Ÿ˜ก) + (hm/set! emoji-map :angry-face '๐Ÿ˜ ) + (hm/set! emoji-map :face-with-symbols-on-mouth '๐Ÿคฌ) + (hm/set! emoji-map :smiling-face-with-horns '๐Ÿ˜ˆ) + (hm/set! emoji-map :angry-face-with-horns '๐Ÿ‘ฟ) + (hm/set! emoji-map :skull '๐Ÿ’€) + (hm/set! emoji-map :skull-and-crossbones 'โ˜ ๏ธ) + (hm/set! emoji-map :skull-and-crossbones 'โ˜ ) + (hm/set! emoji-map :pile-of-poo '๐Ÿ’ฉ) + (hm/set! emoji-map :clown-face '๐Ÿคก) + (hm/set! emoji-map :ogre '๐Ÿ‘น) + (hm/set! emoji-map :goblin '๐Ÿ‘บ) + (hm/set! emoji-map :ghost '๐Ÿ‘ป) + (hm/set! emoji-map :alien '๐Ÿ‘ฝ) + (hm/set! emoji-map :alien-monster '๐Ÿ‘พ) + (hm/set! emoji-map :robot '๐Ÿค–) + (hm/set! emoji-map :grinning-cat '๐Ÿ˜บ) + (hm/set! emoji-map :grinning-cat-with-smiling-eyes '๐Ÿ˜ธ) + (hm/set! emoji-map :cat-with-tears-of-joy '๐Ÿ˜น) + (hm/set! emoji-map :smiling-cat-with-heart-eyes '๐Ÿ˜ป) + (hm/set! emoji-map :cat-with-wry-smile '๐Ÿ˜ผ) + (hm/set! emoji-map :kissing-cat '๐Ÿ˜ฝ) + (hm/set! emoji-map :weary-cat '๐Ÿ™€) + (hm/set! emoji-map :crying-cat '๐Ÿ˜ฟ) + (hm/set! emoji-map :pouting-cat '๐Ÿ˜พ) + (hm/set! emoji-map :see-no-evil-monkey '๐Ÿ™ˆ) + (hm/set! emoji-map :hear-no-evil-monkey '๐Ÿ™‰) + (hm/set! emoji-map :speak-no-evil-monkey '๐Ÿ™Š) + (hm/set! emoji-map :kiss-mark '๐Ÿ’‹) + (hm/set! emoji-map :love-letter '๐Ÿ’Œ) + (hm/set! emoji-map :heart-with-arrow '๐Ÿ’˜) + (hm/set! emoji-map :heart-with-ribbon '๐Ÿ’) + (hm/set! emoji-map :sparkling-heart '๐Ÿ’–) + (hm/set! emoji-map :growing-heart '๐Ÿ’—) + (hm/set! emoji-map :beating-heart '๐Ÿ’“) + (hm/set! emoji-map :revolving-hearts '๐Ÿ’ž) + (hm/set! emoji-map :two-hearts '๐Ÿ’•) + (hm/set! emoji-map :heart-decoration '๐Ÿ’Ÿ) + (hm/set! emoji-map :heart-exclamation 'โฃ๏ธ) + (hm/set! emoji-map :heart-exclamation 'โฃ) + (hm/set! emoji-map :broken-heart '๐Ÿ’”) + (hm/set! emoji-map :red-heart 'โค๏ธ) + (hm/set! emoji-map :red-heart 'โค) + (hm/set! emoji-map :orange-heart '๐Ÿงก) + (hm/set! emoji-map :yellow-heart '๐Ÿ’›) + (hm/set! emoji-map :green-heart '๐Ÿ’š) + (hm/set! emoji-map :blue-heart '๐Ÿ’™) + (hm/set! emoji-map :purple-heart '๐Ÿ’œ) + (hm/set! emoji-map :brown-heart '๐ŸคŽ) + (hm/set! emoji-map :black-heart '๐Ÿ–ค) + (hm/set! emoji-map :white-heart '๐Ÿค) + (hm/set! emoji-map :hundred-points '๐Ÿ’ฏ) + (hm/set! emoji-map :anger-symbol '๐Ÿ’ข) + (hm/set! emoji-map :collision '๐Ÿ’ฅ) + (hm/set! emoji-map :dizzy '๐Ÿ’ซ) + (hm/set! emoji-map :sweat-droplets '๐Ÿ’ฆ) + (hm/set! emoji-map :dashing-away '๐Ÿ’จ) + (hm/set! emoji-map :hole '๐Ÿ•ณ๏ธ) + (hm/set! emoji-map :hole '๐Ÿ•ณ) + (hm/set! emoji-map :bomb '๐Ÿ’ฃ) + (hm/set! emoji-map :speech-balloon '๐Ÿ’ฌ) + (hm/set! emoji-map :eye-in-speech-bubble '๐Ÿ‘๏ธ๐Ÿ—จ๏ธ) + (hm/set! emoji-map :eye-in-speech-bubble '๐Ÿ‘๐Ÿ—จ๏ธ) + (hm/set! emoji-map :eye-in-speech-bubble '๐Ÿ‘๏ธ๐Ÿ—จ) + (hm/set! emoji-map :eye-in-speech-bubble '๐Ÿ‘๐Ÿ—จ) + (hm/set! emoji-map :left-speech-bubble '๐Ÿ—จ๏ธ) + (hm/set! emoji-map :left-speech-bubble '๐Ÿ—จ) + (hm/set! emoji-map :right-anger-bubble '๐Ÿ—ฏ๏ธ) + (hm/set! emoji-map :right-anger-bubble '๐Ÿ—ฏ) + (hm/set! emoji-map :thought-balloon '๐Ÿ’ญ) + (hm/set! emoji-map :zzz '๐Ÿ’ค) + (hm/set! emoji-map :waving-hand:-light-skin-toneg1F44B-1F3FC '๐Ÿ‘‹๐Ÿป) + (hm/set! emoji-map :waving-hand:-medium-light-skin-tone '๐Ÿ‘‹๐Ÿผ) + (hm/set! emoji-map :waving-hand:-medium-skin-tone '๐Ÿ‘‹๐Ÿฝ) + (hm/set! emoji-map :waving-hand:-medium-dark-skin-tone '๐Ÿ‘‹๐Ÿพ) + (hm/set! emoji-map :waving-hand:-dark-skin-tone '๐Ÿ‘‹๐Ÿฟ) + (hm/set! emoji-map :raised-back-of-hand '๐Ÿคš) + (hm/set! emoji-map :raised-back-of-hand:-light-skin-tone '๐Ÿคš๐Ÿป) + (hm/set! emoji-map :raised-back-of-hand:-medium-light-skin-tone '๐Ÿคš๐Ÿผ) + (hm/set! emoji-map :raised-back-of-hand:-medium-skin-tone '๐Ÿคš๐Ÿฝ) + (hm/set! emoji-map :raised-back-of-hand:-medium-dark-skin-tone '๐Ÿคš๐Ÿพ) + (hm/set! emoji-map :raised-back-of-hand:-dark-skin-tone '๐Ÿคš๐Ÿฟ) + (hm/set! emoji-map :hand-with-fingers-splayed '๐Ÿ–๏ธ) + (hm/set! emoji-map :hand-with-fingers-splayed '๐Ÿ–) + (hm/set! emoji-map :hand-with-fingers-splayed:-light-skin-tone '๐Ÿ–๐Ÿป) + (hm/set! emoji-map :hand-with-fingers-splayed:-medium-light-skin-tone '๐Ÿ–๐Ÿผ) + (hm/set! emoji-map :hand-with-fingers-splayed:-medium-skin-tone '๐Ÿ–๐Ÿฝ) + (hm/set! emoji-map :hand-with-fingers-splayed:-medium-dark-skin-tone '๐Ÿ–๐Ÿพ) + (hm/set! emoji-map :hand-with-fingers-splayed:-dark-skin-tone '๐Ÿ–๐Ÿฟ) + (hm/set! emoji-map :raised-hand 'โœ‹) + (hm/set! emoji-map :raised-hand:-light-skin-tone 'โœ‹๐Ÿป) + (hm/set! emoji-map :raised-hand:-medium-light-skin-tone 'โœ‹๐Ÿผ) + (hm/set! emoji-map :raised-hand:-medium-skin-tone 'โœ‹๐Ÿฝ) + (hm/set! emoji-map :raised-hand:-medium-dark-skin-tone 'โœ‹๐Ÿพ) + (hm/set! emoji-map :raised-hand:-dark-skin-tone 'โœ‹๐Ÿฟ) + (hm/set! emoji-map :vulcan-salute '๐Ÿ––) + (hm/set! emoji-map :vulcan-salute:-light-skin-tone '๐Ÿ––๐Ÿป) + (hm/set! emoji-map :vulcan-salute:-medium-light-skin-tone '๐Ÿ––๐Ÿผ) + (hm/set! emoji-map :vulcan-salute:-medium-skin-tone '๐Ÿ––๐Ÿฝ) + (hm/set! emoji-map :vulcan-salute:-medium-dark-skin-tone '๐Ÿ––๐Ÿพ) + (hm/set! emoji-map :vulcan-salute:-dark-skin-tone '๐Ÿ––๐Ÿฟ) + (hm/set! emoji-map :OK-hand '๐Ÿ‘Œ) + (hm/set! emoji-map :OK-hand:-light-skin-tone '๐Ÿ‘Œ๐Ÿป) + (hm/set! emoji-map :OK-hand:-medium-light-skin-tone '๐Ÿ‘Œ๐Ÿผ) + (hm/set! emoji-map :OK-hand:-medium-skin-tone '๐Ÿ‘Œ๐Ÿฝ) + (hm/set! emoji-map :OK-hand:-medium-dark-skin-tone '๐Ÿ‘Œ๐Ÿพ) + (hm/set! emoji-map :OK-hand:-dark-skin-tone '๐Ÿ‘Œ๐Ÿฟ) + (hm/set! emoji-map :pinching-hand '๐Ÿค) + (hm/set! emoji-map :pinching-hand:-light-skin-tone '๐Ÿค๐Ÿป) + (hm/set! emoji-map :pinching-hand:-medium-light-skin-tone '๐Ÿค๐Ÿผ) + (hm/set! emoji-map :pinching-hand:-medium-skin-tone '๐Ÿค๐Ÿฝ) + (hm/set! emoji-map :pinching-hand:-medium-dark-skin-tone '๐Ÿค๐Ÿพ) + (hm/set! emoji-map :pinching-hand:-dark-skin-tone '๐Ÿค๐Ÿฟ) + (hm/set! emoji-map :victory-hand 'โœŒ๏ธ) + (hm/set! emoji-map :victory-hand 'โœŒ) + (hm/set! emoji-map :victory-hand:-light-skin-tone 'โœŒ๐Ÿป) + (hm/set! emoji-map :victory-hand:-medium-light-skin-tone 'โœŒ๐Ÿผ) + (hm/set! emoji-map :victory-hand:-medium-skin-tone 'โœŒ๐Ÿฝ) + (hm/set! emoji-map :victory-hand:-medium-dark-skin-tone 'โœŒ๐Ÿพ) + (hm/set! emoji-map :victory-hand:-dark-skin-tone 'โœŒ๐Ÿฟ) + (hm/set! emoji-map :crossed-fingers '๐Ÿคž) + (hm/set! emoji-map :crossed-fingers:-light-skin-tone '๐Ÿคž๐Ÿป) + (hm/set! emoji-map :crossed-fingers:-medium-light-skin-tone '๐Ÿคž๐Ÿผ) + (hm/set! emoji-map :crossed-fingers:-medium-skin-tone '๐Ÿคž๐Ÿฝ) + (hm/set! emoji-map :crossed-fingers:-medium-dark-skin-tone '๐Ÿคž๐Ÿพ) + (hm/set! emoji-map :crossed-fingers:-dark-skin-tone '๐Ÿคž๐Ÿฟ) + (hm/set! emoji-map :love-you-gesture '๐ŸคŸ) + (hm/set! emoji-map :love-you-gesture:-light-skin-tone '๐ŸคŸ๐Ÿป) + (hm/set! emoji-map :love-you-gesture:-medium-light-skin-tone '๐ŸคŸ๐Ÿผ) + (hm/set! emoji-map :love-you-gesture:-medium-skin-tone '๐ŸคŸ๐Ÿฝ) + (hm/set! emoji-map :love-you-gesture:-medium-dark-skin-tone '๐ŸคŸ๐Ÿพ) + (hm/set! emoji-map :love-you-gesture:-dark-skin-tone '๐ŸคŸ๐Ÿฟ) + (hm/set! emoji-map :sign-of-the-horns '๐Ÿค˜) + (hm/set! emoji-map :sign-of-the-horns:-light-skin-tone '๐Ÿค˜๐Ÿป) + (hm/set! emoji-map :sign-of-the-horns:-medium-light-skin-tone '๐Ÿค˜๐Ÿผ) + (hm/set! emoji-map :sign-of-the-horns:-medium-skin-tone '๐Ÿค˜๐Ÿฝ) + (hm/set! emoji-map :sign-of-the-horns:-medium-dark-skin-tone '๐Ÿค˜๐Ÿพ) + (hm/set! emoji-map :sign-of-the-horns:-dark-skin-tone '๐Ÿค˜๐Ÿฟ) + (hm/set! emoji-map :call-me-hand '๐Ÿค™) + (hm/set! emoji-map :call-me-hand:-light-skin-tone '๐Ÿค™๐Ÿป) + (hm/set! emoji-map :call-me-hand:-medium-light-skin-tone '๐Ÿค™๐Ÿผ) + (hm/set! emoji-map :call-me-hand:-medium-skin-tone '๐Ÿค™๐Ÿฝ) + (hm/set! emoji-map :call-me-hand:-medium-dark-skin-tone '๐Ÿค™๐Ÿพ) + (hm/set! emoji-map :call-me-hand:-dark-skin-tone '๐Ÿค™๐Ÿฟ) + (hm/set! emoji-map :backhand-index-pointing-left '๐Ÿ‘ˆ) + (hm/set! emoji-map :backhand-index-pointing-left:-light-skin-tone '๐Ÿ‘ˆ๐Ÿป) + (hm/set! emoji-map :backhand-index-pointing-left:-medium-light-skin-tone '๐Ÿ‘ˆ๐Ÿผ) + (hm/set! emoji-map :backhand-index-pointing-left:-medium-skin-tone '๐Ÿ‘ˆ๐Ÿฝ) + (hm/set! emoji-map :backhand-index-pointing-left:-medium-dark-skin-tone '๐Ÿ‘ˆ๐Ÿพ) + (hm/set! emoji-map :backhand-index-pointing-left:-dark-skin-tone '๐Ÿ‘ˆ๐Ÿฟ) + (hm/set! emoji-map :backhand-index-pointing-right '๐Ÿ‘‰) + (hm/set! emoji-map :backhand-index-pointing-right:-light-skin-tone '๐Ÿ‘‰๐Ÿป) + (hm/set! emoji-map :backhand-index-pointing-right:-medium-light-skin-tone '๐Ÿ‘‰๐Ÿผ) + (hm/set! emoji-map :backhand-index-pointing-right:-medium-skin-tone '๐Ÿ‘‰๐Ÿฝ) + (hm/set! emoji-map :backhand-index-pointing-right:-medium-dark-skin-tone '๐Ÿ‘‰๐Ÿพ) + (hm/set! emoji-map :backhand-index-pointing-right:-dark-skin-tone '๐Ÿ‘‰๐Ÿฟ) + (hm/set! emoji-map :backhand-index-pointing-up '๐Ÿ‘†) + (hm/set! emoji-map :backhand-index-pointing-up:-light-skin-tone '๐Ÿ‘†๐Ÿป) + (hm/set! emoji-map :backhand-index-pointing-up:-medium-light-skin-tone '๐Ÿ‘†๐Ÿผ) + (hm/set! emoji-map :backhand-index-pointing-up:-medium-skin-tone '๐Ÿ‘†๐Ÿฝ) + (hm/set! emoji-map :backhand-index-pointing-up:-medium-dark-skin-tone '๐Ÿ‘†๐Ÿพ) + (hm/set! emoji-map :backhand-index-pointing-up:-dark-skin-tone '๐Ÿ‘†๐Ÿฟ) + (hm/set! emoji-map :middle-finger '๐Ÿ–•) + (hm/set! emoji-map :middle-finger:-light-skin-tone '๐Ÿ–•๐Ÿป) + (hm/set! emoji-map :middle-finger:-medium-light-skin-tone '๐Ÿ–•๐Ÿผ) + (hm/set! emoji-map :middle-finger:-medium-skin-tone '๐Ÿ–•๐Ÿฝ) + (hm/set! emoji-map :middle-finger:-medium-dark-skin-tone '๐Ÿ–•๐Ÿพ) + (hm/set! emoji-map :middle-finger:-dark-skin-tone '๐Ÿ–•๐Ÿฟ) + (hm/set! emoji-map :backhand-index-pointing-down '๐Ÿ‘‡) + (hm/set! emoji-map :backhand-index-pointing-down:-light-skin-tone '๐Ÿ‘‡๐Ÿป) + (hm/set! emoji-map :backhand-index-pointing-down:-medium-light-skin-tone '๐Ÿ‘‡๐Ÿผ) + (hm/set! emoji-map :backhand-index-pointing-down:-medium-skin-tone '๐Ÿ‘‡๐Ÿฝ) + (hm/set! emoji-map :backhand-index-pointing-down:-medium-dark-skin-tone '๐Ÿ‘‡๐Ÿพ) + (hm/set! emoji-map :backhand-index-pointing-down:-dark-skin-tone '๐Ÿ‘‡๐Ÿฟ) + (hm/set! emoji-map :index-pointing-up 'โ˜๏ธ) + (hm/set! emoji-map :index-pointing-up 'โ˜) + (hm/set! emoji-map :index-pointing-up:-light-skin-tone 'โ˜๐Ÿป) + (hm/set! emoji-map :index-pointing-up:-medium-light-skin-tone 'โ˜๐Ÿผ) + (hm/set! emoji-map :index-pointing-up:-medium-skin-tone 'โ˜๐Ÿฝ) + (hm/set! emoji-map :index-pointing-up:-medium-dark-skin-tone 'โ˜๐Ÿพ) + (hm/set! emoji-map :index-pointing-up:-dark-skin-tone 'โ˜๐Ÿฟ) + (hm/set! emoji-map :thumbs-up '๐Ÿ‘) + (hm/set! emoji-map :thumbs-up:-light-skin-tone '๐Ÿ‘๐Ÿป) + (hm/set! emoji-map :thumbs-up:-medium-light-skin-tone '๐Ÿ‘๐Ÿผ) + (hm/set! emoji-map :thumbs-up:-medium-skin-tone '๐Ÿ‘๐Ÿฝ) + (hm/set! emoji-map :thumbs-up:-medium-dark-skin-tone '๐Ÿ‘๐Ÿพ) + (hm/set! emoji-map :thumbs-up:-dark-skin-tone '๐Ÿ‘๐Ÿฟ) + (hm/set! emoji-map :thumbs-down '๐Ÿ‘Ž) + (hm/set! emoji-map :thumbs-down:-light-skin-tone '๐Ÿ‘Ž๐Ÿป) + (hm/set! emoji-map :thumbs-down:-medium-light-skin-tone '๐Ÿ‘Ž๐Ÿผ) + (hm/set! emoji-map :thumbs-down:-medium-skin-tone '๐Ÿ‘Ž๐Ÿฝ) + (hm/set! emoji-map :thumbs-down:-medium-dark-skin-tone '๐Ÿ‘Ž๐Ÿพ) + (hm/set! emoji-map :thumbs-down:-dark-skin-tone '๐Ÿ‘Ž๐Ÿฟ) + (hm/set! emoji-map :raised-fist 'โœŠ) + (hm/set! emoji-map :raised-fist:-light-skin-tone 'โœŠ๐Ÿป) + (hm/set! emoji-map :raised-fist:-medium-light-skin-tone 'โœŠ๐Ÿผ) + (hm/set! emoji-map :raised-fist:-medium-skin-tone 'โœŠ๐Ÿฝ) + (hm/set! emoji-map :raised-fist:-medium-dark-skin-tone 'โœŠ๐Ÿพ) + (hm/set! emoji-map :raised-fist:-dark-skin-tone 'โœŠ๐Ÿฟ) + (hm/set! emoji-map :oncoming-fist '๐Ÿ‘Š) + (hm/set! emoji-map :oncoming-fist:-light-skin-tone '๐Ÿ‘Š๐Ÿป) + (hm/set! emoji-map :oncoming-fist:-medium-light-skin-tone '๐Ÿ‘Š๐Ÿผ) + (hm/set! emoji-map :oncoming-fist:-medium-skin-tone '๐Ÿ‘Š๐Ÿฝ) + (hm/set! emoji-map :oncoming-fist:-medium-dark-skin-tone '๐Ÿ‘Š๐Ÿพ) + (hm/set! emoji-map :oncoming-fist:-dark-skin-tone '๐Ÿ‘Š๐Ÿฟ) + (hm/set! emoji-map :left-facing-fist '๐Ÿค›) + (hm/set! emoji-map :left-facing-fist:-light-skin-tone '๐Ÿค›๐Ÿป) + (hm/set! emoji-map :left-facing-fist:-medium-light-skin-tone '๐Ÿค›๐Ÿผ) + (hm/set! emoji-map :left-facing-fist:-medium-skin-tone '๐Ÿค›๐Ÿฝ) + (hm/set! emoji-map :left-facing-fist:-medium-dark-skin-tone '๐Ÿค›๐Ÿพ) + (hm/set! emoji-map :left-facing-fist:-dark-skin-tone '๐Ÿค›๐Ÿฟ) + (hm/set! emoji-map :right-facing-fist '๐Ÿคœ) + (hm/set! emoji-map :right-facing-fist:-light-skin-tone '๐Ÿคœ๐Ÿป) + (hm/set! emoji-map :right-facing-fist:-medium-light-skin-tone '๐Ÿคœ๐Ÿผ) + (hm/set! emoji-map :right-facing-fist:-medium-skin-tone '๐Ÿคœ๐Ÿฝ) + (hm/set! emoji-map :right-facing-fist:-medium-dark-skin-tone '๐Ÿคœ๐Ÿพ) + (hm/set! emoji-map :right-facing-fist:-dark-skin-tone '๐Ÿคœ๐Ÿฟ) + (hm/set! emoji-map :clapping-hands '๐Ÿ‘) + (hm/set! emoji-map :clapping-hands:-light-skin-tone '๐Ÿ‘๐Ÿป) + (hm/set! emoji-map :clapping-hands:-medium-light-skin-tone '๐Ÿ‘๐Ÿผ) + (hm/set! emoji-map :clapping-hands:-medium-skin-tone '๐Ÿ‘๐Ÿฝ) + (hm/set! emoji-map :clapping-hands:-medium-dark-skin-tone '๐Ÿ‘๐Ÿพ) + (hm/set! emoji-map :clapping-hands:-dark-skin-tone '๐Ÿ‘๐Ÿฟ) + (hm/set! emoji-map :raising-hands '๐Ÿ™Œ) + (hm/set! emoji-map :raising-hands:-light-skin-tone '๐Ÿ™Œ๐Ÿป) + (hm/set! emoji-map :raising-hands:-medium-light-skin-tone '๐Ÿ™Œ๐Ÿผ) + (hm/set! emoji-map :raising-hands:-medium-skin-tone '๐Ÿ™Œ๐Ÿฝ) + (hm/set! emoji-map :raising-hands:-medium-dark-skin-tone '๐Ÿ™Œ๐Ÿพ) + (hm/set! emoji-map :raising-hands:-dark-skin-tone '๐Ÿ™Œ๐Ÿฟ) + (hm/set! emoji-map :open-hands '๐Ÿ‘) + (hm/set! emoji-map :open-hands:-light-skin-tone '๐Ÿ‘๐Ÿป) + (hm/set! emoji-map :open-hands:-medium-light-skin-tone '๐Ÿ‘๐Ÿผ) + (hm/set! emoji-map :open-hands:-medium-skin-tone '๐Ÿ‘๐Ÿฝ) + (hm/set! emoji-map :open-hands:-medium-dark-skin-tone '๐Ÿ‘๐Ÿพ) + (hm/set! emoji-map :open-hands:-dark-skin-tone '๐Ÿ‘๐Ÿฟ) + (hm/set! emoji-map :palms-up-together '๐Ÿคฒ) + (hm/set! emoji-map :palms-up-together:-light-skin-tone '๐Ÿคฒ๐Ÿป) + (hm/set! emoji-map :palms-up-together:-medium-light-skin-tone '๐Ÿคฒ๐Ÿผ) + (hm/set! emoji-map :palms-up-together:-medium-skin-tone '๐Ÿคฒ๐Ÿฝ) + (hm/set! emoji-map :palms-up-together:-medium-dark-skin-tone '๐Ÿคฒ๐Ÿพ) + (hm/set! emoji-map :palms-up-together:-dark-skin-tone '๐Ÿคฒ๐Ÿฟ) + (hm/set! emoji-map :handshake '๐Ÿค) + (hm/set! emoji-map :folded-hands '๐Ÿ™) + (hm/set! emoji-map :folded-hands:-light-skin-tone '๐Ÿ™๐Ÿป) + (hm/set! emoji-map :folded-hands:-medium-light-skin-tone '๐Ÿ™๐Ÿผ) + (hm/set! emoji-map :folded-hands:-medium-skin-tone '๐Ÿ™๐Ÿฝ) + (hm/set! emoji-map :folded-hands:-medium-dark-skin-tone '๐Ÿ™๐Ÿพ) + (hm/set! emoji-map :folded-hands:-dark-skin-tone '๐Ÿ™๐Ÿฟ) + (hm/set! emoji-map :writing-hand 'โœ๏ธ) + (hm/set! emoji-map :writing-hand 'โœ) + (hm/set! emoji-map :writing-hand:-light-skin-tone 'โœ๐Ÿป) + (hm/set! emoji-map :writing-hand:-medium-light-skin-tone 'โœ๐Ÿผ) + (hm/set! emoji-map :writing-hand:-medium-skin-tone 'โœ๐Ÿฝ) + (hm/set! emoji-map :writing-hand:-medium-dark-skin-tone 'โœ๐Ÿพ) + (hm/set! emoji-map :writing-hand:-dark-skin-tone 'โœ๐Ÿฟ) + (hm/set! emoji-map :nail-polish '๐Ÿ’…) + (hm/set! emoji-map :nail-polish:-light-skin-tone '๐Ÿ’…๐Ÿป) + (hm/set! emoji-map :nail-polish:-medium-light-skin-tone '๐Ÿ’…๐Ÿผ) + (hm/set! emoji-map :nail-polish:-medium-skin-tone '๐Ÿ’…๐Ÿฝ) + (hm/set! emoji-map :nail-polish:-medium-dark-skin-tone '๐Ÿ’…๐Ÿพ) + (hm/set! emoji-map :nail-polish:-dark-skin-tone '๐Ÿ’…๐Ÿฟ) + (hm/set! emoji-map :selfie '๐Ÿคณ) + (hm/set! emoji-map :selfie:-light-skin-tone '๐Ÿคณ๐Ÿป) + (hm/set! emoji-map :selfie:-medium-light-skin-tone '๐Ÿคณ๐Ÿผ) + (hm/set! emoji-map :selfie:-medium-skin-tone '๐Ÿคณ๐Ÿฝ) + (hm/set! emoji-map :selfie:-medium-dark-skin-tone '๐Ÿคณ๐Ÿพ) + (hm/set! emoji-map :selfie:-dark-skin-tone '๐Ÿคณ๐Ÿฟ) + (hm/set! emoji-map :flexed-biceps '๐Ÿ’ช) + (hm/set! emoji-map :flexed-biceps:-light-skin-tone '๐Ÿ’ช๐Ÿป) + (hm/set! emoji-map :flexed-biceps:-medium-light-skin-tone '๐Ÿ’ช๐Ÿผ) + (hm/set! emoji-map :flexed-biceps:-medium-skin-tone '๐Ÿ’ช๐Ÿฝ) + (hm/set! emoji-map :flexed-biceps:-medium-dark-skin-tone '๐Ÿ’ช๐Ÿพ) + (hm/set! emoji-map :flexed-biceps:-dark-skin-tone '๐Ÿ’ช๐Ÿฟ) + (hm/set! emoji-map :mechanical-arm '๐Ÿฆพ) + (hm/set! emoji-map :mechanical-leg '๐Ÿฆฟ) + (hm/set! emoji-map :leg '๐Ÿฆต) + (hm/set! emoji-map :leg:-light-skin-tone '๐Ÿฆต๐Ÿป) + (hm/set! emoji-map :leg:-medium-light-skin-tone '๐Ÿฆต๐Ÿผ) + (hm/set! emoji-map :leg:-medium-skin-tone '๐Ÿฆต๐Ÿฝ) + (hm/set! emoji-map :leg:-medium-dark-skin-tone '๐Ÿฆต๐Ÿพ) + (hm/set! emoji-map :leg:-dark-skin-tone '๐Ÿฆต๐Ÿฟ) + (hm/set! emoji-map :foot '๐Ÿฆถ) + (hm/set! emoji-map :foot:-light-skin-tone '๐Ÿฆถ๐Ÿป) + (hm/set! emoji-map :foot:-medium-light-skin-tone '๐Ÿฆถ๐Ÿผ) + (hm/set! emoji-map :foot:-medium-skin-tone '๐Ÿฆถ๐Ÿฝ) + (hm/set! emoji-map :foot:-medium-dark-skin-tone '๐Ÿฆถ๐Ÿพ) + (hm/set! emoji-map :foot:-dark-skin-tone '๐Ÿฆถ๐Ÿฟ) + (hm/set! emoji-map :ear '๐Ÿ‘‚) + (hm/set! emoji-map :ear:-light-skin-tone '๐Ÿ‘‚๐Ÿป) + (hm/set! emoji-map :ear:-medium-light-skin-tone '๐Ÿ‘‚๐Ÿผ) + (hm/set! emoji-map :ear:-medium-skin-tone '๐Ÿ‘‚๐Ÿฝ) + (hm/set! emoji-map :ear:-medium-dark-skin-tone '๐Ÿ‘‚๐Ÿพ) + (hm/set! emoji-map :ear:-dark-skin-tone '๐Ÿ‘‚๐Ÿฟ) + (hm/set! emoji-map :ear-with-hearing-aid '๐Ÿฆป) + (hm/set! emoji-map :ear-with-hearing-aid:-light-skin-tone '๐Ÿฆป๐Ÿป) + (hm/set! emoji-map :ear-with-hearing-aid:-medium-light-skin-tone '๐Ÿฆป๐Ÿผ) + (hm/set! emoji-map :ear-with-hearing-aid:-medium-skin-tone '๐Ÿฆป๐Ÿฝ) + (hm/set! emoji-map :ear-with-hearing-aid:-medium-dark-skin-tone '๐Ÿฆป๐Ÿพ) + (hm/set! emoji-map :ear-with-hearing-aid:-dark-skin-tone '๐Ÿฆป๐Ÿฟ) + (hm/set! emoji-map :nose '๐Ÿ‘ƒ) + (hm/set! emoji-map :nose:-light-skin-tone '๐Ÿ‘ƒ๐Ÿป) + (hm/set! emoji-map :nose:-medium-light-skin-tone '๐Ÿ‘ƒ๐Ÿผ) + (hm/set! emoji-map :nose:-medium-skin-tone '๐Ÿ‘ƒ๐Ÿฝ) + (hm/set! emoji-map :nose:-medium-dark-skin-tone '๐Ÿ‘ƒ๐Ÿพ) + (hm/set! emoji-map :nose:-dark-skin-tone '๐Ÿ‘ƒ๐Ÿฟ) + (hm/set! emoji-map :brain '๐Ÿง ) + (hm/set! emoji-map :tooth '๐Ÿฆท) + (hm/set! emoji-map :bone '๐Ÿฆด) + (hm/set! emoji-map :eyes '๐Ÿ‘€) + (hm/set! emoji-map :eye '๐Ÿ‘๏ธ) + (hm/set! emoji-map :eye '๐Ÿ‘) + (hm/set! emoji-map :tongue '๐Ÿ‘…) + (hm/set! emoji-map :mouth '๐Ÿ‘„) + (hm/set! emoji-map :baby '๐Ÿ‘ถ) + (hm/set! emoji-map :baby:-light-skin-tone '๐Ÿ‘ถ๐Ÿป) + (hm/set! emoji-map :baby:-medium-light-skin-tone '๐Ÿ‘ถ๐Ÿผ) + (hm/set! emoji-map :baby:-medium-skin-tone '๐Ÿ‘ถ๐Ÿฝ) + (hm/set! emoji-map :baby:-medium-dark-skin-tone '๐Ÿ‘ถ๐Ÿพ) + (hm/set! emoji-map :baby:-dark-skin-tone '๐Ÿ‘ถ๐Ÿฟ) + (hm/set! emoji-map :child '๐Ÿง’) + (hm/set! emoji-map :child:-light-skin-tone '๐Ÿง’๐Ÿป) + (hm/set! emoji-map :child:-medium-light-skin-tone '๐Ÿง’๐Ÿผ) + (hm/set! emoji-map :child:-medium-skin-tone '๐Ÿง’๐Ÿฝ) + (hm/set! emoji-map :child:-medium-dark-skin-tone '๐Ÿง’๐Ÿพ) + (hm/set! emoji-map :child:-dark-skin-tone '๐Ÿง’๐Ÿฟ) + (hm/set! emoji-map :boy '๐Ÿ‘ฆ) + (hm/set! emoji-map :boy:-light-skin-tone '๐Ÿ‘ฆ๐Ÿป) + (hm/set! emoji-map :boy:-medium-light-skin-tone '๐Ÿ‘ฆ๐Ÿผ) + (hm/set! emoji-map :boy:-medium-skin-tone '๐Ÿ‘ฆ๐Ÿฝ) + (hm/set! emoji-map :boy:-medium-dark-skin-tone '๐Ÿ‘ฆ๐Ÿพ) + (hm/set! emoji-map :boy:-dark-skin-tone '๐Ÿ‘ฆ๐Ÿฟ) + (hm/set! emoji-map :girl '๐Ÿ‘ง) + (hm/set! emoji-map :girl:-light-skin-tone '๐Ÿ‘ง๐Ÿป) + (hm/set! emoji-map :girl:-medium-light-skin-tone '๐Ÿ‘ง๐Ÿผ) + (hm/set! emoji-map :girl:-medium-skin-tone '๐Ÿ‘ง๐Ÿฝ) + (hm/set! emoji-map :girl:-medium-dark-skin-tone '๐Ÿ‘ง๐Ÿพ) + (hm/set! emoji-map :girl:-dark-skin-tone '๐Ÿ‘ง๐Ÿฟ) + (hm/set! emoji-map :person '๐Ÿง‘) + (hm/set! emoji-map :person:-light-skin-tone '๐Ÿง‘๐Ÿป) + (hm/set! emoji-map :person:-medium-light-skin-tone '๐Ÿง‘๐Ÿผ) + (hm/set! emoji-map :person:-medium-skin-tone '๐Ÿง‘๐Ÿฝ) + (hm/set! emoji-map :person:-medium-dark-skin-tone '๐Ÿง‘๐Ÿพ) + (hm/set! emoji-map :person:-dark-skin-tone '๐Ÿง‘๐Ÿฟ) + (hm/set! emoji-map :person:-blond-hair '๐Ÿ‘ฑ) + (hm/set! emoji-map :person:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿป) + (hm/set! emoji-map :person:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผ) + (hm/set! emoji-map :person:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝ) + (hm/set! emoji-map :person:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพ) + (hm/set! emoji-map :person:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟ) + (hm/set! emoji-map :man '๐Ÿ‘จ) + (hm/set! emoji-map :man:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :man:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :man:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :man:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :man:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :man:-beard '๐Ÿง”) + (hm/set! emoji-map :man:-light-skin-tone-beard '๐Ÿง”๐Ÿป) + (hm/set! emoji-map :man:-medium-light-skin-tone-beard '๐Ÿง”๐Ÿผ) + (hm/set! emoji-map :man:-medium-skin-tone-beard '๐Ÿง”๐Ÿฝ) + (hm/set! emoji-map :man:-medium-dark-skin-tone-beard '๐Ÿง”๐Ÿพ) + (hm/set! emoji-map :man:-dark-skin-tone-beard '๐Ÿง”๐Ÿฟ) + (hm/set! emoji-map :man:-blond-hair '๐Ÿ‘ฑโ™‚๏ธ) + (hm/set! emoji-map :man:-blond-hair '๐Ÿ‘ฑโ™‚) + (hm/set! emoji-map :man:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿปโ™‚) + (hm/set! emoji-map :man:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผโ™‚) + (hm/set! emoji-map :man:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝโ™‚) + (hm/set! emoji-map :man:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพโ™‚) + (hm/set! emoji-map :man:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟโ™‚) + (hm/set! emoji-map :man:-red-hair '๐Ÿ‘จ๐Ÿฆฐ) + (hm/set! emoji-map :man:-light-skin-tone-red-hair '๐Ÿ‘จ๐Ÿป๐Ÿฆฐ) + (hm/set! emoji-map :man:-medium-light-skin-tone-red-hair '๐Ÿ‘จ๐Ÿผ๐Ÿฆฐ) + (hm/set! emoji-map :man:-medium-skin-tone-red-hair '๐Ÿ‘จ๐Ÿฝ๐Ÿฆฐ) + (hm/set! emoji-map :man:-medium-dark-skin-tone-red-hair '๐Ÿ‘จ๐Ÿพ๐Ÿฆฐ) + (hm/set! emoji-map :man:-dark-skin-tone-red-hair '๐Ÿ‘จ๐Ÿฟ๐Ÿฆฐ) + (hm/set! emoji-map :man:-curly-hair '๐Ÿ‘จ๐Ÿฆฑ) + (hm/set! emoji-map :man:-light-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿป๐Ÿฆฑ) + (hm/set! emoji-map :man:-medium-light-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿผ๐Ÿฆฑ) + (hm/set! emoji-map :man:-medium-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿฝ๐Ÿฆฑ) + (hm/set! emoji-map :man:-medium-dark-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿพ๐Ÿฆฑ) + (hm/set! emoji-map :man:-dark-skin-tone-curly-hair '๐Ÿ‘จ๐Ÿฟ๐Ÿฆฑ) + (hm/set! emoji-map :man:-white-hair '๐Ÿ‘จ๐Ÿฆณ) + (hm/set! emoji-map :man:-light-skin-tone-white-hair '๐Ÿ‘จ๐Ÿป๐Ÿฆณ) + (hm/set! emoji-map :man:-medium-light-skin-tone-white-hair '๐Ÿ‘จ๐Ÿผ๐Ÿฆณ) + (hm/set! emoji-map :man:-medium-skin-tone-white-hair '๐Ÿ‘จ๐Ÿฝ๐Ÿฆณ) + (hm/set! emoji-map :man:-medium-dark-skin-tone-white-hair '๐Ÿ‘จ๐Ÿพ๐Ÿฆณ) + (hm/set! emoji-map :man:-dark-skin-tone-white-hair '๐Ÿ‘จ๐Ÿฟ๐Ÿฆณ) + (hm/set! emoji-map :man:-bald '๐Ÿ‘จ๐Ÿฆฒ) + (hm/set! emoji-map :man:-light-skin-tone-bald '๐Ÿ‘จ๐Ÿป๐Ÿฆฒ) + (hm/set! emoji-map :man:-medium-light-skin-tone-bald '๐Ÿ‘จ๐Ÿผ๐Ÿฆฒ) + (hm/set! emoji-map :man:-medium-skin-tone-bald '๐Ÿ‘จ๐Ÿฝ๐Ÿฆฒ) + (hm/set! emoji-map :man:-medium-dark-skin-tone-bald '๐Ÿ‘จ๐Ÿพ๐Ÿฆฒ) + (hm/set! emoji-map :man:-dark-skin-tone-bald '๐Ÿ‘จ๐Ÿฟ๐Ÿฆฒ) + (hm/set! emoji-map :woman '๐Ÿ‘ฉ) + (hm/set! emoji-map :woman:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :woman:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :woman:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :woman:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :woman:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :woman:-blond-hair '๐Ÿ‘ฑโ™€๏ธ) + (hm/set! emoji-map :woman:-blond-hair '๐Ÿ‘ฑโ™€) + (hm/set! emoji-map :woman:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman:-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿปโ™€) + (hm/set! emoji-map :woman:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman:-medium-light-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿผโ™€) + (hm/set! emoji-map :woman:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman:-medium-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฝโ™€) + (hm/set! emoji-map :woman:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman:-medium-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿพโ™€) + (hm/set! emoji-map :woman:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman:-dark-skin-tone-blond-hair '๐Ÿ‘ฑ๐Ÿฟโ™€) + (hm/set! emoji-map :woman:-red-hair '๐Ÿ‘ฉ๐Ÿฆฐ) + (hm/set! emoji-map :woman:-light-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿป๐Ÿฆฐ) + (hm/set! emoji-map :woman:-medium-light-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿผ๐Ÿฆฐ) + (hm/set! emoji-map :woman:-medium-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿฝ๐Ÿฆฐ) + (hm/set! emoji-map :woman:-medium-dark-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿพ๐Ÿฆฐ) + (hm/set! emoji-map :woman:-dark-skin-tone-red-hair '๐Ÿ‘ฉ๐Ÿฟ๐Ÿฆฐ) + (hm/set! emoji-map :woman:-curly-hair '๐Ÿ‘ฉ๐Ÿฆฑ) + (hm/set! emoji-map :woman:-light-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿป๐Ÿฆฑ) + (hm/set! emoji-map :woman:-medium-light-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿผ๐Ÿฆฑ) + (hm/set! emoji-map :woman:-medium-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿฝ๐Ÿฆฑ) + (hm/set! emoji-map :woman:-medium-dark-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿพ๐Ÿฆฑ) + (hm/set! emoji-map :woman:-dark-skin-tone-curly-hair '๐Ÿ‘ฉ๐Ÿฟ๐Ÿฆฑ) + (hm/set! emoji-map :woman:-white-hair '๐Ÿ‘ฉ๐Ÿฆณ) + (hm/set! emoji-map :woman:-light-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿป๐Ÿฆณ) + (hm/set! emoji-map :woman:-medium-light-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿผ๐Ÿฆณ) + (hm/set! emoji-map :woman:-medium-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿฝ๐Ÿฆณ) + (hm/set! emoji-map :woman:-medium-dark-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿพ๐Ÿฆณ) + (hm/set! emoji-map :woman:-dark-skin-tone-white-hair '๐Ÿ‘ฉ๐Ÿฟ๐Ÿฆณ) + (hm/set! emoji-map :woman:-bald '๐Ÿ‘ฉ๐Ÿฆฒ) + (hm/set! emoji-map :woman:-light-skin-tone-bald '๐Ÿ‘ฉ๐Ÿป๐Ÿฆฒ) + (hm/set! emoji-map :woman:-medium-light-skin-tone-bald '๐Ÿ‘ฉ๐Ÿผ๐Ÿฆฒ) + (hm/set! emoji-map :woman:-medium-skin-tone-bald '๐Ÿ‘ฉ๐Ÿฝ๐Ÿฆฒ) + (hm/set! emoji-map :woman:-medium-dark-skin-tone-bald '๐Ÿ‘ฉ๐Ÿพ๐Ÿฆฒ) + (hm/set! emoji-map :woman:-dark-skin-tone-bald '๐Ÿ‘ฉ๐Ÿฟ๐Ÿฆฒ) + (hm/set! emoji-map :older-person '๐Ÿง“) + (hm/set! emoji-map :older-person:-light-skin-tone '๐Ÿง“๐Ÿป) + (hm/set! emoji-map :older-person:-medium-light-skin-tone '๐Ÿง“๐Ÿผ) + (hm/set! emoji-map :older-person:-medium-skin-tone '๐Ÿง“๐Ÿฝ) + (hm/set! emoji-map :older-person:-medium-dark-skin-tone '๐Ÿง“๐Ÿพ) + (hm/set! emoji-map :older-person:-dark-skin-tone '๐Ÿง“๐Ÿฟ) + (hm/set! emoji-map :old-man '๐Ÿ‘ด) + (hm/set! emoji-map :old-man:-light-skin-tone '๐Ÿ‘ด๐Ÿป) + (hm/set! emoji-map :old-man:-medium-light-skin-tone '๐Ÿ‘ด๐Ÿผ) + (hm/set! emoji-map :old-man:-medium-skin-tone '๐Ÿ‘ด๐Ÿฝ) + (hm/set! emoji-map :old-man:-medium-dark-skin-tone '๐Ÿ‘ด๐Ÿพ) + (hm/set! emoji-map :old-man:-dark-skin-tone '๐Ÿ‘ด๐Ÿฟ) + (hm/set! emoji-map :old-woman '๐Ÿ‘ต) + (hm/set! emoji-map :old-woman:-light-skin-tone '๐Ÿ‘ต๐Ÿป) + (hm/set! emoji-map :old-woman:-medium-light-skin-tone '๐Ÿ‘ต๐Ÿผ) + (hm/set! emoji-map :old-woman:-medium-skin-tone '๐Ÿ‘ต๐Ÿฝ) + (hm/set! emoji-map :old-woman:-medium-dark-skin-tone '๐Ÿ‘ต๐Ÿพ) + (hm/set! emoji-map :old-woman:-dark-skin-tone '๐Ÿ‘ต๐Ÿฟ) + (hm/set! emoji-map :person-frowning '๐Ÿ™) + (hm/set! emoji-map :person-frowning:-light-skin-tone '๐Ÿ™๐Ÿป) + (hm/set! emoji-map :person-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผ) + (hm/set! emoji-map :person-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝ) + (hm/set! emoji-map :person-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพ) + (hm/set! emoji-map :person-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟ) + (hm/set! emoji-map :man-frowning '๐Ÿ™โ™‚๏ธ) + (hm/set! emoji-map :man-frowning '๐Ÿ™โ™‚) + (hm/set! emoji-map :man-frowning:-light-skin-tone '๐Ÿ™๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-frowning:-light-skin-tone '๐Ÿ™๐Ÿปโ™‚) + (hm/set! emoji-map :man-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผโ™‚) + (hm/set! emoji-map :man-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝโ™‚) + (hm/set! emoji-map :man-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพโ™‚) + (hm/set! emoji-map :man-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-frowning '๐Ÿ™โ™€๏ธ) + (hm/set! emoji-map :woman-frowning '๐Ÿ™โ™€) + (hm/set! emoji-map :woman-frowning:-light-skin-tone '๐Ÿ™๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-frowning:-light-skin-tone '๐Ÿ™๐Ÿปโ™€) + (hm/set! emoji-map :woman-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-frowning:-medium-light-skin-tone '๐Ÿ™๐Ÿผโ™€) + (hm/set! emoji-map :woman-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-frowning:-medium-skin-tone '๐Ÿ™๐Ÿฝโ™€) + (hm/set! emoji-map :woman-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-frowning:-medium-dark-skin-tone '๐Ÿ™๐Ÿพโ™€) + (hm/set! emoji-map :woman-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-frowning:-dark-skin-tone '๐Ÿ™๐Ÿฟโ™€) + (hm/set! emoji-map :person-pouting '๐Ÿ™Ž) + (hm/set! emoji-map :person-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿป) + (hm/set! emoji-map :person-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผ) + (hm/set! emoji-map :person-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝ) + (hm/set! emoji-map :person-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพ) + (hm/set! emoji-map :person-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟ) + (hm/set! emoji-map :man-pouting '๐Ÿ™Žโ™‚๏ธ) + (hm/set! emoji-map :man-pouting '๐Ÿ™Žโ™‚) + (hm/set! emoji-map :man-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿปโ™‚) + (hm/set! emoji-map :man-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผโ™‚) + (hm/set! emoji-map :man-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝโ™‚) + (hm/set! emoji-map :man-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพโ™‚) + (hm/set! emoji-map :man-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-pouting '๐Ÿ™Žโ™€๏ธ) + (hm/set! emoji-map :woman-pouting '๐Ÿ™Žโ™€) + (hm/set! emoji-map :woman-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-pouting:-light-skin-tone '๐Ÿ™Ž๐Ÿปโ™€) + (hm/set! emoji-map :woman-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-pouting:-medium-light-skin-tone '๐Ÿ™Ž๐Ÿผโ™€) + (hm/set! emoji-map :woman-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-pouting:-medium-skin-tone '๐Ÿ™Ž๐Ÿฝโ™€) + (hm/set! emoji-map :woman-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-pouting:-medium-dark-skin-tone '๐Ÿ™Ž๐Ÿพโ™€) + (hm/set! emoji-map :woman-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-pouting:-dark-skin-tone '๐Ÿ™Ž๐Ÿฟโ™€) + (hm/set! emoji-map :person-gesturing-NO '๐Ÿ™…) + (hm/set! emoji-map :person-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿป) + (hm/set! emoji-map :person-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผ) + (hm/set! emoji-map :person-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝ) + (hm/set! emoji-map :person-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพ) + (hm/set! emoji-map :person-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟ) + (hm/set! emoji-map :man-gesturing-NO '๐Ÿ™…โ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-NO '๐Ÿ™…โ™‚) + (hm/set! emoji-map :man-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿปโ™‚) + (hm/set! emoji-map :man-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผโ™‚) + (hm/set! emoji-map :man-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝโ™‚) + (hm/set! emoji-map :man-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพโ™‚) + (hm/set! emoji-map :man-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-gesturing-NO '๐Ÿ™…โ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-NO '๐Ÿ™…โ™€) + (hm/set! emoji-map :woman-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-NO:-light-skin-tone '๐Ÿ™…๐Ÿปโ™€) + (hm/set! emoji-map :woman-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-NO:-medium-light-skin-tone '๐Ÿ™…๐Ÿผโ™€) + (hm/set! emoji-map :woman-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-NO:-medium-skin-tone '๐Ÿ™…๐Ÿฝโ™€) + (hm/set! emoji-map :woman-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-NO:-medium-dark-skin-tone '๐Ÿ™…๐Ÿพโ™€) + (hm/set! emoji-map :woman-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-NO:-dark-skin-tone '๐Ÿ™…๐Ÿฟโ™€) + (hm/set! emoji-map :person-gesturing-OK '๐Ÿ™†) + (hm/set! emoji-map :person-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿป) + (hm/set! emoji-map :person-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผ) + (hm/set! emoji-map :person-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝ) + (hm/set! emoji-map :person-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพ) + (hm/set! emoji-map :person-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟ) + (hm/set! emoji-map :man-gesturing-OK '๐Ÿ™†โ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-OK '๐Ÿ™†โ™‚) + (hm/set! emoji-map :man-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿปโ™‚) + (hm/set! emoji-map :man-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผโ™‚) + (hm/set! emoji-map :man-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝโ™‚) + (hm/set! emoji-map :man-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพโ™‚) + (hm/set! emoji-map :man-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-gesturing-OK '๐Ÿ™†โ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-OK '๐Ÿ™†โ™€) + (hm/set! emoji-map :woman-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-OK:-light-skin-tone '๐Ÿ™†๐Ÿปโ™€) + (hm/set! emoji-map :woman-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-OK:-medium-light-skin-tone '๐Ÿ™†๐Ÿผโ™€) + (hm/set! emoji-map :woman-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-OK:-medium-skin-tone '๐Ÿ™†๐Ÿฝโ™€) + (hm/set! emoji-map :woman-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-OK:-medium-dark-skin-tone '๐Ÿ™†๐Ÿพโ™€) + (hm/set! emoji-map :woman-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-gesturing-OK:-dark-skin-tone '๐Ÿ™†๐Ÿฟโ™€) + (hm/set! emoji-map :person-tipping-hand '๐Ÿ’) + (hm/set! emoji-map :person-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿป) + (hm/set! emoji-map :person-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผ) + (hm/set! emoji-map :person-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝ) + (hm/set! emoji-map :person-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพ) + (hm/set! emoji-map :person-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟ) + (hm/set! emoji-map :man-tipping-hand '๐Ÿ’โ™‚๏ธ) + (hm/set! emoji-map :man-tipping-hand '๐Ÿ’โ™‚) + (hm/set! emoji-map :man-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿปโ™‚) + (hm/set! emoji-map :man-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผโ™‚) + (hm/set! emoji-map :man-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝโ™‚) + (hm/set! emoji-map :man-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพโ™‚) + (hm/set! emoji-map :man-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-tipping-hand '๐Ÿ’โ™€๏ธ) + (hm/set! emoji-map :woman-tipping-hand '๐Ÿ’โ™€) + (hm/set! emoji-map :woman-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-tipping-hand:-light-skin-tone '๐Ÿ’๐Ÿปโ™€) + (hm/set! emoji-map :woman-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-tipping-hand:-medium-light-skin-tone '๐Ÿ’๐Ÿผโ™€) + (hm/set! emoji-map :woman-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-tipping-hand:-medium-skin-tone '๐Ÿ’๐Ÿฝโ™€) + (hm/set! emoji-map :woman-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-tipping-hand:-medium-dark-skin-tone '๐Ÿ’๐Ÿพโ™€) + (hm/set! emoji-map :woman-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-tipping-hand:-dark-skin-tone '๐Ÿ’๐Ÿฟโ™€) + (hm/set! emoji-map :person-raising-hand '๐Ÿ™‹) + (hm/set! emoji-map :person-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿป) + (hm/set! emoji-map :person-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผ) + (hm/set! emoji-map :person-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝ) + (hm/set! emoji-map :person-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพ) + (hm/set! emoji-map :person-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟ) + (hm/set! emoji-map :man-raising-hand '๐Ÿ™‹โ™‚๏ธ) + (hm/set! emoji-map :man-raising-hand '๐Ÿ™‹โ™‚) + (hm/set! emoji-map :man-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿปโ™‚) + (hm/set! emoji-map :man-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผโ™‚) + (hm/set! emoji-map :man-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝโ™‚) + (hm/set! emoji-map :man-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพโ™‚) + (hm/set! emoji-map :man-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-raising-hand '๐Ÿ™‹โ™€๏ธ) + (hm/set! emoji-map :woman-raising-hand '๐Ÿ™‹โ™€) + (hm/set! emoji-map :woman-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-raising-hand:-light-skin-tone '๐Ÿ™‹๐Ÿปโ™€) + (hm/set! emoji-map :woman-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-raising-hand:-medium-light-skin-tone '๐Ÿ™‹๐Ÿผโ™€) + (hm/set! emoji-map :woman-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-raising-hand:-medium-skin-tone '๐Ÿ™‹๐Ÿฝโ™€) + (hm/set! emoji-map :woman-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-raising-hand:-medium-dark-skin-tone '๐Ÿ™‹๐Ÿพโ™€) + (hm/set! emoji-map :woman-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-raising-hand:-dark-skin-tone '๐Ÿ™‹๐Ÿฟโ™€) + (hm/set! emoji-map :deaf-person '๐Ÿง) + (hm/set! emoji-map :deaf-person:-light-skin-tone '๐Ÿง๐Ÿป) + (hm/set! emoji-map :deaf-person:-medium-light-skin-tone '๐Ÿง๐Ÿผ) + (hm/set! emoji-map :deaf-person:-medium-skin-tone '๐Ÿง๐Ÿฝ) + (hm/set! emoji-map :deaf-person:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) + (hm/set! emoji-map :deaf-person:-dark-skin-tone '๐Ÿง๐Ÿฟ) + (hm/set! emoji-map :deaf-man '๐Ÿงโ™‚๏ธ) + (hm/set! emoji-map :deaf-man '๐Ÿงโ™‚) + (hm/set! emoji-map :deaf-man:-light-skin-tone '๐Ÿง๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :deaf-man:-light-skin-tone '๐Ÿง๐Ÿปโ™‚) + (hm/set! emoji-map :deaf-man:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :deaf-man:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚) + (hm/set! emoji-map :deaf-man:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :deaf-man:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚) + (hm/set! emoji-map :deaf-man:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :deaf-man:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚) + (hm/set! emoji-map :deaf-man:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :deaf-man:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚) + (hm/set! emoji-map :deaf-woman '๐Ÿงโ™€๏ธ) + (hm/set! emoji-map :deaf-woman '๐Ÿงโ™€) + (hm/set! emoji-map :deaf-woman:-light-skin-tone '๐Ÿง๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :deaf-woman:-light-skin-tone '๐Ÿง๐Ÿปโ™€) + (hm/set! emoji-map :deaf-woman:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :deaf-woman:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™€) + (hm/set! emoji-map :deaf-woman:-medium-skin-tone '๐Ÿง๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :deaf-woman:-medium-skin-tone '๐Ÿง๐Ÿฝโ™€) + (hm/set! emoji-map :deaf-woman:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :deaf-woman:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™€) + (hm/set! emoji-map :deaf-woman:-dark-skin-tone '๐Ÿง๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :deaf-woman:-dark-skin-tone '๐Ÿง๐Ÿฟโ™€) + (hm/set! emoji-map :person-bowing '๐Ÿ™‡) + (hm/set! emoji-map :person-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿป) + (hm/set! emoji-map :person-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผ) + (hm/set! emoji-map :person-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝ) + (hm/set! emoji-map :person-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพ) + (hm/set! emoji-map :person-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟ) + (hm/set! emoji-map :man-bowing '๐Ÿ™‡โ™‚๏ธ) + (hm/set! emoji-map :man-bowing '๐Ÿ™‡โ™‚) + (hm/set! emoji-map :man-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿปโ™‚) + (hm/set! emoji-map :man-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผโ™‚) + (hm/set! emoji-map :man-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝโ™‚) + (hm/set! emoji-map :man-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพโ™‚) + (hm/set! emoji-map :man-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-bowing '๐Ÿ™‡โ™€๏ธ) + (hm/set! emoji-map :woman-bowing '๐Ÿ™‡โ™€) + (hm/set! emoji-map :woman-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-bowing:-light-skin-tone '๐Ÿ™‡๐Ÿปโ™€) + (hm/set! emoji-map :woman-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-bowing:-medium-light-skin-tone '๐Ÿ™‡๐Ÿผโ™€) + (hm/set! emoji-map :woman-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-bowing:-medium-skin-tone '๐Ÿ™‡๐Ÿฝโ™€) + (hm/set! emoji-map :woman-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-bowing:-medium-dark-skin-tone '๐Ÿ™‡๐Ÿพโ™€) + (hm/set! emoji-map :woman-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-bowing:-dark-skin-tone '๐Ÿ™‡๐Ÿฟโ™€) + (hm/set! emoji-map :person-facepalming '๐Ÿคฆ) + (hm/set! emoji-map :person-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿป) + (hm/set! emoji-map :person-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผ) + (hm/set! emoji-map :person-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝ) + (hm/set! emoji-map :person-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพ) + (hm/set! emoji-map :person-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟ) + (hm/set! emoji-map :man-facepalming '๐Ÿคฆโ™‚๏ธ) + (hm/set! emoji-map :man-facepalming '๐Ÿคฆโ™‚) + (hm/set! emoji-map :man-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿปโ™‚) + (hm/set! emoji-map :man-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผโ™‚) + (hm/set! emoji-map :man-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพโ™‚) + (hm/set! emoji-map :man-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-facepalming '๐Ÿคฆโ™€๏ธ) + (hm/set! emoji-map :woman-facepalming '๐Ÿคฆโ™€) + (hm/set! emoji-map :woman-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-facepalming:-light-skin-tone '๐Ÿคฆ๐Ÿปโ™€) + (hm/set! emoji-map :woman-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-facepalming:-medium-light-skin-tone '๐Ÿคฆ๐Ÿผโ™€) + (hm/set! emoji-map :woman-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-facepalming:-medium-skin-tone '๐Ÿคฆ๐Ÿฝโ™€) + (hm/set! emoji-map :woman-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-facepalming:-medium-dark-skin-tone '๐Ÿคฆ๐Ÿพโ™€) + (hm/set! emoji-map :woman-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-facepalming:-dark-skin-tone '๐Ÿคฆ๐Ÿฟโ™€) + (hm/set! emoji-map :person-shrugging '๐Ÿคท) + (hm/set! emoji-map :person-shrugging:-light-skin-tone '๐Ÿคท๐Ÿป) + (hm/set! emoji-map :person-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผ) + (hm/set! emoji-map :person-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝ) + (hm/set! emoji-map :person-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพ) + (hm/set! emoji-map :person-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟ) + (hm/set! emoji-map :man-shrugging '๐Ÿคทโ™‚๏ธ) + (hm/set! emoji-map :man-shrugging '๐Ÿคทโ™‚) + (hm/set! emoji-map :man-shrugging:-light-skin-tone '๐Ÿคท๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-shrugging:-light-skin-tone '๐Ÿคท๐Ÿปโ™‚) + (hm/set! emoji-map :man-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผโ™‚) + (hm/set! emoji-map :man-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝโ™‚) + (hm/set! emoji-map :man-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพโ™‚) + (hm/set! emoji-map :man-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-shrugging '๐Ÿคทโ™€๏ธ) + (hm/set! emoji-map :woman-shrugging '๐Ÿคทโ™€) + (hm/set! emoji-map :woman-shrugging:-light-skin-tone '๐Ÿคท๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-shrugging:-light-skin-tone '๐Ÿคท๐Ÿปโ™€) + (hm/set! emoji-map :woman-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-shrugging:-medium-light-skin-tone '๐Ÿคท๐Ÿผโ™€) + (hm/set! emoji-map :woman-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-shrugging:-medium-skin-tone '๐Ÿคท๐Ÿฝโ™€) + (hm/set! emoji-map :woman-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-shrugging:-medium-dark-skin-tone '๐Ÿคท๐Ÿพโ™€) + (hm/set! emoji-map :woman-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-shrugging:-dark-skin-tone '๐Ÿคท๐Ÿฟโ™€) + (hm/set! emoji-map :โš•๏ธ-man-health-worker '๐Ÿ‘จ) + (hm/set! emoji-map :โš•-man-health-worker '๐Ÿ‘จ) + (hm/set! emoji-map :โš•๏ธ-man-health-worker:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :โš•-man-health-worker:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :โš•๏ธ-man-health-worker:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :โš•-man-health-worker:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :โš•๏ธ-man-health-worker:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :โš•-man-health-worker:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :โš•๏ธ-man-health-worker:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :โš•-man-health-worker:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :โš•๏ธ-man-health-worker:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :โš•-man-health-worker:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :โš•๏ธ-woman-health-worker '๐Ÿ‘ฉ) + (hm/set! emoji-map :โš•-woman-health-worker '๐Ÿ‘ฉ) + (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :โš•-woman-health-worker:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :โš•-woman-health-worker:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :โš•-woman-health-worker:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :โš•-woman-health-worker:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :โš•๏ธ-woman-health-worker:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :โš•-woman-health-worker:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐ŸŽ“-man-student '๐Ÿ‘จ) + (hm/set! emoji-map :๐ŸŽ“-man-student:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐ŸŽ“-man-student:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐ŸŽ“-man-student:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐ŸŽ“-man-student:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐ŸŽ“-man-student:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐ŸŽ“-woman-student '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐ŸŽ“-woman-student:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐ŸŽ“-woman-student:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐ŸŽ“-woman-student:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐ŸŽ“-woman-student:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐ŸŽ“-woman-student:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿซ-man-teacher '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿซ-man-teacher:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿซ-man-teacher:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿซ-man-teacher:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿซ-man-teacher:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿซ-man-teacher:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿซ-woman-teacher '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿซ-woman-teacher:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿซ-woman-teacher:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿซ-woman-teacher:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿซ-woman-teacher:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿซ-woman-teacher:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :โš–๏ธ-man-judge '๐Ÿ‘จ) + (hm/set! emoji-map :โš–-man-judge '๐Ÿ‘จ) + (hm/set! emoji-map :โš–๏ธ-man-judge:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :โš–-man-judge:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :โš–๏ธ-man-judge:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :โš–-man-judge:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :โš–๏ธ-man-judge:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :โš–-man-judge:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :โš–๏ธ-man-judge:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :โš–-man-judge:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :โš–๏ธ-man-judge:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :โš–-man-judge:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :โš–๏ธ-woman-judge '๐Ÿ‘ฉ) + (hm/set! emoji-map :โš–-woman-judge '๐Ÿ‘ฉ) + (hm/set! emoji-map :โš–๏ธ-woman-judge:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :โš–-woman-judge:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :โš–๏ธ-woman-judge:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :โš–-woman-judge:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :โš–๏ธ-woman-judge:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :โš–-woman-judge:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :โš–๏ธ-woman-judge:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :โš–-woman-judge:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :โš–๏ธ-woman-judge:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :โš–-woman-judge:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐ŸŒพ-man-farmer '๐Ÿ‘จ) + (hm/set! emoji-map :๐ŸŒพ-man-farmer:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐ŸŒพ-man-farmer:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐ŸŒพ-man-farmer:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐ŸŒพ-man-farmer:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐ŸŒพ-man-farmer:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐ŸŒพ-woman-farmer '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐ŸŒพ-woman-farmer:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿณ-man-cook '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿณ-man-cook:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿณ-man-cook:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿณ-man-cook:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿณ-man-cook:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿณ-man-cook:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿณ-woman-cook '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿณ-woman-cook:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿณ-woman-cook:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿณ-woman-cook:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿณ-woman-cook:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿณ-woman-cook:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿ”ง-man-mechanic '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿ”ง-man-mechanic:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿ”ง-woman-mechanic:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿญ-man-factory-worker '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿญ-man-factory-worker:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿญ-woman-factory-worker '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿญ-woman-factory-worker:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿ’ผ-man-office-worker:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿ’ผ-woman-office-worker:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿ”ฌ-man-scientist:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿ”ฌ-woman-scientist:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿ’ป-man-technologist '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿ’ป-man-technologist:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿ’ป-woman-technologist '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿ’ป-woman-technologist:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐ŸŽค-man-singer '๐Ÿ‘จ) + (hm/set! emoji-map :๐ŸŽค-man-singer:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐ŸŽค-man-singer:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐ŸŽค-man-singer:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐ŸŽค-man-singer:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐ŸŽค-man-singer:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐ŸŽค-woman-singer '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐ŸŽค-woman-singer:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐ŸŽค-woman-singer:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐ŸŽค-woman-singer:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐ŸŽค-woman-singer:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐ŸŽค-woman-singer:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐ŸŽจ-man-artist '๐Ÿ‘จ) + (hm/set! emoji-map :๐ŸŽจ-man-artist:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐ŸŽจ-man-artist:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐ŸŽจ-man-artist:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐ŸŽจ-man-artist:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐ŸŽจ-man-artist:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐ŸŽจ-woman-artist '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐ŸŽจ-woman-artist:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐ŸŽจ-woman-artist:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐ŸŽจ-woman-artist:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐ŸŽจ-woman-artist:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐ŸŽจ-woman-artist:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :โœˆ๏ธ-man-pilot '๐Ÿ‘จ) + (hm/set! emoji-map :โœˆ-man-pilot '๐Ÿ‘จ) + (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :โœˆ-man-pilot:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :โœˆ-man-pilot:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :โœˆ-man-pilot:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :โœˆ-man-pilot:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :โœˆ๏ธ-man-pilot:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :โœˆ-man-pilot:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :โœˆ๏ธ-woman-pilot '๐Ÿ‘ฉ) + (hm/set! emoji-map :โœˆ-woman-pilot '๐Ÿ‘ฉ) + (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :โœˆ-woman-pilot:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :โœˆ-woman-pilot:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :โœˆ-woman-pilot:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :โœˆ-woman-pilot:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :โœˆ๏ธ-woman-pilot:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :โœˆ-woman-pilot:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿš€-man-astronaut '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿš€-man-astronaut:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿš€-man-astronaut:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿš€-man-astronaut:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿš€-man-astronaut:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿš€-man-astronaut:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿš€-woman-astronaut '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿš€-woman-astronaut:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿš’-man-firefighter '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿš’-man-firefighter:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿš’-man-firefighter:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿš’-man-firefighter:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿš’-man-firefighter:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿš’-man-firefighter:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿš’-woman-firefighter '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿš’-woman-firefighter:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :police-officer '๐Ÿ‘ฎ) + (hm/set! emoji-map :police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿป) + (hm/set! emoji-map :police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผ) + (hm/set! emoji-map :police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝ) + (hm/set! emoji-map :police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพ) + (hm/set! emoji-map :police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟ) + (hm/set! emoji-map :man-police-officer '๐Ÿ‘ฎโ™‚๏ธ) + (hm/set! emoji-map :man-police-officer '๐Ÿ‘ฎโ™‚) + (hm/set! emoji-map :man-police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿปโ™‚) + (hm/set! emoji-map :man-police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผโ™‚) + (hm/set! emoji-map :man-police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพโ™‚) + (hm/set! emoji-map :man-police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟโ™‚) + (hm/set! emoji-map :woman-police-officer '๐Ÿ‘ฎโ™€๏ธ) + (hm/set! emoji-map :woman-police-officer '๐Ÿ‘ฎโ™€) + (hm/set! emoji-map :woman-police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿปโ™€๏ธ) + (hm/set! emoji-map :woman-police-officer:-light-skin-tone '๐Ÿ‘ฎ๐Ÿปโ™€) + (hm/set! emoji-map :woman-police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผโ™€๏ธ) + (hm/set! emoji-map :woman-police-officer:-medium-light-skin-tone '๐Ÿ‘ฎ๐Ÿผโ™€) + (hm/set! emoji-map :woman-police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝโ™€๏ธ) + (hm/set! emoji-map :woman-police-officer:-medium-skin-tone '๐Ÿ‘ฎ๐Ÿฝโ™€) + (hm/set! emoji-map :woman-police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพโ™€๏ธ) + (hm/set! emoji-map :woman-police-officer:-medium-dark-skin-tone '๐Ÿ‘ฎ๐Ÿพโ™€) + (hm/set! emoji-map :woman-police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟโ™€๏ธ) + (hm/set! emoji-map :woman-police-officer:-dark-skin-tone '๐Ÿ‘ฎ๐Ÿฟโ™€) + (hm/set! emoji-map :detective '๐Ÿ•ต๏ธ) + (hm/set! emoji-map :detective '๐Ÿ•ต) + (hm/set! emoji-map :detective:-light-skin-tone '๐Ÿ•ต๐Ÿป) + (hm/set! emoji-map :detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผ) + (hm/set! emoji-map :detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝ) + (hm/set! emoji-map :detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพ) + (hm/set! emoji-map :detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟ) + (hm/set! emoji-map :man-detective '๐Ÿ•ต๏ธโ™‚๏ธ) + (hm/set! emoji-map :man-detective '๐Ÿ•ตโ™‚๏ธ) + (hm/set! emoji-map :man-detective '๐Ÿ•ต๏ธโ™‚) + (hm/set! emoji-map :man-detective '๐Ÿ•ตโ™‚) + (hm/set! emoji-map :man-detective:-light-skin-tone '๐Ÿ•ต๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-detective:-light-skin-tone '๐Ÿ•ต๐Ÿปโ™‚) + (hm/set! emoji-map :man-detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผโ™‚) + (hm/set! emoji-map :man-detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝโ™‚) + (hm/set! emoji-map :man-detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพโ™‚) + (hm/set! emoji-map :man-detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-detective '๐Ÿ•ต๏ธ) + (hm/set! emoji-map :โ™€๏ธ-woman-detective '๐Ÿ•ต) + (hm/set! emoji-map :woman-detective '๐Ÿ•ต๏ธโ™€) + (hm/set! emoji-map :woman-detective '๐Ÿ•ตโ™€) + (hm/set! emoji-map :โ™€๏ธ-woman-detective:-light-skin-tone '๐Ÿ•ต๐Ÿป) + (hm/set! emoji-map :woman-detective:-light-skin-tone '๐Ÿ•ต๐Ÿปโ™€) + (hm/set! emoji-map :โ™€๏ธ-woman-detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผ) + (hm/set! emoji-map :woman-detective:-medium-light-skin-tone '๐Ÿ•ต๐Ÿผโ™€) + (hm/set! emoji-map :โ™€๏ธ-woman-detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝ) + (hm/set! emoji-map :woman-detective:-medium-skin-tone '๐Ÿ•ต๐Ÿฝโ™€) + (hm/set! emoji-map :โ™€๏ธ-woman-detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพ) + (hm/set! emoji-map :woman-detective:-medium-dark-skin-tone '๐Ÿ•ต๐Ÿพโ™€) + (hm/set! emoji-map :โ™€๏ธ-woman-detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟ) + (hm/set! emoji-map :woman-detective:-dark-skin-tone '๐Ÿ•ต๐Ÿฟโ™€) + (hm/set! emoji-map :guard '๐Ÿ’‚) + (hm/set! emoji-map :guard:-light-skin-tone '๐Ÿ’‚๐Ÿป) + (hm/set! emoji-map :guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผ) + (hm/set! emoji-map :guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝ) + (hm/set! emoji-map :guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพ) + (hm/set! emoji-map :guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟ) + (hm/set! emoji-map :man-guard '๐Ÿ’‚โ™‚๏ธ) + (hm/set! emoji-map :man-guard '๐Ÿ’‚โ™‚) + (hm/set! emoji-map :man-guard:-light-skin-tone '๐Ÿ’‚๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-guard:-light-skin-tone '๐Ÿ’‚๐Ÿปโ™‚) + (hm/set! emoji-map :man-guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผโ™‚) + (hm/set! emoji-map :man-guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝโ™‚) + (hm/set! emoji-map :man-guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพโ™‚) + (hm/set! emoji-map :man-guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-guard '๐Ÿ’‚) + (hm/set! emoji-map :โ™€-woman-guard '๐Ÿ’‚) + (hm/set! emoji-map :โ™€๏ธ-woman-guard:-light-skin-tone '๐Ÿ’‚๐Ÿป) + (hm/set! emoji-map :โ™€-woman-guard:-light-skin-tone '๐Ÿ’‚๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-guard:-medium-light-skin-tone '๐Ÿ’‚๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-guard:-medium-skin-tone '๐Ÿ’‚๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-guard:-medium-dark-skin-tone '๐Ÿ’‚๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-guard:-dark-skin-tone '๐Ÿ’‚๐Ÿฟ) + (hm/set! emoji-map :construction-worker '๐Ÿ‘ท) + (hm/set! emoji-map :construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿป) + (hm/set! emoji-map :construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผ) + (hm/set! emoji-map :construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝ) + (hm/set! emoji-map :construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพ) + (hm/set! emoji-map :construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟ) + (hm/set! emoji-map :man-construction-worker '๐Ÿ‘ทโ™‚๏ธ) + (hm/set! emoji-map :man-construction-worker '๐Ÿ‘ทโ™‚) + (hm/set! emoji-map :man-construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿปโ™‚) + (hm/set! emoji-map :man-construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผโ™‚) + (hm/set! emoji-map :man-construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝโ™‚) + (hm/set! emoji-map :man-construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพโ™‚) + (hm/set! emoji-map :man-construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker '๐Ÿ‘ท) + (hm/set! emoji-map :โ™€-woman-construction-worker '๐Ÿ‘ท) + (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿป) + (hm/set! emoji-map :โ™€-woman-construction-worker:-light-skin-tone '๐Ÿ‘ท๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-construction-worker:-medium-light-skin-tone '๐Ÿ‘ท๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-construction-worker:-medium-skin-tone '๐Ÿ‘ท๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-construction-worker:-medium-dark-skin-tone '๐Ÿ‘ท๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-construction-worker:-dark-skin-tone '๐Ÿ‘ท๐Ÿฟ) + (hm/set! emoji-map :prince '๐Ÿคด) + (hm/set! emoji-map :prince:-light-skin-tone '๐Ÿคด๐Ÿป) + (hm/set! emoji-map :prince:-medium-light-skin-tone '๐Ÿคด๐Ÿผ) + (hm/set! emoji-map :prince:-medium-skin-tone '๐Ÿคด๐Ÿฝ) + (hm/set! emoji-map :prince:-medium-dark-skin-tone '๐Ÿคด๐Ÿพ) + (hm/set! emoji-map :prince:-dark-skin-tone '๐Ÿคด๐Ÿฟ) + (hm/set! emoji-map :princess '๐Ÿ‘ธ) + (hm/set! emoji-map :princess:-light-skin-tone '๐Ÿ‘ธ๐Ÿป) + (hm/set! emoji-map :princess:-medium-light-skin-tone '๐Ÿ‘ธ๐Ÿผ) + (hm/set! emoji-map :princess:-medium-skin-tone '๐Ÿ‘ธ๐Ÿฝ) + (hm/set! emoji-map :princess:-medium-dark-skin-tone '๐Ÿ‘ธ๐Ÿพ) + (hm/set! emoji-map :princess:-dark-skin-tone '๐Ÿ‘ธ๐Ÿฟ) + (hm/set! emoji-map :person-wearing-turban '๐Ÿ‘ณ) + (hm/set! emoji-map :person-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿป) + (hm/set! emoji-map :person-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผ) + (hm/set! emoji-map :person-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝ) + (hm/set! emoji-map :person-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพ) + (hm/set! emoji-map :person-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟ) + (hm/set! emoji-map :man-wearing-turban '๐Ÿ‘ณโ™‚๏ธ) + (hm/set! emoji-map :man-wearing-turban '๐Ÿ‘ณโ™‚) + (hm/set! emoji-map :man-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿปโ™‚) + (hm/set! emoji-map :man-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผโ™‚) + (hm/set! emoji-map :man-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพโ™‚) + (hm/set! emoji-map :man-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban '๐Ÿ‘ณ) + (hm/set! emoji-map :โ™€-woman-wearing-turban '๐Ÿ‘ณ) + (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-wearing-turban:-light-skin-tone '๐Ÿ‘ณ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-wearing-turban:-medium-light-skin-tone '๐Ÿ‘ณ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-wearing-turban:-medium-skin-tone '๐Ÿ‘ณ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-wearing-turban:-medium-dark-skin-tone '๐Ÿ‘ณ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-wearing-turban:-dark-skin-tone '๐Ÿ‘ณ๐Ÿฟ) + (hm/set! emoji-map :man-with-Chinese-cap '๐Ÿ‘ฒ) + (hm/set! emoji-map :man-with-Chinese-cap:-light-skin-tone '๐Ÿ‘ฒ๐Ÿป) + (hm/set! emoji-map :man-with-Chinese-cap:-medium-light-skin-tone '๐Ÿ‘ฒ๐Ÿผ) + (hm/set! emoji-map :man-with-Chinese-cap:-medium-skin-tone '๐Ÿ‘ฒ๐Ÿฝ) + (hm/set! emoji-map :man-with-Chinese-cap:-medium-dark-skin-tone '๐Ÿ‘ฒ๐Ÿพ) + (hm/set! emoji-map :man-with-Chinese-cap:-dark-skin-tone '๐Ÿ‘ฒ๐Ÿฟ) + (hm/set! emoji-map :woman-with-headscarf '๐Ÿง•) + (hm/set! emoji-map :woman-with-headscarf:-light-skin-tone '๐Ÿง•๐Ÿป) + (hm/set! emoji-map :woman-with-headscarf:-medium-light-skin-tone '๐Ÿง•๐Ÿผ) + (hm/set! emoji-map :woman-with-headscarf:-medium-skin-tone '๐Ÿง•๐Ÿฝ) + (hm/set! emoji-map :woman-with-headscarf:-medium-dark-skin-tone '๐Ÿง•๐Ÿพ) + (hm/set! emoji-map :woman-with-headscarf:-dark-skin-tone '๐Ÿง•๐Ÿฟ) + (hm/set! emoji-map :man-in-tuxedo '๐Ÿคต) + (hm/set! emoji-map :man-in-tuxedo:-light-skin-tone '๐Ÿคต๐Ÿป) + (hm/set! emoji-map :man-in-tuxedo:-medium-light-skin-tone '๐Ÿคต๐Ÿผ) + (hm/set! emoji-map :man-in-tuxedo:-medium-skin-tone '๐Ÿคต๐Ÿฝ) + (hm/set! emoji-map :man-in-tuxedo:-medium-dark-skin-tone '๐Ÿคต๐Ÿพ) + (hm/set! emoji-map :man-in-tuxedo:-dark-skin-tone '๐Ÿคต๐Ÿฟ) + (hm/set! emoji-map :bride-with-veil '๐Ÿ‘ฐ) + (hm/set! emoji-map :bride-with-veil:-light-skin-tone '๐Ÿ‘ฐ๐Ÿป) + (hm/set! emoji-map :bride-with-veil:-medium-light-skin-tone '๐Ÿ‘ฐ๐Ÿผ) + (hm/set! emoji-map :bride-with-veil:-medium-skin-tone '๐Ÿ‘ฐ๐Ÿฝ) + (hm/set! emoji-map :bride-with-veil:-medium-dark-skin-tone '๐Ÿ‘ฐ๐Ÿพ) + (hm/set! emoji-map :bride-with-veil:-dark-skin-tone '๐Ÿ‘ฐ๐Ÿฟ) + (hm/set! emoji-map :pregnant-woman '๐Ÿคฐ) + (hm/set! emoji-map :pregnant-woman:-light-skin-tone '๐Ÿคฐ๐Ÿป) + (hm/set! emoji-map :pregnant-woman:-medium-light-skin-tone '๐Ÿคฐ๐Ÿผ) + (hm/set! emoji-map :pregnant-woman:-medium-skin-tone '๐Ÿคฐ๐Ÿฝ) + (hm/set! emoji-map :pregnant-woman:-medium-dark-skin-tone '๐Ÿคฐ๐Ÿพ) + (hm/set! emoji-map :pregnant-woman:-dark-skin-tone '๐Ÿคฐ๐Ÿฟ) + (hm/set! emoji-map :breast-feeding '๐Ÿคฑ) + (hm/set! emoji-map :breast-feeding:-light-skin-tone '๐Ÿคฑ๐Ÿป) + (hm/set! emoji-map :breast-feeding:-medium-light-skin-tone '๐Ÿคฑ๐Ÿผ) + (hm/set! emoji-map :breast-feeding:-medium-skin-tone '๐Ÿคฑ๐Ÿฝ) + (hm/set! emoji-map :breast-feeding:-medium-dark-skin-tone '๐Ÿคฑ๐Ÿพ) + (hm/set! emoji-map :breast-feeding:-dark-skin-tone '๐Ÿคฑ๐Ÿฟ) + (hm/set! emoji-map :baby-angel '๐Ÿ‘ผ) + (hm/set! emoji-map :baby-angel:-light-skin-tone '๐Ÿ‘ผ๐Ÿป) + (hm/set! emoji-map :baby-angel:-medium-light-skin-tone '๐Ÿ‘ผ๐Ÿผ) + (hm/set! emoji-map :baby-angel:-medium-skin-tone '๐Ÿ‘ผ๐Ÿฝ) + (hm/set! emoji-map :baby-angel:-medium-dark-skin-tone '๐Ÿ‘ผ๐Ÿพ) + (hm/set! emoji-map :baby-angel:-dark-skin-tone '๐Ÿ‘ผ๐Ÿฟ) + (hm/set! emoji-map :Santa-Claus '๐ŸŽ…) + (hm/set! emoji-map :Santa-Claus:-light-skin-tone '๐ŸŽ…๐Ÿป) + (hm/set! emoji-map :Santa-Claus:-medium-light-skin-tone '๐ŸŽ…๐Ÿผ) + (hm/set! emoji-map :Santa-Claus:-medium-skin-tone '๐ŸŽ…๐Ÿฝ) + (hm/set! emoji-map :Santa-Claus:-medium-dark-skin-tone '๐ŸŽ…๐Ÿพ) + (hm/set! emoji-map :Santa-Claus:-dark-skin-tone '๐ŸŽ…๐Ÿฟ) + (hm/set! emoji-map :Mrs.-Claus '๐Ÿคถ) + (hm/set! emoji-map :Mrs.-Claus:-light-skin-tone '๐Ÿคถ๐Ÿป) + (hm/set! emoji-map :Mrs.-Claus:-medium-light-skin-tone '๐Ÿคถ๐Ÿผ) + (hm/set! emoji-map :Mrs.-Claus:-medium-skin-tone '๐Ÿคถ๐Ÿฝ) + (hm/set! emoji-map :Mrs.-Claus:-medium-dark-skin-tone '๐Ÿคถ๐Ÿพ) + (hm/set! emoji-map :Mrs.-Claus:-dark-skin-tone '๐Ÿคถ๐Ÿฟ) + (hm/set! emoji-map :superhero '๐Ÿฆธ) + (hm/set! emoji-map :superhero:-light-skin-tone '๐Ÿฆธ๐Ÿป) + (hm/set! emoji-map :superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผ) + (hm/set! emoji-map :superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝ) + (hm/set! emoji-map :superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพ) + (hm/set! emoji-map :superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟ) + (hm/set! emoji-map :man-superhero '๐Ÿฆธโ™‚๏ธ) + (hm/set! emoji-map :man-superhero '๐Ÿฆธโ™‚) + (hm/set! emoji-map :man-superhero:-light-skin-tone '๐Ÿฆธ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-superhero:-light-skin-tone '๐Ÿฆธ๐Ÿปโ™‚) + (hm/set! emoji-map :man-superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผโ™‚) + (hm/set! emoji-map :man-superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพโ™‚) + (hm/set! emoji-map :man-superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-superhero '๐Ÿฆธ) + (hm/set! emoji-map :โ™€-woman-superhero '๐Ÿฆธ) + (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-light-skin-tone '๐Ÿฆธ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-superhero:-light-skin-tone '๐Ÿฆธ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-superhero:-medium-light-skin-tone '๐Ÿฆธ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-superhero:-medium-skin-tone '๐Ÿฆธ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-superhero:-medium-dark-skin-tone '๐Ÿฆธ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-superhero:-dark-skin-tone '๐Ÿฆธ๐Ÿฟ) + (hm/set! emoji-map :supervillain '๐Ÿฆน) + (hm/set! emoji-map :supervillain:-light-skin-tone '๐Ÿฆน๐Ÿป) + (hm/set! emoji-map :supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผ) + (hm/set! emoji-map :supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝ) + (hm/set! emoji-map :supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพ) + (hm/set! emoji-map :supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟ) + (hm/set! emoji-map :man-supervillain '๐Ÿฆนโ™‚๏ธ) + (hm/set! emoji-map :man-supervillain '๐Ÿฆนโ™‚) + (hm/set! emoji-map :man-supervillain:-light-skin-tone '๐Ÿฆน๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-supervillain:-light-skin-tone '๐Ÿฆน๐Ÿปโ™‚) + (hm/set! emoji-map :man-supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผโ™‚) + (hm/set! emoji-map :man-supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝโ™‚) + (hm/set! emoji-map :man-supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพโ™‚) + (hm/set! emoji-map :man-supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-supervillain '๐Ÿฆน) + (hm/set! emoji-map :โ™€-woman-supervillain '๐Ÿฆน) + (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-light-skin-tone '๐Ÿฆน๐Ÿป) + (hm/set! emoji-map :โ™€-woman-supervillain:-light-skin-tone '๐Ÿฆน๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-supervillain:-medium-light-skin-tone '๐Ÿฆน๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-supervillain:-medium-skin-tone '๐Ÿฆน๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-supervillain:-medium-dark-skin-tone '๐Ÿฆน๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-supervillain:-dark-skin-tone '๐Ÿฆน๐Ÿฟ) + (hm/set! emoji-map :mage '๐Ÿง™) + (hm/set! emoji-map :mage:-light-skin-tone '๐Ÿง™๐Ÿป) + (hm/set! emoji-map :mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผ) + (hm/set! emoji-map :mage:-medium-skin-tone '๐Ÿง™๐Ÿฝ) + (hm/set! emoji-map :mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพ) + (hm/set! emoji-map :mage:-dark-skin-tone '๐Ÿง™๐Ÿฟ) + (hm/set! emoji-map :man-mage '๐Ÿง™โ™‚๏ธ) + (hm/set! emoji-map :man-mage '๐Ÿง™โ™‚) + (hm/set! emoji-map :man-mage:-light-skin-tone '๐Ÿง™๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-mage:-light-skin-tone '๐Ÿง™๐Ÿปโ™‚) + (hm/set! emoji-map :man-mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผโ™‚) + (hm/set! emoji-map :man-mage:-medium-skin-tone '๐Ÿง™๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-mage:-medium-skin-tone '๐Ÿง™๐Ÿฝโ™‚) + (hm/set! emoji-map :man-mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพโ™‚) + (hm/set! emoji-map :man-mage:-dark-skin-tone '๐Ÿง™๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-mage:-dark-skin-tone '๐Ÿง™๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-mage '๐Ÿง™) + (hm/set! emoji-map :โ™€-woman-mage '๐Ÿง™) + (hm/set! emoji-map :โ™€๏ธ-woman-mage:-light-skin-tone '๐Ÿง™๐Ÿป) + (hm/set! emoji-map :โ™€-woman-mage:-light-skin-tone '๐Ÿง™๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-mage:-medium-light-skin-tone '๐Ÿง™๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-mage:-medium-skin-tone '๐Ÿง™๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-mage:-medium-skin-tone '๐Ÿง™๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-mage:-medium-dark-skin-tone '๐Ÿง™๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-mage:-dark-skin-tone '๐Ÿง™๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-mage:-dark-skin-tone '๐Ÿง™๐Ÿฟ) + (hm/set! emoji-map :fairy '๐Ÿงš) + (hm/set! emoji-map :fairy:-light-skin-tone '๐Ÿงš๐Ÿป) + (hm/set! emoji-map :fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผ) + (hm/set! emoji-map :fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝ) + (hm/set! emoji-map :fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพ) + (hm/set! emoji-map :fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟ) + (hm/set! emoji-map :man-fairy '๐Ÿงšโ™‚๏ธ) + (hm/set! emoji-map :man-fairy '๐Ÿงšโ™‚) + (hm/set! emoji-map :man-fairy:-light-skin-tone '๐Ÿงš๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-fairy:-light-skin-tone '๐Ÿงš๐Ÿปโ™‚) + (hm/set! emoji-map :man-fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผโ™‚) + (hm/set! emoji-map :man-fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝโ™‚) + (hm/set! emoji-map :man-fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพโ™‚) + (hm/set! emoji-map :man-fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-fairy '๐Ÿงš) + (hm/set! emoji-map :โ™€-woman-fairy '๐Ÿงš) + (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-light-skin-tone '๐Ÿงš๐Ÿป) + (hm/set! emoji-map :โ™€-woman-fairy:-light-skin-tone '๐Ÿงš๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-fairy:-medium-light-skin-tone '๐Ÿงš๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-fairy:-medium-skin-tone '๐Ÿงš๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-fairy:-medium-dark-skin-tone '๐Ÿงš๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-fairy:-dark-skin-tone '๐Ÿงš๐Ÿฟ) + (hm/set! emoji-map :vampire '๐Ÿง›) + (hm/set! emoji-map :vampire:-light-skin-tone '๐Ÿง›๐Ÿป) + (hm/set! emoji-map :vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผ) + (hm/set! emoji-map :vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝ) + (hm/set! emoji-map :vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพ) + (hm/set! emoji-map :vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟ) + (hm/set! emoji-map :man-vampire '๐Ÿง›โ™‚๏ธ) + (hm/set! emoji-map :man-vampire '๐Ÿง›โ™‚) + (hm/set! emoji-map :man-vampire:-light-skin-tone '๐Ÿง›๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-vampire:-light-skin-tone '๐Ÿง›๐Ÿปโ™‚) + (hm/set! emoji-map :man-vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผโ™‚) + (hm/set! emoji-map :man-vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝโ™‚) + (hm/set! emoji-map :man-vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพโ™‚) + (hm/set! emoji-map :man-vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-vampire '๐Ÿง›) + (hm/set! emoji-map :โ™€-woman-vampire '๐Ÿง›) + (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-light-skin-tone '๐Ÿง›๐Ÿป) + (hm/set! emoji-map :โ™€-woman-vampire:-light-skin-tone '๐Ÿง›๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-vampire:-medium-light-skin-tone '๐Ÿง›๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-vampire:-medium-skin-tone '๐Ÿง›๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-vampire:-medium-dark-skin-tone '๐Ÿง›๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-vampire:-dark-skin-tone '๐Ÿง›๐Ÿฟ) + (hm/set! emoji-map :merperson '๐Ÿงœ) + (hm/set! emoji-map :merperson:-light-skin-tone '๐Ÿงœ๐Ÿป) + (hm/set! emoji-map :merperson:-medium-light-skin-tone '๐Ÿงœ๐Ÿผ) + (hm/set! emoji-map :merperson:-medium-skin-tone '๐Ÿงœ๐Ÿฝ) + (hm/set! emoji-map :merperson:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพ) + (hm/set! emoji-map :merperson:-dark-skin-tone '๐Ÿงœ๐Ÿฟ) + (hm/set! emoji-map :merman '๐Ÿงœโ™‚๏ธ) + (hm/set! emoji-map :merman '๐Ÿงœโ™‚) + (hm/set! emoji-map :merman:-light-skin-tone '๐Ÿงœ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :merman:-light-skin-tone '๐Ÿงœ๐Ÿปโ™‚) + (hm/set! emoji-map :merman:-medium-light-skin-tone '๐Ÿงœ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :merman:-medium-light-skin-tone '๐Ÿงœ๐Ÿผโ™‚) + (hm/set! emoji-map :merman:-medium-skin-tone '๐Ÿงœ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :merman:-medium-skin-tone '๐Ÿงœ๐Ÿฝโ™‚) + (hm/set! emoji-map :merman:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :merman:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพโ™‚) + (hm/set! emoji-map :merman:-dark-skin-tone '๐Ÿงœ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :merman:-dark-skin-tone '๐Ÿงœ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-mermaid '๐Ÿงœ) + (hm/set! emoji-map :โ™€-mermaid '๐Ÿงœ) + (hm/set! emoji-map :โ™€๏ธ-mermaid:-light-skin-tone '๐Ÿงœ๐Ÿป) + (hm/set! emoji-map :โ™€-mermaid:-light-skin-tone '๐Ÿงœ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-mermaid:-medium-light-skin-tone '๐Ÿงœ๐Ÿผ) + (hm/set! emoji-map :โ™€-mermaid:-medium-light-skin-tone '๐Ÿงœ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-mermaid:-medium-skin-tone '๐Ÿงœ๐Ÿฝ) + (hm/set! emoji-map :โ™€-mermaid:-medium-skin-tone '๐Ÿงœ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-mermaid:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพ) + (hm/set! emoji-map :โ™€-mermaid:-medium-dark-skin-tone '๐Ÿงœ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-mermaid:-dark-skin-tone '๐Ÿงœ๐Ÿฟ) + (hm/set! emoji-map :โ™€-mermaid:-dark-skin-tone '๐Ÿงœ๐Ÿฟ) + (hm/set! emoji-map :elf '๐Ÿง) + (hm/set! emoji-map :elf:-light-skin-tone '๐Ÿง๐Ÿป) + (hm/set! emoji-map :elf:-medium-light-skin-tone '๐Ÿง๐Ÿผ) + (hm/set! emoji-map :elf:-medium-skin-tone '๐Ÿง๐Ÿฝ) + (hm/set! emoji-map :elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) + (hm/set! emoji-map :elf:-dark-skin-tone '๐Ÿง๐Ÿฟ) + (hm/set! emoji-map :man-elf '๐Ÿงโ™‚๏ธ) + (hm/set! emoji-map :man-elf '๐Ÿงโ™‚) + (hm/set! emoji-map :man-elf:-light-skin-tone '๐Ÿง๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-elf:-light-skin-tone '๐Ÿง๐Ÿปโ™‚) + (hm/set! emoji-map :man-elf:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-elf:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚) + (hm/set! emoji-map :man-elf:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-elf:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚) + (hm/set! emoji-map :man-elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚) + (hm/set! emoji-map :man-elf:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-elf:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-elf '๐Ÿง) + (hm/set! emoji-map :โ™€-woman-elf '๐Ÿง) + (hm/set! emoji-map :โ™€๏ธ-woman-elf:-light-skin-tone '๐Ÿง๐Ÿป) + (hm/set! emoji-map :โ™€-woman-elf:-light-skin-tone '๐Ÿง๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-elf:-medium-light-skin-tone '๐Ÿง๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-elf:-medium-light-skin-tone '๐Ÿง๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-elf:-medium-skin-tone '๐Ÿง๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-elf:-medium-skin-tone '๐Ÿง๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-elf:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-elf:-dark-skin-tone '๐Ÿง๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-elf:-dark-skin-tone '๐Ÿง๐Ÿฟ) + (hm/set! emoji-map :genie '๐Ÿงž) + (hm/set! emoji-map :man-genie '๐Ÿงžโ™‚๏ธ) + (hm/set! emoji-map :man-genie '๐Ÿงžโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-genie '๐Ÿงž) + (hm/set! emoji-map :โ™€-woman-genie '๐Ÿงž) + (hm/set! emoji-map :zombie '๐ŸงŸ) + (hm/set! emoji-map :man-zombie '๐ŸงŸโ™‚๏ธ) + (hm/set! emoji-map :man-zombie '๐ŸงŸโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-zombie '๐ŸงŸ) + (hm/set! emoji-map :โ™€-woman-zombie '๐ŸงŸ) + (hm/set! emoji-map :person-getting-massage '๐Ÿ’†) + (hm/set! emoji-map :person-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿป) + (hm/set! emoji-map :person-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผ) + (hm/set! emoji-map :person-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝ) + (hm/set! emoji-map :person-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพ) + (hm/set! emoji-map :person-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟ) + (hm/set! emoji-map :man-getting-massage '๐Ÿ’†โ™‚๏ธ) + (hm/set! emoji-map :man-getting-massage '๐Ÿ’†โ™‚) + (hm/set! emoji-map :man-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿปโ™‚) + (hm/set! emoji-map :man-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผโ™‚) + (hm/set! emoji-map :man-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝโ™‚) + (hm/set! emoji-map :man-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพโ™‚) + (hm/set! emoji-map :man-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage '๐Ÿ’†) + (hm/set! emoji-map :โ™€-woman-getting-massage '๐Ÿ’†) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿป) + (hm/set! emoji-map :โ™€-woman-getting-massage:-light-skin-tone '๐Ÿ’†๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-getting-massage:-medium-light-skin-tone '๐Ÿ’†๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-getting-massage:-medium-skin-tone '๐Ÿ’†๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-getting-massage:-medium-dark-skin-tone '๐Ÿ’†๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-getting-massage:-dark-skin-tone '๐Ÿ’†๐Ÿฟ) + (hm/set! emoji-map :person-getting-haircut '๐Ÿ’‡) + (hm/set! emoji-map :person-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿป) + (hm/set! emoji-map :person-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผ) + (hm/set! emoji-map :person-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝ) + (hm/set! emoji-map :person-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพ) + (hm/set! emoji-map :person-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟ) + (hm/set! emoji-map :man-getting-haircut '๐Ÿ’‡โ™‚๏ธ) + (hm/set! emoji-map :man-getting-haircut '๐Ÿ’‡โ™‚) + (hm/set! emoji-map :man-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿปโ™‚) + (hm/set! emoji-map :man-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผโ™‚) + (hm/set! emoji-map :man-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝโ™‚) + (hm/set! emoji-map :man-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพโ™‚) + (hm/set! emoji-map :man-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut '๐Ÿ’‡) + (hm/set! emoji-map :โ™€-woman-getting-haircut '๐Ÿ’‡) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿป) + (hm/set! emoji-map :โ™€-woman-getting-haircut:-light-skin-tone '๐Ÿ’‡๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-getting-haircut:-medium-light-skin-tone '๐Ÿ’‡๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-getting-haircut:-medium-skin-tone '๐Ÿ’‡๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-getting-haircut:-medium-dark-skin-tone '๐Ÿ’‡๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-getting-haircut:-dark-skin-tone '๐Ÿ’‡๐Ÿฟ) + (hm/set! emoji-map :person-walking '๐Ÿšถ) + (hm/set! emoji-map :person-walking:-light-skin-tone '๐Ÿšถ๐Ÿป) + (hm/set! emoji-map :person-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผ) + (hm/set! emoji-map :person-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝ) + (hm/set! emoji-map :person-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพ) + (hm/set! emoji-map :person-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟ) + (hm/set! emoji-map :man-walking '๐Ÿšถโ™‚๏ธ) + (hm/set! emoji-map :man-walking '๐Ÿšถโ™‚) + (hm/set! emoji-map :man-walking:-light-skin-tone '๐Ÿšถ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-walking:-light-skin-tone '๐Ÿšถ๐Ÿปโ™‚) + (hm/set! emoji-map :man-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผโ™‚) + (hm/set! emoji-map :man-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพโ™‚) + (hm/set! emoji-map :man-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-walking '๐Ÿšถ) + (hm/set! emoji-map :โ™€-woman-walking '๐Ÿšถ) + (hm/set! emoji-map :โ™€๏ธ-woman-walking:-light-skin-tone '๐Ÿšถ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-walking:-light-skin-tone '๐Ÿšถ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-walking:-medium-light-skin-tone '๐Ÿšถ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-walking:-medium-skin-tone '๐Ÿšถ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-walking:-medium-dark-skin-tone '๐Ÿšถ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-walking:-dark-skin-tone '๐Ÿšถ๐Ÿฟ) + (hm/set! emoji-map :person-standing '๐Ÿง) + (hm/set! emoji-map :person-standing:-light-skin-tone '๐Ÿง๐Ÿป) + (hm/set! emoji-map :person-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผ) + (hm/set! emoji-map :person-standing:-medium-skin-tone '๐Ÿง๐Ÿฝ) + (hm/set! emoji-map :person-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) + (hm/set! emoji-map :person-standing:-dark-skin-tone '๐Ÿง๐Ÿฟ) + (hm/set! emoji-map :man-standing '๐Ÿงโ™‚๏ธ) + (hm/set! emoji-map :man-standing '๐Ÿงโ™‚) + (hm/set! emoji-map :man-standing:-light-skin-tone '๐Ÿง๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-standing:-light-skin-tone '๐Ÿง๐Ÿปโ™‚) + (hm/set! emoji-map :man-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผโ™‚) + (hm/set! emoji-map :man-standing:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-standing:-medium-skin-tone '๐Ÿง๐Ÿฝโ™‚) + (hm/set! emoji-map :man-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพโ™‚) + (hm/set! emoji-map :man-standing:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-standing:-dark-skin-tone '๐Ÿง๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-standing '๐Ÿง) + (hm/set! emoji-map :โ™€-woman-standing '๐Ÿง) + (hm/set! emoji-map :โ™€๏ธ-woman-standing:-light-skin-tone '๐Ÿง๐Ÿป) + (hm/set! emoji-map :โ™€-woman-standing:-light-skin-tone '๐Ÿง๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-standing:-medium-light-skin-tone '๐Ÿง๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-standing:-medium-skin-tone '๐Ÿง๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-standing:-medium-skin-tone '๐Ÿง๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-standing:-medium-dark-skin-tone '๐Ÿง๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-standing:-dark-skin-tone '๐Ÿง๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-standing:-dark-skin-tone '๐Ÿง๐Ÿฟ) + (hm/set! emoji-map :person-kneeling '๐ŸงŽ) + (hm/set! emoji-map :person-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿป) + (hm/set! emoji-map :person-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผ) + (hm/set! emoji-map :person-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝ) + (hm/set! emoji-map :person-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพ) + (hm/set! emoji-map :person-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟ) + (hm/set! emoji-map :man-kneeling '๐ŸงŽโ™‚๏ธ) + (hm/set! emoji-map :man-kneeling '๐ŸงŽโ™‚) + (hm/set! emoji-map :man-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿปโ™‚) + (hm/set! emoji-map :man-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผโ™‚) + (hm/set! emoji-map :man-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพโ™‚) + (hm/set! emoji-map :man-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-kneeling '๐ŸงŽ) + (hm/set! emoji-map :โ™€-woman-kneeling '๐ŸงŽ) + (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-kneeling:-light-skin-tone '๐ŸงŽ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-kneeling:-medium-light-skin-tone '๐ŸงŽ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-kneeling:-medium-skin-tone '๐ŸงŽ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-kneeling:-medium-dark-skin-tone '๐ŸงŽ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-kneeling:-dark-skin-tone '๐ŸงŽ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿฆฏ-man-with-probing-cane:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿฆฏ-woman-with-probing-cane:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿฆผ-man-in-motorized-wheelchair:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿฆผ-woman-in-motorized-wheelchair:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-light-skin-tone '๐Ÿ‘จ๐Ÿป) + (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-medium-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-medium-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿฆฝ-man-in-manual-wheelchair:-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿฆฝ-woman-in-manual-wheelchair:-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :person-running '๐Ÿƒ) + (hm/set! emoji-map :person-running:-light-skin-tone '๐Ÿƒ๐Ÿป) + (hm/set! emoji-map :person-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผ) + (hm/set! emoji-map :person-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝ) + (hm/set! emoji-map :person-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพ) + (hm/set! emoji-map :person-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟ) + (hm/set! emoji-map :man-running '๐Ÿƒโ™‚๏ธ) + (hm/set! emoji-map :man-running '๐Ÿƒโ™‚) + (hm/set! emoji-map :man-running:-light-skin-tone '๐Ÿƒ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-running:-light-skin-tone '๐Ÿƒ๐Ÿปโ™‚) + (hm/set! emoji-map :man-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผโ™‚) + (hm/set! emoji-map :man-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพโ™‚) + (hm/set! emoji-map :man-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-running '๐Ÿƒ) + (hm/set! emoji-map :โ™€-woman-running '๐Ÿƒ) + (hm/set! emoji-map :โ™€๏ธ-woman-running:-light-skin-tone '๐Ÿƒ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-running:-light-skin-tone '๐Ÿƒ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-running:-medium-light-skin-tone '๐Ÿƒ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-running:-medium-skin-tone '๐Ÿƒ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-running:-medium-dark-skin-tone '๐Ÿƒ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-running:-dark-skin-tone '๐Ÿƒ๐Ÿฟ) + (hm/set! emoji-map :woman-dancing '๐Ÿ’ƒ) + (hm/set! emoji-map :woman-dancing:-light-skin-tone '๐Ÿ’ƒ๐Ÿป) + (hm/set! emoji-map :woman-dancing:-medium-light-skin-tone '๐Ÿ’ƒ๐Ÿผ) + (hm/set! emoji-map :woman-dancing:-medium-skin-tone '๐Ÿ’ƒ๐Ÿฝ) + (hm/set! emoji-map :woman-dancing:-medium-dark-skin-tone '๐Ÿ’ƒ๐Ÿพ) + (hm/set! emoji-map :woman-dancing:-dark-skin-tone '๐Ÿ’ƒ๐Ÿฟ) + (hm/set! emoji-map :man-dancing '๐Ÿ•บ) + (hm/set! emoji-map :man-dancing:-light-skin-tone '๐Ÿ•บ๐Ÿป) + (hm/set! emoji-map :man-dancing:-medium-light-skin-tone '๐Ÿ•บ๐Ÿผ) + (hm/set! emoji-map :man-dancing:-medium-skin-tone '๐Ÿ•บ๐Ÿฝ) + (hm/set! emoji-map :man-dancing:-medium-dark-skin-tone '๐Ÿ•บ๐Ÿพ) + (hm/set! emoji-map :man-dancing:-dark-skin-tone '๐Ÿ•บ๐Ÿฟ) + (hm/set! emoji-map :man-in-suit-levitating '๐Ÿ•ด๏ธ) + (hm/set! emoji-map :man-in-suit-levitating '๐Ÿ•ด) + (hm/set! emoji-map :man-in-suit-levitating:-light-skin-tone '๐Ÿ•ด๐Ÿป) + (hm/set! emoji-map :man-in-suit-levitating:-medium-light-skin-tone '๐Ÿ•ด๐Ÿผ) + (hm/set! emoji-map :man-in-suit-levitating:-medium-skin-tone '๐Ÿ•ด๐Ÿฝ) + (hm/set! emoji-map :man-in-suit-levitating:-medium-dark-skin-tone '๐Ÿ•ด๐Ÿพ) + (hm/set! emoji-map :man-in-suit-levitating:-dark-skin-tone '๐Ÿ•ด๐Ÿฟ) + (hm/set! emoji-map :people-with-bunny-ears '๐Ÿ‘ฏ) + (hm/set! emoji-map :men-with-bunny-ears '๐Ÿ‘ฏโ™‚๏ธ) + (hm/set! emoji-map :men-with-bunny-ears '๐Ÿ‘ฏโ™‚) + (hm/set! emoji-map :โ™€๏ธ-women-with-bunny-ears '๐Ÿ‘ฏ) + (hm/set! emoji-map :โ™€-women-with-bunny-ears '๐Ÿ‘ฏ) + (hm/set! emoji-map :person-in-steamy-room '๐Ÿง–) + (hm/set! emoji-map :person-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿป) + (hm/set! emoji-map :person-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผ) + (hm/set! emoji-map :person-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝ) + (hm/set! emoji-map :person-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพ) + (hm/set! emoji-map :person-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟ) + (hm/set! emoji-map :man-in-steamy-room '๐Ÿง–โ™‚๏ธ) + (hm/set! emoji-map :man-in-steamy-room '๐Ÿง–โ™‚) + (hm/set! emoji-map :man-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿปโ™‚) + (hm/set! emoji-map :man-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผโ™‚) + (hm/set! emoji-map :man-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝโ™‚) + (hm/set! emoji-map :man-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพโ™‚) + (hm/set! emoji-map :man-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room '๐Ÿง–) + (hm/set! emoji-map :โ™€-woman-in-steamy-room '๐Ÿง–) + (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿป) + (hm/set! emoji-map :โ™€-woman-in-steamy-room:-light-skin-tone '๐Ÿง–๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-in-steamy-room:-medium-light-skin-tone '๐Ÿง–๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-in-steamy-room:-medium-skin-tone '๐Ÿง–๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-in-steamy-room:-medium-dark-skin-tone '๐Ÿง–๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-in-steamy-room:-dark-skin-tone '๐Ÿง–๐Ÿฟ) + (hm/set! emoji-map :person-climbing '๐Ÿง—) + (hm/set! emoji-map :person-climbing:-light-skin-tone '๐Ÿง—๐Ÿป) + (hm/set! emoji-map :person-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผ) + (hm/set! emoji-map :person-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝ) + (hm/set! emoji-map :person-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพ) + (hm/set! emoji-map :person-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟ) + (hm/set! emoji-map :man-climbing '๐Ÿง—โ™‚๏ธ) + (hm/set! emoji-map :man-climbing '๐Ÿง—โ™‚) + (hm/set! emoji-map :man-climbing:-light-skin-tone '๐Ÿง—๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-climbing:-light-skin-tone '๐Ÿง—๐Ÿปโ™‚) + (hm/set! emoji-map :man-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผโ™‚) + (hm/set! emoji-map :man-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝโ™‚) + (hm/set! emoji-map :man-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพโ™‚) + (hm/set! emoji-map :man-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-climbing '๐Ÿง—) + (hm/set! emoji-map :โ™€-woman-climbing '๐Ÿง—) + (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-light-skin-tone '๐Ÿง—๐Ÿป) + (hm/set! emoji-map :โ™€-woman-climbing:-light-skin-tone '๐Ÿง—๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-climbing:-medium-light-skin-tone '๐Ÿง—๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-climbing:-medium-skin-tone '๐Ÿง—๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-climbing:-medium-dark-skin-tone '๐Ÿง—๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-climbing:-dark-skin-tone '๐Ÿง—๐Ÿฟ) + (hm/set! emoji-map :person-fencing '๐Ÿคบ) + (hm/set! emoji-map :horse-racing '๐Ÿ‡) + (hm/set! emoji-map :horse-racing:-light-skin-tone '๐Ÿ‡๐Ÿป) + (hm/set! emoji-map :horse-racing:-medium-light-skin-tone '๐Ÿ‡๐Ÿผ) + (hm/set! emoji-map :horse-racing:-medium-skin-tone '๐Ÿ‡๐Ÿฝ) + (hm/set! emoji-map :horse-racing:-medium-dark-skin-tone '๐Ÿ‡๐Ÿพ) + (hm/set! emoji-map :horse-racing:-dark-skin-tone '๐Ÿ‡๐Ÿฟ) + (hm/set! emoji-map :skier 'โ›ท๏ธ) + (hm/set! emoji-map :skier 'โ›ท) + (hm/set! emoji-map :snowboarder '๐Ÿ‚) + (hm/set! emoji-map :snowboarder:-light-skin-tone '๐Ÿ‚๐Ÿป) + (hm/set! emoji-map :snowboarder:-medium-light-skin-tone '๐Ÿ‚๐Ÿผ) + (hm/set! emoji-map :snowboarder:-medium-skin-tone '๐Ÿ‚๐Ÿฝ) + (hm/set! emoji-map :snowboarder:-medium-dark-skin-tone '๐Ÿ‚๐Ÿพ) + (hm/set! emoji-map :snowboarder:-dark-skin-tone '๐Ÿ‚๐Ÿฟ) + (hm/set! emoji-map :person-golfing '๐ŸŒ๏ธ) + (hm/set! emoji-map :person-golfing '๐ŸŒ) + (hm/set! emoji-map :person-golfing:-light-skin-tone '๐ŸŒ๐Ÿป) + (hm/set! emoji-map :person-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผ) + (hm/set! emoji-map :person-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝ) + (hm/set! emoji-map :person-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพ) + (hm/set! emoji-map :person-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟ) + (hm/set! emoji-map :man-golfing '๐ŸŒ๏ธโ™‚๏ธ) + (hm/set! emoji-map :man-golfing '๐ŸŒโ™‚๏ธ) + (hm/set! emoji-map :man-golfing '๐ŸŒ๏ธโ™‚) + (hm/set! emoji-map :man-golfing '๐ŸŒโ™‚) + (hm/set! emoji-map :man-golfing:-light-skin-tone '๐ŸŒ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-golfing:-light-skin-tone '๐ŸŒ๐Ÿปโ™‚) + (hm/set! emoji-map :man-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผโ™‚) + (hm/set! emoji-map :man-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพโ™‚) + (hm/set! emoji-map :man-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-golfing '๐ŸŒ๏ธ) + (hm/set! emoji-map :โ™€๏ธ-woman-golfing '๐ŸŒ) + (hm/set! emoji-map :โ™€-woman-golfing '๐ŸŒ๏ธ) + (hm/set! emoji-map :โ™€-woman-golfing '๐ŸŒ) + (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-light-skin-tone '๐ŸŒ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-golfing:-light-skin-tone '๐ŸŒ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-golfing:-medium-light-skin-tone '๐ŸŒ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-golfing:-medium-skin-tone '๐ŸŒ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-golfing:-medium-dark-skin-tone '๐ŸŒ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-golfing:-dark-skin-tone '๐ŸŒ๐Ÿฟ) + (hm/set! emoji-map :person-surfing '๐Ÿ„) + (hm/set! emoji-map :person-surfing:-light-skin-tone '๐Ÿ„๐Ÿป) + (hm/set! emoji-map :person-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผ) + (hm/set! emoji-map :person-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝ) + (hm/set! emoji-map :person-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพ) + (hm/set! emoji-map :person-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟ) + (hm/set! emoji-map :man-surfing '๐Ÿ„โ™‚๏ธ) + (hm/set! emoji-map :man-surfing '๐Ÿ„โ™‚) + (hm/set! emoji-map :man-surfing:-light-skin-tone '๐Ÿ„๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-surfing:-light-skin-tone '๐Ÿ„๐Ÿปโ™‚) + (hm/set! emoji-map :man-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผโ™‚) + (hm/set! emoji-map :man-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝโ™‚) + (hm/set! emoji-map :man-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพโ™‚) + (hm/set! emoji-map :man-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-surfing '๐Ÿ„) + (hm/set! emoji-map :โ™€-woman-surfing '๐Ÿ„) + (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-light-skin-tone '๐Ÿ„๐Ÿป) + (hm/set! emoji-map :โ™€-woman-surfing:-light-skin-tone '๐Ÿ„๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-surfing:-medium-light-skin-tone '๐Ÿ„๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-surfing:-medium-skin-tone '๐Ÿ„๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-surfing:-medium-dark-skin-tone '๐Ÿ„๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-surfing:-dark-skin-tone '๐Ÿ„๐Ÿฟ) + (hm/set! emoji-map :person-rowing-boat '๐Ÿšฃ) + (hm/set! emoji-map :person-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿป) + (hm/set! emoji-map :person-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผ) + (hm/set! emoji-map :person-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝ) + (hm/set! emoji-map :person-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพ) + (hm/set! emoji-map :person-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟ) + (hm/set! emoji-map :man-rowing-boat '๐Ÿšฃโ™‚๏ธ) + (hm/set! emoji-map :man-rowing-boat '๐Ÿšฃโ™‚) + (hm/set! emoji-map :man-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿปโ™‚) + (hm/set! emoji-map :man-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผโ™‚) + (hm/set! emoji-map :man-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพโ™‚) + (hm/set! emoji-map :man-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat '๐Ÿšฃ) + (hm/set! emoji-map :โ™€-woman-rowing-boat '๐Ÿšฃ) + (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-rowing-boat:-light-skin-tone '๐Ÿšฃ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-rowing-boat:-medium-light-skin-tone '๐Ÿšฃ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-rowing-boat:-medium-skin-tone '๐Ÿšฃ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-rowing-boat:-medium-dark-skin-tone '๐Ÿšฃ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-rowing-boat:-dark-skin-tone '๐Ÿšฃ๐Ÿฟ) + (hm/set! emoji-map :person-swimming '๐ŸŠ) + (hm/set! emoji-map :person-swimming:-light-skin-tone '๐ŸŠ๐Ÿป) + (hm/set! emoji-map :person-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผ) + (hm/set! emoji-map :person-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝ) + (hm/set! emoji-map :person-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพ) + (hm/set! emoji-map :person-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟ) + (hm/set! emoji-map :man-swimming '๐ŸŠโ™‚๏ธ) + (hm/set! emoji-map :man-swimming '๐ŸŠโ™‚) + (hm/set! emoji-map :man-swimming:-light-skin-tone '๐ŸŠ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-swimming:-light-skin-tone '๐ŸŠ๐Ÿปโ™‚) + (hm/set! emoji-map :man-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผโ™‚) + (hm/set! emoji-map :man-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพโ™‚) + (hm/set! emoji-map :man-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-swimming '๐ŸŠ) + (hm/set! emoji-map :โ™€-woman-swimming '๐ŸŠ) + (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-light-skin-tone '๐ŸŠ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-swimming:-light-skin-tone '๐ŸŠ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-swimming:-medium-light-skin-tone '๐ŸŠ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-swimming:-medium-skin-tone '๐ŸŠ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-swimming:-medium-dark-skin-tone '๐ŸŠ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-swimming:-dark-skin-tone '๐ŸŠ๐Ÿฟ) + (hm/set! emoji-map :person-bouncing-ball 'โ›น๏ธ) + (hm/set! emoji-map :person-bouncing-ball 'โ›น) + (hm/set! emoji-map :person-bouncing-ball:-light-skin-tone 'โ›น๐Ÿป) + (hm/set! emoji-map :person-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผ) + (hm/set! emoji-map :person-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝ) + (hm/set! emoji-map :person-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพ) + (hm/set! emoji-map :person-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟ) + (hm/set! emoji-map :man-bouncing-ball 'โ›น๏ธโ™‚๏ธ) + (hm/set! emoji-map :man-bouncing-ball 'โ›นโ™‚๏ธ) + (hm/set! emoji-map :man-bouncing-ball 'โ›น๏ธโ™‚) + (hm/set! emoji-map :man-bouncing-ball 'โ›นโ™‚) + (hm/set! emoji-map :man-bouncing-ball:-light-skin-tone 'โ›น๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-bouncing-ball:-light-skin-tone 'โ›น๐Ÿปโ™‚) + (hm/set! emoji-map :man-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผโ™‚) + (hm/set! emoji-map :man-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝโ™‚) + (hm/set! emoji-map :man-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพโ™‚) + (hm/set! emoji-map :man-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball 'โ›น๏ธ) + (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball 'โ›น) + (hm/set! emoji-map :โ™€-woman-bouncing-ball 'โ›น๏ธ) + (hm/set! emoji-map :โ™€-woman-bouncing-ball 'โ›น) + (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-light-skin-tone 'โ›น๐Ÿป) + (hm/set! emoji-map :โ™€-woman-bouncing-ball:-light-skin-tone 'โ›น๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-bouncing-ball:-medium-light-skin-tone 'โ›น๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-bouncing-ball:-medium-skin-tone 'โ›น๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-bouncing-ball:-medium-dark-skin-tone 'โ›น๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-bouncing-ball:-dark-skin-tone 'โ›น๐Ÿฟ) + (hm/set! emoji-map :person-lifting-weights '๐Ÿ‹๏ธ) + (hm/set! emoji-map :person-lifting-weights '๐Ÿ‹) + (hm/set! emoji-map :person-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿป) + (hm/set! emoji-map :person-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผ) + (hm/set! emoji-map :person-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝ) + (hm/set! emoji-map :person-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพ) + (hm/set! emoji-map :person-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟ) + (hm/set! emoji-map :man-lifting-weights '๐Ÿ‹๏ธโ™‚๏ธ) + (hm/set! emoji-map :man-lifting-weights '๐Ÿ‹โ™‚๏ธ) + (hm/set! emoji-map :man-lifting-weights '๐Ÿ‹๏ธโ™‚) + (hm/set! emoji-map :man-lifting-weights '๐Ÿ‹โ™‚) + (hm/set! emoji-map :man-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿปโ™‚) + (hm/set! emoji-map :man-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผโ™‚) + (hm/set! emoji-map :man-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝโ™‚) + (hm/set! emoji-map :man-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพโ™‚) + (hm/set! emoji-map :man-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights '๐Ÿ‹๏ธ) + (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights '๐Ÿ‹) + (hm/set! emoji-map :โ™€-woman-lifting-weights '๐Ÿ‹๏ธ) + (hm/set! emoji-map :โ™€-woman-lifting-weights '๐Ÿ‹) + (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿป) + (hm/set! emoji-map :โ™€-woman-lifting-weights:-light-skin-tone '๐Ÿ‹๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-lifting-weights:-medium-light-skin-tone '๐Ÿ‹๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-lifting-weights:-medium-skin-tone '๐Ÿ‹๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-lifting-weights:-medium-dark-skin-tone '๐Ÿ‹๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-lifting-weights:-dark-skin-tone '๐Ÿ‹๐Ÿฟ) + (hm/set! emoji-map :person-biking '๐Ÿšด) + (hm/set! emoji-map :person-biking:-light-skin-tone '๐Ÿšด๐Ÿป) + (hm/set! emoji-map :person-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผ) + (hm/set! emoji-map :person-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝ) + (hm/set! emoji-map :person-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพ) + (hm/set! emoji-map :person-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟ) + (hm/set! emoji-map :man-biking '๐Ÿšดโ™‚๏ธ) + (hm/set! emoji-map :man-biking '๐Ÿšดโ™‚) + (hm/set! emoji-map :man-biking:-light-skin-tone '๐Ÿšด๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-biking:-light-skin-tone '๐Ÿšด๐Ÿปโ™‚) + (hm/set! emoji-map :man-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผโ™‚) + (hm/set! emoji-map :man-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝโ™‚) + (hm/set! emoji-map :man-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพโ™‚) + (hm/set! emoji-map :man-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-biking '๐Ÿšด) + (hm/set! emoji-map :โ™€-woman-biking '๐Ÿšด) + (hm/set! emoji-map :โ™€๏ธ-woman-biking:-light-skin-tone '๐Ÿšด๐Ÿป) + (hm/set! emoji-map :โ™€-woman-biking:-light-skin-tone '๐Ÿšด๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-biking:-medium-light-skin-tone '๐Ÿšด๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-biking:-medium-skin-tone '๐Ÿšด๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-biking:-medium-dark-skin-tone '๐Ÿšด๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-biking:-dark-skin-tone '๐Ÿšด๐Ÿฟ) + (hm/set! emoji-map :person-mountain-biking '๐Ÿšต) + (hm/set! emoji-map :person-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿป) + (hm/set! emoji-map :person-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผ) + (hm/set! emoji-map :person-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝ) + (hm/set! emoji-map :person-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพ) + (hm/set! emoji-map :person-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟ) + (hm/set! emoji-map :man-mountain-biking '๐Ÿšตโ™‚๏ธ) + (hm/set! emoji-map :man-mountain-biking '๐Ÿšตโ™‚) + (hm/set! emoji-map :man-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿปโ™‚) + (hm/set! emoji-map :man-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผโ™‚) + (hm/set! emoji-map :man-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝโ™‚) + (hm/set! emoji-map :man-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพโ™‚) + (hm/set! emoji-map :man-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking '๐Ÿšต) + (hm/set! emoji-map :โ™€-woman-mountain-biking '๐Ÿšต) + (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿป) + (hm/set! emoji-map :โ™€-woman-mountain-biking:-light-skin-tone '๐Ÿšต๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-mountain-biking:-medium-light-skin-tone '๐Ÿšต๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-mountain-biking:-medium-skin-tone '๐Ÿšต๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-mountain-biking:-medium-dark-skin-tone '๐Ÿšต๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-mountain-biking:-dark-skin-tone '๐Ÿšต๐Ÿฟ) + (hm/set! emoji-map :person-cartwheeling '๐Ÿคธ) + (hm/set! emoji-map :person-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿป) + (hm/set! emoji-map :person-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผ) + (hm/set! emoji-map :person-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝ) + (hm/set! emoji-map :person-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพ) + (hm/set! emoji-map :person-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟ) + (hm/set! emoji-map :man-cartwheeling '๐Ÿคธโ™‚๏ธ) + (hm/set! emoji-map :man-cartwheeling '๐Ÿคธโ™‚) + (hm/set! emoji-map :man-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿปโ™‚) + (hm/set! emoji-map :man-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผโ™‚) + (hm/set! emoji-map :man-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพโ™‚) + (hm/set! emoji-map :man-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling '๐Ÿคธ) + (hm/set! emoji-map :โ™€-woman-cartwheeling '๐Ÿคธ) + (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-cartwheeling:-light-skin-tone '๐Ÿคธ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-cartwheeling:-medium-light-skin-tone '๐Ÿคธ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-cartwheeling:-medium-skin-tone '๐Ÿคธ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-cartwheeling:-medium-dark-skin-tone '๐Ÿคธ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-cartwheeling:-dark-skin-tone '๐Ÿคธ๐Ÿฟ) + (hm/set! emoji-map :people-wrestling '๐Ÿคผ) + (hm/set! emoji-map :men-wrestling '๐Ÿคผโ™‚๏ธ) + (hm/set! emoji-map :men-wrestling '๐Ÿคผโ™‚) + (hm/set! emoji-map :โ™€๏ธ-women-wrestling '๐Ÿคผ) + (hm/set! emoji-map :โ™€-women-wrestling '๐Ÿคผ) + (hm/set! emoji-map :person-playing-water-polo '๐Ÿคฝ) + (hm/set! emoji-map :person-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿป) + (hm/set! emoji-map :person-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผ) + (hm/set! emoji-map :person-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝ) + (hm/set! emoji-map :person-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพ) + (hm/set! emoji-map :person-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟ) + (hm/set! emoji-map :man-playing-water-polo '๐Ÿคฝโ™‚๏ธ) + (hm/set! emoji-map :man-playing-water-polo '๐Ÿคฝโ™‚) + (hm/set! emoji-map :man-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿปโ™‚) + (hm/set! emoji-map :man-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผโ™‚) + (hm/set! emoji-map :man-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพโ™‚) + (hm/set! emoji-map :man-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo '๐Ÿคฝ) + (hm/set! emoji-map :โ™€-woman-playing-water-polo '๐Ÿคฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-playing-water-polo:-light-skin-tone '๐Ÿคฝ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-playing-water-polo:-medium-light-skin-tone '๐Ÿคฝ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-playing-water-polo:-medium-skin-tone '๐Ÿคฝ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-playing-water-polo:-medium-dark-skin-tone '๐Ÿคฝ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-playing-water-polo:-dark-skin-tone '๐Ÿคฝ๐Ÿฟ) + (hm/set! emoji-map :person-playing-handball '๐Ÿคพ) + (hm/set! emoji-map :person-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿป) + (hm/set! emoji-map :person-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผ) + (hm/set! emoji-map :person-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝ) + (hm/set! emoji-map :person-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพ) + (hm/set! emoji-map :person-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟ) + (hm/set! emoji-map :man-playing-handball '๐Ÿคพโ™‚๏ธ) + (hm/set! emoji-map :man-playing-handball '๐Ÿคพโ™‚) + (hm/set! emoji-map :man-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿปโ™‚) + (hm/set! emoji-map :man-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผโ™‚) + (hm/set! emoji-map :man-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝโ™‚) + (hm/set! emoji-map :man-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพโ™‚) + (hm/set! emoji-map :man-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball '๐Ÿคพ) + (hm/set! emoji-map :โ™€-woman-playing-handball '๐Ÿคพ) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿป) + (hm/set! emoji-map :โ™€-woman-playing-handball:-light-skin-tone '๐Ÿคพ๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-playing-handball:-medium-light-skin-tone '๐Ÿคพ๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-playing-handball:-medium-skin-tone '๐Ÿคพ๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-playing-handball:-medium-dark-skin-tone '๐Ÿคพ๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-playing-handball:-dark-skin-tone '๐Ÿคพ๐Ÿฟ) + (hm/set! emoji-map :person-juggling '๐Ÿคน) + (hm/set! emoji-map :person-juggling:-light-skin-tone '๐Ÿคน๐Ÿป) + (hm/set! emoji-map :person-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผ) + (hm/set! emoji-map :person-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝ) + (hm/set! emoji-map :person-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพ) + (hm/set! emoji-map :person-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟ) + (hm/set! emoji-map :man-juggling '๐Ÿคนโ™‚๏ธ) + (hm/set! emoji-map :man-juggling '๐Ÿคนโ™‚) + (hm/set! emoji-map :man-juggling:-light-skin-tone '๐Ÿคน๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-juggling:-light-skin-tone '๐Ÿคน๐Ÿปโ™‚) + (hm/set! emoji-map :man-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผโ™‚) + (hm/set! emoji-map :man-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝโ™‚) + (hm/set! emoji-map :man-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพโ™‚) + (hm/set! emoji-map :man-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-juggling '๐Ÿคน) + (hm/set! emoji-map :โ™€-woman-juggling '๐Ÿคน) + (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-light-skin-tone '๐Ÿคน๐Ÿป) + (hm/set! emoji-map :โ™€-woman-juggling:-light-skin-tone '๐Ÿคน๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-juggling:-medium-light-skin-tone '๐Ÿคน๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-juggling:-medium-skin-tone '๐Ÿคน๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-juggling:-medium-dark-skin-tone '๐Ÿคน๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-juggling:-dark-skin-tone '๐Ÿคน๐Ÿฟ) + (hm/set! emoji-map :person-in-lotus-position '๐Ÿง˜) + (hm/set! emoji-map :person-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿป) + (hm/set! emoji-map :person-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผ) + (hm/set! emoji-map :person-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝ) + (hm/set! emoji-map :person-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพ) + (hm/set! emoji-map :person-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟ) + (hm/set! emoji-map :man-in-lotus-position '๐Ÿง˜โ™‚๏ธ) + (hm/set! emoji-map :man-in-lotus-position '๐Ÿง˜โ™‚) + (hm/set! emoji-map :man-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿปโ™‚๏ธ) + (hm/set! emoji-map :man-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿปโ™‚) + (hm/set! emoji-map :man-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผโ™‚๏ธ) + (hm/set! emoji-map :man-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผโ™‚) + (hm/set! emoji-map :man-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝโ™‚๏ธ) + (hm/set! emoji-map :man-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝโ™‚) + (hm/set! emoji-map :man-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพโ™‚๏ธ) + (hm/set! emoji-map :man-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพโ™‚) + (hm/set! emoji-map :man-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟโ™‚๏ธ) + (hm/set! emoji-map :man-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟโ™‚) + (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position '๐Ÿง˜) + (hm/set! emoji-map :โ™€-woman-in-lotus-position '๐Ÿง˜) + (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿป) + (hm/set! emoji-map :โ™€-woman-in-lotus-position:-light-skin-tone '๐Ÿง˜๐Ÿป) + (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผ) + (hm/set! emoji-map :โ™€-woman-in-lotus-position:-medium-light-skin-tone '๐Ÿง˜๐Ÿผ) + (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝ) + (hm/set! emoji-map :โ™€-woman-in-lotus-position:-medium-skin-tone '๐Ÿง˜๐Ÿฝ) + (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพ) + (hm/set! emoji-map :โ™€-woman-in-lotus-position:-medium-dark-skin-tone '๐Ÿง˜๐Ÿพ) + (hm/set! emoji-map :โ™€๏ธ-woman-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟ) + (hm/set! emoji-map :โ™€-woman-in-lotus-position:-dark-skin-tone '๐Ÿง˜๐Ÿฟ) + (hm/set! emoji-map :person-taking-bath '๐Ÿ›€) + (hm/set! emoji-map :person-taking-bath:-light-skin-tone '๐Ÿ›€๐Ÿป) + (hm/set! emoji-map :person-taking-bath:-medium-light-skin-tone '๐Ÿ›€๐Ÿผ) + (hm/set! emoji-map :person-taking-bath:-medium-skin-tone '๐Ÿ›€๐Ÿฝ) + (hm/set! emoji-map :person-taking-bath:-medium-dark-skin-tone '๐Ÿ›€๐Ÿพ) + (hm/set! emoji-map :person-taking-bath:-dark-skin-tone '๐Ÿ›€๐Ÿฟ) + (hm/set! emoji-map :person-in-bed '๐Ÿ›Œ) + (hm/set! emoji-map :person-in-bed:-light-skin-tone '๐Ÿ›Œ๐Ÿป) + (hm/set! emoji-map :person-in-bed:-medium-light-skin-tone '๐Ÿ›Œ๐Ÿผ) + (hm/set! emoji-map :person-in-bed:-medium-skin-tone '๐Ÿ›Œ๐Ÿฝ) + (hm/set! emoji-map :person-in-bed:-medium-dark-skin-tone '๐Ÿ›Œ๐Ÿพ) + (hm/set! emoji-map :person-in-bed:-dark-skin-tone '๐Ÿ›Œ๐Ÿฟ) + (hm/set! emoji-map :people-holding-hands '๐Ÿง‘๐Ÿคโ€๐Ÿง‘) + (hm/set! emoji-map :people-holding-hands:-light-skin-tone '๐Ÿง‘๐Ÿป๐Ÿคโ€๐Ÿง‘๐Ÿป) + (hm/set! emoji-map :people-holding-hands:-medium-light-skin-tone-light-skin-tone '๐Ÿง‘๐Ÿผ๐Ÿคโ€๐Ÿง‘๐Ÿป) + (hm/set! emoji-map :people-holding-hands:-medium-light-skin-tone '๐Ÿง‘๐Ÿผ๐Ÿคโ€๐Ÿง‘๐Ÿผ) + (hm/set! emoji-map :people-holding-hands:-medium-skin-tone-light-skin-tone '๐Ÿง‘๐Ÿฝ๐Ÿคโ€๐Ÿง‘๐Ÿป) + (hm/set! emoji-map :people-holding-hands:-medium-skin-tone-medium-light-skin-tone '๐Ÿง‘๐Ÿฝ๐Ÿคโ€๐Ÿง‘๐Ÿผ) + (hm/set! emoji-map :people-holding-hands:-medium-skin-tone '๐Ÿง‘๐Ÿฝ๐Ÿคโ€๐Ÿง‘๐Ÿฝ) + (hm/set! emoji-map :people-holding-hands:-medium-dark-skin-tone-light-skin-tone '๐Ÿง‘๐Ÿพ๐Ÿคโ€๐Ÿง‘๐Ÿป) + (hm/set! emoji-map :people-holding-hands:-medium-dark-skin-tone-medium-light-skin-tone '๐Ÿง‘๐Ÿพ๐Ÿคโ€๐Ÿง‘๐Ÿผ) + (hm/set! emoji-map :people-holding-hands:-medium-dark-skin-tone-medium-skin-tone '๐Ÿง‘๐Ÿพ๐Ÿคโ€๐Ÿง‘๐Ÿฝ) + (hm/set! emoji-map :people-holding-hands:-medium-dark-skin-tone '๐Ÿง‘๐Ÿพ๐Ÿคโ€๐Ÿง‘๐Ÿพ) + (hm/set! emoji-map :people-holding-hands:-dark-skin-tone-light-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿป) + (hm/set! emoji-map :people-holding-hands:-dark-skin-tone-medium-light-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿผ) + (hm/set! emoji-map :people-holding-hands:-dark-skin-tone-medium-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿฝ) + (hm/set! emoji-map :people-holding-hands:-dark-skin-tone-medium-dark-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿพ) + (hm/set! emoji-map :people-holding-hands:-dark-skin-tone '๐Ÿง‘๐Ÿฟ๐Ÿคโ€๐Ÿง‘๐Ÿฟ) + (hm/set! emoji-map :women-holding-hands '๐Ÿ‘ญ) + (hm/set! emoji-map :women-holding-hands:-light-skin-tone '๐Ÿ‘ญ๐Ÿป) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป-women-holding-hands:-medium-light-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :women-holding-hands:-medium-light-skin-tone '๐Ÿ‘ญ๐Ÿผ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป-women-holding-hands:-medium-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ-women-holding-hands:-medium-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :women-holding-hands:-medium-skin-tone '๐Ÿ‘ญ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป-women-holding-hands:-medium-dark-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ-women-holding-hands:-medium-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ-women-holding-hands:-medium-dark-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :women-holding-hands:-medium-dark-skin-tone '๐Ÿ‘ญ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป-women-holding-hands:-dark-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ-women-holding-hands:-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ-women-holding-hands:-dark-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ-women-holding-hands:-dark-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :women-holding-hands:-dark-skin-tone '๐Ÿ‘ญ๐Ÿฟ) + (hm/set! emoji-map :woman-and-man-holding-hands '๐Ÿ‘ซ) + (hm/set! emoji-map :woman-and-man-holding-hands:-light-skin-tone '๐Ÿ‘ซ๐Ÿป) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-woman-and-man-holding-hands:-light-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-woman-and-man-holding-hands:-light-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-woman-and-man-holding-hands:-light-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ-woman-and-man-holding-hands:-light-skin-tone-dark-skin-tone '๐Ÿ‘ฉ๐Ÿป) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-woman-and-man-holding-hands:-medium-light-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :woman-and-man-holding-hands:-medium-light-skin-tone '๐Ÿ‘ซ๐Ÿผ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-woman-and-man-holding-hands:-medium-light-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-woman-and-man-holding-hands:-medium-light-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ-woman-and-man-holding-hands:-medium-light-skin-tone-dark-skin-tone '๐Ÿ‘ฉ๐Ÿผ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-woman-and-man-holding-hands:-medium-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-woman-and-man-holding-hands:-medium-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :woman-and-man-holding-hands:-medium-skin-tone '๐Ÿ‘ซ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-woman-and-man-holding-hands:-medium-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ-woman-and-man-holding-hands:-medium-skin-tone-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-woman-and-man-holding-hands:-medium-dark-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-woman-and-man-holding-hands:-medium-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-woman-and-man-holding-hands:-medium-dark-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :woman-and-man-holding-hands:-medium-dark-skin-tone '๐Ÿ‘ซ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ-woman-and-man-holding-hands:-medium-dark-skin-tone-dark-skin-tone '๐Ÿ‘ฉ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-woman-and-man-holding-hands:-dark-skin-tone-light-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-woman-and-man-holding-hands:-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-woman-and-man-holding-hands:-dark-skin-tone-medium-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-woman-and-man-holding-hands:-dark-skin-tone-medium-dark-skin-tone '๐Ÿ‘ฉ๐Ÿฟ) + (hm/set! emoji-map :woman-and-man-holding-hands:-dark-skin-tone '๐Ÿ‘ซ๐Ÿฟ) + (hm/set! emoji-map :men-holding-hands '๐Ÿ‘ฌ) + (hm/set! emoji-map :men-holding-hands:-light-skin-tone '๐Ÿ‘ฌ๐Ÿป) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-men-holding-hands:-medium-light-skin-tone-light-skin-tone '๐Ÿ‘จ๐Ÿผ) + (hm/set! emoji-map :men-holding-hands:-medium-light-skin-tone '๐Ÿ‘ฌ๐Ÿผ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-men-holding-hands:-medium-skin-tone-light-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-men-holding-hands:-medium-skin-tone-medium-light-skin-tone '๐Ÿ‘จ๐Ÿฝ) + (hm/set! emoji-map :men-holding-hands:-medium-skin-tone '๐Ÿ‘ฌ๐Ÿฝ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-men-holding-hands:-medium-dark-skin-tone-light-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-men-holding-hands:-medium-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-men-holding-hands:-medium-dark-skin-tone-medium-skin-tone '๐Ÿ‘จ๐Ÿพ) + (hm/set! emoji-map :men-holding-hands:-medium-dark-skin-tone '๐Ÿ‘ฌ๐Ÿพ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿป-men-holding-hands:-dark-skin-tone-light-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿผ-men-holding-hands:-dark-skin-tone-medium-light-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ-men-holding-hands:-dark-skin-tone-medium-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :๐Ÿคโ€๐Ÿ‘จ๐Ÿพ-men-holding-hands:-dark-skin-tone-medium-dark-skin-tone '๐Ÿ‘จ๐Ÿฟ) + (hm/set! emoji-map :men-holding-hands:-dark-skin-tone '๐Ÿ‘ฌ๐Ÿฟ) + (hm/set! emoji-map :kiss '๐Ÿ’) + (hm/set! emoji-map :โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ-kiss:-woman-man '๐Ÿ‘ฉ) + (hm/set! emoji-map :โคโ€๐Ÿ’‹โ€๐Ÿ‘จ-kiss:-woman-man '๐Ÿ‘ฉ) + (hm/set! emoji-map :โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ-kiss:-man-man '๐Ÿ‘จ) + (hm/set! emoji-map :โคโ€๐Ÿ’‹โ€๐Ÿ‘จ-kiss:-man-man '๐Ÿ‘จ) + (hm/set! emoji-map :โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ-kiss:-woman-woman '๐Ÿ‘ฉ) + (hm/set! emoji-map :โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ-kiss:-woman-woman '๐Ÿ‘ฉ) + (hm/set! emoji-map :couple-with-heart '๐Ÿ’‘) + (hm/set! emoji-map :โค๏ธโ€๐Ÿ‘จ-couple-with-heart:-woman-man '๐Ÿ‘ฉ) + (hm/set! emoji-map :โคโ€๐Ÿ‘จ-couple-with-heart:-woman-man '๐Ÿ‘ฉ) + (hm/set! emoji-map :โค๏ธโ€๐Ÿ‘จ-couple-with-heart:-man-man '๐Ÿ‘จ) + (hm/set! emoji-map :โคโ€๐Ÿ‘จ-couple-with-heart:-man-man '๐Ÿ‘จ) + (hm/set! emoji-map :โค๏ธโ€๐Ÿ‘ฉ-couple-with-heart:-woman-woman '๐Ÿ‘ฉ) + (hm/set! emoji-map :โคโ€๐Ÿ‘ฉ-couple-with-heart:-woman-woman '๐Ÿ‘ฉ) + (hm/set! emoji-map :family '๐Ÿ‘ช) + (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ฆ-family:-man-woman-boy '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ง-family:-man-woman-girl '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ-family:-man-woman-girl-boy '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ-family:-man-woman-boy-boy '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง-family:-man-woman-girl-girl '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘ฆ-family:-man-man-boy '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘ง-family:-man-man-girl '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ-family:-man-man-girl-boy '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ-family:-man-man-boy-boy '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง-family:-man-man-girl-girl '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ฆ-family:-woman-woman-boy '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿ‘ฉโ€๐Ÿ‘ง-family:-woman-woman-girl '๐Ÿ‘ฉ) + (hm/set! emoji-map :family:-woman-woman-girl-boy '๐Ÿ‘ฉ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ) + (hm/set! emoji-map :family:-woman-woman-boy-boy '๐Ÿ‘ฉ๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ) + (hm/set! emoji-map :family:-woman-woman-girl-girl '๐Ÿ‘ฉ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง) + (hm/set! emoji-map :๐Ÿ‘ฆ-family:-man-boy '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘ฆโ€๐Ÿ‘ฆ-family:-man-boy-boy '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘ง-family:-man-girl '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘งโ€๐Ÿ‘ฆ-family:-man-girl-boy '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘งโ€๐Ÿ‘ง-family:-man-girl-girl '๐Ÿ‘จ) + (hm/set! emoji-map :๐Ÿ‘ฆ-family:-woman-boy '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿ‘ฆโ€๐Ÿ‘ฆ-family:-woman-boy-boy '๐Ÿ‘ฉ) + (hm/set! emoji-map :๐Ÿ‘ง-family:-woman-girl '๐Ÿ‘ฉ) + (hm/set! emoji-map :family:-woman-girl-boy '๐Ÿ‘ฉ๐Ÿ‘งโ€๐Ÿ‘ฆ) + (hm/set! emoji-map :family:-woman-girl-girl '๐Ÿ‘ฉ๐Ÿ‘งโ€๐Ÿ‘ง) + (hm/set! emoji-map :speaking-head '๐Ÿ—ฃ๏ธ) + (hm/set! emoji-map :speaking-head '๐Ÿ—ฃ) + (hm/set! emoji-map :bust-in-silhouette '๐Ÿ‘ค) + (hm/set! emoji-map :busts-in-silhouette '๐Ÿ‘ฅ) + (hm/set! emoji-map :footprints '๐Ÿ‘ฃ) + (hm/set! emoji-map :medium-light-skin-tone '๐Ÿผ) + (hm/set! emoji-map :medium-skin-tone '๐Ÿฝ) + (hm/set! emoji-map :medium-dark-skin-tone '๐Ÿพ) + (hm/set! emoji-map :dark-skin-tone '๐Ÿฟ) + (hm/set! emoji-map :red-hair '๐Ÿฆฐ) + (hm/set! emoji-map :curly-hair '๐Ÿฆฑ) + (hm/set! emoji-map :white-hair '๐Ÿฆณ) + (hm/set! emoji-map :bald '๐Ÿฆฒ) + (hm/set! emoji-map :monkey '๐Ÿ’) + (hm/set! emoji-map :gorilla '๐Ÿฆ) + (hm/set! emoji-map :orangutan '๐Ÿฆง) + (hm/set! emoji-map :dog-face '๐Ÿถ) + (hm/set! emoji-map :dog '๐Ÿ•) + (hm/set! emoji-map :guide-dog '๐Ÿฆฎ) + (hm/set! emoji-map :๐Ÿฆบ-service-dog '๐Ÿ•) + (hm/set! emoji-map :poodle '๐Ÿฉ) + (hm/set! emoji-map :wolf '๐Ÿบ) + (hm/set! emoji-map :fox '๐ŸฆŠ) + (hm/set! emoji-map :raccoon '๐Ÿฆ) + (hm/set! emoji-map :cat-face '๐Ÿฑ) + (hm/set! emoji-map :cat '๐Ÿˆ) + (hm/set! emoji-map :lion '๐Ÿฆ) + (hm/set! emoji-map :tiger-face '๐Ÿฏ) + (hm/set! emoji-map :tiger '๐Ÿ…) + (hm/set! emoji-map :leopard '๐Ÿ†) + (hm/set! emoji-map :horse-face '๐Ÿด) + (hm/set! emoji-map :horse '๐ŸŽ) + (hm/set! emoji-map :unicorn '๐Ÿฆ„) + (hm/set! emoji-map :zebra '๐Ÿฆ“) + (hm/set! emoji-map :deer '๐ŸฆŒ) + (hm/set! emoji-map :cow-face '๐Ÿฎ) + (hm/set! emoji-map :ox '๐Ÿ‚) + (hm/set! emoji-map :water-buffalo '๐Ÿƒ) + (hm/set! emoji-map :cow '๐Ÿ„) + (hm/set! emoji-map :pig-face '๐Ÿท) + (hm/set! emoji-map :pig '๐Ÿ–) + (hm/set! emoji-map :boar '๐Ÿ—) + (hm/set! emoji-map :pig-nose '๐Ÿฝ) + (hm/set! emoji-map :ram '๐Ÿ) + (hm/set! emoji-map :ewe '๐Ÿ‘) + (hm/set! emoji-map :goat '๐Ÿ) + (hm/set! emoji-map :camel '๐Ÿช) + (hm/set! emoji-map :two-hump-camel '๐Ÿซ) + (hm/set! emoji-map :llama '๐Ÿฆ™) + (hm/set! emoji-map :giraffe '๐Ÿฆ’) + (hm/set! emoji-map :elephant '๐Ÿ˜) + (hm/set! emoji-map :rhinoceros '๐Ÿฆ) + (hm/set! emoji-map :hippopotamus '๐Ÿฆ›) + (hm/set! emoji-map :mouse-face '๐Ÿญ) + (hm/set! emoji-map :mouse '๐Ÿ) + (hm/set! emoji-map :rat '๐Ÿ€) + (hm/set! emoji-map :hamster '๐Ÿน) + (hm/set! emoji-map :rabbit-face '๐Ÿฐ) + (hm/set! emoji-map :rabbit '๐Ÿ‡) + (hm/set! emoji-map :chipmunk '๐Ÿฟ๏ธ) + (hm/set! emoji-map :chipmunk '๐Ÿฟ) + (hm/set! emoji-map :hedgehog '๐Ÿฆ”) + (hm/set! emoji-map :bat '๐Ÿฆ‡) + (hm/set! emoji-map :bear '๐Ÿป) + (hm/set! emoji-map :koala '๐Ÿจ) + (hm/set! emoji-map :panda '๐Ÿผ) + (hm/set! emoji-map :sloth '๐Ÿฆฅ) + (hm/set! emoji-map :otter '๐Ÿฆฆ) + (hm/set! emoji-map :skunk '๐Ÿฆจ) + (hm/set! emoji-map :kangaroo '๐Ÿฆ˜) + (hm/set! emoji-map :badger '๐Ÿฆก) + (hm/set! emoji-map :paw-prints '๐Ÿพ) + (hm/set! emoji-map :turkey '๐Ÿฆƒ) + (hm/set! emoji-map :chicken '๐Ÿ”) + (hm/set! emoji-map :rooster '๐Ÿ“) + (hm/set! emoji-map :hatching-chick '๐Ÿฃ) + (hm/set! emoji-map :baby-chick '๐Ÿค) + (hm/set! emoji-map :front-facing-baby-chick '๐Ÿฅ) + (hm/set! emoji-map :bird '๐Ÿฆ) + (hm/set! emoji-map :penguin '๐Ÿง) + (hm/set! emoji-map :dove '๐Ÿ•Š๏ธ) + (hm/set! emoji-map :dove '๐Ÿ•Š) + (hm/set! emoji-map :eagle '๐Ÿฆ…) + (hm/set! emoji-map :duck '๐Ÿฆ†) + (hm/set! emoji-map :swan '๐Ÿฆข) + (hm/set! emoji-map :owl '๐Ÿฆ‰) + (hm/set! emoji-map :flamingo '๐Ÿฆฉ) + (hm/set! emoji-map :peacock '๐Ÿฆš) + (hm/set! emoji-map :parrot '๐Ÿฆœ) + (hm/set! emoji-map :frog '๐Ÿธ) + (hm/set! emoji-map :crocodile '๐ŸŠ) + (hm/set! emoji-map :turtle '๐Ÿข) + (hm/set! emoji-map :lizard '๐ŸฆŽ) + (hm/set! emoji-map :snake '๐Ÿ) + (hm/set! emoji-map :dragon-face '๐Ÿฒ) + (hm/set! emoji-map :dragon '๐Ÿ‰) + (hm/set! emoji-map :sauropod '๐Ÿฆ•) + (hm/set! emoji-map :T-Rex '๐Ÿฆ–) + (hm/set! emoji-map :spouting-whale '๐Ÿณ) + (hm/set! emoji-map :whale '๐Ÿ‹) + (hm/set! emoji-map :dolphin '๐Ÿฌ) + (hm/set! emoji-map :fish '๐ŸŸ) + (hm/set! emoji-map :tropical-fish '๐Ÿ ) + (hm/set! emoji-map :blowfish '๐Ÿก) + (hm/set! emoji-map :shark '๐Ÿฆˆ) + (hm/set! emoji-map :octopus '๐Ÿ™) + (hm/set! emoji-map :spiral-shell '๐Ÿš) + (hm/set! emoji-map :snail '๐ŸŒ) + (hm/set! emoji-map :butterfly '๐Ÿฆ‹) + (hm/set! emoji-map :bug '๐Ÿ›) + (hm/set! emoji-map :ant '๐Ÿœ) + (hm/set! emoji-map :honeybee '๐Ÿ) + (hm/set! emoji-map :lady-beetle '๐Ÿž) + (hm/set! emoji-map :cricket '๐Ÿฆ—) + (hm/set! emoji-map :spider '๐Ÿ•ท๏ธ) + (hm/set! emoji-map :spider '๐Ÿ•ท) + (hm/set! emoji-map :spider-web '๐Ÿ•ธ๏ธ) + (hm/set! emoji-map :spider-web '๐Ÿ•ธ) + (hm/set! emoji-map :scorpion '๐Ÿฆ‚) + (hm/set! emoji-map :mosquito '๐ŸฆŸ) + (hm/set! emoji-map :microbe '๐Ÿฆ ) + (hm/set! emoji-map :bouquet '๐Ÿ’) + (hm/set! emoji-map :cherry-blossom '๐ŸŒธ) + (hm/set! emoji-map :white-flower '๐Ÿ’ฎ) + (hm/set! emoji-map :rosette '๐Ÿต๏ธ) + (hm/set! emoji-map :rosette '๐Ÿต) + (hm/set! emoji-map :rose '๐ŸŒน) + (hm/set! emoji-map :wilted-flower '๐Ÿฅ€) + (hm/set! emoji-map :hibiscus '๐ŸŒบ) + (hm/set! emoji-map :sunflower '๐ŸŒป) + (hm/set! emoji-map :blossom '๐ŸŒผ) + (hm/set! emoji-map :tulip '๐ŸŒท) + (hm/set! emoji-map :seedling '๐ŸŒฑ) + (hm/set! emoji-map :evergreen-tree '๐ŸŒฒ) + (hm/set! emoji-map :deciduous-tree '๐ŸŒณ) + (hm/set! emoji-map :palm-tree '๐ŸŒด) + (hm/set! emoji-map :cactus '๐ŸŒต) + (hm/set! emoji-map :sheaf-of-rice '๐ŸŒพ) + (hm/set! emoji-map :herb '๐ŸŒฟ) + (hm/set! emoji-map :shamrock 'โ˜˜๏ธ) + (hm/set! emoji-map :shamrock 'โ˜˜) + (hm/set! emoji-map :four-leaf-clover '๐Ÿ€) + (hm/set! emoji-map :maple-leaf '๐Ÿ) + (hm/set! emoji-map :fallen-leaf '๐Ÿ‚) + (hm/set! emoji-map :leaf-fluttering-in-wind '๐Ÿƒ) + (hm/set! emoji-map :melon '๐Ÿˆ) + (hm/set! emoji-map :watermelon '๐Ÿ‰) + (hm/set! emoji-map :tangerine '๐ŸŠ) + (hm/set! emoji-map :lemon '๐Ÿ‹) + (hm/set! emoji-map :banana '๐ŸŒ) + (hm/set! emoji-map :pineapple '๐Ÿ) + (hm/set! emoji-map :mango '๐Ÿฅญ) + (hm/set! emoji-map :red-apple '๐ŸŽ) + (hm/set! emoji-map :green-apple '๐Ÿ) + (hm/set! emoji-map :pear '๐Ÿ) + (hm/set! emoji-map :peach '๐Ÿ‘) + (hm/set! emoji-map :cherries '๐Ÿ’) + (hm/set! emoji-map :strawberry '๐Ÿ“) + (hm/set! emoji-map :kiwi-fruit '๐Ÿฅ) + (hm/set! emoji-map :tomato '๐Ÿ…) + (hm/set! emoji-map :coconut '๐Ÿฅฅ) + (hm/set! emoji-map :avocado '๐Ÿฅ‘) + (hm/set! emoji-map :eggplant '๐Ÿ†) + (hm/set! emoji-map :potato '๐Ÿฅ”) + (hm/set! emoji-map :carrot '๐Ÿฅ•) + (hm/set! emoji-map :ear-of-corn '๐ŸŒฝ) + (hm/set! emoji-map :hot-pepper '๐ŸŒถ๏ธ) + (hm/set! emoji-map :hot-pepper '๐ŸŒถ) + (hm/set! emoji-map :cucumber '๐Ÿฅ’) + (hm/set! emoji-map :leafy-green '๐Ÿฅฌ) + (hm/set! emoji-map :broccoli '๐Ÿฅฆ) + (hm/set! emoji-map :garlic '๐Ÿง„) + (hm/set! emoji-map :onion '๐Ÿง…) + (hm/set! emoji-map :mushroom '๐Ÿ„) + (hm/set! emoji-map :peanuts '๐Ÿฅœ) + (hm/set! emoji-map :chestnut '๐ŸŒฐ) + (hm/set! emoji-map :bread '๐Ÿž) + (hm/set! emoji-map :croissant '๐Ÿฅ) + (hm/set! emoji-map :baguette-bread '๐Ÿฅ–) + (hm/set! emoji-map :pretzel '๐Ÿฅจ) + (hm/set! emoji-map :bagel '๐Ÿฅฏ) + (hm/set! emoji-map :pancakes '๐Ÿฅž) + (hm/set! emoji-map :waffle '๐Ÿง‡) + (hm/set! emoji-map :cheese-wedge '๐Ÿง€) + (hm/set! emoji-map :meat-on-bone '๐Ÿ–) + (hm/set! emoji-map :poultry-leg '๐Ÿ—) + (hm/set! emoji-map :cut-of-meat '๐Ÿฅฉ) + (hm/set! emoji-map :bacon '๐Ÿฅ“) + (hm/set! emoji-map :hamburger '๐Ÿ”) + (hm/set! emoji-map :french-fries '๐ŸŸ) + (hm/set! emoji-map :pizza '๐Ÿ•) + (hm/set! emoji-map :hot-dog '๐ŸŒญ) + (hm/set! emoji-map :sandwich '๐Ÿฅช) + (hm/set! emoji-map :taco '๐ŸŒฎ) + (hm/set! emoji-map :burrito '๐ŸŒฏ) + (hm/set! emoji-map :stuffed-flatbread '๐Ÿฅ™) + (hm/set! emoji-map :falafel '๐Ÿง†) + (hm/set! emoji-map :egg '๐Ÿฅš) + (hm/set! emoji-map :cooking '๐Ÿณ) + (hm/set! emoji-map :shallow-pan-of-food '๐Ÿฅ˜) + (hm/set! emoji-map :pot-of-food '๐Ÿฒ) + (hm/set! emoji-map :bowl-with-spoon '๐Ÿฅฃ) + (hm/set! emoji-map :green-salad '๐Ÿฅ—) + (hm/set! emoji-map :popcorn '๐Ÿฟ) + (hm/set! emoji-map :butter '๐Ÿงˆ) + (hm/set! emoji-map :salt '๐Ÿง‚) + (hm/set! emoji-map :canned-food '๐Ÿฅซ) + (hm/set! emoji-map :bento-box '๐Ÿฑ) + (hm/set! emoji-map :rice-cracker '๐Ÿ˜) + (hm/set! emoji-map :rice-ball '๐Ÿ™) + (hm/set! emoji-map :cooked-rice '๐Ÿš) + (hm/set! emoji-map :curry-rice '๐Ÿ›) + (hm/set! emoji-map :steaming-bowl '๐Ÿœ) + (hm/set! emoji-map :spaghetti '๐Ÿ) + (hm/set! emoji-map :roasted-sweet-potato '๐Ÿ ) + (hm/set! emoji-map :oden '๐Ÿข) + (hm/set! emoji-map :sushi '๐Ÿฃ) + (hm/set! emoji-map :fried-shrimp '๐Ÿค) + (hm/set! emoji-map :fish-cake-with-swirl '๐Ÿฅ) + (hm/set! emoji-map :moon-cake '๐Ÿฅฎ) + (hm/set! emoji-map :dango '๐Ÿก) + (hm/set! emoji-map :dumpling '๐ŸฅŸ) + (hm/set! emoji-map :fortune-cookie '๐Ÿฅ ) + (hm/set! emoji-map :takeout-box '๐Ÿฅก) + (hm/set! emoji-map :crab '๐Ÿฆ€) + (hm/set! emoji-map :lobster '๐Ÿฆž) + (hm/set! emoji-map :shrimp '๐Ÿฆ) + (hm/set! emoji-map :squid '๐Ÿฆ‘) + (hm/set! emoji-map :oyster '๐Ÿฆช) + (hm/set! emoji-map :soft-ice-cream '๐Ÿฆ) + (hm/set! emoji-map :shaved-ice '๐Ÿง) + (hm/set! emoji-map :ice-cream '๐Ÿจ) + (hm/set! emoji-map :doughnut '๐Ÿฉ) + (hm/set! emoji-map :cookie '๐Ÿช) + (hm/set! emoji-map :birthday-cake '๐ŸŽ‚) + (hm/set! emoji-map :shortcake '๐Ÿฐ) + (hm/set! emoji-map :cupcake '๐Ÿง) + (hm/set! emoji-map :pie '๐Ÿฅง) + (hm/set! emoji-map :chocolate-bar '๐Ÿซ) + (hm/set! emoji-map :candy '๐Ÿฌ) + (hm/set! emoji-map :lollipop '๐Ÿญ) + (hm/set! emoji-map :custard '๐Ÿฎ) + (hm/set! emoji-map :honey-pot '๐Ÿฏ) + (hm/set! emoji-map :baby-bottle '๐Ÿผ) + (hm/set! emoji-map :glass-of-milk '๐Ÿฅ›) + (hm/set! emoji-map :hot-beverage 'โ˜•) + (hm/set! emoji-map :teacup-without-handle '๐Ÿต) + (hm/set! emoji-map :sake '๐Ÿถ) + (hm/set! emoji-map :bottle-with-popping-cork '๐Ÿพ) + (hm/set! emoji-map :wine-glass '๐Ÿท) + (hm/set! emoji-map :cocktail-glass '๐Ÿธ) + (hm/set! emoji-map :tropical-drink '๐Ÿน) + (hm/set! emoji-map :beer-mug '๐Ÿบ) + (hm/set! emoji-map :clinking-beer-mugs '๐Ÿป) + (hm/set! emoji-map :clinking-glasses '๐Ÿฅ‚) + (hm/set! emoji-map :tumbler-glass '๐Ÿฅƒ) + (hm/set! emoji-map :cup-with-straw '๐Ÿฅค) + (hm/set! emoji-map :beverage-box '๐Ÿงƒ) + (hm/set! emoji-map :mate '๐Ÿง‰) + (hm/set! emoji-map :ice-cube '๐ŸงŠ) + (hm/set! emoji-map :chopsticks '๐Ÿฅข) + (hm/set! emoji-map :fork-and-knife-with-plate '๐Ÿฝ๏ธ) + (hm/set! emoji-map :fork-and-knife-with-plate '๐Ÿฝ) + (hm/set! emoji-map :fork-and-knife '๐Ÿด) + (hm/set! emoji-map :spoon '๐Ÿฅ„) + (hm/set! emoji-map :kitchen-knife '๐Ÿ”ช) + (hm/set! emoji-map :amphora '๐Ÿบ) + (hm/set! emoji-map :globe-showing-Americas '๐ŸŒŽ) + (hm/set! emoji-map :globe-showing-Asia-Australia '๐ŸŒ) + (hm/set! emoji-map :globe-with-meridians '๐ŸŒ) + (hm/set! emoji-map :world-map '๐Ÿ—บ๏ธ) + (hm/set! emoji-map :world-map '๐Ÿ—บ) + (hm/set! emoji-map :map-of-Japan '๐Ÿ—พ) + (hm/set! emoji-map :compass '๐Ÿงญ) + (hm/set! emoji-map :snow-capped-mountain '๐Ÿ”๏ธ) + (hm/set! emoji-map :snow-capped-mountain '๐Ÿ”) + (hm/set! emoji-map :mountain 'โ›ฐ๏ธ) + (hm/set! emoji-map :mountain 'โ›ฐ) + (hm/set! emoji-map :volcano '๐ŸŒ‹) + (hm/set! emoji-map :mount-fuji '๐Ÿ—ป) + (hm/set! emoji-map :camping '๐Ÿ•๏ธ) + (hm/set! emoji-map :camping '๐Ÿ•) + (hm/set! emoji-map :beach-with-umbrella '๐Ÿ–๏ธ) + (hm/set! emoji-map :beach-with-umbrella '๐Ÿ–) + (hm/set! emoji-map :desert '๐Ÿœ๏ธ) + (hm/set! emoji-map :desert '๐Ÿœ) + (hm/set! emoji-map :desert-island '๐Ÿ๏ธ) + (hm/set! emoji-map :desert-island '๐Ÿ) + (hm/set! emoji-map :national-park '๐Ÿž๏ธ) + (hm/set! emoji-map :national-park '๐Ÿž) + (hm/set! emoji-map :stadium '๐ŸŸ๏ธ) + (hm/set! emoji-map :stadium '๐ŸŸ) + (hm/set! emoji-map :classical-building '๐Ÿ›๏ธ) + (hm/set! emoji-map :classical-building '๐Ÿ›) + (hm/set! emoji-map :building-construction '๐Ÿ—๏ธ) + (hm/set! emoji-map :building-construction '๐Ÿ—) + (hm/set! emoji-map :brick '๐Ÿงฑ) + (hm/set! emoji-map :houses '๐Ÿ˜๏ธ) + (hm/set! emoji-map :houses '๐Ÿ˜) + (hm/set! emoji-map :derelict-house '๐Ÿš๏ธ) + (hm/set! emoji-map :derelict-house '๐Ÿš) + (hm/set! emoji-map :house '๐Ÿ ) + (hm/set! emoji-map :house-with-garden '๐Ÿก) + (hm/set! emoji-map :office-building '๐Ÿข) + (hm/set! emoji-map :Japanese-post-office '๐Ÿฃ) + (hm/set! emoji-map :post-office '๐Ÿค) + (hm/set! emoji-map :hospital '๐Ÿฅ) + (hm/set! emoji-map :bank '๐Ÿฆ) + (hm/set! emoji-map :hotel '๐Ÿจ) + (hm/set! emoji-map :love-hotel '๐Ÿฉ) + (hm/set! emoji-map :convenience-store '๐Ÿช) + (hm/set! emoji-map :school '๐Ÿซ) + (hm/set! emoji-map :department-store '๐Ÿฌ) + (hm/set! emoji-map :factory '๐Ÿญ) + (hm/set! emoji-map :Japanese-castle '๐Ÿฏ) + (hm/set! emoji-map :castle '๐Ÿฐ) + (hm/set! emoji-map :wedding '๐Ÿ’’) + (hm/set! emoji-map :Tokyo-tower '๐Ÿ—ผ) + (hm/set! emoji-map :Statue-of-Liberty '๐Ÿ—ฝ) + (hm/set! emoji-map :church 'โ›ช) + (hm/set! emoji-map :mosque '๐Ÿ•Œ) + (hm/set! emoji-map :hindu-temple '๐Ÿ›•) + (hm/set! emoji-map :synagogue '๐Ÿ•) + (hm/set! emoji-map :shinto-shrine 'โ›ฉ๏ธ) + (hm/set! emoji-map :shinto-shrine 'โ›ฉ) + (hm/set! emoji-map :kaaba '๐Ÿ•‹) + (hm/set! emoji-map :fountain 'โ›ฒ) + (hm/set! emoji-map :tent 'โ›บ) + (hm/set! emoji-map :foggy '๐ŸŒ) + (hm/set! emoji-map :night-with-stars '๐ŸŒƒ) + (hm/set! emoji-map :cityscape '๐Ÿ™๏ธ) + (hm/set! emoji-map :cityscape '๐Ÿ™) + (hm/set! emoji-map :sunrise-over-mountains '๐ŸŒ„) + (hm/set! emoji-map :sunrise '๐ŸŒ…) + (hm/set! emoji-map :cityscape-at-dusk '๐ŸŒ†) + (hm/set! emoji-map :sunset '๐ŸŒ‡) + (hm/set! emoji-map :bridge-at-night '๐ŸŒ‰) + (hm/set! emoji-map :hot-springs 'โ™จ๏ธ) + (hm/set! emoji-map :springs 'โ™จ-hot) + (hm/set! emoji-map :carousel-horse '๐ŸŽ ) + (hm/set! emoji-map :ferris-wheel '๐ŸŽก) + (hm/set! emoji-map :roller-coaster '๐ŸŽข) + (hm/set! emoji-map :barber-pole '๐Ÿ’ˆ) + (hm/set! emoji-map :circus-tent '๐ŸŽช) + (hm/set! emoji-map :locomotive '๐Ÿš‚) + (hm/set! emoji-map :railway-car '๐Ÿšƒ) + (hm/set! emoji-map :high-speed-train '๐Ÿš„) + (hm/set! emoji-map :bullet-train '๐Ÿš…) + (hm/set! emoji-map :train '๐Ÿš†) + (hm/set! emoji-map :metro '๐Ÿš‡) + (hm/set! emoji-map :light-rail '๐Ÿšˆ) + (hm/set! emoji-map :station '๐Ÿš‰) + (hm/set! emoji-map :tram '๐ŸšŠ) + (hm/set! emoji-map :monorail '๐Ÿš) + (hm/set! emoji-map :mountain-railway '๐Ÿšž) + (hm/set! emoji-map :tram-car '๐Ÿš‹) + (hm/set! emoji-map :bus '๐ŸšŒ) + (hm/set! emoji-map :oncoming-bus '๐Ÿš) + (hm/set! emoji-map :trolleybus '๐ŸšŽ) + (hm/set! emoji-map :minibus '๐Ÿš) + (hm/set! emoji-map :ambulance '๐Ÿš‘) + (hm/set! emoji-map :fire-engine '๐Ÿš’) + (hm/set! emoji-map :police-car '๐Ÿš“) + (hm/set! emoji-map :oncoming-police-car '๐Ÿš”) + (hm/set! emoji-map :taxi '๐Ÿš•) + (hm/set! emoji-map :oncoming-taxi '๐Ÿš–) + (hm/set! emoji-map :automobile '๐Ÿš—) + (hm/set! emoji-map :oncoming-automobile '๐Ÿš˜) + (hm/set! emoji-map :sport-utility-vehicle '๐Ÿš™) + (hm/set! emoji-map :delivery-truck '๐Ÿšš) + (hm/set! emoji-map :articulated-lorry '๐Ÿš›) + (hm/set! emoji-map :tractor '๐Ÿšœ) + (hm/set! emoji-map :racing-car '๐ŸŽ๏ธ) + (hm/set! emoji-map :racing-car '๐ŸŽ) + (hm/set! emoji-map :motorcycle '๐Ÿ๏ธ) + (hm/set! emoji-map :motorcycle '๐Ÿ) + (hm/set! emoji-map :motor-scooter '๐Ÿ›ต) + (hm/set! emoji-map :manual-wheelchair '๐Ÿฆฝ) + (hm/set! emoji-map :motorized-wheelchair '๐Ÿฆผ) + (hm/set! emoji-map :auto-rickshaw '๐Ÿ›บ) + (hm/set! emoji-map :bicycle '๐Ÿšฒ) + (hm/set! emoji-map :kick-scooter '๐Ÿ›ด) + (hm/set! emoji-map :skateboard '๐Ÿ›น) + (hm/set! emoji-map :bus-stop '๐Ÿš) + (hm/set! emoji-map :motorway '๐Ÿ›ฃ๏ธ) + (hm/set! emoji-map :motorway '๐Ÿ›ฃ) + (hm/set! emoji-map :railway-track '๐Ÿ›ค๏ธ) + (hm/set! emoji-map :railway-track '๐Ÿ›ค) + (hm/set! emoji-map :oil-drum '๐Ÿ›ข๏ธ) + (hm/set! emoji-map :oil-drum '๐Ÿ›ข) + (hm/set! emoji-map :fuel-pump 'โ›ฝ) + (hm/set! emoji-map :police-car-light '๐Ÿšจ) + (hm/set! emoji-map :horizontal-traffic-light '๐Ÿšฅ) + (hm/set! emoji-map :vertical-traffic-light '๐Ÿšฆ) + (hm/set! emoji-map :stop-sign '๐Ÿ›‘) + (hm/set! emoji-map :construction '๐Ÿšง) + (hm/set! emoji-map :anchor 'โš“) + (hm/set! emoji-map :sailboat 'โ›ต) + (hm/set! emoji-map :canoe '๐Ÿ›ถ) + (hm/set! emoji-map :speedboat '๐Ÿšค) + (hm/set! emoji-map :passenger-ship '๐Ÿ›ณ๏ธ) + (hm/set! emoji-map :passenger-ship '๐Ÿ›ณ) + (hm/set! emoji-map :ferry 'โ›ด๏ธ) + (hm/set! emoji-map :ferry 'โ›ด) + (hm/set! emoji-map :motor-boat '๐Ÿ›ฅ๏ธ) + (hm/set! emoji-map :motor-boat '๐Ÿ›ฅ) + (hm/set! emoji-map :ship '๐Ÿšข) + (hm/set! emoji-map :airplane 'โœˆ๏ธ) + (hm/set! emoji-map :airplane 'โœˆ) + (hm/set! emoji-map :small-airplane '๐Ÿ›ฉ๏ธ) + (hm/set! emoji-map :small-airplane '๐Ÿ›ฉ) + (hm/set! emoji-map :airplane-departure '๐Ÿ›ซ) + (hm/set! emoji-map :airplane-arrival '๐Ÿ›ฌ) + (hm/set! emoji-map :parachute '๐Ÿช‚) + (hm/set! emoji-map :seat '๐Ÿ’บ) + (hm/set! emoji-map :helicopter '๐Ÿš) + (hm/set! emoji-map :suspension-railway '๐ŸšŸ) + (hm/set! emoji-map :mountain-cableway '๐Ÿš ) + (hm/set! emoji-map :aerial-tramway '๐Ÿšก) + (hm/set! emoji-map :satellite '๐Ÿ›ฐ๏ธ) + (hm/set! emoji-map :satellite '๐Ÿ›ฐ) + (hm/set! emoji-map :rocket '๐Ÿš€) + (hm/set! emoji-map :flying-saucer '๐Ÿ›ธ) + (hm/set! emoji-map :bellhop-bell '๐Ÿ›Ž๏ธ) + (hm/set! emoji-map :bellhop-bell '๐Ÿ›Ž) + (hm/set! emoji-map :luggage '๐Ÿงณ) + (hm/set! emoji-map :done 'โŒ›-hourglass) + (hm/set! emoji-map :not-done 'โณ-hourglass) + (hm/set! emoji-map :clock 'โŒš-watch) + (hm/set! emoji-map :stopwatch 'โฑ๏ธ) + (hm/set! emoji-map :timer-clock 'โฑ-stopwatch) + (hm/set! emoji-map :clock 'โฒ-timer) + (hm/set! emoji-map :mantelpiece-clock '๐Ÿ•ฐ๏ธ) + (hm/set! emoji-map :mantelpiece-clock '๐Ÿ•ฐ) + (hm/set! emoji-map :twelve-o-clock '๐Ÿ•›) + (hm/set! emoji-map :twelve-thirty '๐Ÿ•ง) + (hm/set! emoji-map :one-o-clock '๐Ÿ•) + (hm/set! emoji-map :one-thirty '๐Ÿ•œ) + (hm/set! emoji-map :two-o-clock '๐Ÿ•‘) + (hm/set! emoji-map :two-thirty '๐Ÿ•) + (hm/set! emoji-map :three-o-clock '๐Ÿ•’) + (hm/set! emoji-map :three-thirty '๐Ÿ•ž) + (hm/set! emoji-map :four-o-clock '๐Ÿ•“) + (hm/set! emoji-map :four-thirty '๐Ÿ•Ÿ) + (hm/set! emoji-map :five-o-clock '๐Ÿ•”) + (hm/set! emoji-map :five-thirty '๐Ÿ• ) + (hm/set! emoji-map :six-o-clock '๐Ÿ••) + (hm/set! emoji-map :six-thirty '๐Ÿ•ก) + (hm/set! emoji-map :seven-o-clock '๐Ÿ•–) + (hm/set! emoji-map :seven-thirty '๐Ÿ•ข) + (hm/set! emoji-map :eight-o-clock '๐Ÿ•—) + (hm/set! emoji-map :eight-thirty '๐Ÿ•ฃ) + (hm/set! emoji-map :nine-o-clock '๐Ÿ•˜) + (hm/set! emoji-map :nine-thirty '๐Ÿ•ค) + (hm/set! emoji-map :ten-o-clock '๐Ÿ•™) + (hm/set! emoji-map :ten-thirty '๐Ÿ•ฅ) + (hm/set! emoji-map :eleven-o-clock '๐Ÿ•š) + (hm/set! emoji-map :eleven-thirty '๐Ÿ•ฆ) + (hm/set! emoji-map :new-moon '๐ŸŒ‘) + (hm/set! emoji-map :waxing-crescent-moon '๐ŸŒ’) + (hm/set! emoji-map :first-quarter-moon '๐ŸŒ“) + (hm/set! emoji-map :waxing-gibbous-moon '๐ŸŒ”) + (hm/set! emoji-map :full-moon '๐ŸŒ•) + (hm/set! emoji-map :waning-gibbous-moon '๐ŸŒ–) + (hm/set! emoji-map :last-quarter-moon '๐ŸŒ—) + (hm/set! emoji-map :waning-crescent-moon '๐ŸŒ˜) + (hm/set! emoji-map :crescent-moon '๐ŸŒ™) + (hm/set! emoji-map :new-moon-face '๐ŸŒš) + (hm/set! emoji-map :first-quarter-moon-face '๐ŸŒ›) + (hm/set! emoji-map :last-quarter-moon-face '๐ŸŒœ) + (hm/set! emoji-map :thermometer '๐ŸŒก๏ธ) + (hm/set! emoji-map :thermometer '๐ŸŒก) + (hm/set! emoji-map :sun 'โ˜€๏ธ) + (hm/set! emoji-map :sun 'โ˜€) + (hm/set! emoji-map :full-moon-face '๐ŸŒ) + (hm/set! emoji-map :sun-with-face '๐ŸŒž) + (hm/set! emoji-map :ringed-planet '๐Ÿช) + (hm/set! emoji-map :glowing-star '๐ŸŒŸ) + (hm/set! emoji-map :shooting-star '๐ŸŒ ) + (hm/set! emoji-map :milky-way '๐ŸŒŒ) + (hm/set! emoji-map :cloud 'โ˜๏ธ) + (hm/set! emoji-map :cloud 'โ˜) + (hm/set! emoji-map :sun-behind-cloud 'โ›…) + (hm/set! emoji-map :cloud-with-lightning-and-rain 'โ›ˆ๏ธ) + (hm/set! emoji-map :cloud-with-lightning-and-rain 'โ›ˆ) + (hm/set! emoji-map :sun-behind-small-cloud '๐ŸŒค๏ธ) + (hm/set! emoji-map :sun-behind-small-cloud '๐ŸŒค) + (hm/set! emoji-map :sun-behind-large-cloud '๐ŸŒฅ๏ธ) + (hm/set! emoji-map :sun-behind-large-cloud '๐ŸŒฅ) + (hm/set! emoji-map :sun-behind-rain-cloud '๐ŸŒฆ๏ธ) + (hm/set! emoji-map :sun-behind-rain-cloud '๐ŸŒฆ) + (hm/set! emoji-map :cloud-with-rain '๐ŸŒง๏ธ) + (hm/set! emoji-map :cloud-with-rain '๐ŸŒง) + (hm/set! emoji-map :cloud-with-snow '๐ŸŒจ๏ธ) + (hm/set! emoji-map :cloud-with-snow '๐ŸŒจ) + (hm/set! emoji-map :cloud-with-lightning '๐ŸŒฉ๏ธ) + (hm/set! emoji-map :cloud-with-lightning '๐ŸŒฉ) + (hm/set! emoji-map :tornado '๐ŸŒช๏ธ) + (hm/set! emoji-map :tornado '๐ŸŒช) + (hm/set! emoji-map :fog '๐ŸŒซ๏ธ) + (hm/set! emoji-map :fog '๐ŸŒซ) + (hm/set! emoji-map :wind-face '๐ŸŒฌ๏ธ) + (hm/set! emoji-map :wind-face '๐ŸŒฌ) + (hm/set! emoji-map :cyclone '๐ŸŒ€) + (hm/set! emoji-map :rainbow '๐ŸŒˆ) + (hm/set! emoji-map :closed-umbrella '๐ŸŒ‚) + (hm/set! emoji-map :umbrella 'โ˜‚๏ธ) + (hm/set! emoji-map :umbrella 'โ˜‚) + (hm/set! emoji-map :umbrella-with-rain-drops 'โ˜”) + (hm/set! emoji-map :umbrella-on-ground 'โ›ฑ๏ธ) + (hm/set! emoji-map :umbrella-on-ground 'โ›ฑ) + (hm/set! emoji-map :high-voltage 'โšก) + (hm/set! emoji-map :snowflake 'โ„๏ธ) + (hm/set! emoji-map :snowflake 'โ„) + (hm/set! emoji-map :snowman 'โ˜ƒ๏ธ) + (hm/set! emoji-map :snowman 'โ˜ƒ) + (hm/set! emoji-map :snowman-without-snow 'โ›„) + (hm/set! emoji-map :comet 'โ˜„๏ธ) + (hm/set! emoji-map :comet 'โ˜„) + (hm/set! emoji-map :fire '๐Ÿ”ฅ) + (hm/set! emoji-map :droplet '๐Ÿ’ง) + (hm/set! emoji-map :water-wave '๐ŸŒŠ) + (hm/set! emoji-map :Christmas-tree '๐ŸŽ„) + (hm/set! emoji-map :fireworks '๐ŸŽ†) + (hm/set! emoji-map :sparkler '๐ŸŽ‡) + (hm/set! emoji-map :firecracker '๐Ÿงจ) + (hm/set! emoji-map :sparkles 'โœจ) + (hm/set! emoji-map :balloon '๐ŸŽˆ) + (hm/set! emoji-map :party-popper '๐ŸŽ‰) + (hm/set! emoji-map :confetti-ball '๐ŸŽŠ) + (hm/set! emoji-map :tanabata-tree '๐ŸŽ‹) + (hm/set! emoji-map :pine-decoration '๐ŸŽ) + (hm/set! emoji-map :Japanese-dolls '๐ŸŽŽ) + (hm/set! emoji-map :carp-streamer '๐ŸŽ) + (hm/set! emoji-map :wind-chime '๐ŸŽ) + (hm/set! emoji-map :moon-viewing-ceremony '๐ŸŽ‘) + (hm/set! emoji-map :red-envelope '๐Ÿงง) + (hm/set! emoji-map :ribbon '๐ŸŽ€) + (hm/set! emoji-map :wrapped-gift '๐ŸŽ) + (hm/set! emoji-map :reminder-ribbon '๐ŸŽ—๏ธ) + (hm/set! emoji-map :reminder-ribbon '๐ŸŽ—) + (hm/set! emoji-map :admission-tickets '๐ŸŽŸ๏ธ) + (hm/set! emoji-map :admission-tickets '๐ŸŽŸ) + (hm/set! emoji-map :ticket '๐ŸŽซ) + (hm/set! emoji-map :military-medal '๐ŸŽ–๏ธ) + (hm/set! emoji-map :military-medal '๐ŸŽ–) + (hm/set! emoji-map :trophy '๐Ÿ†) + (hm/set! emoji-map :sports-medal '๐Ÿ…) + (hm/set! emoji-map :1st-place-medal '๐Ÿฅ‡) + (hm/set! emoji-map :2nd-place-medal '๐Ÿฅˆ) + (hm/set! emoji-map :3rd-place-medal '๐Ÿฅ‰) + (hm/set! emoji-map :soccer-ball 'โšฝ) + (hm/set! emoji-map :baseball 'โšพ) + (hm/set! emoji-map :softball '๐ŸฅŽ) + (hm/set! emoji-map :basketball '๐Ÿ€) + (hm/set! emoji-map :volleyball '๐Ÿ) + (hm/set! emoji-map :american-football '๐Ÿˆ) + (hm/set! emoji-map :rugby-football '๐Ÿ‰) + (hm/set! emoji-map :tennis '๐ŸŽพ) + (hm/set! emoji-map :flying-disc '๐Ÿฅ) + (hm/set! emoji-map :bowling '๐ŸŽณ) + (hm/set! emoji-map :cricket-game '๐Ÿ) + (hm/set! emoji-map :field-hockey '๐Ÿ‘) + (hm/set! emoji-map :ice-hockey '๐Ÿ’) + (hm/set! emoji-map :lacrosse '๐Ÿฅ) + (hm/set! emoji-map :ping-pong '๐Ÿ“) + (hm/set! emoji-map :badminton '๐Ÿธ) + (hm/set! emoji-map :boxing-glove '๐ŸฅŠ) + (hm/set! emoji-map :martial-arts-uniform '๐Ÿฅ‹) + (hm/set! emoji-map :goal-net '๐Ÿฅ…) + (hm/set! emoji-map :flag-in-hole 'โ›ณ) + (hm/set! emoji-map :ice-skate 'โ›ธ๏ธ) + (hm/set! emoji-map :ice-skate 'โ›ธ) + (hm/set! emoji-map :fishing-pole '๐ŸŽฃ) + (hm/set! emoji-map :diving-mask '๐Ÿคฟ) + (hm/set! emoji-map :running-shirt '๐ŸŽฝ) + (hm/set! emoji-map :skis '๐ŸŽฟ) + (hm/set! emoji-map :sled '๐Ÿ›ท) + (hm/set! emoji-map :curling-stone '๐ŸฅŒ) + (hm/set! emoji-map :direct-hit '๐ŸŽฏ) + (hm/set! emoji-map :yo-yo '๐Ÿช€) + (hm/set! emoji-map :kite '๐Ÿช) + (hm/set! emoji-map :pool-8-ball '๐ŸŽฑ) + (hm/set! emoji-map :crystal-ball '๐Ÿ”ฎ) + (hm/set! emoji-map :nazar-amulet '๐Ÿงฟ) + (hm/set! emoji-map :video-game '๐ŸŽฎ) + (hm/set! emoji-map :joystick '๐Ÿ•น๏ธ) + (hm/set! emoji-map :joystick '๐Ÿ•น) + (hm/set! emoji-map :slot-machine '๐ŸŽฐ) + (hm/set! emoji-map :game-die '๐ŸŽฒ) + (hm/set! emoji-map :puzzle-piece '๐Ÿงฉ) + (hm/set! emoji-map :teddy-bear '๐Ÿงธ) + (hm/set! emoji-map :spade-suit 'โ™ ๏ธ) + (hm/set! emoji-map :suit 'โ™ -spade) + (hm/set! emoji-map :heart-suit 'โ™ฅ๏ธ) + (hm/set! emoji-map :suit 'โ™ฅ-heart) + (hm/set! emoji-map :diamond-suit 'โ™ฆ๏ธ) + (hm/set! emoji-map :diamond-suit 'โ™ฆ) + (hm/set! emoji-map :club-suit 'โ™ฃ๏ธ) + (hm/set! emoji-map :suit 'โ™ฃ-club) + (hm/set! emoji-map :chess-pawn 'โ™Ÿ๏ธ) + (hm/set! emoji-map :chess-pawn 'โ™Ÿ) + (hm/set! emoji-map :joker '๐Ÿƒ) + (hm/set! emoji-map :mahjong-red-dragon '๐Ÿ€„) + (hm/set! emoji-map :flower-playing-cards '๐ŸŽด) + (hm/set! emoji-map :performing-arts '๐ŸŽญ) + (hm/set! emoji-map :framed-picture '๐Ÿ–ผ๏ธ) + (hm/set! emoji-map :framed-picture '๐Ÿ–ผ) + (hm/set! emoji-map :artist-palette '๐ŸŽจ) + (hm/set! emoji-map :thread '๐Ÿงต) + (hm/set! emoji-map :yarn '๐Ÿงถ) + (hm/set! emoji-map :sunglasses '๐Ÿ•ถ๏ธ) + (hm/set! emoji-map :sunglasses '๐Ÿ•ถ) + (hm/set! emoji-map :goggles '๐Ÿฅฝ) + (hm/set! emoji-map :lab-coat '๐Ÿฅผ) + (hm/set! emoji-map :safety-vest '๐Ÿฆบ) + (hm/set! emoji-map :necktie '๐Ÿ‘”) + (hm/set! emoji-map :t-shirt '๐Ÿ‘•) + (hm/set! emoji-map :jeans '๐Ÿ‘–) + (hm/set! emoji-map :scarf '๐Ÿงฃ) + (hm/set! emoji-map :gloves '๐Ÿงค) + (hm/set! emoji-map :coat '๐Ÿงฅ) + (hm/set! emoji-map :socks '๐Ÿงฆ) + (hm/set! emoji-map :dress '๐Ÿ‘—) + (hm/set! emoji-map :kimono '๐Ÿ‘˜) + (hm/set! emoji-map :sari '๐Ÿฅป) + (hm/set! emoji-map :one-piece-swimsuit '๐Ÿฉฑ) + (hm/set! emoji-map :swim-brief '๐Ÿฉฒ) + (hm/set! emoji-map :shorts '๐Ÿฉณ) + (hm/set! emoji-map :bikini '๐Ÿ‘™) + (hm/set! emoji-map :woman-s-clothes '๐Ÿ‘š) + (hm/set! emoji-map :purse '๐Ÿ‘›) + (hm/set! emoji-map :handbag '๐Ÿ‘œ) + (hm/set! emoji-map :clutch-bag '๐Ÿ‘) + (hm/set! emoji-map :shopping-bags '๐Ÿ›๏ธ) + (hm/set! emoji-map :shopping-bags '๐Ÿ›) + (hm/set! emoji-map :backpack '๐ŸŽ’) + (hm/set! emoji-map :man-s-shoe '๐Ÿ‘ž) + (hm/set! emoji-map :running-shoe '๐Ÿ‘Ÿ) + (hm/set! emoji-map :hiking-boot '๐Ÿฅพ) + (hm/set! emoji-map :flat-shoe '๐Ÿฅฟ) + (hm/set! emoji-map :high-heeled-shoe '๐Ÿ‘ ) + (hm/set! emoji-map :woman-s-sandal '๐Ÿ‘ก) + (hm/set! emoji-map :ballet-shoes '๐Ÿฉฐ) + (hm/set! emoji-map :woman-s-boot '๐Ÿ‘ข) + (hm/set! emoji-map :crown '๐Ÿ‘‘) + (hm/set! emoji-map :woman-s-hat '๐Ÿ‘’) + (hm/set! emoji-map :top-hat '๐ŸŽฉ) + (hm/set! emoji-map :graduation-cap '๐ŸŽ“) + (hm/set! emoji-map :billed-cap '๐Ÿงข) + (hm/set! emoji-map :rescue-worker-s-helmet 'โ›‘๏ธ) + (hm/set! emoji-map :rescue-worker-s-helmet 'โ›‘) + (hm/set! emoji-map :prayer-beads '๐Ÿ“ฟ) + (hm/set! emoji-map :lipstick '๐Ÿ’„) + (hm/set! emoji-map :ring '๐Ÿ’) + (hm/set! emoji-map :gem-stone '๐Ÿ’Ž) + (hm/set! emoji-map :muted-speaker '๐Ÿ”‡) + (hm/set! emoji-map :speaker-low-volume '๐Ÿ”ˆ) + (hm/set! emoji-map :speaker-medium-volume '๐Ÿ”‰) + (hm/set! emoji-map :speaker-high-volume '๐Ÿ”Š) + (hm/set! emoji-map :loudspeaker '๐Ÿ“ข) + (hm/set! emoji-map :megaphone '๐Ÿ“ฃ) + (hm/set! emoji-map :postal-horn '๐Ÿ“ฏ) + (hm/set! emoji-map :bell '๐Ÿ””) + (hm/set! emoji-map :bell-with-slash '๐Ÿ”•) + (hm/set! emoji-map :musical-score '๐ŸŽผ) + (hm/set! emoji-map :musical-note '๐ŸŽต) + (hm/set! emoji-map :musical-notes '๐ŸŽถ) + (hm/set! emoji-map :studio-microphone '๐ŸŽ™๏ธ) + (hm/set! emoji-map :studio-microphone '๐ŸŽ™) + (hm/set! emoji-map :level-slider '๐ŸŽš๏ธ) + (hm/set! emoji-map :level-slider '๐ŸŽš) + (hm/set! emoji-map :control-knobs '๐ŸŽ›๏ธ) + (hm/set! emoji-map :control-knobs '๐ŸŽ›) + (hm/set! emoji-map :microphone '๐ŸŽค) + (hm/set! emoji-map :headphone '๐ŸŽง) + (hm/set! emoji-map :radio '๐Ÿ“ป) + (hm/set! emoji-map :saxophone '๐ŸŽท) + (hm/set! emoji-map :guitar '๐ŸŽธ) + (hm/set! emoji-map :musical-keyboard '๐ŸŽน) + (hm/set! emoji-map :trumpet '๐ŸŽบ) + (hm/set! emoji-map :violin '๐ŸŽป) + (hm/set! emoji-map :banjo '๐Ÿช•) + (hm/set! emoji-map :drum '๐Ÿฅ) + (hm/set! emoji-map :mobile-phone '๐Ÿ“ฑ) + (hm/set! emoji-map :mobile-phone-with-arrow '๐Ÿ“ฒ) + (hm/set! emoji-map :telephone 'โ˜Ž๏ธ) + (hm/set! emoji-map :telephone-receiver '๐Ÿ“ž) + (hm/set! emoji-map :pager '๐Ÿ“Ÿ) + (hm/set! emoji-map :fax-machine '๐Ÿ“ ) + (hm/set! emoji-map :battery '๐Ÿ”‹) + (hm/set! emoji-map :electric-plug '๐Ÿ”Œ) + (hm/set! emoji-map :laptop-computer '๐Ÿ’ป) + (hm/set! emoji-map :desktop-computer '๐Ÿ–ฅ๏ธ) + (hm/set! emoji-map :desktop-computer '๐Ÿ–ฅ) + (hm/set! emoji-map :printer '๐Ÿ–จ๏ธ) + (hm/set! emoji-map :printer '๐Ÿ–จ) + (hm/set! emoji-map :keyboard 'โŒจ๏ธ) + (hm/set! emoji-map :computer-mouse '๐Ÿ–ฑ๏ธ) + (hm/set! emoji-map :computer-mouse '๐Ÿ–ฑ) + (hm/set! emoji-map :trackball '๐Ÿ–ฒ๏ธ) + (hm/set! emoji-map :trackball '๐Ÿ–ฒ) + (hm/set! emoji-map :computer-disk '๐Ÿ’ฝ) + (hm/set! emoji-map :floppy-disk '๐Ÿ’พ) + (hm/set! emoji-map :optical-disk '๐Ÿ’ฟ) + (hm/set! emoji-map :dvd '๐Ÿ“€) + (hm/set! emoji-map :abacus '๐Ÿงฎ) + (hm/set! emoji-map :movie-camera '๐ŸŽฅ) + (hm/set! emoji-map :film-frames '๐ŸŽž๏ธ) + (hm/set! emoji-map :film-frames '๐ŸŽž) + (hm/set! emoji-map :film-projector '๐Ÿ“ฝ๏ธ) + (hm/set! emoji-map :film-projector '๐Ÿ“ฝ) + (hm/set! emoji-map :clapper-board '๐ŸŽฌ) + (hm/set! emoji-map :television '๐Ÿ“บ) + (hm/set! emoji-map :camera '๐Ÿ“ท) + (hm/set! emoji-map :camera-with-flash '๐Ÿ“ธ) + (hm/set! emoji-map :video-camera '๐Ÿ“น) + (hm/set! emoji-map :videocassette '๐Ÿ“ผ) + (hm/set! emoji-map :magnifying-glass-tilted-left '๐Ÿ”) + (hm/set! emoji-map :magnifying-glass-tilted-right '๐Ÿ”Ž) + (hm/set! emoji-map :candle '๐Ÿ•ฏ๏ธ) + (hm/set! emoji-map :candle '๐Ÿ•ฏ) + (hm/set! emoji-map :light-bulb '๐Ÿ’ก) + (hm/set! emoji-map :flashlight '๐Ÿ”ฆ) + (hm/set! emoji-map :red-paper-lantern '๐Ÿฎ) + (hm/set! emoji-map :diya-lamp '๐Ÿช”) + (hm/set! emoji-map :notebook-with-decorative-cover '๐Ÿ“”) + (hm/set! emoji-map :closed-book '๐Ÿ“•) + (hm/set! emoji-map :open-book '๐Ÿ“–) + (hm/set! emoji-map :green-book '๐Ÿ“—) + (hm/set! emoji-map :blue-book '๐Ÿ“˜) + (hm/set! emoji-map :orange-book '๐Ÿ“™) + (hm/set! emoji-map :books '๐Ÿ“š) + (hm/set! emoji-map :notebook '๐Ÿ““) + (hm/set! emoji-map :ledger '๐Ÿ“’) + (hm/set! emoji-map :page-with-curl '๐Ÿ“ƒ) + (hm/set! emoji-map :scroll '๐Ÿ“œ) + (hm/set! emoji-map :page-facing-up '๐Ÿ“„) + (hm/set! emoji-map :newspaper '๐Ÿ“ฐ) + (hm/set! emoji-map :rolled-up-newspaper '๐Ÿ—ž๏ธ) + (hm/set! emoji-map :rolled-up-newspaper '๐Ÿ—ž) + (hm/set! emoji-map :bookmark-tabs '๐Ÿ“‘) + (hm/set! emoji-map :bookmark '๐Ÿ”–) + (hm/set! emoji-map :label '๐Ÿท๏ธ) + (hm/set! emoji-map :label '๐Ÿท) + (hm/set! emoji-map :money-bag '๐Ÿ’ฐ) + (hm/set! emoji-map :yen-banknote '๐Ÿ’ด) + (hm/set! emoji-map :dollar-banknote '๐Ÿ’ต) + (hm/set! emoji-map :euro-banknote '๐Ÿ’ถ) + (hm/set! emoji-map :pound-banknote '๐Ÿ’ท) + (hm/set! emoji-map :money-with-wings '๐Ÿ’ธ) + (hm/set! emoji-map :credit-card '๐Ÿ’ณ) + (hm/set! emoji-map :receipt '๐Ÿงพ) + (hm/set! emoji-map :chart-increasing-with-yen '๐Ÿ’น) + (hm/set! emoji-map :currency-exchange '๐Ÿ’ฑ) + (hm/set! emoji-map :heavy-dollar-sign '๐Ÿ’ฒ) + (hm/set! emoji-map :envelope 'โœ‰๏ธ) + (hm/set! emoji-map :envelope 'โœ‰) + (hm/set! emoji-map :e-mail '๐Ÿ“ง) + (hm/set! emoji-map :incoming-envelope '๐Ÿ“จ) + (hm/set! emoji-map :envelope-with-arrow '๐Ÿ“ฉ) + (hm/set! emoji-map :outbox-tray '๐Ÿ“ค) + (hm/set! emoji-map :inbox-tray '๐Ÿ“ฅ) + (hm/set! emoji-map :package '๐Ÿ“ฆ) + (hm/set! emoji-map :closed-mailbox-with-raised-flag '๐Ÿ“ซ) + (hm/set! emoji-map :closed-mailbox-with-lowered-flag '๐Ÿ“ช) + (hm/set! emoji-map :open-mailbox-with-raised-flag '๐Ÿ“ฌ) + (hm/set! emoji-map :open-mailbox-with-lowered-flag '๐Ÿ“ญ) + (hm/set! emoji-map :postbox '๐Ÿ“ฎ) + (hm/set! emoji-map :ballot-box-with-ballot '๐Ÿ—ณ๏ธ) + (hm/set! emoji-map :ballot-box-with-ballot '๐Ÿ—ณ) + (hm/set! emoji-map :pencil 'โœ๏ธ) + (hm/set! emoji-map :pencil 'โœ) + (hm/set! emoji-map :black-nib 'โœ’๏ธ) + (hm/set! emoji-map :black-nib 'โœ’) + (hm/set! emoji-map :fountain-pen '๐Ÿ–‹๏ธ) + (hm/set! emoji-map :fountain-pen '๐Ÿ–‹) + (hm/set! emoji-map :pen '๐Ÿ–Š๏ธ) + (hm/set! emoji-map :pen '๐Ÿ–Š) + (hm/set! emoji-map :paintbrush '๐Ÿ–Œ๏ธ) + (hm/set! emoji-map :paintbrush '๐Ÿ–Œ) + (hm/set! emoji-map :crayon '๐Ÿ–๏ธ) + (hm/set! emoji-map :crayon '๐Ÿ–) + (hm/set! emoji-map :memo '๐Ÿ“) + (hm/set! emoji-map :briefcase '๐Ÿ’ผ) + (hm/set! emoji-map :file-folder '๐Ÿ“) + (hm/set! emoji-map :open-file-folder '๐Ÿ“‚) + (hm/set! emoji-map :card-index-dividers '๐Ÿ—‚๏ธ) + (hm/set! emoji-map :card-index-dividers '๐Ÿ—‚) + (hm/set! emoji-map :calendar '๐Ÿ“…) + (hm/set! emoji-map :tear-off-calendar '๐Ÿ“†) + (hm/set! emoji-map :spiral-notepad '๐Ÿ—’๏ธ) + (hm/set! emoji-map :spiral-notepad '๐Ÿ—’) + (hm/set! emoji-map :spiral-calendar '๐Ÿ—“๏ธ) + (hm/set! emoji-map :spiral-calendar '๐Ÿ—“) + (hm/set! emoji-map :card-index '๐Ÿ“‡) + (hm/set! emoji-map :chart-increasing '๐Ÿ“ˆ) + (hm/set! emoji-map :chart-decreasing '๐Ÿ“‰) + (hm/set! emoji-map :bar-chart '๐Ÿ“Š) + (hm/set! emoji-map :clipboard '๐Ÿ“‹) + (hm/set! emoji-map :pushpin '๐Ÿ“Œ) + (hm/set! emoji-map :round-pushpin '๐Ÿ“) + (hm/set! emoji-map :paperclip '๐Ÿ“Ž) + (hm/set! emoji-map :linked-paperclips '๐Ÿ–‡๏ธ) + (hm/set! emoji-map :linked-paperclips '๐Ÿ–‡) + (hm/set! emoji-map :straight-ruler '๐Ÿ“) + (hm/set! emoji-map :triangular-ruler '๐Ÿ“) + (hm/set! emoji-map :scissors 'โœ‚๏ธ) + (hm/set! emoji-map :scissors 'โœ‚) + (hm/set! emoji-map :card-file-box '๐Ÿ—ƒ๏ธ) + (hm/set! emoji-map :card-file-box '๐Ÿ—ƒ) + (hm/set! emoji-map :file-cabinet '๐Ÿ—„๏ธ) + (hm/set! emoji-map :file-cabinet '๐Ÿ—„) + (hm/set! emoji-map :wastebasket '๐Ÿ—‘๏ธ) + (hm/set! emoji-map :wastebasket '๐Ÿ—‘) + (hm/set! emoji-map :locked '๐Ÿ”’) + (hm/set! emoji-map :unlocked '๐Ÿ”“) + (hm/set! emoji-map :locked-with-pen '๐Ÿ”) + (hm/set! emoji-map :locked-with-key '๐Ÿ”) + (hm/set! emoji-map :key '๐Ÿ”‘) + (hm/set! emoji-map :old-key '๐Ÿ—๏ธ) + (hm/set! emoji-map :old-key '๐Ÿ—) + (hm/set! emoji-map :hammer '๐Ÿ”จ) + (hm/set! emoji-map :axe '๐Ÿช“) + (hm/set! emoji-map :pick 'โ›๏ธ) + (hm/set! emoji-map :pick 'โ›) + (hm/set! emoji-map :hammer-and-pick 'โš’๏ธ) + (hm/set! emoji-map :hammer-and-pick 'โš’) + (hm/set! emoji-map :hammer-and-wrench '๐Ÿ› ๏ธ) + (hm/set! emoji-map :hammer-and-wrench '๐Ÿ› ) + (hm/set! emoji-map :dagger '๐Ÿ—ก๏ธ) + (hm/set! emoji-map :dagger '๐Ÿ—ก) + (hm/set! emoji-map :crossed-swords 'โš”๏ธ) + (hm/set! emoji-map :crossed-swords 'โš”) + (hm/set! emoji-map :pistol '๐Ÿ”ซ) + (hm/set! emoji-map :bow-and-arrow '๐Ÿน) + (hm/set! emoji-map :shield '๐Ÿ›ก๏ธ) + (hm/set! emoji-map :shield '๐Ÿ›ก) + (hm/set! emoji-map :wrench '๐Ÿ”ง) + (hm/set! emoji-map :nut-and-bolt '๐Ÿ”ฉ) + (hm/set! emoji-map :gear 'โš™๏ธ) + (hm/set! emoji-map :gear 'โš™) + (hm/set! emoji-map :clamp '๐Ÿ—œ๏ธ) + (hm/set! emoji-map :clamp '๐Ÿ—œ) + (hm/set! emoji-map :balance-scale 'โš–๏ธ) + (hm/set! emoji-map :balance-scale 'โš–) + (hm/set! emoji-map :probing-cane '๐Ÿฆฏ) + (hm/set! emoji-map :link '๐Ÿ”—) + (hm/set! emoji-map :chains 'โ›“๏ธ) + (hm/set! emoji-map :chains 'โ›“) + (hm/set! emoji-map :toolbox '๐Ÿงฐ) + (hm/set! emoji-map :magnet '๐Ÿงฒ) + (hm/set! emoji-map :alembic 'โš—๏ธ) + (hm/set! emoji-map :alembic 'โš—) + (hm/set! emoji-map :test-tube '๐Ÿงช) + (hm/set! emoji-map :petri-dish '๐Ÿงซ) + (hm/set! emoji-map :dna '๐Ÿงฌ) + (hm/set! emoji-map :microscope '๐Ÿ”ฌ) + (hm/set! emoji-map :telescope '๐Ÿ”ญ) + (hm/set! emoji-map :satellite-antenna '๐Ÿ“ก) + (hm/set! emoji-map :syringe '๐Ÿ’‰) + (hm/set! emoji-map :drop-of-blood '๐Ÿฉธ) + (hm/set! emoji-map :pill '๐Ÿ’Š) + (hm/set! emoji-map :adhesive-bandage '๐Ÿฉน) + (hm/set! emoji-map :stethoscope '๐Ÿฉบ) + (hm/set! emoji-map :door '๐Ÿšช) + (hm/set! emoji-map :bed '๐Ÿ›๏ธ) + (hm/set! emoji-map :bed '๐Ÿ›) + (hm/set! emoji-map :couch-and-lamp '๐Ÿ›‹๏ธ) + (hm/set! emoji-map :couch-and-lamp '๐Ÿ›‹) + (hm/set! emoji-map :chair '๐Ÿช‘) + (hm/set! emoji-map :toilet '๐Ÿšฝ) + (hm/set! emoji-map :shower '๐Ÿšฟ) + (hm/set! emoji-map :bathtub '๐Ÿ›) + (hm/set! emoji-map :razor '๐Ÿช’) + (hm/set! emoji-map :lotion-bottle '๐Ÿงด) + (hm/set! emoji-map :safety-pin '๐Ÿงท) + (hm/set! emoji-map :broom '๐Ÿงน) + (hm/set! emoji-map :basket '๐Ÿงบ) + (hm/set! emoji-map :roll-of-paper '๐Ÿงป) + (hm/set! emoji-map :soap '๐Ÿงผ) + (hm/set! emoji-map :sponge '๐Ÿงฝ) + (hm/set! emoji-map :fire-extinguisher '๐Ÿงฏ) + (hm/set! emoji-map :shopping-cart '๐Ÿ›’) + (hm/set! emoji-map :cigarette '๐Ÿšฌ) + (hm/set! emoji-map :coffin 'โšฐ๏ธ) + (hm/set! emoji-map :coffin 'โšฐ) + (hm/set! emoji-map :funeral-urn 'โšฑ๏ธ) + (hm/set! emoji-map :funeral-urn 'โšฑ) + (hm/set! emoji-map :moai '๐Ÿ—ฟ) + (hm/set! emoji-map :ATM-sign '๐Ÿง) + (hm/set! emoji-map :litter-in-bin-sign '๐Ÿšฎ) + (hm/set! emoji-map :potable-water '๐Ÿšฐ) + (hm/set! emoji-map :wheelchair-symbol 'โ™ฟ) + (hm/set! emoji-map :men-s-room '๐Ÿšน) + (hm/set! emoji-map :women-s-room '๐Ÿšบ) + (hm/set! emoji-map :restroom '๐Ÿšป) + (hm/set! emoji-map :baby-symbol '๐Ÿšผ) + (hm/set! emoji-map :water-closet '๐Ÿšพ) + (hm/set! emoji-map :passport-control '๐Ÿ›‚) + (hm/set! emoji-map :customs '๐Ÿ›ƒ) + (hm/set! emoji-map :baggage-claim '๐Ÿ›„) + (hm/set! emoji-map :left-luggage '๐Ÿ›…) + (hm/set! emoji-map :warning 'โš ๏ธ) + (hm/set! emoji-map :warning 'โš ) + (hm/set! emoji-map :children-crossing '๐Ÿšธ) + (hm/set! emoji-map :no-entry 'โ›”) + (hm/set! emoji-map :prohibited '๐Ÿšซ) + (hm/set! emoji-map :no-bicycles '๐Ÿšณ) + (hm/set! emoji-map :no-smoking '๐Ÿšญ) + (hm/set! emoji-map :no-littering '๐Ÿšฏ) + (hm/set! emoji-map :non-potable-water '๐Ÿšฑ) + (hm/set! emoji-map :no-pedestrians '๐Ÿšท) + (hm/set! emoji-map :no-mobile-phones '๐Ÿ“ต) + (hm/set! emoji-map :no-one-under-eighteen '๐Ÿ”ž) + (hm/set! emoji-map :radioactive 'โ˜ข๏ธ) + (hm/set! emoji-map :radioactive 'โ˜ข) + (hm/set! emoji-map :biohazard 'โ˜ฃ๏ธ) + (hm/set! emoji-map :biohazard 'โ˜ฃ) + (hm/set! emoji-map :up-arrow 'โฌ†๏ธ) + (hm/set! emoji-map :arrow 'โฌ†-up) + (hm/set! emoji-map :up-right-arrow 'โ†—๏ธ) + (hm/set! emoji-map :right-arrow 'โ†—-up) + (hm/set! emoji-map :right-arrow 'โžก๏ธ) + (hm/set! emoji-map :right-arrow 'โžก) + (hm/set! emoji-map :down-right-arrow 'โ†˜๏ธ) + (hm/set! emoji-map :right-arrow 'โ†˜-down) + (hm/set! emoji-map :down-arrow 'โฌ‡๏ธ) + (hm/set! emoji-map :arrow 'โฌ‡-down) + (hm/set! emoji-map :down-left-arrow 'โ†™๏ธ) + (hm/set! emoji-map :left-arrow 'โ†™-down) + (hm/set! emoji-map :left-arrow 'โฌ…๏ธ) + (hm/set! emoji-map :arrow 'โฌ…-left) + (hm/set! emoji-map :up-left-arrow 'โ†–๏ธ) + (hm/set! emoji-map :left-arrow 'โ†–-up) + (hm/set! emoji-map :up-down-arrow 'โ†•๏ธ) + (hm/set! emoji-map :down-arrow 'โ†•-up) + (hm/set! emoji-map :left-right-arrow 'โ†”๏ธ) + (hm/set! emoji-map :right-arrow 'โ†”-left) + (hm/set! emoji-map :right-arrow-curving-left 'โ†ฉ๏ธ) + (hm/set! emoji-map :arrow-curving-left 'โ†ฉ-right) + (hm/set! emoji-map :left-arrow-curving-right 'โ†ช๏ธ) + (hm/set! emoji-map :arrow-curving-right 'โ†ช-left) + (hm/set! emoji-map :right-arrow-curving-up 'โคด๏ธ) + (hm/set! emoji-map :right-arrow-curving-up 'โคด) + (hm/set! emoji-map :right-arrow-curving-down 'โคต๏ธ) + (hm/set! emoji-map :right-arrow-curving-down 'โคต) + (hm/set! emoji-map :clockwise-vertical-arrows '๐Ÿ”ƒ) + (hm/set! emoji-map :counterclockwise-arrows-button '๐Ÿ”„) + (hm/set! emoji-map :BACK-arrow '๐Ÿ”™) + (hm/set! emoji-map :END-arrow '๐Ÿ”š) + (hm/set! emoji-map :ON!-arrow '๐Ÿ”›) + (hm/set! emoji-map :SOON-arrow '๐Ÿ”œ) + (hm/set! emoji-map :TOP-arrow '๐Ÿ”) + (hm/set! emoji-map :place-of-worship '๐Ÿ›) + (hm/set! emoji-map :atom-symbol 'โš›๏ธ) + (hm/set! emoji-map :atom-symbol 'โš›) + (hm/set! emoji-map :om '๐Ÿ•‰๏ธ) + (hm/set! emoji-map :om '๐Ÿ•‰) + (hm/set! emoji-map :star-of-David 'โœก๏ธ) + (hm/set! emoji-map :star-of-David 'โœก) + (hm/set! emoji-map :wheel-of-dharma 'โ˜ธ๏ธ) + (hm/set! emoji-map :wheel-of-dharma 'โ˜ธ) + (hm/set! emoji-map :yin-yang 'โ˜ฏ๏ธ) + (hm/set! emoji-map :yin-yang 'โ˜ฏ) + (hm/set! emoji-map :latin-cross 'โœ๏ธ) + (hm/set! emoji-map :latin-cross 'โœ) + (hm/set! emoji-map :orthodox-cross 'โ˜ฆ๏ธ) + (hm/set! emoji-map :orthodox-cross 'โ˜ฆ) + (hm/set! emoji-map :star-and-crescent 'โ˜ช๏ธ) + (hm/set! emoji-map :star-and-crescent 'โ˜ช) + (hm/set! emoji-map :peace-symbol 'โ˜ฎ๏ธ) + (hm/set! emoji-map :peace-symbol 'โ˜ฎ) + (hm/set! emoji-map :menorah '๐Ÿ•Ž) + (hm/set! emoji-map :dotted-six-pointed-star '๐Ÿ”ฏ) + (hm/set! emoji-map :Aries 'โ™ˆ) + (hm/set! emoji-map :Taurus 'โ™‰) + (hm/set! emoji-map :Gemini 'โ™Š) + (hm/set! emoji-map :Cancer 'โ™‹) + (hm/set! emoji-map :Leo 'โ™Œ) + (hm/set! emoji-map :Virgo 'โ™) + (hm/set! emoji-map :Libra 'โ™Ž) + (hm/set! emoji-map :Scorpio 'โ™) + (hm/set! emoji-map :Sagittarius 'โ™) + (hm/set! emoji-map :Capricorn 'โ™‘) + (hm/set! emoji-map :Aquarius 'โ™’) + (hm/set! emoji-map :Pisces 'โ™“) + (hm/set! emoji-map :Ophiuchus 'โ›Ž) + (hm/set! emoji-map :shuffle-tracks-button '๐Ÿ”€) + (hm/set! emoji-map :repeat-button '๐Ÿ”) + (hm/set! emoji-map :repeat-single-button '๐Ÿ”‚) + (hm/set! emoji-map :play-button 'โ–ถ๏ธ) + (hm/set! emoji-map :button 'โ–ถ-play) + (hm/set! emoji-map :forward-button 'โฉ-fast) + (hm/set! emoji-map :next-track-button 'โญ๏ธ) + (hm/set! emoji-map :track-button 'โญ-next) + (hm/set! emoji-map :play-or-pause-button 'โฏ๏ธ) + (hm/set! emoji-map :or-pause-button 'โฏ-play) + (hm/set! emoji-map :reverse-button 'โ—€๏ธ) + (hm/set! emoji-map :button 'โ—€-reverse) + (hm/set! emoji-map :reverse-button 'โช-fast) + (hm/set! emoji-map :last-track-button 'โฎ๏ธ) + (hm/set! emoji-map :track-button 'โฎ-last) + (hm/set! emoji-map :upwards-button '๐Ÿ”ผ) + (hm/set! emoji-map :up-button 'โซ-fast) + (hm/set! emoji-map :downwards-button '๐Ÿ”ฝ) + (hm/set! emoji-map :down-button 'โฌ-fast) + (hm/set! emoji-map :pause-button 'โธ๏ธ) + (hm/set! emoji-map :button 'โธ-pause) + (hm/set! emoji-map :stop-button 'โน๏ธ) + (hm/set! emoji-map :button 'โน-stop) + (hm/set! emoji-map :record-button 'โบ๏ธ) + (hm/set! emoji-map :button 'โบ-record) + (hm/set! emoji-map :eject-button 'โ๏ธ) + (hm/set! emoji-map :button 'โ-eject) + (hm/set! emoji-map :cinema '๐ŸŽฆ) + (hm/set! emoji-map :dim-button '๐Ÿ”…) + (hm/set! emoji-map :bright-button '๐Ÿ”†) + (hm/set! emoji-map :antenna-bars '๐Ÿ“ถ) + (hm/set! emoji-map :vibration-mode '๐Ÿ“ณ) + (hm/set! emoji-map :mobile-phone-off '๐Ÿ“ด) + (hm/set! emoji-map :female-sign 'โ™€๏ธ) + (hm/set! emoji-map :sign 'โ™€-female) + (hm/set! emoji-map :male-sign 'โ™‚๏ธ) + (hm/set! emoji-map :sign 'โ™‚-male) + (hm/set! emoji-map :medical-symbol 'โš•๏ธ) + (hm/set! emoji-map :medical-symbol 'โš•) + (hm/set! emoji-map :infinity 'โ™พ๏ธ) + (hm/set! emoji-map :infinity 'โ™พ) + (hm/set! emoji-map :recycling-symbol 'โ™ป๏ธ) + (hm/set! emoji-map :recycling-symbol 'โ™ป) + (hm/set! emoji-map :fleur-de-lis 'โšœ๏ธ) + (hm/set! emoji-map :fleur-de-lis 'โšœ) + (hm/set! emoji-map :trident-emblem '๐Ÿ”ฑ) + (hm/set! emoji-map :name-badge '๐Ÿ“›) + (hm/set! emoji-map :Japanese-symbol-for-beginner '๐Ÿ”ฐ) + (hm/set! emoji-map :red-circle 'โญ•-hollow) + (hm/set! emoji-map :check-mark-button 'โœ…) + (hm/set! emoji-map :check-box-with-check 'โ˜‘๏ธ) + (hm/set! emoji-map :check-box-with-check 'โ˜‘) + (hm/set! emoji-map :check-mark 'โœ”๏ธ) + (hm/set! emoji-map :check-mark 'โœ”) + (hm/set! emoji-map :multiplication-sign 'โœ–๏ธ) + (hm/set! emoji-map :multiplication-sign 'โœ–) + (hm/set! emoji-map :cross-mark 'โŒ) + (hm/set! emoji-map :cross-mark-button 'โŽ) + (hm/set! emoji-map :plus-sign 'โž•) + (hm/set! emoji-map :minus-sign 'โž–) + (hm/set! emoji-map :division-sign 'โž—) + (hm/set! emoji-map :curly-loop 'โžฐ) + (hm/set! emoji-map :double-curly-loop 'โžฟ) + (hm/set! emoji-map :part-alternation-mark 'ใ€ฝ๏ธ) + (hm/set! emoji-map :part-alternation-mark 'ใ€ฝ) + (hm/set! emoji-map :eight-spoked-asterisk 'โœณ๏ธ) + (hm/set! emoji-map :eight-spoked-asterisk 'โœณ) + (hm/set! emoji-map :eight-pointed-star 'โœด๏ธ) + (hm/set! emoji-map :eight-pointed-star 'โœด) + (hm/set! emoji-map :sparkle 'โ‡๏ธ) + (hm/set! emoji-map :sparkle 'โ‡) + (hm/set! emoji-map :double-exclamation-mark 'โ€ผ๏ธ) + (hm/set! emoji-map :exclamation-mark 'โ€ผ-double) + (hm/set! emoji-map :exclamation-question-mark 'โ‰๏ธ) + (hm/set! emoji-map :question-mark 'โ‰-exclamation) + (hm/set! emoji-map :question-mark 'โ“) + (hm/set! emoji-map :white-question-mark 'โ”) + (hm/set! emoji-map :white-exclamation-mark 'โ•) + (hm/set! emoji-map :exclamation-mark 'โ—) + (hm/set! emoji-map :wavy-dash 'ใ€ฐ๏ธ) + (hm/set! emoji-map :wavy-dash 'ใ€ฐ) + (hm/set! emoji-map :copyright 'ยฉ๏ธ) + (hm/set! emoji-map :registered 'ยฎ๏ธ) + (hm/set! emoji-map :trade-mark 'โ„ข๏ธ) + (hm/set! emoji-map :mark 'โ„ข-trade) + (hm/set! emoji-map :-keycap:-# '#๏ธ) + (hm/set! emoji-map :keycap:-# '#โƒฃ) + (hm/set! emoji-map :-keycap:-* '*๏ธ) + (hm/set! emoji-map :keycap:-* '*โƒฃ) + (hm/set! emoji-map :-keycap:-0 '0๏ธ) + (hm/set! emoji-map :keycap:-0 '0โƒฃ) + (hm/set! emoji-map :-keycap:-1 '1๏ธ) + (hm/set! emoji-map :keycap:-1 '1โƒฃ) + (hm/set! emoji-map :-keycap:-2 '2๏ธ) + (hm/set! emoji-map :keycap:-2 '2โƒฃ) + (hm/set! emoji-map :-keycap:-3 '3๏ธ) + (hm/set! emoji-map :keycap:-3 '3โƒฃ) + (hm/set! emoji-map :-keycap:-4 '4๏ธ) + (hm/set! emoji-map :keycap:-4 '4โƒฃ) + (hm/set! emoji-map :-keycap:-5 '5๏ธ) + (hm/set! emoji-map :keycap:-5 '5โƒฃ) + (hm/set! emoji-map :-keycap:-6 '6๏ธ) + (hm/set! emoji-map :keycap:-6 '6โƒฃ) + (hm/set! emoji-map :-keycap:-7 '7๏ธ) + (hm/set! emoji-map :keycap:-7 '7โƒฃ) + (hm/set! emoji-map :-keycap:-8 '8๏ธ) + (hm/set! emoji-map :keycap:-8 '8โƒฃ) + (hm/set! emoji-map :-keycap:-9 '9๏ธ) + (hm/set! emoji-map :keycap:-9 '9โƒฃ) + (hm/set! emoji-map :keycap:-10 '๐Ÿ”Ÿ) + (hm/set! emoji-map :input-latin-uppercase '๐Ÿ” ) + (hm/set! emoji-map :input-latin-lowercase '๐Ÿ”ก) + (hm/set! emoji-map :input-numbers '๐Ÿ”ข) + (hm/set! emoji-map :input-symbols '๐Ÿ”ฃ) + (hm/set! emoji-map :input-latin-letters '๐Ÿ”ค) + (hm/set! emoji-map :A-button-blood-type '๐Ÿ…ฐ๏ธ) + (hm/set! emoji-map :A-button-blood-type '๐Ÿ…ฐ) + (hm/set! emoji-map :AB-button-blood-type '๐Ÿ†Ž) + (hm/set! emoji-map :B-button-blood-type '๐Ÿ…ฑ๏ธ) + (hm/set! emoji-map :B-button-blood-type '๐Ÿ…ฑ) + (hm/set! emoji-map :CL-button '๐Ÿ†‘) + (hm/set! emoji-map :COOL-button '๐Ÿ†’) + (hm/set! emoji-map :FREE-button '๐Ÿ†“) + (hm/set! emoji-map :information 'โ„น๏ธ) + (hm/set! emoji-map :information 'โ„น) + (hm/set! emoji-map :ID-button '๐Ÿ†”) + (hm/set! emoji-map :circled-M 'โ“‚๏ธ) + (hm/set! emoji-map :circled-M 'โ“‚) + (hm/set! emoji-map :NEW-button '๐Ÿ†•) + (hm/set! emoji-map :NG-button '๐Ÿ†–) + (hm/set! emoji-map :O-button-blood-type '๐Ÿ…พ๏ธ) + (hm/set! emoji-map :O-button-blood-type '๐Ÿ…พ) + (hm/set! emoji-map :OK-button '๐Ÿ†—) + (hm/set! emoji-map :P-button '๐Ÿ…ฟ๏ธ) + (hm/set! emoji-map :P-button '๐Ÿ…ฟ) + (hm/set! emoji-map :SOS-button '๐Ÿ†˜) + (hm/set! emoji-map :UP!-button '๐Ÿ†™) + (hm/set! emoji-map :VS-button '๐Ÿ†š) + (hm/set! emoji-map :Japanese--here--button '๐Ÿˆ) + (hm/set! emoji-map :Japanese--service-charge--button '๐Ÿˆ‚๏ธ) + (hm/set! emoji-map :Japanese--service-charge--button '๐Ÿˆ‚) + (hm/set! emoji-map :Japanese--monthly-amount--button '๐Ÿˆท๏ธ) + (hm/set! emoji-map :Japanese--monthly-amount--button '๐Ÿˆท) + (hm/set! emoji-map :Japanese--not-free-of-charge--button '๐Ÿˆถ) + (hm/set! emoji-map :Japanese--reserved--button '๐Ÿˆฏ) + (hm/set! emoji-map :Japanese--bargain--button '๐Ÿ‰) + (hm/set! emoji-map :Japanese--discount--button '๐Ÿˆน) + (hm/set! emoji-map :Japanese--free-of-charge--button '๐Ÿˆš) + (hm/set! emoji-map :Japanese--prohibited--button '๐Ÿˆฒ) + (hm/set! emoji-map :Japanese--acceptable--button '๐Ÿ‰‘) + (hm/set! emoji-map :Japanese--application--button '๐Ÿˆธ) + (hm/set! emoji-map :Japanese--passing-grade--button '๐Ÿˆด) + (hm/set! emoji-map :Japanese--vacancy--button '๐Ÿˆณ) + (hm/set! emoji-map :Japanese--congratulations--button 'ใŠ—๏ธ) + (hm/set! emoji-map :Japanese--congratulations--button 'ใŠ—) + (hm/set! emoji-map :Japanese--secret--button 'ใŠ™๏ธ) + (hm/set! emoji-map :Japanese--secret--button 'ใŠ™) + (hm/set! emoji-map :Japanese--open-for-business--button '๐Ÿˆบ) + (hm/set! emoji-map :Japanese--no-vacancy--button '๐Ÿˆต) + (hm/set! emoji-map :red-circle '๐Ÿ”ด) + (hm/set! emoji-map :orange-circle '๐ŸŸ ) + (hm/set! emoji-map :yellow-circle '๐ŸŸก) + (hm/set! emoji-map :green-circle '๐ŸŸข) + (hm/set! emoji-map :blue-circle '๐Ÿ”ต) + (hm/set! emoji-map :purple-circle '๐ŸŸฃ) + (hm/set! emoji-map :brown-circle '๐ŸŸค) + (hm/set! emoji-map :black-circle 'โšซ) + (hm/set! emoji-map :white-circle 'โšช) + (hm/set! emoji-map :red-square '๐ŸŸฅ) + (hm/set! emoji-map :orange-square '๐ŸŸง) + (hm/set! emoji-map :yellow-square '๐ŸŸจ) + (hm/set! emoji-map :green-square '๐ŸŸฉ) + (hm/set! emoji-map :blue-square '๐ŸŸฆ) + (hm/set! emoji-map :purple-square '๐ŸŸช) + (hm/set! emoji-map :brown-square '๐ŸŸซ) + (hm/set! emoji-map :large-square 'โฌ›-black) + (hm/set! emoji-map :large-square 'โฌœ-white) + (hm/set! emoji-map :black-medium-square 'โ—ผ๏ธ) + (hm/set! emoji-map :black-medium-square 'โ—ผ) + (hm/set! emoji-map :white-medium-square 'โ—ป๏ธ) + (hm/set! emoji-map :white-medium-square 'โ—ป) + (hm/set! emoji-map :black-medium-small-square 'โ—พ) + (hm/set! emoji-map :white-medium-small-square 'โ—ฝ) + (hm/set! emoji-map :black-small-square 'โ–ช๏ธ) + (hm/set! emoji-map :black-small-square 'โ–ช) + (hm/set! emoji-map :white-small-square 'โ–ซ๏ธ) + (hm/set! emoji-map :white-small-square 'โ–ซ) + (hm/set! emoji-map :large-orange-diamond '๐Ÿ”ถ) + (hm/set! emoji-map :large-blue-diamond '๐Ÿ”ท) + (hm/set! emoji-map :small-orange-diamond '๐Ÿ”ธ) + (hm/set! emoji-map :small-blue-diamond '๐Ÿ”น) + (hm/set! emoji-map :red-triangle-pointed-up '๐Ÿ”บ) + (hm/set! emoji-map :red-triangle-pointed-down '๐Ÿ”ป) + (hm/set! emoji-map :diamond-with-a-dot '๐Ÿ’ ) + (hm/set! emoji-map :radio-button '๐Ÿ”˜) + (hm/set! emoji-map :white-square-button '๐Ÿ”ณ) + (hm/set! emoji-map :black-square-button '๐Ÿ”ฒ) + (hm/set! emoji-map :chequered-flag '๐Ÿ) + (hm/set! emoji-map :triangular-flag '๐Ÿšฉ) + (hm/set! emoji-map :crossed-flags '๐ŸŽŒ) + (hm/set! emoji-map :black-flag '๐Ÿด) + (hm/set! emoji-map :white-flag '๐Ÿณ๏ธ) + (hm/set! emoji-map :white-flag '๐Ÿณ) + (hm/set! emoji-map :๐ŸŒˆ-rainbow-flag '๐Ÿณ๏ธ) + (hm/set! emoji-map :๐ŸŒˆ-rainbow-flag '๐Ÿณ) + (hm/set! emoji-map :โ˜ ๏ธ-pirate-flag '๐Ÿด) + (hm/set! emoji-map :โ˜ -pirate-flag '๐Ÿด) + (hm/set! emoji-map :flag:-Ascension-Island '๐Ÿ‡ฆ๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Andorra '๐Ÿ‡ฆ๐Ÿ‡ฉ) + (hm/set! emoji-map :flag:-United-Arab-Emirates '๐Ÿ‡ฆ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Afghanistan '๐Ÿ‡ฆ๐Ÿ‡ซ) + (hm/set! emoji-map :flag:-Antigua-&-Barbuda '๐Ÿ‡ฆ๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Anguilla '๐Ÿ‡ฆ๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Albania '๐Ÿ‡ฆ๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-Armenia '๐Ÿ‡ฆ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Angola '๐Ÿ‡ฆ๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Antarctica '๐Ÿ‡ฆ๐Ÿ‡ถ) + (hm/set! emoji-map :flag:-Argentina '๐Ÿ‡ฆ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-American-Samoa '๐Ÿ‡ฆ๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Austria '๐Ÿ‡ฆ๐Ÿ‡น) + (hm/set! emoji-map :flag:-Australia '๐Ÿ‡ฆ๐Ÿ‡บ) + (hm/set! emoji-map :flag:-Aruba '๐Ÿ‡ฆ๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-ร…land-Islands '๐Ÿ‡ฆ๐Ÿ‡ฝ) + (hm/set! emoji-map :flag:-Azerbaijan '๐Ÿ‡ฆ๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Bosnia-&-Herzegovina '๐Ÿ‡ง๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Barbados '๐Ÿ‡ง๐Ÿ‡ง) + (hm/set! emoji-map :flag:-Bangladesh '๐Ÿ‡ง๐Ÿ‡ฉ) + (hm/set! emoji-map :flag:-Belgium '๐Ÿ‡ง๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Burkina-Faso '๐Ÿ‡ง๐Ÿ‡ซ) + (hm/set! emoji-map :flag:-Bulgaria '๐Ÿ‡ง๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Bahrain '๐Ÿ‡ง๐Ÿ‡ญ) + (hm/set! emoji-map :flag:-Burundi '๐Ÿ‡ง๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Benin '๐Ÿ‡ง๐Ÿ‡ฏ) + (hm/set! emoji-map :flag:-St.-Barthรฉlemy '๐Ÿ‡ง๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-Bermuda '๐Ÿ‡ง๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Brunei '๐Ÿ‡ง๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-Bolivia '๐Ÿ‡ง๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Caribbean-Netherlands '๐Ÿ‡ง๐Ÿ‡ถ) + (hm/set! emoji-map :flag:-Brazil '๐Ÿ‡ง๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Bahamas '๐Ÿ‡ง๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Bhutan '๐Ÿ‡ง๐Ÿ‡น) + (hm/set! emoji-map :flag:-Bouvet-Island '๐Ÿ‡ง๐Ÿ‡ป) + (hm/set! emoji-map :flag:-Botswana '๐Ÿ‡ง๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-Belarus '๐Ÿ‡ง๐Ÿ‡พ) + (hm/set! emoji-map :flag:-Belize '๐Ÿ‡ง๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Canada '๐Ÿ‡จ๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Cocos-Keeling-Islands '๐Ÿ‡จ๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Congo---Kinshasa '๐Ÿ‡จ๐Ÿ‡ฉ) + (hm/set! emoji-map :flag:-Central-African-Republic '๐Ÿ‡จ๐Ÿ‡ซ) + (hm/set! emoji-map :flag:-Congo---Brazzaville '๐Ÿ‡จ๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Switzerland '๐Ÿ‡จ๐Ÿ‡ญ) + (hm/set! emoji-map :flag:-Cรดte-d-Ivoire '๐Ÿ‡จ๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Cook-Islands '๐Ÿ‡จ๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Chile '๐Ÿ‡จ๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-Cameroon '๐Ÿ‡จ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-China '๐Ÿ‡จ๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-Colombia '๐Ÿ‡จ๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Clipperton-Island '๐Ÿ‡จ๐Ÿ‡ต) + (hm/set! emoji-map :flag:-Costa-Rica '๐Ÿ‡จ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Cuba '๐Ÿ‡จ๐Ÿ‡บ) + (hm/set! emoji-map :flag:-Cape-Verde '๐Ÿ‡จ๐Ÿ‡ป) + (hm/set! emoji-map :flag:-Curaรงao '๐Ÿ‡จ๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-Christmas-Island '๐Ÿ‡จ๐Ÿ‡ฝ) + (hm/set! emoji-map :flag:-Cyprus '๐Ÿ‡จ๐Ÿ‡พ) + (hm/set! emoji-map :flag:-Czechia '๐Ÿ‡จ๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Germany '๐Ÿ‡ฉ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Diego-Garcia '๐Ÿ‡ฉ๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Djibouti '๐Ÿ‡ฉ๐Ÿ‡ฏ) + (hm/set! emoji-map :flag:-Denmark '๐Ÿ‡ฉ๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Dominica '๐Ÿ‡ฉ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Dominican-Republic '๐Ÿ‡ฉ๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Algeria '๐Ÿ‡ฉ๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Ceuta-&-Melilla '๐Ÿ‡ช๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Ecuador '๐Ÿ‡ช๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Estonia '๐Ÿ‡ช๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Egypt '๐Ÿ‡ช๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Western-Sahara '๐Ÿ‡ช๐Ÿ‡ญ) + (hm/set! emoji-map :flag:-Eritrea '๐Ÿ‡ช๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Spain '๐Ÿ‡ช๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Ethiopia '๐Ÿ‡ช๐Ÿ‡น) + (hm/set! emoji-map :flag:-European-Union '๐Ÿ‡ช๐Ÿ‡บ) + (hm/set! emoji-map :flag:-Finland '๐Ÿ‡ซ๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Fiji '๐Ÿ‡ซ๐Ÿ‡ฏ) + (hm/set! emoji-map :flag:-Falkland-Islands '๐Ÿ‡ซ๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Micronesia '๐Ÿ‡ซ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Faroe-Islands '๐Ÿ‡ซ๐Ÿ‡ด) + (hm/set! emoji-map :flag:-France '๐Ÿ‡ซ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Gabon '๐Ÿ‡ฌ๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-United-Kingdom '๐Ÿ‡ฌ๐Ÿ‡ง) + (hm/set! emoji-map :flag:-Grenada '๐Ÿ‡ฌ๐Ÿ‡ฉ) + (hm/set! emoji-map :flag:-Georgia '๐Ÿ‡ฌ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-French-Guiana '๐Ÿ‡ฌ๐Ÿ‡ซ) + (hm/set! emoji-map :flag:-Guernsey '๐Ÿ‡ฌ๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Ghana '๐Ÿ‡ฌ๐Ÿ‡ญ) + (hm/set! emoji-map :flag:-Gibraltar '๐Ÿ‡ฌ๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Greenland '๐Ÿ‡ฌ๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-Gambia '๐Ÿ‡ฌ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Guinea '๐Ÿ‡ฌ๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-Guadeloupe '๐Ÿ‡ฌ๐Ÿ‡ต) + (hm/set! emoji-map :flag:-Equatorial-Guinea '๐Ÿ‡ฌ๐Ÿ‡ถ) + (hm/set! emoji-map :flag:-Greece '๐Ÿ‡ฌ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-South-Georgia-&-South-Sandwich-Islands '๐Ÿ‡ฌ๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Guatemala '๐Ÿ‡ฌ๐Ÿ‡น) + (hm/set! emoji-map :flag:-Guam '๐Ÿ‡ฌ๐Ÿ‡บ) + (hm/set! emoji-map :flag:-Guinea-Bissau '๐Ÿ‡ฌ๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-Guyana '๐Ÿ‡ฌ๐Ÿ‡พ) + (hm/set! emoji-map :flag:-Hong-Kong-SAR-China '๐Ÿ‡ญ๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Heard-&-McDonald-Islands '๐Ÿ‡ญ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Honduras '๐Ÿ‡ญ๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-Croatia '๐Ÿ‡ญ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Haiti '๐Ÿ‡ญ๐Ÿ‡น) + (hm/set! emoji-map :flag:-Hungary '๐Ÿ‡ญ๐Ÿ‡บ) + (hm/set! emoji-map :flag:-Canary-Islands '๐Ÿ‡ฎ๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Indonesia '๐Ÿ‡ฎ๐Ÿ‡ฉ) + (hm/set! emoji-map :flag:-Ireland '๐Ÿ‡ฎ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Israel '๐Ÿ‡ฎ๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-Isle-of-Man '๐Ÿ‡ฎ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-India '๐Ÿ‡ฎ๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-British-Indian-Ocean-Territory '๐Ÿ‡ฎ๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Iraq '๐Ÿ‡ฎ๐Ÿ‡ถ) + (hm/set! emoji-map :flag:-Iran '๐Ÿ‡ฎ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Iceland '๐Ÿ‡ฎ๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Italy '๐Ÿ‡ฎ๐Ÿ‡น) + (hm/set! emoji-map :flag:-Jersey '๐Ÿ‡ฏ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Jamaica '๐Ÿ‡ฏ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Jordan '๐Ÿ‡ฏ๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Japan '๐Ÿ‡ฏ๐Ÿ‡ต) + (hm/set! emoji-map :flag:-Kenya '๐Ÿ‡ฐ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Kyrgyzstan '๐Ÿ‡ฐ๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Cambodia '๐Ÿ‡ฐ๐Ÿ‡ญ) + (hm/set! emoji-map :flag:-Kiribati '๐Ÿ‡ฐ๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Comoros '๐Ÿ‡ฐ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-St.-Kitts-&-Nevis '๐Ÿ‡ฐ๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-North-Korea '๐Ÿ‡ฐ๐Ÿ‡ต) + (hm/set! emoji-map :flag:-South-Korea '๐Ÿ‡ฐ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Kuwait '๐Ÿ‡ฐ๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-Cayman-Islands '๐Ÿ‡ฐ๐Ÿ‡พ) + (hm/set! emoji-map :flag:-Kazakhstan '๐Ÿ‡ฐ๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Laos '๐Ÿ‡ฑ๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Lebanon '๐Ÿ‡ฑ๐Ÿ‡ง) + (hm/set! emoji-map :flag:-St.-Lucia '๐Ÿ‡ฑ๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Liechtenstein '๐Ÿ‡ฑ๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Sri-Lanka '๐Ÿ‡ฑ๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Liberia '๐Ÿ‡ฑ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Lesotho '๐Ÿ‡ฑ๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Lithuania '๐Ÿ‡ฑ๐Ÿ‡น) + (hm/set! emoji-map :flag:-Luxembourg '๐Ÿ‡ฑ๐Ÿ‡บ) + (hm/set! emoji-map :flag:-Latvia '๐Ÿ‡ฑ๐Ÿ‡ป) + (hm/set! emoji-map :flag:-Libya '๐Ÿ‡ฑ๐Ÿ‡พ) + (hm/set! emoji-map :flag:-Morocco '๐Ÿ‡ฒ๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Monaco '๐Ÿ‡ฒ๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Moldova '๐Ÿ‡ฒ๐Ÿ‡ฉ) + (hm/set! emoji-map :flag:-Montenegro '๐Ÿ‡ฒ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-St.-Martin '๐Ÿ‡ฒ๐Ÿ‡ซ) + (hm/set! emoji-map :flag:-Madagascar '๐Ÿ‡ฒ๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Marshall-Islands '๐Ÿ‡ฒ๐Ÿ‡ญ) + (hm/set! emoji-map :flag:-Macedonia '๐Ÿ‡ฒ๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Mali '๐Ÿ‡ฒ๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-Myanmar-Burma '๐Ÿ‡ฒ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Mongolia '๐Ÿ‡ฒ๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-Macao-SAR-China '๐Ÿ‡ฒ๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Northern-Mariana-Islands '๐Ÿ‡ฒ๐Ÿ‡ต) + (hm/set! emoji-map :flag:-Martinique '๐Ÿ‡ฒ๐Ÿ‡ถ) + (hm/set! emoji-map :flag:-Mauritania '๐Ÿ‡ฒ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Montserrat '๐Ÿ‡ฒ๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Malta '๐Ÿ‡ฒ๐Ÿ‡น) + (hm/set! emoji-map :flag:-Mauritius '๐Ÿ‡ฒ๐Ÿ‡บ) + (hm/set! emoji-map :flag:-Maldives '๐Ÿ‡ฒ๐Ÿ‡ป) + (hm/set! emoji-map :flag:-Malawi '๐Ÿ‡ฒ๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-Mexico '๐Ÿ‡ฒ๐Ÿ‡ฝ) + (hm/set! emoji-map :flag:-Malaysia '๐Ÿ‡ฒ๐Ÿ‡พ) + (hm/set! emoji-map :flag:-Mozambique '๐Ÿ‡ฒ๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Namibia '๐Ÿ‡ณ๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-New-Caledonia '๐Ÿ‡ณ๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Niger '๐Ÿ‡ณ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Norfolk-Island '๐Ÿ‡ณ๐Ÿ‡ซ) + (hm/set! emoji-map :flag:-Nigeria '๐Ÿ‡ณ๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Nicaragua '๐Ÿ‡ณ๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Netherlands '๐Ÿ‡ณ๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-Norway '๐Ÿ‡ณ๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Nepal '๐Ÿ‡ณ๐Ÿ‡ต) + (hm/set! emoji-map :flag:-Nauru '๐Ÿ‡ณ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Niue '๐Ÿ‡ณ๐Ÿ‡บ) + (hm/set! emoji-map :flag:-New-Zealand '๐Ÿ‡ณ๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Oman '๐Ÿ‡ด๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Panama '๐Ÿ‡ต๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Peru '๐Ÿ‡ต๐Ÿ‡ช) + (hm/set! emoji-map :flag:-French-Polynesia '๐Ÿ‡ต๐Ÿ‡ซ) + (hm/set! emoji-map :flag:-Papua-New-Guinea '๐Ÿ‡ต๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Philippines '๐Ÿ‡ต๐Ÿ‡ญ) + (hm/set! emoji-map :flag:-Pakistan '๐Ÿ‡ต๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Poland '๐Ÿ‡ต๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-St.-Pierre-&-Miquelon '๐Ÿ‡ต๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Pitcairn-Islands '๐Ÿ‡ต๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-Puerto-Rico '๐Ÿ‡ต๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Palestinian-Territories '๐Ÿ‡ต๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Portugal '๐Ÿ‡ต๐Ÿ‡น) + (hm/set! emoji-map :flag:-Palau '๐Ÿ‡ต๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-Paraguay '๐Ÿ‡ต๐Ÿ‡พ) + (hm/set! emoji-map :flag:-Qatar '๐Ÿ‡ถ๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Rรฉunion '๐Ÿ‡ท๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Romania '๐Ÿ‡ท๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Serbia '๐Ÿ‡ท๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Russia '๐Ÿ‡ท๐Ÿ‡บ) + (hm/set! emoji-map :flag:-Rwanda '๐Ÿ‡ท๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-Saudi-Arabia '๐Ÿ‡ธ๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Solomon-Islands '๐Ÿ‡ธ๐Ÿ‡ง) + (hm/set! emoji-map :flag:-Seychelles '๐Ÿ‡ธ๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Sudan '๐Ÿ‡ธ๐Ÿ‡ฉ) + (hm/set! emoji-map :flag:-Sweden '๐Ÿ‡ธ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Singapore '๐Ÿ‡ธ๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-St.-Helena '๐Ÿ‡ธ๐Ÿ‡ญ) + (hm/set! emoji-map :flag:-Slovenia '๐Ÿ‡ธ๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Svalbard-&-Jan-Mayen '๐Ÿ‡ธ๐Ÿ‡ฏ) + (hm/set! emoji-map :flag:-Slovakia '๐Ÿ‡ธ๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Sierra-Leone '๐Ÿ‡ธ๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-San-Marino '๐Ÿ‡ธ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Senegal '๐Ÿ‡ธ๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-Somalia '๐Ÿ‡ธ๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Suriname '๐Ÿ‡ธ๐Ÿ‡ท) + (hm/set! emoji-map :flag:-South-Sudan '๐Ÿ‡ธ๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Sรฃo-Tomรฉ-&-Prรญncipe '๐Ÿ‡ธ๐Ÿ‡น) + (hm/set! emoji-map :flag:-El-Salvador '๐Ÿ‡ธ๐Ÿ‡ป) + (hm/set! emoji-map :flag:-Sint-Maarten '๐Ÿ‡ธ๐Ÿ‡ฝ) + (hm/set! emoji-map :flag:-Syria '๐Ÿ‡ธ๐Ÿ‡พ) + (hm/set! emoji-map :flag:-Eswatini '๐Ÿ‡ธ๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Tristan-da-Cunha '๐Ÿ‡น๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Turks-&-Caicos-Islands '๐Ÿ‡น๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Chad '๐Ÿ‡น๐Ÿ‡ฉ) + (hm/set! emoji-map :flag:-French-Southern-Territories '๐Ÿ‡น๐Ÿ‡ซ) + (hm/set! emoji-map :flag:-Togo '๐Ÿ‡น๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-Thailand '๐Ÿ‡น๐Ÿ‡ญ) + (hm/set! emoji-map :flag:-Tajikistan '๐Ÿ‡น๐Ÿ‡ฏ) + (hm/set! emoji-map :flag:-Tokelau '๐Ÿ‡น๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Timor-Leste '๐Ÿ‡น๐Ÿ‡ฑ) + (hm/set! emoji-map :flag:-Turkmenistan '๐Ÿ‡น๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Tunisia '๐Ÿ‡น๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-Tonga '๐Ÿ‡น๐Ÿ‡ด) + (hm/set! emoji-map :flag:-Turkey '๐Ÿ‡น๐Ÿ‡ท) + (hm/set! emoji-map :flag:-Trinidad-&-Tobago '๐Ÿ‡น๐Ÿ‡น) + (hm/set! emoji-map :flag:-Tuvalu '๐Ÿ‡น๐Ÿ‡ป) + (hm/set! emoji-map :flag:-Taiwan '๐Ÿ‡น๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-Tanzania '๐Ÿ‡น๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Ukraine '๐Ÿ‡บ๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Uganda '๐Ÿ‡บ๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-U.S.-Outlying-Islands '๐Ÿ‡บ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-United-Nations '๐Ÿ‡บ๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-United-States '๐Ÿ‡บ๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Uruguay '๐Ÿ‡บ๐Ÿ‡พ) + (hm/set! emoji-map :flag:-Uzbekistan '๐Ÿ‡บ๐Ÿ‡ฟ) + (hm/set! emoji-map :flag:-Vatican-City '๐Ÿ‡ป๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-St.-Vincent-&-Grenadines '๐Ÿ‡ป๐Ÿ‡จ) + (hm/set! emoji-map :flag:-Venezuela '๐Ÿ‡ป๐Ÿ‡ช) + (hm/set! emoji-map :flag:-British-Virgin-Islands '๐Ÿ‡ป๐Ÿ‡ฌ) + (hm/set! emoji-map :flag:-U.S.-Virgin-Islands '๐Ÿ‡ป๐Ÿ‡ฎ) + (hm/set! emoji-map :flag:-Vietnam '๐Ÿ‡ป๐Ÿ‡ณ) + (hm/set! emoji-map :flag:-Vanuatu '๐Ÿ‡ป๐Ÿ‡บ) + (hm/set! emoji-map :flag:-Wallis-&-Futuna '๐Ÿ‡ผ๐Ÿ‡ซ) + (hm/set! emoji-map :flag:-Samoa '๐Ÿ‡ผ๐Ÿ‡ธ) + (hm/set! emoji-map :flag:-Kosovo '๐Ÿ‡ฝ๐Ÿ‡ฐ) + (hm/set! emoji-map :flag:-Yemen '๐Ÿ‡พ๐Ÿ‡ช) + (hm/set! emoji-map :flag:-Mayotte '๐Ÿ‡พ๐Ÿ‡น) + (hm/set! emoji-map :flag:-South-Africa '๐Ÿ‡ฟ๐Ÿ‡ฆ) + (hm/set! emoji-map :flag:-Zambia '๐Ÿ‡ฟ๐Ÿ‡ฒ) + (hm/set! emoji-map :flag:-Zimbabwe '๐Ÿ‡ฟ๐Ÿ‡ผ) + (hm/set! emoji-map :flag:-England '๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ) + (hm/set! emoji-map :flag:-Scotland '๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ) + (hm/set! emoji-map :flag:-Wales '๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ) + + (define (get emoji-name) + (mytry + (hm/get emoji-map emoji-name) + (error :not-found "emoji was not found")))) diff --git a/bin/generate-docs.slime b/bin/generate-docs.slime index bdb08cf..df15edd 100644 --- a/bin/generate-docs.slime +++ b/bin/generate-docs.slime @@ -1,8 +1,8 @@ -(import "alist.slime") -(import "automata.slime") -(import "interpolation.slime") -(import "oo.slime") -(import "math.slime") -(import "sets.slime") - -(generate-docs "../manual/built-in-docs.org") +(import "alist.slime") +(import "automata.slime") +(import "interpolation.slime") +(import "oo.slime") +(import "math.slime") +(import "sets.slime") + +(generate-docs "../manual/built-in-docs.org") diff --git a/bin/interpolation.slime b/bin/interpolation.slime index 018e48c..92bca45 100644 --- a/bin/interpolation.slime +++ b/bin/interpolation.slime @@ -1,45 +1,45 @@ - -(define-module interpolation - :exports (lerp lerper stepped-lerper - point-lerp point-lerper - bezier2 bezierer2) - - (define-typed (lerp a :number b :number t :number) - (+ (* t (- b a)) a)) - - (define-typed (lerper a :number b :number) - (define-typed (ret t :number) - (lerp a b t)) - ret) - - (define-typed (stepped-lerper a :number b :number #steps :number) - (let ((t 0) - (dt (/ 1 #steps))) - (lambda () - (let ((res (lerp a b t))) - (mutate t (+ t dt)) - res)))) - - (define make-point pair) - (define point->x first) - (define point->y rest) - - (define (point-lerp p1 p2 t) - (make-point (lerp (point->x p1) (point->x p2) t) - (lerp (point->y p1) (point->y p2) t))) - - (define (point-lerper p1 p2) - (lambda (t) (point-lerp p1 p2 t))) - - (define (bezier2 p1 p2 p3 t) - (point-lerp (point-lerp p1 p2 t) - (point-lerp p2 p3 t) - t)) - - (define (bezierer2 p1 p2 p3) - (let ((lerper1 (point-lerper p1 p2)) - (lerper2 (point-lerper p2 p3))) - (lambda (t) - (point-lerp (lerper1 t) - (lerper2 t) t)))) - ) + +(define-module interpolation + :exports (lerp lerper stepped-lerper + point-lerp point-lerper + bezier2 bezierer2) + + (define-typed (lerp a :number b :number t :number) + (+ (* t (- b a)) a)) + + (define-typed (lerper a :number b :number) + (define-typed (ret t :number) + (lerp a b t)) + ret) + + (define-typed (stepped-lerper a :number b :number #steps :number) + (let ((t 0) + (dt (/ 1 #steps))) + (lambda () + (let ((res (lerp a b t))) + (mutate t (+ t dt)) + res)))) + + (define make-point pair) + (define point->x first) + (define point->y rest) + + (define (point-lerp p1 p2 t) + (make-point (lerp (point->x p1) (point->x p2) t) + (lerp (point->y p1) (point->y p2) t))) + + (define (point-lerper p1 p2) + (lambda (t) (point-lerp p1 p2 t))) + + (define (bezier2 p1 p2 p3 t) + (point-lerp (point-lerp p1 p2 t) + (point-lerp p2 p3 t) + t)) + + (define (bezierer2 p1 p2 p3) + (let ((lerper1 (point-lerper p1 p2)) + (lerper2 (point-lerper p2 p3))) + (lambda (t) + (point-lerp (lerper1 t) + (lerper2 t) t)))) + ) diff --git a/bin/math.slime b/bin/math.slime index b08eeda..286959e 100644 --- a/bin/math.slime +++ b/bin/math.slime @@ -1,60 +1,60 @@ -(define-module math - :imports ("oo.slime") - :exports (pi abs sqrt make-vector3) - - (define pi - :doc "Tha famous circle constant." - 3.14159265) - - (define (abs x) - :doc "Accepts one argument and returns the absoulte value of it" - (if (> x 0) x (- x))) - - (define (sqrt x) - :doc "Accepts one argument and returns the square root of it" - (** x 0.5)) - - (define-class (vector3 x y z) - (define (set-x new-x) (mutate x new-x)) - (define (set-y new-y) (mutate y new-y)) - (define (set-z new-z) (mutate z new-z)) - - (define (length) - (** (+ (* x x) (* y y) (* z z)) 0.5)) - - (define (scale fac) - (mutate x (* fac x)) - (mutate y (* fac y)) - (mutate z (* fac z)) - fac) - - (define (add other) - (make-vector3 - (+ (-> other x) x) - (+ (-> other y) y) - (+ (-> other z) z))) - - (define (subtract other) - (make-vector3 - (- (-> other x) x) - (- (-> other y) y) - (- (-> other z) z))) - - (define (equal? other) - (and (= (-> other x) x) - (= (-> other y) y) - (= (-> other z) z))) - - (define (scalar-product other) - (+ (* (-> other x) x) - (* (-> other y) y) - (* (-> other z) z))) - - (define (cross-product other) - (make-vector3 - (- (* (-> other z) y) (* (-> other y) z)) - (- (* (-> other x) z) (* (-> other z) x)) - (- (* (-> other y) x) (* (-> other x) y)))) - - (define (print) - (print :sep "" "[vector3] (" x " " y " " z ")")))) +(define-module math + :imports ("oo.slime") + :exports (pi abs sqrt make-vector3) + + (define pi + :doc "Tha famous circle constant." + 3.14159265) + + (define (abs x) + :doc "Accepts one argument and returns the absoulte value of it" + (if (> x 0) x (- x))) + + (define (sqrt x) + :doc "Accepts one argument and returns the square root of it" + (** x 0.5)) + + (define-class (vector3 x y z) + (define (set-x new-x) (mutate x new-x)) + (define (set-y new-y) (mutate y new-y)) + (define (set-z new-z) (mutate z new-z)) + + (define (length) + (** (+ (* x x) (* y y) (* z z)) 0.5)) + + (define (scale fac) + (mutate x (* fac x)) + (mutate y (* fac y)) + (mutate z (* fac z)) + fac) + + (define (add other) + (make-vector3 + (+ (-> other x) x) + (+ (-> other y) y) + (+ (-> other z) z))) + + (define (subtract other) + (make-vector3 + (- (-> other x) x) + (- (-> other y) y) + (- (-> other z) z))) + + (define (equal? other) + (and (= (-> other x) x) + (= (-> other y) y) + (= (-> other z) z))) + + (define (scalar-product other) + (+ (* (-> other x) x) + (* (-> other y) y) + (* (-> other z) z))) + + (define (cross-product other) + (make-vector3 + (- (* (-> other z) y) (* (-> other y) z)) + (- (* (-> other x) z) (* (-> other z) x)) + (- (* (-> other y) x) (* (-> other x) y)))) + + (define (print) + (print :sep "" "[vector3] (" x " " y " " z ")")))) diff --git a/bin/oo.slime b/bin/oo.slime index d122bd9..b59f2a4 100644 --- a/bin/oo.slime +++ b/bin/oo.slime @@ -1,25 +1,25 @@ -(define-syntax (define-class name-and-members . body) - "Macro for creating simple classes." - (let ((name (first name-and-members)) - (members (rest name-and-members))) - `(set-type! - (define - ;; The function definition - (,(string->symbol (concat-strings "make-" (symbol->string name))) ,@members) - ;; The docstring - ,(concat-strings "This is the handle to an object of the class " (symbol->string name)) - ;; the body - ,@body - (let ,(zip members members) - (set-type! - (lambda args - "This is the docs for the handle" - (let ((op (eval (first args)))) - (if (procedure? op) - (eval args) - (eval (first args))))) - ,(symbol->keyword name)))) - :constructor))) - -(define-syntax (-> obj meth . args) - `(,obj ',meth ,@args)) +(define-syntax (define-class name-and-members . body) + "Macro for creating simple classes." + (let ((name (first name-and-members)) + (members (rest name-and-members))) + `(set-type! + (define + ;; The function definition + (,(string->symbol (concat-strings "make-" (symbol->string name))) ,@members) + ;; The docstring + ,(concat-strings "This is the handle to an object of the class " (symbol->string name)) + ;; the body + ,@body + (let ,(zip members members) + (set-type! + (lambda args + "This is the docs for the handle" + (let ((op (eval (first args)))) + (if (procedure? op) + (eval args) + (eval (first args))))) + ,(symbol->keyword name)))) + :constructor))) + +(define-syntax (-> obj meth . args) + `(,obj ',meth ,@args)) diff --git a/bin/pre.slime b/bin/pre.slime index 16c5dde..a5584bc 100644 --- a/bin/pre.slime +++ b/bin/pre.slime @@ -1,508 +1,507 @@ -(define hm/set! hash-map-set!) -(define hm/get hash-map-get) - -(define (hm/get-or-nil hm key) - (mytry (hm/get hm key) ())) - -(define-syntax (pe expr) - `(print ',expr "evaluates to" ,expr)) - -(define the-empty-stream ()) - -(define (stream-null? s) (if s t ())) - -(define-syntax (delay expr) - `(,lambda () ,expr)) - -(define (force promise) - (promise)) - -(define-syntax (mac a) (list + 1 1)) -(define-syntax (add . args) (pair '+ args)) - -(define-syntax (when condition . body) - :doc "Special form for when multiple actions should be done if a -condition is true. - -{{{example_start}}} -(when (not ()) - (print \"Hello \") - (print \"from \") - (print \"when!\")) - -(when () - (print \"Goodbye \") - (print \"World!\")) -{{{example_end}}} -" - (if (= (rest body) ()) - `(if ,condition ,@body nil) - `(if ,condition (begin ,@body) nil))) - - -(define-syntax (unless condition . body) - :doc "Special form for when multiple actions should be done if a -condition is false." - (if (= (rest body) ()) - `(if ,condition nil ,@body) - `(if ,condition nil (begin ,@body)))) - -(define-syntax (n-times times action) - :doc "Executes action times times." - (define (repeat times elem) - (unless (> 1 times) - (pair elem (repeat (- times 1) elem)))) - `(begin ,@(repeat times action))) - -(define-syntax (let bindings . body) - (define (unzip lists) - (when lists - (define (iter lists l1 l2) - (define elem (first lists)) - (if elem - (iter (rest lists) - (pair (first elem) l1) - (pair (first (rest elem)) l2)) - (list l1 l2)))) - (iter lists () ())) - - (define unzipped (unzip bindings)) - - `((,lambda ,(first unzipped) ,@body) ,@(first (rest unzipped)))) - -(define-syntax (cond . clauses) - (define (rec clauses) - (if (= nil clauses) - nil - (if (= (first (first clauses)) 'else) - (begin - (if (not (= (rest clauses) ())) - (error :syntax-error "There are additional clauses after the else clause!") - (pair 'begin (rest (first clauses))))) - `(if ,(first (first clauses)) - (begin ,@(rest (first clauses))) - ,(rec (rest clauses)))))) - (rec clauses)) - - -(define-syntax (case var . clauses) - (define (rec clauses) - (if (= nil clauses) - nil - (if (= (first (first clauses)) 'else) - (begin - (if (not (= (rest clauses) ())) - (error :syntax-error "There are additional clauses after the else clause!") - (pair 'begin (rest (first clauses))))) - `(if (member? ,var ',(first (first clauses))) - (begin ,@(rest (first clauses))) - ,(rec (rest clauses)))))) - (rec clauses)) - -(define-syntax (construct-list . body) - :doc " -{{{example_start}}} -(construct-list - i <- '(1 2 3 4 5) - yield (* i i)) -{{{example_end}}} - -(construct-list - i <- '(1 2 3 4) - j <- '(A B) - yield (pair i j)) - -(construct-list - i <- '(1 2 3 4 5 6 7 8) - if (= 0 (% i 2)) - yield i) -" - (define (append-map f ll) - (unless (= ll ()) - (define val (f (first ll))) - (if (= (first val) ()) - (append-map f (rest ll)) - (extend - val - (append-map f (rest ll)))))) - - (define (rec body) - (cond - ((= () body) ()) - ((= () (rest body)) (first body)) - ((= (first (rest body)) '<-) - `(,append-map (lambda (,(first body)) (list ,(rec (rest (rest (rest body)))))) ,(first (rest (rest body))))) - ((= (first body) 'if) - `(when ,(first (rest body)) ,(rec (rest (rest body))))) - ((= (first (rest body)) 'yield) - (first (rest body))) - (else (error :syntax-error "Not a do-able expression")))) - - (rec body)) - -;; (define-syntax (apply fun seq) -;; :doc "Applies the function to the sequence, as in calls the function with -;; ithe sequence as arguemens." -;; `(eval (pair ,fun ,seq))) - -(define-syntax (define-typed args . body) - (define (get-arg-names args) - (when args - (pair (first args) - (get-arg-names (rest (rest args)))))) - (let ((name (first args)) - (lambda-list (rest args)) - (arg-names (get-arg-names (rest args)))) - `(define (,name ,@arg-names) - (assert-types= ,@lambda-list) - ,@body))) - - -(define-syntax (define-module module-name (:imports ()) :exports . body) - (let ((module-prefix (concat-strings (symbol->string module-name) "::"))) - (eval `(begin ,@(map (lambda (x) `(,import ,x)) imports) ,@body)) - (pair 'begin - (map (lambda (orig-export-name) - (let ((export-name (string->symbol - (concat-strings module-prefix - (symbol->string orig-export-name))))) - `(define ,export-name - ,(mytry (eval orig-export-name) - (error :module-error "The module does not contain a key it tries to export"))))) - exports)))) - - -(define-syntax (generic-extend args . body) - (let ((fun-name (first args)) - (params (rest args)) - (types ()) - (names ())) - (define (process-params params) - (when params - (let ((_name (first params)) - (_type (first (rest params)))) - (assert (symbol? _name)) - (assert (keyword? _type)) - (set! types (append types _type)) - (set! names (append names _name)) - (process-params (rest (rest params)))))) - (process-params params) - ;; we have the fun-name, the param names and the types, lets go: - ;; - ;; first check if there is already a generic--map - (let ((generic-map-name (string->symbol - (concat-strings "generic-" (symbol->string fun-name) "-map")))) - (unless (bound? generic-map-name) - (define generic-map-name (hash-map))) - (hm/set! generic-map-name types (eval `(,lambda ,names ,@body))) - ;; now check if the generic procedure already exists - (if (bound? fun-name) - (let ((exisiting-fun (eval fun-name))) - (unless (type=? exisiting-fun :generic-procedure) - (unless (procedure? exisiting-fun) - (error :macro-expand-error "can only generic-extend procedures.")) - (define orig-proc exisiting-fun) - (define fun-name (eval - `(,lambda args (let ((fun (hm/get (map type args)))) - (if (procedure? fun) - (fun . args) - (,orig-proc . args)))) - )) - ) - ) - - ) - - )) - ) - -(define (null? x) - :doc "Checks if the argument is =nil=." - (= x ())) - -(define (type=? obj typ) - :doc "Checks if the argument =obj= is of type =typ=" - (= (type obj) typ)) - -(define (types=? . objs) - (define (inner objs) - (if objs - (let ((actual-type (type (first objs))) - (desired-type (first (rest objs)))) - (if (= actual-type desired-type) - (inner (rest (rest objs))) - ())) - t)) - (inner objs)) - -(define (assert-types= . objs) - (define (inner objs) - (when objs - (let ((actual-type (type (first objs))) - (desired-type (first (rest objs)))) - (if (= actual-type desired-type) - (inner (rest (rest objs))) - (error :type-missmatch "type missmatch" actual-type desired-type))))) - (inner objs)) - -(define (number? x) - :doc "Checks if the argument is a number." - (type=? x :number)) - -(define (symbol? x) - :doc "Checks if the argument is a symbol." - (type=? x :symbol)) - -(define (keyword? x) - :doc "Checks if the argument is a keyword." - (type=? x :keyword)) - -(define (pair? x) - :doc "Checks if the argument is a pair." - (type=? x :pair)) - -(define (string? x) - :doc "Checks if the argument is a string." - (type=? x :string)) - -(define (lambda? x) - :doc "Checks if the argument is a function." - (type=? x :lambda)) - -(define (macro? x) - :doc "Checks if the argument is a macro." - (type=? x :macro)) - -(define (special-lambda? x) - :doc "Checks if the argument is a special-lambda." - (type=? x :dynamic-macro)) - -(define (built-in-function? x) - :doc "Checks if the argument is a built-in function." - (type=? x :cfunction)) - -(define (continuation? x) - :doc "Checks if the argument is a continuation." - (type=? x :continuation)) - -(define (procedure? x) - (or (lambda? x) - (special-lambda? x) - (macro? x) - (built-in-function? x) - (continuation? x))) - -(define (end seq) - :doc "Returns the last pair in the sqeuence. - -{{{example_start}}} -(define a (list 1 2 3 4)) -(print (end a)) -{{{example_end}}} -" - (if (or (null? seq) (not (pair? (rest seq)))) - seq - (end (rest seq)))) - -(define (last seq) - :doc "Returns the (first) of the last (pair) of the given sequence. - -{{{example_start}}} -(define a (list 1 2 3 4)) -(print (last a)) -{{{example_end}}} -" - (first (end seq))) - -(define (extend seq elem) - :doc "Extends a list with the given element, by putting it in -the (rest) of the last element of the sequence." - (if (pair? seq) - (begin - (define e (end seq)) - (mutate e (pair (first e) elem)) - seq) - elem)) - -(define (extend2 seq elem) - :doc "Extends a list with the given element, by putting it in -the (rest) of the last element of the sequence." - (print "addr of (end seq)" (addr-of (end seq))) - (if (pair? seq) - (let ((e (end seq))) - (print "addr if e inner" (addr-of e)) - (mutate e (pair (first e) elem)) - seq)) - elem) - -(define (append seq elem) - :doc "Appends an element to a sequence, by extendeing the list -with (pair elem nil)." - (extend seq (pair elem ()))) - -(define (length seq) - :doc "Returns the length of the given sequence." - (if (null? seq) - 0 - (+ 1 (length (rest seq))))) - -(define (member? elem seq) - (when (pair? seq) - (if (= elem (first seq)) - t - (member? elem (rest seq))))) - -(define (sublist-starting-at-index seq index) - (cond ((< index 0) - (error :index-out-of-range "sublist-starting-at-index: index must be positive")) - ((null? seq) ()) - ((= 0 index) seq) - (else (sublist-starting-at (rest seq) (- index 1))))) - -(define (list-without-index seq index) - (cond ((or (< index 0) (null? seq)) - (error :index-out-of-range "list-remove-index!: index out of range")) - ((= 0 index) (rest seq)) - (else (pair (first seq) (list-without-index (rest seq) (- index 1)))))) - -(define (increment val) - :doc "Adds one to the argument." - (+ val 1)) - -(define (decrement val) - :doc "Subtracts one from the argument." - (- val 1)) - -(define (range (:from 0) :to) - :doc "Returns a sequence of numbers starting with the number defined -by the key =from= and ends with the number defined in =to=." - (when (< from to) - (pair from (range :from (+ 1 from) :to to)))) - -(define (range-while (:from 0) :to) - :doc "Returns a sequence of numbers starting with the number defined -by the key 'from' and ends with the number defined in 'to'." - (define result (list (copy from))) - (define head result) - (set! from (increment from)) - (while (< from to) - (begin - (mutate head (pair (first head) (pair (copy from) nil))) - (define head (rest head)) - (set! from (increment from)))) - result) - -(define (map fun seq) - :doc "Takes a function and a sequence as arguments and returns a new -sequence which contains the results of using the first sequences -elemens as argument to that function." - (if (null? seq) - seq - (pair (fun (first seq)) - (map fun (rest seq))))) - -(define (reduce fun seq) - :doc "Takes a function and a sequence as arguments and applies the -function to the argument sequence. This only works correctly if the -given function accepts a variable amount of parameters. If your -funciton is limited to two arguments, use [[=reduce-binary=]] -instead." - (apply fun seq)) - -(define (reduce-binary fun seq) - :doc "Takes a function and a sequence as arguments and applies the -function to the argument sequence. reduce-binary applies the arguments -*pair-wise* which means it works with binary functions as compared to -[[=reduce=]]." - (if (null? (rest seq)) - (first seq) - (fun (first seq) - (reduce-binary fun (rest seq))))) - -(define (filter fun seq) - :doc "Takes a function and a sequence as arguments and applies the -function to every value in the sequence. If the result of that -funciton application returns a truthy value, the original value is -added to a list, which in the end is returned." - (when seq - (if (fun (first seq)) - (pair (first seq) - (filter fun (rest seq))) - (filter fun (rest seq))))) - - -(define (zip l1 l2) - (unless (and (null? l1) (null? l2)) - (pair (list (first l1) (first l2)) - (zip (rest l1) (rest l2))))) - -(define (unzip lists) - (when lists - (define (iter lists l1 l2) - (define elem (first lists)) - (if elem - (iter (rest lists) - (pair (first elem) l1) - (pair (first (rest elem)) l2)) - (list l1 l2))) - - (iter lists () ()))) - -(define (enumerate seq) - (define (enumerate-inner seq next-num) - (when seq - (pair (list (first seq) next-num) - (enumerate-inner (rest seq) (+ 1 next-num))))) - (enumerate-inner seq 0)) - -;; (define (print (:sep " ") (:end "\n") . args) -;; "A wrapper for the built-in function [[=print=]] that accepts a -;; variable number of arguments and also provides keywords for specifying -;; the printed separators (=sep=) between the arguments and what should -;; be printed after the last argument (=end=)." -;; (define (print-inner args) -;; (if args -;; (begin -;; (print (first args)) -;; (when (rest args) -;; (print sep)) -;; (print-inner (rest args))) -;; ; else -;; (print end))) - -;; (print-inner args) -;; ()) - - - -;; (generic-extend (+ v1 :vector v2 :vector) -;; (assert (= (vector-length v1) -;; (vector-length v2))) -;; (vector (+ (vector-ref v1 0) -;; (vector-ref v2 0)))) - - -;; (unless (bound? generic-+-map) -;; (set! generic-+-map (create-hash-map))) -;; (hm/set! generic-+-map '(:vector :vector) (lambda (v1 v2) -;; (assert (= (vector-length v1) -;; (vector-length v2))) -;; (vector (+ (vector-ref v1 0) -;; (vector-ref v2 0))))) -;; (hm/set! generic-+-map '(:string :string) (lambda (v1 v2) (concat-strings v1 v2))) - -;; (let ((define-it -;; (lambda (backup) -;; (set! + (set-type! -;; (lambda args (let ((fun (hm/get-or-nil generic-+-map (map type args)))) -;; (if fun (apply fun args) -;; (backup args)))) -;; :generic-procedure))))) -;; (if (bound? +) -;; (let ((exisiting-fun +)) -;; (unless (type=? exisiting-fun :generic-procedure) -;; (unless (procedure? exisiting-fun) -;; (error :macro-expand-error "can only generic-extend procedures.")) -;; (define orig-proc exisiting-fun) -;; (define-it (lambda (args) (apply orig-proc args))))) -;; (define-it (lambda (args) (error :generic-lookup "no overloads found"))))) +(define hm/set! hash-map-set!) +(define hm/get hash-map-get) + +(define (hm/get-or-nil hm key) + (mytry (hm/get hm key) ())) + +(define-syntax (pe expr) + `((begin + (print :end " " ',expr "evaluates to") + ((lambda (e) + (print e) + e) ,expr)) + )) + +(define the-empty-stream ()) + +(define (stream-null? s) (if s t ())) + +(define-syntax (delay expr) + `(,lambda () ,expr)) + +(define (force promise) + (promise)) + +(define-syntax (mac a) (list + 1 1)) +(define-syntax (add . args) (pair '+ args)) + +(define-syntax (when condition . body) + :doc "Special form for when multiple actions should be done if a +condition is true. + +{{{example_start}}} +(when (not ()) + (print \"Hello \") + (print \"from \") + (print \"when!\")) + +(when () + (print \"Goodbye \") + (print \"World!\")) +{{{example_end}}} +" + (if (= (rest body) ()) + `(if ,condition ,@body nil) + `(if ,condition (begin ,@body) nil))) + + +(define-syntax (unless condition . body) + :doc "Special form for when multiple actions should be done if a +condition is false." + (if (= (rest body) ()) + `(if ,condition nil ,@body) + `(if ,condition nil (begin ,@body)))) + +(define-syntax (n-times times action) + :doc "Executes action times times." + (define (repeat times elem) + (unless (> 1 times) + (pair elem (repeat (- times 1) elem)))) + `(begin ,@(repeat times action))) + +(define-syntax (let bindings . body) + (define (unzip lists) + (when lists + (define (iter lists l1 l2) + (define elem (first lists)) + (if elem + (iter (rest lists) + (pair (first elem) l1) + (pair (first (rest elem)) l2)) + (list l1 l2))) + (iter lists () ()))) + (define unzipped (unzip bindings)) + `((,lambda ,(first unzipped) ,@body) ,@(first (rest unzipped)))) + +(define-syntax (cond . clauses) + (define (rec clauses) + (if (= () clauses) + () + (if (= (first (first clauses)) 'else) + (begin + (if (not (= (rest clauses) ())) + (error :syntax-error "There are additional clauses after the else clause!") + (pair 'begin (rest (first clauses))))) + `(if ,(first (first clauses)) + (begin ,@(rest (first clauses))) + ,(rec (rest clauses)))))) + (rec clauses)) + +(define-syntax (case var . clauses) + (define (rec clauses) + (if (= nil clauses) + nil + (if (= (first (first clauses)) 'else) + (begin + (if (not (= (rest clauses) ())) + (error :syntax-error "There are additional clauses after the else clause!") + (pair 'begin (rest (first clauses))))) + `(if (member? ,var ',(first (first clauses))) + (begin ,@(rest (first clauses))) + ,(rec (rest clauses)))))) + (rec clauses)) + +(define-syntax (construct-list . body) + :doc " +{{{example_start}}} +(construct-list + i <- '(1 2 3 4 5) + yield (* i i)) +{{{example_end}}} + +(construct-list + i <- '(1 2 3 4) + j <- '(A B) + yield (pair i j)) + +(construct-list + i <- '(1 2 3 4 5 6 7 8) + if (= 0 (% i 2)) + yield i) +" + (define (append-map f ll) + (unless (= ll ()) + (define val (f (first ll))) + (if (= (first val) ()) + (append-map f (rest ll)) + (extend + val + (append-map f (rest ll)))))) + + (define (rec body) + (cond + ((= () body) ()) + ((= () (rest body)) (first body)) + ((= (first (rest body)) '<-) + `(,append-map (lambda (,(first body)) (list ,(rec (rest (rest (rest body)))))) ,(first (rest (rest body))))) + ((= (first body) 'if) + `(when ,(first (rest body)) ,(rec (rest (rest body))))) + ((= (first (rest body)) 'yield) + (first (rest body))) + (else (error :syntax-error "Not a do-able expression")))) + + (rec body)) + +;; (define-syntax (apply fun seq) +;; :doc "Applies the function to the sequence, as in calls the function with +;; ithe sequence as arguemens." +;; `(eval (pair ,fun ,seq))) + +(define-syntax (define-typed args . body) + (define (get-arg-names args) + (when args + (pair (first args) + (get-arg-names (rest (rest args)))))) + (let ((name (first args)) + (lambda-list (rest args)) + (arg-names (get-arg-names (rest args)))) + `(define (,name ,@arg-names) + (assert-types= ,@lambda-list) + ,@body))) + + +(define-syntax (define-module module-name (:imports ()) :exports . body) + (let ((module-prefix (concat-strings (symbol->string module-name) "::"))) + (eval `(begin ,@(map (lambda (x) `(,import ,x)) imports) ,@body)) + (pair 'begin + (map (lambda (orig-export-name) + ((lambda (export-name) + `(define ,export-name + ,(eval orig-export-name))) + (string->symbol + (concat-strings module-prefix + (symbol->string orig-export-name))))) + exports)))) + +(define (tdefine-module module-name (:imports ()) (:exports ()) . body) + (let ((module-prefix (concat-strings (symbol->string module-name) "::")) + (exec `(begin ,@(map (lambda (x) `(,import ,x)) imports) ,@body))) + (eval exec) + (enable-debug-log) + (pair begin + (map (lambda (orig-export-name) + ((lambda (export-name) + `(define ,export-name + ,(eval orig-export-name))) + (string->symbol + (concat-strings module-prefix + (symbol->string orig-export-name))))) + exports)) + (disable-debug-log) + )) + +(define-syntax (generic-extend args . body) + (let ((fun-name (first args)) + (params (rest args)) + (types ()) + (names ())) + (define (process-params params) + (when params + (let ((_name (first params)) + (_type (first (rest params)))) + (assert (symbol? _name)) + (assert (keyword? _type)) + (set! types (append types _type)) + (set! names (append names _name)) + (process-params (rest (rest params)))))) + (process-params params) + ;; we have the fun-name, the param names and the types, lets go: + ;; + ;; first check if there is already a generic--map + (let ((generic-map-name (string->symbol + (concat-strings "generic-" (symbol->string fun-name) "-map")))) + (unless (bound? generic-map-name) + (define generic-map-name (hash-map))) + (hm/set! generic-map-name types (eval `(,lambda ,names ,@body))) + ;; now check if the generic procedure already exists + (if (bound? fun-name) + (let ((exisiting-fun (eval fun-name))) + (unless (type=? exisiting-fun :generic-procedure) + (unless (procedure? exisiting-fun) + (error :macro-expand-error "can only generic-extend procedures.")) + (define orig-proc exisiting-fun) + (define fun-name (eval + `(,lambda args (let ((fun (hm/get (map type args)))) + (if (procedure? fun) + (fun . args) + (,orig-proc . args)))) + )) + ) + ) + + ) + + )) + ) + +(define (null? x) + :doc "Checks if the argument is =nil=." + (= x ())) + +(define (type=? obj typ) + :doc "Checks if the argument =obj= is of type =typ=" + (= (type obj) typ)) + +(define (types=? . objs) + (define (inner objs) + (if objs + (let ((actual-type (type (first objs))) + (desired-type (first (rest objs)))) + (if (= actual-type desired-type) + (inner (rest (rest objs))) + ())) + t)) + (inner objs)) + +(define (assert-types= . objs) + (define (inner objs) + (when objs + (let ((actual-type (type (first objs))) + (desired-type (first (rest objs)))) + (if (= actual-type desired-type) + (inner (rest (rest objs))) + (error :type-missmatch "type missmatch" actual-type desired-type))))) + (inner objs)) + +(define (number? x) + :doc "Checks if the argument is a number." + (type=? x :number)) + +(define (symbol? x) + :doc "Checks if the argument is a symbol." + (type=? x :symbol)) + +(define (keyword? x) + :doc "Checks if the argument is a keyword." + (type=? x :keyword)) + +(define (pair? x) + :doc "Checks if the argument is a pair." + (type=? x :pair)) + +(define (string? x) + :doc "Checks if the argument is a string." + (type=? x :string)) + +(define (lambda? x) + :doc "Checks if the argument is a function." + (type=? x :lambda)) + +(define (macro? x) + :doc "Checks if the argument is a macro." + (type=? x :macro)) + +(define (special-lambda? x) + :doc "Checks if the argument is a special-lambda." + (type=? x :dynamic-macro)) + +(define (built-in-function? x) + :doc "Checks if the argument is a built-in function." + (type=? x :cfunction)) + +(define (continuation? x) + :doc "Checks if the argument is a continuation." + (type=? x :continuation)) + +(define (procedure? x) + (or (lambda? x) + (special-lambda? x) + (macro? x) + (built-in-function? x) + (continuation? x))) + +(define (end seq) + :doc "Returns the last pair in the sqeuence. + +{{{example_start}}} +(define a (list 1 2 3 4)) +(print (end a)) +{{{example_end}}} +" + (if (or (null? seq) (not (pair? (rest seq)))) + seq + (end (rest seq)))) + +(define (last seq) + :doc "Returns the (first) of the last (pair) of the given sequence. + +{{{example_start}}} +(define a (list 1 2 3 4)) +(print (last a)) +{{{example_end}}} +" + (first (end seq))) + +(define (extend seq elem) + :doc "Extends a list with the given element, by putting it in +the (rest) of the last element of the sequence." + (if (pair? seq) + (begin + (define e (end seq)) + (mutate e (pair (first e) elem)) + seq) + elem)) + +(define (extend2 seq elem) + :doc "Extends a list with the given element, by putting it in +the (rest) of the last element of the sequence." + (print "addr of (end seq)" (addr-of (end seq))) + (if (pair? seq) + (let ((e (end seq))) + (print "addr if e inner" (addr-of e)) + (mutate e (pair (first e) elem)) + seq)) + elem) + +(define (append seq elem) + :doc "Appends an element to a sequence, by extendeing the list +with (pair elem nil)." + (extend seq (pair elem ()))) + +(define (length seq) + :doc "Returns the length of the given sequence." + (if (null? seq) + 0 + (+ 1 (length (rest seq))))) + +(define (member? elem seq) + (when (pair? seq) + (if (= elem (first seq)) + t + (member? elem (rest seq))))) + +(define (sublist-starting-at-index seq index) + (cond ((< index 0) + (error :index-out-of-range "sublist-starting-at-index: index must be positive")) + ((null? seq) ()) + ((= 0 index) seq) + (else (sublist-starting-at (rest seq) (- index 1))))) + +(define (list-without-index seq index) + (cond ((or (< index 0) (null? seq)) + (error :index-out-of-range "list-remove-index!: index out of range")) + ((= 0 index) (rest seq)) + (else (pair (first seq) (list-without-index (rest seq) (- index 1)))))) + +(define (increment val) + :doc "Adds one to the argument." + (+ val 1)) + +(define (decrement val) + :doc "Subtracts one from the argument." + (- val 1)) + +(define (range (:from 0) :to) + :doc "Returns a sequence of numbers starting with the number defined +by the key =from= and ends with the number defined in =to=." + (when (< from to) + (pair from (range :from (+ 1 from) :to to)))) + +(define (range-while (:from 0) :to) + :doc "Returns a sequence of numbers starting with the number defined +by the key 'from' and ends with the number defined in 'to'." + (define result (list (copy from))) + (define head result) + (set! from (increment from)) + (while (< from to) + (begin + (mutate head (pair (first head) (pair (copy from) nil))) + (define head (rest head)) + (set! from (increment from)))) + result) + +(define (map fun seq) + :doc "Takes a function and a sequence as arguments and returns a new +sequence which contains the results of using the first sequences +elemens as argument to that function." + (if (null? seq) + seq + (pair (fun (first seq)) + (map fun (rest seq))))) + +(define (reduce fun seq) + :doc "Takes a function and a sequence as arguments and applies the +function to the argument sequence. This only works correctly if the +given function accepts a variable amount of parameters. If your +funciton is limited to two arguments, use [[=reduce-binary=]] +instead." + (apply fun seq)) + +(define (reduce-binary fun seq) + :doc "Takes a function and a sequence as arguments and applies the +function to the argument sequence. reduce-binary applies the arguments +*pair-wise* which means it works with binary functions as compared to +[[=reduce=]]." + (if (null? (rest seq)) + (first seq) + (fun (first seq) + (reduce-binary fun (rest seq))))) + +(define (filter fun seq) + :doc "Takes a function and a sequence as arguments and applies the +function to every value in the sequence. If the result of that +funciton application returns a truthy value, the original value is +added to a list, which in the end is returned." + (when seq + (if (fun (first seq)) + (pair (first seq) + (filter fun (rest seq))) + (filter fun (rest seq))))) + + +(define (zip l1 l2) + (unless (and (null? l1) (null? l2)) + (pair (list (first l1) (first l2)) + (zip (rest l1) (rest l2))))) + +(define (unzip lists) + (when lists + (define (iter lists l1 l2) + (define elem (first lists)) + (if elem + (iter (rest lists) + (pair (first elem) l1) + (pair (first (rest elem)) l2)) + (list l1 l2))) + + (iter lists () ()))) + +(define (enumerate seq) + (define (enumerate-inner seq next-num) + (when seq + (pair (list (first seq) next-num) + (enumerate-inner (rest seq) (+ 1 next-num))))) + (enumerate-inner seq 0)) + + +;; (generic-extend (+ v1 :vector v2 :vector) +;; (assert (= (vector-length v1) +;; (vector-length v2))) +;; (vector (+ (vector-ref v1 0) +;; (vector-ref v2 0)))) + + +;; (unless (bound? generic-+-map) +;; (set! generic-+-map (create-hash-map))) +;; (hm/set! generic-+-map '(:vector :vector) (lambda (v1 v2) +;; (assert (= (vector-length v1) +;; (vector-length v2))) +;; (vector (+ (vector-ref v1 0) +;; (vector-ref v2 0))))) +;; (hm/set! generic-+-map '(:string :string) (lambda (v1 v2) (concat-strings v1 v2))) + +;; (let ((define-it +;; (lambda (backup) +;; (set! + (set-type! +;; (lambda args (let ((fun (hm/get-or-nil generic-+-map (map type args)))) +;; (if fun (apply fun args) +;; (backup args)))) +;; :generic-procedure))))) +;; (if (bound? +) +;; (let ((exisiting-fun +)) +;; (unless (type=? exisiting-fun :generic-procedure) +;; (unless (procedure? exisiting-fun) +;; (error :macro-expand-error "can only generic-extend procedures.")) +;; (define orig-proc exisiting-fun) +;; (define-it (lambda (args) (apply orig-proc args))))) +;; (define-it (lambda (args) (error :generic-lookup "no overloads found"))))) diff --git a/bin/pre.slime.expanded b/bin/pre.slime.expanded index 5c7d8e4..434b363 100644 --- a/bin/pre.slime.expanded +++ b/bin/pre.slime.expanded @@ -1,106 +1,106 @@ -(define hm/set! hash-map-set!) - -(define hm/get hash-map-get) - -(define (hm/get-or-nil hm key) (mytry (hm/get hm key) ())) - -(define-syntax (pe expr) `(print ',expr "evaluates to" ,expr)) - -(define the-empty-stream ()) - -(define (stream-null? s) (if s t ())) - -(define-syntax (delay expr) `(,lambda () ,expr)) - -(define (force promise) (promise)) - -(define-syntax (when condition . body) :doc "Special form for when multiple actions should be done if a\ncondition is true.\n\n{{{example_start}}}\n(when (not ())\n (print "Hello ")\n (print "from ")\n (print "when!"))\n\n(when ()\n (print "Goodbye ")\n (print "World!"))\n{{{example_end}}}\n" (if (= (rest body) ()) `(if ,condition ,@body nil) `(if ,condition (begin ,@body) nil))) - -(define-syntax (unless condition . body) :doc "Special form for when multiple actions should be done if a\ncondition is false." (if (= (rest body) ()) `(if ,condition nil ,@body) `(if ,condition nil (begin ,@body)))) - -(define-syntax (n-times times action) :doc "Executes action times times." (define (repeat times elem) (unless (> 1 times) (pair elem (repeat (- times 1) elem)))) `(begin ,@(repeat times action))) - -(define-syntax (let bindings . body) (define (unzip lists) (when lists (define (iter lists l1 l2) (define elem (first lists)) (if elem (iter (rest lists) (pair (first elem) l1) (pair (first (rest elem)) l2)) (list l1 l2)))) (iter lists () ())) (define unzipped (unzip bindings)) `((,lambda ,(first unzipped) ,@body) ,@(first (rest unzipped)))) - -(define-syntax (cond . clauses) (define (rec clauses) (if (= nil clauses) nil (if (= (first (first clauses)) 'else) (begin (if (not (= (rest clauses) ())) (error :syntax-error "There are additional clauses after the else clause!") (pair 'begin (rest (first clauses))))) `(if ,(first (first clauses)) (begin ,@(rest (first clauses))) ,(rec (rest clauses)))))) (rec clauses)) - -(define-syntax (case var . clauses) (define (rec clauses) (if (= nil clauses) nil (if (= (first (first clauses)) 'else) (begin (if (not (= (rest clauses) ())) (error :syntax-error "There are additional clauses after the else clause!") (pair 'begin (rest (first clauses))))) `(if (member? ,var ',(first (first clauses))) (begin ,@(rest (first clauses))) ,(rec (rest clauses)))))) (rec clauses)) - -(define-syntax (construct-list . body) :doc "\n{{{example_start}}}\n(construct-list\n i <- '(1 2 3 4 5)\n yield (* i i))\n{{{example_end}}}\n\n(construct-list\n i <- '(1 2 3 4)\n j <- '(A B)\n yield (pair i j))\n\n(construct-list\n i <- '(1 2 3 4 5 6 7 8)\n if (= 0 (% i 2))\n yield i)\n" (define (append-map f ll) (unless (= ll ()) (define val (f (first ll))) (if (= (first val) ()) (append-map f (rest ll)) (extend val (append-map f (rest ll)))))) (define (rec body) (cond ((= () body) ()) ((= () (rest body)) (first body)) ((= (first (rest body)) '<-) `(,append-map (lambda (,(first body)) (list ,(rec (rest (rest (rest body)))))) ,(first (rest (rest body))))) ((= (first body) 'if) `(when ,(first (rest body)) ,(rec (rest (rest body))))) ((= (first (rest body)) 'yield) (first (rest body))) (else (error :syntax-error "Not a do-able expression")))) (rec body)) - -(define-syntax (define-typed args . body) (define (get-arg-names args) (when args (pair (first args) (get-arg-names (rest (rest args)))))) (let ((name (first args)) (lambda-list (rest args)) (arg-names (get-arg-names (rest args)))) `(define (,name ,@arg-names) (assert-types= ,@lambda-list) ,@body))) - -(define-syntax (define-module module-name (:imports ()) :exports . body) (let ((module-prefix (concat-strings (symbol->string module-name) "::"))) (eval `(begin ,@(map (lambda (x) `(,import ,x)) imports) ,@body)) (pair 'begin (map (lambda (orig-export-name) (let ((export-name (string->symbol (concat-strings module-prefix (symbol->string orig-export-name))))) `(define ,export-name ,(mytry (eval orig-export-name) (error :module-error "The module does not contain a key it tries to export"))))) exports)))) - -(define-syntax (generic-extend args . body) (let ((fun-name (first args)) (params (rest args)) (types ()) (names ())) (define (process-params params) (when params (let ((_name (first params)) (_type (first (rest params)))) (assert (symbol? _name)) (assert (keyword? _type)) (set! types (append types _type)) (set! names (append names _name)) (process-params (rest (rest params)))))) (process-params params) (let ((generic-map-name (string->symbol (concat-strings "generic-" (symbol->string fun-name) "-map")))) (unless (bound? generic-map-name) (define generic-map-name (hash-map))) (hm/set! generic-map-name types (eval `(,lambda ,names ,@body))) (if (bound? fun-name) (let ((exisiting-fun (eval fun-name))) (unless (type=? exisiting-fun :generic-procedure) (unless (procedure? exisiting-fun) (error :macro-expand-error "can only generic-extend procedures.")) (define orig-proc exisiting-fun) (define fun-name (eval `(,lambda args (let ((fun (hm/get (map type args)))) (if (procedure? fun) (fun . args) (,orig-proc . args)))))))))))) - -(define (null? x) :doc "Checks if the argument is =nil=." (= x ())) - -(define (type=? obj typ) :doc "Checks if the argument =obj= is of type =typ=" (= (type obj) typ)) - -(define (types=? . objs) (define (inner objs) (if objs (let ((actual-type (type (first objs))) (desired-type (first (rest objs)))) (if (= actual-type desired-type) (inner (rest (rest objs))) ())) t)) (inner objs)) - -(define (assert-types= . objs) (define (inner objs) (when objs (let ((actual-type (type (first objs))) (desired-type (first (rest objs)))) (if (= actual-type desired-type) (inner (rest (rest objs))) (error :type-missmatch "type missmatch" actual-type desired-type))))) (inner objs)) - -(define (number? x) :doc "Checks if the argument is a number." (type=? x :number)) - -(define (symbol? x) :doc "Checks if the argument is a symbol." (type=? x :symbol)) - -(define (keyword? x) :doc "Checks if the argument is a keyword." (type=? x :keyword)) - -(define (pair? x) :doc "Checks if the argument is a pair." (type=? x :pair)) - -(define (string? x) :doc "Checks if the argument is a string." (type=? x :string)) - -(define (lambda? x) :doc "Checks if the argument is a function." (type=? x :lambda)) - -(define (macro? x) :doc "Checks if the argument is a macro." (type=? x :macro)) - -(define (special-lambda? x) :doc "Checks if the argument is a special-lambda." (type=? x :dynamic-macro)) - -(define (built-in-function? x) :doc "Checks if the argument is a built-in function." (type=? x :cfunction)) - -(define (continuation? x) :doc "Checks if the argument is a continuation." (type=? x :continuation)) - -(define (procedure? x) (or (lambda? x) (special-lambda? x) (macro? x) (built-in-function? x) (continuation? x))) - -(define (end seq) :doc "Returns the last pair in the sqeuence.\n\n{{{example_start}}}\n(define a (list 1 2 3 4))\n(print (end a))\n{{{example_end}}}\n" (if (or (null? seq) (not (pair? (rest seq)))) seq (end (rest seq)))) - -(define (last seq) :doc "Returns the (first) of the last (pair) of the given sequence.\n\n{{{example_start}}}\n(define a (list 1 2 3 4))\n(print (last a))\n{{{example_end}}}\n" (first (end seq))) - -(define (extend seq elem) :doc "Extends a list with the given element, by putting it in\nthe (rest) of the last element of the sequence." (if (pair? seq) (begin (define e (end seq)) (mutate e (pair (first e) elem)) seq) elem)) - -(define (extend2 seq elem) :doc "Extends a list with the given element, by putting it in\nthe (rest) of the last element of the sequence." (print "addr of (end seq)" (addr-of (end seq))) (if (pair? seq) (let ((e (end seq))) (print "addr if e inner" (addr-of e)) (mutate e (pair (first e) elem)) seq)) elem) - -(define (append seq elem) :doc "Appends an element to a sequence, by extendeing the list\nwith (pair elem nil)." (extend seq (pair elem ()))) - -(define (length seq) :doc "Returns the length of the given sequence." (if (null? seq) 0 (+ 1 (length (rest seq))))) - -(define (member? elem seq) (when (pair? seq) (if (= elem (first seq)) t (member? elem (rest seq))))) - -(define (sublist-starting-at-index seq index) (cond ((< index 0) (error :index-out-of-range "sublist-starting-at-index: index must be positive")) ((null? seq) ()) ((= 0 index) seq) (else (sublist-starting-at (rest seq) (- index 1))))) - -(define (list-without-index seq index) (cond ((or (< index 0) (null? seq)) (error :index-out-of-range "list-remove-index!: index out of range")) ((= 0 index) (rest seq)) (else (pair (first seq) (list-without-index (rest seq) (- index 1)))))) - -(define (increment val) :doc "Adds one to the argument." (+ val 1)) - -(define (decrement val) :doc "Subtracts one from the argument." (- val 1)) - -(define (range (:from 0) :to) :doc "Returns a sequence of numbers starting with the number defined\nby the key =from= and ends with the number defined in =to=." (when (< from to) (pair from (range :from (+ 1 from) :to to)))) - -(define (range-while (:from 0) :to) :doc "Returns a sequence of numbers starting with the number defined\nby the key 'from' and ends with the number defined in 'to'." (define result (list (copy from))) (define head result) (set! from (increment from)) (while (< from to) (begin (mutate head (pair (first head) (pair (copy from) nil))) (define head (rest head)) (set! from (increment from)))) result) - -(define (map fun seq) :doc "Takes a function and a sequence as arguments and returns a new\nsequence which contains the results of using the first sequences\nelemens as argument to that function." (if (null? seq) seq (pair (fun (first seq)) (map fun (rest seq))))) - -(define (reduce fun seq) :doc "Takes a function and a sequence as arguments and applies the\nfunction to the argument sequence. This only works correctly if the\ngiven function accepts a variable amount of parameters. If your\nfunciton is limited to two arguments, use [[=reduce-binary=]]\ninstead." (apply fun seq)) - -(define (reduce-binary fun seq) :doc "Takes a function and a sequence as arguments and applies the\nfunction to the argument sequence. reduce-binary applies the arguments\n*pair-wise* which means it works with binary functions as compared to\n[[=reduce=]]." (if (null? (rest seq)) (first seq) (fun (first seq) (reduce-binary fun (rest seq))))) - -(define (filter fun seq) :doc "Takes a function and a sequence as arguments and applies the\nfunction to every value in the sequence. If the result of that\nfunciton application returns a truthy value, the original value is\nadded to a list, which in the end is returned." (when seq (if (fun (first seq)) (pair (first seq) (filter fun (rest seq))) (filter fun (rest seq))))) - -(define (zip l1 l2) (unless (and (null? l1) (null? l2)) (pair (list (first l1) (first l2)) (zip (rest l1) (rest l2))))) - -(define (unzip lists) (when lists (define (iter lists l1 l2) (define elem (first lists)) (if elem (iter (rest lists) (pair (first elem) l1) (pair (first (rest elem)) l2)) (list l1 l2))) (iter lists () ()))) - -(define (enumerate seq) (define (enumerate-inner seq next-num) (when seq (pair (list (first seq) next-num) (enumerate-inner (rest seq) (+ 1 next-num))))) (enumerate-inner seq 0)) - +(define hm/set! hash-map-set!) + +(define hm/get hash-map-get) + +(define (hm/get-or-nil hm key) (mytry (hm/get hm key) ())) + +(define-syntax (pe expr) `(print ',expr "evaluates to" ,expr)) + +(define the-empty-stream ()) + +(define (stream-null? s) (if s t ())) + +(define-syntax (delay expr) `(,lambda () ,expr)) + +(define (force promise) (promise)) + +(define-syntax (when condition . body) :doc "Special form for when multiple actions should be done if a\ncondition is true.\n\n{{{example_start}}}\n(when (not ())\n (print "Hello ")\n (print "from ")\n (print "when!"))\n\n(when ()\n (print "Goodbye ")\n (print "World!"))\n{{{example_end}}}\n" (if (= (rest body) ()) `(if ,condition ,@body nil) `(if ,condition (begin ,@body) nil))) + +(define-syntax (unless condition . body) :doc "Special form for when multiple actions should be done if a\ncondition is false." (if (= (rest body) ()) `(if ,condition nil ,@body) `(if ,condition nil (begin ,@body)))) + +(define-syntax (n-times times action) :doc "Executes action times times." (define (repeat times elem) (unless (> 1 times) (pair elem (repeat (- times 1) elem)))) `(begin ,@(repeat times action))) + +(define-syntax (let bindings . body) (define (unzip lists) (when lists (define (iter lists l1 l2) (define elem (first lists)) (if elem (iter (rest lists) (pair (first elem) l1) (pair (first (rest elem)) l2)) (list l1 l2)))) (iter lists () ())) (define unzipped (unzip bindings)) `((,lambda ,(first unzipped) ,@body) ,@(first (rest unzipped)))) + +(define-syntax (cond . clauses) (define (rec clauses) (if (= nil clauses) nil (if (= (first (first clauses)) 'else) (begin (if (not (= (rest clauses) ())) (error :syntax-error "There are additional clauses after the else clause!") (pair 'begin (rest (first clauses))))) `(if ,(first (first clauses)) (begin ,@(rest (first clauses))) ,(rec (rest clauses)))))) (rec clauses)) + +(define-syntax (case var . clauses) (define (rec clauses) (if (= nil clauses) nil (if (= (first (first clauses)) 'else) (begin (if (not (= (rest clauses) ())) (error :syntax-error "There are additional clauses after the else clause!") (pair 'begin (rest (first clauses))))) `(if (member? ,var ',(first (first clauses))) (begin ,@(rest (first clauses))) ,(rec (rest clauses)))))) (rec clauses)) + +(define-syntax (construct-list . body) :doc "\n{{{example_start}}}\n(construct-list\n i <- '(1 2 3 4 5)\n yield (* i i))\n{{{example_end}}}\n\n(construct-list\n i <- '(1 2 3 4)\n j <- '(A B)\n yield (pair i j))\n\n(construct-list\n i <- '(1 2 3 4 5 6 7 8)\n if (= 0 (% i 2))\n yield i)\n" (define (append-map f ll) (unless (= ll ()) (define val (f (first ll))) (if (= (first val) ()) (append-map f (rest ll)) (extend val (append-map f (rest ll)))))) (define (rec body) (cond ((= () body) ()) ((= () (rest body)) (first body)) ((= (first (rest body)) '<-) `(,append-map (lambda (,(first body)) (list ,(rec (rest (rest (rest body)))))) ,(first (rest (rest body))))) ((= (first body) 'if) `(when ,(first (rest body)) ,(rec (rest (rest body))))) ((= (first (rest body)) 'yield) (first (rest body))) (else (error :syntax-error "Not a do-able expression")))) (rec body)) + +(define-syntax (define-typed args . body) (define (get-arg-names args) (when args (pair (first args) (get-arg-names (rest (rest args)))))) (let ((name (first args)) (lambda-list (rest args)) (arg-names (get-arg-names (rest args)))) `(define (,name ,@arg-names) (assert-types= ,@lambda-list) ,@body))) + +(define-syntax (define-module module-name (:imports ()) :exports . body) (let ((module-prefix (concat-strings (symbol->string module-name) "::"))) (eval `(begin ,@(map (lambda (x) `(,import ,x)) imports) ,@body)) (pair 'begin (map (lambda (orig-export-name) (let ((export-name (string->symbol (concat-strings module-prefix (symbol->string orig-export-name))))) `(define ,export-name ,(mytry (eval orig-export-name) (error :module-error "The module does not contain a key it tries to export"))))) exports)))) + +(define-syntax (generic-extend args . body) (let ((fun-name (first args)) (params (rest args)) (types ()) (names ())) (define (process-params params) (when params (let ((_name (first params)) (_type (first (rest params)))) (assert (symbol? _name)) (assert (keyword? _type)) (set! types (append types _type)) (set! names (append names _name)) (process-params (rest (rest params)))))) (process-params params) (let ((generic-map-name (string->symbol (concat-strings "generic-" (symbol->string fun-name) "-map")))) (unless (bound? generic-map-name) (define generic-map-name (hash-map))) (hm/set! generic-map-name types (eval `(,lambda ,names ,@body))) (if (bound? fun-name) (let ((exisiting-fun (eval fun-name))) (unless (type=? exisiting-fun :generic-procedure) (unless (procedure? exisiting-fun) (error :macro-expand-error "can only generic-extend procedures.")) (define orig-proc exisiting-fun) (define fun-name (eval `(,lambda args (let ((fun (hm/get (map type args)))) (if (procedure? fun) (fun . args) (,orig-proc . args)))))))))))) + +(define (null? x) :doc "Checks if the argument is =nil=." (= x ())) + +(define (type=? obj typ) :doc "Checks if the argument =obj= is of type =typ=" (= (type obj) typ)) + +(define (types=? . objs) (define (inner objs) (if objs (let ((actual-type (type (first objs))) (desired-type (first (rest objs)))) (if (= actual-type desired-type) (inner (rest (rest objs))) ())) t)) (inner objs)) + +(define (assert-types= . objs) (define (inner objs) (when objs (let ((actual-type (type (first objs))) (desired-type (first (rest objs)))) (if (= actual-type desired-type) (inner (rest (rest objs))) (error :type-missmatch "type missmatch" actual-type desired-type))))) (inner objs)) + +(define (number? x) :doc "Checks if the argument is a number." (type=? x :number)) + +(define (symbol? x) :doc "Checks if the argument is a symbol." (type=? x :symbol)) + +(define (keyword? x) :doc "Checks if the argument is a keyword." (type=? x :keyword)) + +(define (pair? x) :doc "Checks if the argument is a pair." (type=? x :pair)) + +(define (string? x) :doc "Checks if the argument is a string." (type=? x :string)) + +(define (lambda? x) :doc "Checks if the argument is a function." (type=? x :lambda)) + +(define (macro? x) :doc "Checks if the argument is a macro." (type=? x :macro)) + +(define (special-lambda? x) :doc "Checks if the argument is a special-lambda." (type=? x :dynamic-macro)) + +(define (built-in-function? x) :doc "Checks if the argument is a built-in function." (type=? x :cfunction)) + +(define (continuation? x) :doc "Checks if the argument is a continuation." (type=? x :continuation)) + +(define (procedure? x) (or (lambda? x) (special-lambda? x) (macro? x) (built-in-function? x) (continuation? x))) + +(define (end seq) :doc "Returns the last pair in the sqeuence.\n\n{{{example_start}}}\n(define a (list 1 2 3 4))\n(print (end a))\n{{{example_end}}}\n" (if (or (null? seq) (not (pair? (rest seq)))) seq (end (rest seq)))) + +(define (last seq) :doc "Returns the (first) of the last (pair) of the given sequence.\n\n{{{example_start}}}\n(define a (list 1 2 3 4))\n(print (last a))\n{{{example_end}}}\n" (first (end seq))) + +(define (extend seq elem) :doc "Extends a list with the given element, by putting it in\nthe (rest) of the last element of the sequence." (if (pair? seq) (begin (define e (end seq)) (mutate e (pair (first e) elem)) seq) elem)) + +(define (extend2 seq elem) :doc "Extends a list with the given element, by putting it in\nthe (rest) of the last element of the sequence." (print "addr of (end seq)" (addr-of (end seq))) (if (pair? seq) (let ((e (end seq))) (print "addr if e inner" (addr-of e)) (mutate e (pair (first e) elem)) seq)) elem) + +(define (append seq elem) :doc "Appends an element to a sequence, by extendeing the list\nwith (pair elem nil)." (extend seq (pair elem ()))) + +(define (length seq) :doc "Returns the length of the given sequence." (if (null? seq) 0 (+ 1 (length (rest seq))))) + +(define (member? elem seq) (when (pair? seq) (if (= elem (first seq)) t (member? elem (rest seq))))) + +(define (sublist-starting-at-index seq index) (cond ((< index 0) (error :index-out-of-range "sublist-starting-at-index: index must be positive")) ((null? seq) ()) ((= 0 index) seq) (else (sublist-starting-at (rest seq) (- index 1))))) + +(define (list-without-index seq index) (cond ((or (< index 0) (null? seq)) (error :index-out-of-range "list-remove-index!: index out of range")) ((= 0 index) (rest seq)) (else (pair (first seq) (list-without-index (rest seq) (- index 1)))))) + +(define (increment val) :doc "Adds one to the argument." (+ val 1)) + +(define (decrement val) :doc "Subtracts one from the argument." (- val 1)) + +(define (range (:from 0) :to) :doc "Returns a sequence of numbers starting with the number defined\nby the key =from= and ends with the number defined in =to=." (when (< from to) (pair from (range :from (+ 1 from) :to to)))) + +(define (range-while (:from 0) :to) :doc "Returns a sequence of numbers starting with the number defined\nby the key 'from' and ends with the number defined in 'to'." (define result (list (copy from))) (define head result) (set! from (increment from)) (while (< from to) (begin (mutate head (pair (first head) (pair (copy from) nil))) (define head (rest head)) (set! from (increment from)))) result) + +(define (map fun seq) :doc "Takes a function and a sequence as arguments and returns a new\nsequence which contains the results of using the first sequences\nelemens as argument to that function." (if (null? seq) seq (pair (fun (first seq)) (map fun (rest seq))))) + +(define (reduce fun seq) :doc "Takes a function and a sequence as arguments and applies the\nfunction to the argument sequence. This only works correctly if the\ngiven function accepts a variable amount of parameters. If your\nfunciton is limited to two arguments, use [[=reduce-binary=]]\ninstead." (apply fun seq)) + +(define (reduce-binary fun seq) :doc "Takes a function and a sequence as arguments and applies the\nfunction to the argument sequence. reduce-binary applies the arguments\n*pair-wise* which means it works with binary functions as compared to\n[[=reduce=]]." (if (null? (rest seq)) (first seq) (fun (first seq) (reduce-binary fun (rest seq))))) + +(define (filter fun seq) :doc "Takes a function and a sequence as arguments and applies the\nfunction to every value in the sequence. If the result of that\nfunciton application returns a truthy value, the original value is\nadded to a list, which in the end is returned." (when seq (if (fun (first seq)) (pair (first seq) (filter fun (rest seq))) (filter fun (rest seq))))) + +(define (zip l1 l2) (unless (and (null? l1) (null? l2)) (pair (list (first l1) (first l2)) (zip (rest l1) (rest l2))))) + +(define (unzip lists) (when lists (define (iter lists l1 l2) (define elem (first lists)) (if elem (iter (rest lists) (pair (first elem) l1) (pair (first (rest elem)) l2)) (list l1 l2))) (iter lists () ()))) + +(define (enumerate seq) (define (enumerate-inner seq next-num) (when seq (pair (list (first seq) next-num) (enumerate-inner (rest seq) (+ 1 next-num))))) (enumerate-inner seq 0)) + diff --git a/bin/sets.slime b/bin/sets.slime index c7a260e..3be85fc 100644 --- a/bin/sets.slime +++ b/bin/sets.slime @@ -1,31 +1,31 @@ -(define-module set - :imports ("cxr.slime") - :exports (make find contains? insert!) - - (define key-not-found-index -1) - - (define (make . vals) - (set-type! - (if vals - (list vals) - '(())) - :set)) - - (define (find set val) - (let ((values (car set))) - (define (inner values current-index) - (cond ((null? values) key-not-found-index) - ((= (car values) val) current-index) - (else (inner (cdr values) (+ 1 current-index))))) - (inner values 0))) - - (define (contains? set val) - (unless (= (find set val) key-not-found-index) - t)) - - (define (insert! set value) - (unless (contains? set value) - (set! set (pair (pair value (first set)) ())) - (set-type! set :set)) - set) - ) +(define-module set + :imports ("cxr.slime") + :exports (make find contains? insert!) + + (define key-not-found-index -1) + + (define (make . vals) + (set-type! + (if vals + (list vals) + '(())) + :set)) + + (define (find set val) + (let ((values (car set))) + (define (inner values current-index) + (cond ((null? values) key-not-found-index) + ((= (car values) val) current-index) + (else (inner (cdr values) (+ 1 current-index))))) + (inner values 0))) + + (define (contains? set val) + (unless (= (find set val) key-not-found-index) + t)) + + (define (insert! set value) + (unless (contains? set value) + (set! set (pair (pair value (first set)) ())) + (set-type! set :set)) + set) + ) diff --git a/bin/tests/alists.slime b/bin/tests/alists.slime index 0af1a86..6f61c77 100644 --- a/bin/tests/alists.slime +++ b/bin/tests/alists.slime @@ -1,101 +1,101 @@ -(import "alist.slime") - -(define a (ds::alist::make)) -;; a == (()) - -(assert (= (first a) ())) - -(ds::alist::set! a 'key1 'value1) -;; a == (key1: value1) - -(assert (= (ds::alist::get a 'key1) 'value1)) -(assert (ds::alist::key-exists? a 'key1)) -(assert (not (ds::alist::key-exists? a 'key2))) - -(ds::alist::set! a 'key2 'value2) -;; a == (key2: value2, -;; key1: value1) - -(assert (= (ds::alist::get a 'key2) 'value2)) -(assert (ds::alist::key-exists? a 'key2)) -(assert (= (ds::alist::find a 'key2) 0)) -(assert (= (ds::alist::find a 'key1) 1)) -(assert (= (length (first a)) 2)) - - -(ds::alist::set! a 'key1 'value3) -;; a == (key1: value3, -;; key2: value2, -;; key1: value1) - -(assert (= (length (first a)) 3)) -(assert (= (ds::alist::get a 'key1) 'value3)) - -(ds::alist::set-overwrite! a 'key1 'value4) -;; a == (key1: value4, -;; key2: value2, -;; key1: value1) - -(assert (= (length (first a)) 3)) -(assert (= (ds::alist::get a 'key1) 'value4)) - -(ds::alist::remove! a 'key1) -;; a == (key2: value2, -;; key1: value1) - -(assert (= (length (first a)) 2)) -(assert (= (ds::alist::get a 'key1) 'value1)) -(assert (= (ds::alist::get a 'key2) 'value2)) - - -;; ------------- -;; -;; PLISTS -;; -;; ------------- - -(define p (ds::plist::make)) -;; p == (()) - -(assert (= (first p) ())) - -(ds::plist::set! p :key1 'value1) -;; p == ((:key1 value1)) - -(assert (= (ds::plist::get p :key1) 'value1)) -(assert (ds::plist::prop-exists? p :key1)) -(assert (not (ds::plist::prop-exists? p :key2))) - -(ds::plist::set! p :key2 'value2) -;; p == ((:key2 value2, -;; :key1 value1)) - -(assert (= (ds::plist::get p :key2) 'value2)) -(assert (ds::plist::prop-exists? p :key2)) -(assert (= (ds::plist::find p :key2) 0)) -(assert (= (ds::plist::find p :key1) 1)) -(assert (= (length (first p)) 4)) - -(ds::plist::set! p :key1 'value3) -;; p == ((:key1 value3, -;; :key2 value2, -;; :key1 value1)) - -(assert (= (length (first p)) 6)) -(assert (= (ds::plist::get p :key1) 'value3)) - -(ds::plist::set-overwrite! p :key1 'value4) -;; p == ((:key1 value4, -;; :key2 value2, -;; :key1 value1)) - -;; (assert (= (length (first p)) 6)) -;; (assert (= (ds::plist::get p :key1) 'value4)) - -;; (ds::plist::remove! p :key1) -;; ;; p == ((:key2 value2, -;; ;; :key1 value1)) - -;; (assert (= (length (first p)) 4)) -;; (assert (= (ds::plist::get p :key1) 'value1)) -;; (assert (= (ds::plist::get p :key2) 'value2)) +(import "alist.slime") + +(define a (ds::alist::make)) +;; a == (()) + +(assert (= (first a) ())) + +(ds::alist::set! a 'key1 'value1) +;; a == (key1: value1) + +(assert (= (ds::alist::get a 'key1) 'value1)) +(assert (ds::alist::key-exists? a 'key1)) +(assert (not (ds::alist::key-exists? a 'key2))) + +(ds::alist::set! a 'key2 'value2) +;; a == (key2: value2, +;; key1: value1) + +(assert (= (ds::alist::get a 'key2) 'value2)) +(assert (ds::alist::key-exists? a 'key2)) +(assert (= (ds::alist::find a 'key2) 0)) +(assert (= (ds::alist::find a 'key1) 1)) +(assert (= (length (first a)) 2)) + + +(ds::alist::set! a 'key1 'value3) +;; a == (key1: value3, +;; key2: value2, +;; key1: value1) + +(assert (= (length (first a)) 3)) +(assert (= (ds::alist::get a 'key1) 'value3)) + +(ds::alist::set-overwrite! a 'key1 'value4) +;; a == (key1: value4, +;; key2: value2, +;; key1: value1) + +(assert (= (length (first a)) 3)) +(assert (= (ds::alist::get a 'key1) 'value4)) + +(ds::alist::remove! a 'key1) +;; a == (key2: value2, +;; key1: value1) + +(assert (= (length (first a)) 2)) +(assert (= (ds::alist::get a 'key1) 'value1)) +(assert (= (ds::alist::get a 'key2) 'value2)) + + +;; ------------- +;; +;; PLISTS +;; +;; ------------- + +(define p (ds::plist::make)) +;; p == (()) + +(assert (= (first p) ())) + +(ds::plist::set! p :key1 'value1) +;; p == ((:key1 value1)) + +(assert (= (ds::plist::get p :key1) 'value1)) +(assert (ds::plist::prop-exists? p :key1)) +(assert (not (ds::plist::prop-exists? p :key2))) + +(ds::plist::set! p :key2 'value2) +;; p == ((:key2 value2, +;; :key1 value1)) + +(assert (= (ds::plist::get p :key2) 'value2)) +(assert (ds::plist::prop-exists? p :key2)) +(assert (= (ds::plist::find p :key2) 0)) +(assert (= (ds::plist::find p :key1) 1)) +(assert (= (length (first p)) 4)) + +(ds::plist::set! p :key1 'value3) +;; p == ((:key1 value3, +;; :key2 value2, +;; :key1 value1)) + +(assert (= (length (first p)) 6)) +(assert (= (ds::plist::get p :key1) 'value3)) + +(ds::plist::set-overwrite! p :key1 'value4) +;; p == ((:key1 value4, +;; :key2 value2, +;; :key1 value1)) + +;; (assert (= (length (first p)) 6)) +;; (assert (= (ds::plist::get p :key1) 'value4)) + +;; (ds::plist::remove! p :key1) +;; ;; p == ((:key2 value2, +;; ;; :key1 value1)) + +;; (assert (= (length (first p)) 4)) +;; (assert (= (ds::plist::get p :key1) 'value1)) +;; (assert (= (ds::plist::get p :key2) 'value2)) diff --git a/bin/tests/class_macro.slime.expanded b/bin/tests/class_macro.slime.expanded index 976cb0b..c30a550 100644 --- a/bin/tests/class_macro.slime.expanded +++ b/bin/tests/class_macro.slime.expanded @@ -1,14 +1,14 @@ -(import "oo.slime") - -(define-class (vector3 x y z) (define (set-x new-x) (mutate x new-x)) (define (set-y new-y) (mutate y new-y)) (define (set-z new-z) (mutate z new-z)) (define (length) (** (+ (* x x) (* y y) (* z z)) 0.500000)) (define (scale fac) (mutate x (* fac x)) (mutate y (* fac y)) (mutate z (* fac z)) fac) (define (add other) (make-vector3 (+ (-> other x) x) (+ (-> other y) y) (+ (-> other z) z))) (define (subtract other) (make-vector3 (- (-> other x) x) (- (-> other y) y) (- (-> other z) z))) (define (equal? other) (and (= (-> other x) x) (= (-> other y) y) (= (-> other z) z))) (define (scalar-product other) (+ (* (-> other x) x) (* (-> other y) y) (* (-> other z) z))) (define (cross-product other) (make-vector3 (- (* (-> other z) y) (* (-> other y) z)) (- (* (-> other x) z) (* (-> other z) x)) (- (* (-> other y) x) (* (-> other x) y)))) (define (print) (printf :sep " " "[vector3] (" x y z ")"))) - -(define v1 (make-vector3 1 2 3)) - -(define v2 (make-vector3 3 2 1)) - -(assert (= (type v1) (type v2) :vector3)) - -(assert (= (v1 'scalar-product v2) 10)) - -(assert (-> (-> v1 cross-product v2) equal? (make-vector3 -4 8 -4))) - +(import "oo.slime") + +(define-class (vector3 x y z) (define (set-x new-x) (mutate x new-x)) (define (set-y new-y) (mutate y new-y)) (define (set-z new-z) (mutate z new-z)) (define (length) (** (+ (* x x) (* y y) (* z z)) 0.500000)) (define (scale fac) (mutate x (* fac x)) (mutate y (* fac y)) (mutate z (* fac z)) fac) (define (add other) (make-vector3 (+ (-> other x) x) (+ (-> other y) y) (+ (-> other z) z))) (define (subtract other) (make-vector3 (- (-> other x) x) (- (-> other y) y) (- (-> other z) z))) (define (equal? other) (and (= (-> other x) x) (= (-> other y) y) (= (-> other z) z))) (define (scalar-product other) (+ (* (-> other x) x) (* (-> other y) y) (* (-> other z) z))) (define (cross-product other) (make-vector3 (- (* (-> other z) y) (* (-> other y) z)) (- (* (-> other x) z) (* (-> other z) x)) (- (* (-> other y) x) (* (-> other x) y)))) (define (print) (printf :sep " " "[vector3] (" x y z ")"))) + +(define v1 (make-vector3 1 2 3)) + +(define v2 (make-vector3 3 2 1)) + +(assert (= (type v1) (type v2) :vector3)) + +(assert (= (v1 'scalar-product v2) 10)) + +(assert (-> (-> v1 cross-product v2) equal? (make-vector3 -4 8 -4))) + diff --git a/bin/tests/evaluation_of_default_args.slime b/bin/tests/evaluation_of_default_args.slime index 79e6a5f..0167258 100644 --- a/bin/tests/evaluation_of_default_args.slime +++ b/bin/tests/evaluation_of_default_args.slime @@ -1,15 +1,15 @@ -((lambda ((:k1 (+ 1 2 3))) - (assert (= k1 6)))) - -((lambda ((:k1 ())) - (when k1 - (assert ())) - (assert (= k1 ())))) - -(define (test) - ((lambda () - (define (a) - :ok) - (define (b (:k (begin (break) (a)))) - k) - (b)))) +((lambda ((:k1 (+ 1 2 3))) + (assert (= k1 6)))) + +((lambda ((:k1 ())) + (when k1 + (assert ())) + (assert (= k1 ())))) + +(define (test) + ((lambda () + (define (a) + :ok) + (define (b (:k (begin (break) (a)))) + k) + (b)))) diff --git a/bin/tests/hashmaps.slime b/bin/tests/hashmaps.slime index e548c5f..4cd9b6f 100644 --- a/bin/tests/hashmaps.slime +++ b/bin/tests/hashmaps.slime @@ -1,25 +1,25 @@ - -(define hm1 (hash-map)) - -(hm/set! hm1 1 "a") -(hm/set! hm1 "a" (lambda (x) (+ x 1))) - -(assert (= ((hm/get hm1 (hm/get hm1 1)) 2) 3)) - -(define hm2 (hash-map)) -(hm/set! hm2 'yes :yes) -(hm/set! hm2 :yes 'yes) - -(assert (= (hm/get hm2 'yes) :yes)) -(assert (= (hm/get hm2 :yes) 'yes)) -(assert (= (hm/get hm2 (hm/get hm2 'yes)) 'yes)) -(assert (= (hm/get hm2 (hm/get hm2 :yes)) :yes)) -(assert (= (hm/get hm2 (hm/get hm2 (hm/get hm2 'yes))) :yes)) -(assert (= (hm/get hm2 (hm/get hm2 (hm/get hm2 :yes))) 'yes)) - -(define hm3 (hash-map)) -(hm/set! hm3 + 'plus) -(hm/set! hm3 - 'minus) - -(assert (= (hm/get hm3 +) 'plus)) -(assert (= (hm/get hm3 -) 'minus)) + +(define hm1 (hash-map)) + +(hm/set! hm1 1 "a") +(hm/set! hm1 "a" (lambda (x) (+ x 1))) + +(assert (= ((hm/get hm1 (hm/get hm1 1)) 2) 3)) + +(define hm2 (hash-map)) +(hm/set! hm2 'yes :yes) +(hm/set! hm2 :yes 'yes) + +(assert (= (hm/get hm2 'yes) :yes)) +(assert (= (hm/get hm2 :yes) 'yes)) +(assert (= (hm/get hm2 (hm/get hm2 'yes)) 'yes)) +(assert (= (hm/get hm2 (hm/get hm2 :yes)) :yes)) +(assert (= (hm/get hm2 (hm/get hm2 (hm/get hm2 'yes))) :yes)) +(assert (= (hm/get hm2 (hm/get hm2 (hm/get hm2 :yes))) 'yes)) + +(define hm3 (hash-map)) +(hm/set! hm3 + 'plus) +(hm/set! hm3 - 'minus) + +(assert (= (hm/get hm3 +) 'plus)) +(assert (= (hm/get hm3 -) 'minus)) diff --git a/bin/tests/import1.slime b/bin/tests/import1.slime index 3f94e47..a05459c 100644 --- a/bin/tests/import1.slime +++ b/bin/tests/import1.slime @@ -1,3 +1,3 @@ -(define a 1111) - -(define (get-a-1) a) +(define a 1111) + +(define (get-a-1) a) diff --git a/bin/tests/import2.slime b/bin/tests/import2.slime index 7d43276..31e00d1 100644 --- a/bin/tests/import2.slime +++ b/bin/tests/import2.slime @@ -1,7 +1,7 @@ -(import "tests/import1.slime") - - -(define (set-a-2 s) - (set! a s)) - -(define (get-a-2) a) +(import "tests/import1.slime") + + +(define (set-a-2 s) + (set! a s)) + +(define (get-a-2) a) diff --git a/bin/tests/lexical_scope.slime b/bin/tests/lexical_scope.slime index c7e7057..06e6150 100644 --- a/bin/tests/lexical_scope.slime +++ b/bin/tests/lexical_scope.slime @@ -1,59 +1,59 @@ -;; regular arguments - -(define (make-counter) - (let ((var 0)) - (lambda () - (set! var (+ 1 var))))) - -(define counter1 (make-counter)) - -(assert (= (counter1) 1)) - -(define counter2 (make-counter)) - -(assert (= (counter2) 1)) - -(assert (= (counter2) 2)) -(assert (= (counter1) 2)) -(assert (= (counter1) 3)) -(assert (= (counter2) 3)) -(assert (= (counter2) 4)) -(assert (= (counter2) 5)) -(assert (= (counter1) 4)) -(assert (= (counter1) 5)) - -(define (g) - (define x 0) - (lambda () - (define temp x) - (mutate x (+ x 1)) - temp)) - -;; key arguments - -(define (make-key-counter) - ((lambda (:var) - (lambda () - (mutate var (+ 1 var)) - var)) - :var 0)) - - -(define key-counter1 (make-key-counter)) - -(assert (= (key-counter1) 1)) - -(define key-counter2 (make-key-counter)) - -(assert (= (key-counter2) 1)) - -(assert (= (key-counter2) 2)) -(assert (= (key-counter1) 2)) -(assert (= (key-counter1) 3)) -(assert (= (key-counter2) 3)) -(assert (= (key-counter2) 4)) -(assert (= (key-counter2) 5)) -(assert (= (key-counter1) 4)) -(assert (= (key-counter1) 5)) - -;; rest arguments will no be copied so we don't need to test them here +;; regular arguments + +(define (make-counter) + (let ((var 0)) + (lambda () + (set! var (+ 1 var))))) + +(define counter1 (make-counter)) + +(assert (= (counter1) 1)) + +(define counter2 (make-counter)) + +(assert (= (counter2) 1)) + +(assert (= (counter2) 2)) +(assert (= (counter1) 2)) +(assert (= (counter1) 3)) +(assert (= (counter2) 3)) +(assert (= (counter2) 4)) +(assert (= (counter2) 5)) +(assert (= (counter1) 4)) +(assert (= (counter1) 5)) + +(define (g) + (define x 0) + (lambda () + (define temp x) + (mutate x (+ x 1)) + temp)) + +;; key arguments + +(define (make-key-counter) + ((lambda (:var) + (lambda () + (mutate var (+ 1 var)) + var)) + :var 0)) + + +(define key-counter1 (make-key-counter)) + +(assert (= (key-counter1) 1)) + +(define key-counter2 (make-key-counter)) + +(assert (= (key-counter2) 1)) + +(assert (= (key-counter2) 2)) +(assert (= (key-counter1) 2)) +(assert (= (key-counter1) 3)) +(assert (= (key-counter2) 3)) +(assert (= (key-counter2) 4)) +(assert (= (key-counter2) 5)) +(assert (= (key-counter1) 4)) +(assert (= (key-counter1) 5)) + +;; rest arguments will no be copied so we don't need to test them here diff --git a/bin/tests/lexical_scope.slime.expanded b/bin/tests/lexical_scope.slime.expanded index 2ffa5b3..323b64a 100644 --- a/bin/tests/lexical_scope.slime.expanded +++ b/bin/tests/lexical_scope.slime.expanded @@ -1,54 +1,54 @@ -(define (make-counter) (let ((var 0)) (lambda () (set! var (+ 1 var))))) - -(define counter1 (make-counter)) - -(assert (= (counter1) 1)) - -(define counter2 (make-counter)) - -(assert (= (counter2) 1)) - -(assert (= (counter2) 2)) - -(assert (= (counter1) 2)) - -(assert (= (counter1) 3)) - -(assert (= (counter2) 3)) - -(assert (= (counter2) 4)) - -(assert (= (counter2) 5)) - -(assert (= (counter1) 4)) - -(assert (= (counter1) 5)) - -(define (g) (define x 0) (lambda () (define temp x) (mutate x (+ x 1)) temp)) - -(define (make-key-counter) ((lambda (:var) (lambda () (mutate var (+ 1 var)) var)) :var 0)) - -(define key-counter1 (make-key-counter)) - -(assert (= (key-counter1) 1)) - -(define key-counter2 (make-key-counter)) - -(assert (= (key-counter2) 1)) - -(assert (= (key-counter2) 2)) - -(assert (= (key-counter1) 2)) - -(assert (= (key-counter1) 3)) - -(assert (= (key-counter2) 3)) - -(assert (= (key-counter2) 4)) - -(assert (= (key-counter2) 5)) - -(assert (= (key-counter1) 4)) - -(assert (= (key-counter1) 5)) - +(define (make-counter) (let ((var 0)) (lambda () (set! var (+ 1 var))))) + +(define counter1 (make-counter)) + +(assert (= (counter1) 1)) + +(define counter2 (make-counter)) + +(assert (= (counter2) 1)) + +(assert (= (counter2) 2)) + +(assert (= (counter1) 2)) + +(assert (= (counter1) 3)) + +(assert (= (counter2) 3)) + +(assert (= (counter2) 4)) + +(assert (= (counter2) 5)) + +(assert (= (counter1) 4)) + +(assert (= (counter1) 5)) + +(define (g) (define x 0) (lambda () (define temp x) (mutate x (+ x 1)) temp)) + +(define (make-key-counter) ((lambda (:var) (lambda () (mutate var (+ 1 var)) var)) :var 0)) + +(define key-counter1 (make-key-counter)) + +(assert (= (key-counter1) 1)) + +(define key-counter2 (make-key-counter)) + +(assert (= (key-counter2) 1)) + +(assert (= (key-counter2) 2)) + +(assert (= (key-counter1) 2)) + +(assert (= (key-counter1) 3)) + +(assert (= (key-counter2) 3)) + +(assert (= (key-counter2) 4)) + +(assert (= (key-counter2) 5)) + +(assert (= (key-counter1) 4)) + +(assert (= (key-counter1) 5)) + diff --git a/bin/tests/modules.slime b/bin/tests/modules.slime index 0e6b126..423b189 100644 --- a/bin/tests/modules.slime +++ b/bin/tests/modules.slime @@ -1,13 +1,22 @@ -;; (define-module math -;; :exports -;; (pi tau pow sqrt) - -;; (define pi 3.1415) -;; (define tau (* 2 pi)) -;; (define (pow a b) (** a b)) -;; (define (sqrt a) (** a 0.5))) - -;; (assert (= math::pi 3.1415)) -;; (assert (= math::tau (* 2 math::tau))) - -(1 2 3) +;; (define-module math +;; :exports +;; (pi tau pow sqrt) + +;; (define pi 3.1415) +;; (define tau (* 2 pi)) +;; (define (pow a b) (** a b)) +;; (define (sqrt a) (** a 0.5))) + +;; (assert (= math::pi 3.1415)) +;; (assert (= math::tau (* 2 math::tau))) + + +(tdefine-module 'math + :exports + '(pi tau pow sqrt) + + '(define pi 3.1415) + '(define tau (* 2 pi)) + '(define (pow a b) (** a b)) + '(define (sqrt a) (** a 0.5))) + diff --git a/bin/tests/sicp.slime b/bin/tests/sicp.slime index 7321c0c..ae74f04 100644 --- a/bin/tests/sicp.slime +++ b/bin/tests/sicp.slime @@ -1,340 +1,348 @@ -;; (define (abs x) -;; (cond ((< x 0) (- x)) -;; (else x))) - -;; (assert (= (abs 1) 1)) -;; (assert (= (abs (- 2)) 2)) - - -(define (abs x) - (if (< x 0) - (- x) - x)) - -;; (assert (= (abs 12) 12)) -;; (assert (= (abs (- 32)) 32)) - - -;; (define (>= x y) -;; (or (> x y) -;; (= x y))) - -;; (assert (>= 2 2)) -;; (assert (>= 3 2)) -;; (assert (not (>= 1 2))) -;; (assert (not (>= 12 44))) - - -;; (define (>= x y) -;; (not (< x y))) - -;; (assert (>= 2 2)) -;; (assert (>= 3 2)) -;; (assert (not (>= 1 2))) -;; (assert (not (>= 12 44))) - - -;; (define (a-plus-abs-b a b) -;; ((if (> b 0) + -) a b)) - -;; (assert (= (a-plus-abs-b 1 2) 3)) -;; (assert (= (a-plus-abs-b 1 -2) 3)) - -(define (square x) (* x x)) -(define (cube x) (* x x x)) - -;; (assert (= ((lambda (x y z) -;; (+ x y (square z))) -;; 1 2 3) -;; 12)) - -;; ;;; -------------------- -;; ;;; newtons method -;; ;;; -------------------- - -;; (define tolerance 0.001) - -;; (define (square x) -;; (* x x)) - -(define (average x y) - (/ (+ x y) 2)) - -;; (define (improve guess x) -;; (average guess (/ x guess))) - -;; (define (good-enough? guess x) -;; (< (abs (- (square guess) x)) tolerance)) - -;; (define (sqrt-iter guess x) -;; (if (good-enough? guess x) -;; guess -;; (sqrt-iter (improve guess x) x))) - -;; (define (sqrt x) -;; (sqrt-iter 1.0 x)) - -;; (define (sqrt2 x) -;; (define (good-enough? guess x) -;; (< (abs (- (square guess) x)) 0.001)) - -;; (define (improve guess x) -;; (average guess (/ x guess))) - -;; (define (sqrt-iter guess x) -;; (if (good-enough? guess x) -;; guess -;; (sqrt-iter (improve guess x) x))) - -;; (sqrt-iter 1.0 x)) - -;; (define (sqrt3 x) -;; (define (good-enough? guess) -;; (< (abs (- (square guess) x)) 0.001)) - -;; (define (improve guess) -;; (average guess (/ x guess))) - -;; (define (sqrt-iter guess) -;; (if (good-enough? guess) -;; guess -;; (sqrt-iter (improve guess)))) - -;; (sqrt-iter 1.0)) - -;; (assert (< (abs (- 3 (sqrt 9))) tolerance)) -;; (assert (< (abs (- 4 (sqrt 16))) tolerance)) -;; (assert (not (< (abs (- 4 (sqrt 15))) tolerance))) - -;; (assert (< (abs (- 3 (sqrt2 9))) tolerance)) -;; (assert (< (abs (- 4 (sqrt2 16))) tolerance)) -;; (assert (not (< (abs (- 4 (sqrt2 15))) tolerance))) - -;; (assert (< (abs (- 3 (sqrt3 9))) tolerance)) -;; (assert (< (abs (- 4 (sqrt3 16))) tolerance)) -;; (assert (not (< (abs (- 4 (sqrt3 15))) tolerance))) - - -;; ;;; ----------------- -;; ;;; factorial -;; ;;; ----------------- - -(define (factorial n) - (if (= n 1) - 1 - (* n (factorial (- n 1))))) - -(define (factorial2 n) - (fact-iter 1 1 n)) - -(define (fact-iter product counter max-count) - (if (> counter max-count) - product - (fact-iter (* counter product) (+ counter 1) max-count))) - -(define (factorial3 n) - (define (iter product counter) - (if (> counter n) - product - (iter (* counter product) (+ counter 1)))) - - (iter 1 1)) - -(assert (= (factorial 6) 720)) -(assert (= (factorial2 6) 720)) -(assert (= (factorial3 6) 720)) - -;;; ---------------- -;;; ackermann -;;; ---------------- - -(define (A m n) - (cond ((= m 0) (+ n 1)) - ((= n 0) (A (- m 1) 1)) - (else (A (- m 1) (A m (- n 1)))))) - -(assert (= (A 0 0) 1)) -(assert (= (A 1 2) 4)) -(assert (= (A 3 1) 13)) - - -;; ;;; --------------- -;; ;;; Fibonacci -;; ;;; --------------- - -;; (define (fib n) -;; (cond ((= n 0) 0) -;; ((= n 1) 1) -;; (else (+ (fib (- n 1)) (fib (- n 2)))))) - -;; (define (fib2 n) -;; (fib-iter 1 0 n)) - -;; (define (fib-iter a b count) -;; (if (= count 0) -;; b -;; (fib-iter (+ a b) a (- count 1)))) - -;; (assert (= (fib 2) 1)) -;; (assert (= (fib 3) 2)) -;; (assert (= (fib 4) 3)) -;; (assert (= (fib 5) 5)) -;; (assert (= (fib 6) 8)) - -;; (assert (= (fib2 2) 1)) -;; (assert (= (fib2 3) 2)) -;; (assert (= (fib2 4) 3)) -;; (assert (= (fib2 5) 5)) -;; (assert (= (fib2 6) 8)) - -;; ;;; ------------------ -;; ;;; count change -;; ;;; ------------------ - -;; (define (count-change amount) -;; (define (cc amount kinds-of-coins) -;; (cond ((= amount 0) 1) -;; ((or (< amount 0) (= kinds-of-coins 0)) 0) -;; (else (+ (cc amount (- kinds-of-coins 1)) -;; (cc (- amount (first-denomination kinds-of-coins)) kinds-of-coins))))) - -;; (define (first-denomination kinds-of-coins) -;; (cond ((= kinds-of-coins 1) 1) -;; ((= kinds-of-coins 2) 5) -;; ((= kinds-of-coins 3) 10) -;; ((= kinds-of-coins 4) 25) -;; ((= kinds-of-coins 5) 50))) - -;; (cc amount 5)) - -;; (assert (= (count-change 100) 292)) - -;; ;;; -------------------- -;; ;;; exponentiation -;; ;;; -------------------- - -;; (define (expt b n) -;; (if (= n 0) -;; 1 -;; (* b (expt b (- n 1))))) - -;; (define (expt2 b n) -;; (define (expt-iter b counter product) -;; (if (= counter 0) -;; product -;; (expt-iter b (- counter 1) (* b product)))) - -;; (expt-iter b n 1)) - -;; (define (fast-expt b n) -;; (define (even? n) -;; (= (% n 2) 0)) - -;; (cond ((= n 0) 1) -;; ((even? n) (square (fast-expt b (/ n 2)))) -;; (else (* b (fast-expt b (- n 1)))))) - -;; (assert (= (expt 1 2) 1)) -;; (assert (= (expt 2 2) 4)) -;; (assert (= (expt 2 3) 8)) - -;; (assert (= (expt2 1 2) 1)) -;; (assert (= (expt2 2 2) 4)) -;; (assert (= (expt2 2 3) 8)) - -;; (assert (= (fast-expt 1 2) 1)) -;; (assert (= (fast-expt 2 2) 4)) -;; (assert (= (fast-expt 2 3) 8)) - -;; ;;; ---------- -;; ;;; gcd -;; ;;; ---------- - -;; (define (gcd a b) -;; (if (= b 0) -;; a -;; (gcd b (% a b)))) - -;; (assert (= (gcd 40 6) 2)) -;; (assert (= (gcd 13 4) 1)) - - -;; ;;; ---------- -;; ;;; primes -;; ;;; ---------- - -;; (define (smallest-divisor n) -;; (find-divisor n 2)) - -;; (define (find-divisor n test-divisor) -;; (cond ((> (square test-divisor) n) n) -;; ((divides? test-divisor n) test-divisor) -;; (else (find-divisor n (+ test-divisor 1))))) - -;; (define (divides? a b) -;; (= (% b a) 0)) - -;; (define (prime? n) -;; (= n (smallest-divisor n))) - -;; (assert (prime? 13)) -;; (assert (prime? 11)) -;; (assert (not (prime? 12))) - - -;;; ---------------------- -;;; simple integral -;;; ---------------------- - -;; (define (sum term a next b) -;; (if (> a b) -;; 0 -;; (+ (term a) (sum term (next a) next b)))) - -;; (define (integral f a b dx) -;; (define (add-dx x) (+ x dx)) -;; (* (sum f (+ a (/ dx 2.0)) add-dx b) dx)) - -;; (define (pi-sum a b) -;; (define (pi-term x) (/ 1.0 (* x (+ x 2)))) -;; (define (pi-next x) (+ x 4)) -;; (sum pi-term a pi-next b)) - -;; (assert (< (abs (- (* 8 (pi-sum 1 100)) 3.121595)) 0.0001)) -;; (assert (< (abs (- (integral cube 0 1 0.02) 0.249950)) 0.0001)) - - -;; ------------------------------------------------------------ -;; F(x,y) = x(1 + xy)^2 + y(1 โˆ’ y) + (1 + xy)(1 โˆ’ y) -;; ------------------------------------------------------------ - -;; (define (f x y) -;; (let ((a (+ 1 (* x y))) -;; (b (- 1 y))) -;; (+ (* x (square a)) -;; (* y b) -;; (* a b)))) - -;; (assert (= (f 0 0) 1)) -;; (assert (= (f 1 1) 4)) - - -;; ;;; --------------- -;; ;;; find zero -;; ;;; --------------- - -;; (define (positive? x) (< 0 x)) -;; (define (negative? x) (< x 0)) - -;; (define (search f neg-point pos-point) -;; (let ((midpoint (average neg-point pos-point))) -;; (if (close-enough? neg-point pos-point) -;; midpoint -;; (let ((test-value (f midpoint))) -;; (cond ((positive? test-value) (search f neg-point midpoint)) -;; ((negative? test-value) (search f midpoint pos-point)) -;; (else midpoint)))))) - -;; (define (close-enough? x y) (< (abs (- x y)) 0.001)) - -;; (assert (close-enough? (search (lambda (x) (- 1 (square x))) -3 3) -1)) + +;; (define (abs x) +;; (cond ((< x 0) (- x)) +;; (else x))) + +;; (assert (= (abs 1) 1)) +;; (assert (= (abs (- 2)) 2)) + + +;; (define (abs x) + ;; (if (< x 0) + ;; (- x) + ;; x)) + +;; (assert (= (abs 12) 12)) +;; (assert (= (abs (- 32)) 32)) + + +;; (define (>= x y) +;; (or (> x y) +;; (= x y))) + +;; (assert (>= 2 2)) +;; (assert (>= 3 2)) +;; (assert (not (>= 1 2))) +;; (assert (not (>= 12 44))) + + +;; (define (>= x y) +;; (not (< x y))) + +;; (assert (>= 2 2)) +;; (assert (>= 3 2)) +;; (assert (not (>= 1 2))) +;; (assert (not (>= 12 44))) + + +;; (define (a-plus-abs-b a b) +;; ((if (> b 0) + -) a b)) + +;; (assert (= (a-plus-abs-b 1 2) 3)) +;; (assert (= (a-plus-abs-b 1 -2) 3)) + +;; (define (square x) (* x x)) +;; (define (cube x) (* x x x)) + +;; (assert (= ((lambda (x y z) +;; (+ x y (square z))) +;; 1 2 3) +;; 12)) + +;; ;;; -------------------- +;; ;;; newtons method +;; ;;; -------------------- + +;; (define tolerance 0.001) + +;; (define (square x) +;; (* x x)) + +;; (define (average x y) + ;; (/ (+ x y) 2)) + +;; (define (improve guess x) +;; (average guess (/ x guess))) + +;; (define (good-enough? guess x) +;; (< (abs (- (square guess) x)) tolerance)) + +;; (define (sqrt-iter guess x) +;; (if (good-enough? guess x) +;; guess +;; (sqrt-iter (improve guess x) x))) + +;; (define (sqrt x) +;; (sqrt-iter 1.0 x)) + +;; (define (sqrt2 x) +;; (define (good-enough? guess x) +;; (< (abs (- (square guess) x)) 0.001)) + +;; (define (improve guess x) +;; (average guess (/ x guess))) + +;; (define (sqrt-iter guess x) +;; (if (good-enough? guess x) +;; guess +;; (sqrt-iter (improve guess x) x))) + +;; (sqrt-iter 1.0 x)) + +;; (define (sqrt3 x) +;; (define (good-enough? guess) +;; (< (abs (- (square guess) x)) 0.001)) + +;; (define (improve guess) +;; (average guess (/ x guess))) + +;; (define (sqrt-iter guess) +;; (if (good-enough? guess) +;; guess +;; (sqrt-iter (improve guess)))) + +;; (sqrt-iter 1.0)) + +;; (assert (< (abs (- 3 (sqrt 9))) tolerance)) +;; (assert (< (abs (- 4 (sqrt 16))) tolerance)) +;; (assert (not (< (abs (- 4 (sqrt 15))) tolerance))) + +;; (assert (< (abs (- 3 (sqrt2 9))) tolerance)) +;; (assert (< (abs (- 4 (sqrt2 16))) tolerance)) +;; (assert (not (< (abs (- 4 (sqrt2 15))) tolerance))) + +;; (assert (< (abs (- 3 (sqrt3 9))) tolerance)) +;; (assert (< (abs (- 4 (sqrt3 16))) tolerance)) +;; (assert (not (< (abs (- 4 (sqrt3 15))) tolerance))) + + +;; ;;; ----------------- +;; ;;; factorial +;; ;;; ----------------- + +;; (define (factorial n) +;; (if (= n 1) +;; 1 +;; (* n (factorial (- n 1))))) + +;; (define (factorial2 n) +;; (fact-iter 1 1 n)) + +;; (define (fact-iter product counter max-count) +;; (if (> counter max-count) +;; product +;; (fact-iter (* counter product) (+ counter 1) max-count))) + +;; (define (factorial3 n) +;; (define (iter product counter) +;; (if (> counter n) +;; product +;; (iter (* counter product) (+ counter 1)))) + +;; (iter 1 1)) + +;; (assert (= (factorial 6) 720)) +;; (assert (= (factorial2 6) 720)) +;; (assert (= (factorial3 6) 720)) + +;;; ---------------- +;;; ackermann +;;; ---------------- + +(define (A m n) + (cond ((= m 0) (+ n 1)) + ((= n 0) (A (- m 1) 1)) + (else (A (- m 1) (A m (- n 1)))))) + +;; (define (A m n) + ;; (if (= m 0) + ;; (+ n 1) + ;; (if (= n 0) + ;; (A (- m 1) 1) + ;; (A (- m 1) (A m (- n 1)))))) + +(assert (= (A 0 0) 1)) +(assert (= (A 1 2) 4)) +(assert (= (A 3 1) 13)) + + +;; ;;; --------------- +;; ;;; Fibonacci +;; ;;; --------------- + +;; (define (fib n) +;; (cond ((= n 0) 0) +;; ((= n 1) 1) +;; (else (+ (fib (- n 1)) (fib (- n 2)))))) + +;; (define (fib2 n) +;; (fib-iter 1 0 n)) + +;; (define (fib-iter a b count) +;; (if (= count 0) +;; b +;; (fib-iter (+ a b) a (- count 1)))) + +;; (assert (= (fib 2) 1)) +;; (assert (= (fib 3) 2)) +;; (assert (= (fib 4) 3)) +;; (assert (= (fib 5) 5)) +;; (assert (= (fib 6) 8)) + +;; (assert (= (fib2 2) 1)) +;; (assert (= (fib2 3) 2)) +;; (assert (= (fib2 4) 3)) +;; (assert (= (fib2 5) 5)) +;; (assert (= (fib2 6) 8)) + +;; ;;; ------------------ +;; ;;; count change +;; ;;; ------------------ + +;; (define (count-change amount) +;; (define (cc amount kinds-of-coins) +;; (cond ((= amount 0) 1) +;; ((or (< amount 0) (= kinds-of-coins 0)) 0) +;; (else (+ (cc amount (- kinds-of-coins 1)) +;; (cc (- amount (first-denomination kinds-of-coins)) kinds-of-coins))))) + +;; (define (first-denomination kinds-of-coins) +;; (cond ((= kinds-of-coins 1) 1) +;; ((= kinds-of-coins 2) 5) +;; ((= kinds-of-coins 3) 10) +;; ((= kinds-of-coins 4) 25) +;; ((= kinds-of-coins 5) 50))) + +;; (cc amount 5)) + +;; (assert (= (count-change 100) 292)) + +;; ;;; -------------------- +;; ;;; exponentiation +;; ;;; -------------------- + +;; (define (expt b n) +;; (if (= n 0) +;; 1 +;; (* b (expt b (- n 1))))) + +;; (define (expt2 b n) +;; (define (expt-iter b counter product) +;; (if (= counter 0) +;; product +;; (expt-iter b (- counter 1) (* b product)))) + +;; (expt-iter b n 1)) + +;; (define (fast-expt b n) +;; (define (even? n) +;; (= (% n 2) 0)) + +;; (cond ((= n 0) 1) +;; ((even? n) (square (fast-expt b (/ n 2)))) +;; (else (* b (fast-expt b (- n 1)))))) + +;; (assert (= (expt 1 2) 1)) +;; (assert (= (expt 2 2) 4)) +;; (assert (= (expt 2 3) 8)) + +;; (assert (= (expt2 1 2) 1)) +;; (assert (= (expt2 2 2) 4)) +;; (assert (= (expt2 2 3) 8)) + +;; (assert (= (fast-expt 1 2) 1)) +;; (assert (= (fast-expt 2 2) 4)) +;; (assert (= (fast-expt 2 3) 8)) + +;; ;;; ---------- +;; ;;; gcd +;; ;;; ---------- + +;; (define (gcd a b) +;; (if (= b 0) +;; a +;; (gcd b (% a b)))) + +;; (assert (= (gcd 40 6) 2)) +;; (assert (= (gcd 13 4) 1)) + + +;; ;;; ---------- +;; ;;; primes +;; ;;; ---------- + +;; (define (smallest-divisor n) +;; (find-divisor n 2)) + +;; (define (find-divisor n test-divisor) +;; (cond ((> (square test-divisor) n) n) +;; ((divides? test-divisor n) test-divisor) +;; (else (find-divisor n (+ test-divisor 1))))) + +;; (define (divides? a b) +;; (= (% b a) 0)) + +;; (define (prime? n) +;; (= n (smallest-divisor n))) + +;; (assert (prime? 13)) +;; (assert (prime? 11)) +;; (assert (not (prime? 12))) + + +;;; ---------------------- +;;; simple integral +;;; ---------------------- + +;; (define (sum term a next b) +;; (if (> a b) +;; 0 +;; (+ (term a) (sum term (next a) next b)))) + +;; (define (integral f a b dx) +;; (define (add-dx x) (+ x dx)) +;; (* (sum f (+ a (/ dx 2.0)) add-dx b) dx)) + +;; (define (pi-sum a b) +;; (define (pi-term x) (/ 1.0 (* x (+ x 2)))) +;; (define (pi-next x) (+ x 4)) +;; (sum pi-term a pi-next b)) + +;; (assert (< (abs (- (* 8 (pi-sum 1 100)) 3.121595)) 0.0001)) +;; (assert (< (abs (- (integral cube 0 1 0.02) 0.249950)) 0.0001)) + + +;; ------------------------------------------------------------ +;; F(x,y) = x(1 + xy)^2 + y(1 โˆ’ y) + (1 + xy)(1 โˆ’ y) +;; ------------------------------------------------------------ + +;; (define (f x y) +;; (let ((a (+ 1 (* x y))) +;; (b (- 1 y))) +;; (+ (* x (square a)) +;; (* y b) +;; (* a b)))) + +;; (assert (= (f 0 0) 1)) +;; (assert (= (f 1 1) 4)) + + +;; ;;; --------------- +;; ;;; find zero +;; ;;; --------------- + +;; (define (positive? x) (< 0 x)) +;; (define (negative? x) (< x 0)) + +;; (define (search f neg-point pos-point) +;; (let ((midpoint (average neg-point pos-point))) +;; (if (close-enough? neg-point pos-point) +;; midpoint +;; (let ((test-value (f midpoint))) +;; (cond ((positive? test-value) (search f neg-point midpoint)) +;; ((negative? test-value) (search f midpoint pos-point)) +;; (else midpoint)))))) + +;; (define (close-enough? x y) (< (abs (- x y)) 0.001)) + +;; (assert (close-enough? (search (lambda (x) (- 1 (square x))) -3 3) -1)) diff --git a/bin/tests/simple_built_ins.slime b/bin/tests/simple_built_ins.slime new file mode 100644 index 0000000..b0ebc07 --- /dev/null +++ b/bin/tests/simple_built_ins.slime @@ -0,0 +1,58 @@ +;; +;; let testing +;; +(assert (not (bound? var1))) +(assert (not (bound? var2))) +(assert (not (bound? var3))) +(let ((var1 1) + (var2 [1 2 3]) + (var3 {1 2 3 4})) + (assert (bound? var1)) + (assert (bound? var2)) + (assert (bound? var3)) + (assert (= var1 1)) + (assert (= var2 [1 2 3])) + (assert (= var3 {1 2 3 4}))) + +(assert (not (bound? var1))) +(assert (not (bound? var2))) +(assert (not (bound? var3))) + +(assert (= (let ((val 'sym)) + val) + 'sym)) + +(assert (= (let () + 'sym) + 'sym)) +;; +;; Quasiquote testing +;; +(assert (= '() `())) + +(assert (= '(1 1 2) + `(1 1 2))) + +(assert (= '(1 1 2) + `(1 ,1 2))) + +(assert (= '(1 1 2) + `(1 ,(- 10 9) 2))) + +(assert (= '(1 1 2) + `(1 ,@(list 1 2)))) + +(let ((body '(2 3))) + (assert (= '(1 2 3) + `(1 ,@body)))) + +(let ((body '((define a 1) + (define b 2))) + (imports '())) + (let ((expr `(begin ,@(map (lambda (x) `(import ,x)) imports) ,@body))) + (assert (= '(begin + (define a 1) + (define b 2)))) + (eval expr) + (assert (= a 1)) + (assert (= b 2)))) diff --git a/bin/tests/singular_imports.slime b/bin/tests/singular_imports.slime index ce7935b..9164ad2 100644 --- a/bin/tests/singular_imports.slime +++ b/bin/tests/singular_imports.slime @@ -1,20 +1,20 @@ -(import "tests/import1.slime") - -(assert (= a 1111)) -(assert (= (get-a-1) 1111)) - - -(import "tests/import2.slime") - - -(assert (= a 1111)) -(assert (= (get-a-1) 1111)) -(assert (= (get-a-2) 1111)) - -(set-a-2 11) - -(assert (= a 11)) - -(assert (= (get-a-1) 11)) - -(assert (= (get-a-2) 11)) +(import "tests/import1.slime") + +(assert (= a 1111)) +(assert (= (get-a-1) 1111)) + + +(import "tests/import2.slime") + + +(assert (= a 1111)) +(assert (= (get-a-1) 1111)) +(assert (= (get-a-2) 1111)) + +(set-a-2 11) + +(assert (= a 11)) + +(assert (= (get-a-1) 11)) + +(assert (= (get-a-2) 11)) diff --git a/build.bat b/build.bat index d661a99..c2fd9ee 100644 --- a/build.bat +++ b/build.bat @@ -1,34 +1,34 @@ -@echo off -@setlocal -pushd %~dp0\bin - -set exeName=slime.exe - -taskkill /F /IM %exeName% > NUL 2> NUL - -echo ---------- Compiling ---------- -call cl ^ - ../src/main.cpp^ - /I../3rd/ ^ - /D_PROFILING /D_DEBUG ^ - /Zi /std:c++latest /Fe%exeName% /W3 /wd4003 /nologo /EHsc - -rem call ..\timecmd cl ^ - rem ../src/main.cpp^ - rem /I../3rd/ ^ - rem /O2 /D_DONT_BREAK_ON_ERRORS ^ - rem /std:c++latest /Fe%exeName% /W3 /wd4003 /nologo /EHsc - -rem call ..\timecmd clang-cl ../src/main.cpp -o %exeName% /O2 /std:c++latest /W3 /Zi /EHsc - -rem if %errorlevel% == 0 ( -rem echo. -rem echo ---- Running Tests ---- -rem echo. -rem call slime.exe --run-tests -rem ) else ( -rem echo. -rem echo Fuckin' ell -rem ) - -popd +@echo off +@setlocal +pushd %~dp0\bin + +set exeName=slime.exe + +taskkill /F /IM %exeName% > NUL 2> NUL + +echo ---------- Compiling ---------- +call cl ^ + ../src/main.cpp^ + /I../3rd/ ^ + /D_PROFILING /D_DEBUG ^ + /Zi /std:c++latest /Fe%exeName% /W3 /wd4003 /nologo /EHsc + +rem call ..\timecmd cl ^ + rem ../src/main.cpp^ + rem /I../3rd/ ^ + rem /O2 /D_DONT_BREAK_ON_ERRORS ^ + rem /std:c++latest /Fe%exeName% /W3 /wd4003 /nologo /EHsc + +rem call ..\timecmd clang-cl ../src/main.cpp -o %exeName% /O2 /std:c++latest /W3 /Zi /EHsc + +rem if %errorlevel% == 0 ( +rem echo. +rem echo ---- Running Tests ---- +rem echo. +rem call slime.exe --run-tests +rem ) else ( +rem echo. +rem echo Fuckin' ell +rem ) + +popd diff --git a/build.sh b/build.sh index 5cab007..b655e33 100644 --- a/build.sh +++ b/build.sh @@ -2,13 +2,13 @@ TIMEFORMAT=%3lU SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" pushd $SCRIPTPATH > /dev/null -echo "" -echo "----------------------" -echo " compiling libslime " -echo "----------------------" -time clang++ --std=c++17 \ - src/libslime.cpp -c -o libslime.o \ - -I3rd/ || exit 1 +# echo "" +# echo "----------------------" +# echo " compiling libslime " +# echo "----------------------" +# time clang++ --std=c++17 \ +# src/libslime.cpp -c -o libslime.o \ +# -I3rd/ || exit 1 echo "" echo "------------------------------" @@ -18,13 +18,13 @@ time clang++ -D_DEBUG -D_DONT_BREAK_ON_ERRORS \ src/main.cpp -gfull -gdwarf -o ./bin/slime_d --std=c++17 \ -I3rd/ || exit 1 -echo "" -echo "--------------------------------" -echo " compiling fullslime (release) " -echo "--------------------------------" -time clang++ -D_DONT_BREAK_ON_ERRORS -O3 \ - src/main.cpp -g -o ./bin/slime --std=c++17 \ - -I3rd/ || exit 1 +# echo "" +# echo "--------------------------------" +# echo " compiling fullslime (release) " +# echo "--------------------------------" +# time clang++ -D_DONT_BREAK_ON_ERRORS -O3 \ +# src/main.cpp -g -o ./bin/slime --std=c++17 \ +# -I3rd/ || exit 1 pushd ./bin > /dev/null @@ -40,11 +40,11 @@ echo " running tests " echo "----------------------" time valgrind -q --track-origins=yes --leak-check=full --show-leak-kinds=all ./slime_d --run-tests || exit 1 -echo "" -echo "------------------------" -echo " running benches " -echo "------------------------" -hyperfine -s color --warmup 5 "./slime --run-tests > /dev/null" +# echo "" +# echo "------------------------" +# echo " running benches " +# echo "------------------------" +# hyperfine -s color --warmup 5 "./slime --run-tests > /dev/null" popd > /dev/null # popd > /dev/null diff --git a/compile_flags.txt b/compile_flags.txt index 68aa0a0..c9b5a98 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -1,5 +1,5 @@ --std=c++17 --D_DEBUG --D_DONT_BREAK_ON_ERRORS --I3rd/ --include=libslime.cpp +-std=c++17 +-D_DEBUG +-D_DONT_BREAK_ON_ERRORS +-I3rd/ +-include=libslime.cpp diff --git a/include/assert.hpp b/include/assert.hpp index 05b5c78..5d6a148 100644 --- a/include/assert.hpp +++ b/include/assert.hpp @@ -1,54 +1,54 @@ -/** - Usage of the create_error_macros: -*/ -#define __create_error(keyword, ...) \ - create_error( \ - __FUNCTION__, __FILE__, __LINE__, \ - Memory::get_keyword(keyword), \ - __VA_ARGS__) - -#define create_out_of_memory_error(...) \ - __create_error("out-of-memory", __VA_ARGS__) - -#define create_generic_error(...) \ - __create_error("generic", __VA_ARGS__) - -#define create_not_yet_implemented_error() \ - __create_error("not-yet-implemented", "This feature has not yet been implemented.") - -#define create_parsing_error(...) \ - __create_error("parsing-error", __VA_ARGS__) - -#define create_symbol_undefined_error(...) \ - __create_error("symbol-undefined", __VA_ARGS__) - -#define create_type_missmatch_error(expected, actual) \ - __create_error("type-missmatch", \ - "Type missmatch: expected %s, got %s", \ - expected, actual) - -#ifdef _DEBUG - -#define assert_type(_node, _type) \ - do { \ - if (Memory::get_type(_node) != _type) { \ - create_type_missmatch_error( \ - Lisp_Object_Type_to_string(_type), \ - Lisp_Object_Type_to_string(Memory::get_type(_node))); \ - } \ - } while(0) - -#define assert(condition) \ - do { \ - if (!(condition)) { \ - create_generic_error("Assertion-error."); \ - } \ - } while(0) - -#else -# define assert_arguments_length(expected, actual) do {} while (0) -# define assert_arguments_length_less_equal(expected, actual) do {} while (0) -# define assert_arguments_length_greater_equal(expected, actual) do {} while (0) -# define assert_type(_node, _type) do {} while (0) -# define assert(condition) do {} while (0) -#endif +/** + Usage of the create_error_macros: +*/ +#define __create_error(keyword, ...) \ + create_error( \ + __FUNCTION__, __FILE__, __LINE__, \ + Memory::get_keyword(keyword), \ + __VA_ARGS__) + +#define create_out_of_memory_error(...) \ + __create_error("out-of-memory", __VA_ARGS__) + +#define create_generic_error(...) \ + __create_error("generic", __VA_ARGS__) + +#define create_not_yet_implemented_error() \ + __create_error("not-yet-implemented", "This feature has not yet been implemented.") + +#define create_parsing_error(...) \ + __create_error("parsing-error", __VA_ARGS__) + +#define create_symbol_undefined_error(...) \ + __create_error("symbol-undefined", __VA_ARGS__) + +#define create_type_missmatch_error(expected, actual) \ + __create_error("type-missmatch", \ + "Type missmatch: expected %s, got %s", \ + expected, actual) + +#ifdef _DEBUG + +#define assert_type(_node, _type) \ + do { \ + if (Memory::get_type(_node) != _type) { \ + create_type_missmatch_error( \ + Lisp_Object_Type_to_string(_type), \ + Lisp_Object_Type_to_string(Memory::get_type(_node))); \ + } \ + } while(0) + +#define assert(condition) \ + do { \ + if (!(condition)) { \ + create_generic_error("Assertion-error."); \ + } \ + } while(0) + +#else +# define assert_arguments_length(expected, actual) do {} while (0) +# define assert_arguments_length_less_equal(expected, actual) do {} while (0) +# define assert_arguments_length_greater_equal(expected, actual) do {} while (0) +# define assert_type(_node, _type) do {} while (0) +# define assert(condition) do {} while (0) +#endif diff --git a/include/define_macros.hpp b/include/define_macros.hpp index 83ec1c7..9974310 100644 --- a/include/define_macros.hpp +++ b/include/define_macros.hpp @@ -1,154 +1,154 @@ -#define concat_( a, b) a##b -#define label(prefix, lnum) concat_(prefix,lnum) - -#define log_location() \ - do { \ - if (Globals::log_level == Log_Level::Debug) { \ - printf("in"); \ - int spacing = 30-(int)strlen(__FILE__); \ - if (spacing < 1) spacing = 1; \ - for (int i = 0; i < spacing;++i) \ - printf(" "); \ - printf("%s (%d) ", __FILE__, __LINE__); \ - printf("-> %s\n",__FUNCTION__); \ - } \ - } while(0) - -#define if_error_log_location_and_return(val) \ - do { \ - if (Globals::error) { \ - log_location(); \ - return val; \ - } \ - } while(0) - -#ifdef _DEBUG -#define try_or_else_return(val) \ - if (1) \ - goto label(body,__LINE__); \ - else \ - while (1) \ - if (1) { \ - if (Globals::error) { \ - log_location(); \ - return val; \ - } \ - break; \ - } \ - else label(body,__LINE__): - ; -#else -#define try_or_else_return(val) -#endif - -#define try_struct try_or_else_return({}) -#define try_void try_or_else_return() -#define try try_or_else_return(0) - -#define dont_break_on_errors fluid_let(Globals::breaking_on_errors, false) -#define ignore_logging fluid_let(Globals::log_level, Log_Level::None) - -#define fetch1(var) \ - Lisp_Object* var##_symbol = Memory::get_symbol(#var); \ - Lisp_Object* var = lookup_symbol(var##_symbol, get_current_environment()); \ - if (Globals::error) printf("in %s:%d\n", __FILE__, __LINE__) - -#define fetch2(var1, var2) fetch1(var1); fetch1(var2) -#define fetch3(var1, var2, var3) fetch2(var1, var2); fetch1(var3) -#define fetch4(var1, var2, var3, var4) fetch3(var1, var2, var3); fetch1(var4) -#define fetch5(var1, var2, var3, var4, var5) fetch4(var1, var2, var3, var4); fetch1(var5) -#define fetch6(var1, var2, var3, var4, var5, var6) fetch5(var1, var2, var3, var4, var5); fetch1(var6) -#define fetch7(var1, var2, var3, var4, var5, var6, var7) fetch6(var1, var2, var3, var4, var5, var6); fetch1(var7) -#define fetch8(var1, var2, var3, var4, var5, var6, var7, var8) fetch7(var1, var2, var3, var4, var5, var6, var7); fetch1(var8) -#define fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9) fetch8(var1, var2, var3, var4, var5, var6, var7, var8); fetch1(var9) -#define fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10) fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9); fetch1(var10) -#define fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11) fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10); fetch1(var11) -#define fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11); fetch1(var12) -#define fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13) fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12); fetch1(var13) -#define fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14) fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13); fetch1(var14) -#define fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15) fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14); fetch1(var15) -#define fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16) fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15); fetch1(var16) -#define fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17) fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16); fetch1(var17) -#define fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18) fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17); fetch1(var18) -#define fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19) fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18); fetch1(var19) -#define fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20) fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19); fetch1(var20) -#define fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21) fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20); fetch1(var21) -#define fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22) fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21); fetch1(var22) -#define fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23) fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22); fetch1(var23) -#define fetch24(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23, var24) fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23); fetch1(var24) - -#define GET_MACRO( \ - _1, _2, _3, _4, _5, _6, \ - _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, \ - _19, _20, _21, _22, _23, _24, \ - NAME, ...) NAME -#ifdef _MSC_VER -#define EXPAND( x ) x -#define fetch(...) EXPAND( \ - GET_MACRO( \ - __VA_ARGS__, \ - fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ - fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ - fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ - fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ - )(__VA_ARGS__)) -#else -#define fetch(...) \ - GET_MACRO( \ - __VA_ARGS__, \ - fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ - fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ - fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ - fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ - )(__VA_ARGS__) -#endif - -// NOTE(Felix): we have to copy the string because we need it to be -// mutable for the parser to work, because the parser relys on being -// able to temporaily put in markers in the code and also it will fill -// out the source code location -#define _define_helper(def, docs, special) \ - Parser::parser_file = file_name_built_ins; \ - Parser::parser_line = __LINE__; \ - Parser::parser_col = 0; \ - auto label(params,__LINE__) = Parser::parse_single_expression( \ - Memory::get_c_str(Memory::create_string(#def))); \ - if_error_log_location_and_return(nullptr); \ - assert_type(label(params,__LINE__), Lisp_Object_Type::Pair); \ - assert_type(label(params,__LINE__)->value.pair.first, Lisp_Object_Type::Symbol); \ - auto label(sym,__LINE__) = label(params,__LINE__)->value.pair.first; \ - auto label(sfun,__LINE__) = Memory::create_lisp_object_cfunction(special); \ - create_arguments_from_lambda_list_and_inject(label(params,__LINE__)->value.pair.rest, label(sfun,__LINE__)); \ - if_error_log_location_and_return(nullptr); \ - label(sfun,__LINE__)->docstring = Memory::create_string(docs); \ - define_symbol(label(sym,__LINE__), label(sfun,__LINE__)); \ - label(sfun,__LINE__)->value.cFunction->body = []() -> Lisp_Object* - -#define define(def, docs) _define_helper(def, docs, false) -#define define_special(def, docs) _define_helper(def, docs, true) -#define in_caller_env fluid_let( \ - Globals::Current_Execution::envi_stack.next_index, \ - Globals::Current_Execution::envi_stack.next_index-1) - - - -/* - * iterate over lisp vectors - */ -#define for_lisp_vector(v) \ - if (!v); else \ - if (int it_index = 0); else \ - for (auto it = v->value.vector.data; \ - it_index < v->value.vector.length; \ - it=v->value.vector.data+(++it_index)) - -/* - * iterate over lisp lists - */ -#define for_lisp_list(l) \ - if (!l); else \ - if (int it_index = 0); else \ - for (Lisp_Object* head = l, *it; \ - Memory::get_type(head) == Lisp_Object_Type::Pair && (it = head->value.pair.first); \ - head = head->value.pair.rest, ++it_index) +#define concat_( a, b) a##b +#define label(prefix, lnum) concat_(prefix,lnum) + +#define log_location() \ + do { \ + if (Globals::log_level == Log_Level::Debug) { \ + printf("in"); \ + int spacing = 30-(int)strlen(__FILE__); \ + if (spacing < 1) spacing = 1; \ + for (int i = 0; i < spacing;++i) \ + printf(" "); \ + printf("%s (%d) ", __FILE__, __LINE__); \ + printf("-> %s\n",__FUNCTION__); \ + } \ + } while(0) + +#define if_error_log_location_and_return(val) \ + do { \ + if (Globals::error) { \ + log_location(); \ + return val; \ + } \ + } while(0) + +#ifdef _DEBUG +#define try_or_else_return(val) \ + if (1) \ + goto label(body,__LINE__); \ + else \ + while (1) \ + if (1) { \ + if (Globals::error) { \ + log_location(); \ + return val; \ + } \ + break; \ + } \ + else label(body,__LINE__): + ; +#else +#define try_or_else_return(val) +#endif + +#define try_struct try_or_else_return({}) +#define try_void try_or_else_return() +#define try try_or_else_return(0) + +#define dont_break_on_errors fluid_let(Globals::breaking_on_errors, false) +#define ignore_logging fluid_let(Globals::log_level, Log_Level::None) + +#define fetch1(var) \ + Lisp_Object* var##_symbol = Memory::get_symbol(#var); \ + Lisp_Object* var = lookup_symbol(var##_symbol, get_current_environment()); \ + if (Globals::error) printf("in %s:%d\n", __FILE__, __LINE__) + +#define fetch2(var1, var2) fetch1(var1); fetch1(var2) +#define fetch3(var1, var2, var3) fetch2(var1, var2); fetch1(var3) +#define fetch4(var1, var2, var3, var4) fetch3(var1, var2, var3); fetch1(var4) +#define fetch5(var1, var2, var3, var4, var5) fetch4(var1, var2, var3, var4); fetch1(var5) +#define fetch6(var1, var2, var3, var4, var5, var6) fetch5(var1, var2, var3, var4, var5); fetch1(var6) +#define fetch7(var1, var2, var3, var4, var5, var6, var7) fetch6(var1, var2, var3, var4, var5, var6); fetch1(var7) +#define fetch8(var1, var2, var3, var4, var5, var6, var7, var8) fetch7(var1, var2, var3, var4, var5, var6, var7); fetch1(var8) +#define fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9) fetch8(var1, var2, var3, var4, var5, var6, var7, var8); fetch1(var9) +#define fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10) fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9); fetch1(var10) +#define fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11) fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10); fetch1(var11) +#define fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11); fetch1(var12) +#define fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13) fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12); fetch1(var13) +#define fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14) fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13); fetch1(var14) +#define fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15) fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14); fetch1(var15) +#define fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16) fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15); fetch1(var16) +#define fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17) fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16); fetch1(var17) +#define fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18) fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17); fetch1(var18) +#define fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19) fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18); fetch1(var19) +#define fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20) fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19); fetch1(var20) +#define fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21) fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20); fetch1(var21) +#define fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22) fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21); fetch1(var22) +#define fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23) fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22); fetch1(var23) +#define fetch24(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23, var24) fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23); fetch1(var24) + +#define GET_MACRO( \ + _1, _2, _3, _4, _5, _6, \ + _7, _8, _9, _10, _11, _12, \ + _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, \ + NAME, ...) NAME +#ifdef _MSC_VER +#define EXPAND( x ) x +#define fetch(...) EXPAND( \ + GET_MACRO( \ + __VA_ARGS__, \ + fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ + fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ + fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ + fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ + )(__VA_ARGS__)) +#else +#define fetch(...) \ + GET_MACRO( \ + __VA_ARGS__, \ + fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ + fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ + fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ + fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ + )(__VA_ARGS__) +#endif + +// NOTE(Felix): we have to copy the string because we need it to be +// mutable for the parser to work, because the parser relys on being +// able to temporaily put in markers in the code and also it will fill +// out the source code location +#define _define_helper(def, docs, special) \ + Parser::parser_file = file_name_built_ins; \ + Parser::parser_line = __LINE__; \ + Parser::parser_col = 0; \ + auto label(params,__LINE__) = Parser::parse_single_expression( \ + Memory::get_c_str(Memory::create_string(#def))); \ + if_error_log_location_and_return(nullptr); \ + assert_type(label(params,__LINE__), Lisp_Object_Type::Pair); \ + assert_type(label(params,__LINE__)->value.pair.first, Lisp_Object_Type::Symbol); \ + auto label(sym,__LINE__) = label(params,__LINE__)->value.pair.first; \ + auto label(sfun,__LINE__) = Memory::create_lisp_object_cfunction(special); \ + create_arguments_from_lambda_list_and_inject(label(params,__LINE__)->value.pair.rest, label(sfun,__LINE__)); \ + if_error_log_location_and_return(nullptr); \ + label(sfun,__LINE__)->docstring = Memory::create_string(docs); \ + define_symbol(label(sym,__LINE__), label(sfun,__LINE__)); \ + label(sfun,__LINE__)->value.cFunction->body = []() -> Lisp_Object* + +#define define(def, docs) _define_helper(def, docs, false) +#define define_special(def, docs) _define_helper(def, docs, true) +#define in_caller_env fluid_let( \ + Globals::Current_Execution::envi_stack.next_index, \ + Globals::Current_Execution::envi_stack.next_index-1) + + + +/* + * iterate over lisp vectors + */ +#define for_lisp_vector(v) \ + if (!v); else \ + if (int it_index = 0); else \ + for (auto it = v->value.vector.data; \ + it_index < v->value.vector.length; \ + it=v->value.vector.data+(++it_index)) + +/* + * iterate over lisp lists + */ +#define for_lisp_list(l) \ + if (!l); else \ + if (int it_index = 0); else \ + for (Lisp_Object* head = l, *it; \ + Memory::get_type(head) == Lisp_Object_Type::Pair && (it = head->value.pair.first); \ + head = head->value.pair.rest, ++it_index) diff --git a/include/libslime.h b/include/libslime.h index 725d3b3..f0f6173 100644 --- a/include/libslime.h +++ b/include/libslime.h @@ -1,237 +1,237 @@ -#pragma once - -// #include -#include "ftb/arraylist.hpp" -#include "ftb/hashmap.hpp" - -namespace Slime { - struct Lisp_Object; - struct String; - struct Environment; - - enum struct Thread_Type { - Main, - GarbageCollection - }; - - enum struct Lisp_Object_Type { - Nil, - T, - Symbol, - Keyword, - Number, - String, - Pair, - Vector, - Continuation, - Pointer, - HashMap, - // OwningPointer, - Function, - CFunction, - }; - - enum class Lisp_Object_Flags - { - // bits 1 to 5 (including) will be reserved for the type - Already_Garbage_Collected = 1 << 5, - Under_Construction = 1 << 6, - }; - - enum struct Function_Type { - Lambda, - Macro - }; - - enum struct Log_Level { - None, - Critical, - Warning, - Info, - Debug, - }; - - struct Continuation { - Array_List call_stack; - Array_List envi_stack; - }; - - struct String { - int length; - char data; - }; - - struct Source_Code_Location { - String* file; - int line; - int column; - }; - - struct Pair { - Lisp_Object* first; - Lisp_Object* rest; - }; - - struct Vector { - int length; - Lisp_Object* data; - }; - - struct Positional_Arguments { - Array_List symbols; - }; - - struct Keyword_Arguments { - // Array of Pointers to Lisp_Object - Array_List keywords; - // NOTE(Felix): values[i] will be nullptr if no defalut value was - // declared for key identifiers[i] - Array_List values; - }; - - struct Arguments { - Positional_Arguments positional; - Keyword_Arguments keyword; - // NOTE(Felix): rest_argument will be nullptr if no rest argument - // is declared otherwise its a symbol - Lisp_Object* rest; - }; - - struct Environment { - Array_List parents; - Hash_Map hm; - - ~Environment() { - parents.~Array_List(); - hm.~Hash_Map(); - } - }; - - struct Function { - Function_Type type; - Arguments args; - Lisp_Object* body; // maybe implicit begin - Environment* parent_environment; // we are doing closures now!! - }; - - struct cFunction { - Lisp_Object* (*body)(); - Arguments args; - bool is_special_form; - }; - - struct Lisp_Object { - Source_Code_Location* sourceCodeLocation; - u64 flags; - Lisp_Object* userType; // keyword - String* docstring; - union value { - String* symbol; // used for symbols and keywords - double number; - String* string; - Pair pair; - Vector vector; - Function* function; - cFunction* cFunction; - void* pointer; - Continuation* continuation; - Hash_Map* hashMap; - ~value() {} - } value; - ~Lisp_Object(); - }; - - struct Error { - Lisp_Object* position; - // type has to be a keyword - Lisp_Object* type; - String* message; - }; - - - const wchar_t* char_to_wchar(const char* c); - char* read_entire_file(char* filename); - void add_to_load_path(const char*); - bool lisp_object_equal(Lisp_Object*,Lisp_Object*); - Lisp_Object* built_in_load(String*); - Lisp_Object* built_in_import(String*); - void delete_error(); - void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, const char* format, ...); - void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, String* message); - void create_error(Lisp_Object* type, const char* message, const char* c_file_name, int c_file_line); - Lisp_Object* eval_arguments(Lisp_Object*); - Lisp_Object* eval_expr(Lisp_Object*); - bool is_truthy (Lisp_Object*); - int list_length(Lisp_Object*); - void* load_built_ins_into_environment(); - void create_arguments_from_lambda_list_and_inject(Lisp_Object* formal_arguments, Lisp_Object* function); - - Lisp_Object* lookup_symbol(Lisp_Object* symbol, Environment*); - void define_symbol(Lisp_Object* symbol, Lisp_Object* value); - void print(Lisp_Object* node, bool print_repr = false, FILE* file = stdout); - void print_environment(Environment*); - - bool run_all_tests(); - - inline Environment* get_root_environment(); - inline Environment* get_current_environment(); - inline void push_environment(Environment*); - inline void pop_environment(); - - const char* Lisp_Object_Type_to_string(Lisp_Object_Type type); - - void visualize_lisp_machine(); - void generate_docs(String* path); - void log_error(); - - namespace Memory { - Environment* create_built_ins_environment(); - Lisp_Object* create_lisp_object_cfunction(bool is_special); - inline Lisp_Object_Type get_type(Lisp_Object* node); - void init(int); - char* get_c_str(String*); - void free_everything(); - String* create_string(const char*); - Lisp_Object* get_symbol(String* identifier); - Lisp_Object* get_symbol(const char*); - Lisp_Object* get_keyword(String* identifier); - Lisp_Object* get_keyword(const char*); - Lisp_Object* create_lisp_object(double); - Lisp_Object* create_lisp_object(const char*); - Lisp_Object* create_lisp_object_vector(Lisp_Object*); - Lisp_Object* create_lisp_object_vector(Lisp_Object*, Lisp_Object*); - Lisp_Object* create_lisp_object_vector(Lisp_Object*, Lisp_Object*, Lisp_Object*); - Lisp_Object* create_lisp_object_vector(int, Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); - } - - namespace Parser { - // extern Environment* environment_for_macros; - - extern String* standard_in; - extern String* parser_file; - extern int parser_line; - extern int parser_col; - - Lisp_Object* parse_single_expression(char* text); - Lisp_Object* parse_single_expression(wchar_t* text); - } - - namespace Globals { - extern char* bin_path; - extern Log_Level log_level; - extern Array_List load_path; - namespace Current_Execution { - extern Array_List call_stack; - extern Array_List envi_stack; - } - - extern Error* error; - extern bool breaking_on_errors; - } -} +#pragma once + +// #include +#include "ftb/arraylist.hpp" +#include "ftb/hashmap.hpp" + +namespace Slime { + struct Lisp_Object; + struct String; + struct Environment; + + enum struct Thread_Type { + Main, + GarbageCollection + }; + + enum struct Lisp_Object_Type { + Nil, + T, + Symbol, + Keyword, + Number, + String, + Pair, + Vector, + Continuation, + Pointer, + HashMap, + // OwningPointer, + Function, + CFunction, + }; + + enum class Lisp_Object_Flags + { + // bits 1 to 5 (including) will be reserved for the type + Already_Garbage_Collected = 1 << 5, + Under_Construction = 1 << 6, + }; + + enum struct Function_Type { + Lambda, + Macro + }; + + enum struct Log_Level { + None, + Critical, + Warning, + Info, + Debug, + }; + + struct Continuation { + Array_List call_stack; + Array_List envi_stack; + }; + + struct String { + int length; + char data; + }; + + struct Source_Code_Location { + String* file; + int line; + int column; + }; + + struct Pair { + Lisp_Object* first; + Lisp_Object* rest; + }; + + struct Vector { + int length; + Lisp_Object* data; + }; + + struct Positional_Arguments { + Array_List symbols; + }; + + struct Keyword_Arguments { + // Array of Pointers to Lisp_Object + Array_List keywords; + // NOTE(Felix): values[i] will be nullptr if no defalut value was + // declared for key identifiers[i] + Array_List values; + }; + + struct Arguments { + Positional_Arguments positional; + Keyword_Arguments keyword; + // NOTE(Felix): rest_argument will be nullptr if no rest argument + // is declared otherwise its a symbol + Lisp_Object* rest; + }; + + struct Environment { + Array_List parents; + Hash_Map hm; + + ~Environment() { + parents.~Array_List(); + hm.~Hash_Map(); + } + }; + + struct Function { + Function_Type type; + Arguments args; + Lisp_Object* body; // maybe implicit begin + Environment* parent_environment; // we are doing closures now!! + }; + + struct cFunction { + Lisp_Object* (*body)(); + Arguments args; + bool is_special_form; + }; + + struct Lisp_Object { + Source_Code_Location* sourceCodeLocation; + u64 flags; + Lisp_Object* userType; // keyword + String* docstring; + union value { + String* symbol; // used for symbols and keywords + double number; + String* string; + Pair pair; + Vector vector; + Function* function; + cFunction* cFunction; + void* pointer; + Continuation* continuation; + Hash_Map* hashMap; + ~value() {} + } value; + ~Lisp_Object(); + }; + + struct Error { + Lisp_Object* position; + // type has to be a keyword + Lisp_Object* type; + String* message; + }; + + + const wchar_t* char_to_wchar(const char* c); + char* read_entire_file(char* filename); + void add_to_load_path(const char*); + bool lisp_object_equal(Lisp_Object*,Lisp_Object*); + Lisp_Object* built_in_load(String*); + Lisp_Object* built_in_import(String*); + void delete_error(); + void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, const char* format, ...); + void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, String* message); + void create_error(Lisp_Object* type, const char* message, const char* c_file_name, int c_file_line); + Lisp_Object* eval_arguments(Lisp_Object*); + Lisp_Object* eval_expr(Lisp_Object*); + bool is_truthy (Lisp_Object*); + int list_length(Lisp_Object*); + void* load_built_ins_into_environment(); + void create_arguments_from_lambda_list_and_inject(Lisp_Object* formal_arguments, Lisp_Object* function); + + Lisp_Object* lookup_symbol(Lisp_Object* symbol, Environment*); + void define_symbol(Lisp_Object* symbol, Lisp_Object* value); + void print(Lisp_Object* node, bool print_repr = false, FILE* file = stdout); + void print_environment(Environment*); + + bool run_all_tests(); + + inline Environment* get_root_environment(); + inline Environment* get_current_environment(); + inline void push_environment(Environment*); + inline void pop_environment(); + + const char* Lisp_Object_Type_to_string(Lisp_Object_Type type); + + void visualize_lisp_machine(); + void generate_docs(String* path); + void log_error(); + + namespace Memory { + Environment* create_built_ins_environment(); + Lisp_Object* create_lisp_object_cfunction(bool is_special); + inline Lisp_Object_Type get_type(Lisp_Object* node); + void init(int); + char* get_c_str(String*); + void free_everything(); + String* create_string(const char*); + Lisp_Object* get_symbol(String* identifier); + Lisp_Object* get_symbol(const char*); + Lisp_Object* get_keyword(String* identifier); + Lisp_Object* get_keyword(const char*); + Lisp_Object* create_lisp_object(double); + Lisp_Object* create_lisp_object(const char*); + Lisp_Object* create_lisp_object_vector(Lisp_Object*); + Lisp_Object* create_lisp_object_vector(Lisp_Object*, Lisp_Object*); + Lisp_Object* create_lisp_object_vector(Lisp_Object*, Lisp_Object*, Lisp_Object*); + Lisp_Object* create_lisp_object_vector(int, Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); + } + + namespace Parser { + // extern Environment* environment_for_macros; + + extern String* standard_in; + extern String* parser_file; + extern int parser_line; + extern int parser_col; + + Lisp_Object* parse_single_expression(char* text); + Lisp_Object* parse_single_expression(wchar_t* text); + } + + namespace Globals { + extern char* bin_path; + extern Log_Level log_level; + extern Array_List load_path; + namespace Current_Execution { + extern Array_List call_stack; + extern Array_List envi_stack; + } + + extern Error* error; + extern bool breaking_on_errors; + } +} diff --git a/include/parse.cpp b/include/parse.cpp index 846e75e..d26bab5 100644 --- a/include/parse.cpp +++ b/include/parse.cpp @@ -1,398 +1,398 @@ -namespace Parser { - String* standard_in; - String* parser_file; - int parser_line; - int parser_col; - - proc eat_comment_line(char* text, int* index_in_text) -> void { - // safety check if we are actually starting a comment here - if (text[*index_in_text] != ';') - return; - - // eat the comment line - do { - ++(*index_in_text); - ++parser_col; - } while (text[(*index_in_text)] != '\n' && - text[(*index_in_text)] != '\r' && - text[(*index_in_text)] != '\0'); - } - - proc step_char(char* text, int* index_in_text, int steps = 1) { - for (int i = 0; i < steps; ++i) { - if (text[(*index_in_text)] == '\n') { - ++parser_line; - parser_col = 0; - } - ++parser_col; - ++(*index_in_text); - } - } - - proc eat_whitespace(char* text, int* index_in_text) -> void { - // skip whitespaces - while (text[(*index_in_text)] == ' ' || - text[(*index_in_text)] == '\t' || - text[(*index_in_text)] == '\n' || - text[(*index_in_text)] == '\r') - { - step_char(text, index_in_text); - } - } - - proc eat_until_code(char* text, int* index_in_text) -> void { - profile_this(); - int position_before; - do { - position_before = *index_in_text; - eat_comment_line(text, index_in_text); - eat_whitespace(text, index_in_text); - } while (position_before != *index_in_text); - } - - proc step_char_and_eat_until_code(char* text, int* index_in_text) { - step_char(text, index_in_text); - eat_until_code(text, index_in_text); - } - - proc parse_fancy_delimiter(char* text, int* index_in_text, char l_delimiter, char r_delimiter, Lisp_Object* first_elem) -> Lisp_Object* { - profile_this(); - if (text[*index_in_text] != l_delimiter) { - create_parsing_error("a fancy cannot be parsed here"); - return nullptr; - } - - Lisp_Object* ret; - Lisp_Object* head; - try ret = Memory::create_lisp_object_pair(first_elem, Memory::nil); - head = ret; - - step_char(text, index_in_text); - - eat_until_code(text, index_in_text); - while (text[*index_in_text] != r_delimiter) { - Lisp_Object* element; - try element = parse_expression(text, index_in_text); - try head->value.pair.rest = Memory::create_lisp_object_pair(element, Memory::nil); - head = head->value.pair.rest; - eat_until_code(text, index_in_text); - } - - step_char(text, index_in_text); - - return ret; - } - - proc get_atom_text_length(char* text, int* index_in_text) -> int { - int atom_length = 0; - while (text[*index_in_text+atom_length] != ' ' && - text[*index_in_text+atom_length] != ')' && - text[*index_in_text+atom_length] != '(' && - text[*index_in_text+atom_length] != '[' && - text[*index_in_text+atom_length] != ']' && - text[*index_in_text+atom_length] != '{' && - text[*index_in_text+atom_length] != '}' && - text[*index_in_text+atom_length] != '\0' && - text[*index_in_text+atom_length] != '\n' && - text[*index_in_text+atom_length] != '\r' && - text[*index_in_text+atom_length] != '\t') - { - ++atom_length; - } - return atom_length; - } - - proc parse_number(char* text, int* index_in_text) -> Lisp_Object* { - Lisp_Object* ret; - try ret = Memory::create_lisp_object(0.0); - - sscanf(text+*index_in_text, "%lf", &ret->value.number); - - int atom_length = get_atom_text_length(text, index_in_text); - step_char(text, index_in_text, atom_length); - - return ret; - } - - proc parse_symbol_or_keyword(char* text, int* index_in_text) -> Lisp_Object* { - bool keyword = false; - if (text[*index_in_text] == ':') { - keyword = true; - step_char(text, index_in_text); - } - - int atom_length = get_atom_text_length(text, index_in_text); - char orig = text[*index_in_text+atom_length]; - text[*index_in_text+atom_length] = '\0'; - - - String* str_keyword; - Lisp_Object* ret; - try str_keyword = Memory::create_string("", atom_length); - strcpy(&str_keyword->data, text+*index_in_text); - - if (keyword) { - try ret = Memory::get_keyword(str_keyword); - } else { - try ret = Memory::get_symbol(str_keyword); - } - - - text[*index_in_text+atom_length] = orig; - step_char(text, index_in_text, atom_length); - - return ret; - } - - proc parse_string(char* text, int* index_in_text) -> Lisp_Object* { - // the first character is the '"' - step_char(text, index_in_text); - - // now we are at the first letter, if this is the closing '"' then - // it's easy - if (text[*index_in_text] == '"') { - Lisp_Object* ret; - try ret = Memory::create_lisp_object(Memory::create_string("", 0)); - // inject_scl(ret); - - // plus one because we want to go after the quotes - step_char(text, index_in_text); - - return ret; - } - - // okay so the first letter was not actually closing the string... - int string_length = 0; - bool escaping = false; - while (escaping || text[*index_in_text+string_length] != '"') { - if (escaping) { - escaping = false; - } - else - if (text[*index_in_text+string_length] == '\\') - escaping = true; - - ++string_length; - } - - // we found the end of the string - text[*index_in_text+string_length] = '\0'; - - // NOTE(Felix): Tactic: Through unescaping the string will - // only get shorter, so we replace it inplace and later jump - // to the original end of the string. - int new_len; - try new_len = unescape_string(text+(*index_in_text)); - - String* string = Memory::create_string("", new_len); - - strcpy(&string->data, text+(*index_in_text)); - // printf("------ %s\n", &string->data); - - text[*index_in_text+string_length] = '"'; - - // plus one because we want to go after the quotes - step_char(text, index_in_text, string_length+1); - - Lisp_Object* ret; - try ret = Memory::create_lisp_object(string); - - // inject_scl(ret); - return ret; - } - - proc parse_atom(char* text, int* index_in_text) -> Lisp_Object* { - profile_this(); - Lisp_Object* ret; - // numbers - if ((text[*index_in_text] <= 57 && // if number - text[*index_in_text] >= 48) - || - ((text[*index_in_text] == '+' || // or if sign and then number - text[*index_in_text] == '-') - && - (text[*index_in_text +1] <= 57 && - text[*index_in_text +1] >= 48)) - || - ((text[*index_in_text] == '.') // or if . and then number - && - (text[*index_in_text +1] <= 57 && - text[*index_in_text +1] >= 48))) - { - try ret = parse_number(text, index_in_text); - } - - else if (text[*index_in_text] == '"') - try ret = parse_string(text, index_in_text); - else - try ret = parse_symbol_or_keyword(text, index_in_text); - - return ret; - } - - - - proc parse_list(char* text, int* index_in_text) -> Lisp_Object* { - profile_this(); - if (text[*index_in_text] != '(') { - create_parsing_error("a list cannot be parsed here"); - return nullptr; - } - step_char_and_eat_until_code(text, index_in_text); - - if (text[*index_in_text] == ')') { - step_char(text, index_in_text); - return Memory::nil; - } - - Lisp_Object* first_elem; - Lisp_Object* ret; - Lisp_Object* head; - - - try first_elem = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(first_elem, Memory::nil); - head = ret; - - eat_until_code(text, index_in_text); - while (text[*index_in_text] != ')') { - Lisp_Object* element; - - if (text[*index_in_text+0] == '.' && - text[*index_in_text+1] == ' ') - { - step_char(text, index_in_text, 2); - try element = parse_expression(text, index_in_text); - head->value.pair.rest = element; - - eat_until_code(text, index_in_text); - if (text[*index_in_text] != ')') { - create_parsing_error("expected the list to end after the dotted end."); - return nullptr; - } - step_char(text, index_in_text); - return ret; - } - - try element = parse_expression(text, index_in_text); - try head->value.pair.rest = Memory::create_lisp_object_pair(element, Memory::nil); - head = head->value.pair.rest; - eat_until_code(text, index_in_text); - } - step_char(text, index_in_text); - return ret; - } - - proc maybe_expand_short_form(char* text, int* index_in_text) -> Lisp_Object* { - profile_this(); - Lisp_Object* vector_sym = Memory::get_symbol("vector"); - Lisp_Object* hash_map_sym = Memory::get_symbol("hash-map"); - - Lisp_Object* quote_sym = Memory::get_symbol("quote"); - Lisp_Object* quasiquote_sym = Memory::get_symbol("quasiquote"); - Lisp_Object* unquote_sym = Memory::get_symbol("unquote"); - Lisp_Object* unquote_splicing_sym = Memory::get_symbol("unquote-splicing"); - - Lisp_Object* ret = nullptr; - Lisp_Object* expr; - - switch (text[*index_in_text]) { - case '\'': { - // quote - step_char_and_eat_until_code(text, index_in_text); - try expr = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(expr, Memory::nil); - try ret = Memory::create_lisp_object_pair(quote_sym, ret); - } break; - case '`': { - // quasiquote - step_char_and_eat_until_code(text, index_in_text); - try expr = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(expr, Memory::nil); - try ret = Memory::create_lisp_object_pair(quasiquote_sym, ret); - } break; - case ',': { - step_char_and_eat_until_code(text, index_in_text); - if (text[*index_in_text] == '@') { - // unquote-splicing - step_char_and_eat_until_code(text, index_in_text); - try expr = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(expr, Memory::nil); - try ret = Memory::create_lisp_object_pair(unquote_splicing_sym, ret); - } else { - // unquote - try expr = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(expr, Memory::nil); - try ret = Memory::create_lisp_object_pair(unquote_sym, ret); - } - } break; - case '[': { - // vector - try ret = parse_fancy_delimiter(text, index_in_text, '[', ']', vector_sym); - } break; - case '{': { - // hashmap - try ret = parse_fancy_delimiter(text, index_in_text, '{', '}', hash_map_sym); - } break; - default: break; - } - - return ret; - } - - proc parse_expression(char* text, int* index_in_text) -> Lisp_Object* { - profile_this(); - Lisp_Object* ret; - eat_until_code(text, index_in_text); - try ret = maybe_expand_short_form(text, index_in_text); - if (ret) - return ret; - - if (text[*index_in_text] == '(') { - try ret = parse_list(text, index_in_text); - } else { - try ret = parse_atom(text, index_in_text); - } - - return ret; - } - - proc parse_single_expression(wchar_t* text) -> Lisp_Object* { - char* res = wchar_to_char(text); - defer {free(res);}; - return parse_single_expression(res); - } - - proc parse_single_expression(char* text) -> Lisp_Object* { - parser_file = standard_in; - parser_line = 1; - parser_col = 1; - - int index_in_text = 0; - Lisp_Object* ret; - try ret = parse_expression(text, &index_in_text); - return ret; - } - - - proc parse_program(String* file_name, char* text) -> Array_List* { - profile_this(); - parser_file = file_name; - parser_line = 1; - parser_col = 0; - - Array_List* program = new Array_List; - - int index_in_text = 0; - Lisp_Object* parsed; - - eat_until_code(text, &index_in_text); - while (text[index_in_text] != '\0') { - try parsed = parse_expression(text, &index_in_text); - program->append(parsed); - eat_until_code(text, &index_in_text); - } - return program; - } - -} +namespace Parser { + String* standard_in; + String* parser_file; + int parser_line; + int parser_col; + + proc eat_comment_line(char* text, int* index_in_text) -> void { + // safety check if we are actually starting a comment here + if (text[*index_in_text] != ';') + return; + + // eat the comment line + do { + ++(*index_in_text); + ++parser_col; + } while (text[(*index_in_text)] != '\n' && + text[(*index_in_text)] != '\r' && + text[(*index_in_text)] != '\0'); + } + + proc step_char(char* text, int* index_in_text, int steps = 1) { + for (int i = 0; i < steps; ++i) { + if (text[(*index_in_text)] == '\n') { + ++parser_line; + parser_col = 0; + } + ++parser_col; + ++(*index_in_text); + } + } + + proc eat_whitespace(char* text, int* index_in_text) -> void { + // skip whitespaces + while (text[(*index_in_text)] == ' ' || + text[(*index_in_text)] == '\t' || + text[(*index_in_text)] == '\n' || + text[(*index_in_text)] == '\r') + { + step_char(text, index_in_text); + } + } + + proc eat_until_code(char* text, int* index_in_text) -> void { + profile_this(); + int position_before; + do { + position_before = *index_in_text; + eat_comment_line(text, index_in_text); + eat_whitespace(text, index_in_text); + } while (position_before != *index_in_text); + } + + proc step_char_and_eat_until_code(char* text, int* index_in_text) { + step_char(text, index_in_text); + eat_until_code(text, index_in_text); + } + + proc parse_fancy_delimiter(char* text, int* index_in_text, char l_delimiter, char r_delimiter, Lisp_Object* first_elem) -> Lisp_Object* { + profile_this(); + if (text[*index_in_text] != l_delimiter) { + create_parsing_error("a fancy cannot be parsed here"); + return nullptr; + } + + Lisp_Object* ret; + Lisp_Object* head; + try ret = Memory::create_lisp_object_pair(first_elem, Memory::nil); + head = ret; + + step_char(text, index_in_text); + + eat_until_code(text, index_in_text); + while (text[*index_in_text] != r_delimiter) { + Lisp_Object* element; + try element = parse_expression(text, index_in_text); + try head->value.pair.rest = Memory::create_lisp_object_pair(element, Memory::nil); + head = head->value.pair.rest; + eat_until_code(text, index_in_text); + } + + step_char(text, index_in_text); + + return ret; + } + + proc get_atom_text_length(char* text, int* index_in_text) -> int { + int atom_length = 0; + while (text[*index_in_text+atom_length] != ' ' && + text[*index_in_text+atom_length] != ')' && + text[*index_in_text+atom_length] != '(' && + text[*index_in_text+atom_length] != '[' && + text[*index_in_text+atom_length] != ']' && + text[*index_in_text+atom_length] != '{' && + text[*index_in_text+atom_length] != '}' && + text[*index_in_text+atom_length] != '\0' && + text[*index_in_text+atom_length] != '\n' && + text[*index_in_text+atom_length] != '\r' && + text[*index_in_text+atom_length] != '\t') + { + ++atom_length; + } + return atom_length; + } + + proc parse_number(char* text, int* index_in_text) -> Lisp_Object* { + Lisp_Object* ret; + try ret = Memory::create_lisp_object(0.0); + + sscanf(text+*index_in_text, "%lf", &ret->value.number); + + int atom_length = get_atom_text_length(text, index_in_text); + step_char(text, index_in_text, atom_length); + + return ret; + } + + proc parse_symbol_or_keyword(char* text, int* index_in_text) -> Lisp_Object* { + bool keyword = false; + if (text[*index_in_text] == ':') { + keyword = true; + step_char(text, index_in_text); + } + + int atom_length = get_atom_text_length(text, index_in_text); + char orig = text[*index_in_text+atom_length]; + text[*index_in_text+atom_length] = '\0'; + + + String* str_keyword; + Lisp_Object* ret; + try str_keyword = Memory::create_string("", atom_length); + strcpy(&str_keyword->data, text+*index_in_text); + + if (keyword) { + try ret = Memory::get_keyword(str_keyword); + } else { + try ret = Memory::get_symbol(str_keyword); + } + + + text[*index_in_text+atom_length] = orig; + step_char(text, index_in_text, atom_length); + + return ret; + } + + proc parse_string(char* text, int* index_in_text) -> Lisp_Object* { + // the first character is the '"' + step_char(text, index_in_text); + + // now we are at the first letter, if this is the closing '"' then + // it's easy + if (text[*index_in_text] == '"') { + Lisp_Object* ret; + try ret = Memory::create_lisp_object(Memory::create_string("", 0)); + // inject_scl(ret); + + // plus one because we want to go after the quotes + step_char(text, index_in_text); + + return ret; + } + + // okay so the first letter was not actually closing the string... + int string_length = 0; + bool escaping = false; + while (escaping || text[*index_in_text+string_length] != '"') { + if (escaping) { + escaping = false; + } + else + if (text[*index_in_text+string_length] == '\\') + escaping = true; + + ++string_length; + } + + // we found the end of the string + text[*index_in_text+string_length] = '\0'; + + // NOTE(Felix): Tactic: Through unescaping the string will + // only get shorter, so we replace it inplace and later jump + // to the original end of the string. + int new_len; + try new_len = unescape_string(text+(*index_in_text)); + + String* string = Memory::create_string("", new_len); + + strcpy(&string->data, text+(*index_in_text)); + // printf("------ %s\n", &string->data); + + text[*index_in_text+string_length] = '"'; + + // plus one because we want to go after the quotes + step_char(text, index_in_text, string_length+1); + + Lisp_Object* ret; + try ret = Memory::create_lisp_object(string); + + // inject_scl(ret); + return ret; + } + + proc parse_atom(char* text, int* index_in_text) -> Lisp_Object* { + profile_this(); + Lisp_Object* ret; + // numbers + if ((text[*index_in_text] <= 57 && // if number + text[*index_in_text] >= 48) + || + ((text[*index_in_text] == '+' || // or if sign and then number + text[*index_in_text] == '-') + && + (text[*index_in_text +1] <= 57 && + text[*index_in_text +1] >= 48)) + || + ((text[*index_in_text] == '.') // or if . and then number + && + (text[*index_in_text +1] <= 57 && + text[*index_in_text +1] >= 48))) + { + try ret = parse_number(text, index_in_text); + } + + else if (text[*index_in_text] == '"') + try ret = parse_string(text, index_in_text); + else + try ret = parse_symbol_or_keyword(text, index_in_text); + + return ret; + } + + + + proc parse_list(char* text, int* index_in_text) -> Lisp_Object* { + profile_this(); + if (text[*index_in_text] != '(') { + create_parsing_error("a list cannot be parsed here"); + return nullptr; + } + step_char_and_eat_until_code(text, index_in_text); + + if (text[*index_in_text] == ')') { + step_char(text, index_in_text); + return Memory::nil; + } + + Lisp_Object* first_elem; + Lisp_Object* ret; + Lisp_Object* head; + + + try first_elem = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(first_elem, Memory::nil); + head = ret; + + eat_until_code(text, index_in_text); + while (text[*index_in_text] != ')') { + Lisp_Object* element; + + if (text[*index_in_text+0] == '.' && + text[*index_in_text+1] == ' ') + { + step_char(text, index_in_text, 2); + try element = parse_expression(text, index_in_text); + head->value.pair.rest = element; + + eat_until_code(text, index_in_text); + if (text[*index_in_text] != ')') { + create_parsing_error("expected the list to end after the dotted end."); + return nullptr; + } + step_char(text, index_in_text); + return ret; + } + + try element = parse_expression(text, index_in_text); + try head->value.pair.rest = Memory::create_lisp_object_pair(element, Memory::nil); + head = head->value.pair.rest; + eat_until_code(text, index_in_text); + } + step_char(text, index_in_text); + return ret; + } + + proc maybe_expand_short_form(char* text, int* index_in_text) -> Lisp_Object* { + profile_this(); + Lisp_Object* vector_sym = Memory::get_symbol("vector"); + Lisp_Object* hash_map_sym = Memory::get_symbol("hash-map"); + + Lisp_Object* quote_sym = Memory::get_symbol("quote"); + Lisp_Object* quasiquote_sym = Memory::get_symbol("quasiquote"); + Lisp_Object* unquote_sym = Memory::get_symbol("unquote"); + Lisp_Object* unquote_splicing_sym = Memory::get_symbol("unquote-splicing"); + + Lisp_Object* ret = nullptr; + Lisp_Object* expr; + + switch (text[*index_in_text]) { + case '\'': { + // quote + step_char_and_eat_until_code(text, index_in_text); + try expr = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(expr, Memory::nil); + try ret = Memory::create_lisp_object_pair(quote_sym, ret); + } break; + case '`': { + // quasiquote + step_char_and_eat_until_code(text, index_in_text); + try expr = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(expr, Memory::nil); + try ret = Memory::create_lisp_object_pair(quasiquote_sym, ret); + } break; + case ',': { + step_char_and_eat_until_code(text, index_in_text); + if (text[*index_in_text] == '@') { + // unquote-splicing + step_char_and_eat_until_code(text, index_in_text); + try expr = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(expr, Memory::nil); + try ret = Memory::create_lisp_object_pair(unquote_splicing_sym, ret); + } else { + // unquote + try expr = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(expr, Memory::nil); + try ret = Memory::create_lisp_object_pair(unquote_sym, ret); + } + } break; + case '[': { + // vector + try ret = parse_fancy_delimiter(text, index_in_text, '[', ']', vector_sym); + } break; + case '{': { + // hashmap + try ret = parse_fancy_delimiter(text, index_in_text, '{', '}', hash_map_sym); + } break; + default: break; + } + + return ret; + } + + proc parse_expression(char* text, int* index_in_text) -> Lisp_Object* { + profile_this(); + Lisp_Object* ret; + eat_until_code(text, index_in_text); + try ret = maybe_expand_short_form(text, index_in_text); + if (ret) + return ret; + + if (text[*index_in_text] == '(') { + try ret = parse_list(text, index_in_text); + } else { + try ret = parse_atom(text, index_in_text); + } + + return ret; + } + + proc parse_single_expression(wchar_t* text) -> Lisp_Object* { + char* res = wchar_to_char(text); + defer {free(res);}; + return parse_single_expression(res); + } + + proc parse_single_expression(char* text) -> Lisp_Object* { + parser_file = standard_in; + parser_line = 1; + parser_col = 1; + + int index_in_text = 0; + Lisp_Object* ret; + try ret = parse_expression(text, &index_in_text); + return ret; + } + + + proc parse_program(String* file_name, char* text) -> Array_List* { + profile_this(); + parser_file = file_name; + parser_line = 1; + parser_col = 0; + + Array_List* program = new Array_List; + + int index_in_text = 0; + Lisp_Object* parsed; + + eat_until_code(text, &index_in_text); + while (text[index_in_text] != '\0') { + try parsed = parse_expression(text, &index_in_text); + program->append(parsed); + eat_until_code(text, &index_in_text); + } + return program; + } + +} diff --git a/integration/emacs/slime-mode.el b/integration/emacs/slime-mode.el index c2329a8..9a5ed2c 100644 --- a/integration/emacs/slime-mode.el +++ b/integration/emacs/slime-mode.el @@ -1,244 +1,244 @@ -(require 'cl-lib) -(require 'company) - -;; "= . args" -;; "> . args" -;; ">= . args" -;; "< . args" -;; "<= . args" -;; "+ . args" -;; "- . args" -;; "* . args" -;; "/ . args" -;; "** a b" -;; "% a b" -;; "get-random-between a b" -;; "assert test" -;; "define-syntax form (:doc \"\") . body" -;; "define definee (:doc \"\") . body" -;; "mutate target source" -;; "vector-length v" -;; "vector-ref vec idx" -;; "vector-set! vec idx val" -;; "set! sym val" -;; "set-car! target source" -;; "set-cdr! target source" -;; "if test then_part else_part" -;; "quote datum" -;; "quasiquote expr" -;; "and . args" -;; "or . args" -;; "not test" -;; "lambda args . body" -;; "apply fun args" -;; "eval expr" -;; "begin . args" -;; "list . args" -;; "pair car cdr" -;; "first seq" -;; "rest seq" -;; "set-type! node new_type" -;; "delete-type! n" -;; "type n" -;; "mem-reset" -;; "info n" -;; "show n" -;; "addr-of var" -;; "generate-docs file_name" -;; "print (:sep \" \") (:end \"\\n\") . things" -;; "read (:prompt \">\"" -;; "exit (:code 0)" -;; "break" -;; "memstat" -;; "mytry try_part catch_part" -;; "load file" -;; "import f" -;; "copy obj" -;; "error type message" -;; "symbol->keyword sym" -;; "string->symbol str" -;; "symbol->string sym" -;; "concat-strings . strings" - -(defconst slime-built-ins - '("=" ">" ">=" "<" "<=" "+" "-" "*" "/" "**" "%" "get-random-between" - "assert" "define" "define-syntax" "mutate" "if" "vector-length" - "vector-ref" "vector-set!" "set!" "set-car!" "set-cdr!" - "quote" "quasiquote" "unquote" "unquote-splicing" "and" "or" "not" "let" - "lambda" "apply" "eval" "begin" "list" "pair" "create-hash-map" - "hash-map-get" "hash-map-set!" "hash-map-delete!" "vector" - "first" "rest" "set-type!" "delete-type!" "type" "info" "mem-reset" - "show" "addr-of" "generate-docs" "print" "read" "exit" "break" "memstat" - "mytry" "load" "import" "copy" "error" "symbol->keyword" "string->symbol" - "symbol->string" "concat-strings")) - -(defun get-args (s) - (cond - ((string= s "=") ". objects") - ((string= s ">") ". objects") - ((string= s ">=") ". objects") - ((string= s "<") ". objects") - ((string= s "<=") ". objects") - ((string= s "+") ". objects") - ((string= s "-") ". objects") - ((string= s "*") ". objects") - ((string= s "/") ". objects") - ((string= s "**") "a b") - ((string= s "%") "a b") - ((string= s "get-random-between") "a b") - ((string= s "assert") "test") - ((string= s "define") "definee (:doc \"\") . body") - ((string= s "define-syntax") "form (:doc \"\") . body") - ((string= s "mutate") "(mutate )") - ((string= s "if") "(if )") - (t '()))) - -(defun sample-meta (s) - (message "%s%s%s%s" - (propertize "(" 'face '(:foreground "orange")) - (propertize s 'face '(:foreground "#859900")) - (let ((args (get-args s))) - (if args - (concat " " args) - "")) - (propertize ")" 'face '(:foreground "orange")) - )) - - - -(defun my-slime-eldoc-function () - (let ((sexp-text (thing-at-point 'sexp))) - (when sexp-text - (let* ((sexp (read sexp-text)) - (symbol (if (listp sexp) - (symbol-name (car sexp)) - (symbol-name sexp)))) - (when (member symbol slime-built-ins) - (sample-meta symbol)))))) - - -(add-to-list 'auto-mode-alist '("\\.slime\\'" . slime-mode)) - -(put 'lambda 'doc-string-elt 2) -(put 'special-lambda 'doc-string-elt 2) -(put 'define 'doc-string-elt 2) -(put 'define-syntax 'doc-string-elt 2) - -(define-derived-mode slime-mode prog-mode "(slime)" - "Major mode for editing slime code." - :group 'lisp - - (defvar project-vc-external-roots-function) - - (set-syntax-table lisp-mode-syntax-table) - (setq-local lisp-mode-symbol-regexp "\\(?:\\sw\\|\\s_\\|\\\\.\\|?\\)+") - (setq-local paragraph-ignore-fill-prefix t) - (setq-local fill-paragraph-function 'lisp-fill-paragraph) - (setq-local adaptive-fill-function #'lisp-adaptive-fill) - ;; Adaptive fill mode gets in the way of auto-fill, - ;; and should make no difference for explicit fill - ;; because lisp-fill-paragraph should do the job. - ;; I believe that newcomment's auto-fill code properly deals with it -stef - ;;(set (make-local-variable 'adaptive-fill-mode) nil) - (setq-local indent-line-function 'lisp-indent-line) - (setq-local indent-region-function 'lisp-indent-region) - (setq-local comment-indent-function #'lisp-comment-indent) - ;; (setq-local outline-regexp ";;;\\(;* [^ \t\n]\\|###autoload\\)\\|(") - (setq-local outline-level 'lisp-outline-level) - (setq-local add-log-current-defun-function #'lisp-current-defun-name) - (setq-local comment-start ";") - (setq-local comment-start-skip ";+ *") - (setq-local comment-add 1) ;default to `;;' in comment-region - (setq-local comment-column 40) - (setq-local comment-use-syntax t) - (setq-local imenu-generic-expression lisp-imenu-generic-expression) - (setq-local multibyte-syntax-as-symbol t) - - (defconst yess - (append - `((,(concat "\\(define\\)\\s-*(\\(\\_<[^ )]*\\)") - (1 font-lock-keyword-face) - (2 font-lock-function-name-face) - )) - `((,(concat "(\\s-*\\_<" - (regexp-opt - slime-built-ins) "\\_>") - (0 font-lock-keyword-face))) - `((,(concat "[`โ€˜]\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)" - lisp-mode-symbol-regexp "\\)['โ€™]") - (1 font-lock-constant-face prepend)) - ;; Constant values. - (,(concat "\\_<:" lisp-mode-symbol-regexp "\\_>") - (0 font-lock-builtin-face))) - - )) - - (setq font-lock-defaults - `((yess) - nil nil nil nil - (font-lock-mark-block-function . mark-defun) - (font-lock-extra-managed-props help-echo) - (font-lock-syntactic-face-function - . lisp-font-lock-syntactic-face-function))) - ;; (setq font-lock-defaults '((;; ads - ;; ;; lisp-el-font-lock-keywords-1 - ;; ;; lisp-el-font-lock-keywords-2 - ;; ) - ;; nil nil nil nil - ;; (font-lock-mark-block-function . mark-defun) - ;; (font-lock-extra-managed-props help-echo) - ;; (font-lock-syntactic-face-function - ;; . lisp-font-lock-syntactic-face-function))) - (setq-local prettify-symbols-alist lisp-prettify-symbols-alist) - (setq-local electric-pair-skip-whitespace 'chomp) - (setq-local electric-pair-open-newline-between-pairs nil) - - (add-hook 'after-load-functions #'elisp--font-lock-flush-elisp-buffers) - (unless noninteractive - (require 'elec-pair) - (defvar electric-pair-text-pairs) - (setq-local electric-pair-text-pairs - (append '((?\` . ?\') (?โ€˜ . ?โ€™)) electric-pair-text-pairs)) - (setq-local electric-quote-string t)) - (setq imenu-case-fold-search nil) - (add-function :before-until (local 'eldoc-documentation-function) - #'my-slime-eldoc-function) - (add-hook 'xref-backend-functions #'elisp--xref-backend nil t) - (setq-local project-vc-external-roots-function #'elisp-load-path-roots) - (add-hook 'completion-at-point-functions #'elisp-completion-at-point nil 'local) - (add-hook 'flymake-diagnostic-functions #'elisp-flymake-checkdoc nil t) - (add-hook 'flymake-diagnostic-functions #'elisp-flymake-byte-compile nil t) - (modify-syntax-entry ?\{ "(}") - (modify-syntax-entry ?\} "){") - (modify-syntax-entry ?\[ "(]") - (modify-syntax-entry ?\] ")[")) - - -(defun company-simple-backend (command &optional arg &rest ignored) - (interactive (list 'interactive)) - (cl-case command - (interactive (company-begin-backend 'company-simple-backend)) - (prefix (when (looking-back "foo\\>") - (match-string 0))) - (candidates (when (equal arg "foo") - (list "foobar" "foobaz" "foobarbaz"))) - (meta (format "This value is named %s" arg)))) - -(defun company-sample-backend (command &optional arg &rest ignored) - (interactive (list 'interactive)) - (cl-case command - (interactive (company-begin-backend 'company-sample-backend)) - (prefix (and (eq major-mode 'slime-mode) - (company-grab-symbol))) - (candidates - (remove-if-not - (lambda (c) (string-prefix-p arg c)) - slime-built-ins)) - (meta (sample-meta arg)))) - -(add-hook 'slime-mode-hook - (lambda () - (set (make-local-variable 'eldoc-documentation-function) 'my-slime-eldoc-function) - (set (make-local-variable 'company-backends) '(company-sample-backend)))) - -(provide 'slime-mode) +(require 'cl-lib) +(require 'company) + +;; "= . args" +;; "> . args" +;; ">= . args" +;; "< . args" +;; "<= . args" +;; "+ . args" +;; "- . args" +;; "* . args" +;; "/ . args" +;; "** a b" +;; "% a b" +;; "get-random-between a b" +;; "assert test" +;; "define-syntax form (:doc \"\") . body" +;; "define definee (:doc \"\") . body" +;; "mutate target source" +;; "vector-length v" +;; "vector-ref vec idx" +;; "vector-set! vec idx val" +;; "set! sym val" +;; "set-car! target source" +;; "set-cdr! target source" +;; "if test then_part else_part" +;; "quote datum" +;; "quasiquote expr" +;; "and . args" +;; "or . args" +;; "not test" +;; "lambda args . body" +;; "apply fun args" +;; "eval expr" +;; "begin . args" +;; "list . args" +;; "pair car cdr" +;; "first seq" +;; "rest seq" +;; "set-type! node new_type" +;; "delete-type! n" +;; "type n" +;; "mem-reset" +;; "info n" +;; "show n" +;; "addr-of var" +;; "generate-docs file_name" +;; "print (:sep \" \") (:end \"\\n\") . things" +;; "read (:prompt \">\"" +;; "exit (:code 0)" +;; "break" +;; "memstat" +;; "mytry try_part catch_part" +;; "load file" +;; "import f" +;; "copy obj" +;; "error type message" +;; "symbol->keyword sym" +;; "string->symbol str" +;; "symbol->string sym" +;; "concat-strings . strings" + +(defconst slime-built-ins + '("=" ">" ">=" "<" "<=" "+" "-" "*" "/" "**" "%" "get-random-between" + "assert" "define" "define-syntax" "mutate" "if" "vector-length" + "vector-ref" "vector-set!" "set!" "set-car!" "set-cdr!" + "quote" "quasiquote" "unquote" "unquote-splicing" "and" "or" "not" "let" + "lambda" "apply" "eval" "begin" "list" "pair" "create-hash-map" + "hash-map-get" "hash-map-set!" "hash-map-delete!" "vector" + "first" "rest" "set-type!" "delete-type!" "type" "info" "mem-reset" + "show" "addr-of" "generate-docs" "print" "read" "exit" "break" "memstat" + "mytry" "load" "import" "copy" "error" "symbol->keyword" "string->symbol" + "symbol->string" "concat-strings")) + +(defun get-args (s) + (cond + ((string= s "=") ". objects") + ((string= s ">") ". objects") + ((string= s ">=") ". objects") + ((string= s "<") ". objects") + ((string= s "<=") ". objects") + ((string= s "+") ". objects") + ((string= s "-") ". objects") + ((string= s "*") ". objects") + ((string= s "/") ". objects") + ((string= s "**") "a b") + ((string= s "%") "a b") + ((string= s "get-random-between") "a b") + ((string= s "assert") "test") + ((string= s "define") "definee (:doc \"\") . body") + ((string= s "define-syntax") "form (:doc \"\") . body") + ((string= s "mutate") "(mutate )") + ((string= s "if") "(if )") + (t '()))) + +(defun sample-meta (s) + (message "%s%s%s%s" + (propertize "(" 'face '(:foreground "orange")) + (propertize s 'face '(:foreground "#859900")) + (let ((args (get-args s))) + (if args + (concat " " args) + "")) + (propertize ")" 'face '(:foreground "orange")) + )) + + + +(defun my-slime-eldoc-function () + (let ((sexp-text (thing-at-point 'sexp))) + (when sexp-text + (let* ((sexp (read sexp-text)) + (symbol (if (listp sexp) + (symbol-name (car sexp)) + (symbol-name sexp)))) + (when (member symbol slime-built-ins) + (sample-meta symbol)))))) + + +(add-to-list 'auto-mode-alist '("\\.slime\\'" . slime-mode)) + +(put 'lambda 'doc-string-elt 2) +(put 'special-lambda 'doc-string-elt 2) +(put 'define 'doc-string-elt 2) +(put 'define-syntax 'doc-string-elt 2) + +(define-derived-mode slime-mode prog-mode "(slime)" + "Major mode for editing slime code." + :group 'lisp + + (defvar project-vc-external-roots-function) + + (set-syntax-table lisp-mode-syntax-table) + (setq-local lisp-mode-symbol-regexp "\\(?:\\sw\\|\\s_\\|\\\\.\\|?\\)+") + (setq-local paragraph-ignore-fill-prefix t) + (setq-local fill-paragraph-function 'lisp-fill-paragraph) + (setq-local adaptive-fill-function #'lisp-adaptive-fill) + ;; Adaptive fill mode gets in the way of auto-fill, + ;; and should make no difference for explicit fill + ;; because lisp-fill-paragraph should do the job. + ;; I believe that newcomment's auto-fill code properly deals with it -stef + ;;(set (make-local-variable 'adaptive-fill-mode) nil) + (setq-local indent-line-function 'lisp-indent-line) + (setq-local indent-region-function 'lisp-indent-region) + (setq-local comment-indent-function #'lisp-comment-indent) + ;; (setq-local outline-regexp ";;;\\(;* [^ \t\n]\\|###autoload\\)\\|(") + (setq-local outline-level 'lisp-outline-level) + (setq-local add-log-current-defun-function #'lisp-current-defun-name) + (setq-local comment-start ";") + (setq-local comment-start-skip ";+ *") + (setq-local comment-add 1) ;default to `;;' in comment-region + (setq-local comment-column 40) + (setq-local comment-use-syntax t) + (setq-local imenu-generic-expression lisp-imenu-generic-expression) + (setq-local multibyte-syntax-as-symbol t) + + (defconst yess + (append + `((,(concat "\\(define\\)\\s-*(\\(\\_<[^ )]*\\)") + (1 font-lock-keyword-face) + (2 font-lock-function-name-face) + )) + `((,(concat "(\\s-*\\_<" + (regexp-opt + slime-built-ins) "\\_>") + (0 font-lock-keyword-face))) + `((,(concat "[`โ€˜]\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)" + lisp-mode-symbol-regexp "\\)['โ€™]") + (1 font-lock-constant-face prepend)) + ;; Constant values. + (,(concat "\\_<:" lisp-mode-symbol-regexp "\\_>") + (0 font-lock-builtin-face))) + + )) + + (setq font-lock-defaults + `((yess) + nil nil nil nil + (font-lock-mark-block-function . mark-defun) + (font-lock-extra-managed-props help-echo) + (font-lock-syntactic-face-function + . lisp-font-lock-syntactic-face-function))) + ;; (setq font-lock-defaults '((;; ads + ;; ;; lisp-el-font-lock-keywords-1 + ;; ;; lisp-el-font-lock-keywords-2 + ;; ) + ;; nil nil nil nil + ;; (font-lock-mark-block-function . mark-defun) + ;; (font-lock-extra-managed-props help-echo) + ;; (font-lock-syntactic-face-function + ;; . lisp-font-lock-syntactic-face-function))) + (setq-local prettify-symbols-alist lisp-prettify-symbols-alist) + (setq-local electric-pair-skip-whitespace 'chomp) + (setq-local electric-pair-open-newline-between-pairs nil) + + (add-hook 'after-load-functions #'elisp--font-lock-flush-elisp-buffers) + (unless noninteractive + (require 'elec-pair) + (defvar electric-pair-text-pairs) + (setq-local electric-pair-text-pairs + (append '((?\` . ?\') (?โ€˜ . ?โ€™)) electric-pair-text-pairs)) + (setq-local electric-quote-string t)) + (setq imenu-case-fold-search nil) + (add-function :before-until (local 'eldoc-documentation-function) + #'my-slime-eldoc-function) + (add-hook 'xref-backend-functions #'elisp--xref-backend nil t) + (setq-local project-vc-external-roots-function #'elisp-load-path-roots) + (add-hook 'completion-at-point-functions #'elisp-completion-at-point nil 'local) + (add-hook 'flymake-diagnostic-functions #'elisp-flymake-checkdoc nil t) + (add-hook 'flymake-diagnostic-functions #'elisp-flymake-byte-compile nil t) + (modify-syntax-entry ?\{ "(}") + (modify-syntax-entry ?\} "){") + (modify-syntax-entry ?\[ "(]") + (modify-syntax-entry ?\] ")[")) + + +(defun company-simple-backend (command &optional arg &rest ignored) + (interactive (list 'interactive)) + (cl-case command + (interactive (company-begin-backend 'company-simple-backend)) + (prefix (when (looking-back "foo\\>") + (match-string 0))) + (candidates (when (equal arg "foo") + (list "foobar" "foobaz" "foobarbaz"))) + (meta (format "This value is named %s" arg)))) + +(defun company-sample-backend (command &optional arg &rest ignored) + (interactive (list 'interactive)) + (cl-case command + (interactive (company-begin-backend 'company-sample-backend)) + (prefix (and (eq major-mode 'slime-mode) + (company-grab-symbol))) + (candidates + (remove-if-not + (lambda (c) (string-prefix-p arg c)) + slime-built-ins)) + (meta (sample-meta arg)))) + +(add-hook 'slime-mode-hook + (lambda () + (set (make-local-variable 'eldoc-documentation-function) 'my-slime-eldoc-function) + (set (make-local-variable 'company-backends) '(company-sample-backend)))) + +(provide 'slime-mode) diff --git a/manual/build.sh b/manual/build.sh index 0ab3962..ba39c84 100644 --- a/manual/build.sh +++ b/manual/build.sh @@ -1,17 +1,17 @@ -echo ================================================ -echo Starting Tex Export -echo ================================================ - -FILENAME=manual - -emacsclient -c --frame-parameters="((visibility . nil))" \ - -e "(progn (require 'org) (find-file-other-window \"$FILENAME.org\") (org-latex-export-to-latex) (save-buffers-kill-terminal))" || exit 1 - - -echo ================================================ -echo Tex Export Finished -echo ================================================ - - -latexmk -Werror -pdf -shell-escape $FILENAME.tex || exit 1 -latexmk -c $FILENAME.tex +echo ================================================ +echo Starting Tex Export +echo ================================================ + +FILENAME=manual + +emacsclient -c --frame-parameters="((visibility . nil))" \ + -e "(progn (require 'org) (find-file-other-window \"$FILENAME.org\") (org-latex-export-to-latex) (save-buffers-kill-terminal))" || exit 1 + + +echo ================================================ +echo Tex Export Finished +echo ================================================ + + +latexmk -Werror -pdf -shell-escape $FILENAME.tex || exit 1 +latexmk -c $FILENAME.tex diff --git a/manual/built-in-docs.org b/manual/built-in-docs.org index f7e22e3..9edd1f7 100644 --- a/manual/built-in-docs.org +++ b/manual/built-in-docs.org @@ -1,1896 +1,1896 @@ -#+latex: \hrule -#+html:
-* =**= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =a=, =b= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =quote= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =datum= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =load= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =file= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =type=?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =obj=, =typ= - - docu :: - #+BEGIN: -Checks if the argument =obj= is of type =typ= - #+END: -#+latex: \hrule -#+html:
-* =symbol?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a symbol. - #+END: -#+latex: \hrule -#+html:
-* =reduce-binary= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =fun=, =seq= - - docu :: - #+BEGIN: -Takes a function and a sequence as arguments and applies the -function to the argument sequence. reduce-binary applies the arguments -*pair-wise* which means it works with binary functions as compared to -[[=reduce=]]. - #+END: -#+latex: \hrule -#+html:
-* =test= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - keyword :: =k= =(101)= - - docu :: - #+BEGIN: - - #+END: -#+latex: \hrule -#+html:
-* =lambda?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a function. - #+END: -#+latex: \hrule -#+html:
-* =extend2= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =seq=, =elem= - - docu :: - #+BEGIN: -Extends a list with the given element, by putting it in -the (rest) of the last element of the sequence. - #+END: -#+latex: \hrule -#+html:
-* =length= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =seq= - - docu :: - #+BEGIN: -Returns the length of the given sequence. - #+END: -#+latex: \hrule -#+html:
-* =assert= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =test= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =memstat= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: none. - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =cond= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - rest :: =clauses= - - docu :: none -#+latex: \hrule -#+html:
-* =assert-types== - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - rest :: =objs= - - docu :: none -#+latex: \hrule -#+html:
-* =<== - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =bound?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =var= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =set-type!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =node=, =new_type= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =end= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =seq= - - docu :: - #+BEGIN: -Returns the last pair in the sqeuence. - -{{{example_start}}} -(define a (list 1 2 3 4)) -(print (end a)) -{{{example_end}}} - - #+END: -#+latex: \hrule -#+html:
-* =get-random-between= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =a=, =b= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =addr-of= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =var= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =sublist-starting-at-index= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =seq=, =index= - - docu :: none -#+latex: \hrule -#+html:
-* =increment= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =val= - - docu :: - #+BEGIN: -Adds one to the argument. - #+END: -#+latex: \hrule -#+html:
-* =%= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =a=, =b= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =hm/set!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =hm=, =key=, =value= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =begin= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =concat-strings= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =strings= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =define-module= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =module-name= - - keyword :: =imports= =(())=, =exports= - - rest :: =body= - - docu :: none -#+latex: \hrule -#+html:
-* =built-in-function?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a built-in function. - #+END: -#+latex: \hrule -#+html:
-* =zip= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =l1=, =l2= - - docu :: none -#+latex: \hrule -#+html:
-* =/= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =type= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =n= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =pe= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =expr= - - docu :: none -#+latex: \hrule -#+html:
-* =helper= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: none. - - docu :: - #+BEGIN: - - #+END: -#+latex: \hrule -#+html:
-* =if= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =test=, =then_part=, =else_part= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =apply= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =fun=, =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =delete-type!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =n= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =when= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =condition= - - rest :: =body= - - docu :: - #+BEGIN: -Special form for when multiple actions should be done if a -condition is true. - -{{{example_start}}} -(when (not ()) - (print "Hello ") - (print "from ") - (print "when!")) - -(when () - (print "Goodbye ") - (print "World!")) -{{{example_end}}} - - #+END: -#+latex: \hrule -#+html:
-* =set-cdr!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =target=, =source= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =break= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: none. - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =reduce= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =fun=, =seq= - - docu :: - #+BEGIN: -Takes a function and a sequence as arguments and applies the -function to the argument sequence. This only works correctly if the -given function accepts a variable amount of parameters. If your -funciton is limited to two arguments, use [[=reduce-binary=]] -instead. - #+END: -#+latex: \hrule -#+html:
-* =<= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =mutate= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =target=, =source= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =set-car!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =target=, =source= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =string?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a string. - #+END: -#+latex: \hrule -#+html:
-* =generic-extend= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =args= - - rest :: =body= - - docu :: none -#+latex: \hrule -#+html:
-* =range-while= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - keyword :: =from= =(0)=, =to= - - docu :: - #+BEGIN: -Returns a sequence of numbers starting with the number defined -by the key 'from' and ends with the number defined in 'to'. - #+END: -#+latex: \hrule -#+html:
-* === - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -Takes 0 or more arguments and returns =t= if all arguments are equal and =()= otherwise. - #+END: -#+latex: \hrule -#+html:
-* =info= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =n= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =*= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =define-syntax= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =form= - - keyword :: =doc= =("")= - - rest :: =body= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =vector-ref= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =vec=, =idx= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =let= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =bindings= - - rest :: =body= - - docu :: none -#+latex: \hrule -#+html:
-* =null?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is =nil=. - #+END: -#+latex: \hrule -#+html:
-* =list-without-index= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =seq=, =index= - - docu :: none -#+latex: \hrule -#+html:
-* =vector-length= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =v= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =print= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - keyword :: =sep= =(" ")=, =end= =("\n")= - - rest :: =things= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =symbol->keyword= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =sym= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =stream-null?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =s= - - docu :: none -#+latex: \hrule -#+html:
-* =types=?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - rest :: =objs= - - docu :: none -#+latex: \hrule -#+html:
-* =special-lambda?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a special-lambda. - #+END: -#+latex: \hrule -#+html:
-* =not= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =test= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =generate-docs= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =file_name= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =hm/get-or-nil= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =hm=, =key= - - docu :: none -#+latex: \hrule -#+html:
-* =the-empty-stream= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:constructor= - - value :: =()= - - docu :: none -#+latex: \hrule -#+html:
-* =force= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =promise= - - docu :: none -#+latex: \hrule -#+html:
-* =>== - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =hash-map-get= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =hm=, =key= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =exit= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - keyword :: =code= =(0)= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =hm/get= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =hm=, =key= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =n-times= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =times=, =action= - - docu :: - #+BEGIN: -Executes action times times. - #+END: -#+latex: \hrule -#+html:
-* =keyword?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a keyword. - #+END: -#+latex: \hrule -#+html:
-* =range= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - keyword :: =from= =(0)=, =to= - - docu :: - #+BEGIN: -Returns a sequence of numbers starting with the number defined -by the key =from= and ends with the number defined in =to=. - #+END: -#+latex: \hrule -#+html:
-* =vector-set!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =vec=, =idx=, =val= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =pair= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =car=, =cdr= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =mem-reset= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: none. - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =delay= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =expr= - - docu :: none -#+latex: \hrule -#+html:
-* =define-typed= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =args= - - rest :: =body= - - docu :: none -#+latex: \hrule -#+html:
-* =pair?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a pair. - #+END: -#+latex: \hrule -#+html:
-* =unzip= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =lists= - - docu :: none -#+latex: \hrule -#+html:
-* =number?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a number. - #+END: -#+latex: \hrule -#+html:
-* =-= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =extend= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =seq=, =elem= - - docu :: - #+BEGIN: -Extends a list with the given element, by putting it in -the (rest) of the last element of the sequence. - #+END: -#+latex: \hrule -#+html:
-* =enumerate= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =seq= - - docu :: none -#+latex: \hrule -#+html:
-* =hash-map-set!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =hm=, =key=, =value= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =or= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =rest= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =seq= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =construct-list= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - rest :: =body= - - docu :: - #+BEGIN: - -{{{example_start}}} -(construct-list - i <- '(1 2 3 4 5) - yield (* i i)) -{{{example_end}}} - -(construct-list - i <- '(1 2 3 4) - j <- '(A B) - yield (pair i j)) - -(construct-list - i <- '(1 2 3 4 5 6 7 8) - if (= 0 (% i 2)) - yield i) - - #+END: -#+latex: \hrule -#+html:
-* =last= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =seq= - - docu :: - #+BEGIN: -Returns the (first) of the last (pair) of the given sequence. - -{{{example_start}}} -(define a (list 1 2 3 4)) -(print (last a)) -{{{example_end}}} - - #+END: -#+latex: \hrule -#+html:
-* =append= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =seq=, =elem= - - docu :: - #+BEGIN: -Appends an element to a sequence, by extendeing the list -with (pair elem nil). - #+END: -#+latex: \hrule -#+html:
-* =>= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =set!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =sym=, =val= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =create-hash-map= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: none. - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =first= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =seq= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =show= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =n= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =macro?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a macro. - #+END: -#+latex: \hrule -#+html:
-* =procedure?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: none -#+latex: \hrule -#+html:
-* =member?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =elem=, =seq= - - docu :: none -#+latex: \hrule -#+html:
-* =read= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - keyword :: =prompt= =(">")= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =unless= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =condition= - - rest :: =body= - - docu :: - #+BEGIN: -Special form for when multiple actions should be done if a -condition is false. - #+END: -#+latex: \hrule -#+html:
-* =eval= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =expr= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =vector= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =symbol->string= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =sym= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =map= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =fun=, =seq= - - docu :: - #+BEGIN: -Takes a function and a sequence as arguments and returns a new -sequence which contains the results of using the first sequences -elemens as argument to that function. - #+END: -#+latex: \hrule -#+html:
-* =filter= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =fun=, =seq= - - docu :: - #+BEGIN: -Takes a function and a sequence as arguments and applies the -function to every value in the sequence. If the result of that -funciton application returns a truthy value, the original value is -added to a list, which in the end is returned. - #+END: -#+latex: \hrule -#+html:
-* =hash-map-delete!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =hm=, =key= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =mytry= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =try_part=, =catch_part= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =string->symbol= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =str= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =decrement= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =val= - - docu :: - #+BEGIN: -Subtracts one from the argument. - #+END: -#+latex: \hrule -#+html:
-* =+= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =lambda= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =args= - - rest :: =body= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =error= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =type=, =message= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =case= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =var= - - rest :: =clauses= - - docu :: none -#+latex: \hrule -#+html:
-* =continuation?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Checks if the argument is a continuation. - #+END: -#+latex: \hrule -#+html:
-* =and= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =copy= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =obj= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =define= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =definee= - - keyword :: =doc= =("")= - - rest :: =body= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =quasiquote= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =expr= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =list= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - rest :: =args= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =import= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:cfunction= - - arguments :: - - postitional :: =f= - - docu :: - #+BEGIN: -TODO - #+END: -#+latex: \hrule -#+html:
-* =ds::alist::make= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: none. - - docu :: none -#+latex: \hrule -#+html:
-* =ds::alist::print= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =alist= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::alist::find= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =alist=, =key= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::alist::remove!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =alist=, =key= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::alist::set-overwrite!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =alist=, =key=, =value= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::plist::print= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =plist= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::plist::find= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =plist=, =prop= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::plist::remove!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =plist=, =prop= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::plist::set-overwrite!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =plist=, =prop=, =value= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::alist::get= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =alist=, =key= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::alist::key-exists?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =alist=, =key= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::alist::set!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =alist=, =key=, =value= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::plist::make= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: none. - - docu :: none -#+latex: \hrule -#+html:
-* =ds::plist::get= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =plist=, =prop= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::plist::prop-exists?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =plist=, =prop= - - docu :: none -#+latex: \hrule -#+html:
-* =ds::plist::set!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =plist=, =prop=, =value= - - docu :: none -#+latex: \hrule -#+html:
-* =automata::make-dfa= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =Q=, =S=, =delta=, =q0=, =F= - - docu :: none -#+latex: \hrule -#+html:
-* =interpolation::lerper= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =a=, =b= - - docu :: none -#+latex: \hrule -#+html:
-* =interpolation::point-lerp= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =p1=, =p2=, =t= - - docu :: none -#+latex: \hrule -#+html:
-* =interpolation::bezier2= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =p1=, =p2=, =p3=, =t= - - docu :: none -#+latex: \hrule -#+html:
-* =interpolation::lerp= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =a=, =b=, =t= - - docu :: none -#+latex: \hrule -#+html:
-* =interpolation::stepped-lerper= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =a=, =b=, =#steps= - - docu :: none -#+latex: \hrule -#+html:
-* =interpolation::point-lerper= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =p1=, =p2= - - docu :: none -#+latex: \hrule -#+html:
-* =interpolation::bezierer2= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =p1=, =p2=, =p3= - - docu :: none -#+latex: \hrule -#+html:
-* =define-class= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =name-and-members= - - rest :: =body= - - docu :: none -#+latex: \hrule -#+html:
-* =->= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:macro= - - arguments :: - - postitional :: =obj=, =meth= - - rest :: =args= - - docu :: none -#+latex: \hrule -#+html:
-* =math::pi= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:number= - - value :: =3.141593= - - docu :: none -#+latex: \hrule -#+html:
-* =math::abs= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Accepts one argument and returns the absoulte value of it - #+END: -#+latex: \hrule -#+html:
-* =math::sqrt= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x= - - docu :: - #+BEGIN: -Accepts one argument and returns the square root of it - #+END: -#+latex: \hrule -#+html:
-* =math::make-vector3= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =x=, =y=, =z= - - docu :: none -#+latex: \hrule -#+html:
-* =set::make= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - rest :: =vals= - - docu :: none -#+latex: \hrule -#+html:
-* =set::find= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =set=, =val= - - docu :: none -#+latex: \hrule -#+html:
-* =set::contains?= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =set=, =val= - - docu :: none -#+latex: \hrule -#+html:
-* =set::insert!= - :PROPERTIES: - :UNNUMBERED: t - :END: - - type :: =:lambda= - - arguments :: - - postitional :: =set=, =value= - - docu :: none +#+latex: \hrule +#+html:
+* =**= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =a=, =b= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =quote= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =datum= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =load= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =file= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =type=?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =obj=, =typ= + - docu :: + #+BEGIN: +Checks if the argument =obj= is of type =typ= + #+END: +#+latex: \hrule +#+html:
+* =symbol?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a symbol. + #+END: +#+latex: \hrule +#+html:
+* =reduce-binary= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =fun=, =seq= + - docu :: + #+BEGIN: +Takes a function and a sequence as arguments and applies the +function to the argument sequence. reduce-binary applies the arguments +*pair-wise* which means it works with binary functions as compared to +[[=reduce=]]. + #+END: +#+latex: \hrule +#+html:
+* =test= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - keyword :: =k= =(101)= + - docu :: + #+BEGIN: + + #+END: +#+latex: \hrule +#+html:
+* =lambda?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a function. + #+END: +#+latex: \hrule +#+html:
+* =extend2= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =seq=, =elem= + - docu :: + #+BEGIN: +Extends a list with the given element, by putting it in +the (rest) of the last element of the sequence. + #+END: +#+latex: \hrule +#+html:
+* =length= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =seq= + - docu :: + #+BEGIN: +Returns the length of the given sequence. + #+END: +#+latex: \hrule +#+html:
+* =assert= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =test= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =memstat= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: none. + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =cond= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - rest :: =clauses= + - docu :: none +#+latex: \hrule +#+html:
+* =assert-types== + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - rest :: =objs= + - docu :: none +#+latex: \hrule +#+html:
+* =<== + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =bound?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =var= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =set-type!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =node=, =new_type= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =end= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =seq= + - docu :: + #+BEGIN: +Returns the last pair in the sqeuence. + +{{{example_start}}} +(define a (list 1 2 3 4)) +(print (end a)) +{{{example_end}}} + + #+END: +#+latex: \hrule +#+html:
+* =get-random-between= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =a=, =b= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =addr-of= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =var= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =sublist-starting-at-index= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =seq=, =index= + - docu :: none +#+latex: \hrule +#+html:
+* =increment= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =val= + - docu :: + #+BEGIN: +Adds one to the argument. + #+END: +#+latex: \hrule +#+html:
+* =%= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =a=, =b= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =hm/set!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =hm=, =key=, =value= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =begin= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =concat-strings= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =strings= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =define-module= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =module-name= + - keyword :: =imports= =(())=, =exports= + - rest :: =body= + - docu :: none +#+latex: \hrule +#+html:
+* =built-in-function?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a built-in function. + #+END: +#+latex: \hrule +#+html:
+* =zip= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =l1=, =l2= + - docu :: none +#+latex: \hrule +#+html:
+* =/= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =type= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =n= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =pe= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =expr= + - docu :: none +#+latex: \hrule +#+html:
+* =helper= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: none. + - docu :: + #+BEGIN: + + #+END: +#+latex: \hrule +#+html:
+* =if= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =test=, =then_part=, =else_part= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =apply= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =fun=, =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =delete-type!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =n= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =when= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =condition= + - rest :: =body= + - docu :: + #+BEGIN: +Special form for when multiple actions should be done if a +condition is true. + +{{{example_start}}} +(when (not ()) + (print "Hello ") + (print "from ") + (print "when!")) + +(when () + (print "Goodbye ") + (print "World!")) +{{{example_end}}} + + #+END: +#+latex: \hrule +#+html:
+* =set-cdr!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =target=, =source= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =break= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: none. + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =reduce= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =fun=, =seq= + - docu :: + #+BEGIN: +Takes a function and a sequence as arguments and applies the +function to the argument sequence. This only works correctly if the +given function accepts a variable amount of parameters. If your +funciton is limited to two arguments, use [[=reduce-binary=]] +instead. + #+END: +#+latex: \hrule +#+html:
+* =<= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =mutate= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =target=, =source= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =set-car!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =target=, =source= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =string?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a string. + #+END: +#+latex: \hrule +#+html:
+* =generic-extend= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =args= + - rest :: =body= + - docu :: none +#+latex: \hrule +#+html:
+* =range-while= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - keyword :: =from= =(0)=, =to= + - docu :: + #+BEGIN: +Returns a sequence of numbers starting with the number defined +by the key 'from' and ends with the number defined in 'to'. + #+END: +#+latex: \hrule +#+html:
+* === + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +Takes 0 or more arguments and returns =t= if all arguments are equal and =()= otherwise. + #+END: +#+latex: \hrule +#+html:
+* =info= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =n= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =*= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =define-syntax= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =form= + - keyword :: =doc= =("")= + - rest :: =body= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =vector-ref= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =vec=, =idx= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =let= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =bindings= + - rest :: =body= + - docu :: none +#+latex: \hrule +#+html:
+* =null?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is =nil=. + #+END: +#+latex: \hrule +#+html:
+* =list-without-index= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =seq=, =index= + - docu :: none +#+latex: \hrule +#+html:
+* =vector-length= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =v= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =print= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - keyword :: =sep= =(" ")=, =end= =("\n")= + - rest :: =things= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =symbol->keyword= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =sym= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =stream-null?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =s= + - docu :: none +#+latex: \hrule +#+html:
+* =types=?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - rest :: =objs= + - docu :: none +#+latex: \hrule +#+html:
+* =special-lambda?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a special-lambda. + #+END: +#+latex: \hrule +#+html:
+* =not= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =test= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =generate-docs= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =file_name= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =hm/get-or-nil= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =hm=, =key= + - docu :: none +#+latex: \hrule +#+html:
+* =the-empty-stream= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:constructor= + - value :: =()= + - docu :: none +#+latex: \hrule +#+html:
+* =force= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =promise= + - docu :: none +#+latex: \hrule +#+html:
+* =>== + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =hash-map-get= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =hm=, =key= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =exit= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - keyword :: =code= =(0)= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =hm/get= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =hm=, =key= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =n-times= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =times=, =action= + - docu :: + #+BEGIN: +Executes action times times. + #+END: +#+latex: \hrule +#+html:
+* =keyword?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a keyword. + #+END: +#+latex: \hrule +#+html:
+* =range= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - keyword :: =from= =(0)=, =to= + - docu :: + #+BEGIN: +Returns a sequence of numbers starting with the number defined +by the key =from= and ends with the number defined in =to=. + #+END: +#+latex: \hrule +#+html:
+* =vector-set!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =vec=, =idx=, =val= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =pair= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =car=, =cdr= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =mem-reset= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: none. + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =delay= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =expr= + - docu :: none +#+latex: \hrule +#+html:
+* =define-typed= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =args= + - rest :: =body= + - docu :: none +#+latex: \hrule +#+html:
+* =pair?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a pair. + #+END: +#+latex: \hrule +#+html:
+* =unzip= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =lists= + - docu :: none +#+latex: \hrule +#+html:
+* =number?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a number. + #+END: +#+latex: \hrule +#+html:
+* =-= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =extend= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =seq=, =elem= + - docu :: + #+BEGIN: +Extends a list with the given element, by putting it in +the (rest) of the last element of the sequence. + #+END: +#+latex: \hrule +#+html:
+* =enumerate= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =seq= + - docu :: none +#+latex: \hrule +#+html:
+* =hash-map-set!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =hm=, =key=, =value= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =or= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =rest= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =seq= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =construct-list= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - rest :: =body= + - docu :: + #+BEGIN: + +{{{example_start}}} +(construct-list + i <- '(1 2 3 4 5) + yield (* i i)) +{{{example_end}}} + +(construct-list + i <- '(1 2 3 4) + j <- '(A B) + yield (pair i j)) + +(construct-list + i <- '(1 2 3 4 5 6 7 8) + if (= 0 (% i 2)) + yield i) + + #+END: +#+latex: \hrule +#+html:
+* =last= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =seq= + - docu :: + #+BEGIN: +Returns the (first) of the last (pair) of the given sequence. + +{{{example_start}}} +(define a (list 1 2 3 4)) +(print (last a)) +{{{example_end}}} + + #+END: +#+latex: \hrule +#+html:
+* =append= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =seq=, =elem= + - docu :: + #+BEGIN: +Appends an element to a sequence, by extendeing the list +with (pair elem nil). + #+END: +#+latex: \hrule +#+html:
+* =>= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =set!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =sym=, =val= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =create-hash-map= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: none. + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =first= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =seq= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =show= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =n= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =macro?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a macro. + #+END: +#+latex: \hrule +#+html:
+* =procedure?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: none +#+latex: \hrule +#+html:
+* =member?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =elem=, =seq= + - docu :: none +#+latex: \hrule +#+html:
+* =read= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - keyword :: =prompt= =(">")= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =unless= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =condition= + - rest :: =body= + - docu :: + #+BEGIN: +Special form for when multiple actions should be done if a +condition is false. + #+END: +#+latex: \hrule +#+html:
+* =eval= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =expr= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =vector= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =symbol->string= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =sym= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =map= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =fun=, =seq= + - docu :: + #+BEGIN: +Takes a function and a sequence as arguments and returns a new +sequence which contains the results of using the first sequences +elemens as argument to that function. + #+END: +#+latex: \hrule +#+html:
+* =filter= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =fun=, =seq= + - docu :: + #+BEGIN: +Takes a function and a sequence as arguments and applies the +function to every value in the sequence. If the result of that +funciton application returns a truthy value, the original value is +added to a list, which in the end is returned. + #+END: +#+latex: \hrule +#+html:
+* =hash-map-delete!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =hm=, =key= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =mytry= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =try_part=, =catch_part= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =string->symbol= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =str= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =decrement= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =val= + - docu :: + #+BEGIN: +Subtracts one from the argument. + #+END: +#+latex: \hrule +#+html:
+* =+= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =lambda= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =args= + - rest :: =body= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =error= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =type=, =message= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =case= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =var= + - rest :: =clauses= + - docu :: none +#+latex: \hrule +#+html:
+* =continuation?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Checks if the argument is a continuation. + #+END: +#+latex: \hrule +#+html:
+* =and= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =copy= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =obj= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =define= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =definee= + - keyword :: =doc= =("")= + - rest :: =body= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =quasiquote= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =expr= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =list= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - rest :: =args= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =import= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:cfunction= + - arguments :: + - postitional :: =f= + - docu :: + #+BEGIN: +TODO + #+END: +#+latex: \hrule +#+html:
+* =ds::alist::make= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: none. + - docu :: none +#+latex: \hrule +#+html:
+* =ds::alist::print= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =alist= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::alist::find= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =alist=, =key= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::alist::remove!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =alist=, =key= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::alist::set-overwrite!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =alist=, =key=, =value= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::plist::print= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =plist= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::plist::find= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =plist=, =prop= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::plist::remove!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =plist=, =prop= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::plist::set-overwrite!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =plist=, =prop=, =value= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::alist::get= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =alist=, =key= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::alist::key-exists?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =alist=, =key= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::alist::set!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =alist=, =key=, =value= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::plist::make= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: none. + - docu :: none +#+latex: \hrule +#+html:
+* =ds::plist::get= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =plist=, =prop= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::plist::prop-exists?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =plist=, =prop= + - docu :: none +#+latex: \hrule +#+html:
+* =ds::plist::set!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =plist=, =prop=, =value= + - docu :: none +#+latex: \hrule +#+html:
+* =automata::make-dfa= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =Q=, =S=, =delta=, =q0=, =F= + - docu :: none +#+latex: \hrule +#+html:
+* =interpolation::lerper= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =a=, =b= + - docu :: none +#+latex: \hrule +#+html:
+* =interpolation::point-lerp= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =p1=, =p2=, =t= + - docu :: none +#+latex: \hrule +#+html:
+* =interpolation::bezier2= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =p1=, =p2=, =p3=, =t= + - docu :: none +#+latex: \hrule +#+html:
+* =interpolation::lerp= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =a=, =b=, =t= + - docu :: none +#+latex: \hrule +#+html:
+* =interpolation::stepped-lerper= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =a=, =b=, =#steps= + - docu :: none +#+latex: \hrule +#+html:
+* =interpolation::point-lerper= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =p1=, =p2= + - docu :: none +#+latex: \hrule +#+html:
+* =interpolation::bezierer2= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =p1=, =p2=, =p3= + - docu :: none +#+latex: \hrule +#+html:
+* =define-class= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =name-and-members= + - rest :: =body= + - docu :: none +#+latex: \hrule +#+html:
+* =->= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:macro= + - arguments :: + - postitional :: =obj=, =meth= + - rest :: =args= + - docu :: none +#+latex: \hrule +#+html:
+* =math::pi= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:number= + - value :: =3.141593= + - docu :: none +#+latex: \hrule +#+html:
+* =math::abs= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Accepts one argument and returns the absoulte value of it + #+END: +#+latex: \hrule +#+html:
+* =math::sqrt= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x= + - docu :: + #+BEGIN: +Accepts one argument and returns the square root of it + #+END: +#+latex: \hrule +#+html:
+* =math::make-vector3= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =x=, =y=, =z= + - docu :: none +#+latex: \hrule +#+html:
+* =set::make= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - rest :: =vals= + - docu :: none +#+latex: \hrule +#+html:
+* =set::find= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =set=, =val= + - docu :: none +#+latex: \hrule +#+html:
+* =set::contains?= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =set=, =val= + - docu :: none +#+latex: \hrule +#+html:
+* =set::insert!= + :PROPERTIES: + :UNNUMBERED: t + :END: + - type :: =:lambda= + - arguments :: + - postitional :: =set=, =value= + - docu :: none diff --git a/manual/manual.html b/manual/manual.html index c59f731..cc08864 100644 --- a/manual/manual.html +++ b/manual/manual.html @@ -1,3236 +1,3236 @@ - - - -The Slime 1.0 Manual - - - - - - - - - - - - - - - - -
-

The Slime 1.0 Manual

-
-

-abstract -

- -
- -

-\tableofcontents -

- -
-

1 Lisp languages

-
-

-Lisp is not one language but rather a family of programming languages. The family is devided by some -characteristics. There are Lisp-1 and Lisp-2 dialects and there is a difference between a Lisp with -lexical scoping as opposed to dynamic scoping. These differences will be explained in later -sections. -

- -

-Like most Lisps, Slime is dynamically typed. That means that like in statically typed Languages -Slime has different data types, but they are associated not with variables but with the Lisp objects -themselves. Variables can be assigend Lisp objects of any internal type. -

- -

-The Lisp language family is known to be highly flexible and applicable in all areas by creating -domain specific languages in Lisp itself through a powerful macro system. The central data structure -in Lisp is the list. The reason why lisp is so powerful is because the program source code itself is -represented as lists. The nested lists make up the syntax tree of the lisp program. It is therfore -computationally easy to parse lisp programs as the source code itself is already structured in the -form of the syntax tree; allowing for parsing in linear time. -

- -

-The macro system in Slime works by recognizing macros at parse-time and running them, and replacing -the macro call in the program code with the return value of the macro and then checking if further -macros have to be expanded in the replaced code. Therefore the macros can be used to pre-compute -values or rewrite expressions (creating syntactic sugar) or themselves define macros. -

-
-
- -
-

2 Lists

-
-

-As mentioned in Lisp languages, the central data structure in all Lisps is the list. Lists are -implemented as singly linked lists, made up of pairs (historically called cons-cells), each pair -has two slots, the first and the rest (historically car and cdr). A linked lsit ist then -constructed by the convention that the first field of a pair points to the first element of the -list and the rest field points to the rest of the list. Following this description, the list is a -recursive data structure. For the end of the list a special value nil is used in the rest field. -

- -

-A helpful way to visualize lists made up of pairs is using box diagrams. A simple box diagram can be -seen in 1. Each rectangle is divided in two. The left part represents the first -field, the right part represents the rest. The arrows point to the values in these fields. -

- -

-The diagram in 1 shows a simple list containing the values 1, 2 and 3. The first pair -stores the number 1 its first field and the rest points to the rest of the list. The last pair -points to the special value nil in its rest to denote the end of the list. -

- -

-diagrams/list123.eps -

- - -

-However the rest of a pair needs not to be a pair or nil, it could also point to any other value. -By doing this the list is no longer "well formed" but rather "ill formed". Ill formed lsits can be -used as an optimization when using the list for storing data. In 2 an ill formed list -can be seen, that also contains the values 1, 2 and 3 but stores them using only two pairs instead -of 3. -

- -

-diagrams/list12.3.eps -

-
- -
-

2.1 representing lists in Lisp

-
-

-In Slime and in most Lisps, lists are represented using round parenthesis where ( denotes the -start of the list and ) denotes the end. Eeach element inside these parenthesis separated by one -or more spaces will be interpreted as an element of that list. For example the list from -1 would be represented as (1 2 3). During parse time, the Lisp parser transforms -the parenthesised list into the pairs that are in the end stored in memory. -

- -

-To also be able to represent ill formed lists in Lisp there is a special syntax using the . (dot -symbol). If the parser encounters a . inside of a list, it will treat the next element as the -rest. If there is no or more than one element after the . an parsing error will be thrown. Using -this syntax we can represent the ill formed list from 2 as (1 2 . 3). We can also -write well formed lists using the dot notation if we point the rest to another list. So the well -formed list from 1 can also be written as \[\texttt{(1 . (2 . (3)))}\] -

-
-
- -
-

2.2 representing function calls in Lisp

-
-

-If we tried to enter the Lisp representation of the lists like (1 2 3) discussed in representing lists in Lisp directly into an Lisp interpreter we would get an error. That doesn't mean that the -explanation given in the section is wrong, it is in fact correct: the lisp parser will transform the -lisp syntax into the pairs in memory. The reason we would get an error is, that when reading Lisp -code, the Lisp interpreter first parses the code and then tries to evaluate it and return the result -back to the user. -

- -

-In Lisp by default, a list corresponds to a function call. As mentioned in Lisp languages Lisp -represents lists and Lisp programms as lists. If a list is treated as a function call, the first -element will be treated as the function and the rest of the elements will be the arguments to that -function. If we would wnter (1 2 3) directly into the Lisp interpreter we would get an error -saying it cannot find the function 1. -

- -

-If we would want to compute the sum of the numbers 5 and 3 we could do this by invoking the + -function with 5 and 3 as its arguments. (+ 5 3) will evaluate to 8. We can also nest functions -calls and use the return values as parameters to other functions: (+ (- 12 4) (/ 24 4)) will -evaluate to 14. The box diagramm showing the internal structure of that computation can be seen in -3. -

- -

-diagrams/simpleMath.eps -

-
-
-
- -
-

3 Evaluation order

-
-

-As a first step of evaluation of a regular function, all its arguments are getting evaluated, and -then the function is applied to the evaluated arguments. For example when evaluating the nested -expression in 1 the outermost function is the + function with three arguments: (* -3 4), (- 100 (+ 12 13 14 15)) and 2. So before the outhermost + gets invoked, the three -arguments are getting evaluated recursively. -

- -
- -
(print (+ (* 3 4)
-          (- 100 (+ 12 13 14 15))
-          2))
-
-
- -
-evaluates to =>
-60
-
-
-
- -
-

3.1 Special forms

-
-

-The given evaluation rule – to evaluate all the arguments first and then allpying them to the -funciton – as described in Evaluation order is only valid for regular functions. There is a class -of functions that do not follow this evaluation rule called special forms. Special forms are -needed when you do not wish to evaluate all arguments. For example the built-in if function should -only evaluate the "then-expression" if the condition evaluates to a truthy value and not otherwise. -Consider the example in 2. The if expression only evaluates the then-expression. If -the if function would follow the evaluation order of regular functions, first all three arguments -(< 1 2), (print "I knew it!!\n") but also (print "Oh, it is not?!\n") could get evaluated and -so both messages would be printed. In the given if expression, the condition evaluates to a truthy -value and only I knew it!! will be printed. -

- -
- -
(if (< 1 2)
-    (print "I knew it!!\n")
-  (print "Oh, it is not?!\n"))
-
-
- -
-evaluates to =>
-I knew it!!
-
-
- -

-The programmer can also define their own special forms using special-lambda and macros, which will -be explained in Special lambdas and Macros. -

-
-
-
- -
-

4 Symbols and keywords

-
-
-

5 Truthyness

-
-
-

6 Lambdas

-
-

-Slime allows for creating anonymous functions called lambdas. We did not talk about binding -variables, we will do this in Define, but we can still use lambdas now. Remember that Lisp -interpretes the first argument of a list in the source code as a function and the rest as the -arguments. The lambda special form evaluates to a regular function object that can then stand in -the first position of the function call list. The basic syntax for the lambda special form is: -\[\texttt{(lambda (arg1 arg2 ...) (body1) ...)}\] the first arguemnt to lambda is a list of the -arguments. All the following arguments will be the body of the lambda. They will be executed when -the lambda is invoked. The return value of a lambda is the value of the last evaluated expression in -the body. -

- -

-Probably the simplest function to write as a lambda is the identity function. It takes one argument -and returns it. The identity lambda and a few other simple examples of lambdas can be seen in -3. -

- -
- -
(printf ((lambda (x) x) 1))
-(printf ((lambda (x y) (+ x y)) 3 5))
-(printf ((lambda (x y z) (list x y z)) 1 2 3))
-
-
- -
-evaluates to =>
-1
-8
-(1 2 3)
-
-
- -

-Additionally Slime lambdas have the possibility to take optional arguments in the form of keyword -arguemnts as well as a rest argument which allows for accepting any number of arguments. Since -these concepts are most useful when the function is actually bound to a variable, they will be -introduced when we learned how to do that in Define. -

-
- -
-

6.1 Special lambdas

-
-

-The lambda special form creates a function object that represents a regular function. So the basic -evaluation rules count: when the lambda is invoked all it's arguments are evaluated and then the -lambda is applied to the evaluated arguments. If this is not wanted in some rare cases, the -programmer also has the possibility to define a special form using special-lambda, which, when -invoked does not evaluare any argument. The programmer has to evaluate the arguments in the body -themselves using eval. The rest of the syntax between lambda and special-lambda are the same. -

- -
- -
((lambda         (x) (printf x)) (+ 1 2))
-((special-lambda (x) (printf x)) (+ 1 2))
-
-;; Special lambdas make it possible to write
-;; code that inspects code
-((special-lambda (expr)
-     (printf "The function to be called is"
-             (first expr)
-             "and the result is"
-             (eval expr)))
- (+ 1 2))
-
-
- -
-evaluates to =>
-3
-(+ 1 2)
-The function to be called is + and the result is 3.
-
-
-
-
-
- -
-

7 Define

-
-

-To assign a value to a symbol you can use the define built-in special form. The syntax for -define is: \[\texttt{(define symbol value)}\] and some usages can be seen in -5. -

- -
- -
(define var1 1)
-(define var2 "Hello World")
-(define var3 (+ 1 2))
-
-(printf var1 var2 var3)
-
-
- -
-evaluates to =>
-1 Hello World 3
-
-
-
- -
-

7.1 Defining functions

-
-

-In Lambdas we learned how to create function objects using the lambda built-in form. Using -define every Lisp Object can be assigned to a symbol making no exception for the function objects. -In 6 you can see what that would look like. -

- -
- -
(define hypothenuse
-  (lambda (a b)
-    (** (+ (* a a) (* b b)) 0.5)))
-
-(printf (hypothenuse 3 4))
-
-
- -
-evaluates to =>
-5
-
-
- -

-Since defining functions is so common, there is a syntactic shorthand that does not require to write -out the whole lambda definition. In this case the first argument to the call to define is a -list. The frist element of the list is the name of the function to define and the other elemens are -the arguments to that function. An example can be seen in 7. Note that the -definition looks like a call to the function we are constructing, making it easier to see what a -call to that function will look like. -

- -
- -
(define (hypothenuse a b)
-  (** (+ (* a a) (* b b)) 0.5))
-
-(printf (hypothenuse 3 4))
-
-
- -
-evaluates to =>
-5
-
-
-
-
- -
-

7.2 Functions with keyword arguments

-
-

-A sometimes more convenient way of passing arguments to a function is using keyword arguments. Using -keyword arguments a function call could look like this: \[\texttt{(function :arg1 value1 :arg2 -value2)}\] here the function accepts two arguments named arg1 and arg2. The user of this -function can see more clearly excatly which argument will be assigned wich value. This notation also -allows for switching the argument order. The following function call is equivalent to the call -above. \[\texttt{(function :arg2 value2 :arg1 value1)}\]. -

- -

-For this to work however, the function must be defined to accept these keyword arguments. To do this -the special marker :keys has to be inserted into the argument list of a lambda or a function -define. All following arguments must be supplied as keyword arguments, unless they are also -supplied with a default value, in which case they do not need to be supplied. To attach a default -value to a keyword argument, insert :defaults-to <value> after the keyword argument name. An -example of all of this can be seen in 8. Important note: keyword arguments must be -defined and supplied after all the regular arguments. -

- -
- -
(define (complex required1 required2 :keys
-                 key1
-                 key2 :defaults-to 3
-                 key3)
-  (* (+ required1 required2)
-     key1
-     key2
-     key3))
-
-(printf (complex 1 2 :key1 2 :key2 2 :key3 3))
-(printf (complex 1 2 :key1 2 :key3 3))
-(printf (complex 1 2 :key3 3 :key1 2))
-
-
- -
-evaluates to =>
-36
-54
-54
-
-
-
-
- -
-

7.3 Functions with rest arguments

-
-

-If the programmer wants to create a function that can accept any number of arguments, they can use -the rest argument. It is defined after the special marker :rest and after the rest argument, no -other arguments can be defined. In the execution of the fuction, the rest arguent will be assigned -to a list containing all the supplied values. The rest argument can be used in conjunction with the -other argument types, regular arguments and keyword arguments. -

- -
- -
(define (execute-operation operation
-                           :keys
-                           do-logging :defaults-to ()
-                           :rest values)
-  (define result (apply operation values))
-  (when do-logging
-    (printf "Executing operation"
-            operation
-            "agains the values"
-            values
-            "yielded:"
-            result))
-  result)
-
-(printf (execute-operation '+ 1 2 3))
-(printf (execute-operation '*
-                           :do-logging t
-                           10 11))
-
-
- -
-evaluates to =>
-6
-Executing operation * agains values (10 11) yielded: 110
-110
-
-
-
-
-
- -
-

8 Environments

-
-
-

9 Macros

-
-
-

Built-in functions

-
-
-
-
-

continuation?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a continuation. -

-
-
-
-
-
-
-

=

-
-
-
type
:cfunction -
-
docu

-Takes 0 or more arguments and returns t if all arguments are equal and () otherwise. -

-
-
-
-
-
-
-

+

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

get-random-between

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

lambda

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

info

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

addr-of

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

type?=

-
-
-
type
:lambda -
-
arguments
-
postitional
obj, typ -
-
-
-
docu

-Checks if the argument obj is of type typ -

-
-
-
-
-
-
-

symbol?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a symbol. -

-
-
-
-
-
-
-

macro?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a macro. -

-
-
-
-
-
-
-

procedure?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu
none -
-
-
-
-
-
-

rest

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

type

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

print

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

import

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

symbol->keyword

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

pe

-
-
-
type
:macro -
-
arguments
-
postitional
expr -
-
-
-
docu
none -
-
-
-
-
-
-

stream-null?

-
-
-
type
:lambda -
-
arguments
-
postitional
s -
-
-
-
docu
none -
-
-
-
-
-
-

construct-list

-
-
-
type
:macro -
-
arguments
-
rest
body -
-
-
-
docu
- -
(construct-list
-  i <- '(1 2 3 4 5)
-  yield (* i i))
-
-
- -

-(construct-list - i <- '(1 2 3 4) - j <- '(A B) - yield (pair i j)) -

- -

-(construct-list - i <- '(1 2 3 4 5 6 7 8) - if (= 0 (% i 2)) - yield i) -

-
-
-
-
-
-
-

define

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

vector-length

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

/

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

quasiquote

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

or

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

list

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

zip

-
-
-
type
:lambda -
-
arguments
-
postitional
l1, l2 -
-
-
-
docu
none -
-
-
-
-
-
-

generic-extend

-
-
-
type
:macro -
-
arguments
-
postitional
args -
-
rest
body -
-
-
-
docu
none -
-
-
-
-
-
-

pair?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a pair. -

-
-
-
-
-
-
-

end

-
-
-
type
:lambda -
-
arguments
-
postitional
seq -
-
-
-
docu

-Returns the last pair in the sqeuence. -

- -
- -
(define a (list 1 2 3 4))
-(print (end a))
-
-
-
-
-
-
-
-
-

decrement

-
-
-
type
:lambda -
-
arguments
-
postitional
val -
-
-
-
docu

-Subtracts one from the argument. -

-
-
-
-
-
-
-

range-while

-
-
-
type
:lambda -
-
arguments
-
keyword
from (0), to -
-
-
-
docu

-Returns a sequence of numbers starting with the number defined -by the key 'from' and ends with the number defined in 'to'. -

-
-
-
-
-
-
-

mutate

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

<

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

assert

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

set-car!

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

eval

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

vector

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

memstat

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

symbol->string

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

cond

-
-
-
type
:macro -
-
arguments
-
rest
clauses -
-
-
-
docu
none -
-
-
-
-
-
-

reduce

-
-
-
type
:lambda -
-
arguments
-
postitional
fun, seq -
-
-
-
docu

-Takes a function and a sequence as arguments and applies the -function to the argument sequence. This only works correctly if the -given function accepts a variable amount of parameters. If your -funciton is limited to two arguments, use reduce-binary -instead. -

-
-
-
-
-
-
-

define-module

-
-
-
type
:macro -
-
arguments
-
postitional
module-name -
-
keyword
imports (()), exports -
-
rest
body -
-
-
-
docu
none -
-
-
-
-
-
-

null?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is nil. -

-
-
-
-
-
-
-

built-in-function?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a built-in function. -

-
-
-
-
-
-
-

list-without-index

-
-
-
type
:lambda -
-
arguments
-
postitional
seq, index -
-
-
-
docu
none -
-
-
-
-
-
-

error

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

hm/set!

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

case

-
-
-
type
:macro -
-
arguments
-
postitional
var -
-
rest
clauses -
-
-
-
docu
none -
-
-
-
-
-
-

-

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

%

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

extend

-
-
-
type
:lambda -
-
arguments
-
postitional
seq, elem -
-
-
-
docu

-Extends a list with the given element, by putting it in -the (rest) of the last element of the sequence. -

-
-
-
-
-
-
-

lambda?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a function. -

-
-
-
-
-
-
-

extend2

-
-
-
type
:lambda -
-
arguments
-
postitional
seq, elem -
-
-
-
docu

-Extends a list with the given element, by putting it in -the (rest) of the last element of the sequence. -

-
-
-
-
-
-
-

length

-
-
-
type
:lambda -
-
arguments
-
postitional
seq -
-
-
-
docu

-Returns the length of the given sequence. -

-
-
-
-
-
-
-

helper

-
-
-
type
:cfunction -
-
docu
-
-
-
-
-
-

>

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

**

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

set!

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

if

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

quote

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

not

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

apply

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

create-hash-map

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

first

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

delete-type!

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

show

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

generate-docs

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

load

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

hm/get-or-nil

-
-
-
type
:lambda -
-
arguments
-
postitional
hm, key -
-
-
-
docu
none -
-
-
-
-
-
-

the-empty-stream

-
-
-
type
:constructor -
-
value
() -
-
docu
none -
-
-
-
-
-
-

force

-
-
-
type
:lambda -
-
arguments
-
postitional
promise -
-
-
-
docu
none -
-
-
-
-
-
-

when

-
-
-
type
:macro -
-
arguments
-
postitional
condition -
-
rest
body -
-
-
-
docu

-Special form for when multiple actions should be done if a -condition is true. -

- -
- -
(when (not ())
-  (print "Hello ")
-  (print "from ")
-  (print "when!"))
-
-(when ()
-  (print "Goodbye ")
-  (print "World!"))
-
-
-
-
-
-
-
-
-

member?

-
-
-
type
:lambda -
-
arguments
-
postitional
elem, seq -
-
-
-
docu
none -
-
-
-
-
-
-

number?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a number. -

-
-
-
-
-
-
-

sublist-starting-at-index

-
-
-
type
:lambda -
-
arguments
-
postitional
seq, index -
-
-
-
docu
none -
-
-
-
-
-
-

increment

-
-
-
type
:lambda -
-
arguments
-
postitional
val -
-
-
-
docu

-Adds one to the argument. -

-
-
-
-
-
-
-

pair

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

set-type!

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

mem-reset

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

mytry

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

string->symbol

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

delay

-
-
-
type
:macro -
-
arguments
-
postitional
expr -
-
-
-
docu
none -
-
-
-
-
-
-

define-typed

-
-
-
type
:macro -
-
arguments
-
postitional
args -
-
rest
body -
-
-
-
docu
none -
-
-
-
-
-
-

vector-set!

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

<=

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

bound?

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

hash-map-delete!

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

filter

-
-
-
type
:lambda -
-
arguments
-
postitional
fun, seq -
-
-
-
docu

-Takes a function and a sequence as arguments and applies the -function to every value in the sequence. If the result of that -funciton application returns a truthy value, the original value is -added to a list, which in the end is returned. -

-
-
-
-
-
-
-

unzip

-
-
-
type
:lambda -
-
arguments
-
postitional
lists -
-
-
-
docu
none -
-
-
-
-
-
-

types?=

-
-
-
type
:lambda -
-
arguments
-
rest
objs -
-
-
-
docu
none -
-
-
-
-
-
-

special-lambda?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a special-lambda. -

-
-
-
-
-
-
-

last

-
-
-
type
:lambda -
-
arguments
-
postitional
seq -
-
-
-
docu

-Returns the (first) of the last (pair) of the given sequence. -

- -
- -
(define a (list 1 2 3 4))
-(print (last a))
-
-
-
-
-
-
-
-
-

append

-
-
-
type
:lambda -
-
arguments
-
postitional
seq, elem -
-
-
-
docu

-Appends an element to a sequence, by extendeing the list -with (pair elem nil). -

-
-
-
-
-
-
-

define-syntax

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

vector-ref

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

*

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

and

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

begin

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

hash-map-set!

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

copy

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

concat-strings

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

let

-
-
-
type
:macro -
-
arguments
-
postitional
bindings -
-
rest
body -
-
-
-
docu
none -
-
-
-
-
-
-

enumerate

-
-
-
type
:lambda -
-
arguments
-
postitional
seq -
-
-
-
docu
none -
-
-
-
-
-
-

assert-types=

-
-
-
type
:lambda -
-
arguments
-
rest
objs -
-
-
-
docu
none -
-
-
-
-
-
-

keyword?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a keyword. -

-
-
-
-
-
-
-

string?

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Checks if the argument is a string. -

-
-
-
-
-
-
-

range

-
-
-
type
:lambda -
-
arguments
-
keyword
from (0), to -
-
-
-
docu

-Returns a sequence of numbers starting with the number defined -by the key from and ends with the number defined in to. -

-
-
-
-
-
-
-

map

-
-
-
type
:lambda -
-
arguments
-
postitional
fun, seq -
-
-
-
docu

-Takes a function and a sequence as arguments and returns a new -sequence which contains the results of using the first sequences -elemens as argument to that function. -

-
-
-
-
-
-
-

read

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

exit

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

break

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

hm/get

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

unless

-
-
-
type
:macro -
-
arguments
-
postitional
condition -
-
rest
body -
-
-
-
docu

-Special form for when multiple actions should be done if a -condition is false. -

-
-
-
-
-
-
-

n-times

-
-
-
type
:macro -
-
arguments
-
postitional
times, action -
-
-
-
docu

-Executes action times times. -

-
-
-
-
-
-
-

test

-
-
-
type
:cfunction -
-
docu
-
-
-
-
-
-

>=

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

set-cdr!

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

hash-map-get

-
-
-
type
:cfunction -
-
docu

-TODO -

-
-
-
-
-
-
-

reduce-binary

-
-
-
type
:lambda -
-
arguments
-
postitional
fun, seq -
-
-
-
docu

-Takes a function and a sequence as arguments and applies the -function to the argument sequence. reduce-binary applies the arguments -pair-wise which means it works with binary functions as compared to -reduce. -

-
-
-
-
-
-
-

ds::alist::make

-
-
-
type
:lambda -
-
arguments
none. -
-
docu
none -
-
-
-
-
-
-

ds::alist::print

-
-
-
type
:lambda -
-
arguments
-
postitional
alist -
-
-
-
docu
none -
-
-
-
-
-
-

ds::alist::get

-
-
-
type
:lambda -
-
arguments
-
postitional
alist, key -
-
-
-
docu
none -
-
-
-
-
-
-

ds::alist::find

-
-
-
type
:lambda -
-
arguments
-
postitional
alist, key -
-
-
-
docu
none -
-
-
-
-
-
-

ds::alist::key-exists?

-
-
-
type
:lambda -
-
arguments
-
postitional
alist, key -
-
-
-
docu
none -
-
-
-
-
-
-

ds::alist::remove!

-
-
-
type
:lambda -
-
arguments
-
postitional
alist, key -
-
-
-
docu
none -
-
-
-
-
-
-

ds::alist::set!

-
-
-
type
:lambda -
-
arguments
-
postitional
alist, key, value -
-
-
-
docu
none -
-
-
-
-
-
-

ds::alist::set-overwrite!

-
-
-
type
:lambda -
-
arguments
-
postitional
alist, key, value -
-
-
-
docu
none -
-
-
-
-
-
-

ds::plist::make

-
-
-
type
:lambda -
-
arguments
none. -
-
docu
none -
-
-
-
-
-
-

ds::plist::print

-
-
-
type
:lambda -
-
arguments
-
postitional
plist -
-
-
-
docu
none -
-
-
-
-
-
-

ds::plist::get

-
-
-
type
:lambda -
-
arguments
-
postitional
plist, prop -
-
-
-
docu
none -
-
-
-
-
-
-

ds::plist::find

-
-
-
type
:lambda -
-
arguments
-
postitional
plist, prop -
-
-
-
docu
none -
-
-
-
-
-
-

ds::plist::prop-exists?

-
-
-
type
:lambda -
-
arguments
-
postitional
plist, prop -
-
-
-
docu
none -
-
-
-
-
-
-

ds::plist::remove!

-
-
-
type
:lambda -
-
arguments
-
postitional
plist, prop -
-
-
-
docu
none -
-
-
-
-
-
-

ds::plist::set!

-
-
-
type
:lambda -
-
arguments
-
postitional
plist, prop, value -
-
-
-
docu
none -
-
-
-
-
-
-

ds::plist::set-overwrite!

-
-
-
type
:lambda -
-
arguments
-
postitional
plist, prop, value -
-
-
-
docu
none -
-
-
-
-
-
-

automata::make-dfa

-
-
-
type
:lambda -
-
arguments
-
postitional
Q, S, delta, q0, F -
-
-
-
docu
none -
-
-
-
-
-
-

interpolation::lerp

-
-
-
type
:lambda -
-
arguments
-
postitional
a, b, t -
-
-
-
docu
none -
-
-
-
-
-
-

interpolation::lerper

-
-
-
type
:lambda -
-
arguments
-
postitional
a, b -
-
-
-
docu
none -
-
-
-
-
-
-

interpolation::stepped-lerper

-
-
-
type
:lambda -
-
arguments
-
postitional
a, b, #steps -
-
-
-
docu
none -
-
-
-
-
-
-

interpolation::point-lerp

-
-
-
type
:lambda -
-
arguments
-
postitional
p1, p2, t -
-
-
-
docu
none -
-
-
-
-
-
-

interpolation::point-lerper

-
-
-
type
:lambda -
-
arguments
-
postitional
p1, p2 -
-
-
-
docu
none -
-
-
-
-
-
-

interpolation::bezier2

-
-
-
type
:lambda -
-
arguments
-
postitional
p1, p2, p3, t -
-
-
-
docu
none -
-
-
-
-
-
-

interpolation::bezierer2

-
-
-
type
:lambda -
-
arguments
-
postitional
p1, p2, p3 -
-
-
-
docu
none -
-
-
-
-
-
-

define-class

-
-
-
type
:macro -
-
arguments
-
postitional
name-and-members -
-
rest
body -
-
-
-
docu
none -
-
-
-
-
-
-

->

-
-
-
type
:macro -
-
arguments
-
postitional
obj, meth -
-
rest
args -
-
-
-
docu
none -
-
-
-
-
-
-

math::pi

-
-
-
type
:number -
-
value
3.141593 -
-
docu
none -
-
-
-
-
-
-

math::abs

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Accepts one argument and returns the absoulte value of it -

-
-
-
-
-
-
-

math::sqrt

-
-
-
type
:lambda -
-
arguments
-
postitional
x -
-
-
-
docu

-Accepts one argument and returns the square root of it -

-
-
-
-
-
-
-

math::make-vector3

-
-
-
type
:lambda -
-
arguments
-
postitional
x, y, z -
-
-
-
docu
none -
-
-
-
-
-
-

set::make

-
-
-
type
:lambda -
-
arguments
-
rest
vals -
-
-
-
docu
none -
-
-
-
-
-
-

set::find

-
-
-
type
:lambda -
-
arguments
-
postitional
set, val -
-
-
-
docu
none -
-
-
-
-
-
-

set::contains?

-
-
-
type
:lambda -
-
arguments
-
postitional
set, val -
-
-
-
docu
none -
-
-
-
-
-
-

set::insert!

-
-
-
type
:lambda -
-
arguments
-
postitional
set, value -
-
-
-
docu
none -
-
-
-
-
-
-
-

Author: Felix Brendel

-

Created: 2019-11-10 So 23:51

-

Emacs 26.3 (Org-mode 9.1.9)

-
-
- - + + + +The Slime 1.0 Manual + + + + + + + + + + + + + + + + +
+

The Slime 1.0 Manual

+
+

+abstract +

+ +
+ +

+\tableofcontents +

+ +
+

1 Lisp languages

+
+

+Lisp is not one language but rather a family of programming languages. The family is devided by some +characteristics. There are Lisp-1 and Lisp-2 dialects and there is a difference between a Lisp with +lexical scoping as opposed to dynamic scoping. These differences will be explained in later +sections. +

+ +

+Like most Lisps, Slime is dynamically typed. That means that like in statically typed Languages +Slime has different data types, but they are associated not with variables but with the Lisp objects +themselves. Variables can be assigend Lisp objects of any internal type. +

+ +

+The Lisp language family is known to be highly flexible and applicable in all areas by creating +domain specific languages in Lisp itself through a powerful macro system. The central data structure +in Lisp is the list. The reason why lisp is so powerful is because the program source code itself is +represented as lists. The nested lists make up the syntax tree of the lisp program. It is therfore +computationally easy to parse lisp programs as the source code itself is already structured in the +form of the syntax tree; allowing for parsing in linear time. +

+ +

+The macro system in Slime works by recognizing macros at parse-time and running them, and replacing +the macro call in the program code with the return value of the macro and then checking if further +macros have to be expanded in the replaced code. Therefore the macros can be used to pre-compute +values or rewrite expressions (creating syntactic sugar) or themselves define macros. +

+
+
+ +
+

2 Lists

+
+

+As mentioned in Lisp languages, the central data structure in all Lisps is the list. Lists are +implemented as singly linked lists, made up of pairs (historically called cons-cells), each pair +has two slots, the first and the rest (historically car and cdr). A linked lsit ist then +constructed by the convention that the first field of a pair points to the first element of the +list and the rest field points to the rest of the list. Following this description, the list is a +recursive data structure. For the end of the list a special value nil is used in the rest field. +

+ +

+A helpful way to visualize lists made up of pairs is using box diagrams. A simple box diagram can be +seen in 1. Each rectangle is divided in two. The left part represents the first +field, the right part represents the rest. The arrows point to the values in these fields. +

+ +

+The diagram in 1 shows a simple list containing the values 1, 2 and 3. The first pair +stores the number 1 its first field and the rest points to the rest of the list. The last pair +points to the special value nil in its rest to denote the end of the list. +

+ +

+diagrams/list123.eps +

+ + +

+However the rest of a pair needs not to be a pair or nil, it could also point to any other value. +By doing this the list is no longer "well formed" but rather "ill formed". Ill formed lsits can be +used as an optimization when using the list for storing data. In 2 an ill formed list +can be seen, that also contains the values 1, 2 and 3 but stores them using only two pairs instead +of 3. +

+ +

+diagrams/list12.3.eps +

+
+ +
+

2.1 representing lists in Lisp

+
+

+In Slime and in most Lisps, lists are represented using round parenthesis where ( denotes the +start of the list and ) denotes the end. Eeach element inside these parenthesis separated by one +or more spaces will be interpreted as an element of that list. For example the list from +1 would be represented as (1 2 3). During parse time, the Lisp parser transforms +the parenthesised list into the pairs that are in the end stored in memory. +

+ +

+To also be able to represent ill formed lists in Lisp there is a special syntax using the . (dot +symbol). If the parser encounters a . inside of a list, it will treat the next element as the +rest. If there is no or more than one element after the . an parsing error will be thrown. Using +this syntax we can represent the ill formed list from 2 as (1 2 . 3). We can also +write well formed lists using the dot notation if we point the rest to another list. So the well +formed list from 1 can also be written as \[\texttt{(1 . (2 . (3)))}\] +

+
+
+ +
+

2.2 representing function calls in Lisp

+
+

+If we tried to enter the Lisp representation of the lists like (1 2 3) discussed in representing lists in Lisp directly into an Lisp interpreter we would get an error. That doesn't mean that the +explanation given in the section is wrong, it is in fact correct: the lisp parser will transform the +lisp syntax into the pairs in memory. The reason we would get an error is, that when reading Lisp +code, the Lisp interpreter first parses the code and then tries to evaluate it and return the result +back to the user. +

+ +

+In Lisp by default, a list corresponds to a function call. As mentioned in Lisp languages Lisp +represents lists and Lisp programms as lists. If a list is treated as a function call, the first +element will be treated as the function and the rest of the elements will be the arguments to that +function. If we would wnter (1 2 3) directly into the Lisp interpreter we would get an error +saying it cannot find the function 1. +

+ +

+If we would want to compute the sum of the numbers 5 and 3 we could do this by invoking the + +function with 5 and 3 as its arguments. (+ 5 3) will evaluate to 8. We can also nest functions +calls and use the return values as parameters to other functions: (+ (- 12 4) (/ 24 4)) will +evaluate to 14. The box diagramm showing the internal structure of that computation can be seen in +3. +

+ +

+diagrams/simpleMath.eps +

+
+
+
+ +
+

3 Evaluation order

+
+

+As a first step of evaluation of a regular function, all its arguments are getting evaluated, and +then the function is applied to the evaluated arguments. For example when evaluating the nested +expression in 1 the outermost function is the + function with three arguments: (* +3 4), (- 100 (+ 12 13 14 15)) and 2. So before the outhermost + gets invoked, the three +arguments are getting evaluated recursively. +

+ +
+ +
(print (+ (* 3 4)
+          (- 100 (+ 12 13 14 15))
+          2))
+
+
+ +
+evaluates to =>
+60
+
+
+
+ +
+

3.1 Special forms

+
+

+The given evaluation rule – to evaluate all the arguments first and then allpying them to the +funciton – as described in Evaluation order is only valid for regular functions. There is a class +of functions that do not follow this evaluation rule called special forms. Special forms are +needed when you do not wish to evaluate all arguments. For example the built-in if function should +only evaluate the "then-expression" if the condition evaluates to a truthy value and not otherwise. +Consider the example in 2. The if expression only evaluates the then-expression. If +the if function would follow the evaluation order of regular functions, first all three arguments +(< 1 2), (print "I knew it!!\n") but also (print "Oh, it is not?!\n") could get evaluated and +so both messages would be printed. In the given if expression, the condition evaluates to a truthy +value and only I knew it!! will be printed. +

+ +
+ +
(if (< 1 2)
+    (print "I knew it!!\n")
+  (print "Oh, it is not?!\n"))
+
+
+ +
+evaluates to =>
+I knew it!!
+
+
+ +

+The programmer can also define their own special forms using special-lambda and macros, which will +be explained in Special lambdas and Macros. +

+
+
+
+ +
+

4 Symbols and keywords

+
+
+

5 Truthyness

+
+
+

6 Lambdas

+
+

+Slime allows for creating anonymous functions called lambdas. We did not talk about binding +variables, we will do this in Define, but we can still use lambdas now. Remember that Lisp +interpretes the first argument of a list in the source code as a function and the rest as the +arguments. The lambda special form evaluates to a regular function object that can then stand in +the first position of the function call list. The basic syntax for the lambda special form is: +\[\texttt{(lambda (arg1 arg2 ...) (body1) ...)}\] the first arguemnt to lambda is a list of the +arguments. All the following arguments will be the body of the lambda. They will be executed when +the lambda is invoked. The return value of a lambda is the value of the last evaluated expression in +the body. +

+ +

+Probably the simplest function to write as a lambda is the identity function. It takes one argument +and returns it. The identity lambda and a few other simple examples of lambdas can be seen in +3. +

+ +
+ +
(printf ((lambda (x) x) 1))
+(printf ((lambda (x y) (+ x y)) 3 5))
+(printf ((lambda (x y z) (list x y z)) 1 2 3))
+
+
+ +
+evaluates to =>
+1
+8
+(1 2 3)
+
+
+ +

+Additionally Slime lambdas have the possibility to take optional arguments in the form of keyword +arguemnts as well as a rest argument which allows for accepting any number of arguments. Since +these concepts are most useful when the function is actually bound to a variable, they will be +introduced when we learned how to do that in Define. +

+
+ +
+

6.1 Special lambdas

+
+

+The lambda special form creates a function object that represents a regular function. So the basic +evaluation rules count: when the lambda is invoked all it's arguments are evaluated and then the +lambda is applied to the evaluated arguments. If this is not wanted in some rare cases, the +programmer also has the possibility to define a special form using special-lambda, which, when +invoked does not evaluare any argument. The programmer has to evaluate the arguments in the body +themselves using eval. The rest of the syntax between lambda and special-lambda are the same. +

+ +
+ +
((lambda         (x) (printf x)) (+ 1 2))
+((special-lambda (x) (printf x)) (+ 1 2))
+
+;; Special lambdas make it possible to write
+;; code that inspects code
+((special-lambda (expr)
+     (printf "The function to be called is"
+             (first expr)
+             "and the result is"
+             (eval expr)))
+ (+ 1 2))
+
+
+ +
+evaluates to =>
+3
+(+ 1 2)
+The function to be called is + and the result is 3.
+
+
+
+
+
+ +
+

7 Define

+
+

+To assign a value to a symbol you can use the define built-in special form. The syntax for +define is: \[\texttt{(define symbol value)}\] and some usages can be seen in +5. +

+ +
+ +
(define var1 1)
+(define var2 "Hello World")
+(define var3 (+ 1 2))
+
+(printf var1 var2 var3)
+
+
+ +
+evaluates to =>
+1 Hello World 3
+
+
+
+ +
+

7.1 Defining functions

+
+

+In Lambdas we learned how to create function objects using the lambda built-in form. Using +define every Lisp Object can be assigned to a symbol making no exception for the function objects. +In 6 you can see what that would look like. +

+ +
+ +
(define hypothenuse
+  (lambda (a b)
+    (** (+ (* a a) (* b b)) 0.5)))
+
+(printf (hypothenuse 3 4))
+
+
+ +
+evaluates to =>
+5
+
+
+ +

+Since defining functions is so common, there is a syntactic shorthand that does not require to write +out the whole lambda definition. In this case the first argument to the call to define is a +list. The frist element of the list is the name of the function to define and the other elemens are +the arguments to that function. An example can be seen in 7. Note that the +definition looks like a call to the function we are constructing, making it easier to see what a +call to that function will look like. +

+ +
+ +
(define (hypothenuse a b)
+  (** (+ (* a a) (* b b)) 0.5))
+
+(printf (hypothenuse 3 4))
+
+
+ +
+evaluates to =>
+5
+
+
+
+
+ +
+

7.2 Functions with keyword arguments

+
+

+A sometimes more convenient way of passing arguments to a function is using keyword arguments. Using +keyword arguments a function call could look like this: \[\texttt{(function :arg1 value1 :arg2 +value2)}\] here the function accepts two arguments named arg1 and arg2. The user of this +function can see more clearly excatly which argument will be assigned wich value. This notation also +allows for switching the argument order. The following function call is equivalent to the call +above. \[\texttt{(function :arg2 value2 :arg1 value1)}\]. +

+ +

+For this to work however, the function must be defined to accept these keyword arguments. To do this +the special marker :keys has to be inserted into the argument list of a lambda or a function +define. All following arguments must be supplied as keyword arguments, unless they are also +supplied with a default value, in which case they do not need to be supplied. To attach a default +value to a keyword argument, insert :defaults-to <value> after the keyword argument name. An +example of all of this can be seen in 8. Important note: keyword arguments must be +defined and supplied after all the regular arguments. +

+ +
+ +
(define (complex required1 required2 :keys
+                 key1
+                 key2 :defaults-to 3
+                 key3)
+  (* (+ required1 required2)
+     key1
+     key2
+     key3))
+
+(printf (complex 1 2 :key1 2 :key2 2 :key3 3))
+(printf (complex 1 2 :key1 2 :key3 3))
+(printf (complex 1 2 :key3 3 :key1 2))
+
+
+ +
+evaluates to =>
+36
+54
+54
+
+
+
+
+ +
+

7.3 Functions with rest arguments

+
+

+If the programmer wants to create a function that can accept any number of arguments, they can use +the rest argument. It is defined after the special marker :rest and after the rest argument, no +other arguments can be defined. In the execution of the fuction, the rest arguent will be assigned +to a list containing all the supplied values. The rest argument can be used in conjunction with the +other argument types, regular arguments and keyword arguments. +

+ +
+ +
(define (execute-operation operation
+                           :keys
+                           do-logging :defaults-to ()
+                           :rest values)
+  (define result (apply operation values))
+  (when do-logging
+    (printf "Executing operation"
+            operation
+            "agains the values"
+            values
+            "yielded:"
+            result))
+  result)
+
+(printf (execute-operation '+ 1 2 3))
+(printf (execute-operation '*
+                           :do-logging t
+                           10 11))
+
+
+ +
+evaluates to =>
+6
+Executing operation * agains values (10 11) yielded: 110
+110
+
+
+
+
+
+ +
+

8 Environments

+
+
+

9 Macros

+
+
+

Built-in functions

+
+
+
+
+

continuation?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a continuation. +

+
+
+
+
+
+
+

=

+
+
+
type
:cfunction +
+
docu

+Takes 0 or more arguments and returns t if all arguments are equal and () otherwise. +

+
+
+
+
+
+
+

+

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

get-random-between

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

lambda

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

info

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

addr-of

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

type?=

+
+
+
type
:lambda +
+
arguments
+
postitional
obj, typ +
+
+
+
docu

+Checks if the argument obj is of type typ +

+
+
+
+
+
+
+

symbol?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a symbol. +

+
+
+
+
+
+
+

macro?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a macro. +

+
+
+
+
+
+
+

procedure?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu
none +
+
+
+
+
+
+

rest

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

type

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

print

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

import

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

symbol->keyword

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

pe

+
+
+
type
:macro +
+
arguments
+
postitional
expr +
+
+
+
docu
none +
+
+
+
+
+
+

stream-null?

+
+
+
type
:lambda +
+
arguments
+
postitional
s +
+
+
+
docu
none +
+
+
+
+
+
+

construct-list

+
+
+
type
:macro +
+
arguments
+
rest
body +
+
+
+
docu
+ +
(construct-list
+  i <- '(1 2 3 4 5)
+  yield (* i i))
+
+
+ +

+(construct-list + i <- '(1 2 3 4) + j <- '(A B) + yield (pair i j)) +

+ +

+(construct-list + i <- '(1 2 3 4 5 6 7 8) + if (= 0 (% i 2)) + yield i) +

+
+
+
+
+
+
+

define

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

vector-length

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

/

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

quasiquote

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

or

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

list

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

zip

+
+
+
type
:lambda +
+
arguments
+
postitional
l1, l2 +
+
+
+
docu
none +
+
+
+
+
+
+

generic-extend

+
+
+
type
:macro +
+
arguments
+
postitional
args +
+
rest
body +
+
+
+
docu
none +
+
+
+
+
+
+

pair?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a pair. +

+
+
+
+
+
+
+

end

+
+
+
type
:lambda +
+
arguments
+
postitional
seq +
+
+
+
docu

+Returns the last pair in the sqeuence. +

+ +
+ +
(define a (list 1 2 3 4))
+(print (end a))
+
+
+
+
+
+
+
+
+

decrement

+
+
+
type
:lambda +
+
arguments
+
postitional
val +
+
+
+
docu

+Subtracts one from the argument. +

+
+
+
+
+
+
+

range-while

+
+
+
type
:lambda +
+
arguments
+
keyword
from (0), to +
+
+
+
docu

+Returns a sequence of numbers starting with the number defined +by the key 'from' and ends with the number defined in 'to'. +

+
+
+
+
+
+
+

mutate

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

<

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

assert

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

set-car!

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

eval

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

vector

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

memstat

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

symbol->string

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

cond

+
+
+
type
:macro +
+
arguments
+
rest
clauses +
+
+
+
docu
none +
+
+
+
+
+
+

reduce

+
+
+
type
:lambda +
+
arguments
+
postitional
fun, seq +
+
+
+
docu

+Takes a function and a sequence as arguments and applies the +function to the argument sequence. This only works correctly if the +given function accepts a variable amount of parameters. If your +funciton is limited to two arguments, use reduce-binary +instead. +

+
+
+
+
+
+
+

define-module

+
+
+
type
:macro +
+
arguments
+
postitional
module-name +
+
keyword
imports (()), exports +
+
rest
body +
+
+
+
docu
none +
+
+
+
+
+
+

null?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is nil. +

+
+
+
+
+
+
+

built-in-function?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a built-in function. +

+
+
+
+
+
+
+

list-without-index

+
+
+
type
:lambda +
+
arguments
+
postitional
seq, index +
+
+
+
docu
none +
+
+
+
+
+
+

error

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

hm/set!

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

case

+
+
+
type
:macro +
+
arguments
+
postitional
var +
+
rest
clauses +
+
+
+
docu
none +
+
+
+
+
+
+

-

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

%

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

extend

+
+
+
type
:lambda +
+
arguments
+
postitional
seq, elem +
+
+
+
docu

+Extends a list with the given element, by putting it in +the (rest) of the last element of the sequence. +

+
+
+
+
+
+
+

lambda?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a function. +

+
+
+
+
+
+
+

extend2

+
+
+
type
:lambda +
+
arguments
+
postitional
seq, elem +
+
+
+
docu

+Extends a list with the given element, by putting it in +the (rest) of the last element of the sequence. +

+
+
+
+
+
+
+

length

+
+
+
type
:lambda +
+
arguments
+
postitional
seq +
+
+
+
docu

+Returns the length of the given sequence. +

+
+
+
+
+
+
+

helper

+
+
+
type
:cfunction +
+
docu
+
+
+
+
+
+

>

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

**

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

set!

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

if

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

quote

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

not

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

apply

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

create-hash-map

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

first

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

delete-type!

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

show

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

generate-docs

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

load

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

hm/get-or-nil

+
+
+
type
:lambda +
+
arguments
+
postitional
hm, key +
+
+
+
docu
none +
+
+
+
+
+
+

the-empty-stream

+
+
+
type
:constructor +
+
value
() +
+
docu
none +
+
+
+
+
+
+

force

+
+
+
type
:lambda +
+
arguments
+
postitional
promise +
+
+
+
docu
none +
+
+
+
+
+
+

when

+
+
+
type
:macro +
+
arguments
+
postitional
condition +
+
rest
body +
+
+
+
docu

+Special form for when multiple actions should be done if a +condition is true. +

+ +
+ +
(when (not ())
+  (print "Hello ")
+  (print "from ")
+  (print "when!"))
+
+(when ()
+  (print "Goodbye ")
+  (print "World!"))
+
+
+
+
+
+
+
+
+

member?

+
+
+
type
:lambda +
+
arguments
+
postitional
elem, seq +
+
+
+
docu
none +
+
+
+
+
+
+

number?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a number. +

+
+
+
+
+
+
+

sublist-starting-at-index

+
+
+
type
:lambda +
+
arguments
+
postitional
seq, index +
+
+
+
docu
none +
+
+
+
+
+
+

increment

+
+
+
type
:lambda +
+
arguments
+
postitional
val +
+
+
+
docu

+Adds one to the argument. +

+
+
+
+
+
+
+

pair

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

set-type!

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

mem-reset

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

mytry

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

string->symbol

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

delay

+
+
+
type
:macro +
+
arguments
+
postitional
expr +
+
+
+
docu
none +
+
+
+
+
+
+

define-typed

+
+
+
type
:macro +
+
arguments
+
postitional
args +
+
rest
body +
+
+
+
docu
none +
+
+
+
+
+
+

vector-set!

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

<=

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

bound?

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

hash-map-delete!

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

filter

+
+
+
type
:lambda +
+
arguments
+
postitional
fun, seq +
+
+
+
docu

+Takes a function and a sequence as arguments and applies the +function to every value in the sequence. If the result of that +funciton application returns a truthy value, the original value is +added to a list, which in the end is returned. +

+
+
+
+
+
+
+

unzip

+
+
+
type
:lambda +
+
arguments
+
postitional
lists +
+
+
+
docu
none +
+
+
+
+
+
+

types?=

+
+
+
type
:lambda +
+
arguments
+
rest
objs +
+
+
+
docu
none +
+
+
+
+
+
+

special-lambda?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a special-lambda. +

+
+
+
+
+
+
+

last

+
+
+
type
:lambda +
+
arguments
+
postitional
seq +
+
+
+
docu

+Returns the (first) of the last (pair) of the given sequence. +

+ +
+ +
(define a (list 1 2 3 4))
+(print (last a))
+
+
+
+
+
+
+
+
+

append

+
+
+
type
:lambda +
+
arguments
+
postitional
seq, elem +
+
+
+
docu

+Appends an element to a sequence, by extendeing the list +with (pair elem nil). +

+
+
+
+
+
+
+

define-syntax

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

vector-ref

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

*

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

and

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

begin

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

hash-map-set!

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

copy

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

concat-strings

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

let

+
+
+
type
:macro +
+
arguments
+
postitional
bindings +
+
rest
body +
+
+
+
docu
none +
+
+
+
+
+
+

enumerate

+
+
+
type
:lambda +
+
arguments
+
postitional
seq +
+
+
+
docu
none +
+
+
+
+
+
+

assert-types=

+
+
+
type
:lambda +
+
arguments
+
rest
objs +
+
+
+
docu
none +
+
+
+
+
+
+

keyword?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a keyword. +

+
+
+
+
+
+
+

string?

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Checks if the argument is a string. +

+
+
+
+
+
+
+

range

+
+
+
type
:lambda +
+
arguments
+
keyword
from (0), to +
+
+
+
docu

+Returns a sequence of numbers starting with the number defined +by the key from and ends with the number defined in to. +

+
+
+
+
+
+
+

map

+
+
+
type
:lambda +
+
arguments
+
postitional
fun, seq +
+
+
+
docu

+Takes a function and a sequence as arguments and returns a new +sequence which contains the results of using the first sequences +elemens as argument to that function. +

+
+
+
+
+
+
+

read

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

exit

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

break

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

hm/get

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

unless

+
+
+
type
:macro +
+
arguments
+
postitional
condition +
+
rest
body +
+
+
+
docu

+Special form for when multiple actions should be done if a +condition is false. +

+
+
+
+
+
+
+

n-times

+
+
+
type
:macro +
+
arguments
+
postitional
times, action +
+
+
+
docu

+Executes action times times. +

+
+
+
+
+
+
+

test

+
+
+
type
:cfunction +
+
docu
+
+
+
+
+
+

>=

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

set-cdr!

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

hash-map-get

+
+
+
type
:cfunction +
+
docu

+TODO +

+
+
+
+
+
+
+

reduce-binary

+
+
+
type
:lambda +
+
arguments
+
postitional
fun, seq +
+
+
+
docu

+Takes a function and a sequence as arguments and applies the +function to the argument sequence. reduce-binary applies the arguments +pair-wise which means it works with binary functions as compared to +reduce. +

+
+
+
+
+
+
+

ds::alist::make

+
+
+
type
:lambda +
+
arguments
none. +
+
docu
none +
+
+
+
+
+
+

ds::alist::print

+
+
+
type
:lambda +
+
arguments
+
postitional
alist +
+
+
+
docu
none +
+
+
+
+
+
+

ds::alist::get

+
+
+
type
:lambda +
+
arguments
+
postitional
alist, key +
+
+
+
docu
none +
+
+
+
+
+
+

ds::alist::find

+
+
+
type
:lambda +
+
arguments
+
postitional
alist, key +
+
+
+
docu
none +
+
+
+
+
+
+

ds::alist::key-exists?

+
+
+
type
:lambda +
+
arguments
+
postitional
alist, key +
+
+
+
docu
none +
+
+
+
+
+
+

ds::alist::remove!

+
+
+
type
:lambda +
+
arguments
+
postitional
alist, key +
+
+
+
docu
none +
+
+
+
+
+
+

ds::alist::set!

+
+
+
type
:lambda +
+
arguments
+
postitional
alist, key, value +
+
+
+
docu
none +
+
+
+
+
+
+

ds::alist::set-overwrite!

+
+
+
type
:lambda +
+
arguments
+
postitional
alist, key, value +
+
+
+
docu
none +
+
+
+
+
+
+

ds::plist::make

+
+
+
type
:lambda +
+
arguments
none. +
+
docu
none +
+
+
+
+
+
+

ds::plist::print

+
+
+
type
:lambda +
+
arguments
+
postitional
plist +
+
+
+
docu
none +
+
+
+
+
+
+

ds::plist::get

+
+
+
type
:lambda +
+
arguments
+
postitional
plist, prop +
+
+
+
docu
none +
+
+
+
+
+
+

ds::plist::find

+
+
+
type
:lambda +
+
arguments
+
postitional
plist, prop +
+
+
+
docu
none +
+
+
+
+
+
+

ds::plist::prop-exists?

+
+
+
type
:lambda +
+
arguments
+
postitional
plist, prop +
+
+
+
docu
none +
+
+
+
+
+
+

ds::plist::remove!

+
+
+
type
:lambda +
+
arguments
+
postitional
plist, prop +
+
+
+
docu
none +
+
+
+
+
+
+

ds::plist::set!

+
+
+
type
:lambda +
+
arguments
+
postitional
plist, prop, value +
+
+
+
docu
none +
+
+
+
+
+
+

ds::plist::set-overwrite!

+
+
+
type
:lambda +
+
arguments
+
postitional
plist, prop, value +
+
+
+
docu
none +
+
+
+
+
+
+

automata::make-dfa

+
+
+
type
:lambda +
+
arguments
+
postitional
Q, S, delta, q0, F +
+
+
+
docu
none +
+
+
+
+
+
+

interpolation::lerp

+
+
+
type
:lambda +
+
arguments
+
postitional
a, b, t +
+
+
+
docu
none +
+
+
+
+
+
+

interpolation::lerper

+
+
+
type
:lambda +
+
arguments
+
postitional
a, b +
+
+
+
docu
none +
+
+
+
+
+
+

interpolation::stepped-lerper

+
+
+
type
:lambda +
+
arguments
+
postitional
a, b, #steps +
+
+
+
docu
none +
+
+
+
+
+
+

interpolation::point-lerp

+
+
+
type
:lambda +
+
arguments
+
postitional
p1, p2, t +
+
+
+
docu
none +
+
+
+
+
+
+

interpolation::point-lerper

+
+
+
type
:lambda +
+
arguments
+
postitional
p1, p2 +
+
+
+
docu
none +
+
+
+
+
+
+

interpolation::bezier2

+
+
+
type
:lambda +
+
arguments
+
postitional
p1, p2, p3, t +
+
+
+
docu
none +
+
+
+
+
+
+

interpolation::bezierer2

+
+
+
type
:lambda +
+
arguments
+
postitional
p1, p2, p3 +
+
+
+
docu
none +
+
+
+
+
+
+

define-class

+
+
+
type
:macro +
+
arguments
+
postitional
name-and-members +
+
rest
body +
+
+
+
docu
none +
+
+
+
+
+
+

->

+
+
+
type
:macro +
+
arguments
+
postitional
obj, meth +
+
rest
args +
+
+
+
docu
none +
+
+
+
+
+
+

math::pi

+
+
+
type
:number +
+
value
3.141593 +
+
docu
none +
+
+
+
+
+
+

math::abs

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Accepts one argument and returns the absoulte value of it +

+
+
+
+
+
+
+

math::sqrt

+
+
+
type
:lambda +
+
arguments
+
postitional
x +
+
+
+
docu

+Accepts one argument and returns the square root of it +

+
+
+
+
+
+
+

math::make-vector3

+
+
+
type
:lambda +
+
arguments
+
postitional
x, y, z +
+
+
+
docu
none +
+
+
+
+
+
+

set::make

+
+
+
type
:lambda +
+
arguments
+
rest
vals +
+
+
+
docu
none +
+
+
+
+
+
+

set::find

+
+
+
type
:lambda +
+
arguments
+
postitional
set, val +
+
+
+
docu
none +
+
+
+
+
+
+

set::contains?

+
+
+
type
:lambda +
+
arguments
+
postitional
set, val +
+
+
+
docu
none +
+
+
+
+
+
+

set::insert!

+
+
+
type
:lambda +
+
arguments
+
postitional
set, value +
+
+
+
docu
none +
+
+
+
+
+
+
+

Author: Felix Brendel

+

Created: 2019-11-10 So 23:51

+

Emacs 26.3 (Org-mode 9.1.9)

+
+
+ + diff --git a/manual/manual.org b/manual/manual.org index df2dc45..52cf6d0 100644 --- a/manual/manual.org +++ b/manual/manual.org @@ -1,979 +1,979 @@ -#+title: The Slime 1.0 Manual - -#+macro: example_start (eval (concat "{{{slime_header}}}" "\n" "#+begin_src slime")) -#+macro: example_end (eval (concat "#+end_src")) - -#+begin_abstract -abstract -#+end_abstract - -\tableofcontents - -* Lisp languages -Lisp is not one language but rather a family of programming languages. The family is devided by some -characteristics. There are Lisp-1 and Lisp-2 dialects and there is a difference between a Lisp with -lexical scoping as opposed to dynamic scoping. These differences will be explained in later -sections. - -Like most Lisps, Slime is dynamically typed. That means that like in statically typed Languages -Slime has different data types, but they are associated not with variables but with the Lisp objects -themselves. Variables can be assigend Lisp objects of any internal type. - -The Lisp language family is known to be highly flexible and applicable in all areas by creating -domain specific languages in Lisp itself through a powerful macro system. The central data structure -in Lisp is the list. The reason why lisp is so powerful is because the program source code itself is -represented as lists. The nested lists make up the syntax tree of the lisp program. It is therfore -computationally easy to parse lisp programs as the source code itself is already structured in the -form of the syntax tree; allowing for parsing in linear time. - -The macro system in Slime works by recognizing macros at parse-time and running them, and replacing -the macro call in the program code with the return value of the macro and then checking if further -macros have to be expanded in the replaced code. Therefore the macros can be used to pre-compute -values or rewrite expressions (creating syntactic sugar) or themselves define macros. - -* Lists -As mentioned in [[Lisp languages]], the central data structure in all Lisps is the list. Lists are -implemented as singly linked lists, made up of pairs (historically called =cons-cells=), each pair -has two slots, the =first= and the =rest= (historically =car= and =cdr=). A linked lsit ist then -constructed by the convention that the =first= field of a pair points to the first element of the -list and the =rest= field points to the rest of the list. Following this description, the list is a -recursive data structure. For the end of the list a special value =nil= is used in the =rest= field. - -A helpful way to visualize lists made up of pairs is using box diagrams. A simple box diagram can be -seen in [[simpleBoxDiagram]]. Each rectangle is divided in two. The left part represents the =first= -field, the right part represents the =rest=. The arrows point to the values in these fields. - -The diagram in [[simpleBoxDiagram]] shows a simple list containing the values 1, 2 and 3. The first pair -stores the number 1 its =first= field and the =rest= points to the rest of the list. The last pair -points to the special value =nil= in its =rest= to denote the end of the list. - -{{{ditaa_header}}} -#+begin_src ditaa :file diagrams/list123.eps - +-----+-----+ +-----+-----+ +-----+-----+ - | | | | | | | | | - | | |--->| | |--->| | / | - | | | | | | | | | - +-----+-----+ +-----+-----+ +-----+-----+ - | | | - | | | - V V V - 1 2 3 -#+end_src - -#+name: simpleBoxDiagram -#+caption: Box diagram showing the internal structure of a list containing the values 1, 2 and 3 -#+RESULTS: -[[file:diagrams/list123.esp]] - - -However the =rest= of a pair needs not to be a pair or nil, it could also point to any other value. -By doing this the list is no longer "well formed" but rather "ill formed". Ill formed lsits can be -used as an optimization when using the list for storing data. In [[illFormedList]] an ill formed list -can be seen, that also contains the values 1, 2 and 3 but stores them using only two pairs instead -of 3. - -{{{ditaa_header}}} -#+begin_src ditaa :file diagrams/list12.3.eps - +-----+-----+ +-----+-----+ - | | | | | | - | | |--->| | |--->3 - | | | | | | - +-----+-----+ +-----+-----+ - | | - | | - V V - 1 2 -#+end_src - -#+name: illFormedList -#+caption: The internal structure of an ill formed list where the last pair points to the value 3 -#+RESULTS: -[[file:diagrams/list12.3.eps]] - -** representing lists in Lisp - -In Slime and in most Lisps, lists are represented using round parenthesis where =(= denotes the -start of the list and =)= denotes the end. Eeach element inside these parenthesis separated by one -or more spaces will be interpreted as an element of that list. For example the list from -[[simpleBoxDiagram]] would be represented as =(1 2 3)=. During parse time, the Lisp parser transforms -the parenthesised list into the pairs that are in the end stored in memory. - -To also be able to represent ill formed lists in Lisp there is a special syntax using the =.= (dot -symbol). If the parser encounters a =.= inside of a list, it will treat the next element as the -=rest=. If there is no or more than one element after the =.= an parsing error will be thrown. Using -this syntax we can represent the ill formed list from [[illFormedList]] as =(1 2 . 3)=. We can also -write well formed lists using the dot notation if we point the rest to another list. So the well -formed list from [[simpleBoxDiagram]] can also be written as \[\texttt{(1 . (2 . (3)))}\] - -** representing function calls in Lisp - -If we tried to enter the Lisp representation of the lists like =(1 2 3)= discussed in [[representing -lists in Lisp]] directly into an Lisp interpreter we would get an error. That doesn't mean that the -explanation given in the section is wrong, it is in fact correct: the lisp parser will transform the -lisp syntax into the pairs in memory. The reason we would get an error is, that when reading Lisp -code, the Lisp interpreter first parses the code and then tries to evaluate it and return the result -back to the user. - -In Lisp by default, a list corresponds to a function call. As mentioned in [[Lisp languages]] Lisp -represents lists and Lisp programms as lists. If a list is treated as a function call, the first -element will be treated as the function and the rest of the elements will be the arguments to that -function. If we would wnter =(1 2 3)= directly into the Lisp interpreter we would get an error -saying it cannot find the function =1=. - -If we would want to compute the sum of the numbers 5 and 3 we could do this by invoking the =+= -function with 5 and 3 as its arguments. =(+ 5 3)= will evaluate to 8. We can also nest functions -calls and use the return values as parameters to other functions: =(+ (- 12 4) (/ 24 4))= will -evaluate to 14. The box diagramm showing the internal structure of that computation can be seen in -[[moreComplexBoxDiagram]]. - -{{{ditaa_header}}} -#+begin_src ditaa :file diagrams/simpleMath.eps - +-----+-----+ +-----+-----+ +-----+-----+ - | | | | | | | | | - | | |--->| | |--------------------------------------->| | / | - | | | | | | | | | - +-----+-----+ +-----+-----+ +-----+-----+ - | | | - | | | - V V V - + +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ - | | | | | | | | | | | | | | | | | | - | | |--->| | |--->| | / | | | |--->| | |--->| | / | - | | | | | | | | | | | | | | | | | | - +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ - | | | | | | - | | | | | | - V V V V V V - - 12 4 / 24 4 - - - -#+end_src - -#+name: moreComplexBoxDiagram -#+caption: The internal structure of the expression =(+ (- 12 4) (/ 24 4))= -#+RESULTS: -[[file:diagrams/simpleMath.eps]] - -* Evaluation order -As a first step of evaluation of a regular function, all its arguments are getting evaluated, and -then the function is applied to the evaluated arguments. For example when evaluating the nested -expression in [[code:complex-math]] the outermost function is the =+= function with three arguments: =(* -3 4)=, =(- 100 (+ 12 13 14 15))= and =2=. So before the outhermost =+= gets invoked, the three -arguments are getting evaluated recursively. - -{{{slime_header}}} -#+name: code:complex-math -#+caption: A more complex nested arithmetic expression. Nested expressions can be written more -#+caption: readable by aligning subsequent arguments vertically underneeth each other -#+begin_src slime - (print (+ (* 3 4) - (- 100 (+ 12 13 14 15)) - 2)) -#+end_src - -#+RESULTS: code:complex-math -: evaluates to => -: 60 - -** Special forms -The given evaluation rule -- to evaluate all the arguments first and then allpying them to the -funciton -- as described in [[Evaluation order]] is only valid for regular functions. There is a class -of functions that do not follow this evaluation rule called *special forms*. Special forms are -needed when you do not wish to evaluate all arguments. For example the built-in =if= function should -only evaluate the "then-expression" if the condition evaluates to a truthy value and not otherwise. -Consider the example in [[code:special-forms]]. The if expression only evaluates the then-expression. If -the =if= function would follow the evaluation order of regular functions, first all three arguments -=(< 1 2)=, =(print "I knew it!!\n")= but also =(print "Oh, it is not?!\n")= could get evaluated and -so both messages would be printed. In the given =if= expression, the condition evaluates to a truthy -value and only =I knew it!!= will be printed. - -{{{slime_header}}} -#+name: code:special-forms -#+caption: The =if= function is a special form because it does not evaluate all of its arguments -#+begin_src slime - (if (< 1 2) - (print "I knew it!!\n") - (print "Oh, it is not?!\n")) -#+end_src - -#+RESULTS: code:special-forms -: evaluates to => -: I knew it!! - -The programmer can also define their own special forms using =special-lambda= and macros, which will -be explained in [[Special lambdas]] and [[Macros]]. - -* Symbols and keywords -* Truthyness -* Lambdas -Slime allows for creating anonymous functions called *lambdas*. We did not talk about binding -variables, we will do this in [[Define]], but we can still use lambdas now. Remember that Lisp -interpretes the first argument of a list in the source code as a function and the rest as the -arguments. The =lambda= special form evaluates to a *regular function object* that can then stand in -the first position of the function call list. The basic syntax for the lambda special form is: -\[\texttt{(lambda (arg1 arg2 ...) (body1) ...)}\] the first arguemnt to =lambda= is a list of the -arguments. All the following arguments will be the body of the lambda. They will be executed when -the lambda is invoked. The return value of a lambda is the value of the last evaluated expression in -the body. - -Probably the simplest function to write as a lambda is the identity function. It takes one argument -and returns it. The identity lambda and a few other simple examples of lambdas can be seen in -[[code:simple-lambdas]]. - -{{{slime_header}}} -#+name: code:simple-lambdas -#+caption: Some simle lambdas -#+begin_src slime - (printf ((lambda (x) x) 1)) - (printf ((lambda (x y) (+ x y)) 3 5)) - (printf ((lambda (x y z) (list x y z)) 1 2 3)) -#+end_src - -#+RESULTS: code:simple-lambdas -: evaluates to => -: 1 -: 8 -: (1 2 3) - -Additionally Slime lambdas have the possibility to take *optional arguments* in the form of *keyword -arguemnts* as well as a *rest argument* which allows for accepting any number of arguments. Since -these concepts are most useful when the function is actually bound to a variable, they will be -introduced when we learned how to do that in [[Define]]. - -** Special lambdas -The =lambda= special form creates a function object that represents a regular function. So the basic -evaluation rules count: when the lambda is invoked all it's arguments are evaluated and then the -lambda is applied to the evaluated arguments. If this is not wanted in some rare cases, the -programmer also has the possibility to define a special form using =special-lambda=, which, when -invoked does not evaluare any argument. The programmer has to evaluate the arguments in the body -themselves using =eval=. The rest of the syntax between =lambda= and =special-lambda= are the same. - -{{{slime_header}}} -#+name: code:special-lambdas -#+caption: Special lambdas do not evaluate their arguments -#+begin_src slime - ((lambda (x) (printf x)) (+ 1 2)) - ((special-lambda (x) (printf x)) (+ 1 2)) - - ;; Special lambdas make it possible to write - ;; code that inspects code - ((special-lambda (expr) - (printf "The function to be called is" - (first expr) - "and the result is" - (eval expr))) - (+ 1 2)) -#+end_src - -#+RESULTS: code:special-lambdas -: evaluates to => -: 3 -: (+ 1 2) -: The function to be called is + and the result is 3. - -* Define -To assign a value to a symbol you can use the =define= built-in special form. The syntax for -=define= is: \[\texttt{(define symbol value)}\] and some usages can be seen in -[[code:variable-defines]]. - -{{{slime_header}}} -#+name: code:variable-defines -#+caption: Simple definition of variables -#+begin_src slime -(define var1 1) -(define var2 "Hello World") -(define var3 (+ 1 2)) - -(printf var1 var2 var3) -#+end_src - -#+RESULTS: code:variable-defines -: evaluates to => -: 1 Hello World 3 - -** Defining functions -In [[Lambdas]] we learned how to create function objects using the =lambda= built-in form. Using -=define= every Lisp Object can be assigned to a symbol making no exception for the function objects. -In [[code:lambda-defines]] you can see what that would look like. - -{{{slime_header}}} -#+name: code:lambda-defines -#+caption: Definition of functions using lambdas -#+begin_src slime - (define hypothenuse - (lambda (a b) - (** (+ (* a a) (* b b)) 0.5))) - - (printf (hypothenuse 3 4)) -#+end_src - -#+RESULTS: code:lambda-defines -: evaluates to => -: 5 - -Since defining functions is so common, there is a syntactic shorthand that does not require to write -out the whole =lambda= definition. In this case the first argument to the call to =define= is a -list. The frist element of the list is the name of the function to define and the other elemens are -the arguments to that function. An example can be seen in [[code:function-defines]]. Note that the -definition looks like a call to the function we are constructing, making it easier to see what a -call to that function will look like. - -{{{slime_header}}} -#+name: code:function-defines -#+caption: Definition of functions using the shorthand syntax of define -#+begin_src slime - (define (hypothenuse a b) - (** (+ (* a a) (* b b)) 0.5)) - - (printf (hypothenuse 3 4)) -#+end_src - -#+RESULTS: code:function-defines -: evaluates to => -: 5 - -** Functions with keyword arguments -A sometimes more convenient way of passing arguments to a function is using keyword arguments. Using -keyword arguments a function call could look like this: \[\texttt{(function :arg1 value1 :arg2 -value2)}\] here the function accepts two arguments named =arg1= and =arg2=. The user of this -function can see more clearly excatly which argument will be assigned wich value. This notation also -allows for switching the argument order. The following function call is equivalent to the call -above. \[\texttt{(function :arg2 value2 :arg1 value1)}\]. - -For this to work however, the function must be defined to accept these keyword arguments. To do this -the special marker =:keys= has to be inserted into the argument list of a =lambda= or a function -=define=. All following arguments *must* be supplied as keyword arguments, /unless/ they are also -supplied with a default value, in which case they do not need to be supplied. To attach a default -value to a keyword argument, insert =:defaults-to = after the keyword argument name. An -example of all of this can be seen in [[code:keyword-args]]. Important note: keyword arguments must be -defined and supplied after all the regular arguments. - -{{{slime_header}}} -#+name: code:keyword-args -#+caption: A more complex functoin definition using keyword arguments -#+begin_src slime - (define (complex required1 required2 :keys - key1 - key2 :defaults-to 3 - key3) - (* (+ required1 required2) - key1 - key2 - key3)) - - (printf (complex 1 2 :key1 2 :key2 2 :key3 3)) - (printf (complex 1 2 :key1 2 :key3 3)) - (printf (complex 1 2 :key3 3 :key1 2)) -#+end_src - -#+RESULTS: code:keyword-args -: evaluates to => -: 36 -: 54 -: 54 - -** Functions with rest arguments -If the programmer wants to create a function that can accept any number of arguments, they can use -the =rest= argument. It is defined after the special marker =:rest= and after the rest argument, no -other arguments can be defined. In the execution of the fuction, the rest arguent will be assigned -to a list containing all the supplied values. The rest argument can be used in conjunction with the -other argument types, regular arguments and keyword arguments. - -{{{slime_header}}} -#+name: code:rest-args -#+caption: A more complex functoin definition using keyword arguments -#+begin_src slime - (define (execute-operation operation - :keys - do-logging :defaults-to () - :rest values) - (define result (apply operation values)) - (when do-logging - (printf "Executing operation" - operation - "agains the values" - values - "yielded:" - result)) - result) - - (printf (execute-operation '+ 1 2 3)) - (printf (execute-operation '* - :do-logging t - 10 11)) -#+end_src - -#+RESULTS: code:rest-args -: evaluates to => -: 6 -: Executing operation * agains values (10 11) yielded: 110 -: 110 - -* Environments -* Macros -* Built-in functions - :PROPERTIES: - :UNNUMBERED: t - :END: -#+include: "./built-in-docs.org" -* COMMENT Built-in functions -This section provides a comprehensive list of the built in functions for Slime. Some of them are -defined in =C++= source code, some are themselves written in Slime. The cool thing about Slime is -that it is really easy to extend and adapt it for many purposes by writing new functions in =C++= -that for example communicate with an already existing software system, so Slime can be used as an -embedded scripting language. - -** Arithmetic functions - - =+= :: (=regular function [C++]=) Takes 0 or more numbers as arguments and returns the sum of all - the numbers. - -{{{slime_header}}} -#+name: code:built-in-= -#+begin_src slime -(printf (+)) -(printf (+ 3)) -(printf (+ 1 3 2)) -(printf (+ 1 (+ 3 4))) -#+end_src - -#+results: code:built-in-= -: evaluates to => -: 0 -: 3 -: 6 -: 8 - - - - =-= :: (=regular function [C++]=) Takes 0 or more numbers as arguments. If only one number is - supplied, its negation is returned, otherwise the difference of the first argument and the - sum of the remaining arguments is returned: - \[\texttt{(- 10 2 1)} \Rightarrow 10 - 2 - 1 = 10 - (2 + 1) = 7\] - -{{{slime_header}}} -#+name: code:built-in-- -#+begin_src slime -(printf (-)) -(printf (- 3)) -(printf (- 5 3 1)) -(printf (- 5 (+ 3 1))) -#+end_src - -#+RESULTS: code:built-in-- -: evaluates to => -: 0 -: -3 -: 1 -: 1 - - - =*= :: (=regular function [C++]=) Takes 0 or more numbers as arguments and returns the product of - all the numbers. - -{{{slime_header}}} -#+name: code:built-in-* -#+begin_src slime -(printf (*)) -(printf (* 2)) -(printf (* 5 3 2)) -(printf (* 2 (+ 3 1))) -#+end_src - -#+RESULTS: code:built-in-* -: evaluates to => -: 1 -: 2 -: 30 -: 8 - - - =/= :: (=regular function [C++]=) Takes 0 or more numbers as arguments. If only one number is - supplied, it is returned, otherwise the quotient of the first argument and the product of - the remaining arguments is returned: - \[\texttt{(/ 100 2 5)} \Rightarrow \frac{100}{\frac{2}{5}} = \frac{100}{2 \cdot 5} = 10\] - -{{{slime_header}}} -#+name: code:built-in-/ -#+begin_src slime -(printf (/)) -(printf (/ 3)) -(printf (/ 1 2)) -(printf (/ 2 (+ 3 2 1))) -#+end_src - -#+RESULTS: code:built-in-/ -: evaluates to => -: 1 -: 3 -: 0.500000 -: 0.333333 - - - =**= :: (=regular function [C++]=) Takes 2 number arguments and returns the the first argument - taken to the power of the second argument. - -{{{slime_header}}} -#+name: code:built-in-** -#+begin_src slime -(printf (** 1 200)) -(printf (** 2 6)) -(printf (** 25 0.5)) -(printf (** 27 (/ 1 3))) -#+end_src - -#+RESULTS: code:built-in-** -: evaluates to => -: 1 -: 64 -: 5 -: 3 - - - =%= :: (=regular function [C++]=) Takes 2 number arguments and rounds them down to integer values - and then returns the remainder of the division of the first argument by the second. - -{{{slime_header}}} -#+name: code:built-in-mod -#+begin_src slime -(printf (% 10 3)) -(printf (% (+ 3 (* 12 15)) 15)) -#+end_src - -#+RESULTS: code:built-in-% -: evaluates to => -: 1 -: 3 - - - =not= :: (=regular function [C++]=) - -{{{slime_header}}} -#+name: code:built-in-not -#+begin_src slime -(printf (not 10)) -(printf (not ())) -(printf (not (> 10 1))) -(printf (not (< 10 1))) -#+end_src - -#+RESULTS: code:built-in-not -: evaluates to => -: () -: t -: () -: t - - - =and= :: (=regular function [C++]=) - -{{{slime_header}}} -#+name: code:built-in-and -#+begin_src slime -(printf (and)) -(printf (and 1 2 3 4)) -(printf (and 1 2 () 4)) -(printf (and (> 3 1) (< 3 10))) -#+end_src - -#+RESULTS: code:built-in-and -: evaluates to => -: t -: t -: () -: t - - - =or= :: (=regular function [C++]=) - -{{{slime_header}}} -#+name: code:built-in-org -#+begin_src slime -(printf (or)) -(printf (or 1 2 3 4)) -(printf (or 1 2 () 4)) -(printf (or (> 1 3) (< 3 10))) -#+end_src - -#+RESULTS: code:built-in-org -: evaluates to => -: () -: t -: t -: t - - - =increment= :: (=regular function [Slime]=) -{{{slime_header}}} -#+name: code:built-in-increment -#+begin_src slime - (printf (increment 11)) -#+end_src - -#+RESULTS: code:built-in-increment -: evaluates to => -: 12 - - - - =decrement= :: (=regular function [Slime]=) -{{{slime_header}}} -#+name: code:built-in-decrement -#+begin_src slime - (printf (decrement 12)) -#+end_src - -#+RESULTS: code:built-in-decrement -: evaluates to => -: 11 - -** Comparison functions - - === :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff - \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i = \text{arg}_{i+1}\] - \indent and =()= otherwise. - -{{{slime_header}}} -#+begin_src slime -;; numbers -(pe (= 1 (+ -1 2))) -(pe (= 0 (** 3 0))) -;; strings -(pe (= "abc" "abc")) -(pe (= "abc" "abs")) -;; symbols & keywords -(pe (= 'sym1 'sym2)) -(pe (= :key1 :key1)) -#+end_src - -#+RESULTS: -: evaluates to => -: (= 1 (+ -1 2)) evaluates to t -: (= 0 (** 3 0)) evaluates to () -: (= abc abc) evaluates to t -: (= abc abs) evaluates to () -: (= 'sym1 'sym2) evaluates to () -: (= :key1 :key1) evaluates to t - - - - =>= :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff - \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i > \text{arg}_{i+1}\] - \indent and =()= otherwise. - - =>== :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff - \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i \ge \text{arg}_{i+1}\] - \indent and =()= otherwise. - - =<= :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff - \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i < \text{arg}_{i+1}\] - \indent and =()= otherwise. - - =<== :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff - \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i \le \text{arg}_{i+1}\] - \indent and =()= otherwise. - -** Controlflow - - =if= :: (=special form [C++]=) Takes 2 or more arguments. If the first argument (the - condition) evaluates to a truthy value, the second argument is evaluated and returned. - Else if more arguemnts are supplied, they will be evaluated and the last result will - be returned, if the condition was falsy and no further arguments were supplied, then - nil will be returned. - - -{{{slime_header}}} -#+name: built-in-if -#+begin_src slime -(printf (if 1 1 2)) -(printf (if () 1 2)) -(printf (if () 1 )) -#+end_src - -#+RESULTS: built-in-if -: evaluates to => -: 1 -: 2 -: () - - - =cond= :: (=special form [Slime]=) - -{{{slime_header}}} -#+name: built-in-cond -#+begin_src slime - (define (fib n) - (cond ((<= n 0) 0) - ((= n 1) 1) - (else (+ (fib (- n 1)) - (fib (- n 2)))))) - - (printf (fib 6)) -#+end_src - -#+RESULTS: built-in-cond -: evaluates to => -: 8 - - - =while= :: (=special form [C++]=) - -{{{slime_header}}} -#+name: built-in-while -#+begin_src slime - (define animals '("Bird" "Dolphin" "Giraffe")) - - (while animals - (printf (first animals) "is an animal") - (define animals (rest animals)) - ) -#+end_src - -#+RESULTS: built-in-while -: evaluates to => -: Bird is an animal -: Dolphin is an animal -: Giraffe is an animal - - - - =n-times= :: (=special form [Slime]=) - -{{{slime_header}}} -#+name: built-in-n-times -#+begin_src slime -(n-times 3 (printf "Three time's a charm")) -#+end_src - -#+RESULTS: built-in-n-times -: evaluates to => -: Three time's a charm -: Three time's a charm -: Three time's a charm - - - - =when= :: (=special form [Slime]=) - -{{{slime_header}}} -#+name: built-in-when -#+begin_src slime -(printf (when 1 2 3)) -(printf (when () 2 3)) -#+end_src - -#+RESULTS: built-in-when -: evaluates to => -: 3 -: () - - - =unless= :: (=special form [Slime]=) - -{{{slime_header}}} -#+name: built-in-unless -#+begin_src slime -(printf (unless 1 2 3)) -(printf (unless () 2 3)) -#+end_src - -#+RESULTS: built-in-unless -: evaluates to => -: () -: 3 - -** Functions for lists - - =pair= :: (=regular function [C++]=) Takes 2 arguments of any type and return a pair which - =first= field points to the first argument and the =rest= field points to the second - argument. - -{{{slime_header}}} -#+name: built-in-pair -#+begin_src slime -(printf (pair 1 "yes")) -(printf (pair '+ ())) -(printf (pair '+ (pair 1 (pair 3 ())))) -(printf (eval (pair '+ '(1 3)))) -#+end_src - -#+RESULTS: built-in-pair -: evaluates to => -: (1 . yes) -: (+) -: (+ 1 3) -: 4 - - - =first= :: (=regular function [C++]=) Takes a list as argument and returns the contents of its - =first= field. - -{{{slime_header}}} -#+name: built-in-first -#+begin_src slime -(printf (first (pair 1 3))) -(printf (first (list 2 3))) -(printf (first '("hello" "world"))) -#+end_src - -#+RESULTS: built-in-first -: evaluates to => -: 1 -: 2 -: hello - - - - =rest= :: (=regular function [C++]=) Takes a list as argument and returns the contents of its - =rest= field. -{{{slime_header}}} -#+name: built-in-rest -#+begin_src slime -(printf (rest (pair 1 3))) -(printf (rest (list 2 3))) -(printf (rest '("hello" "world"))) -#+end_src - - - - =list= :: (=regular function [C++]=) Takes any number of arguments, evaluates each and returns a - list containing the results. - -{{{slime_header}}} -#+name: built-in-list -#+begin_src slime - (printf (list)) - (printf (list 1 2 3)) - (printf (list (pair 1 2) - '(3 4) - (list 5 6))) -#+end_src - -#+RESULTS: built-in-list -: evaluates to => -: () -: (1 2 3) -: ((1 . 2) (3 4) (5 6)) - - - - =length= :: (=regular function [Slime]=) Takes a list as argument and returns the number of - elements in that list. - -{{{slime_header}}} -#+name: built-in-length -#+begin_src slime - (printf (length ())) - (printf (length '(1 2 3))) - (printf (length '(+ 1 4 (+ 2 3)))) -#+end_src - -#+RESULTS: built-in-length -: evaluates to => -: 0 -: 3 -: 4 - - - =end= :: (=regular function [Slime]=) Takes a list as argument. Returns the last pair in the - list. -{{{slime_header}}} -#+name: built-in-end -#+begin_src slime - (printf (end ())) - (printf (end '(1 2 3))) - (printf (end '(+ 1 4 (+ 2 3)))) -#+end_src - -#+RESULTS: built-in-end -: evaluates to => -: () -: (3) -: ((+ 2 3)) - - - =last= :: (=regular function [Slime]=) Takes a list as argument. Returns the last element in the - list. - -{{{slime_header}}} -#+name: built-in-last -#+begin_src slime - (printf (last ())) - (printf (last '(1 2 3))) - (printf (last '(+ 1 4 (+ 2 3)))) -#+end_src - -#+RESULTS: built-in-last -: evaluates to => -: () -: 3 -: (+ 2 3) - - - =extend= :: (=regular function [Slime]=) Takes a list and any - - - - =append= :: (=regular function [Slime]=) - - - =range= :: (=regular function [Slime]=) - - =range-while= :: (=regular function [Slime]=) - - =zip= :: (=regular function [Slime]=) - - =enumerate= :: (=regular function [Slime]=) - - - - =map= :: (=regular function [Slime]=) - - =filter= :: (=regular function [Slime]=) - - =reduce= :: (=regular function [Slime]=) - - =reduce-binary= :: (=regular function [Slime]=) - -** Functions on types - - =type= :: (=regular function [C++]=) - - =set-type= :: (=regular function [C++]=) - - =delete-type= :: (=regular function [C++]=) - - =symbol->keyword= :: (=regular function [C++]=) - - =string->symbol= :: (=regular function [C++]=) - - =symbol->string= :: (=regular function [C++]=) - -** Help and debugging - - =break= :: (=regular function [C++]=) - - =memstat= :: (=regular function [C++]=) - - =info= :: (=regular function [C++]=) - - =show= :: (=regular function [C++]=) - - =pe= :: (=special form [Slime]=) - -** I/O - - =print= :: (=regular function [C++]=) - - =read= :: (=regular function [C++]=) - - =printf= :: (=regular function [Slime]=) - -** Errors - - =try= :: (=regular function [C++]=) - - =error= :: (=regular function [C++]=) - -** no category - - =eval= :: (=regular function [C++]=) - - =apply= :: (=regular function [C++]=) - - =lambda= :: (=special form [C++]=) See the section about =Lambdas= in [[Lambdas]]. - - =special-lambda= :: (=special form [C++]=) See the section about =Lambdas= in [[Lambdas]]. - - - =copy= :: (=regular function [C++]=) - - =import= :: (=regular function [C++]=) - - =load= :: (=regular function [C++]=) - - =exit= :: (=regular function [C++]=) - - =let= :: (=regular function [C++]=) - - =quote= :: (=regular function [C++]=) - - =quasiquote= :: (=regular function [C++]=) - - =unquote= :: (=regular function [C++]=) - - =mutate= :: (=regular function [C++]=) - - =define= :: (=special form [C++]=) See the section about =define= in [[Define]]. - - =assert= :: (=regular function [C++]=) -* COMMENT testbox -* meta :noexport: -# local variables: -# org-confirm-babel-evaluate: nil -# end: - -#+author: Felix Brendel -#+mail: felixbrendel@airmail.cc -#+options: H:2 toc:nil - -#+macro: slime_header (eval (concat "#+header: :cache yes :exports both" "\n" "#+attr_latex: :options keywordstyle=\\color{slimeKeyword}, commentstyle=\\color{slimeComment}, stringstyle=\\color{slimeString}")) -#+macro: ditaa_header (eval (concat "#+header: :cache yes :exports results :cmdline --no-separation --no-shadows")) - -#+latex_class:article - -#+latex_header: \usepackage[german]{babel} -#+latex_header: \usepackage{xcolor} -#+latex_header: \usepackage{listings} -#+latex_header: \usepackage[pageanchor=false]{hyperref} - -#+latex_header: \definecolor{slimeKeyword}{HTML}{B58900} -#+latex_header: \definecolor{slimeString}{HTML}{2AA198} -#+latex_header: \definecolor{slimeComment}{HTML}{839496} - - -#+latex_header: \lstdefinelanguage{slime} -#+latex_header: { -#+latex_header: % list of keywords -#+latex_header: otherkeywords = {+,=,>,>=,<,<=,-,*,/,**}, -#+latex_header: morekeywords={+,=,>,>=,<,<=,-,*,/,**,assert,define,define-syntax,mutate,if,quote,quasiquote,and,or,not,while,let,lambda,special,eval,begin,list,pair,first,rest,set-type,delete-type,type,info,show,print,read,exit,break,memstat,try,load,copy,error,symbol->keyword,string->symbol,symbol->string,concat-strings}, -#+latex_header: basicstyle=\ttfamily\small, -#+latex_header: showstringspaces=false, -#+latex_header: sensitive=true, % keywords are not case-sensitive -#+latex_header: morecomment=[l]{;}, % l is for line comment -#+latex_header: morestring=[b]" % defines that strings are enclosed in double quotes -#+latex_header: } - -#+latex_header:\AtBeginDocument{\renewcommand{\lstlistingname}{Code}} -#+latex_header:\AtBeginDocument{\renewcommand{\ref}[1]{\autoref{#1}}} +#+title: The Slime 1.0 Manual + +#+macro: example_start (eval (concat "{{{slime_header}}}" "\n" "#+begin_src slime")) +#+macro: example_end (eval (concat "#+end_src")) + +#+begin_abstract +abstract +#+end_abstract + +\tableofcontents + +* Lisp languages +Lisp is not one language but rather a family of programming languages. The family is devided by some +characteristics. There are Lisp-1 and Lisp-2 dialects and there is a difference between a Lisp with +lexical scoping as opposed to dynamic scoping. These differences will be explained in later +sections. + +Like most Lisps, Slime is dynamically typed. That means that like in statically typed Languages +Slime has different data types, but they are associated not with variables but with the Lisp objects +themselves. Variables can be assigend Lisp objects of any internal type. + +The Lisp language family is known to be highly flexible and applicable in all areas by creating +domain specific languages in Lisp itself through a powerful macro system. The central data structure +in Lisp is the list. The reason why lisp is so powerful is because the program source code itself is +represented as lists. The nested lists make up the syntax tree of the lisp program. It is therfore +computationally easy to parse lisp programs as the source code itself is already structured in the +form of the syntax tree; allowing for parsing in linear time. + +The macro system in Slime works by recognizing macros at parse-time and running them, and replacing +the macro call in the program code with the return value of the macro and then checking if further +macros have to be expanded in the replaced code. Therefore the macros can be used to pre-compute +values or rewrite expressions (creating syntactic sugar) or themselves define macros. + +* Lists +As mentioned in [[Lisp languages]], the central data structure in all Lisps is the list. Lists are +implemented as singly linked lists, made up of pairs (historically called =cons-cells=), each pair +has two slots, the =first= and the =rest= (historically =car= and =cdr=). A linked lsit ist then +constructed by the convention that the =first= field of a pair points to the first element of the +list and the =rest= field points to the rest of the list. Following this description, the list is a +recursive data structure. For the end of the list a special value =nil= is used in the =rest= field. + +A helpful way to visualize lists made up of pairs is using box diagrams. A simple box diagram can be +seen in [[simpleBoxDiagram]]. Each rectangle is divided in two. The left part represents the =first= +field, the right part represents the =rest=. The arrows point to the values in these fields. + +The diagram in [[simpleBoxDiagram]] shows a simple list containing the values 1, 2 and 3. The first pair +stores the number 1 its =first= field and the =rest= points to the rest of the list. The last pair +points to the special value =nil= in its =rest= to denote the end of the list. + +{{{ditaa_header}}} +#+begin_src ditaa :file diagrams/list123.eps + +-----+-----+ +-----+-----+ +-----+-----+ + | | | | | | | | | + | | |--->| | |--->| | / | + | | | | | | | | | + +-----+-----+ +-----+-----+ +-----+-----+ + | | | + | | | + V V V + 1 2 3 +#+end_src + +#+name: simpleBoxDiagram +#+caption: Box diagram showing the internal structure of a list containing the values 1, 2 and 3 +#+RESULTS: +[[file:diagrams/list123.esp]] + + +However the =rest= of a pair needs not to be a pair or nil, it could also point to any other value. +By doing this the list is no longer "well formed" but rather "ill formed". Ill formed lsits can be +used as an optimization when using the list for storing data. In [[illFormedList]] an ill formed list +can be seen, that also contains the values 1, 2 and 3 but stores them using only two pairs instead +of 3. + +{{{ditaa_header}}} +#+begin_src ditaa :file diagrams/list12.3.eps + +-----+-----+ +-----+-----+ + | | | | | | + | | |--->| | |--->3 + | | | | | | + +-----+-----+ +-----+-----+ + | | + | | + V V + 1 2 +#+end_src + +#+name: illFormedList +#+caption: The internal structure of an ill formed list where the last pair points to the value 3 +#+RESULTS: +[[file:diagrams/list12.3.eps]] + +** representing lists in Lisp + +In Slime and in most Lisps, lists are represented using round parenthesis where =(= denotes the +start of the list and =)= denotes the end. Eeach element inside these parenthesis separated by one +or more spaces will be interpreted as an element of that list. For example the list from +[[simpleBoxDiagram]] would be represented as =(1 2 3)=. During parse time, the Lisp parser transforms +the parenthesised list into the pairs that are in the end stored in memory. + +To also be able to represent ill formed lists in Lisp there is a special syntax using the =.= (dot +symbol). If the parser encounters a =.= inside of a list, it will treat the next element as the +=rest=. If there is no or more than one element after the =.= an parsing error will be thrown. Using +this syntax we can represent the ill formed list from [[illFormedList]] as =(1 2 . 3)=. We can also +write well formed lists using the dot notation if we point the rest to another list. So the well +formed list from [[simpleBoxDiagram]] can also be written as \[\texttt{(1 . (2 . (3)))}\] + +** representing function calls in Lisp + +If we tried to enter the Lisp representation of the lists like =(1 2 3)= discussed in [[representing +lists in Lisp]] directly into an Lisp interpreter we would get an error. That doesn't mean that the +explanation given in the section is wrong, it is in fact correct: the lisp parser will transform the +lisp syntax into the pairs in memory. The reason we would get an error is, that when reading Lisp +code, the Lisp interpreter first parses the code and then tries to evaluate it and return the result +back to the user. + +In Lisp by default, a list corresponds to a function call. As mentioned in [[Lisp languages]] Lisp +represents lists and Lisp programms as lists. If a list is treated as a function call, the first +element will be treated as the function and the rest of the elements will be the arguments to that +function. If we would wnter =(1 2 3)= directly into the Lisp interpreter we would get an error +saying it cannot find the function =1=. + +If we would want to compute the sum of the numbers 5 and 3 we could do this by invoking the =+= +function with 5 and 3 as its arguments. =(+ 5 3)= will evaluate to 8. We can also nest functions +calls and use the return values as parameters to other functions: =(+ (- 12 4) (/ 24 4))= will +evaluate to 14. The box diagramm showing the internal structure of that computation can be seen in +[[moreComplexBoxDiagram]]. + +{{{ditaa_header}}} +#+begin_src ditaa :file diagrams/simpleMath.eps + +-----+-----+ +-----+-----+ +-----+-----+ + | | | | | | | | | + | | |--->| | |--------------------------------------->| | / | + | | | | | | | | | + +-----+-----+ +-----+-----+ +-----+-----+ + | | | + | | | + V V V + + +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ + | | | | | | | | | | | | | | | | | | + | | |--->| | |--->| | / | | | |--->| | |--->| | / | + | | | | | | | | | | | | | | | | | | + +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ + | | | | | | + | | | | | | + V V V V V V + - 12 4 / 24 4 + + + +#+end_src + +#+name: moreComplexBoxDiagram +#+caption: The internal structure of the expression =(+ (- 12 4) (/ 24 4))= +#+RESULTS: +[[file:diagrams/simpleMath.eps]] + +* Evaluation order +As a first step of evaluation of a regular function, all its arguments are getting evaluated, and +then the function is applied to the evaluated arguments. For example when evaluating the nested +expression in [[code:complex-math]] the outermost function is the =+= function with three arguments: =(* +3 4)=, =(- 100 (+ 12 13 14 15))= and =2=. So before the outhermost =+= gets invoked, the three +arguments are getting evaluated recursively. + +{{{slime_header}}} +#+name: code:complex-math +#+caption: A more complex nested arithmetic expression. Nested expressions can be written more +#+caption: readable by aligning subsequent arguments vertically underneeth each other +#+begin_src slime + (print (+ (* 3 4) + (- 100 (+ 12 13 14 15)) + 2)) +#+end_src + +#+RESULTS: code:complex-math +: evaluates to => +: 60 + +** Special forms +The given evaluation rule -- to evaluate all the arguments first and then allpying them to the +funciton -- as described in [[Evaluation order]] is only valid for regular functions. There is a class +of functions that do not follow this evaluation rule called *special forms*. Special forms are +needed when you do not wish to evaluate all arguments. For example the built-in =if= function should +only evaluate the "then-expression" if the condition evaluates to a truthy value and not otherwise. +Consider the example in [[code:special-forms]]. The if expression only evaluates the then-expression. If +the =if= function would follow the evaluation order of regular functions, first all three arguments +=(< 1 2)=, =(print "I knew it!!\n")= but also =(print "Oh, it is not?!\n")= could get evaluated and +so both messages would be printed. In the given =if= expression, the condition evaluates to a truthy +value and only =I knew it!!= will be printed. + +{{{slime_header}}} +#+name: code:special-forms +#+caption: The =if= function is a special form because it does not evaluate all of its arguments +#+begin_src slime + (if (< 1 2) + (print "I knew it!!\n") + (print "Oh, it is not?!\n")) +#+end_src + +#+RESULTS: code:special-forms +: evaluates to => +: I knew it!! + +The programmer can also define their own special forms using =special-lambda= and macros, which will +be explained in [[Special lambdas]] and [[Macros]]. + +* Symbols and keywords +* Truthyness +* Lambdas +Slime allows for creating anonymous functions called *lambdas*. We did not talk about binding +variables, we will do this in [[Define]], but we can still use lambdas now. Remember that Lisp +interpretes the first argument of a list in the source code as a function and the rest as the +arguments. The =lambda= special form evaluates to a *regular function object* that can then stand in +the first position of the function call list. The basic syntax for the lambda special form is: +\[\texttt{(lambda (arg1 arg2 ...) (body1) ...)}\] the first arguemnt to =lambda= is a list of the +arguments. All the following arguments will be the body of the lambda. They will be executed when +the lambda is invoked. The return value of a lambda is the value of the last evaluated expression in +the body. + +Probably the simplest function to write as a lambda is the identity function. It takes one argument +and returns it. The identity lambda and a few other simple examples of lambdas can be seen in +[[code:simple-lambdas]]. + +{{{slime_header}}} +#+name: code:simple-lambdas +#+caption: Some simle lambdas +#+begin_src slime + (printf ((lambda (x) x) 1)) + (printf ((lambda (x y) (+ x y)) 3 5)) + (printf ((lambda (x y z) (list x y z)) 1 2 3)) +#+end_src + +#+RESULTS: code:simple-lambdas +: evaluates to => +: 1 +: 8 +: (1 2 3) + +Additionally Slime lambdas have the possibility to take *optional arguments* in the form of *keyword +arguemnts* as well as a *rest argument* which allows for accepting any number of arguments. Since +these concepts are most useful when the function is actually bound to a variable, they will be +introduced when we learned how to do that in [[Define]]. + +** Special lambdas +The =lambda= special form creates a function object that represents a regular function. So the basic +evaluation rules count: when the lambda is invoked all it's arguments are evaluated and then the +lambda is applied to the evaluated arguments. If this is not wanted in some rare cases, the +programmer also has the possibility to define a special form using =special-lambda=, which, when +invoked does not evaluare any argument. The programmer has to evaluate the arguments in the body +themselves using =eval=. The rest of the syntax between =lambda= and =special-lambda= are the same. + +{{{slime_header}}} +#+name: code:special-lambdas +#+caption: Special lambdas do not evaluate their arguments +#+begin_src slime + ((lambda (x) (printf x)) (+ 1 2)) + ((special-lambda (x) (printf x)) (+ 1 2)) + + ;; Special lambdas make it possible to write + ;; code that inspects code + ((special-lambda (expr) + (printf "The function to be called is" + (first expr) + "and the result is" + (eval expr))) + (+ 1 2)) +#+end_src + +#+RESULTS: code:special-lambdas +: evaluates to => +: 3 +: (+ 1 2) +: The function to be called is + and the result is 3. + +* Define +To assign a value to a symbol you can use the =define= built-in special form. The syntax for +=define= is: \[\texttt{(define symbol value)}\] and some usages can be seen in +[[code:variable-defines]]. + +{{{slime_header}}} +#+name: code:variable-defines +#+caption: Simple definition of variables +#+begin_src slime +(define var1 1) +(define var2 "Hello World") +(define var3 (+ 1 2)) + +(printf var1 var2 var3) +#+end_src + +#+RESULTS: code:variable-defines +: evaluates to => +: 1 Hello World 3 + +** Defining functions +In [[Lambdas]] we learned how to create function objects using the =lambda= built-in form. Using +=define= every Lisp Object can be assigned to a symbol making no exception for the function objects. +In [[code:lambda-defines]] you can see what that would look like. + +{{{slime_header}}} +#+name: code:lambda-defines +#+caption: Definition of functions using lambdas +#+begin_src slime + (define hypothenuse + (lambda (a b) + (** (+ (* a a) (* b b)) 0.5))) + + (printf (hypothenuse 3 4)) +#+end_src + +#+RESULTS: code:lambda-defines +: evaluates to => +: 5 + +Since defining functions is so common, there is a syntactic shorthand that does not require to write +out the whole =lambda= definition. In this case the first argument to the call to =define= is a +list. The frist element of the list is the name of the function to define and the other elemens are +the arguments to that function. An example can be seen in [[code:function-defines]]. Note that the +definition looks like a call to the function we are constructing, making it easier to see what a +call to that function will look like. + +{{{slime_header}}} +#+name: code:function-defines +#+caption: Definition of functions using the shorthand syntax of define +#+begin_src slime + (define (hypothenuse a b) + (** (+ (* a a) (* b b)) 0.5)) + + (printf (hypothenuse 3 4)) +#+end_src + +#+RESULTS: code:function-defines +: evaluates to => +: 5 + +** Functions with keyword arguments +A sometimes more convenient way of passing arguments to a function is using keyword arguments. Using +keyword arguments a function call could look like this: \[\texttt{(function :arg1 value1 :arg2 +value2)}\] here the function accepts two arguments named =arg1= and =arg2=. The user of this +function can see more clearly excatly which argument will be assigned wich value. This notation also +allows for switching the argument order. The following function call is equivalent to the call +above. \[\texttt{(function :arg2 value2 :arg1 value1)}\]. + +For this to work however, the function must be defined to accept these keyword arguments. To do this +the special marker =:keys= has to be inserted into the argument list of a =lambda= or a function +=define=. All following arguments *must* be supplied as keyword arguments, /unless/ they are also +supplied with a default value, in which case they do not need to be supplied. To attach a default +value to a keyword argument, insert =:defaults-to = after the keyword argument name. An +example of all of this can be seen in [[code:keyword-args]]. Important note: keyword arguments must be +defined and supplied after all the regular arguments. + +{{{slime_header}}} +#+name: code:keyword-args +#+caption: A more complex functoin definition using keyword arguments +#+begin_src slime + (define (complex required1 required2 :keys + key1 + key2 :defaults-to 3 + key3) + (* (+ required1 required2) + key1 + key2 + key3)) + + (printf (complex 1 2 :key1 2 :key2 2 :key3 3)) + (printf (complex 1 2 :key1 2 :key3 3)) + (printf (complex 1 2 :key3 3 :key1 2)) +#+end_src + +#+RESULTS: code:keyword-args +: evaluates to => +: 36 +: 54 +: 54 + +** Functions with rest arguments +If the programmer wants to create a function that can accept any number of arguments, they can use +the =rest= argument. It is defined after the special marker =:rest= and after the rest argument, no +other arguments can be defined. In the execution of the fuction, the rest arguent will be assigned +to a list containing all the supplied values. The rest argument can be used in conjunction with the +other argument types, regular arguments and keyword arguments. + +{{{slime_header}}} +#+name: code:rest-args +#+caption: A more complex functoin definition using keyword arguments +#+begin_src slime + (define (execute-operation operation + :keys + do-logging :defaults-to () + :rest values) + (define result (apply operation values)) + (when do-logging + (printf "Executing operation" + operation + "agains the values" + values + "yielded:" + result)) + result) + + (printf (execute-operation '+ 1 2 3)) + (printf (execute-operation '* + :do-logging t + 10 11)) +#+end_src + +#+RESULTS: code:rest-args +: evaluates to => +: 6 +: Executing operation * agains values (10 11) yielded: 110 +: 110 + +* Environments +* Macros +* Built-in functions + :PROPERTIES: + :UNNUMBERED: t + :END: +#+include: "./built-in-docs.org" +* COMMENT Built-in functions +This section provides a comprehensive list of the built in functions for Slime. Some of them are +defined in =C++= source code, some are themselves written in Slime. The cool thing about Slime is +that it is really easy to extend and adapt it for many purposes by writing new functions in =C++= +that for example communicate with an already existing software system, so Slime can be used as an +embedded scripting language. + +** Arithmetic functions + - =+= :: (=regular function [C++]=) Takes 0 or more numbers as arguments and returns the sum of all + the numbers. + +{{{slime_header}}} +#+name: code:built-in-= +#+begin_src slime +(printf (+)) +(printf (+ 3)) +(printf (+ 1 3 2)) +(printf (+ 1 (+ 3 4))) +#+end_src + +#+results: code:built-in-= +: evaluates to => +: 0 +: 3 +: 6 +: 8 + + + - =-= :: (=regular function [C++]=) Takes 0 or more numbers as arguments. If only one number is + supplied, its negation is returned, otherwise the difference of the first argument and the + sum of the remaining arguments is returned: + \[\texttt{(- 10 2 1)} \Rightarrow 10 - 2 - 1 = 10 - (2 + 1) = 7\] + +{{{slime_header}}} +#+name: code:built-in-- +#+begin_src slime +(printf (-)) +(printf (- 3)) +(printf (- 5 3 1)) +(printf (- 5 (+ 3 1))) +#+end_src + +#+RESULTS: code:built-in-- +: evaluates to => +: 0 +: -3 +: 1 +: 1 + + - =*= :: (=regular function [C++]=) Takes 0 or more numbers as arguments and returns the product of + all the numbers. + +{{{slime_header}}} +#+name: code:built-in-* +#+begin_src slime +(printf (*)) +(printf (* 2)) +(printf (* 5 3 2)) +(printf (* 2 (+ 3 1))) +#+end_src + +#+RESULTS: code:built-in-* +: evaluates to => +: 1 +: 2 +: 30 +: 8 + + - =/= :: (=regular function [C++]=) Takes 0 or more numbers as arguments. If only one number is + supplied, it is returned, otherwise the quotient of the first argument and the product of + the remaining arguments is returned: + \[\texttt{(/ 100 2 5)} \Rightarrow \frac{100}{\frac{2}{5}} = \frac{100}{2 \cdot 5} = 10\] + +{{{slime_header}}} +#+name: code:built-in-/ +#+begin_src slime +(printf (/)) +(printf (/ 3)) +(printf (/ 1 2)) +(printf (/ 2 (+ 3 2 1))) +#+end_src + +#+RESULTS: code:built-in-/ +: evaluates to => +: 1 +: 3 +: 0.500000 +: 0.333333 + + - =**= :: (=regular function [C++]=) Takes 2 number arguments and returns the the first argument + taken to the power of the second argument. + +{{{slime_header}}} +#+name: code:built-in-** +#+begin_src slime +(printf (** 1 200)) +(printf (** 2 6)) +(printf (** 25 0.5)) +(printf (** 27 (/ 1 3))) +#+end_src + +#+RESULTS: code:built-in-** +: evaluates to => +: 1 +: 64 +: 5 +: 3 + + - =%= :: (=regular function [C++]=) Takes 2 number arguments and rounds them down to integer values + and then returns the remainder of the division of the first argument by the second. + +{{{slime_header}}} +#+name: code:built-in-mod +#+begin_src slime +(printf (% 10 3)) +(printf (% (+ 3 (* 12 15)) 15)) +#+end_src + +#+RESULTS: code:built-in-% +: evaluates to => +: 1 +: 3 + + - =not= :: (=regular function [C++]=) + +{{{slime_header}}} +#+name: code:built-in-not +#+begin_src slime +(printf (not 10)) +(printf (not ())) +(printf (not (> 10 1))) +(printf (not (< 10 1))) +#+end_src + +#+RESULTS: code:built-in-not +: evaluates to => +: () +: t +: () +: t + + - =and= :: (=regular function [C++]=) + +{{{slime_header}}} +#+name: code:built-in-and +#+begin_src slime +(printf (and)) +(printf (and 1 2 3 4)) +(printf (and 1 2 () 4)) +(printf (and (> 3 1) (< 3 10))) +#+end_src + +#+RESULTS: code:built-in-and +: evaluates to => +: t +: t +: () +: t + + - =or= :: (=regular function [C++]=) + +{{{slime_header}}} +#+name: code:built-in-org +#+begin_src slime +(printf (or)) +(printf (or 1 2 3 4)) +(printf (or 1 2 () 4)) +(printf (or (> 1 3) (< 3 10))) +#+end_src + +#+RESULTS: code:built-in-org +: evaluates to => +: () +: t +: t +: t + + - =increment= :: (=regular function [Slime]=) +{{{slime_header}}} +#+name: code:built-in-increment +#+begin_src slime + (printf (increment 11)) +#+end_src + +#+RESULTS: code:built-in-increment +: evaluates to => +: 12 + + + - =decrement= :: (=regular function [Slime]=) +{{{slime_header}}} +#+name: code:built-in-decrement +#+begin_src slime + (printf (decrement 12)) +#+end_src + +#+RESULTS: code:built-in-decrement +: evaluates to => +: 11 + +** Comparison functions + - === :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff + \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i = \text{arg}_{i+1}\] + \indent and =()= otherwise. + +{{{slime_header}}} +#+begin_src slime +;; numbers +(pe (= 1 (+ -1 2))) +(pe (= 0 (** 3 0))) +;; strings +(pe (= "abc" "abc")) +(pe (= "abc" "abs")) +;; symbols & keywords +(pe (= 'sym1 'sym2)) +(pe (= :key1 :key1)) +#+end_src + +#+RESULTS: +: evaluates to => +: (= 1 (+ -1 2)) evaluates to t +: (= 0 (** 3 0)) evaluates to () +: (= abc abc) evaluates to t +: (= abc abs) evaluates to () +: (= 'sym1 'sym2) evaluates to () +: (= :key1 :key1) evaluates to t + + + - =>= :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff + \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i > \text{arg}_{i+1}\] + \indent and =()= otherwise. + - =>== :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff + \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i \ge \text{arg}_{i+1}\] + \indent and =()= otherwise. + - =<= :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff + \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i < \text{arg}_{i+1}\] + \indent and =()= otherwise. + - =<== :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff + \[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i \le \text{arg}_{i+1}\] + \indent and =()= otherwise. + +** Controlflow + - =if= :: (=special form [C++]=) Takes 2 or more arguments. If the first argument (the + condition) evaluates to a truthy value, the second argument is evaluated and returned. + Else if more arguemnts are supplied, they will be evaluated and the last result will + be returned, if the condition was falsy and no further arguments were supplied, then + nil will be returned. + + +{{{slime_header}}} +#+name: built-in-if +#+begin_src slime +(printf (if 1 1 2)) +(printf (if () 1 2)) +(printf (if () 1 )) +#+end_src + +#+RESULTS: built-in-if +: evaluates to => +: 1 +: 2 +: () + + - =cond= :: (=special form [Slime]=) + +{{{slime_header}}} +#+name: built-in-cond +#+begin_src slime + (define (fib n) + (cond ((<= n 0) 0) + ((= n 1) 1) + (else (+ (fib (- n 1)) + (fib (- n 2)))))) + + (printf (fib 6)) +#+end_src + +#+RESULTS: built-in-cond +: evaluates to => +: 8 + + - =while= :: (=special form [C++]=) + +{{{slime_header}}} +#+name: built-in-while +#+begin_src slime + (define animals '("Bird" "Dolphin" "Giraffe")) + + (while animals + (printf (first animals) "is an animal") + (define animals (rest animals)) + ) +#+end_src + +#+RESULTS: built-in-while +: evaluates to => +: Bird is an animal +: Dolphin is an animal +: Giraffe is an animal + + + - =n-times= :: (=special form [Slime]=) + +{{{slime_header}}} +#+name: built-in-n-times +#+begin_src slime +(n-times 3 (printf "Three time's a charm")) +#+end_src + +#+RESULTS: built-in-n-times +: evaluates to => +: Three time's a charm +: Three time's a charm +: Three time's a charm + + + - =when= :: (=special form [Slime]=) + +{{{slime_header}}} +#+name: built-in-when +#+begin_src slime +(printf (when 1 2 3)) +(printf (when () 2 3)) +#+end_src + +#+RESULTS: built-in-when +: evaluates to => +: 3 +: () + + - =unless= :: (=special form [Slime]=) + +{{{slime_header}}} +#+name: built-in-unless +#+begin_src slime +(printf (unless 1 2 3)) +(printf (unless () 2 3)) +#+end_src + +#+RESULTS: built-in-unless +: evaluates to => +: () +: 3 + +** Functions for lists + - =pair= :: (=regular function [C++]=) Takes 2 arguments of any type and return a pair which + =first= field points to the first argument and the =rest= field points to the second + argument. + +{{{slime_header}}} +#+name: built-in-pair +#+begin_src slime +(printf (pair 1 "yes")) +(printf (pair '+ ())) +(printf (pair '+ (pair 1 (pair 3 ())))) +(printf (eval (pair '+ '(1 3)))) +#+end_src + +#+RESULTS: built-in-pair +: evaluates to => +: (1 . yes) +: (+) +: (+ 1 3) +: 4 + + - =first= :: (=regular function [C++]=) Takes a list as argument and returns the contents of its + =first= field. + +{{{slime_header}}} +#+name: built-in-first +#+begin_src slime +(printf (first (pair 1 3))) +(printf (first (list 2 3))) +(printf (first '("hello" "world"))) +#+end_src + +#+RESULTS: built-in-first +: evaluates to => +: 1 +: 2 +: hello + + + - =rest= :: (=regular function [C++]=) Takes a list as argument and returns the contents of its + =rest= field. +{{{slime_header}}} +#+name: built-in-rest +#+begin_src slime +(printf (rest (pair 1 3))) +(printf (rest (list 2 3))) +(printf (rest '("hello" "world"))) +#+end_src + + + - =list= :: (=regular function [C++]=) Takes any number of arguments, evaluates each and returns a + list containing the results. + +{{{slime_header}}} +#+name: built-in-list +#+begin_src slime + (printf (list)) + (printf (list 1 2 3)) + (printf (list (pair 1 2) + '(3 4) + (list 5 6))) +#+end_src + +#+RESULTS: built-in-list +: evaluates to => +: () +: (1 2 3) +: ((1 . 2) (3 4) (5 6)) + + + - =length= :: (=regular function [Slime]=) Takes a list as argument and returns the number of + elements in that list. + +{{{slime_header}}} +#+name: built-in-length +#+begin_src slime + (printf (length ())) + (printf (length '(1 2 3))) + (printf (length '(+ 1 4 (+ 2 3)))) +#+end_src + +#+RESULTS: built-in-length +: evaluates to => +: 0 +: 3 +: 4 + + - =end= :: (=regular function [Slime]=) Takes a list as argument. Returns the last pair in the + list. +{{{slime_header}}} +#+name: built-in-end +#+begin_src slime + (printf (end ())) + (printf (end '(1 2 3))) + (printf (end '(+ 1 4 (+ 2 3)))) +#+end_src + +#+RESULTS: built-in-end +: evaluates to => +: () +: (3) +: ((+ 2 3)) + + - =last= :: (=regular function [Slime]=) Takes a list as argument. Returns the last element in the + list. + +{{{slime_header}}} +#+name: built-in-last +#+begin_src slime + (printf (last ())) + (printf (last '(1 2 3))) + (printf (last '(+ 1 4 (+ 2 3)))) +#+end_src + +#+RESULTS: built-in-last +: evaluates to => +: () +: 3 +: (+ 2 3) + + - =extend= :: (=regular function [Slime]=) Takes a list and any + + + - =append= :: (=regular function [Slime]=) + + - =range= :: (=regular function [Slime]=) + - =range-while= :: (=regular function [Slime]=) + - =zip= :: (=regular function [Slime]=) + - =enumerate= :: (=regular function [Slime]=) + + + - =map= :: (=regular function [Slime]=) + - =filter= :: (=regular function [Slime]=) + - =reduce= :: (=regular function [Slime]=) + - =reduce-binary= :: (=regular function [Slime]=) + +** Functions on types + - =type= :: (=regular function [C++]=) + - =set-type= :: (=regular function [C++]=) + - =delete-type= :: (=regular function [C++]=) + - =symbol->keyword= :: (=regular function [C++]=) + - =string->symbol= :: (=regular function [C++]=) + - =symbol->string= :: (=regular function [C++]=) + +** Help and debugging + - =break= :: (=regular function [C++]=) + - =memstat= :: (=regular function [C++]=) + - =info= :: (=regular function [C++]=) + - =show= :: (=regular function [C++]=) + - =pe= :: (=special form [Slime]=) + +** I/O + - =print= :: (=regular function [C++]=) + - =read= :: (=regular function [C++]=) + - =printf= :: (=regular function [Slime]=) + +** Errors + - =try= :: (=regular function [C++]=) + - =error= :: (=regular function [C++]=) + +** no category + - =eval= :: (=regular function [C++]=) + - =apply= :: (=regular function [C++]=) + - =lambda= :: (=special form [C++]=) See the section about =Lambdas= in [[Lambdas]]. + - =special-lambda= :: (=special form [C++]=) See the section about =Lambdas= in [[Lambdas]]. + + - =copy= :: (=regular function [C++]=) + - =import= :: (=regular function [C++]=) + - =load= :: (=regular function [C++]=) + - =exit= :: (=regular function [C++]=) + - =let= :: (=regular function [C++]=) + - =quote= :: (=regular function [C++]=) + - =quasiquote= :: (=regular function [C++]=) + - =unquote= :: (=regular function [C++]=) + - =mutate= :: (=regular function [C++]=) + - =define= :: (=special form [C++]=) See the section about =define= in [[Define]]. + - =assert= :: (=regular function [C++]=) +* COMMENT testbox +* meta :noexport: +# local variables: +# org-confirm-babel-evaluate: nil +# end: + +#+author: Felix Brendel +#+mail: felixbrendel@airmail.cc +#+options: H:2 toc:nil + +#+macro: slime_header (eval (concat "#+header: :cache yes :exports both" "\n" "#+attr_latex: :options keywordstyle=\\color{slimeKeyword}, commentstyle=\\color{slimeComment}, stringstyle=\\color{slimeString}")) +#+macro: ditaa_header (eval (concat "#+header: :cache yes :exports results :cmdline --no-separation --no-shadows")) + +#+latex_class:article + +#+latex_header: \usepackage[german]{babel} +#+latex_header: \usepackage{xcolor} +#+latex_header: \usepackage{listings} +#+latex_header: \usepackage[pageanchor=false]{hyperref} + +#+latex_header: \definecolor{slimeKeyword}{HTML}{B58900} +#+latex_header: \definecolor{slimeString}{HTML}{2AA198} +#+latex_header: \definecolor{slimeComment}{HTML}{839496} + + +#+latex_header: \lstdefinelanguage{slime} +#+latex_header: { +#+latex_header: % list of keywords +#+latex_header: otherkeywords = {+,=,>,>=,<,<=,-,*,/,**}, +#+latex_header: morekeywords={+,=,>,>=,<,<=,-,*,/,**,assert,define,define-syntax,mutate,if,quote,quasiquote,and,or,not,while,let,lambda,special,eval,begin,list,pair,first,rest,set-type,delete-type,type,info,show,print,read,exit,break,memstat,try,load,copy,error,symbol->keyword,string->symbol,symbol->string,concat-strings}, +#+latex_header: basicstyle=\ttfamily\small, +#+latex_header: showstringspaces=false, +#+latex_header: sensitive=true, % keywords are not case-sensitive +#+latex_header: morecomment=[l]{;}, % l is for line comment +#+latex_header: morestring=[b]" % defines that strings are enclosed in double quotes +#+latex_header: } + +#+latex_header:\AtBeginDocument{\renewcommand{\lstlistingname}{Code}} +#+latex_header:\AtBeginDocument{\renewcommand{\ref}[1]{\autoref{#1}}} diff --git a/me-management.org b/me-management.org index 7b16623..1b9132f 100644 --- a/me-management.org +++ b/me-management.org @@ -1,36 +1,36 @@ -* mallocs - -|------------------------------------------+------------------------| -| location | always freed | -|------------------------------------------+------------------------| -| [[file:3rd\ftb\arraylist.hpp::11]]: | yes | -| [[file:.\3rd\ftb\bucket_allocator.hpp::17]]: | yes | -| [[file:.\3rd\ftb\bucket_allocator.hpp::44]]: | yes | -| [[file:.\3rd\ftb\bucket_allocator.hpp::46]]: | yes | -| [[file:.\src\io.cpp::49]]: | yes | -| [[file:.\src\io.cpp::164]]: | yes | -| [[file:.\src\io.cpp::209]]: | yes | -| [[file:.\src\io.cpp::285]]: | yes | -| [[file:.\src\memory.cpp::158]]: | yes in free_everything | -| [[file:.\src\platform.cpp::3]]: | yes | -| [[file:.\src\platform.cpp::27]]: | yes | -| [[file:.\src\platform.cpp::47]]: | yes | -| [[file:.\src\platform.cpp::81]]: | yes | -|------------------------------------------+------------------------| - -* news - -|----------------------------------+-------------------------------------------------------------------------------------| -| location | always deleted | -|----------------------------------+-------------------------------------------------------------------------------------| -| [[file:.\src\eval.cpp::262]]: | ::new (&(result->positional.symbols)) Array_List; | -| [[file:.\src\eval.cpp::263]]: | ::new (&(result->keyword.keywords)) Array_List; | -| [[file:.\src\eval.cpp:264]]: | ::new (&(result->keyword.values)) Array_List; | -| [[file:.\src\io.cpp:284]]: | // allocate a new block of memory size char (1 byte) instead of wide char (2 bytes) | -| [[file:.\src\io.cpp:306]]: | wchar_t* wc = new wchar_t[cSize]; | -| [[file:.\src\memory.cpp:336]]: | // node->value.lambdaWrapper = new Lambda_Wrapper(function); | -| [[file:.\src\memory.cpp:383]]: | // inject a new array list; | -| [[file:.\src\parse.cpp:195]]: | // better for keeping track of the encountered new lines and | -| [[file:.\src\parse.cpp:196]]: | // characters since last new line so we can update the parser | -| [[file:.\src\parse.cpp:208]]: | /* new col = (count chars since last \n) + 1 */ | -|----------------------------------+-------------------------------------------------------------------------------------| +* mallocs + +|------------------------------------------+------------------------| +| location | always freed | +|------------------------------------------+------------------------| +| [[file:3rd\ftb\arraylist.hpp::11]]: | yes | +| [[file:.\3rd\ftb\bucket_allocator.hpp::17]]: | yes | +| [[file:.\3rd\ftb\bucket_allocator.hpp::44]]: | yes | +| [[file:.\3rd\ftb\bucket_allocator.hpp::46]]: | yes | +| [[file:.\src\io.cpp::49]]: | yes | +| [[file:.\src\io.cpp::164]]: | yes | +| [[file:.\src\io.cpp::209]]: | yes | +| [[file:.\src\io.cpp::285]]: | yes | +| [[file:.\src\memory.cpp::158]]: | yes in free_everything | +| [[file:.\src\platform.cpp::3]]: | yes | +| [[file:.\src\platform.cpp::27]]: | yes | +| [[file:.\src\platform.cpp::47]]: | yes | +| [[file:.\src\platform.cpp::81]]: | yes | +|------------------------------------------+------------------------| + +* news + +|----------------------------------+-------------------------------------------------------------------------------------| +| location | always deleted | +|----------------------------------+-------------------------------------------------------------------------------------| +| [[file:.\src\eval.cpp::262]]: | ::new (&(result->positional.symbols)) Array_List; | +| [[file:.\src\eval.cpp::263]]: | ::new (&(result->keyword.keywords)) Array_List; | +| [[file:.\src\eval.cpp:264]]: | ::new (&(result->keyword.values)) Array_List; | +| [[file:.\src\io.cpp:284]]: | // allocate a new block of memory size char (1 byte) instead of wide char (2 bytes) | +| [[file:.\src\io.cpp:306]]: | wchar_t* wc = new wchar_t[cSize]; | +| [[file:.\src\memory.cpp:336]]: | // node->value.lambdaWrapper = new Lambda_Wrapper(function); | +| [[file:.\src\memory.cpp:383]]: | // inject a new array list; | +| [[file:.\src\parse.cpp:195]]: | // better for keeping track of the encountered new lines and | +| [[file:.\src\parse.cpp:196]]: | // characters since last new line so we can update the parser | +| [[file:.\src\parse.cpp:208]]: | /* new col = (count chars since last \n) + 1 */ | +|----------------------------------+-------------------------------------------------------------------------------------| diff --git a/profiler_vis/report2tracing.py b/profiler_vis/report2tracing.py index 5f3c108..0ee2d5c 100644 --- a/profiler_vis/report2tracing.py +++ b/profiler_vis/report2tracing.py @@ -1,63 +1,63 @@ -import json -import csv -import sys - -class FancyFloat(float): - def __repr__(self): - return format(Decimal(self), "f") - -class JsonRpcEncoder(json.JSONEncoder): - def decimalize(self, val): - if isinstance(val, dict): - return {k:self.decimalize(v) for k,v in val.items()} - - if isinstance(val, (list, tuple)): - return type(val)(self.decimalize(v) for v in val) - - if isinstance(val, float): - return FancyFloat(val) - - return val - - def encode(self, val): - return super().encode(self.decimalize(val)) - -if len(sys.argv) == 1: - print("No file was provided") -else: - trace_events = [] - call_stack = [] - with open(sys.argv[1], "r") as in_file: - csv_reader = csv.reader(in_file, delimiter=',') - pf = 1 - first_line = True - for line in csv_reader: - if first_line: - pf = float(line[0]) / 1000 - first_line = False - continue - if line[0] == "->": - call_stack.append(line) - elif line[0] == "<-": - call = call_stack.pop() - dict = { - "pid": 1, - "tid": 1, - "ts" : float(call[1]), - "dur": (float(line[1])-float(call[1])), - "ph" : "X", - "name": call[2], - "args": { - "file": f"({call[3]}:{call[4]})", - } - } - if call[5]: - dict["args"]["info1"] = call[5] - if call[6]: - dict["args"]["info2"] = call[6] - trace_events.append(dict) - else: - print("invalid syntax") - break - with open("out.json", "w") as out_file: - out_file.write(json.dumps({"traceEvents": trace_events})) +import json +import csv +import sys + +class FancyFloat(float): + def __repr__(self): + return format(Decimal(self), "f") + +class JsonRpcEncoder(json.JSONEncoder): + def decimalize(self, val): + if isinstance(val, dict): + return {k:self.decimalize(v) for k,v in val.items()} + + if isinstance(val, (list, tuple)): + return type(val)(self.decimalize(v) for v in val) + + if isinstance(val, float): + return FancyFloat(val) + + return val + + def encode(self, val): + return super().encode(self.decimalize(val)) + +if len(sys.argv) == 1: + print("No file was provided") +else: + trace_events = [] + call_stack = [] + with open(sys.argv[1], "r") as in_file: + csv_reader = csv.reader(in_file, delimiter=',') + pf = 1 + first_line = True + for line in csv_reader: + if first_line: + pf = float(line[0]) / 1000 + first_line = False + continue + if line[0] == "->": + call_stack.append(line) + elif line[0] == "<-": + call = call_stack.pop() + dict = { + "pid": 1, + "tid": 1, + "ts" : float(call[1]), + "dur": (float(line[1])-float(call[1])), + "ph" : "X", + "name": call[2], + "args": { + "file": f"({call[3]}:{call[4]})", + } + } + if call[5]: + dict["args"]["info1"] = call[5] + if call[6]: + dict["args"]["info2"] = call[6] + trace_events.append(dict) + else: + print("invalid syntax") + break + with open("out.json", "w") as out_file: + out_file.write(json.dumps({"traceEvents": trace_events})) diff --git a/profiler_vis/speedscope/LICENSE b/profiler_vis/speedscope/LICENSE index baf3e9d..122f50d 100644 --- a/profiler_vis/speedscope/LICENSE +++ b/profiler_vis/speedscope/LICENSE @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2018 Jamie Wong - -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. +MIT License + +Copyright (c) 2018 Jamie Wong + +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/profiler_vis/speedscope/README b/profiler_vis/speedscope/README index 4d89727..5253d2c 100644 --- a/profiler_vis/speedscope/README +++ b/profiler_vis/speedscope/README @@ -1,2 +1,2 @@ -This is a self-contained release of https://github.com/jlfwong/speedscope. -To use it, open index.html in Chrome or Firefox. +This is a self-contained release of https://github.com/jlfwong/speedscope. +To use it, open index.html in Chrome or Firefox. diff --git a/profiler_vis/speedscope/demangle-cpp.6caf93ee.js b/profiler_vis/speedscope/demangle-cpp.6caf93ee.js index 2aae8ef..d7c3ded 100644 --- a/profiler_vis/speedscope/demangle-cpp.6caf93ee.js +++ b/profiler_vis/speedscope/demangle-cpp.6caf93ee.js @@ -1,4 +1,4 @@ -parcelRequire=function(e,r,n,t){var i="function"==typeof parcelRequire&&parcelRequire,o="function"==typeof require&&require;function u(n,t){if(!r[n]){if(!e[n]){var f="function"==typeof parcelRequire&&parcelRequire;if(!t&&f)return f(n,!0);if(i)return i(n,!0);if(o&&"string"==typeof n)return o(n);var c=new Error("Cannot find module '"+n+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[n][1][r]||r};var l=r[n]=new u.Module(n);e[n][0].call(l.exports,p,l,l.exports,this)}return r[n].exports;function p(e){return u(p.resolve(e))}}u.isParcelRequire=!0,u.Module=function(e){this.id=e,this.bundle=u,this.exports={}},u.modules=e,u.cache=r,u.parent=i,u.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]};for(var f=0;f0&&$e.streams[2].object.output("\\n".charCodeAt(0)),$e.streams[3]&&$e.streams[3].object.output.buffer.length>0&&$e.streams[3].object.output("\\n".charCodeAt(0)))}},Je=Ja;Ve.unshift({func:function(){$e.ignorePermissions=!1,$e.init.initialized||$e.init()}}),Be.push({func:function(){$e.quit()}}),Ya(0),ae.buf=_(12,"void*",we),Module.callMain=function(r){function a(){for(var r=0;r<3;r++)i.push(0)}var e=r.length+1,i=[_(p("/bin/this.program"),"i8",we)];a();for(var v=0;v>2]=0|He.__str,Se[ri+4>>2]=0|He.__str1,Se[ri+16>>2]=0|He.__str2,Se[ri+20>>2]=0|He.__str3,Se[ri+32>>2]=0|He.__str4,Se[ri+36>>2]=0|He.__str5,Se[ri+48>>2]=0|He.__str6,Se[ri+52>>2]=0|He.__str7,Se[ri+64>>2]=0|He.__str8,Se[ri+68>>2]=0|He.__str7,Se[ri+80>>2]=0|He.__str9,Se[ri+84>>2]=0|He.__str10,Se[ri+96>>2]=0|He.__str11,Se[ri+100>>2]=0|He.__str12,Se[ri+112>>2]=0|He.__str13,Se[ri+116>>2]=0|He.__str14,Se[ri+128>>2]=0|He.__str15,Se[ri+132>>2]=0|He.__str16,Se[ri+144>>2]=0|He.__str17,Se[ri+148>>2]=0|He.__str18,Se[ri+160>>2]=0|He.__str19,Se[ri+164>>2]=0|He.__str20,Se[ri+176>>2]=0|He.__str21,Se[ri+180>>2]=0|He.__str22,Se[ri+192>>2]=0|He.__str23,Se[ri+196>>2]=0|He.__str24,Se[ri+208>>2]=0|He.__str25,Se[ri+212>>2]=0|He.__str26,Se[ri+224>>2]=0|He.__str27,Se[ri+228>>2]=0|He.__str28,Se[ri+240>>2]=0|He.__str29,Se[ri+244>>2]=0|He.__str30,Se[ri+256>>2]=0|He.__str31,Se[ri+260>>2]=0|He.__str32,Se[ri+272>>2]=0|He.__str33,Se[ri+276>>2]=0|He.__str34,Se[ri+288>>2]=0|He.__str35,Se[ri+292>>2]=0|He.__str36,Se[ri+304>>2]=0|He.__str37,Se[ri+308>>2]=0|He.__str38,Se[ri+320>>2]=0|He.__str39,Se[ri+324>>2]=0|He.__str40,Se[ri+336>>2]=0|He.__str41,Se[ri+340>>2]=0|He.__str42,Se[ri+352>>2]=0|He.__str43,Se[ri+356>>2]=0|He.__str44,Se[ri+368>>2]=0|He.__str45,Se[ri+372>>2]=0|He.__str46,Se[ri+384>>2]=0|He.__str47,Se[ri+388>>2]=0|He.__str48,Se[ri+400>>2]=0|He.__str49,Se[ri+404>>2]=0|He.__str119289,Se[ri+416>>2]=0|He.__str51,Se[ri+420>>2]=0|He.__str20,Se[ri+432>>2]=0|He.__str52,Se[ri+436>>2]=0|He.__str53,Se[ri+448>>2]=0|He.__str54,Se[ri+452>>2]=0|He.__str55,Se[ri+464>>2]=0|He.__str56,Se[ri+468>>2]=0|He.__str57,Se[ri+480>>2]=0|He.__str58,Se[ri+484>>2]=0|He.__str119289,Se[ri+496>>2]=0|He.__str59,Se[ri+500>>2]=0|He.__str60,Se[ri+512>>2]=0|He.__str61,Se[ri+516>>2]=0|He.__str62,Se[ri+528>>2]=0|He.__str63,Se[ri+532>>2]=0|He.__str64,Se[ri+544>>2]=0|He.__str65,Se[ri+548>>2]=0|He.__str66,Se[ri+560>>2]=0|He.__str67,Se[ri+564>>2]=0|He.__str68,Se[ri+576>>2]=0|He.__str69,Se[ri+580>>2]=0|He.__str70,Se[ri+592>>2]=0|He.__str71,Se[ri+596>>2]=0|He.__str72,Se[ri+608>>2]=0|He.__str73,Se[ri+612>>2]=0|He.__str74,Se[ri+624>>2]=0|He.__str75,Se[ri+628>>2]=0|He.__str76,Se[ri+640>>2]=0|He.__str77,Se[ri+644>>2]=0|He.__str72,Se[ri+656>>2]=0|He.__str78,Se[ri+660>>2]=0|He.__str79,Se[ri+672>>2]=0|He.__str80,Se[ri+676>>2]=0|He.__str81,Se[ri+688>>2]=0|He.__str82,Se[ri+692>>2]=0|He.__str83,Se[ri+704>>2]=0|He.__str84,Se[ri+708>>2]=0|He.__str85,Se[ri+720>>2]=0|He.__str86,Se[ri+724>>2]=0|He.__str87,Se[ri+736>>2]=0|He.__str88,Se[ri+740>>2]=0|He.__str89,Se[ri+752>>2]=0|He.__str90,Se[ri+756>>2]=0|He.__str91,Se[ri+768>>2]=0|He.__str92,Se[ri+772>>2]=0|He.__str91,Se[ai>>2]=0|He.__str145315,Se[ai+8>>2]=0|He.__str145315,Se[ai+20>>2]=0|He.__str167337,Se[ai+28>>2]=0|He.__str95,Se[ai+40>>2]=0|He.__str146316,Se[ai+48>>2]=0|He.__str97,Se[ai+60>>2]=0|He.__str155325,Se[ai+68>>2]=0|He.__str155325,Se[ai+80>>2]=0|He.__str156326,Se[ai+88>>2]=0|He.__str156326,Se[ai+100>>2]=0|He.__str154324,Se[ai+108>>2]=0|He.__str154324,Se[ai+120>>2]=0|He.__str101,Se[ai+128>>2]=0|He.__str101,Se[ai+140>>2]=0|He.__str147317,Se[ai+148>>2]=0|He.__str147317,Se[ai+160>>2]=0|He.__str150320,Se[ai+168>>2]=0|He.__str150320,Se[ai+180>>2]=0|He.__str151321,Se[ai+188>>2]=0|He.__str105,Se[ai+220>>2]=0|He.__str152322,Se[ai+228>>2]=0|He.__str152322,Se[ai+240>>2]=0|He.__str153323,Se[ai+248>>2]=0|He.__str153323,Se[ai+260>>2]=0|He.__str165335,Se[ai+268>>2]=0|He.__str165335,Se[ai+280>>2]=0|He.__str166336,Se[ai+288>>2]=0|He.__str166336,Se[ai+360>>2]=0|He.__str148318,Se[ai+368>>2]=0|He.__str148318,Se[ai+380>>2]=0|He.__str149319,Se[ai+388>>2]=0|He.__str149319,Se[ai+420>>2]=0|He.__str84254,Se[ai+428>>2]=0|He.__str84254,Se[ai+440>>2]=0|He.__str168338,Se[ai+448>>2]=0|He.__str146316,Se[ai+460>>2]=0|He.__str114,Se[ai+468>>2]=0|He.__str152322,Se[ai+480>>2]=0|He.__str115,Se[ai+488>>2]=0|He.__str115,Se[ai+500>>2]=0|He.__str110280,Se[ai+508>>2]=0|He.__str110280,Se[ei+4>>2]=0|He.__str152,Se[ei+12>>2]=0|He.__str152,Se[ei+32>>2]=0|He.__str153,Se[ei+40>>2]=0|He.__str153,Se[ei+48>>2]=0|He.__str154,Se[ei+60>>2]=0|He.__str155,Se[ei+68>>2]=0|He.__str155,Se[ei+76>>2]=0|He.__str156,Se[ei+88>>2]=0|He.__str157,Se[ei+96>>2]=0|He.__str158,Se[ei+104>>2]=0|He.__str156,Se[ei+116>>2]=0|He.__str159,Se[ei+124>>2]=0|He.__str160,Se[ei+132>>2]=0|He.__str161,Se[ei+144>>2]=0|He.__str162,Se[ei+152>>2]=0|He.__str163,Se[ei+160>>2]=0|He.__str164,Se[ei+172>>2]=0|He.__str165,Se[ei+180>>2]=0|He.__str166,Se[ei+188>>2]=0|He.__str167,Se[si+4>>2]=bi,Se[ni+4>>2]=ki,oi=_([2,0,0,0,0],["i8*",0,0,0,0],we),Se[bi>>2]=oi+8|0,Se[bi+4>>2]=0|He.__ZTSSt9bad_alloc,Se[bi+8>>2]=li,Se[ki>>2]=oi+8|0,Se[ki+4>>2]=0|He.__ZTSSt20bad_array_new_length,Se[ki+8>>2]=bi,ui=16,ci=6,hi=18,di=6,wi=6,pe=[0,0,Jr,0,va,0,ya,0,ga,0,wa,0,Sa,0,pa,0,Ea,0,ma,0],Module.FUNCTION_TABLE=pe,Module.run=ee,Module.preRun&&Module.preRun(),0==Ke){ee()}Module.postRun&&Module.postRun(),Module.___cxa_demangle=G;var pi=v("__cxa_demangle","string",["string","string","number","number"]);return function(r){return pi(r,"",1,0)}}();\n'; -},{}]},{},[135], null) +parcelRequire=function(e,r,n,t){var i="function"==typeof parcelRequire&&parcelRequire,o="function"==typeof require&&require;function u(n,t){if(!r[n]){if(!e[n]){var f="function"==typeof parcelRequire&&parcelRequire;if(!t&&f)return f(n,!0);if(i)return i(n,!0);if(o&&"string"==typeof n)return o(n);var c=new Error("Cannot find module '"+n+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[n][1][r]||r};var l=r[n]=new u.Module(n);e[n][0].call(l.exports,p,l,l.exports,this)}return r[n].exports;function p(e){return u(p.resolve(e))}}u.isParcelRequire=!0,u.Module=function(e){this.id=e,this.bundle=u,this.exports={}},u.modules=e,u.cache=r,u.parent=i,u.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]};for(var f=0;f0&&$e.streams[2].object.output("\\n".charCodeAt(0)),$e.streams[3]&&$e.streams[3].object.output.buffer.length>0&&$e.streams[3].object.output("\\n".charCodeAt(0)))}},Je=Ja;Ve.unshift({func:function(){$e.ignorePermissions=!1,$e.init.initialized||$e.init()}}),Be.push({func:function(){$e.quit()}}),Ya(0),ae.buf=_(12,"void*",we),Module.callMain=function(r){function a(){for(var r=0;r<3;r++)i.push(0)}var e=r.length+1,i=[_(p("/bin/this.program"),"i8",we)];a();for(var v=0;v>2]=0|He.__str,Se[ri+4>>2]=0|He.__str1,Se[ri+16>>2]=0|He.__str2,Se[ri+20>>2]=0|He.__str3,Se[ri+32>>2]=0|He.__str4,Se[ri+36>>2]=0|He.__str5,Se[ri+48>>2]=0|He.__str6,Se[ri+52>>2]=0|He.__str7,Se[ri+64>>2]=0|He.__str8,Se[ri+68>>2]=0|He.__str7,Se[ri+80>>2]=0|He.__str9,Se[ri+84>>2]=0|He.__str10,Se[ri+96>>2]=0|He.__str11,Se[ri+100>>2]=0|He.__str12,Se[ri+112>>2]=0|He.__str13,Se[ri+116>>2]=0|He.__str14,Se[ri+128>>2]=0|He.__str15,Se[ri+132>>2]=0|He.__str16,Se[ri+144>>2]=0|He.__str17,Se[ri+148>>2]=0|He.__str18,Se[ri+160>>2]=0|He.__str19,Se[ri+164>>2]=0|He.__str20,Se[ri+176>>2]=0|He.__str21,Se[ri+180>>2]=0|He.__str22,Se[ri+192>>2]=0|He.__str23,Se[ri+196>>2]=0|He.__str24,Se[ri+208>>2]=0|He.__str25,Se[ri+212>>2]=0|He.__str26,Se[ri+224>>2]=0|He.__str27,Se[ri+228>>2]=0|He.__str28,Se[ri+240>>2]=0|He.__str29,Se[ri+244>>2]=0|He.__str30,Se[ri+256>>2]=0|He.__str31,Se[ri+260>>2]=0|He.__str32,Se[ri+272>>2]=0|He.__str33,Se[ri+276>>2]=0|He.__str34,Se[ri+288>>2]=0|He.__str35,Se[ri+292>>2]=0|He.__str36,Se[ri+304>>2]=0|He.__str37,Se[ri+308>>2]=0|He.__str38,Se[ri+320>>2]=0|He.__str39,Se[ri+324>>2]=0|He.__str40,Se[ri+336>>2]=0|He.__str41,Se[ri+340>>2]=0|He.__str42,Se[ri+352>>2]=0|He.__str43,Se[ri+356>>2]=0|He.__str44,Se[ri+368>>2]=0|He.__str45,Se[ri+372>>2]=0|He.__str46,Se[ri+384>>2]=0|He.__str47,Se[ri+388>>2]=0|He.__str48,Se[ri+400>>2]=0|He.__str49,Se[ri+404>>2]=0|He.__str119289,Se[ri+416>>2]=0|He.__str51,Se[ri+420>>2]=0|He.__str20,Se[ri+432>>2]=0|He.__str52,Se[ri+436>>2]=0|He.__str53,Se[ri+448>>2]=0|He.__str54,Se[ri+452>>2]=0|He.__str55,Se[ri+464>>2]=0|He.__str56,Se[ri+468>>2]=0|He.__str57,Se[ri+480>>2]=0|He.__str58,Se[ri+484>>2]=0|He.__str119289,Se[ri+496>>2]=0|He.__str59,Se[ri+500>>2]=0|He.__str60,Se[ri+512>>2]=0|He.__str61,Se[ri+516>>2]=0|He.__str62,Se[ri+528>>2]=0|He.__str63,Se[ri+532>>2]=0|He.__str64,Se[ri+544>>2]=0|He.__str65,Se[ri+548>>2]=0|He.__str66,Se[ri+560>>2]=0|He.__str67,Se[ri+564>>2]=0|He.__str68,Se[ri+576>>2]=0|He.__str69,Se[ri+580>>2]=0|He.__str70,Se[ri+592>>2]=0|He.__str71,Se[ri+596>>2]=0|He.__str72,Se[ri+608>>2]=0|He.__str73,Se[ri+612>>2]=0|He.__str74,Se[ri+624>>2]=0|He.__str75,Se[ri+628>>2]=0|He.__str76,Se[ri+640>>2]=0|He.__str77,Se[ri+644>>2]=0|He.__str72,Se[ri+656>>2]=0|He.__str78,Se[ri+660>>2]=0|He.__str79,Se[ri+672>>2]=0|He.__str80,Se[ri+676>>2]=0|He.__str81,Se[ri+688>>2]=0|He.__str82,Se[ri+692>>2]=0|He.__str83,Se[ri+704>>2]=0|He.__str84,Se[ri+708>>2]=0|He.__str85,Se[ri+720>>2]=0|He.__str86,Se[ri+724>>2]=0|He.__str87,Se[ri+736>>2]=0|He.__str88,Se[ri+740>>2]=0|He.__str89,Se[ri+752>>2]=0|He.__str90,Se[ri+756>>2]=0|He.__str91,Se[ri+768>>2]=0|He.__str92,Se[ri+772>>2]=0|He.__str91,Se[ai>>2]=0|He.__str145315,Se[ai+8>>2]=0|He.__str145315,Se[ai+20>>2]=0|He.__str167337,Se[ai+28>>2]=0|He.__str95,Se[ai+40>>2]=0|He.__str146316,Se[ai+48>>2]=0|He.__str97,Se[ai+60>>2]=0|He.__str155325,Se[ai+68>>2]=0|He.__str155325,Se[ai+80>>2]=0|He.__str156326,Se[ai+88>>2]=0|He.__str156326,Se[ai+100>>2]=0|He.__str154324,Se[ai+108>>2]=0|He.__str154324,Se[ai+120>>2]=0|He.__str101,Se[ai+128>>2]=0|He.__str101,Se[ai+140>>2]=0|He.__str147317,Se[ai+148>>2]=0|He.__str147317,Se[ai+160>>2]=0|He.__str150320,Se[ai+168>>2]=0|He.__str150320,Se[ai+180>>2]=0|He.__str151321,Se[ai+188>>2]=0|He.__str105,Se[ai+220>>2]=0|He.__str152322,Se[ai+228>>2]=0|He.__str152322,Se[ai+240>>2]=0|He.__str153323,Se[ai+248>>2]=0|He.__str153323,Se[ai+260>>2]=0|He.__str165335,Se[ai+268>>2]=0|He.__str165335,Se[ai+280>>2]=0|He.__str166336,Se[ai+288>>2]=0|He.__str166336,Se[ai+360>>2]=0|He.__str148318,Se[ai+368>>2]=0|He.__str148318,Se[ai+380>>2]=0|He.__str149319,Se[ai+388>>2]=0|He.__str149319,Se[ai+420>>2]=0|He.__str84254,Se[ai+428>>2]=0|He.__str84254,Se[ai+440>>2]=0|He.__str168338,Se[ai+448>>2]=0|He.__str146316,Se[ai+460>>2]=0|He.__str114,Se[ai+468>>2]=0|He.__str152322,Se[ai+480>>2]=0|He.__str115,Se[ai+488>>2]=0|He.__str115,Se[ai+500>>2]=0|He.__str110280,Se[ai+508>>2]=0|He.__str110280,Se[ei+4>>2]=0|He.__str152,Se[ei+12>>2]=0|He.__str152,Se[ei+32>>2]=0|He.__str153,Se[ei+40>>2]=0|He.__str153,Se[ei+48>>2]=0|He.__str154,Se[ei+60>>2]=0|He.__str155,Se[ei+68>>2]=0|He.__str155,Se[ei+76>>2]=0|He.__str156,Se[ei+88>>2]=0|He.__str157,Se[ei+96>>2]=0|He.__str158,Se[ei+104>>2]=0|He.__str156,Se[ei+116>>2]=0|He.__str159,Se[ei+124>>2]=0|He.__str160,Se[ei+132>>2]=0|He.__str161,Se[ei+144>>2]=0|He.__str162,Se[ei+152>>2]=0|He.__str163,Se[ei+160>>2]=0|He.__str164,Se[ei+172>>2]=0|He.__str165,Se[ei+180>>2]=0|He.__str166,Se[ei+188>>2]=0|He.__str167,Se[si+4>>2]=bi,Se[ni+4>>2]=ki,oi=_([2,0,0,0,0],["i8*",0,0,0,0],we),Se[bi>>2]=oi+8|0,Se[bi+4>>2]=0|He.__ZTSSt9bad_alloc,Se[bi+8>>2]=li,Se[ki>>2]=oi+8|0,Se[ki+4>>2]=0|He.__ZTSSt20bad_array_new_length,Se[ki+8>>2]=bi,ui=16,ci=6,hi=18,di=6,wi=6,pe=[0,0,Jr,0,va,0,ya,0,ga,0,wa,0,Sa,0,pa,0,Ea,0,ma,0],Module.FUNCTION_TABLE=pe,Module.run=ee,Module.preRun&&Module.preRun(),0==Ke){ee()}Module.postRun&&Module.postRun(),Module.___cxa_demangle=G;var pi=v("__cxa_demangle","string",["string","string","number","number"]);return function(r){return pi(r,"",1,0)}}();\n'; +},{}]},{},[135], null) //# sourceMappingURL=demangle-cpp.6caf93ee.map \ No newline at end of file diff --git a/profiler_vis/speedscope/file-format-schema.json b/profiler_vis/speedscope/file-format-schema.json index 6efef6e..2300e50 100644 --- a/profiler_vis/speedscope/file-format-schema.json +++ b/profiler_vis/speedscope/file-format-schema.json @@ -1,324 +1,324 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "definitions": { - "FileFormat.Profile": { - "anyOf": [ - { - "$ref": "#/definitions/FileFormat.EventedProfile" - }, - { - "$ref": "#/definitions/FileFormat.SampledProfile" - } - ] - }, - "FileFormat.File": { - "title": "FileFormat.File", - "type": "object", - "properties": { - "$schema": { - "type": "string", - "enum": [ - "https://www.speedscope.app/file-format-schema.json" - ], - "title": "$schema" - }, - "shared": { - "type": "object", - "properties": { - "frames": { - "type": "array", - "items": { - "$ref": "#/definitions/FileFormat.Frame" - }, - "title": "frames" - } - }, - "required": [ - "frames" - ], - "title": "shared" - }, - "profiles": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/FileFormat.EventedProfile" - }, - { - "$ref": "#/definitions/FileFormat.SampledProfile" - } - ] - }, - "title": "profiles" - }, - "name": { - "type": "string", - "title": "name" - }, - "activeProfileIndex": { - "type": "number", - "title": "activeProfileIndex" - }, - "exporter": { - "type": "string", - "title": "exporter" - } - }, - "required": [ - "$schema", - "profiles", - "shared" - ] - }, - "FileFormat.Frame": { - "title": "FileFormat.Frame", - "type": "object", - "properties": { - "name": { - "type": "string", - "title": "name" - }, - "file": { - "type": "string", - "title": "file" - }, - "line": { - "type": "number", - "title": "line" - }, - "col": { - "type": "number", - "title": "col" - } - }, - "required": [ - "name" - ] - }, - "FileFormat.ProfileType": { - "title": "FileFormat.ProfileType", - "enum": [ - "evented", - "sampled" - ], - "type": "string" - }, - "FileFormat.IProfile": { - "title": "FileFormat.IProfile", - "type": "object", - "properties": { - "type": { - "$ref": "#/definitions/FileFormat.ProfileType", - "title": "type" - } - }, - "required": [ - "type" - ] - }, - "FileFormat.EventedProfile": { - "title": "FileFormat.EventedProfile", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "evented" - ], - "title": "type" - }, - "name": { - "type": "string", - "title": "name" - }, - "unit": { - "$ref": "#/definitions/FileFormat.ValueUnit", - "title": "unit" - }, - "startValue": { - "type": "number", - "title": "startValue" - }, - "endValue": { - "type": "number", - "title": "endValue" - }, - "events": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/OpenFrameEvent" - }, - { - "$ref": "#/definitions/CloseFrameEvent" - } - ] - }, - "title": "events" - } - }, - "required": [ - "endValue", - "events", - "name", - "startValue", - "type", - "unit" - ] - }, - "SampledStack": { - "type": "array", - "items": { - "type": "number" - } - }, - "FileFormat.SampledProfile": { - "title": "FileFormat.SampledProfile", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "sampled" - ], - "title": "type" - }, - "name": { - "type": "string", - "title": "name" - }, - "unit": { - "$ref": "#/definitions/FileFormat.ValueUnit", - "title": "unit" - }, - "startValue": { - "type": "number", - "title": "startValue" - }, - "endValue": { - "type": "number", - "title": "endValue" - }, - "samples": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "number" - } - }, - "title": "samples" - }, - "weights": { - "type": "array", - "items": { - "type": "number" - }, - "title": "weights" - } - }, - "required": [ - "endValue", - "name", - "samples", - "startValue", - "type", - "unit", - "weights" - ] - }, - "FileFormat.ValueUnit": { - "title": "FileFormat.ValueUnit", - "enum": [ - "bytes", - "microseconds", - "milliseconds", - "nanoseconds", - "none", - "seconds" - ], - "type": "string" - }, - "FileFormat.EventType": { - "title": "FileFormat.EventType", - "enum": [ - "C", - "O" - ], - "type": "string" - }, - "IEvent": { - "title": "IEvent", - "type": "object", - "properties": { - "type": { - "$ref": "#/definitions/FileFormat.EventType", - "title": "type" - }, - "at": { - "type": "number", - "title": "at" - } - }, - "required": [ - "at", - "type" - ] - }, - "OpenFrameEvent": { - "title": "OpenFrameEvent", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "O" - ], - "title": "type" - }, - "frame": { - "type": "number", - "title": "frame" - }, - "at": { - "type": "number", - "title": "at" - } - }, - "required": [ - "at", - "frame", - "type" - ] - }, - "CloseFrameEvent": { - "title": "CloseFrameEvent", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "C" - ], - "title": "type" - }, - "frame": { - "type": "number", - "title": "frame" - }, - "at": { - "type": "number", - "title": "at" - } - }, - "required": [ - "at", - "frame", - "type" - ] - } - }, - "$ref": "#/definitions/FileFormat.File" -} +{ + "$schema": "http://json-schema.org/draft-06/schema#", + "definitions": { + "FileFormat.Profile": { + "anyOf": [ + { + "$ref": "#/definitions/FileFormat.EventedProfile" + }, + { + "$ref": "#/definitions/FileFormat.SampledProfile" + } + ] + }, + "FileFormat.File": { + "title": "FileFormat.File", + "type": "object", + "properties": { + "$schema": { + "type": "string", + "enum": [ + "https://www.speedscope.app/file-format-schema.json" + ], + "title": "$schema" + }, + "shared": { + "type": "object", + "properties": { + "frames": { + "type": "array", + "items": { + "$ref": "#/definitions/FileFormat.Frame" + }, + "title": "frames" + } + }, + "required": [ + "frames" + ], + "title": "shared" + }, + "profiles": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/FileFormat.EventedProfile" + }, + { + "$ref": "#/definitions/FileFormat.SampledProfile" + } + ] + }, + "title": "profiles" + }, + "name": { + "type": "string", + "title": "name" + }, + "activeProfileIndex": { + "type": "number", + "title": "activeProfileIndex" + }, + "exporter": { + "type": "string", + "title": "exporter" + } + }, + "required": [ + "$schema", + "profiles", + "shared" + ] + }, + "FileFormat.Frame": { + "title": "FileFormat.Frame", + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "name" + }, + "file": { + "type": "string", + "title": "file" + }, + "line": { + "type": "number", + "title": "line" + }, + "col": { + "type": "number", + "title": "col" + } + }, + "required": [ + "name" + ] + }, + "FileFormat.ProfileType": { + "title": "FileFormat.ProfileType", + "enum": [ + "evented", + "sampled" + ], + "type": "string" + }, + "FileFormat.IProfile": { + "title": "FileFormat.IProfile", + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/FileFormat.ProfileType", + "title": "type" + } + }, + "required": [ + "type" + ] + }, + "FileFormat.EventedProfile": { + "title": "FileFormat.EventedProfile", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "evented" + ], + "title": "type" + }, + "name": { + "type": "string", + "title": "name" + }, + "unit": { + "$ref": "#/definitions/FileFormat.ValueUnit", + "title": "unit" + }, + "startValue": { + "type": "number", + "title": "startValue" + }, + "endValue": { + "type": "number", + "title": "endValue" + }, + "events": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/OpenFrameEvent" + }, + { + "$ref": "#/definitions/CloseFrameEvent" + } + ] + }, + "title": "events" + } + }, + "required": [ + "endValue", + "events", + "name", + "startValue", + "type", + "unit" + ] + }, + "SampledStack": { + "type": "array", + "items": { + "type": "number" + } + }, + "FileFormat.SampledProfile": { + "title": "FileFormat.SampledProfile", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "sampled" + ], + "title": "type" + }, + "name": { + "type": "string", + "title": "name" + }, + "unit": { + "$ref": "#/definitions/FileFormat.ValueUnit", + "title": "unit" + }, + "startValue": { + "type": "number", + "title": "startValue" + }, + "endValue": { + "type": "number", + "title": "endValue" + }, + "samples": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "number" + } + }, + "title": "samples" + }, + "weights": { + "type": "array", + "items": { + "type": "number" + }, + "title": "weights" + } + }, + "required": [ + "endValue", + "name", + "samples", + "startValue", + "type", + "unit", + "weights" + ] + }, + "FileFormat.ValueUnit": { + "title": "FileFormat.ValueUnit", + "enum": [ + "bytes", + "microseconds", + "milliseconds", + "nanoseconds", + "none", + "seconds" + ], + "type": "string" + }, + "FileFormat.EventType": { + "title": "FileFormat.EventType", + "enum": [ + "C", + "O" + ], + "type": "string" + }, + "IEvent": { + "title": "IEvent", + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/FileFormat.EventType", + "title": "type" + }, + "at": { + "type": "number", + "title": "at" + } + }, + "required": [ + "at", + "type" + ] + }, + "OpenFrameEvent": { + "title": "OpenFrameEvent", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "O" + ], + "title": "type" + }, + "frame": { + "type": "number", + "title": "frame" + }, + "at": { + "type": "number", + "title": "at" + } + }, + "required": [ + "at", + "frame", + "type" + ] + }, + "CloseFrameEvent": { + "title": "CloseFrameEvent", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "C" + ], + "title": "type" + }, + "frame": { + "type": "number", + "title": "frame" + }, + "at": { + "type": "number", + "title": "at" + } + }, + "required": [ + "at", + "frame", + "type" + ] + } + }, + "$ref": "#/definitions/FileFormat.File" +} diff --git a/profiler_vis/speedscope/import.0a51feeb.js b/profiler_vis/speedscope/import.0a51feeb.js index 5c8babb..ccca621 100644 --- a/profiler_vis/speedscope/import.0a51feeb.js +++ b/profiler_vis/speedscope/import.0a51feeb.js @@ -1,113 +1,113 @@ -parcelRequire=function(e,r,n,t){var i="function"==typeof parcelRequire&&parcelRequire,o="function"==typeof require&&require;function u(n,t){if(!r[n]){if(!e[n]){var f="function"==typeof parcelRequire&&parcelRequire;if(!t&&f)return f(n,!0);if(i)return i(n,!0);if(o&&"string"==typeof n)return o(n);var c=new Error("Cannot find module '"+n+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[n][1][r]||r};var l=r[n]=new u.Module(n);e[n][0].call(l.exports,p,l,l.exports,this)}return r[n].exports;function p(e){return u(p.resolve(e))}}u.isParcelRequire=!0,u.Module=function(e){this.id=e,this.bundle=u,this.exports={}},u.modules=e,u.cache=r,u.parent=i,u.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]};for(var f=0;fe.id)}),r.children.forEach(e)}(e),t}function t(e,t){return e.map((r,n)=>{return r-(0===n?1e6*t:e[n-1])})}function r(r){return{samples:r.samples,startTime:1e6*r.startTime,endTime:1e6*r.endTime,nodes:e(r.head),timeDeltas:t(r.timestamps,r.startTime)}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.chromeTreeToNodes=r; -},{}],145:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isChromeTimeline=i,exports.importFromChromeTimeline=o,exports.importFromChromeCPUProfile=f,exports.importFromOldV8CPUProfile=u;var e=require("../lib/profile"),t=require("../lib/utils"),r=require("../lib/value-formatters"),n=require("./v8cpuFormatter");function i(e){if(!Array.isArray(e))return!1;if(e.length<1)return!1;const t=e[0];return"pid"in t&&"tid"in t&&"ph"in t&&"cat"in t&&!!e.find(e=>"CpuProfile"===e.name||"Profile"===e.name||"ProfileChunk"===e.name)}function o(e,r){const n=new Map,i=new Map,o=new Map;(0,t.sortBy)(e,e=>e.ts);for(let t of e){if("CpuProfile"===t.name){const e=`${t.pid}:${t.tid}`,r=t.id||e;n.set(r,t.args.data.cpuProfile),i.set(r,e)}if("Profile"===t.name){const e=`${t.pid}:${t.tid}`;n.set(t.id||e,Object.assign({startTime:0,endTime:0,nodes:[],samples:[],timeDeltas:[]},t.args.data)),t.id&&i.set(t.id,`${t.pid}:${t.tid}`)}if("thread_name"===t.name&&o.set(`${t.pid}:${t.tid}`,t.args.name),"ProfileChunk"===t.name){const e=`${t.pid}:${t.tid}`,r=n.get(t.id||e);if(r){const e=t.args.data;e.cpuProfile&&(e.cpuProfile.nodes&&(r.nodes=r.nodes.concat(e.cpuProfile.nodes)),e.cpuProfile.samples&&(r.samples=r.samples.concat(e.cpuProfile.samples))),e.timeDeltas&&(r.timeDeltas=r.timeDeltas.concat(e.timeDeltas)),null!=e.startTime&&(r.startTime=e.startTime),null!=e.endTime&&(r.endTime=e.endTime)}else console.warn(`Ignoring ProfileChunk for undeclared Profile with id ${t.id||e}`)}}if(n.size>0){const e=[];let l=0;return(0,t.itForEach)(n.keys(),t=>{let a=null,s=i.get(t);s&&(a=o.get(s)||null);const m=f(n.get(t));a&&n.size>1?(m.setName(`${r} - ${a}`),"CrRendererMain"===a&&(l=e.length)):m.setName(`${r}`),e.push(m)}),{name:r,indexToView:l,profiles:e}}throw new Error("Could not find CPU profile in Timeline")}const l=new Map;function a(e){return(0,t.getOrInsert)(l,e,e=>{const t=e.functionName||"(anonymous)",r=e.url,n=e.lineNumber,i=e.columnNumber;return{key:`${t}:${r}:${n}:${i}`,name:t,file:r,line:n,col:i}})}function s(e){const{functionName:t,url:r}=e;return"native dummy.js"===r||("(root)"===t||"(idle)"===t)}function m(e){return"(garbage collector)"===e||"(program)"===e}function f(n){const i=new e.CallTreeProfileBuilder(n.endTime-n.startTime),o=new Map;for(let e of n.nodes)o.set(e.id,e);for(let e of n.nodes)if("number"==typeof e.parent&&(e.parent=o.get(e.parent)),e.children)for(let t of e.children){const r=o.get(t);r&&(r.parent=e)}const l=[],f=[];let u=n.timeDeltas[0],c=NaN;for(let e=0;e0&&(0,t.lastOf)(p)!=c;){const e=a(p.pop().callFrame);i.leaveFrame(e,r)}const d=[];for(let e=u;e&&e!=c&&!s(e.callFrame);e=m(e.callFrame.functionName)?(0,t.lastOf)(p):e.parent||null)d.push(e);d.reverse();for(let e of d)i.enterFrame(a(e.callFrame),r);p=p.concat(d)}for(let e=p.length-1;e>=0;e--)i.leaveFrame(a(p[e].callFrame),(0,t.lastOf)(f));return i.setValueFormatter(new r.TimeFormatter("microseconds")),i.build()}function u(e){return f((0,n.chromeTreeToNodes)(e))} -},{"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110,"./v8cpuFormatter":163}],146:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromStackprof=r;var e=require("../lib/profile"),t=require("../lib/value-formatters");function r(r){const o=r.raw_timestamp_deltas.reduce((e,t)=>e+t,0),a=new e.StackListProfileBuilder(o),{frames:l,raw:s,raw_timestamp_deltas:i}=r;let n=0,c=[];for(let e=0;e=0;)e[t]=0}var i=0,l=1,d=2,f=3,o=258,b=29,s=256,u=s+1+b,c=30,p=19,h=2*u+1,v=15,y=16,x=7,g=256,m=16,w=17,A=18,k=[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],q=[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],z=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],j=512,B=new Array(2*(u+2));a(B);var C=new Array(2*c);a(C);var D=new Array(j);a(D);var E=new Array(o-f+1);a(E);var F=new Array(b);a(F);var G,H,I,J=new Array(c);function K(e,t,n,_,r){this.static_tree=e,this.extra_bits=t,this.extra_base=n,this.elems=_,this.max_length=r,this.has_stree=e&&e.length}function L(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function M(e){return e<256?D[e]:D[256+(e>>>7)]}function N(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function O(e,t,n){e.bi_valid>y-n?(e.bi_buf|=t<>y-e.bi_valid,e.bi_valid+=n-y):(e.bi_buf|=t<>>=1,n<<=1}while(--t>0);return n>>>1}function R(e){16===e.bi_valid?(N(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}function T(e,t){var n,_,r,a,i,l,d=t.dyn_tree,f=t.max_code,o=t.stat_desc.static_tree,b=t.stat_desc.has_stree,s=t.stat_desc.extra_bits,u=t.stat_desc.extra_base,c=t.stat_desc.max_length,p=0;for(a=0;a<=v;a++)e.bl_count[a]=0;for(d[2*e.heap[e.heap_max]+1]=0,n=e.heap_max+1;nc&&(a=c,p++),d[2*_+1]=a,_>f||(e.bl_count[a]++,i=0,_>=u&&(i=s[_-u]),l=d[2*_],e.opt_len+=l*(a+i),b&&(e.static_len+=l*(o[2*_+1]+i)));if(0!==p){do{for(a=c-1;0===e.bl_count[a];)a--;e.bl_count[a]--,e.bl_count[a+1]+=2,e.bl_count[c]--,p-=2}while(p>0);for(a=c;0!==a;a--)for(_=e.bl_count[a];0!==_;)(r=e.heap[--n])>f||(d[2*r+1]!==a&&(e.opt_len+=(a-d[2*r+1])*d[2*r],d[2*r+1]=a),_--)}}function U(e,t,n){var _,r,a=new Array(v+1),i=0;for(_=1;_<=v;_++)a[_]=i=i+n[_-1]<<1;for(r=0;r<=t;r++){var l=e[2*r+1];0!==l&&(e[2*r]=Q(a[l]++,l))}}function V(){var e,t,n,_,r,a=new Array(v+1);for(n=0,_=0;_>=7;_8?N(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function Y(t,n,_,r){X(t),r&&(N(t,_),N(t,~_)),e.arraySet(t.pending_buf,t.window,n,_,t.pending),t.pending+=_}function Z(e,t,n,_){var r=2*t,a=2*n;return e[r]>1;n>=1;n--)$(e,a,n);r=d;do{n=e.heap[1],e.heap[1]=e.heap[e.heap_len--],$(e,a,1),_=e.heap[1],e.heap[--e.heap_max]=n,e.heap[--e.heap_max]=_,a[2*r]=a[2*n]+a[2*_],e.depth[r]=(e.depth[n]>=e.depth[_]?e.depth[n]:e.depth[_])+1,a[2*n+1]=a[2*_+1]=r,e.heap[1]=r++,$(e,a,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],T(e,t),U(a,f,e.bl_count)}function ne(e,t,n){var _,r,a=-1,i=t[1],l=0,d=7,f=4;for(0===i&&(d=138,f=3),t[2*(n+1)+1]=65535,_=0;_<=n;_++)r=i,i=t[2*(_+1)+1],++l=3&&0===e.bl_tree[2*S[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}function ae(e,t,n,_){var r;for(O(e,t-257,5),O(e,n-1,5),O(e,_-4,4),r=0;r<_;r++)O(e,e.bl_tree[2*S[r]+1],3);_e(e,e.dyn_ltree,t-1),_e(e,e.dyn_dtree,n-1)}function ie(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return n;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return _;for(t=32;t0?(e.strm.data_type===r&&(e.strm.data_type=ie(e)),te(e,e.l_desc),te(e,e.d_desc),o=re(e),i=e.opt_len+3+7>>>3,(f=e.static_len+3+7>>>3)<=i&&(i=f)):i=f=_+5,_+4<=i&&-1!==n?fe(e,n,_,a):e.strategy===t||f===i?(O(e,(l<<1)+(a?1:0),3),ee(e,B,C)):(O(e,(d<<1)+(a?1:0),3),ae(e,e.l_desc.max_code+1,e.d_desc.max_code+1,o+1),ee(e,e.dyn_ltree,e.dyn_dtree)),W(e),a&&X(e)}function se(e,t,n){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&n,e.last_lit++,0===t?e.dyn_ltree[2*n]++:(e.matches++,t--,e.dyn_ltree[2*(E[n]+s+1)]++,e.dyn_dtree[2*M(t)]++),e.last_lit===e.lit_bufsize-1}exports._tr_init=de,exports._tr_stored_block=fe,exports._tr_flush_block=be,exports._tr_tally=se,exports._tr_align=oe; -},{"../utils/common":166}],176:[function(require,module,exports) { -"use strict";function e(e,r,o,t){for(var u=65535&e|0,i=e>>>16&65535|0,n=0;0!==o;){o-=n=o>2e3?2e3:o;do{i=i+(u=u+r[t++]|0)|0}while(--n);u%=65521,i%=65521}return u|i<<16|0}module.exports=e; -},{}],178:[function(require,module,exports) { -"use strict";function r(){for(var r,o=[],t=0;t<256;t++){r=t;for(var n=0;n<8;n++)r=1&r?3988292384^r>>>1:r>>>1;o[t]=r}return o}var o=r();function t(r,t,n,u){var a=o,e=u+n;r^=-1;for(var f=u;f>>8^a[255&(r^t[f])];return-1^r}module.exports=t; -},{}],170:[function(require,module,exports) { -"use strict";module.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"}; -},{}],168:[function(require,module,exports) { -"use strict";var t,a=require("../utils/common"),e=require("./trees"),s=require("./adler32"),i=require("./crc32"),r=require("./messages"),n=0,h=1,l=3,_=4,d=5,o=0,u=1,g=-2,f=-3,c=-5,p=-1,m=1,w=2,v=3,k=4,z=0,b=2,x=8,y=9,B=15,S=8,q=29,I=256,A=I+1+q,C=30,R=19,j=2*A+1,D=15,E=3,H=258,K=H+E+1,N=32,F=42,G=69,J=73,L=91,M=103,O=113,P=666,Q=1,T=2,U=3,V=4,W=3;function X(t,a){return t.msg=r[a],a}function Y(t){return(t<<1)-(t>4?9:0)}function Z(t){for(var a=t.length;--a>=0;)t[a]=0}function $(t){var e=t.state,s=e.pending;s>t.avail_out&&(s=t.avail_out),0!==s&&(a.arraySet(t.output,e.pending_buf,e.pending_out,s,t.next_out),t.next_out+=s,e.pending_out+=s,t.total_out+=s,t.avail_out-=s,e.pending-=s,0===e.pending&&(e.pending_out=0))}function tt(t,a){e._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,a),t.block_start=t.strstart,$(t.strm)}function at(t,a){t.pending_buf[t.pending++]=a}function et(t,a){t.pending_buf[t.pending++]=a>>>8&255,t.pending_buf[t.pending++]=255&a}function st(t,e,r,n){var h=t.avail_in;return h>n&&(h=n),0===h?0:(t.avail_in-=h,a.arraySet(e,t.input,t.next_in,h,r),1===t.state.wrap?t.adler=s(t.adler,e,h,r):2===t.state.wrap&&(t.adler=i(t.adler,e,h,r)),t.next_in+=h,t.total_in+=h,h)}function it(t,a){var e,s,i=t.max_chain_length,r=t.strstart,n=t.prev_length,h=t.nice_match,l=t.strstart>t.w_size-K?t.strstart-(t.w_size-K):0,_=t.window,d=t.w_mask,o=t.prev,u=t.strstart+H,g=_[r+n-1],f=_[r+n];t.prev_length>=t.good_match&&(i>>=2),h>t.lookahead&&(h=t.lookahead);do{if(_[(e=a)+n]===f&&_[e+n-1]===g&&_[e]===_[r]&&_[++e]===_[r+1]){r+=2,e++;do{}while(_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&rn){if(t.match_start=a,n=s,s>=h)break;g=_[r+n-1],f=_[r+n]}}}while((a=o[a&d])>l&&0!=--i);return n<=t.lookahead?n:t.lookahead}function rt(t){var e,s,i,r,n,h=t.w_size;do{if(r=t.window_size-t.lookahead-t.strstart,t.strstart>=h+(h-K)){a.arraySet(t.window,t.window,h,h,0),t.match_start-=h,t.strstart-=h,t.block_start-=h,e=s=t.hash_size;do{i=t.head[--e],t.head[e]=i>=h?i-h:0}while(--s);e=s=h;do{i=t.prev[--e],t.prev[e]=i>=h?i-h:0}while(--s);r+=h}if(0===t.strm.avail_in)break;if(s=st(t.strm,t.window,t.strstart+t.lookahead,r),t.lookahead+=s,t.lookahead+t.insert>=E)for(n=t.strstart-t.insert,t.ins_h=t.window[n],t.ins_h=(t.ins_h<t.pending_buf_size-5&&(e=t.pending_buf_size-5);;){if(t.lookahead<=1){if(rt(t),0===t.lookahead&&a===n)return Q;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var s=t.block_start+e;if((0===t.strstart||t.strstart>=s)&&(t.lookahead=t.strstart-s,t.strstart=s,tt(t,!1),0===t.strm.avail_out))return Q;if(t.strstart-t.block_start>=t.w_size-K&&(tt(t,!1),0===t.strm.avail_out))return Q}return t.insert=0,a===_?(tt(t,!0),0===t.strm.avail_out?U:V):(t.strstart>t.block_start&&(tt(t,!1),t.strm.avail_out),Q)}function ht(t,a){for(var s,i;;){if(t.lookahead=E&&(t.ins_h=(t.ins_h<=E)if(i=e._tr_tally(t,t.strstart-t.match_start,t.match_length-E),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=E){t.match_length--;do{t.strstart++,t.ins_h=(t.ins_h<=E&&(t.ins_h=(t.ins_h<4096)&&(t.match_length=E-1)),t.prev_length>=E&&t.match_length<=t.prev_length){r=t.strstart+t.lookahead-E,i=e._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-E),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=r&&(t.ins_h=(t.ins_h<=E&&t.strstart>0&&(i=l[r=t.strstart-1])===l[++r]&&i===l[++r]&&i===l[++r]){h=t.strstart+H;do{}while(i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&rt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=E?(s=e._tr_tally(t,1,t.match_length-E),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(s=e._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),s&&(tt(t,!1),0===t.strm.avail_out))return Q}return t.insert=0,a===_?(tt(t,!0),0===t.strm.avail_out?U:V):t.last_lit&&(tt(t,!1),0===t.strm.avail_out)?Q:T}function dt(t,a){for(var s;;){if(0===t.lookahead&&(rt(t),0===t.lookahead)){if(a===n)return Q;break}if(t.match_length=0,s=e._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,s&&(tt(t,!1),0===t.strm.avail_out))return Q}return t.insert=0,a===_?(tt(t,!0),0===t.strm.avail_out?U:V):t.last_lit&&(tt(t,!1),0===t.strm.avail_out)?Q:T}function ot(t,a,e,s,i){this.good_length=t,this.max_lazy=a,this.nice_length=e,this.max_chain=s,this.func=i}function ut(a){a.window_size=2*a.w_size,Z(a.head),a.max_lazy_match=t[a.level].max_lazy,a.good_match=t[a.level].good_length,a.nice_match=t[a.level].nice_length,a.max_chain_length=t[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=E-1,a.match_available=0,a.ins_h=0}function gt(){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=x,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 a.Buf16(2*j),this.dyn_dtree=new a.Buf16(2*(2*C+1)),this.bl_tree=new a.Buf16(2*(2*R+1)),Z(this.dyn_ltree),Z(this.dyn_dtree),Z(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new a.Buf16(D+1),this.heap=new a.Buf16(2*A+1),Z(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new a.Buf16(2*A+1),Z(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 ft(t){var a;return t&&t.state?(t.total_in=t.total_out=0,t.data_type=b,(a=t.state).pending=0,a.pending_out=0,a.wrap<0&&(a.wrap=-a.wrap),a.status=a.wrap?F:O,t.adler=2===a.wrap?0:1,a.last_flush=n,e._tr_init(a),o):X(t,g)}function ct(t){var a=ft(t);return a===o&&ut(t.state),a}function pt(t,a){return t&&t.state?2!==t.state.wrap?g:(t.state.gzhead=a,o):g}function mt(t,e,s,i,r,n){if(!t)return g;var h=1;if(e===p&&(e=6),i<0?(h=0,i=-i):i>15&&(h=2,i-=16),r<1||r>y||s!==x||i<8||i>15||e<0||e>9||n<0||n>k)return X(t,g);8===i&&(i=9);var l=new gt;return t.state=l,l.strm=t,l.wrap=h,l.gzhead=null,l.w_bits=i,l.w_size=1<d||s<0)return a?X(a,g):g;if(f=a.state,!a.output||!a.input&&0!==a.avail_in||f.status===P&&s!==_)return X(a,0===a.avail_out?c:g);if(f.strm=a,r=f.last_flush,f.last_flush=s,f.status===F)if(2===f.wrap)a.adler=0,at(f,31),at(f,139),at(f,8),f.gzhead?(at(f,(f.gzhead.text?1:0)+(f.gzhead.hcrc?2:0)+(f.gzhead.extra?4:0)+(f.gzhead.name?8:0)+(f.gzhead.comment?16:0)),at(f,255&f.gzhead.time),at(f,f.gzhead.time>>8&255),at(f,f.gzhead.time>>16&255),at(f,f.gzhead.time>>24&255),at(f,9===f.level?2:f.strategy>=w||f.level<2?4:0),at(f,255&f.gzhead.os),f.gzhead.extra&&f.gzhead.extra.length&&(at(f,255&f.gzhead.extra.length),at(f,f.gzhead.extra.length>>8&255)),f.gzhead.hcrc&&(a.adler=i(a.adler,f.pending_buf,f.pending,0)),f.gzindex=0,f.status=G):(at(f,0),at(f,0),at(f,0),at(f,0),at(f,0),at(f,9===f.level?2:f.strategy>=w||f.level<2?4:0),at(f,W),f.status=O);else{var k=x+(f.w_bits-8<<4)<<8;k|=(f.strategy>=w||f.level<2?0:f.level<6?1:6===f.level?2:3)<<6,0!==f.strstart&&(k|=N),k+=31-k%31,f.status=O,et(f,k),0!==f.strstart&&(et(f,a.adler>>>16),et(f,65535&a.adler)),a.adler=1}if(f.status===G)if(f.gzhead.extra){for(p=f.pending;f.gzindex<(65535&f.gzhead.extra.length)&&(f.pending!==f.pending_buf_size||(f.gzhead.hcrc&&f.pending>p&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),$(a),p=f.pending,f.pending!==f.pending_buf_size));)at(f,255&f.gzhead.extra[f.gzindex]),f.gzindex++;f.gzhead.hcrc&&f.pending>p&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),f.gzindex===f.gzhead.extra.length&&(f.gzindex=0,f.status=J)}else f.status=J;if(f.status===J)if(f.gzhead.name){p=f.pending;do{if(f.pending===f.pending_buf_size&&(f.gzhead.hcrc&&f.pending>p&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),$(a),p=f.pending,f.pending===f.pending_buf_size)){m=1;break}m=f.gzindexp&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),0===m&&(f.gzindex=0,f.status=L)}else f.status=L;if(f.status===L)if(f.gzhead.comment){p=f.pending;do{if(f.pending===f.pending_buf_size&&(f.gzhead.hcrc&&f.pending>p&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),$(a),p=f.pending,f.pending===f.pending_buf_size)){m=1;break}m=f.gzindexp&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),0===m&&(f.status=M)}else f.status=M;if(f.status===M&&(f.gzhead.hcrc?(f.pending+2>f.pending_buf_size&&$(a),f.pending+2<=f.pending_buf_size&&(at(f,255&a.adler),at(f,a.adler>>8&255),a.adler=0,f.status=O)):f.status=O),0!==f.pending){if($(a),0===a.avail_out)return f.last_flush=-1,o}else if(0===a.avail_in&&Y(s)<=Y(r)&&s!==_)return X(a,c);if(f.status===P&&0!==a.avail_in)return X(a,c);if(0!==a.avail_in||0!==f.lookahead||s!==n&&f.status!==P){var z=f.strategy===w?dt(f,s):f.strategy===v?_t(f,s):t[f.level].func(f,s);if(z!==U&&z!==V||(f.status=P),z===Q||z===U)return 0===a.avail_out&&(f.last_flush=-1),o;if(z===T&&(s===h?e._tr_align(f):s!==d&&(e._tr_stored_block(f,0,0,!1),s===l&&(Z(f.head),0===f.lookahead&&(f.strstart=0,f.block_start=0,f.insert=0))),$(a),0===a.avail_out))return f.last_flush=-1,o}return s!==_?o:f.wrap<=0?u:(2===f.wrap?(at(f,255&a.adler),at(f,a.adler>>8&255),at(f,a.adler>>16&255),at(f,a.adler>>24&255),at(f,255&a.total_in),at(f,a.total_in>>8&255),at(f,a.total_in>>16&255),at(f,a.total_in>>24&255)):(et(f,a.adler>>>16),et(f,65535&a.adler)),$(a),f.wrap>0&&(f.wrap=-f.wrap),0!==f.pending?o:u)}function kt(t){var a;return t&&t.state?(a=t.state.status)!==F&&a!==G&&a!==J&&a!==L&&a!==M&&a!==O&&a!==P?X(t,g):(t.state=null,a===O?X(t,f):o):g}function zt(t,e){var i,r,n,h,l,_,d,u,f=e.length;if(!t||!t.state)return g;if(2===(h=(i=t.state).wrap)||1===h&&i.status!==F||i.lookahead)return g;for(1===h&&(t.adler=s(t.adler,e,f,0)),i.wrap=0,f>=i.w_size&&(0===h&&(Z(i.head),i.strstart=0,i.block_start=0,i.insert=0),u=new a.Buf8(i.w_size),a.arraySet(u,e,f-i.w_size,i.w_size,0),e=u,f=i.w_size),l=t.avail_in,_=t.next_in,d=t.input,t.avail_in=f,t.next_in=0,t.input=e,rt(i);i.lookahead>=E;){r=i.strstart,n=i.lookahead-(E-1);do{i.ins_h=(i.ins_h<=252?6:o>=248?5:o>=240?4:o>=224?3:o>=192?2:1;function f(e,o){if(o<65537&&(e.subarray&&t||!e.subarray&&n))return String.fromCharCode.apply(null,r.shrinkBuf(e,o));for(var f="",u=0;u>>6,t[u++]=128|63&e):e<65536?(t[u++]=224|e>>>12,t[u++]=128|e>>>6&63,t[u++]=128|63&e):(t[u++]=240|e>>>18,t[u++]=128|e>>>12&63,t[u++]=128|e>>>6&63,t[u++]=128|63&e);return t},exports.buf2binstring=function(r){return f(r,r.length)},exports.binstring2buf=function(n){for(var t=new r.Buf8(n.length),e=0,o=t.length;e4)h[o++]=65533,t+=a-1;else{for(u&=2===a?31:3===a?15:7;a>1&&t1?h[o++]=65533:u<65536?h[o++]=u:(u-=65536,h[o++]=55296|u>>10&1023,h[o++]=56320|1023&u)}return f(h,o)},exports.utf8border=function(r,n){var t;for((n=n||r.length)>r.length&&(n=r.length),t=n-1;t>=0&&128==(192&r[t]);)t--;return t<0?n:0===t?n:t+e[r[t]]>n?t:n}; -},{"./common":166}],171:[function(require,module,exports) { -"use strict";function t(){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}module.exports=t; -},{}],164:[function(require,module,exports) { -"use strict";var t=require("./zlib/deflate"),i=require("./utils/common"),e=require("./utils/strings"),n=require("./zlib/messages"),r=require("./zlib/zstream"),s=Object.prototype.toString,o=0,a=4,u=0,h=1,d=2,l=-1,f=0,p=8;function w(o){if(!(this instanceof w))return new w(o);this.options=i.assign({level:l,method:p,chunkSize:16384,windowBits:15,memLevel:8,strategy:f,to:""},o||{});var a=this.options;a.raw&&a.windowBits>0?a.windowBits=-a.windowBits:a.gzip&&a.windowBits>0&&a.windowBits<16&&(a.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new r,this.strm.avail_out=0;var h=t.deflateInit2(this.strm,a.level,a.method,a.windowBits,a.memLevel,a.strategy);if(h!==u)throw new Error(n[h]);if(a.header&&t.deflateSetHeader(this.strm,a.header),a.dictionary){var d;if(d="string"==typeof a.dictionary?e.string2buf(a.dictionary):"[object ArrayBuffer]"===s.call(a.dictionary)?new Uint8Array(a.dictionary):a.dictionary,(h=t.deflateSetDictionary(this.strm,d))!==u)throw new Error(n[h]);this._dict_set=!0}}function c(t,i){var e=new w(i);if(e.push(t,!0),e.err)throw e.msg||n[e.err];return e.result}function m(t,i){return(i=i||{}).raw=!0,c(t,i)}function g(t,i){return(i=i||{}).gzip=!0,c(t,i)}w.prototype.push=function(n,r){var l,f,p=this.strm,w=this.options.chunkSize;if(this.ended)return!1;f=r===~~r?r:!0===r?a:o,"string"==typeof n?p.input=e.string2buf(n):"[object ArrayBuffer]"===s.call(n)?p.input=new Uint8Array(n):p.input=n,p.next_in=0,p.avail_in=p.input.length;do{if(0===p.avail_out&&(p.output=new i.Buf8(w),p.next_out=0,p.avail_out=w),(l=t.deflate(p,f))!==h&&l!==u)return this.onEnd(l),this.ended=!0,!1;0!==p.avail_out&&(0!==p.avail_in||f!==a&&f!==d)||("string"===this.options.to?this.onData(e.buf2binstring(i.shrinkBuf(p.output,p.next_out))):this.onData(i.shrinkBuf(p.output,p.next_out)))}while((p.avail_in>0||0===p.avail_out)&&l!==h);return f===a?(l=t.deflateEnd(this.strm),this.onEnd(l),this.ended=!0,l===u):f!==d||(this.onEnd(u),p.avail_out=0,!0)},w.prototype.onData=function(t){this.chunks.push(t)},w.prototype.onEnd=function(t){t===u&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},exports.Deflate=w,exports.deflate=c,exports.deflateRaw=m,exports.gzip=g; -},{"./zlib/deflate":168,"./utils/common":166,"./utils/strings":169,"./zlib/messages":170,"./zlib/zstream":171}],180:[function(require,module,exports) { -"use strict";var i=30,e=12;module.exports=function(o,a){var t,d,n,l,s,f,r,b,c,u,v,m,w,h,k,_,x,g,p,z,j,q,y,A,B;t=o.state,d=o.next_in,A=o.input,n=d+(o.avail_in-5),l=o.next_out,B=o.output,s=l-(a-o.avail_out),f=l+(o.avail_out-257),r=t.dmax,b=t.wsize,c=t.whave,u=t.wnext,v=t.window,m=t.hold,w=t.bits,h=t.lencode,k=t.distcode,_=(1<>>=p=g>>>24,w-=p,0===(p=g>>>16&255))B[l++]=65535&g;else{if(!(16&p)){if(0==(64&p)){g=h[(65535&g)+(m&(1<>>=p,w-=p),w<15&&(m+=A[d++]<>>=p=g>>>24,w-=p,!(16&(p=g>>>16&255))){if(0==(64&p)){g=k[(65535&g)+(m&(1<r){o.msg="invalid distance too far back",t.mode=i;break i}if(m>>>=p,w-=p,j>(p=l-s)){if((p=j-p)>c&&t.sane){o.msg="invalid distance too far back",t.mode=i;break i}if(q=0,y=v,0===u){if(q+=b-p,p2;)B[l++]=y[q++],B[l++]=y[q++],B[l++]=y[q++],z-=3;z&&(B[l++]=y[q++],z>1&&(B[l++]=y[q++]))}else{q=l-j;do{B[l++]=B[q++],B[l++]=B[q++],B[l++]=B[q++],z-=3}while(z>2);z&&(B[l++]=B[q++],z>1&&(B[l++]=B[q++]))}break}}break}}while(d>3,m&=(1<<(w-=z<<3))-1,o.next_in=d,o.next_out=l,o.avail_in=d=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return d[v++]=20971520,d[v++]=20971520,h.bits=1,0;for(F=1;F0&&(a===e||1!==G))return-1;for(Q[1]=0,D=1;Di||a===t&&L>o)return 1;for(;;){y=D-J,B[E]j?(z=R[S+B[E]],A=N[O+B[E]]):(z=96,A=0),k=1<>J)+(p-=k)]=y<<24|z<<16|A|0}while(0!==p);for(k=1<>=1;if(0!==k?(M&=k-1,M+=k):M=0,E++,0==--P[D]){if(D===G)break;D=c[m+B[E]]}if(D>H&&(M&x)!==q){for(0===J&&(J=H),g+=F,K=1<<(I=D-J);I+Ji||a===t&&L>o)return 1;d[q=M&x]=H<<24|I<<16|g-v|0}}return 0!==M&&(d[g+M]=D-J<<24|64<<16|0),h.bits=H,0}; -},{"../utils/common":166}],172:[function(require,module,exports) { -"use strict";var e=require("../utils/common"),a=require("./adler32"),t=require("./crc32"),i=require("./inffast"),s=require("./inftrees"),n=0,r=1,o=2,d=4,l=5,f=6,c=0,h=1,k=2,b=-2,m=-3,w=-4,u=-5,g=8,v=1,x=2,p=3,_=4,y=5,z=6,B=7,S=8,q=9,C=10,I=11,R=12,j=13,A=14,D=15,E=16,G=17,H=18,K=19,N=20,F=21,J=22,L=23,M=24,O=25,P=26,Q=27,T=28,U=29,V=30,W=31,X=32,Y=852,Z=592,$=15,ee=$;function ae(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function te(){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 e.Buf16(320),this.work=new e.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function ie(a){var t;return a&&a.state?(t=a.state,a.total_in=a.total_out=t.total=0,a.msg="",t.wrap&&(a.adler=1&t.wrap),t.mode=v,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new e.Buf32(Y),t.distcode=t.distdyn=new e.Buf32(Z),t.sane=1,t.back=-1,c):b}function se(e){var a;return e&&e.state?((a=e.state).wsize=0,a.whave=0,a.wnext=0,ie(e)):b}function ne(e,a){var t,i;return e&&e.state?(i=e.state,a<0?(t=0,a=-a):(t=1+(a>>4),a<48&&(a&=15)),a&&(a<8||a>15)?b:(null!==i.window&&i.wbits!==a&&(i.window=null),i.wrap=t,i.wbits=a,se(e))):b}function re(e,a){var t,i;return e?(i=new te,e.state=i,i.window=null,(t=ne(e,a))!==c&&(e.state=null),t):b}function oe(e){return re(e,ee)}var de,le,fe=!0;function ce(a){if(fe){var t;for(de=new e.Buf32(512),le=new e.Buf32(32),t=0;t<144;)a.lens[t++]=8;for(;t<256;)a.lens[t++]=9;for(;t<280;)a.lens[t++]=7;for(;t<288;)a.lens[t++]=8;for(s(r,a.lens,0,288,de,0,a.work,{bits:9}),t=0;t<32;)a.lens[t++]=5;s(o,a.lens,0,32,le,0,a.work,{bits:5}),fe=!1}a.lencode=de,a.lenbits=9,a.distcode=le,a.distbits=5}function he(a,t,i,s){var n,r=a.state;return null===r.window&&(r.wsize=1<=r.wsize?(e.arraySet(r.window,t,i-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):((n=r.wsize-r.wnext)>s&&(n=s),e.arraySet(r.window,t,i-s,n,r.wnext),(s-=n)?(e.arraySet(r.window,t,i-s,s,0),r.wnext=s,r.whave=r.wsize):(r.wnext+=n,r.wnext===r.wsize&&(r.wnext=0),r.whave>>8&255,$.check=t($.check,qe,2,0),oe=0,de=0,$.mode=x;break}if($.flags=0,$.head&&($.head.done=!1),!(1&$.wrap)||(((255&oe)<<8)+(oe>>8))%31){Y.msg="incorrect header check",$.mode=V;break}if((15&oe)!==g){Y.msg="unknown compression method",$.mode=V;break}if(de-=4,_e=8+(15&(oe>>>=4)),0===$.wbits)$.wbits=_e;else if(_e>$.wbits){Y.msg="invalid window size",$.mode=V;break}$.dmax=1<<_e,Y.adler=$.check=1,$.mode=512&oe?C:R,oe=0,de=0;break;case x:for(;de<16;){if(0===ne)break e;ne--,oe+=ee[ie++]<>8&1),512&$.flags&&(qe[0]=255&oe,qe[1]=oe>>>8&255,$.check=t($.check,qe,2,0)),oe=0,de=0,$.mode=p;case p:for(;de<32;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>8&255,qe[2]=oe>>>16&255,qe[3]=oe>>>24&255,$.check=t($.check,qe,4,0)),oe=0,de=0,$.mode=_;case _:for(;de<16;){if(0===ne)break e;ne--,oe+=ee[ie++]<>8),512&$.flags&&(qe[0]=255&oe,qe[1]=oe>>>8&255,$.check=t($.check,qe,2,0)),oe=0,de=0,$.mode=y;case y:if(1024&$.flags){for(;de<16;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>8&255,$.check=t($.check,qe,2,0)),oe=0,de=0}else $.head&&($.head.extra=null);$.mode=z;case z:if(1024&$.flags&&((ke=$.length)>ne&&(ke=ne),ke&&($.head&&(_e=$.head.extra_len-$.length,$.head.extra||($.head.extra=new Array($.head.extra_len)),e.arraySet($.head.extra,ee,ie,ke,_e)),512&$.flags&&($.check=t($.check,ee,ke,ie)),ne-=ke,ie+=ke,$.length-=ke),$.length))break e;$.length=0,$.mode=B;case B:if(2048&$.flags){if(0===ne)break e;ke=0;do{_e=ee[ie+ke++],$.head&&_e&&$.length<65536&&($.head.name+=String.fromCharCode(_e))}while(_e&&ke>9&1,$.head.done=!0),Y.adler=$.check=0,$.mode=R;break;case C:for(;de<32;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=7&de,de-=7&de,$.mode=Q;break}for(;de<3;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=1)){case 0:$.mode=A;break;case 1:if(ce($),$.mode=N,Z===f){oe>>>=2,de-=2;break e}break;case 2:$.mode=G;break;case 3:Y.msg="invalid block type",$.mode=V}oe>>>=2,de-=2;break;case A:for(oe>>>=7&de,de-=7&de;de<32;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>16^65535)){Y.msg="invalid stored block lengths",$.mode=V;break}if($.length=65535&oe,oe=0,de=0,$.mode=D,Z===f)break e;case D:$.mode=E;case E:if(ke=$.length){if(ke>ne&&(ke=ne),ke>re&&(ke=re),0===ke)break e;e.arraySet(te,ee,ie,ke,se),ne-=ke,ie+=ke,re-=ke,se+=ke,$.length-=ke;break}$.mode=R;break;case G:for(;de<14;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=5,de-=5,$.ndist=1+(31&oe),oe>>>=5,de-=5,$.ncode=4+(15&oe),oe>>>=4,de-=4,$.nlen>286||$.ndist>30){Y.msg="too many length or distance symbols",$.mode=V;break}$.have=0,$.mode=H;case H:for(;$.have<$.ncode;){for(;de<3;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=3,de-=3}for(;$.have<19;)$.lens[Ce[$.have++]]=0;if($.lencode=$.lendyn,$.lenbits=7,ze={bits:$.lenbits},ye=s(n,$.lens,0,19,$.lencode,0,$.work,ze),$.lenbits=ze.bits,ye){Y.msg="invalid code lengths set",$.mode=V;break}$.have=0,$.mode=K;case K:for(;$.have<$.nlen+$.ndist;){for(;ue=(Se=$.lencode[oe&(1<<$.lenbits)-1])>>>16&255,ge=65535&Se,!((we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=we,de-=we,$.lens[$.have++]=ge;else{if(16===ge){for(Be=we+2;de>>=we,de-=we,0===$.have){Y.msg="invalid bit length repeat",$.mode=V;break}_e=$.lens[$.have-1],ke=3+(3&oe),oe>>>=2,de-=2}else if(17===ge){for(Be=we+3;de>>=we)),oe>>>=3,de-=3}else{for(Be=we+7;de>>=we)),oe>>>=7,de-=7}if($.have+ke>$.nlen+$.ndist){Y.msg="invalid bit length repeat",$.mode=V;break}for(;ke--;)$.lens[$.have++]=_e}}if($.mode===V)break;if(0===$.lens[256]){Y.msg="invalid code -- missing end-of-block",$.mode=V;break}if($.lenbits=9,ze={bits:$.lenbits},ye=s(r,$.lens,0,$.nlen,$.lencode,0,$.work,ze),$.lenbits=ze.bits,ye){Y.msg="invalid literal/lengths set",$.mode=V;break}if($.distbits=6,$.distcode=$.distdyn,ze={bits:$.distbits},ye=s(o,$.lens,$.nlen,$.ndist,$.distcode,0,$.work,ze),$.distbits=ze.bits,ye){Y.msg="invalid distances set",$.mode=V;break}if($.mode=N,Z===f)break e;case N:$.mode=F;case F:if(ne>=6&&re>=258){Y.next_out=se,Y.avail_out=re,Y.next_in=ie,Y.avail_in=ne,$.hold=oe,$.bits=de,i(Y,fe),se=Y.next_out,te=Y.output,re=Y.avail_out,ie=Y.next_in,ee=Y.input,ne=Y.avail_in,oe=$.hold,de=$.bits,$.mode===R&&($.back=-1);break}for($.back=0;ue=(Se=$.lencode[oe&(1<<$.lenbits)-1])>>>16&255,ge=65535&Se,!((we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>ve)])>>>16&255,ge=65535&Se,!(ve+(we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=ve,de-=ve,$.back+=ve}if(oe>>>=we,de-=we,$.back+=we,$.length=ge,0===ue){$.mode=P;break}if(32&ue){$.back=-1,$.mode=R;break}if(64&ue){Y.msg="invalid literal/length code",$.mode=V;break}$.extra=15&ue,$.mode=J;case J:if($.extra){for(Be=$.extra;de>>=$.extra,de-=$.extra,$.back+=$.extra}$.was=$.length,$.mode=L;case L:for(;ue=(Se=$.distcode[oe&(1<<$.distbits)-1])>>>16&255,ge=65535&Se,!((we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>ve)])>>>16&255,ge=65535&Se,!(ve+(we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=ve,de-=ve,$.back+=ve}if(oe>>>=we,de-=we,$.back+=we,64&ue){Y.msg="invalid distance code",$.mode=V;break}$.offset=ge,$.extra=15&ue,$.mode=M;case M:if($.extra){for(Be=$.extra;de>>=$.extra,de-=$.extra,$.back+=$.extra}if($.offset>$.dmax){Y.msg="invalid distance too far back",$.mode=V;break}$.mode=O;case O:if(0===re)break e;if(ke=fe-re,$.offset>ke){if((ke=$.offset-ke)>$.whave&&$.sane){Y.msg="invalid distance too far back",$.mode=V;break}ke>$.wnext?(ke-=$.wnext,be=$.wsize-ke):be=$.wnext-ke,ke>$.length&&(ke=$.length),me=$.window}else me=te,be=se-$.offset,ke=$.length;ke>re&&(ke=re),re-=ke,$.length-=ke;do{te[se++]=me[be++]}while(--ke);0===$.length&&($.mode=F);break;case P:if(0===re)break e;te[se++]=$.length,re--,$.mode=F;break;case Q:if($.wrap){for(;de<32;){if(0===ne)break e;ne--,oe|=ee[ie++]<=0&&u.windowBits<16&&(u.windowBits=-u.windowBits,0===u.windowBits&&(u.windowBits=-15)),!(u.windowBits>=0&&u.windowBits<16)||n&&n.windowBits||(u.windowBits+=32),u.windowBits>15&&u.windowBits<48&&0==(15&u.windowBits)&&(u.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new e,this.strm.avail_out=0;var h=t.inflateInit2(this.strm,u.windowBits);if(h!==s.Z_OK)throw new Error(r[h]);this.header=new o,t.inflateGetHeader(this.strm,this.header)}function h(t,i){var n=new a(i);if(n.push(t,!0),n.err)throw n.msg||r[n.err];return n.result}function _(t,i){return(i=i||{}).raw=!0,h(t,i)}a.prototype.push=function(r,e){var o,a,h,_,w,l,d=this.strm,f=this.options.chunkSize,p=this.options.dictionary,c=!1;if(this.ended)return!1;a=e===~~e?e:!0===e?s.Z_FINISH:s.Z_NO_FLUSH,"string"==typeof r?d.input=n.binstring2buf(r):"[object ArrayBuffer]"===u.call(r)?d.input=new Uint8Array(r):d.input=r,d.next_in=0,d.avail_in=d.input.length;do{if(0===d.avail_out&&(d.output=new i.Buf8(f),d.next_out=0,d.avail_out=f),(o=t.inflate(d,s.Z_NO_FLUSH))===s.Z_NEED_DICT&&p&&(l="string"==typeof p?n.string2buf(p):"[object ArrayBuffer]"===u.call(p)?new Uint8Array(p):p,o=t.inflateSetDictionary(this.strm,l)),o===s.Z_BUF_ERROR&&!0===c&&(o=s.Z_OK,c=!1),o!==s.Z_STREAM_END&&o!==s.Z_OK)return this.onEnd(o),this.ended=!0,!1;d.next_out&&(0!==d.avail_out&&o!==s.Z_STREAM_END&&(0!==d.avail_in||a!==s.Z_FINISH&&a!==s.Z_SYNC_FLUSH)||("string"===this.options.to?(h=n.utf8border(d.output,d.next_out),_=d.next_out-h,w=n.buf2string(d.output,h),d.next_out=_,d.avail_out=f-_,_&&i.arraySet(d.output,d.output,h,_,0),this.onData(w)):this.onData(i.shrinkBuf(d.output,d.next_out)))),0===d.avail_in&&0===d.avail_out&&(c=!0)}while((d.avail_in>0||0===d.avail_out)&&o!==s.Z_STREAM_END);return o===s.Z_STREAM_END&&(a=s.Z_FINISH),a===s.Z_FINISH?(o=t.inflateEnd(this.strm),this.onEnd(o),this.ended=!0,o===s.Z_OK):a!==s.Z_SYNC_FLUSH||(this.onEnd(s.Z_OK),d.avail_out=0,!0)},a.prototype.onData=function(t){this.chunks.push(t)},a.prototype.onEnd=function(t){t===s.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},exports.Inflate=a,exports.inflate=h,exports.inflateRaw=_,exports.ungzip=h; -},{"./zlib/inflate":172,"./utils/common":166,"./utils/strings":169,"./zlib/constants":167,"./zlib/messages":170,"./zlib/zstream":171,"./zlib/gzheader":173}],161:[function(require,module,exports) { -"use strict";var e=require("./lib/utils/common").assign,i=require("./lib/deflate"),r=require("./lib/inflate"),l=require("./lib/zlib/constants"),s={};e(s,i,r,l),module.exports=s; -},{"./lib/utils/common":166,"./lib/deflate":164,"./lib/inflate":165,"./lib/zlib/constants":167}],153:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MaybeCompressedDataReader=exports.TextProfileDataSource=void 0;var e=require("pako"),r=t(e);function t(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r.default=e,r}var n=function(e,r,t,n){return new(t||(t=Promise))(function(o,i){function s(e){try{u(n.next(e))}catch(e){i(e)}}function a(e){try{u(n.throw(e))}catch(e){i(e)}}function u(e){e.done?o(e.value):new t(function(r){r(e.value)}).then(s,a)}u((n=n.apply(e,r||[])).next())})};class o{constructor(e,r){this.fileName=e,this.contents=r}name(){return n(this,void 0,void 0,function*(){return this.fileName})}readAsArrayBuffer(){return n(this,void 0,void 0,function*(){return new ArrayBuffer(0)})}readAsText(){return n(this,void 0,void 0,function*(){return this.contents})}}exports.TextProfileDataSource=o;class i{constructor(e,t){this.namePromise=e,this.uncompressedData=t.then(e=>n(this,void 0,void 0,function*(){try{return r.inflate(new Uint8Array(e)).buffer}catch(r){return e}}))}name(){return n(this,void 0,void 0,function*(){return yield this.namePromise})}readAsArrayBuffer(){return n(this,void 0,void 0,function*(){return yield this.uncompressedData})}readAsText(){return n(this,void 0,void 0,function*(){const e=yield this.readAsArrayBuffer();let r="";if("undefined"!=typeof TextDecoder){return(new TextDecoder).decode(e)}{const t=new Uint8Array(e);for(let e=0;e{const t=new FileReader;t.addEventListener("loadend",()=>{if(!(t.result instanceof ArrayBuffer))throw new Error("Expected reader.result to be an instance of ArrayBuffer");r(t.result)}),t.readAsArrayBuffer(e)});return new i(Promise.resolve(e.name),r)}static fromArrayBuffer(e,r){return new i(Promise.resolve(e),Promise.resolve(r))}}exports.MaybeCompressedDataReader=i; -},{"pako":161}],147:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.UID=void 0,exports.importFromInstrumentsDeepCopy=a,exports.importFromInstrumentsTrace=w,exports.importRunFromInstrumentsTrace=g,exports.importThreadFromInstrumentsTrace=b,exports.readInstrumentsKeyedArchive=y,exports.decodeUTF8=v;var e=require("../lib/profile"),t=require("../lib/utils"),r=require("../lib/value-formatters"),n=require("./utils"),s=function(e,t,r,n){return new(r||(r=Promise))(function(s,i){function o(e){try{l(n.next(e))}catch(e){i(e)}}function a(e){try{l(n.throw(e))}catch(e){i(e)}}function l(e){e.done?s(e.value):new r(function(t){t(e.value)}).then(o,a)}l((n=n.apply(e,t||[])).next())})};function i(e){const t=e.split("\n").map(e=>e.split("\t")),r=t.shift();if(!r)return[];const n=new Map;for(let e=0;e0;){const e=a.pop();l=Math.max(l,e.endValue),n.leaveFrame(e,l)}return"Bytes Used"in s[0]?n.setValueFormatter(new r.ByteFormatter):("Weight"in s[0]||"Running Time"in s[0])&&n.setValueFormatter(new r.TimeFormatter("milliseconds")),n.build()}function l(e){return s(this,void 0,void 0,function*(){const t={name:e.name,files:new Map,subdirectories:new Map},r=yield new Promise((t,r)=>{e.createReader().readEntries(e=>{t(e)},r)});for(let e of r)if(e.isDirectory){const r=yield l(e);t.subdirectories.set(r.name,r)}else{const r=yield new Promise((t,r)=>{e.file(t,r)});t.files.set(r.name,r)}return t})}function c(e){return n.MaybeCompressedDataReader.fromFile(e).readAsArrayBuffer()}function u(e){return n.MaybeCompressedDataReader.fromFile(e).readAsText()}function f(e,r){const n=(0,t.getOrThrow)(e.subdirectories,"corespace"),s=(0,t.getOrThrow)(n.subdirectories,`run${r}`);return(0,t.getOrThrow)(s.subdirectories,"core")}class h{constructor(e){this.bytePos=0,this.view=new DataView(e)}seek(e){this.bytePos=e}skip(e){this.bytePos+=e}hasMore(){return this.bytePosthis.view.byteLength?0:this.view.getUint8(this.bytePos-1)}readUint32(){return this.bytePos+=4,this.bytePos>this.view.byteLength?0:this.view.getUint32(this.bytePos-4,!0)}readUint48(){return this.bytePos+=6,this.bytePos>this.view.byteLength?0:this.view.getUint32(this.bytePos-6,!0)+this.view.getUint16(this.bytePos-2,!0)*Math.pow(2,32)}readUint64(){return this.bytePos+=8,this.bytePos>this.view.byteLength?0:this.view.getUint32(this.bytePos-8,!0)+this.view.getUint32(this.bytePos-4,!0)*Math.pow(2,32)}}function p(e){return s(this,void 0,void 0,function*(){const r=(0,t.getOrThrow)(e.subdirectories,"stores");for(let e of r.subdirectories.values()){const r=e.files.get("schema.xml");if(!r)continue;const n=yield u(r);if(!/name="time-profile"/.exec(n))continue;const s=new h(yield c((0,t.getOrThrow)(e.files,"bulkstore")));s.readUint32(),s.readUint32(),s.readUint32();const i=s.readUint32(),o=s.readUint32();s.seek(i);const a=[];for(;;){const e=s.readUint48();if(0===e)break;const t=s.readUint32();s.skip(o-6-4-4);const r=s.readUint32();a.push({timestamp:e,threadID:t,backtraceID:r})}return a}throw new Error("Could not find sample list")})}function d(e,r){return s(this,void 0,void 0,function*(){const e=(0,t.getOrThrow)(r.subdirectories,"uniquing"),n=(0,t.getOrThrow)(e.subdirectories,"arrayUniquer"),s=(0,t.getOrThrow)(n.files,"integeruniquer.index"),i=(0,t.getOrThrow)(n.files,"integeruniquer.data"),o=new h(yield c(s)),a=new h(yield c(i));o.seek(32);let l=[];for(;o.hasMore();){const e=o.readUint32()+1048576*o.readUint32();if(0===e)continue;a.seek(e);let t=a.readUint32(),r=[];for(;t--;)r.push(a.readUint64());l.push(r)}return l})}function m(e){return s(this,void 0,void 0,function*(){const r=y(yield c((0,t.getOrThrow)(e.files,"form.template"))),n=r["com.apple.xray.owner.template.version"];let s=1;"com.apple.xray.owner.template"in r&&(s=r["com.apple.xray.owner.template"].get("_selectedRunNumber"));let i=r.$1;"stubInfoByUUID"in r&&(i=Array.from(r.stubInfoByUUID.keys())[0]);const o=r["com.apple.xray.run.data"],a=[];for(let e of o.runNumbers){const r=(0,t.getOrThrow)(o.runData,e),n=(0,t.getOrThrow)(r,"symbolsByPid"),s=new Map;for(let r of n.values()){for(let e of r.symbols){if(!e)continue;const{sourcePath:r,symbolName:n,addressToLine:i}=e;for(let e of i.keys())(0,t.getOrInsert)(s,e,()=>{const s=n||`0x${(0,t.zeroPad)(e.toString(16),16)}`,i={key:`${r}:${s}`,name:s};return r&&(i.file=r),i})}a.push({number:e,addressToFrameMap:s})}}return{version:n,instrument:i,selectedRunNumber:s,runs:a}})}function w(e){return s(this,void 0,void 0,function*(){const t=yield l(e),{version:r,runs:n,instrument:s,selectedRunNumber:i}=yield m(t);if("com.apple.xray.instrument-type.coresampler2"!==s)throw new Error(`The only supported instrument from .trace import is "com.apple.xray.instrument-type.coresampler2". Got ${s}`);console.log("version: ",r),console.log("Importing time profile");const o=[];let a=0;for(let r of n){const{addressToFrameMap:n,number:s}=r,l=yield g({fileName:e.name,tree:t,addressToFrameMap:n,runNumber:s});r.number===i&&(a=o.length+l.indexToView),o.push(...l.profiles)}return{name:e.name,indexToView:a,profiles:o}})}function g(e){return s(this,void 0,void 0,function*(){const{fileName:r,tree:n,addressToFrameMap:s,runNumber:i}=e,o=f(n,i);let a=yield p(o);const l=yield d(a,o),c=new Map;for(let e of a)c.set(e.threadID,(0,t.getOrElse)(c,e.threadID,()=>0)+1);const u=Array.from(c.entries());(0,t.sortBy)(u,e=>-e[1]);const h=u.map(e=>e[0]);return{name:r,indexToView:0,profiles:h.map(e=>b({threadID:e,fileName:r,arrays:l,addressToFrameMap:s,samples:a}))}})}function b(n){let{fileName:s,addressToFrameMap:i,arrays:o,threadID:a,samples:l}=n;const c=new Map;l=l.filter(e=>e.threadID===a);const u=new e.StackListProfileBuilder((0,t.lastOf)(l).timestamp);function f(e,r){const n=i.get(e);if(n)r.push(n);else if(e in o)for(let t of o[e])f(t,r);else{const n={key:e,name:`0x${(0,t.zeroPad)(e.toString(16),16)}`};i.set(e,n),r.push(n)}}u.setName(`${s} - thread ${a}`);let h=null;for(let e of l){const r=(0,t.getOrInsert)(c,e.backtraceID,e=>{const t=[];return f(e,t),t.reverse(),t});if(null===h&&(u.appendSampleWithWeight([],e.timestamp),h=e.timestamp),e.timestamp{switch(e){case"NSTextStorage":case"NSParagraphStyle":case"NSFont":return null;case"PFTSymbolData":{const e=Object.create(null);e.symbolName=t.$0,e.sourcePath=t.$1,e.addressToLine=new Map;for(let r=3;;r+=2){const n=t["$"+r],s=t["$"+(r+1)];if(null==n||null==s)break;e.addressToLine.set(n,s)}return e}case"PFTOwnerData":{const e=Object.create(null);return e.ownerName=t.$0,e.ownerPath=t.$1,e}case"PFTPersistentSymbols":{const e=Object.create(null),r=t.$4;e.threadNames=t.$3,e.symbols=[];for(let n=1;ne)){if(1e5!==e.$version||"NSKeyedArchiver"!==e.$archiver||!S(e.$top)||!U(e.$objects))throw new Error("Invalid keyed archive");"$null"===e.$objects[0]&&(e.$objects[0]=null);for(let r=0;r{if(t instanceof x)return e.$objects[t.index];if(U(t))for(let e=0;ee)){if(S(t)&&t.$class){let n=N(e,t.$class).$classname;switch(n){case"NSDecimalNumberPlaceholder":{let e=t["NS.length"],r=t["NS.exponent"],n=t["NS.mantissa.bo"],s=t["NS.negative"],i=new Uint16Array(new Uint8Array(t["NS.mantissa"]).buffer),o=0;for(let t=0;t>8|(255&e)<<8),o+=e*Math.pow(65536,t)}return o*=Math.pow(10,r),s?-o:o}case"NSData":case"NSMutableData":return t["NS.bytes"]||t["NS.data"];case"NSString":case"NSMutableString":return v(t["NS.bytes"]);case"NSArray":case"NSMutableArray":if("NS.objects"in t)return t["NS.objects"];let e=[];for(;;){let r="NS.object."+e.length;if(!(r in t))break;e.push(t[r])}return e;case"_NSKeyedCoderOldStyleArray":{const e=t["NS.count"];let r=[];for(let n=0;n>4){case 0:return this.parseSingleton(e,r);case 1:return this.parseInteger(e,1<(r.push({stack:t.split(";").map(e=>({key:e,name:e})),duration:parseInt(i,10)}),e)),r}function t(t){const i=r(t),n=i.reduce((e,r)=>e+r.duration,0),o=new e.StackListProfileBuilder(n);if(0===i.length)return null;for(let e of i)o.appendSampleWithWeight(e.stack,e.duration);return o.build()} -},{"../lib/profile":109}],149:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromFirefox=l;var e=require("../lib/profile"),t=require("../lib/utils"),r=require("../lib/value-formatters");function l(l){const n=l.profile,s=1===n.threads.length?n.threads[0]:n.threads.filter(e=>"GeckoMain"===e.name)[0],a=new Map;function o(e){let r=e[0];const l=[];for(;null!=r;){const e=s.stackTable.data[r],[t,n]=e;l.push(n),r=t}return l.reverse(),l.map(e=>{const r=s.frameTable.data[e],l=s.stringTable[r[0]],n=/(.*)\s+\((.*?):?(\d+)?\)$/.exec(l);return n?n[2].startsWith("resource:")||"self-hosted"===n[2]||n[2].startsWith("self-hosted:")?null:(0,t.getOrInsert)(a,l,()=>({key:l,name:n[1],file:n[2],line:n[3]?parseInt(n[3]):void 0})):null}).filter(e=>null!=e)}const i=new e.CallTreeProfileBuilder(l.duration);let u=[];for(let e of s.samples.data){const t=o(e),r=e[1];let l=-1;for(let e=0;el;e--)i.leaveFrame(u[e],r);for(let e=l+1;e0?e[1]:"(anonymous)",file:e[2].length>0?e[2]:"(unknown file)",line:parseInt(e[3],10),col:parseInt(e[4],10)};break}case"CODE":switch(e.kind){case"LoadIC":case"StoreIC":case"KeyedStoreIC":case"KeyedLoadIC":case"LoadGlobalIC":case"Handler":r="(IC) "+r;break;case"BytecodeHandler":r="(bytecode) ~"+r;break;case"Stub":r="(stub) "+r;break;case"Builtin":r="(builtin) "+r;break;case"RegExp":r="(regexp) "+r}break;default:r=`(${e.type}) ${r}`}return{key:r,name:r}}function n(n){const s=new e.StackListProfileBuilder,o=new Map;let c=0;(0,t.sortBy)(n.ticks,e=>e.tm);for(let e of n.ticks){const r=[];for(let s=e.s.length-2;s>=0;s-=2){const c=e.s[s];-1!==c&&(c>n.code.length?r.push({key:c,name:`0x${c.toString(16)}`}):r.push((i=c,(0,t.getOrInsert)(o,i,e=>a(n.code[e],n)))))}s.appendSampleWithWeight(r,e.tm-c),c=e.tm}var i;return s.setValueFormatter(new r.TimeFormatter("microseconds")),s.build()} -},{"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110}],151:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromLinuxPerf=r;var e=require("../lib/profile"),t=require("../lib/utils"),n=require("../lib/value-formatters");function s(e){const t=e.split("\n").filter(e=>!/^\s*#/.exec(e)),n={command:null,processID:null,threadID:null,time:null,eventType:"",stack:[]},s=t.shift();if(!s)return null;const r=/^(\S.+?)\s+(\d+)(?:\/?(\d+))?\s+/.exec(s);if(!r)return null;n.command=r[1],r[3]?(n.processID=parseInt(r[2],10),n.threadID=parseInt(r[3],10)):n.threadID=parseInt(r[2],10);const l=/\s+(\d+\.\d+):\s+/.exec(s);l&&(n.time=parseFloat(l[1]));const i=/(\S+):\s*$/.exec(s);i&&(n.eventType=i[1]);for(let e of t){const t=/^\s*(\w+)\s*(.+) \((\S*)\)/.exec(e);if(!t)continue;let[,s,r,l]=t;r=r.replace(/\+0x[\da-f]+$/,""),n.stack.push({address:`0x${s}`,symbolName:r,file:l})}return n.stack.reverse(),n}function r(r){const l=new Map;let i=null;const o=r.split("\n\n").map(s);for(let s of o){if(null==s)continue;if(null!=i&&i!=s.eventType)continue;if(null==s.time)continue;i=s.eventType;let r=[];s.command&&r.push(s.command),s.processID&&r.push(`pid: ${s.processID}`),s.threadID&&r.push(`tid: ${s.threadID}`);const o=r.join(" ");(0,t.getOrInsert)(l,o,()=>{const t=new e.StackListProfileBuilder;return t.setName(o),t.setValueFormatter(new n.TimeFormatter("seconds")),t}).appendSampleWithTimestamp(s.stack.map(({symbolName:e,file:t})=>({key:`${e} (${t})`,name:"[unknown]"===e?`??? (${t})`:e,file:t})),s.time)}return 0===l.size?null:{name:1===l.size?Array.from(l.keys())[0]:"",indexToView:0,profiles:Array.from((0,t.itMap)(l.values(),e=>e.build()))}} -},{"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110}],152:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromHaskell=l;var e=require("../lib/profile"),r=require("../lib/value-formatters");function t(e,r,l,o,i){if(0===e.ticks&&0===e.entries&&0===e.alloc&&0===e.children.length)return r;let a=r,s=o.get(e.id);l.enterFrame(s,a);for(let r of e.children)a=t(r,a,l,o,i);return a+=i(e),l.leaveFrame(s,a),a}function l(l){const o=new Map;for(let e of l.cost_centres){const r={key:e.id,name:`${e.module}.${e.label}`};e.src_loc.startsWith("<")||(r.file=e.src_loc),o.set(e.id,r)}const i=new e.CallTreeProfileBuilder(l.total_ticks);t(l.profile,0,i,o,e=>e.ticks),i.setValueFormatter(new r.TimeFormatter("milliseconds")),i.setName(`${l.program} time`);const a=new e.CallTreeProfileBuilder(l.total_ticks);return t(l.profile,0,a,o,e=>e.alloc),a.setValueFormatter(new r.ByteFormatter),a.setName(`${l.program} allocation`),{name:l.program,indexToView:0,profiles:[i.build(),a.build()]}} -},{"../lib/profile":109,"../lib/value-formatters":110}],194:[function(require,module,exports) { -"use strict";function n(n,e){for(var r=new Array(arguments.length-1),t=0,l=2,o=!0;l1&&"="===r.charAt(e);)++a;return Math.ceil(3*r.length)/4-a};for(var e=new Array(64),a=new Array(123),t=0;t<64;)a[e[t]=t<26?t+65:t<52?t+71:t<62?t-4:t-59|43]=t++;r.encode=function(r,a,t){for(var n,i=null,o=[],c=0,s=0;a>2],n=(3&h)<<4,s=1;break;case 1:o[c++]=e[n|h>>4],n=(15&h)<<2,s=2;break;case 2:o[c++]=e[n|h>>6],o[c++]=e[63&h],s=0}c>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,o)),c=0)}return s&&(o[c++]=e[n],o[c++]=61,1===s&&(o[c++]=61)),i?(c&&i.push(String.fromCharCode.apply(String,o.slice(0,c))),i.join("")):String.fromCharCode.apply(String,o.slice(0,c))};var n="invalid encoding";r.decode=function(r,e,t){for(var i,o=t,c=0,s=0;s1)break;if(void 0===(h=a[h]))throw Error(n);switch(c){case 0:i=h,c=1;break;case 1:e[t++]=i<<2|(48&h)>>4,i=h,c=2;break;case 2:e[t++]=(15&i)<<4|(60&h)>>2,i=h,c=3;break;case 3:e[t++]=(3&i)<<6|h,c=0}}if(1===c)throw Error(n);return t-o},r.test=function(r){return/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/.test(r)}; -},{}],191:[function(require,module,exports) { -"use strict";function t(){this._listeners={}}module.exports=t,t.prototype.on=function(t,s,e){return(this._listeners[t]||(this._listeners[t]=[])).push({fn:s,ctx:e||this}),this},t.prototype.off=function(t,s){if(void 0===t)this._listeners={};else if(void 0===s)this._listeners[t]=[];else for(var e=this._listeners[t],i=0;i0?0:2147483648,t,r);else if(isNaN(e))n(2143289344,t,r);else if(e>3.4028234663852886e38)n((o<<31|2139095040)>>>0,t,r);else if(e<1.1754943508222875e-38)n((o<<31|Math.round(e/1.401298464324817e-45))>>>0,t,r);else{var u=Math.floor(Math.log(e)/Math.LN2);n((o<<31|u+127<<23|8388607&Math.round(e*Math.pow(2,-u)*8388608))>>>0,t,r)}}function i(n,e,t){var r=n(e,t),o=2*(r>>31)+1,u=r>>>23&255,i=8388607&r;return 255===u?i?NaN:o*(1/0):0===u?1.401298464324817e-45*o*i:o*Math.pow(2,u-150)*(i+8388608)}n.writeFloatLE=u.bind(null,e),n.writeFloatBE=u.bind(null,t),n.readFloatLE=i.bind(null,r),n.readFloatBE=i.bind(null,o)}(),"undefined"!=typeof Float64Array?function(){var e=new Float64Array([-0]),t=new Uint8Array(e.buffer),r=128===t[7];function o(n,r,o){e[0]=n,r[o]=t[0],r[o+1]=t[1],r[o+2]=t[2],r[o+3]=t[3],r[o+4]=t[4],r[o+5]=t[5],r[o+6]=t[6],r[o+7]=t[7]}function u(n,r,o){e[0]=n,r[o]=t[7],r[o+1]=t[6],r[o+2]=t[5],r[o+3]=t[4],r[o+4]=t[3],r[o+5]=t[2],r[o+6]=t[1],r[o+7]=t[0]}function i(n,r){return t[0]=n[r],t[1]=n[r+1],t[2]=n[r+2],t[3]=n[r+3],t[4]=n[r+4],t[5]=n[r+5],t[6]=n[r+6],t[7]=n[r+7],e[0]}function a(n,r){return t[7]=n[r],t[6]=n[r+1],t[5]=n[r+2],t[4]=n[r+3],t[3]=n[r+4],t[2]=n[r+5],t[1]=n[r+6],t[0]=n[r+7],e[0]}n.writeDoubleLE=r?o:u,n.writeDoubleBE=r?u:o,n.readDoubleLE=r?i:a,n.readDoubleBE=r?a:i}():function(){function u(n,e,t,r,o,u){var i=r<0?1:0;if(i&&(r=-r),0===r)n(0,o,u+e),n(1/r>0?0:2147483648,o,u+t);else if(isNaN(r))n(0,o,u+e),n(2146959360,o,u+t);else if(r>1.7976931348623157e308)n(0,o,u+e),n((i<<31|2146435072)>>>0,o,u+t);else{var a;if(r<2.2250738585072014e-308)n((a=r/5e-324)>>>0,o,u+e),n((i<<31|a/4294967296)>>>0,o,u+t);else{var l=Math.floor(Math.log(r)/Math.LN2);1024===l&&(l=1023),n(4503599627370496*(a=r*Math.pow(2,-l))>>>0,o,u+e),n((i<<31|l+1023<<20|1048576*a&1048575)>>>0,o,u+t)}}}function i(n,e,t,r,o){var u=n(r,o+e),i=n(r,o+t),a=2*(i>>31)+1,l=i>>>20&2047,f=4294967296*(1048575&i)+u;return 2047===l?f?NaN:a*(1/0):0===l?5e-324*a*f:a*Math.pow(2,l-1075)*(f+4503599627370496)}n.writeDoubleLE=u.bind(null,e,0,4),n.writeDoubleBE=u.bind(null,t,4,0),n.readDoubleLE=i.bind(null,r,0,4),n.readDoubleBE=i.bind(null,o,4,0)}(),n}function e(n,e,t){e[t]=255&n,e[t+1]=n>>>8&255,e[t+2]=n>>>16&255,e[t+3]=n>>>24}function t(n,e,t){e[t]=n>>>24,e[t+1]=n>>>16&255,e[t+2]=n>>>8&255,e[t+3]=255&n}function r(n,e){return(n[e]|n[e+1]<<8|n[e+2]<<16|n[e+3]<<24)>>>0}function o(n,e){return(n[e]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3])>>>0}module.exports=n(n); -},{}],195:[function(require,module,exports) { -"use strict";function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(e){}return null}module.exports=inquire; -},{}],192:[function(require,module,exports) { -"use strict";var r=exports;r.length=function(r){for(var t=0,n=0,e=0;e191&&e<224?a[i++]=(31&e)<<6|63&r[t++]:e>239&&e<365?(e=((7&e)<<18|(63&r[t++])<<12|(63&r[t++])<<6|63&r[t++])-65536,a[i++]=55296+(e>>10),a[i++]=56320+(1023&e)):a[i++]=(15&e)<<12|(63&r[t++])<<6|63&r[t++],i>8191&&((o||(o=[])).push(String.fromCharCode.apply(String,a)),i=0);return o?(i&&o.push(String.fromCharCode.apply(String,a.slice(0,i))),o.join("")):String.fromCharCode.apply(String,a.slice(0,i))},r.write=function(r,t,n){for(var e,o,a=n,i=0;i>6|192,t[n++]=63&e|128):55296==(64512&e)&&56320==(64512&(o=r.charCodeAt(i+1)))?(e=65536+((1023&e)<<10)+(1023&o),++i,t[n++]=e>>18|240,t[n++]=e>>12&63|128,t[n++]=e>>6&63|128,t[n++]=63&e|128):(t[n++]=e>>12|224,t[n++]=e>>6&63|128,t[n++]=63&e|128);return n-a}; -},{}],196:[function(require,module,exports) { -"use strict";function r(r,n,t){var u=t||8192,e=u>>>1,l=null,c=u;return function(t){if(t<1||t>e)return r(t);c+t>u&&(l=r(u),c=0);var i=n.call(l,c,c+=t);return 7&c&&(c=1+(7|c)),i}}module.exports=r; -},{}],188:[function(require,module,exports) { -"use strict";module.exports=i;var t=require("../util/minimal");function i(t,i){this.lo=t>>>0,this.hi=i>>>0}var o=i.zero=new i(0,0);o.toNumber=function(){return 0},o.zzEncode=o.zzDecode=function(){return this},o.length=function(){return 1};var r=i.zeroHash="\0\0\0\0\0\0\0\0";i.fromNumber=function(t){if(0===t)return o;var r=t<0;r&&(t=-t);var h=t>>>0,n=(t-h)/4294967296>>>0;return r&&(n=~n>>>0,h=~h>>>0,++h>4294967295&&(h=0,++n>4294967295&&(n=0))),new i(h,n)},i.from=function(r){if("number"==typeof r)return i.fromNumber(r);if(t.isString(r)){if(!t.Long)return i.fromNumber(parseInt(r,10));r=t.Long.fromString(r)}return r.low||r.high?new i(r.low>>>0,r.high>>>0):o},i.prototype.toNumber=function(t){if(!t&&this.hi>>>31){var i=1+~this.lo>>>0,o=~this.hi>>>0;return i||(o=o+1>>>0),-(i+4294967296*o)}return this.lo+4294967296*this.hi},i.prototype.toLong=function(i){return t.Long?new t.Long(0|this.lo,0|this.hi,Boolean(i)):{low:0|this.lo,high:0|this.hi,unsigned:Boolean(i)}};var h=String.prototype.charCodeAt;i.fromHash=function(t){return t===r?o:new i((h.call(t,0)|h.call(t,1)<<8|h.call(t,2)<<16|h.call(t,3)<<24)>>>0,(h.call(t,4)|h.call(t,5)<<8|h.call(t,6)<<16|h.call(t,7)<<24)>>>0)},i.prototype.toHash=function(){return String.fromCharCode(255&this.lo,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,255&this.hi,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},i.prototype.zzEncode=function(){var t=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^t)>>>0,this.lo=(this.lo<<1^t)>>>0,this},i.prototype.zzDecode=function(){var t=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^t)>>>0,this.hi=(this.hi>>>1^t)>>>0,this},i.prototype.length=function(){var t=this.lo,i=(this.lo>>>28|this.hi<<4)>>>0,o=this.hi>>>24;return 0===o?0===i?t<16384?t<128?1:2:t<2097152?3:4:i<16384?i<128?5:6:i<2097152?7:8:o<128?9:10}; -},{"../util/minimal":187}],199:[function(require,module,exports) { -"use strict";exports.byteLength=u,exports.toByteArray=i,exports.fromByteArray=d;for(var r=[],t=[],e="undefined"!=typeof Uint8Array?Uint8Array:Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,a=n.length;o0)throw new Error("Invalid string. Length must be a multiple of 4");var e=r.indexOf("=");return-1===e&&(e=t),[e,e===t?0:4-e%4]}function u(r){var t=h(r),e=t[0],n=t[1];return 3*(e+n)/4-n}function c(r,t,e){return 3*(t+e)/4-e}function i(r){for(var n,o=h(r),a=o[0],u=o[1],i=new e(c(r,a,u)),f=0,A=u>0?a-4:a,d=0;d>16&255,i[f++]=n>>8&255,i[f++]=255&n;return 2===u&&(n=t[r.charCodeAt(d)]<<2|t[r.charCodeAt(d+1)]>>4,i[f++]=255&n),1===u&&(n=t[r.charCodeAt(d)]<<10|t[r.charCodeAt(d+1)]<<4|t[r.charCodeAt(d+2)]>>2,i[f++]=n>>8&255,i[f++]=255&n),i}function f(t){return r[t>>18&63]+r[t>>12&63]+r[t>>6&63]+r[63&t]}function A(r,t,e){for(var n,o=[],a=t;au?u:h+16383));return 1===o?(e=t[n-1],a.push(r[e>>2]+r[e<<4&63]+"==")):2===o&&(e=(t[n-2]<<8)+t[n-1],a.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"=")),a.join("")}t["-".charCodeAt(0)]=62,t["_".charCodeAt(0)]=63; -},{}],200:[function(require,module,exports) { -exports.read=function(a,o,t,r,h){var M,p,w=8*h-r-1,f=(1<>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:1/0*(s?-1:1);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=o<0||0===o&&1/o<0?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),(o+=p+N>=1?n/f:n*Math.pow(2,1-N))*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l}; -},{}],198:[function(require,module,exports) { -var r={}.toString;module.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}; -},{}],189:[function(require,module,exports) { - -var global = arguments[3]; -var t=arguments[3],r=require("base64-js"),e=require("ieee754"),n=require("isarray");function i(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(t){return!1}}function o(){return f.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function u(t,r){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|t}function d(t){return+t!=t&&(t=0),f.alloc(+t)}function v(t,r){if(f.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var e=t.length;if(0===e)return 0;for(var n=!1;;)switch(r){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return $(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return K(t).length;default:if(n)return $(t).length;r=(""+r).toLowerCase(),n=!0}}function E(t,r,e){var n=!1;if((void 0===r||r<0)&&(r=0),r>this.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(r>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return x(this,r,e);case"utf8":case"utf-8":return Y(this,r,e);case"ascii":return L(this,r,e);case"latin1":case"binary":return D(this,r,e);case"base64":return S(this,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return C(this,r,e);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function b(t,r,e){var n=t[r];t[r]=t[e],t[e]=n}function R(t,r,e,n,i){if(0===t.length)return-1;if("string"==typeof e?(n=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=i?0:t.length-1),e<0&&(e=t.length+e),e>=t.length){if(i)return-1;e=t.length-1}else if(e<0){if(!i)return-1;e=0}if("string"==typeof r&&(r=f.from(r,n)),f.isBuffer(r))return 0===r.length?-1:_(t,r,e,n,i);if("number"==typeof r)return r&=255,f.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,r,e):Uint8Array.prototype.lastIndexOf.call(t,r,e):_(t,[r],e,n,i);throw new TypeError("val must be string, number or Buffer")}function _(t,r,e,n,i){var o,u=1,f=t.length,s=r.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||r.length<2)return-1;u=2,f/=2,s/=2,e/=2}function h(t,r){return 1===u?t[r]:t.readUInt16BE(r*u)}if(i){var a=-1;for(o=e;of&&(e=f-s),o=e;o>=0;o--){for(var c=!0,l=0;li&&(n=i):n=i;var o=r.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var u=0;u239?4:h>223?3:h>191?2:1;if(i+c<=e)switch(c){case 1:h<128&&(a=h);break;case 2:128==(192&(o=t[i+1]))&&(s=(31&h)<<6|63&o)>127&&(a=s);break;case 3:o=t[i+1],u=t[i+2],128==(192&o)&&128==(192&u)&&(s=(15&h)<<12|(63&o)<<6|63&u)>2047&&(s<55296||s>57343)&&(a=s);break;case 4:o=t[i+1],u=t[i+2],f=t[i+3],128==(192&o)&&128==(192&u)&&128==(192&f)&&(s=(15&h)<<18|(63&o)<<12|(63&u)<<6|63&f)>65535&&s<1114112&&(a=s)}null===a?(a=65533,c=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|1023&a),n.push(a),i+=c}return O(n)}exports.Buffer=f,exports.SlowBuffer=d,exports.INSPECT_MAX_BYTES=50,f.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:i(),exports.kMaxLength=o(),f.poolSize=8192,f._augment=function(t){return t.__proto__=f.prototype,t},f.from=function(t,r,e){return s(null,t,r,e)},f.TYPED_ARRAY_SUPPORT&&(f.prototype.__proto__=Uint8Array.prototype,f.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&f[Symbol.species]===f&&Object.defineProperty(f,Symbol.species,{value:null,configurable:!0})),f.alloc=function(t,r,e){return a(null,t,r,e)},f.allocUnsafe=function(t){return c(null,t)},f.allocUnsafeSlow=function(t){return c(null,t)},f.isBuffer=function(t){return!(null==t||!t._isBuffer)},f.compare=function(t,r){if(!f.isBuffer(t)||!f.isBuffer(r))throw new TypeError("Arguments must be Buffers");if(t===r)return 0;for(var e=t.length,n=r.length,i=0,o=Math.min(e,n);i0&&(t=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(t+=" ... ")),""},f.prototype.compare=function(t,r,e,n,i){if(!f.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===r&&(r=0),void 0===e&&(e=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),r<0||e>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&r>=e)return 0;if(n>=i)return-1;if(r>=e)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(n>>>=0),u=(e>>>=0)-(r>>>=0),s=Math.min(o,u),h=this.slice(n,i),a=t.slice(r,e),c=0;ci)&&(e=i),t.length>0&&(e<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return A(this,t,r,e);case"utf8":case"utf-8":return m(this,t,r,e);case"ascii":return P(this,t,r,e);case"latin1":case"binary":return T(this,t,r,e);case"base64":return B(this,t,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return U(this,t,r,e);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},f.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var I=4096;function O(t){var r=t.length;if(r<=I)return String.fromCharCode.apply(String,t);for(var e="",n=0;nn)&&(e=n);for(var i="",o=r;oe)throw new RangeError("Trying to access beyond buffer length")}function k(t,r,e,n,i,o){if(!f.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(r>i||rt.length)throw new RangeError("Index out of range")}function N(t,r,e,n){r<0&&(r=65535+r+1);for(var i=0,o=Math.min(t.length-e,2);i>>8*(n?i:1-i)}function z(t,r,e,n){r<0&&(r=4294967295+r+1);for(var i=0,o=Math.min(t.length-e,4);i>>8*(n?i:3-i)&255}function F(t,r,e,n,i,o){if(e+n>t.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function j(t,r,n,i,o){return o||F(t,r,n,4,3.4028234663852886e38,-3.4028234663852886e38),e.write(t,r,n,i,23,4),n+4}function q(t,r,n,i,o){return o||F(t,r,n,8,1.7976931348623157e308,-1.7976931348623157e308),e.write(t,r,n,i,52,8),n+8}f.prototype.slice=function(t,r){var e,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(r=void 0===r?n:~~r)<0?(r+=n)<0&&(r=0):r>n&&(r=n),r0&&(i*=256);)n+=this[t+--r]*i;return n},f.prototype.readUInt8=function(t,r){return r||M(t,1,this.length),this[t]},f.prototype.readUInt16LE=function(t,r){return r||M(t,2,this.length),this[t]|this[t+1]<<8},f.prototype.readUInt16BE=function(t,r){return r||M(t,2,this.length),this[t]<<8|this[t+1]},f.prototype.readUInt32LE=function(t,r){return r||M(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},f.prototype.readUInt32BE=function(t,r){return r||M(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},f.prototype.readIntLE=function(t,r,e){t|=0,r|=0,e||M(t,r,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*r)),n},f.prototype.readIntBE=function(t,r,e){t|=0,r|=0,e||M(t,r,this.length);for(var n=r,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*r)),o},f.prototype.readInt8=function(t,r){return r||M(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},f.prototype.readInt16LE=function(t,r){r||M(t,2,this.length);var e=this[t]|this[t+1]<<8;return 32768&e?4294901760|e:e},f.prototype.readInt16BE=function(t,r){r||M(t,2,this.length);var e=this[t+1]|this[t]<<8;return 32768&e?4294901760|e:e},f.prototype.readInt32LE=function(t,r){return r||M(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},f.prototype.readInt32BE=function(t,r){return r||M(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},f.prototype.readFloatLE=function(t,r){return r||M(t,4,this.length),e.read(this,t,!0,23,4)},f.prototype.readFloatBE=function(t,r){return r||M(t,4,this.length),e.read(this,t,!1,23,4)},f.prototype.readDoubleLE=function(t,r){return r||M(t,8,this.length),e.read(this,t,!0,52,8)},f.prototype.readDoubleBE=function(t,r){return r||M(t,8,this.length),e.read(this,t,!1,52,8)},f.prototype.writeUIntLE=function(t,r,e,n){(t=+t,r|=0,e|=0,n)||k(this,t,r,e,Math.pow(2,8*e)-1,0);var i=1,o=0;for(this[r]=255&t;++o=0&&(o*=256);)this[r+i]=t/o&255;return r+e},f.prototype.writeUInt8=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,1,255,0),f.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[r]=255&t,r+1},f.prototype.writeUInt16LE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,2,65535,0),f.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):N(this,t,r,!0),r+2},f.prototype.writeUInt16BE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,2,65535,0),f.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):N(this,t,r,!1),r+2},f.prototype.writeUInt32LE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=255&t):z(this,t,r,!0),r+4},f.prototype.writeUInt32BE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):z(this,t,r,!1),r+4},f.prototype.writeIntLE=function(t,r,e,n){if(t=+t,r|=0,!n){var i=Math.pow(2,8*e-1);k(this,t,r,e,i-1,-i)}var o=0,u=1,f=0;for(this[r]=255&t;++o>0)-f&255;return r+e},f.prototype.writeIntBE=function(t,r,e,n){if(t=+t,r|=0,!n){var i=Math.pow(2,8*e-1);k(this,t,r,e,i-1,-i)}var o=e-1,u=1,f=0;for(this[r+o]=255&t;--o>=0&&(u*=256);)t<0&&0===f&&0!==this[r+o+1]&&(f=1),this[r+o]=(t/u>>0)-f&255;return r+e},f.prototype.writeInt8=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,1,127,-128),f.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[r]=255&t,r+1},f.prototype.writeInt16LE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):N(this,t,r,!0),r+2},f.prototype.writeInt16BE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):N(this,t,r,!1),r+2},f.prototype.writeInt32LE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,4,2147483647,-2147483648),f.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24):z(this,t,r,!0),r+4},f.prototype.writeInt32BE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),f.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):z(this,t,r,!1),r+4},f.prototype.writeFloatLE=function(t,r,e){return j(this,t,r,!0,e)},f.prototype.writeFloatBE=function(t,r,e){return j(this,t,r,!1,e)},f.prototype.writeDoubleLE=function(t,r,e){return q(this,t,r,!0,e)},f.prototype.writeDoubleBE=function(t,r,e){return q(this,t,r,!1,e)},f.prototype.copy=function(t,r,e,n){if(e||(e=0),n||0===n||(n=this.length),r>=t.length&&(r=t.length),r||(r=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-r=0;--i)t[i+r]=this[i+e];else if(o<1e3||!f.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,e=void 0===e?this.length:e>>>0,t||(t=0),"number"==typeof t)for(o=r;o55295&&e<57344){if(!i){if(e>56319){(r-=3)>-1&&o.push(239,191,189);continue}if(u+1===n){(r-=3)>-1&&o.push(239,191,189);continue}i=e;continue}if(e<56320){(r-=3)>-1&&o.push(239,191,189),i=e;continue}e=65536+(i-55296<<10|e-56320)}else i&&(r-=3)>-1&&o.push(239,191,189);if(i=null,e<128){if((r-=1)<0)break;o.push(e)}else if(e<2048){if((r-=2)<0)break;o.push(e>>6|192,63&e|128)}else if(e<65536){if((r-=3)<0)break;o.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((r-=4)<0)break;o.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return o}function G(t){for(var r=[],e=0;e>8,i=e%256,o.push(i),o.push(n);return o}function K(t){return r.toByteArray(X(t))}function Q(t,r,e,n){for(var i=0;i=r.length||i>=t.length);++i)r[i+e]=t[i];return i}function W(t){return t!=t} -},{"base64-js":199,"ieee754":200,"isarray":198,"buffer":189}],187:[function(require,module,exports) { -var global = arguments[3]; -var Buffer = require("buffer").Buffer; -var e=arguments[3],r=require("buffer").Buffer,t=exports;function n(e,r,t){for(var n=Object.keys(r),o=0;o0)},t.Buffer=function(){try{var e=t.inquire("buffer").Buffer;return e.prototype.utf8Write?e:null}catch(e){return null}}(),t._Buffer_from=null,t._Buffer_allocUnsafe=null,t.newBuffer=function(e){return"number"==typeof e?t.Buffer?t._Buffer_allocUnsafe(e):new t.Array(e):t.Buffer?t._Buffer_from(e):"undefined"==typeof Uint8Array?e:new Uint8Array(e)},t.Array="undefined"!=typeof Uint8Array?Uint8Array:Array,t.Long=t.global.dcodeIO&&t.global.dcodeIO.Long||t.global.Long||t.inquire("long"),t.key2Re=/^true|false|0|1$/,t.key32Re=/^-?(?:0|[1-9][0-9]*)$/,t.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,t.longToHash=function(e){return e?t.LongBits.from(e).toHash():t.LongBits.zeroHash},t.longFromHash=function(e,r){var n=t.LongBits.fromHash(e);return t.Long?t.Long.fromBits(n.lo,n.hi,r):n.toNumber(Boolean(r))},t.merge=n,t.lcFirst=function(e){return e.charAt(0).toLowerCase()+e.substring(1)},t.newError=o,t.ProtocolError=o("ProtocolError"),t.oneOfGetter=function(e){for(var r={},t=0;t-1;--t)if(1===r[e[t]]&&void 0!==this[e[t]]&&null!==this[e[t]])return e[t]}},t.oneOfSetter=function(e){return function(r){for(var t=0;t127;)i[n++]=127&t|128,t>>>=7;i[n]=t}function a(t,i){this.len=t,this.next=void 0,this.val=i}function f(t,i,n){for(;t.hi;)i[n++]=127&t.lo|128,t.lo=(t.lo>>>7|t.hi<<25)>>>0,t.hi>>>=7;for(;t.lo>127;)i[n++]=127&t.lo|128,t.lo=t.lo>>>7;i[n++]=t.lo}function c(t,i,n){i[n]=255&t,i[n+1]=t>>>8&255,i[n+2]=t>>>16&255,i[n+3]=t>>>24}u.create=i.Buffer?function(){return(u.create=function(){return new t})()}:function(){return new u},u.alloc=function(t){return new i.Array(t)},i.Array!==Array&&(u.alloc=i.pool(u.alloc,i.Array.prototype.subarray)),u.prototype._push=function(t,i,n){return this.tail=this.tail.next=new r(t,i,n),this.len+=i,this},a.prototype=Object.create(r.prototype),a.prototype.fn=p,u.prototype.uint32=function(t){return this.len+=(this.tail=this.tail.next=new a((t>>>=0)<128?1:t<16384?2:t<2097152?3:t<268435456?4:5,t)).len,this},u.prototype.int32=function(t){return t<0?this._push(f,10,n.fromNumber(t)):this.uint32(t)},u.prototype.sint32=function(t){return this.uint32((t<<1^t>>31)>>>0)},u.prototype.uint64=function(t){var i=n.from(t);return this._push(f,i.length(),i)},u.prototype.int64=u.prototype.uint64,u.prototype.sint64=function(t){var i=n.from(t).zzEncode();return this._push(f,i.length(),i)},u.prototype.bool=function(t){return this._push(l,1,t?1:0)},u.prototype.fixed32=function(t){return this._push(c,4,t>>>0)},u.prototype.sfixed32=u.prototype.fixed32,u.prototype.fixed64=function(t){var i=n.from(t);return this._push(c,4,i.lo)._push(c,4,i.hi)},u.prototype.sfixed64=u.prototype.fixed64,u.prototype.float=function(t){return this._push(i.float.writeFloatLE,4,t)},u.prototype.double=function(t){return this._push(i.float.writeDoubleLE,8,t)};var y=i.Array.prototype.set?function(t,i,n){i.set(t,n)}:function(t,i,n){for(var e=0;e>>0;if(!n)return this._push(l,1,0);if(i.isString(t)){var o=u.alloc(n=e.length(t));e.decode(t,o,0),t=o}return this.uint32(n)._push(y,n,t)},u.prototype.string=function(t){var i=o.length(t);return i?this.uint32(i)._push(o.write,i,t):this._push(l,1,0)},u.prototype.fork=function(){return this.states=new h(this),this.head=this.tail=new r(s,0,0),this.len=0,this},u.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new r(s,0,0),this.len=0),this},u.prototype.ldelim=function(){var t=this.head,i=this.tail,n=this.len;return this.reset().uint32(n),n&&(this.tail.next=t.next,this.tail=i,this.len+=n),this},u.prototype.finish=function(){for(var t=this.head.next,i=this.constructor.alloc(this.len),n=0;t;)t.fn(t.val,i,n),n+=t.len,t=t.next;return i},u._configure=function(i){t=i}; -},{"./util/minimal":187}],183:[function(require,module,exports) { - -"use strict";module.exports=n;var t=require("./writer");(n.prototype=Object.create(t.prototype)).constructor=n;var e=require("./util/minimal"),r=e.Buffer;function n(){t.call(this)}n.alloc=function(t){return(n.alloc=e._Buffer_allocUnsafe)(t)};var i=r&&r.prototype instanceof Uint8Array&&"set"===r.prototype.set.name?function(t,e,r){e.set(t,r)}:function(t,e,r){if(t.copy)t.copy(e,r,0,t.length);else for(var n=0;n>>0;return this.uint32(r),r&&this._push(i,r,t),this},n.prototype.string=function(t){var e=r.byteLength(t);return this.uint32(e),e&&this._push(o,e,t),this}; -},{"./writer":181,"./util/minimal":187}],182:[function(require,module,exports) { -"use strict";module.exports=h;var t,i=require("./util/minimal"),s=i.LongBits,r=i.utf8;function o(t,i){return RangeError("index out of range: "+t.pos+" + "+(i||1)+" > "+t.len)}function h(t){this.buf=t,this.pos=0,this.len=t.length}var n="undefined"!=typeof Uint8Array?function(t){if(t instanceof Uint8Array||Array.isArray(t))return new h(t);throw Error("illegal buffer")}:function(t){if(Array.isArray(t))return new h(t);throw Error("illegal buffer")};function e(){var t=new s(0,0),i=0;if(!(this.len-this.pos>4)){for(;i<3;++i){if(this.pos>=this.len)throw o(this);if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*i)>>>0,this.buf[this.pos++]<128)return t}return t.lo=(t.lo|(127&this.buf[this.pos++])<<7*i)>>>0,t}for(;i<4;++i)if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*i)>>>0,this.buf[this.pos++]<128)return t;if(t.lo=(t.lo|(127&this.buf[this.pos])<<28)>>>0,t.hi=(t.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return t;if(i=0,this.len-this.pos>4){for(;i<5;++i)if(t.hi=(t.hi|(127&this.buf[this.pos])<<7*i+3)>>>0,this.buf[this.pos++]<128)return t}else for(;i<5;++i){if(this.pos>=this.len)throw o(this);if(t.hi=(t.hi|(127&this.buf[this.pos])<<7*i+3)>>>0,this.buf[this.pos++]<128)return t}throw Error("invalid varint encoding")}function u(t,i){return(t[i-4]|t[i-3]<<8|t[i-2]<<16|t[i-1]<<24)>>>0}function f(){if(this.pos+8>this.len)throw o(this,8);return new s(u(this.buf,this.pos+=4),u(this.buf,this.pos+=4))}h.create=i.Buffer?function(s){return(h.create=function(s){return i.Buffer.isBuffer(s)?new t(s):n(s)})(s)}:n,h.prototype._slice=i.Array.prototype.subarray||i.Array.prototype.slice,h.prototype.uint32=function(){var t=4294967295;return function(){if(t=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128)return t;if(t=(t|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128)return t;if(t=(t|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128)return t;if(t=(t|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128)return t;if(t=(t|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128)return t;if((this.pos+=5)>this.len)throw this.pos=this.len,o(this,10);return t}}(),h.prototype.int32=function(){return 0|this.uint32()},h.prototype.sint32=function(){var t=this.uint32();return t>>>1^-(1&t)|0},h.prototype.bool=function(){return 0!==this.uint32()},h.prototype.fixed32=function(){if(this.pos+4>this.len)throw o(this,4);return u(this.buf,this.pos+=4)},h.prototype.sfixed32=function(){if(this.pos+4>this.len)throw o(this,4);return 0|u(this.buf,this.pos+=4)},h.prototype.float=function(){if(this.pos+4>this.len)throw o(this,4);var t=i.float.readFloatLE(this.buf,this.pos);return this.pos+=4,t},h.prototype.double=function(){if(this.pos+8>this.len)throw o(this,4);var t=i.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,t},h.prototype.bytes=function(){var t=this.uint32(),i=this.pos,s=this.pos+t;if(s>this.len)throw o(this,t);return this.pos+=t,Array.isArray(this.buf)?this.buf.slice(i,s):i===s?new this.buf.constructor(0):this._slice.call(this.buf,i,s)},h.prototype.string=function(){var t=this.bytes();return r.read(t,0,t.length)},h.prototype.skip=function(t){if("number"==typeof t){if(this.pos+t>this.len)throw o(this,t);this.pos+=t}else do{if(this.pos>=this.len)throw o(this)}while(128&this.buf[this.pos++]);return this},h.prototype.skipType=function(t){switch(t){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;4!=(t=7&this.uint32());)this.skipType(t);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+t+" at offset "+this.pos)}return this},h._configure=function(s){t=s;var r=i.Long?"toLong":"toNumber";i.merge(h.prototype,{int64:function(){return e.call(this)[r](!1)},uint64:function(){return e.call(this)[r](!0)},sint64:function(){return e.call(this).zzDecode()[r](!1)},fixed64:function(){return f.call(this)[r](!0)},sfixed64:function(){return f.call(this)[r](!1)}})}; -},{"./util/minimal":187}],184:[function(require,module,exports) { -"use strict";module.exports=r;var t=require("./reader");(r.prototype=Object.create(t.prototype)).constructor=r;var e=require("./util/minimal");function r(e){t.call(this,e)}e.Buffer&&(r.prototype._slice=e.Buffer.prototype.slice),r.prototype.string=function(){var t=this.uint32();return this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+t,this.len))}; -},{"./reader":182,"./util/minimal":187}],197:[function(require,module,exports) { -"use strict";module.exports=t;var e=require("../util/minimal");function t(t,r,i){if("function"!=typeof t)throw TypeError("rpcImpl must be a function");e.EventEmitter.call(this),this.rpcImpl=t,this.requestDelimited=Boolean(r),this.responseDelimited=Boolean(i)}(t.prototype=Object.create(e.EventEmitter.prototype)).constructor=t,t.prototype.rpcCall=function t(r,i,n,o,l){if(!o)throw TypeError("request must be specified");var u=this;if(!l)return e.asPromise(t,u,r,i,n,o);if(u.rpcImpl)try{return u.rpcImpl(r,i[u.requestDelimited?"encodeDelimited":"encode"](o).finish(),function(e,t){if(e)return u.emit("error",e,r),l(e);if(null!==t){if(!(t instanceof n))try{t=n[u.responseDelimited?"decodeDelimited":"decode"](t)}catch(e){return u.emit("error",e,r),l(e)}return u.emit("data",t,r),l(null,t)}u.end(!0)})}catch(e){return u.emit("error",e,r),void setTimeout(function(){l(e)},0)}else setTimeout(function(){l(Error("already ended"))},0)},t.prototype.end=function(e){return this.rpcImpl&&(e||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}; -},{"../util/minimal":187}],185:[function(require,module,exports) { -"use strict";var e=exports;e.Service=require("./rpc/service"); -},{"./rpc/service":197}],186:[function(require,module,exports) { -"use strict";module.exports={}; -},{}],175:[function(require,module,exports) { -"use strict";var r=exports;function e(){r.Reader._configure(r.BufferReader),r.util._configure()}r.build="minimal",r.Writer=require("./writer"),r.BufferWriter=require("./writer_buffer"),r.Reader=require("./reader"),r.BufferReader=require("./reader_buffer"),r.util=require("./util/minimal"),r.rpc=require("./rpc"),r.roots=require("./roots"),r.configure=e,r.Writer._configure(r.BufferWriter),e(); -},{"./writer":181,"./writer_buffer":183,"./reader":182,"./reader_buffer":184,"./util/minimal":187,"./rpc":185,"./roots":186}],174:[function(require,module,exports) { -"use strict";module.exports=require("./src/index-minimal"); -},{"./src/index-minimal":175}],162:[function(require,module,exports) { -"use strict";var e=require("protobufjs/minimal"),n=e.Reader,t=e.Writer,o=e.util,r=e.roots.default||(e.roots.default={});r.perftools=function(){var i,l={};return l.profiles=((i={}).Profile=function(){function i(e){if(this.sampleType=[],this.sample=[],this.mapping=[],this.location=[],this.function=[],this.stringTable=[],this.comment=[],e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.sampleType&&i.sampleType.length||(i.sampleType=[]),i.sampleType.push(r.perftools.profiles.ValueType.decode(e,e.uint32()));break;case 2:i.sample&&i.sample.length||(i.sample=[]),i.sample.push(r.perftools.profiles.Sample.decode(e,e.uint32()));break;case 3:i.mapping&&i.mapping.length||(i.mapping=[]),i.mapping.push(r.perftools.profiles.Mapping.decode(e,e.uint32()));break;case 4:i.location&&i.location.length||(i.location=[]),i.location.push(r.perftools.profiles.Location.decode(e,e.uint32()));break;case 5:i.function&&i.function.length||(i.function=[]),i.function.push(r.perftools.profiles.Function.decode(e,e.uint32()));break;case 6:i.stringTable&&i.stringTable.length||(i.stringTable=[]),i.stringTable.push(e.string());break;case 7:i.dropFrames=e.int64();break;case 8:i.keepFrames=e.int64();break;case 9:i.timeNanos=e.int64();break;case 10:i.durationNanos=e.int64();break;case 11:i.periodType=r.perftools.profiles.ValueType.decode(e,e.uint32());break;case 12:i.period=e.int64();break;case 13:if(i.comment&&i.comment.length||(i.comment=[]),2==(7&l))for(var s=e.uint32()+e.pos;e.pos>>0,e.dropFrames.high>>>0).toNumber())),null!=e.keepFrames&&(o.Long?(n.keepFrames=o.Long.fromValue(e.keepFrames)).unsigned=!1:"string"==typeof e.keepFrames?n.keepFrames=parseInt(e.keepFrames,10):"number"==typeof e.keepFrames?n.keepFrames=e.keepFrames:"object"==typeof e.keepFrames&&(n.keepFrames=new o.LongBits(e.keepFrames.low>>>0,e.keepFrames.high>>>0).toNumber())),null!=e.timeNanos&&(o.Long?(n.timeNanos=o.Long.fromValue(e.timeNanos)).unsigned=!1:"string"==typeof e.timeNanos?n.timeNanos=parseInt(e.timeNanos,10):"number"==typeof e.timeNanos?n.timeNanos=e.timeNanos:"object"==typeof e.timeNanos&&(n.timeNanos=new o.LongBits(e.timeNanos.low>>>0,e.timeNanos.high>>>0).toNumber())),null!=e.durationNanos&&(o.Long?(n.durationNanos=o.Long.fromValue(e.durationNanos)).unsigned=!1:"string"==typeof e.durationNanos?n.durationNanos=parseInt(e.durationNanos,10):"number"==typeof e.durationNanos?n.durationNanos=e.durationNanos:"object"==typeof e.durationNanos&&(n.durationNanos=new o.LongBits(e.durationNanos.low>>>0,e.durationNanos.high>>>0).toNumber())),null!=e.periodType){if("object"!=typeof e.periodType)throw TypeError(".perftools.profiles.Profile.periodType: object expected");n.periodType=r.perftools.profiles.ValueType.fromObject(e.periodType)}if(null!=e.period&&(o.Long?(n.period=o.Long.fromValue(e.period)).unsigned=!1:"string"==typeof e.period?n.period=parseInt(e.period,10):"number"==typeof e.period?n.period=e.period:"object"==typeof e.period&&(n.period=new o.LongBits(e.period.low>>>0,e.period.high>>>0).toNumber())),e.comment){if(!Array.isArray(e.comment))throw TypeError(".perftools.profiles.Profile.comment: array expected");for(n.comment=[],t=0;t>>0,e.comment[t].high>>>0).toNumber())}return null!=e.defaultSampleType&&(o.Long?(n.defaultSampleType=o.Long.fromValue(e.defaultSampleType)).unsigned=!1:"string"==typeof e.defaultSampleType?n.defaultSampleType=parseInt(e.defaultSampleType,10):"number"==typeof e.defaultSampleType?n.defaultSampleType=e.defaultSampleType:"object"==typeof e.defaultSampleType&&(n.defaultSampleType=new o.LongBits(e.defaultSampleType.low>>>0,e.defaultSampleType.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if((n.arrays||n.defaults)&&(t.sampleType=[],t.sample=[],t.mapping=[],t.location=[],t.function=[],t.stringTable=[],t.comment=[]),n.defaults){if(o.Long){var i=new o.Long(0,0,!1);t.dropFrames=n.longs===String?i.toString():n.longs===Number?i.toNumber():i}else t.dropFrames=n.longs===String?"0":0;o.Long?(i=new o.Long(0,0,!1),t.keepFrames=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.keepFrames=n.longs===String?"0":0,o.Long?(i=new o.Long(0,0,!1),t.timeNanos=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.timeNanos=n.longs===String?"0":0,o.Long?(i=new o.Long(0,0,!1),t.durationNanos=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.durationNanos=n.longs===String?"0":0,t.periodType=null,o.Long?(i=new o.Long(0,0,!1),t.period=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.period=n.longs===String?"0":0,o.Long?(i=new o.Long(0,0,!1),t.defaultSampleType=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.defaultSampleType=n.longs===String?"0":0}if(e.sampleType&&e.sampleType.length){t.sampleType=[];for(var l=0;l>>0,e.dropFrames.high>>>0).toNumber():e.dropFrames),null!=e.keepFrames&&e.hasOwnProperty("keepFrames")&&("number"==typeof e.keepFrames?t.keepFrames=n.longs===String?String(e.keepFrames):e.keepFrames:t.keepFrames=n.longs===String?o.Long.prototype.toString.call(e.keepFrames):n.longs===Number?new o.LongBits(e.keepFrames.low>>>0,e.keepFrames.high>>>0).toNumber():e.keepFrames),null!=e.timeNanos&&e.hasOwnProperty("timeNanos")&&("number"==typeof e.timeNanos?t.timeNanos=n.longs===String?String(e.timeNanos):e.timeNanos:t.timeNanos=n.longs===String?o.Long.prototype.toString.call(e.timeNanos):n.longs===Number?new o.LongBits(e.timeNanos.low>>>0,e.timeNanos.high>>>0).toNumber():e.timeNanos),null!=e.durationNanos&&e.hasOwnProperty("durationNanos")&&("number"==typeof e.durationNanos?t.durationNanos=n.longs===String?String(e.durationNanos):e.durationNanos:t.durationNanos=n.longs===String?o.Long.prototype.toString.call(e.durationNanos):n.longs===Number?new o.LongBits(e.durationNanos.low>>>0,e.durationNanos.high>>>0).toNumber():e.durationNanos),null!=e.periodType&&e.hasOwnProperty("periodType")&&(t.periodType=r.perftools.profiles.ValueType.toObject(e.periodType,n)),null!=e.period&&e.hasOwnProperty("period")&&("number"==typeof e.period?t.period=n.longs===String?String(e.period):e.period:t.period=n.longs===String?o.Long.prototype.toString.call(e.period):n.longs===Number?new o.LongBits(e.period.low>>>0,e.period.high>>>0).toNumber():e.period),e.comment&&e.comment.length)for(t.comment=[],l=0;l>>0,e.comment[l].high>>>0).toNumber():e.comment[l];return null!=e.defaultSampleType&&e.hasOwnProperty("defaultSampleType")&&("number"==typeof e.defaultSampleType?t.defaultSampleType=n.longs===String?String(e.defaultSampleType):e.defaultSampleType:t.defaultSampleType=n.longs===String?o.Long.prototype.toString.call(e.defaultSampleType):n.longs===Number?new o.LongBits(e.defaultSampleType.low>>>0,e.defaultSampleType.high>>>0).toNumber():e.defaultSampleType),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.ValueType=function(){function i(e){if(e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.type=e.int64();break;case 2:i.unit=e.int64();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.type&&e.hasOwnProperty("type")&&!(o.isInteger(e.type)||e.type&&o.isInteger(e.type.low)&&o.isInteger(e.type.high))?"type: integer|Long expected":null!=e.unit&&e.hasOwnProperty("unit")&&!(o.isInteger(e.unit)||e.unit&&o.isInteger(e.unit.low)&&o.isInteger(e.unit.high))?"unit: integer|Long expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.ValueType)return e;var n=new r.perftools.profiles.ValueType;return null!=e.type&&(o.Long?(n.type=o.Long.fromValue(e.type)).unsigned=!1:"string"==typeof e.type?n.type=parseInt(e.type,10):"number"==typeof e.type?n.type=e.type:"object"==typeof e.type&&(n.type=new o.LongBits(e.type.low>>>0,e.type.high>>>0).toNumber())),null!=e.unit&&(o.Long?(n.unit=o.Long.fromValue(e.unit)).unsigned=!1:"string"==typeof e.unit?n.unit=parseInt(e.unit,10):"number"==typeof e.unit?n.unit=e.unit:"object"==typeof e.unit&&(n.unit=new o.LongBits(e.unit.low>>>0,e.unit.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!1);t.type=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.type=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!1),t.unit=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.unit=n.longs===String?"0":0}return null!=e.type&&e.hasOwnProperty("type")&&("number"==typeof e.type?t.type=n.longs===String?String(e.type):e.type:t.type=n.longs===String?o.Long.prototype.toString.call(e.type):n.longs===Number?new o.LongBits(e.type.low>>>0,e.type.high>>>0).toNumber():e.type),null!=e.unit&&e.hasOwnProperty("unit")&&("number"==typeof e.unit?t.unit=n.longs===String?String(e.unit):e.unit:t.unit=n.longs===String?o.Long.prototype.toString.call(e.unit):n.longs===Number?new o.LongBits(e.unit.low>>>0,e.unit.high>>>0).toNumber():e.unit),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.Sample=function(){function i(e){if(this.locationId=[],this.value=[],this.label=[],e)for(var n=Object.keys(e),t=0;t>>3){case 1:if(i.locationId&&i.locationId.length||(i.locationId=[]),2==(7&l))for(var s=e.uint32()+e.pos;e.pos>>0,e.locationId[t].high>>>0).toNumber(!0))}if(e.value){if(!Array.isArray(e.value))throw TypeError(".perftools.profiles.Sample.value: array expected");for(n.value=[],t=0;t>>0,e.value[t].high>>>0).toNumber())}if(e.label){if(!Array.isArray(e.label))throw TypeError(".perftools.profiles.Sample.label: array expected");for(n.label=[],t=0;t>>0,e.locationId[i].high>>>0).toNumber(!0):e.locationId[i]}if(e.value&&e.value.length)for(t.value=[],i=0;i>>0,e.value[i].high>>>0).toNumber():e.value[i];if(e.label&&e.label.length)for(t.label=[],i=0;i>>3){case 1:i.key=e.int64();break;case 2:i.str=e.int64();break;case 3:i.num=e.int64();break;case 4:i.numUnit=e.int64();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.key&&e.hasOwnProperty("key")&&!(o.isInteger(e.key)||e.key&&o.isInteger(e.key.low)&&o.isInteger(e.key.high))?"key: integer|Long expected":null!=e.str&&e.hasOwnProperty("str")&&!(o.isInteger(e.str)||e.str&&o.isInteger(e.str.low)&&o.isInteger(e.str.high))?"str: integer|Long expected":null!=e.num&&e.hasOwnProperty("num")&&!(o.isInteger(e.num)||e.num&&o.isInteger(e.num.low)&&o.isInteger(e.num.high))?"num: integer|Long expected":null!=e.numUnit&&e.hasOwnProperty("numUnit")&&!(o.isInteger(e.numUnit)||e.numUnit&&o.isInteger(e.numUnit.low)&&o.isInteger(e.numUnit.high))?"numUnit: integer|Long expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.Label)return e;var n=new r.perftools.profiles.Label;return null!=e.key&&(o.Long?(n.key=o.Long.fromValue(e.key)).unsigned=!1:"string"==typeof e.key?n.key=parseInt(e.key,10):"number"==typeof e.key?n.key=e.key:"object"==typeof e.key&&(n.key=new o.LongBits(e.key.low>>>0,e.key.high>>>0).toNumber())),null!=e.str&&(o.Long?(n.str=o.Long.fromValue(e.str)).unsigned=!1:"string"==typeof e.str?n.str=parseInt(e.str,10):"number"==typeof e.str?n.str=e.str:"object"==typeof e.str&&(n.str=new o.LongBits(e.str.low>>>0,e.str.high>>>0).toNumber())),null!=e.num&&(o.Long?(n.num=o.Long.fromValue(e.num)).unsigned=!1:"string"==typeof e.num?n.num=parseInt(e.num,10):"number"==typeof e.num?n.num=e.num:"object"==typeof e.num&&(n.num=new o.LongBits(e.num.low>>>0,e.num.high>>>0).toNumber())),null!=e.numUnit&&(o.Long?(n.numUnit=o.Long.fromValue(e.numUnit)).unsigned=!1:"string"==typeof e.numUnit?n.numUnit=parseInt(e.numUnit,10):"number"==typeof e.numUnit?n.numUnit=e.numUnit:"object"==typeof e.numUnit&&(n.numUnit=new o.LongBits(e.numUnit.low>>>0,e.numUnit.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!1);t.key=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.key=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!1),t.str=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.str=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.num=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.num=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.numUnit=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.numUnit=n.longs===String?"0":0}return null!=e.key&&e.hasOwnProperty("key")&&("number"==typeof e.key?t.key=n.longs===String?String(e.key):e.key:t.key=n.longs===String?o.Long.prototype.toString.call(e.key):n.longs===Number?new o.LongBits(e.key.low>>>0,e.key.high>>>0).toNumber():e.key),null!=e.str&&e.hasOwnProperty("str")&&("number"==typeof e.str?t.str=n.longs===String?String(e.str):e.str:t.str=n.longs===String?o.Long.prototype.toString.call(e.str):n.longs===Number?new o.LongBits(e.str.low>>>0,e.str.high>>>0).toNumber():e.str),null!=e.num&&e.hasOwnProperty("num")&&("number"==typeof e.num?t.num=n.longs===String?String(e.num):e.num:t.num=n.longs===String?o.Long.prototype.toString.call(e.num):n.longs===Number?new o.LongBits(e.num.low>>>0,e.num.high>>>0).toNumber():e.num),null!=e.numUnit&&e.hasOwnProperty("numUnit")&&("number"==typeof e.numUnit?t.numUnit=n.longs===String?String(e.numUnit):e.numUnit:t.numUnit=n.longs===String?o.Long.prototype.toString.call(e.numUnit):n.longs===Number?new o.LongBits(e.numUnit.low>>>0,e.numUnit.high>>>0).toNumber():e.numUnit),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.Mapping=function(){function i(e){if(e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.id=e.uint64();break;case 2:i.memoryStart=e.uint64();break;case 3:i.memoryLimit=e.uint64();break;case 4:i.fileOffset=e.uint64();break;case 5:i.filename=e.int64();break;case 6:i.buildId=e.int64();break;case 7:i.hasFunctions=e.bool();break;case 8:i.hasFilenames=e.bool();break;case 9:i.hasLineNumbers=e.bool();break;case 10:i.hasInlineFrames=e.bool();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.id&&e.hasOwnProperty("id")&&!(o.isInteger(e.id)||e.id&&o.isInteger(e.id.low)&&o.isInteger(e.id.high))?"id: integer|Long expected":null!=e.memoryStart&&e.hasOwnProperty("memoryStart")&&!(o.isInteger(e.memoryStart)||e.memoryStart&&o.isInteger(e.memoryStart.low)&&o.isInteger(e.memoryStart.high))?"memoryStart: integer|Long expected":null!=e.memoryLimit&&e.hasOwnProperty("memoryLimit")&&!(o.isInteger(e.memoryLimit)||e.memoryLimit&&o.isInteger(e.memoryLimit.low)&&o.isInteger(e.memoryLimit.high))?"memoryLimit: integer|Long expected":null!=e.fileOffset&&e.hasOwnProperty("fileOffset")&&!(o.isInteger(e.fileOffset)||e.fileOffset&&o.isInteger(e.fileOffset.low)&&o.isInteger(e.fileOffset.high))?"fileOffset: integer|Long expected":null!=e.filename&&e.hasOwnProperty("filename")&&!(o.isInteger(e.filename)||e.filename&&o.isInteger(e.filename.low)&&o.isInteger(e.filename.high))?"filename: integer|Long expected":null!=e.buildId&&e.hasOwnProperty("buildId")&&!(o.isInteger(e.buildId)||e.buildId&&o.isInteger(e.buildId.low)&&o.isInteger(e.buildId.high))?"buildId: integer|Long expected":null!=e.hasFunctions&&e.hasOwnProperty("hasFunctions")&&"boolean"!=typeof e.hasFunctions?"hasFunctions: boolean expected":null!=e.hasFilenames&&e.hasOwnProperty("hasFilenames")&&"boolean"!=typeof e.hasFilenames?"hasFilenames: boolean expected":null!=e.hasLineNumbers&&e.hasOwnProperty("hasLineNumbers")&&"boolean"!=typeof e.hasLineNumbers?"hasLineNumbers: boolean expected":null!=e.hasInlineFrames&&e.hasOwnProperty("hasInlineFrames")&&"boolean"!=typeof e.hasInlineFrames?"hasInlineFrames: boolean expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.Mapping)return e;var n=new r.perftools.profiles.Mapping;return null!=e.id&&(o.Long?(n.id=o.Long.fromValue(e.id)).unsigned=!0:"string"==typeof e.id?n.id=parseInt(e.id,10):"number"==typeof e.id?n.id=e.id:"object"==typeof e.id&&(n.id=new o.LongBits(e.id.low>>>0,e.id.high>>>0).toNumber(!0))),null!=e.memoryStart&&(o.Long?(n.memoryStart=o.Long.fromValue(e.memoryStart)).unsigned=!0:"string"==typeof e.memoryStart?n.memoryStart=parseInt(e.memoryStart,10):"number"==typeof e.memoryStart?n.memoryStart=e.memoryStart:"object"==typeof e.memoryStart&&(n.memoryStart=new o.LongBits(e.memoryStart.low>>>0,e.memoryStart.high>>>0).toNumber(!0))),null!=e.memoryLimit&&(o.Long?(n.memoryLimit=o.Long.fromValue(e.memoryLimit)).unsigned=!0:"string"==typeof e.memoryLimit?n.memoryLimit=parseInt(e.memoryLimit,10):"number"==typeof e.memoryLimit?n.memoryLimit=e.memoryLimit:"object"==typeof e.memoryLimit&&(n.memoryLimit=new o.LongBits(e.memoryLimit.low>>>0,e.memoryLimit.high>>>0).toNumber(!0))),null!=e.fileOffset&&(o.Long?(n.fileOffset=o.Long.fromValue(e.fileOffset)).unsigned=!0:"string"==typeof e.fileOffset?n.fileOffset=parseInt(e.fileOffset,10):"number"==typeof e.fileOffset?n.fileOffset=e.fileOffset:"object"==typeof e.fileOffset&&(n.fileOffset=new o.LongBits(e.fileOffset.low>>>0,e.fileOffset.high>>>0).toNumber(!0))),null!=e.filename&&(o.Long?(n.filename=o.Long.fromValue(e.filename)).unsigned=!1:"string"==typeof e.filename?n.filename=parseInt(e.filename,10):"number"==typeof e.filename?n.filename=e.filename:"object"==typeof e.filename&&(n.filename=new o.LongBits(e.filename.low>>>0,e.filename.high>>>0).toNumber())),null!=e.buildId&&(o.Long?(n.buildId=o.Long.fromValue(e.buildId)).unsigned=!1:"string"==typeof e.buildId?n.buildId=parseInt(e.buildId,10):"number"==typeof e.buildId?n.buildId=e.buildId:"object"==typeof e.buildId&&(n.buildId=new o.LongBits(e.buildId.low>>>0,e.buildId.high>>>0).toNumber())),null!=e.hasFunctions&&(n.hasFunctions=Boolean(e.hasFunctions)),null!=e.hasFilenames&&(n.hasFilenames=Boolean(e.hasFilenames)),null!=e.hasLineNumbers&&(n.hasLineNumbers=Boolean(e.hasLineNumbers)),null!=e.hasInlineFrames&&(n.hasInlineFrames=Boolean(e.hasInlineFrames)),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!0);t.id=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.id=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!0),t.memoryStart=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.memoryStart=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!0),t.memoryLimit=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.memoryLimit=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!0),t.fileOffset=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.fileOffset=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.filename=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.filename=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.buildId=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.buildId=n.longs===String?"0":0,t.hasFunctions=!1,t.hasFilenames=!1,t.hasLineNumbers=!1,t.hasInlineFrames=!1}return null!=e.id&&e.hasOwnProperty("id")&&("number"==typeof e.id?t.id=n.longs===String?String(e.id):e.id:t.id=n.longs===String?o.Long.prototype.toString.call(e.id):n.longs===Number?new o.LongBits(e.id.low>>>0,e.id.high>>>0).toNumber(!0):e.id),null!=e.memoryStart&&e.hasOwnProperty("memoryStart")&&("number"==typeof e.memoryStart?t.memoryStart=n.longs===String?String(e.memoryStart):e.memoryStart:t.memoryStart=n.longs===String?o.Long.prototype.toString.call(e.memoryStart):n.longs===Number?new o.LongBits(e.memoryStart.low>>>0,e.memoryStart.high>>>0).toNumber(!0):e.memoryStart),null!=e.memoryLimit&&e.hasOwnProperty("memoryLimit")&&("number"==typeof e.memoryLimit?t.memoryLimit=n.longs===String?String(e.memoryLimit):e.memoryLimit:t.memoryLimit=n.longs===String?o.Long.prototype.toString.call(e.memoryLimit):n.longs===Number?new o.LongBits(e.memoryLimit.low>>>0,e.memoryLimit.high>>>0).toNumber(!0):e.memoryLimit),null!=e.fileOffset&&e.hasOwnProperty("fileOffset")&&("number"==typeof e.fileOffset?t.fileOffset=n.longs===String?String(e.fileOffset):e.fileOffset:t.fileOffset=n.longs===String?o.Long.prototype.toString.call(e.fileOffset):n.longs===Number?new o.LongBits(e.fileOffset.low>>>0,e.fileOffset.high>>>0).toNumber(!0):e.fileOffset),null!=e.filename&&e.hasOwnProperty("filename")&&("number"==typeof e.filename?t.filename=n.longs===String?String(e.filename):e.filename:t.filename=n.longs===String?o.Long.prototype.toString.call(e.filename):n.longs===Number?new o.LongBits(e.filename.low>>>0,e.filename.high>>>0).toNumber():e.filename),null!=e.buildId&&e.hasOwnProperty("buildId")&&("number"==typeof e.buildId?t.buildId=n.longs===String?String(e.buildId):e.buildId:t.buildId=n.longs===String?o.Long.prototype.toString.call(e.buildId):n.longs===Number?new o.LongBits(e.buildId.low>>>0,e.buildId.high>>>0).toNumber():e.buildId),null!=e.hasFunctions&&e.hasOwnProperty("hasFunctions")&&(t.hasFunctions=e.hasFunctions),null!=e.hasFilenames&&e.hasOwnProperty("hasFilenames")&&(t.hasFilenames=e.hasFilenames),null!=e.hasLineNumbers&&e.hasOwnProperty("hasLineNumbers")&&(t.hasLineNumbers=e.hasLineNumbers),null!=e.hasInlineFrames&&e.hasOwnProperty("hasInlineFrames")&&(t.hasInlineFrames=e.hasInlineFrames),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.Location=function(){function i(e){if(this.line=[],e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.id=e.uint64();break;case 2:i.mappingId=e.uint64();break;case 3:i.address=e.uint64();break;case 4:i.line&&i.line.length||(i.line=[]),i.line.push(r.perftools.profiles.Line.decode(e,e.uint32()));break;case 5:i.isFolded=e.bool();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(null!=e.id&&e.hasOwnProperty("id")&&!(o.isInteger(e.id)||e.id&&o.isInteger(e.id.low)&&o.isInteger(e.id.high)))return"id: integer|Long expected";if(null!=e.mappingId&&e.hasOwnProperty("mappingId")&&!(o.isInteger(e.mappingId)||e.mappingId&&o.isInteger(e.mappingId.low)&&o.isInteger(e.mappingId.high)))return"mappingId: integer|Long expected";if(null!=e.address&&e.hasOwnProperty("address")&&!(o.isInteger(e.address)||e.address&&o.isInteger(e.address.low)&&o.isInteger(e.address.high)))return"address: integer|Long expected";if(null!=e.line&&e.hasOwnProperty("line")){if(!Array.isArray(e.line))return"line: array expected";for(var n=0;n>>0,e.id.high>>>0).toNumber(!0))),null!=e.mappingId&&(o.Long?(n.mappingId=o.Long.fromValue(e.mappingId)).unsigned=!0:"string"==typeof e.mappingId?n.mappingId=parseInt(e.mappingId,10):"number"==typeof e.mappingId?n.mappingId=e.mappingId:"object"==typeof e.mappingId&&(n.mappingId=new o.LongBits(e.mappingId.low>>>0,e.mappingId.high>>>0).toNumber(!0))),null!=e.address&&(o.Long?(n.address=o.Long.fromValue(e.address)).unsigned=!0:"string"==typeof e.address?n.address=parseInt(e.address,10):"number"==typeof e.address?n.address=e.address:"object"==typeof e.address&&(n.address=new o.LongBits(e.address.low>>>0,e.address.high>>>0).toNumber(!0))),e.line){if(!Array.isArray(e.line))throw TypeError(".perftools.profiles.Location.line: array expected");n.line=[];for(var t=0;t>>0,e.id.high>>>0).toNumber(!0):e.id),null!=e.mappingId&&e.hasOwnProperty("mappingId")&&("number"==typeof e.mappingId?t.mappingId=n.longs===String?String(e.mappingId):e.mappingId:t.mappingId=n.longs===String?o.Long.prototype.toString.call(e.mappingId):n.longs===Number?new o.LongBits(e.mappingId.low>>>0,e.mappingId.high>>>0).toNumber(!0):e.mappingId),null!=e.address&&e.hasOwnProperty("address")&&("number"==typeof e.address?t.address=n.longs===String?String(e.address):e.address:t.address=n.longs===String?o.Long.prototype.toString.call(e.address):n.longs===Number?new o.LongBits(e.address.low>>>0,e.address.high>>>0).toNumber(!0):e.address),e.line&&e.line.length){t.line=[];for(var l=0;l>>3){case 1:i.functionId=e.uint64();break;case 2:i.line=e.int64();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.functionId&&e.hasOwnProperty("functionId")&&!(o.isInteger(e.functionId)||e.functionId&&o.isInteger(e.functionId.low)&&o.isInteger(e.functionId.high))?"functionId: integer|Long expected":null!=e.line&&e.hasOwnProperty("line")&&!(o.isInteger(e.line)||e.line&&o.isInteger(e.line.low)&&o.isInteger(e.line.high))?"line: integer|Long expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.Line)return e;var n=new r.perftools.profiles.Line;return null!=e.functionId&&(o.Long?(n.functionId=o.Long.fromValue(e.functionId)).unsigned=!0:"string"==typeof e.functionId?n.functionId=parseInt(e.functionId,10):"number"==typeof e.functionId?n.functionId=e.functionId:"object"==typeof e.functionId&&(n.functionId=new o.LongBits(e.functionId.low>>>0,e.functionId.high>>>0).toNumber(!0))),null!=e.line&&(o.Long?(n.line=o.Long.fromValue(e.line)).unsigned=!1:"string"==typeof e.line?n.line=parseInt(e.line,10):"number"==typeof e.line?n.line=e.line:"object"==typeof e.line&&(n.line=new o.LongBits(e.line.low>>>0,e.line.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!0);t.functionId=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.functionId=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!1),t.line=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.line=n.longs===String?"0":0}return null!=e.functionId&&e.hasOwnProperty("functionId")&&("number"==typeof e.functionId?t.functionId=n.longs===String?String(e.functionId):e.functionId:t.functionId=n.longs===String?o.Long.prototype.toString.call(e.functionId):n.longs===Number?new o.LongBits(e.functionId.low>>>0,e.functionId.high>>>0).toNumber(!0):e.functionId),null!=e.line&&e.hasOwnProperty("line")&&("number"==typeof e.line?t.line=n.longs===String?String(e.line):e.line:t.line=n.longs===String?o.Long.prototype.toString.call(e.line):n.longs===Number?new o.LongBits(e.line.low>>>0,e.line.high>>>0).toNumber():e.line),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.Function=function(){function i(e){if(e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.id=e.uint64();break;case 2:i.name=e.int64();break;case 3:i.systemName=e.int64();break;case 4:i.filename=e.int64();break;case 5:i.startLine=e.int64();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.id&&e.hasOwnProperty("id")&&!(o.isInteger(e.id)||e.id&&o.isInteger(e.id.low)&&o.isInteger(e.id.high))?"id: integer|Long expected":null!=e.name&&e.hasOwnProperty("name")&&!(o.isInteger(e.name)||e.name&&o.isInteger(e.name.low)&&o.isInteger(e.name.high))?"name: integer|Long expected":null!=e.systemName&&e.hasOwnProperty("systemName")&&!(o.isInteger(e.systemName)||e.systemName&&o.isInteger(e.systemName.low)&&o.isInteger(e.systemName.high))?"systemName: integer|Long expected":null!=e.filename&&e.hasOwnProperty("filename")&&!(o.isInteger(e.filename)||e.filename&&o.isInteger(e.filename.low)&&o.isInteger(e.filename.high))?"filename: integer|Long expected":null!=e.startLine&&e.hasOwnProperty("startLine")&&!(o.isInteger(e.startLine)||e.startLine&&o.isInteger(e.startLine.low)&&o.isInteger(e.startLine.high))?"startLine: integer|Long expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.Function)return e;var n=new r.perftools.profiles.Function;return null!=e.id&&(o.Long?(n.id=o.Long.fromValue(e.id)).unsigned=!0:"string"==typeof e.id?n.id=parseInt(e.id,10):"number"==typeof e.id?n.id=e.id:"object"==typeof e.id&&(n.id=new o.LongBits(e.id.low>>>0,e.id.high>>>0).toNumber(!0))),null!=e.name&&(o.Long?(n.name=o.Long.fromValue(e.name)).unsigned=!1:"string"==typeof e.name?n.name=parseInt(e.name,10):"number"==typeof e.name?n.name=e.name:"object"==typeof e.name&&(n.name=new o.LongBits(e.name.low>>>0,e.name.high>>>0).toNumber())),null!=e.systemName&&(o.Long?(n.systemName=o.Long.fromValue(e.systemName)).unsigned=!1:"string"==typeof e.systemName?n.systemName=parseInt(e.systemName,10):"number"==typeof e.systemName?n.systemName=e.systemName:"object"==typeof e.systemName&&(n.systemName=new o.LongBits(e.systemName.low>>>0,e.systemName.high>>>0).toNumber())),null!=e.filename&&(o.Long?(n.filename=o.Long.fromValue(e.filename)).unsigned=!1:"string"==typeof e.filename?n.filename=parseInt(e.filename,10):"number"==typeof e.filename?n.filename=e.filename:"object"==typeof e.filename&&(n.filename=new o.LongBits(e.filename.low>>>0,e.filename.high>>>0).toNumber())),null!=e.startLine&&(o.Long?(n.startLine=o.Long.fromValue(e.startLine)).unsigned=!1:"string"==typeof e.startLine?n.startLine=parseInt(e.startLine,10):"number"==typeof e.startLine?n.startLine=e.startLine:"object"==typeof e.startLine&&(n.startLine=new o.LongBits(e.startLine.low>>>0,e.startLine.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!0);t.id=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.id=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!1),t.name=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.name=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.systemName=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.systemName=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.filename=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.filename=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.startLine=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.startLine=n.longs===String?"0":0}return null!=e.id&&e.hasOwnProperty("id")&&("number"==typeof e.id?t.id=n.longs===String?String(e.id):e.id:t.id=n.longs===String?o.Long.prototype.toString.call(e.id):n.longs===Number?new o.LongBits(e.id.low>>>0,e.id.high>>>0).toNumber(!0):e.id),null!=e.name&&e.hasOwnProperty("name")&&("number"==typeof e.name?t.name=n.longs===String?String(e.name):e.name:t.name=n.longs===String?o.Long.prototype.toString.call(e.name):n.longs===Number?new o.LongBits(e.name.low>>>0,e.name.high>>>0).toNumber():e.name),null!=e.systemName&&e.hasOwnProperty("systemName")&&("number"==typeof e.systemName?t.systemName=n.longs===String?String(e.systemName):e.systemName:t.systemName=n.longs===String?o.Long.prototype.toString.call(e.systemName):n.longs===Number?new o.LongBits(e.systemName.low>>>0,e.systemName.high>>>0).toNumber():e.systemName),null!=e.filename&&e.hasOwnProperty("filename")&&("number"==typeof e.filename?t.filename=n.longs===String?String(e.filename):e.filename:t.filename=n.longs===String?o.Long.prototype.toString.call(e.filename):n.longs===Number?new o.LongBits(e.filename.low>>>0,e.filename.high>>>0).toNumber():e.filename),null!=e.startLine&&e.hasOwnProperty("startLine")&&("number"==typeof e.startLine?t.startLine=n.longs===String?String(e.startLine):e.startLine:t.startLine=n.longs===String?o.Long.prototype.toString.call(e.startLine):n.longs===Number?new o.LongBits(e.startLine.low>>>0,e.startLine.high>>>0).toNumber():e.startLine),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i),l}(),module.exports=r; -},{"protobufjs/minimal":174}],154:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importAsPprofProfile=r;var e=require("./profile.proto.js"),n=require("../lib/profile"),t=require("../lib/utils"),l=require("../lib/value-formatters");function r(r){if(0===r.byteLength)return null;let o;try{o=e.perftools.profiles.Profile.decode(new Uint8Array(r))}catch(e){return null}function i(e){return"number"==typeof e?e:e.low}function u(e){return o.stringTable[i(e)]||null}const s=new Map;function a(e){const{name:n,filename:t,startLine:l}=e,r=null!=n&&u(n)||"(unknown)",o=null!=t?u(t):null,i=null!=l?+l:null,s={key:`${r}:${o}:${i}`,name:r};return null!=o&&(s.file=o),null!=i&&(s.line=i),s}for(let e of o.function)if(e.id){const n=a(e);null!=n&&s.set(i(e.id),n)}function c(e){const{line:n}=e;if(null==n)return null;const l=(0,t.lastOf)(n);return null==l?null:l.functionId&&s.get(i(l.functionId))||null}const f=new Map;for(let e of o.location)if(null!=e.id){const n=c(e);n&&f.set(i(e.id),n)}const p=o.sampleType.map(e=>({type:e.type&&u(e.type)||"samples",unit:e.unit&&u(e.unit)||"count"})),d=o.defaultSampleType?+o.defaultSampleType:p.length-1,m=p[d],y=new n.StackListProfileBuilder;switch(m.unit){case"nanoseconds":case"microseconds":case"milliseconds":case"seconds":y.setValueFormatter(new l.TimeFormatter(m.unit));break;case"bytes":y.setValueFormatter(new l.ByteFormatter)}for(let e of o.sample){const n=e.locationId?e.locationId.map(e=>f.get(i(e))):[];n.reverse();const t=e.value[d];y.appendSampleWithWeight(n.filter(e=>null!=e),+t)}return y.build()} -},{"./profile.proto.js":162,"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110}],155:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromChromeHeapProfile=o;var e=require("../lib/profile"),r=require("../lib/utils"),t=require("../lib/value-formatters");const n=new Map;function i(e){return(0,r.getOrInsert)(n,e,e=>{const r=e.functionName||"(anonymous)",t=e.url,n=e.lineNumber,i=e.columnNumber;return{key:`${r}:${t}:${n}:${i}`,name:r,file:t,line:n,col:i}})}function o(r){const n=new Map;let o=0;const l=(e,r)=>{e.id=o++,n.set(e.id,e),r&&(e.parent=r.id),e.children.forEach(r=>l(r,e))};l(r.head);const u=e=>{if(0===e.children.length)return e.selfSize||0;const r=e.children.reduce((e,r)=>e+=u(r),e.selfSize);return e.totalSize=r,r},a=u(r.head),s=[];for(let e of n.values()){let r=[];for(r.push(e);void 0!==e.parent;){const t=n.get(e.parent);if(void 0===t)break;r.unshift(t),e=t}s.push(r)}const c=new e.StackListProfileBuilder(a);for(let e of s){const r=e[e.length-1];c.appendSampleWithWeight(e.map(e=>i(e.callFrame)),r.selfSize)}return c.setValueFormatter(new t.ByteFormatter),c.build()} -},{"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110}],156:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isTraceEventFormatted=l,exports.importTraceEvents=p;var e=require("../lib/utils"),t=require("../lib/profile"),r=require("../lib/value-formatters");function n(e){const t=[];for(let r of e)switch(r.ph){case"B":case"E":case"X":t.push(r)}return t}function s(e){const t=[];for(let r of e)switch(r.ph){case"B":case"E":t.push(r);break;case"X":let e=null;if(null!=r.dur?e=r.dur:null!=r.tdur&&(e=r.tdur),null==e){console.warn("Found a complete event (X) with no duration. Skipping: ",r);continue}t.push(Object.assign({},r,{ph:"B"})),t.push(Object.assign({},r,{ph:"E",ts:r.ts+e}));break;default:return r}return t}function i(e){const t=new Map;for(let r of e)"M"===r.ph&&"process_name"===r.name&&r.args&&r.args.name&&t.set(r.pid,r.args.name);return t}function a(e){const t=new Map;for(let r of e)if("M"===r.ph&&"thread_name"===r.name&&r.args&&r.args.name){const e=`${r.pid}:${r.tid}`;t.set(e,r.args.name)}return t}function o(e){let t=`${e.name||"(unnamed)"}`;return e.args&&(t+=` ${JSON.stringify(e.args)}`),t}function u(u){const c=new Map,f=s(n(u)),l=i(u),p=a(u);if(f.sort((e,t)=>{if(e.tst.ts)return 1;if(e.pid===t.pid&&e.tid===t.tid){if(o(e)===o(t)){if("B"===e.ph&&"E"===t.ph)return-1;if("E"===e.ph&&"B"===t.ph)return 1}else{if("B"===e.ph&&"E"===t.ph)return 1;if("E"===e.ph&&"B"===t.ph)return-1}}return-1}),f.length>0){const e=f[0].ts;for(let t of f)t.ts-=e}function d(n,s){const i=`${(0,e.zeroPad)(""+n,10)}:${(0,e.zeroPad)(""+s,10)}`;let a=c.get(i);if(null!=a)return a;let o=new t.CallTreeProfileBuilder;a={profile:o,eventStack:[]},o.setValueFormatter(new r.TimeFormatter("microseconds")),c.set(i,a);const u=l.get(n),f=p.get(`${n}:${s}`);return null!=u&&null!=f?o.setName(`${u} (pid ${n}), ${f} (tid ${s})`):null!=u?o.setName(`${u} (pid ${n}, tid ${s})`):null!=f?o.setName(`${f} (pid ${n}, tid ${s})`):o.setName(`pid ${n}, tid ${s}`),a}for(let t of f){const{profile:r,eventStack:n}=d(t.pid,t.tid),s=o(t),i={key:s,name:s};switch(t.ph){case"B":n.push(t),r.enterFrame(i,t.ts);break;case"E":const s=(0,e.lastOf)(n);null!=s&&s.name===t.name?(r.leaveFrame(i,t.ts),n.pop()):console.warn("Event discarded because it did not match top-of-stack. Discarded event:",t,"Top of stack:",s);break;default:return t}}const h=Array.from(c.entries());return(0,e.sortBy)(h,e=>e[0]),{name:"",indexToView:0,profiles:h.map(e=>e[1].profile)}}function c(e){if(!Array.isArray(e))return!1;if(0===e.length)return!1;for(let t of e){if(!("ph"in t))return!1;switch(t.ph){case"B":case"E":case"X":if(!("ts"in t))return!1}}return!0}function f(e){return"traceEvents"in e&&c(e.traceEvents)}function l(e){return f(e)||c(e)}function p(e){if(f(e))return u(e.traceEvents);if(c(e))return u(e);return e} -},{"../lib/utils":60,"../lib/profile":109,"../lib/value-formatters":110}],101:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importProfileGroupFromText=g,exports.importProfileGroupFromBase64=h,exports.importProfilesFromFile=F,exports.importProfilesFromArrayBuffer=y,exports.importFromFileSystemDirectoryEntry=C;var e=require("./chrome"),r=require("./stackprof"),o=require("./instruments"),t=require("./bg-flamegraph"),i=require("./firefox"),n=require("../lib/file-format"),s=require("./v8proflog"),p=require("./linux-tools-perf"),l=require("./haskell"),m=require("./utils"),a=require("./pprof"),f=require("../lib/utils"),u=require("./v8heapalloc"),c=require("./trace-event"),d=function(e,r,o,t){return new(o||(o=Promise))(function(i,n){function s(e){try{l(t.next(e))}catch(e){n(e)}}function p(e){try{l(t.throw(e))}catch(e){n(e)}}function l(e){e.done?i(e.value):new o(function(r){r(e.value)}).then(s,p)}l((t=t.apply(e,r||[])).next())})};function g(e,r){return d(this,void 0,void 0,function*(){return yield P(new m.TextProfileDataSource(e,r))})}function h(e,r){return d(this,void 0,void 0,function*(){return yield P(m.MaybeCompressedDataReader.fromArrayBuffer(e,(0,f.decodeBase64)(r).buffer))})}function F(e){return d(this,void 0,void 0,function*(){return P(m.MaybeCompressedDataReader.fromFile(e))})}function y(e,r){return d(this,void 0,void 0,function*(){return P(m.MaybeCompressedDataReader.fromArrayBuffer(e,r))})}function P(e){return d(this,void 0,void 0,function*(){const r=yield e.name(),o=yield I(e);if(o){o.name||(o.name=r);for(let e of o.profiles)e&&!e.getName()&&e.setName(r);return o}return null})}function v(e){return e?{name:e.getName(),indexToView:0,profiles:[e]}:null}function x(e){return"["===(e=e.trim())[0]&&"]"!==(e=e.replace(/,\s*$/,""))[e.length-1]&&(e+="]"),e}function I(m){return d(this,void 0,void 0,function*(){const f=yield m.name(),d=yield m.readAsArrayBuffer();{const e=(0,a.importAsPprofProfile)(d);if(e)return console.log("Importing as protobuf encoded pprof file"),v(e)}const g=yield m.readAsText();if(f.endsWith(".speedscope.json"))return console.log("Importing as speedscope json file"),(0,n.importSpeedscopeProfiles)(JSON.parse(g));if(f.endsWith(".chrome.json")||/Profile-\d{8}T\d{6}/.exec(f))return console.log("Importing as Chrome Timeline"),(0,e.importFromChromeTimeline)(JSON.parse(g),f);if(f.endsWith(".stackprof.json"))return console.log("Importing as stackprof profile"),v((0,r.importFromStackprof)(JSON.parse(g)));if(f.endsWith(".instruments.txt"))return console.log("Importing as Instruments.app deep copy"),v((0,o.importFromInstrumentsDeepCopy)(g));if(f.endsWith(".linux-perf.txt"))return console.log("Importing as output of linux perf script"),(0,p.importFromLinuxPerf)(g);if(f.endsWith(".collapsedstack.txt"))return console.log("Importing as collapsed stack format"),v((0,t.importFromBGFlameGraph)(g));if(f.endsWith(".v8log.json"))return console.log("Importing as --prof-process v8 log"),v((0,s.importFromV8ProfLog)(JSON.parse(g)));if(f.endsWith(".heapprofile"))return console.log("Importing as Chrome Heap Profile"),v((0,u.importFromChromeHeapProfile)(JSON.parse(g)));let h;try{h=JSON.parse(x(g))}catch(e){}if(h){if("https://www.speedscope.app/file-format-schema.json"===h.$schema)return console.log("Importing as speedscope json file"),(0,n.importSpeedscopeProfiles)(JSON.parse(g));if(h.systemHost&&"Firefox"==h.systemHost.name)return console.log("Importing as Firefox profile"),v((0,i.importFromFirefox)(h));if((0,e.isChromeTimeline)(h))return console.log("Importing as Chrome Timeline"),(0,e.importFromChromeTimeline)(h,f);if("nodes"in h&&"samples"in h&&"timeDeltas"in h)return console.log("Importing as Chrome CPU Profile"),v((0,e.importFromChromeCPUProfile)(h));if((0,c.isTraceEventFormatted)(h))return console.log("Importing as Trace Event Format profile"),(0,c.importTraceEvents)(h);if("head"in h&&"samples"in h&&"timestamps"in h)return console.log("Importing as Chrome CPU Profile (old format)"),v((0,e.importFromOldV8CPUProfile)(h));if("mode"in h&&"frames"in h&&"raw_timestamp_deltas"in h)return console.log("Importing as stackprof profile"),v((0,r.importFromStackprof)(h));if("code"in h&&"functions"in h&&"ticks"in h)return console.log("Importing as --prof-process v8 log"),v((0,s.importFromV8ProfLog)(h));if("head"in h&&"selfSize"in h.head)return console.log("Importing as Chrome Heap Profile"),v((0,u.importFromChromeHeapProfile)(JSON.parse(g)));if("rts_arguments"in h&&"initial_capabilities"in h)return console.log("Importing as Haskell GHC JSON Profile"),(0,l.importFromHaskell)(h)}else{if(/^[\w \t\(\)]*\tSymbol Name/.exec(g))return console.log("Importing as Instruments.app deep copy"),v((0,o.importFromInstrumentsDeepCopy)(g));const e=g.split(/\n/).length;if(e>=1&&e===g.split(/ \d+\r?\n/).length)return console.log("Importing as collapsed stack format"),v((0,t.importFromBGFlameGraph)(g));const r=(0,p.importFromLinuxPerf)(g);if(r)return console.log("Importing from linux perf script output"),r}return null})}function C(e){return d(this,void 0,void 0,function*(){return(0,o.importFromInstrumentsTrace)(e)})} -},{"./chrome":145,"./stackprof":146,"./instruments":147,"./bg-flamegraph":148,"./firefox":149,"../lib/file-format":82,"./v8proflog":150,"./linux-tools-perf":151,"./haskell":152,"./utils":153,"./pprof":154,"../lib/utils":60,"./v8heapalloc":155,"./trace-event":156}]},{},[101], null) +parcelRequire=function(e,r,n,t){var i="function"==typeof parcelRequire&&parcelRequire,o="function"==typeof require&&require;function u(n,t){if(!r[n]){if(!e[n]){var f="function"==typeof parcelRequire&&parcelRequire;if(!t&&f)return f(n,!0);if(i)return i(n,!0);if(o&&"string"==typeof n)return o(n);var c=new Error("Cannot find module '"+n+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[n][1][r]||r};var l=r[n]=new u.Module(n);e[n][0].call(l.exports,p,l,l.exports,this)}return r[n].exports;function p(e){return u(p.resolve(e))}}u.isParcelRequire=!0,u.Module=function(e){this.id=e,this.bundle=u,this.exports={}},u.modules=e,u.cache=r,u.parent=i,u.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]};for(var f=0;fe.id)}),r.children.forEach(e)}(e),t}function t(e,t){return e.map((r,n)=>{return r-(0===n?1e6*t:e[n-1])})}function r(r){return{samples:r.samples,startTime:1e6*r.startTime,endTime:1e6*r.endTime,nodes:e(r.head),timeDeltas:t(r.timestamps,r.startTime)}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.chromeTreeToNodes=r; +},{}],145:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isChromeTimeline=i,exports.importFromChromeTimeline=o,exports.importFromChromeCPUProfile=f,exports.importFromOldV8CPUProfile=u;var e=require("../lib/profile"),t=require("../lib/utils"),r=require("../lib/value-formatters"),n=require("./v8cpuFormatter");function i(e){if(!Array.isArray(e))return!1;if(e.length<1)return!1;const t=e[0];return"pid"in t&&"tid"in t&&"ph"in t&&"cat"in t&&!!e.find(e=>"CpuProfile"===e.name||"Profile"===e.name||"ProfileChunk"===e.name)}function o(e,r){const n=new Map,i=new Map,o=new Map;(0,t.sortBy)(e,e=>e.ts);for(let t of e){if("CpuProfile"===t.name){const e=`${t.pid}:${t.tid}`,r=t.id||e;n.set(r,t.args.data.cpuProfile),i.set(r,e)}if("Profile"===t.name){const e=`${t.pid}:${t.tid}`;n.set(t.id||e,Object.assign({startTime:0,endTime:0,nodes:[],samples:[],timeDeltas:[]},t.args.data)),t.id&&i.set(t.id,`${t.pid}:${t.tid}`)}if("thread_name"===t.name&&o.set(`${t.pid}:${t.tid}`,t.args.name),"ProfileChunk"===t.name){const e=`${t.pid}:${t.tid}`,r=n.get(t.id||e);if(r){const e=t.args.data;e.cpuProfile&&(e.cpuProfile.nodes&&(r.nodes=r.nodes.concat(e.cpuProfile.nodes)),e.cpuProfile.samples&&(r.samples=r.samples.concat(e.cpuProfile.samples))),e.timeDeltas&&(r.timeDeltas=r.timeDeltas.concat(e.timeDeltas)),null!=e.startTime&&(r.startTime=e.startTime),null!=e.endTime&&(r.endTime=e.endTime)}else console.warn(`Ignoring ProfileChunk for undeclared Profile with id ${t.id||e}`)}}if(n.size>0){const e=[];let l=0;return(0,t.itForEach)(n.keys(),t=>{let a=null,s=i.get(t);s&&(a=o.get(s)||null);const m=f(n.get(t));a&&n.size>1?(m.setName(`${r} - ${a}`),"CrRendererMain"===a&&(l=e.length)):m.setName(`${r}`),e.push(m)}),{name:r,indexToView:l,profiles:e}}throw new Error("Could not find CPU profile in Timeline")}const l=new Map;function a(e){return(0,t.getOrInsert)(l,e,e=>{const t=e.functionName||"(anonymous)",r=e.url,n=e.lineNumber,i=e.columnNumber;return{key:`${t}:${r}:${n}:${i}`,name:t,file:r,line:n,col:i}})}function s(e){const{functionName:t,url:r}=e;return"native dummy.js"===r||("(root)"===t||"(idle)"===t)}function m(e){return"(garbage collector)"===e||"(program)"===e}function f(n){const i=new e.CallTreeProfileBuilder(n.endTime-n.startTime),o=new Map;for(let e of n.nodes)o.set(e.id,e);for(let e of n.nodes)if("number"==typeof e.parent&&(e.parent=o.get(e.parent)),e.children)for(let t of e.children){const r=o.get(t);r&&(r.parent=e)}const l=[],f=[];let u=n.timeDeltas[0],c=NaN;for(let e=0;e0&&(0,t.lastOf)(p)!=c;){const e=a(p.pop().callFrame);i.leaveFrame(e,r)}const d=[];for(let e=u;e&&e!=c&&!s(e.callFrame);e=m(e.callFrame.functionName)?(0,t.lastOf)(p):e.parent||null)d.push(e);d.reverse();for(let e of d)i.enterFrame(a(e.callFrame),r);p=p.concat(d)}for(let e=p.length-1;e>=0;e--)i.leaveFrame(a(p[e].callFrame),(0,t.lastOf)(f));return i.setValueFormatter(new r.TimeFormatter("microseconds")),i.build()}function u(e){return f((0,n.chromeTreeToNodes)(e))} +},{"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110,"./v8cpuFormatter":163}],146:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromStackprof=r;var e=require("../lib/profile"),t=require("../lib/value-formatters");function r(r){const o=r.raw_timestamp_deltas.reduce((e,t)=>e+t,0),a=new e.StackListProfileBuilder(o),{frames:l,raw:s,raw_timestamp_deltas:i}=r;let n=0,c=[];for(let e=0;e=0;)e[t]=0}var i=0,l=1,d=2,f=3,o=258,b=29,s=256,u=s+1+b,c=30,p=19,h=2*u+1,v=15,y=16,x=7,g=256,m=16,w=17,A=18,k=[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],q=[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],z=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],j=512,B=new Array(2*(u+2));a(B);var C=new Array(2*c);a(C);var D=new Array(j);a(D);var E=new Array(o-f+1);a(E);var F=new Array(b);a(F);var G,H,I,J=new Array(c);function K(e,t,n,_,r){this.static_tree=e,this.extra_bits=t,this.extra_base=n,this.elems=_,this.max_length=r,this.has_stree=e&&e.length}function L(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function M(e){return e<256?D[e]:D[256+(e>>>7)]}function N(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function O(e,t,n){e.bi_valid>y-n?(e.bi_buf|=t<>y-e.bi_valid,e.bi_valid+=n-y):(e.bi_buf|=t<>>=1,n<<=1}while(--t>0);return n>>>1}function R(e){16===e.bi_valid?(N(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}function T(e,t){var n,_,r,a,i,l,d=t.dyn_tree,f=t.max_code,o=t.stat_desc.static_tree,b=t.stat_desc.has_stree,s=t.stat_desc.extra_bits,u=t.stat_desc.extra_base,c=t.stat_desc.max_length,p=0;for(a=0;a<=v;a++)e.bl_count[a]=0;for(d[2*e.heap[e.heap_max]+1]=0,n=e.heap_max+1;nc&&(a=c,p++),d[2*_+1]=a,_>f||(e.bl_count[a]++,i=0,_>=u&&(i=s[_-u]),l=d[2*_],e.opt_len+=l*(a+i),b&&(e.static_len+=l*(o[2*_+1]+i)));if(0!==p){do{for(a=c-1;0===e.bl_count[a];)a--;e.bl_count[a]--,e.bl_count[a+1]+=2,e.bl_count[c]--,p-=2}while(p>0);for(a=c;0!==a;a--)for(_=e.bl_count[a];0!==_;)(r=e.heap[--n])>f||(d[2*r+1]!==a&&(e.opt_len+=(a-d[2*r+1])*d[2*r],d[2*r+1]=a),_--)}}function U(e,t,n){var _,r,a=new Array(v+1),i=0;for(_=1;_<=v;_++)a[_]=i=i+n[_-1]<<1;for(r=0;r<=t;r++){var l=e[2*r+1];0!==l&&(e[2*r]=Q(a[l]++,l))}}function V(){var e,t,n,_,r,a=new Array(v+1);for(n=0,_=0;_>=7;_8?N(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function Y(t,n,_,r){X(t),r&&(N(t,_),N(t,~_)),e.arraySet(t.pending_buf,t.window,n,_,t.pending),t.pending+=_}function Z(e,t,n,_){var r=2*t,a=2*n;return e[r]>1;n>=1;n--)$(e,a,n);r=d;do{n=e.heap[1],e.heap[1]=e.heap[e.heap_len--],$(e,a,1),_=e.heap[1],e.heap[--e.heap_max]=n,e.heap[--e.heap_max]=_,a[2*r]=a[2*n]+a[2*_],e.depth[r]=(e.depth[n]>=e.depth[_]?e.depth[n]:e.depth[_])+1,a[2*n+1]=a[2*_+1]=r,e.heap[1]=r++,$(e,a,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],T(e,t),U(a,f,e.bl_count)}function ne(e,t,n){var _,r,a=-1,i=t[1],l=0,d=7,f=4;for(0===i&&(d=138,f=3),t[2*(n+1)+1]=65535,_=0;_<=n;_++)r=i,i=t[2*(_+1)+1],++l=3&&0===e.bl_tree[2*S[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}function ae(e,t,n,_){var r;for(O(e,t-257,5),O(e,n-1,5),O(e,_-4,4),r=0;r<_;r++)O(e,e.bl_tree[2*S[r]+1],3);_e(e,e.dyn_ltree,t-1),_e(e,e.dyn_dtree,n-1)}function ie(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return n;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return _;for(t=32;t0?(e.strm.data_type===r&&(e.strm.data_type=ie(e)),te(e,e.l_desc),te(e,e.d_desc),o=re(e),i=e.opt_len+3+7>>>3,(f=e.static_len+3+7>>>3)<=i&&(i=f)):i=f=_+5,_+4<=i&&-1!==n?fe(e,n,_,a):e.strategy===t||f===i?(O(e,(l<<1)+(a?1:0),3),ee(e,B,C)):(O(e,(d<<1)+(a?1:0),3),ae(e,e.l_desc.max_code+1,e.d_desc.max_code+1,o+1),ee(e,e.dyn_ltree,e.dyn_dtree)),W(e),a&&X(e)}function se(e,t,n){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&n,e.last_lit++,0===t?e.dyn_ltree[2*n]++:(e.matches++,t--,e.dyn_ltree[2*(E[n]+s+1)]++,e.dyn_dtree[2*M(t)]++),e.last_lit===e.lit_bufsize-1}exports._tr_init=de,exports._tr_stored_block=fe,exports._tr_flush_block=be,exports._tr_tally=se,exports._tr_align=oe; +},{"../utils/common":166}],176:[function(require,module,exports) { +"use strict";function e(e,r,o,t){for(var u=65535&e|0,i=e>>>16&65535|0,n=0;0!==o;){o-=n=o>2e3?2e3:o;do{i=i+(u=u+r[t++]|0)|0}while(--n);u%=65521,i%=65521}return u|i<<16|0}module.exports=e; +},{}],178:[function(require,module,exports) { +"use strict";function r(){for(var r,o=[],t=0;t<256;t++){r=t;for(var n=0;n<8;n++)r=1&r?3988292384^r>>>1:r>>>1;o[t]=r}return o}var o=r();function t(r,t,n,u){var a=o,e=u+n;r^=-1;for(var f=u;f>>8^a[255&(r^t[f])];return-1^r}module.exports=t; +},{}],170:[function(require,module,exports) { +"use strict";module.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"}; +},{}],168:[function(require,module,exports) { +"use strict";var t,a=require("../utils/common"),e=require("./trees"),s=require("./adler32"),i=require("./crc32"),r=require("./messages"),n=0,h=1,l=3,_=4,d=5,o=0,u=1,g=-2,f=-3,c=-5,p=-1,m=1,w=2,v=3,k=4,z=0,b=2,x=8,y=9,B=15,S=8,q=29,I=256,A=I+1+q,C=30,R=19,j=2*A+1,D=15,E=3,H=258,K=H+E+1,N=32,F=42,G=69,J=73,L=91,M=103,O=113,P=666,Q=1,T=2,U=3,V=4,W=3;function X(t,a){return t.msg=r[a],a}function Y(t){return(t<<1)-(t>4?9:0)}function Z(t){for(var a=t.length;--a>=0;)t[a]=0}function $(t){var e=t.state,s=e.pending;s>t.avail_out&&(s=t.avail_out),0!==s&&(a.arraySet(t.output,e.pending_buf,e.pending_out,s,t.next_out),t.next_out+=s,e.pending_out+=s,t.total_out+=s,t.avail_out-=s,e.pending-=s,0===e.pending&&(e.pending_out=0))}function tt(t,a){e._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,a),t.block_start=t.strstart,$(t.strm)}function at(t,a){t.pending_buf[t.pending++]=a}function et(t,a){t.pending_buf[t.pending++]=a>>>8&255,t.pending_buf[t.pending++]=255&a}function st(t,e,r,n){var h=t.avail_in;return h>n&&(h=n),0===h?0:(t.avail_in-=h,a.arraySet(e,t.input,t.next_in,h,r),1===t.state.wrap?t.adler=s(t.adler,e,h,r):2===t.state.wrap&&(t.adler=i(t.adler,e,h,r)),t.next_in+=h,t.total_in+=h,h)}function it(t,a){var e,s,i=t.max_chain_length,r=t.strstart,n=t.prev_length,h=t.nice_match,l=t.strstart>t.w_size-K?t.strstart-(t.w_size-K):0,_=t.window,d=t.w_mask,o=t.prev,u=t.strstart+H,g=_[r+n-1],f=_[r+n];t.prev_length>=t.good_match&&(i>>=2),h>t.lookahead&&(h=t.lookahead);do{if(_[(e=a)+n]===f&&_[e+n-1]===g&&_[e]===_[r]&&_[++e]===_[r+1]){r+=2,e++;do{}while(_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&_[++r]===_[++e]&&rn){if(t.match_start=a,n=s,s>=h)break;g=_[r+n-1],f=_[r+n]}}}while((a=o[a&d])>l&&0!=--i);return n<=t.lookahead?n:t.lookahead}function rt(t){var e,s,i,r,n,h=t.w_size;do{if(r=t.window_size-t.lookahead-t.strstart,t.strstart>=h+(h-K)){a.arraySet(t.window,t.window,h,h,0),t.match_start-=h,t.strstart-=h,t.block_start-=h,e=s=t.hash_size;do{i=t.head[--e],t.head[e]=i>=h?i-h:0}while(--s);e=s=h;do{i=t.prev[--e],t.prev[e]=i>=h?i-h:0}while(--s);r+=h}if(0===t.strm.avail_in)break;if(s=st(t.strm,t.window,t.strstart+t.lookahead,r),t.lookahead+=s,t.lookahead+t.insert>=E)for(n=t.strstart-t.insert,t.ins_h=t.window[n],t.ins_h=(t.ins_h<t.pending_buf_size-5&&(e=t.pending_buf_size-5);;){if(t.lookahead<=1){if(rt(t),0===t.lookahead&&a===n)return Q;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var s=t.block_start+e;if((0===t.strstart||t.strstart>=s)&&(t.lookahead=t.strstart-s,t.strstart=s,tt(t,!1),0===t.strm.avail_out))return Q;if(t.strstart-t.block_start>=t.w_size-K&&(tt(t,!1),0===t.strm.avail_out))return Q}return t.insert=0,a===_?(tt(t,!0),0===t.strm.avail_out?U:V):(t.strstart>t.block_start&&(tt(t,!1),t.strm.avail_out),Q)}function ht(t,a){for(var s,i;;){if(t.lookahead=E&&(t.ins_h=(t.ins_h<=E)if(i=e._tr_tally(t,t.strstart-t.match_start,t.match_length-E),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=E){t.match_length--;do{t.strstart++,t.ins_h=(t.ins_h<=E&&(t.ins_h=(t.ins_h<4096)&&(t.match_length=E-1)),t.prev_length>=E&&t.match_length<=t.prev_length){r=t.strstart+t.lookahead-E,i=e._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-E),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=r&&(t.ins_h=(t.ins_h<=E&&t.strstart>0&&(i=l[r=t.strstart-1])===l[++r]&&i===l[++r]&&i===l[++r]){h=t.strstart+H;do{}while(i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&i===l[++r]&&rt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=E?(s=e._tr_tally(t,1,t.match_length-E),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(s=e._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),s&&(tt(t,!1),0===t.strm.avail_out))return Q}return t.insert=0,a===_?(tt(t,!0),0===t.strm.avail_out?U:V):t.last_lit&&(tt(t,!1),0===t.strm.avail_out)?Q:T}function dt(t,a){for(var s;;){if(0===t.lookahead&&(rt(t),0===t.lookahead)){if(a===n)return Q;break}if(t.match_length=0,s=e._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,s&&(tt(t,!1),0===t.strm.avail_out))return Q}return t.insert=0,a===_?(tt(t,!0),0===t.strm.avail_out?U:V):t.last_lit&&(tt(t,!1),0===t.strm.avail_out)?Q:T}function ot(t,a,e,s,i){this.good_length=t,this.max_lazy=a,this.nice_length=e,this.max_chain=s,this.func=i}function ut(a){a.window_size=2*a.w_size,Z(a.head),a.max_lazy_match=t[a.level].max_lazy,a.good_match=t[a.level].good_length,a.nice_match=t[a.level].nice_length,a.max_chain_length=t[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=E-1,a.match_available=0,a.ins_h=0}function gt(){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=x,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 a.Buf16(2*j),this.dyn_dtree=new a.Buf16(2*(2*C+1)),this.bl_tree=new a.Buf16(2*(2*R+1)),Z(this.dyn_ltree),Z(this.dyn_dtree),Z(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new a.Buf16(D+1),this.heap=new a.Buf16(2*A+1),Z(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new a.Buf16(2*A+1),Z(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 ft(t){var a;return t&&t.state?(t.total_in=t.total_out=0,t.data_type=b,(a=t.state).pending=0,a.pending_out=0,a.wrap<0&&(a.wrap=-a.wrap),a.status=a.wrap?F:O,t.adler=2===a.wrap?0:1,a.last_flush=n,e._tr_init(a),o):X(t,g)}function ct(t){var a=ft(t);return a===o&&ut(t.state),a}function pt(t,a){return t&&t.state?2!==t.state.wrap?g:(t.state.gzhead=a,o):g}function mt(t,e,s,i,r,n){if(!t)return g;var h=1;if(e===p&&(e=6),i<0?(h=0,i=-i):i>15&&(h=2,i-=16),r<1||r>y||s!==x||i<8||i>15||e<0||e>9||n<0||n>k)return X(t,g);8===i&&(i=9);var l=new gt;return t.state=l,l.strm=t,l.wrap=h,l.gzhead=null,l.w_bits=i,l.w_size=1<d||s<0)return a?X(a,g):g;if(f=a.state,!a.output||!a.input&&0!==a.avail_in||f.status===P&&s!==_)return X(a,0===a.avail_out?c:g);if(f.strm=a,r=f.last_flush,f.last_flush=s,f.status===F)if(2===f.wrap)a.adler=0,at(f,31),at(f,139),at(f,8),f.gzhead?(at(f,(f.gzhead.text?1:0)+(f.gzhead.hcrc?2:0)+(f.gzhead.extra?4:0)+(f.gzhead.name?8:0)+(f.gzhead.comment?16:0)),at(f,255&f.gzhead.time),at(f,f.gzhead.time>>8&255),at(f,f.gzhead.time>>16&255),at(f,f.gzhead.time>>24&255),at(f,9===f.level?2:f.strategy>=w||f.level<2?4:0),at(f,255&f.gzhead.os),f.gzhead.extra&&f.gzhead.extra.length&&(at(f,255&f.gzhead.extra.length),at(f,f.gzhead.extra.length>>8&255)),f.gzhead.hcrc&&(a.adler=i(a.adler,f.pending_buf,f.pending,0)),f.gzindex=0,f.status=G):(at(f,0),at(f,0),at(f,0),at(f,0),at(f,0),at(f,9===f.level?2:f.strategy>=w||f.level<2?4:0),at(f,W),f.status=O);else{var k=x+(f.w_bits-8<<4)<<8;k|=(f.strategy>=w||f.level<2?0:f.level<6?1:6===f.level?2:3)<<6,0!==f.strstart&&(k|=N),k+=31-k%31,f.status=O,et(f,k),0!==f.strstart&&(et(f,a.adler>>>16),et(f,65535&a.adler)),a.adler=1}if(f.status===G)if(f.gzhead.extra){for(p=f.pending;f.gzindex<(65535&f.gzhead.extra.length)&&(f.pending!==f.pending_buf_size||(f.gzhead.hcrc&&f.pending>p&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),$(a),p=f.pending,f.pending!==f.pending_buf_size));)at(f,255&f.gzhead.extra[f.gzindex]),f.gzindex++;f.gzhead.hcrc&&f.pending>p&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),f.gzindex===f.gzhead.extra.length&&(f.gzindex=0,f.status=J)}else f.status=J;if(f.status===J)if(f.gzhead.name){p=f.pending;do{if(f.pending===f.pending_buf_size&&(f.gzhead.hcrc&&f.pending>p&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),$(a),p=f.pending,f.pending===f.pending_buf_size)){m=1;break}m=f.gzindexp&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),0===m&&(f.gzindex=0,f.status=L)}else f.status=L;if(f.status===L)if(f.gzhead.comment){p=f.pending;do{if(f.pending===f.pending_buf_size&&(f.gzhead.hcrc&&f.pending>p&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),$(a),p=f.pending,f.pending===f.pending_buf_size)){m=1;break}m=f.gzindexp&&(a.adler=i(a.adler,f.pending_buf,f.pending-p,p)),0===m&&(f.status=M)}else f.status=M;if(f.status===M&&(f.gzhead.hcrc?(f.pending+2>f.pending_buf_size&&$(a),f.pending+2<=f.pending_buf_size&&(at(f,255&a.adler),at(f,a.adler>>8&255),a.adler=0,f.status=O)):f.status=O),0!==f.pending){if($(a),0===a.avail_out)return f.last_flush=-1,o}else if(0===a.avail_in&&Y(s)<=Y(r)&&s!==_)return X(a,c);if(f.status===P&&0!==a.avail_in)return X(a,c);if(0!==a.avail_in||0!==f.lookahead||s!==n&&f.status!==P){var z=f.strategy===w?dt(f,s):f.strategy===v?_t(f,s):t[f.level].func(f,s);if(z!==U&&z!==V||(f.status=P),z===Q||z===U)return 0===a.avail_out&&(f.last_flush=-1),o;if(z===T&&(s===h?e._tr_align(f):s!==d&&(e._tr_stored_block(f,0,0,!1),s===l&&(Z(f.head),0===f.lookahead&&(f.strstart=0,f.block_start=0,f.insert=0))),$(a),0===a.avail_out))return f.last_flush=-1,o}return s!==_?o:f.wrap<=0?u:(2===f.wrap?(at(f,255&a.adler),at(f,a.adler>>8&255),at(f,a.adler>>16&255),at(f,a.adler>>24&255),at(f,255&a.total_in),at(f,a.total_in>>8&255),at(f,a.total_in>>16&255),at(f,a.total_in>>24&255)):(et(f,a.adler>>>16),et(f,65535&a.adler)),$(a),f.wrap>0&&(f.wrap=-f.wrap),0!==f.pending?o:u)}function kt(t){var a;return t&&t.state?(a=t.state.status)!==F&&a!==G&&a!==J&&a!==L&&a!==M&&a!==O&&a!==P?X(t,g):(t.state=null,a===O?X(t,f):o):g}function zt(t,e){var i,r,n,h,l,_,d,u,f=e.length;if(!t||!t.state)return g;if(2===(h=(i=t.state).wrap)||1===h&&i.status!==F||i.lookahead)return g;for(1===h&&(t.adler=s(t.adler,e,f,0)),i.wrap=0,f>=i.w_size&&(0===h&&(Z(i.head),i.strstart=0,i.block_start=0,i.insert=0),u=new a.Buf8(i.w_size),a.arraySet(u,e,f-i.w_size,i.w_size,0),e=u,f=i.w_size),l=t.avail_in,_=t.next_in,d=t.input,t.avail_in=f,t.next_in=0,t.input=e,rt(i);i.lookahead>=E;){r=i.strstart,n=i.lookahead-(E-1);do{i.ins_h=(i.ins_h<=252?6:o>=248?5:o>=240?4:o>=224?3:o>=192?2:1;function f(e,o){if(o<65537&&(e.subarray&&t||!e.subarray&&n))return String.fromCharCode.apply(null,r.shrinkBuf(e,o));for(var f="",u=0;u>>6,t[u++]=128|63&e):e<65536?(t[u++]=224|e>>>12,t[u++]=128|e>>>6&63,t[u++]=128|63&e):(t[u++]=240|e>>>18,t[u++]=128|e>>>12&63,t[u++]=128|e>>>6&63,t[u++]=128|63&e);return t},exports.buf2binstring=function(r){return f(r,r.length)},exports.binstring2buf=function(n){for(var t=new r.Buf8(n.length),e=0,o=t.length;e4)h[o++]=65533,t+=a-1;else{for(u&=2===a?31:3===a?15:7;a>1&&t1?h[o++]=65533:u<65536?h[o++]=u:(u-=65536,h[o++]=55296|u>>10&1023,h[o++]=56320|1023&u)}return f(h,o)},exports.utf8border=function(r,n){var t;for((n=n||r.length)>r.length&&(n=r.length),t=n-1;t>=0&&128==(192&r[t]);)t--;return t<0?n:0===t?n:t+e[r[t]]>n?t:n}; +},{"./common":166}],171:[function(require,module,exports) { +"use strict";function t(){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}module.exports=t; +},{}],164:[function(require,module,exports) { +"use strict";var t=require("./zlib/deflate"),i=require("./utils/common"),e=require("./utils/strings"),n=require("./zlib/messages"),r=require("./zlib/zstream"),s=Object.prototype.toString,o=0,a=4,u=0,h=1,d=2,l=-1,f=0,p=8;function w(o){if(!(this instanceof w))return new w(o);this.options=i.assign({level:l,method:p,chunkSize:16384,windowBits:15,memLevel:8,strategy:f,to:""},o||{});var a=this.options;a.raw&&a.windowBits>0?a.windowBits=-a.windowBits:a.gzip&&a.windowBits>0&&a.windowBits<16&&(a.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new r,this.strm.avail_out=0;var h=t.deflateInit2(this.strm,a.level,a.method,a.windowBits,a.memLevel,a.strategy);if(h!==u)throw new Error(n[h]);if(a.header&&t.deflateSetHeader(this.strm,a.header),a.dictionary){var d;if(d="string"==typeof a.dictionary?e.string2buf(a.dictionary):"[object ArrayBuffer]"===s.call(a.dictionary)?new Uint8Array(a.dictionary):a.dictionary,(h=t.deflateSetDictionary(this.strm,d))!==u)throw new Error(n[h]);this._dict_set=!0}}function c(t,i){var e=new w(i);if(e.push(t,!0),e.err)throw e.msg||n[e.err];return e.result}function m(t,i){return(i=i||{}).raw=!0,c(t,i)}function g(t,i){return(i=i||{}).gzip=!0,c(t,i)}w.prototype.push=function(n,r){var l,f,p=this.strm,w=this.options.chunkSize;if(this.ended)return!1;f=r===~~r?r:!0===r?a:o,"string"==typeof n?p.input=e.string2buf(n):"[object ArrayBuffer]"===s.call(n)?p.input=new Uint8Array(n):p.input=n,p.next_in=0,p.avail_in=p.input.length;do{if(0===p.avail_out&&(p.output=new i.Buf8(w),p.next_out=0,p.avail_out=w),(l=t.deflate(p,f))!==h&&l!==u)return this.onEnd(l),this.ended=!0,!1;0!==p.avail_out&&(0!==p.avail_in||f!==a&&f!==d)||("string"===this.options.to?this.onData(e.buf2binstring(i.shrinkBuf(p.output,p.next_out))):this.onData(i.shrinkBuf(p.output,p.next_out)))}while((p.avail_in>0||0===p.avail_out)&&l!==h);return f===a?(l=t.deflateEnd(this.strm),this.onEnd(l),this.ended=!0,l===u):f!==d||(this.onEnd(u),p.avail_out=0,!0)},w.prototype.onData=function(t){this.chunks.push(t)},w.prototype.onEnd=function(t){t===u&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},exports.Deflate=w,exports.deflate=c,exports.deflateRaw=m,exports.gzip=g; +},{"./zlib/deflate":168,"./utils/common":166,"./utils/strings":169,"./zlib/messages":170,"./zlib/zstream":171}],180:[function(require,module,exports) { +"use strict";var i=30,e=12;module.exports=function(o,a){var t,d,n,l,s,f,r,b,c,u,v,m,w,h,k,_,x,g,p,z,j,q,y,A,B;t=o.state,d=o.next_in,A=o.input,n=d+(o.avail_in-5),l=o.next_out,B=o.output,s=l-(a-o.avail_out),f=l+(o.avail_out-257),r=t.dmax,b=t.wsize,c=t.whave,u=t.wnext,v=t.window,m=t.hold,w=t.bits,h=t.lencode,k=t.distcode,_=(1<>>=p=g>>>24,w-=p,0===(p=g>>>16&255))B[l++]=65535&g;else{if(!(16&p)){if(0==(64&p)){g=h[(65535&g)+(m&(1<>>=p,w-=p),w<15&&(m+=A[d++]<>>=p=g>>>24,w-=p,!(16&(p=g>>>16&255))){if(0==(64&p)){g=k[(65535&g)+(m&(1<r){o.msg="invalid distance too far back",t.mode=i;break i}if(m>>>=p,w-=p,j>(p=l-s)){if((p=j-p)>c&&t.sane){o.msg="invalid distance too far back",t.mode=i;break i}if(q=0,y=v,0===u){if(q+=b-p,p2;)B[l++]=y[q++],B[l++]=y[q++],B[l++]=y[q++],z-=3;z&&(B[l++]=y[q++],z>1&&(B[l++]=y[q++]))}else{q=l-j;do{B[l++]=B[q++],B[l++]=B[q++],B[l++]=B[q++],z-=3}while(z>2);z&&(B[l++]=B[q++],z>1&&(B[l++]=B[q++]))}break}}break}}while(d>3,m&=(1<<(w-=z<<3))-1,o.next_in=d,o.next_out=l,o.avail_in=d=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return d[v++]=20971520,d[v++]=20971520,h.bits=1,0;for(F=1;F0&&(a===e||1!==G))return-1;for(Q[1]=0,D=1;Di||a===t&&L>o)return 1;for(;;){y=D-J,B[E]j?(z=R[S+B[E]],A=N[O+B[E]]):(z=96,A=0),k=1<>J)+(p-=k)]=y<<24|z<<16|A|0}while(0!==p);for(k=1<>=1;if(0!==k?(M&=k-1,M+=k):M=0,E++,0==--P[D]){if(D===G)break;D=c[m+B[E]]}if(D>H&&(M&x)!==q){for(0===J&&(J=H),g+=F,K=1<<(I=D-J);I+Ji||a===t&&L>o)return 1;d[q=M&x]=H<<24|I<<16|g-v|0}}return 0!==M&&(d[g+M]=D-J<<24|64<<16|0),h.bits=H,0}; +},{"../utils/common":166}],172:[function(require,module,exports) { +"use strict";var e=require("../utils/common"),a=require("./adler32"),t=require("./crc32"),i=require("./inffast"),s=require("./inftrees"),n=0,r=1,o=2,d=4,l=5,f=6,c=0,h=1,k=2,b=-2,m=-3,w=-4,u=-5,g=8,v=1,x=2,p=3,_=4,y=5,z=6,B=7,S=8,q=9,C=10,I=11,R=12,j=13,A=14,D=15,E=16,G=17,H=18,K=19,N=20,F=21,J=22,L=23,M=24,O=25,P=26,Q=27,T=28,U=29,V=30,W=31,X=32,Y=852,Z=592,$=15,ee=$;function ae(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function te(){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 e.Buf16(320),this.work=new e.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function ie(a){var t;return a&&a.state?(t=a.state,a.total_in=a.total_out=t.total=0,a.msg="",t.wrap&&(a.adler=1&t.wrap),t.mode=v,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new e.Buf32(Y),t.distcode=t.distdyn=new e.Buf32(Z),t.sane=1,t.back=-1,c):b}function se(e){var a;return e&&e.state?((a=e.state).wsize=0,a.whave=0,a.wnext=0,ie(e)):b}function ne(e,a){var t,i;return e&&e.state?(i=e.state,a<0?(t=0,a=-a):(t=1+(a>>4),a<48&&(a&=15)),a&&(a<8||a>15)?b:(null!==i.window&&i.wbits!==a&&(i.window=null),i.wrap=t,i.wbits=a,se(e))):b}function re(e,a){var t,i;return e?(i=new te,e.state=i,i.window=null,(t=ne(e,a))!==c&&(e.state=null),t):b}function oe(e){return re(e,ee)}var de,le,fe=!0;function ce(a){if(fe){var t;for(de=new e.Buf32(512),le=new e.Buf32(32),t=0;t<144;)a.lens[t++]=8;for(;t<256;)a.lens[t++]=9;for(;t<280;)a.lens[t++]=7;for(;t<288;)a.lens[t++]=8;for(s(r,a.lens,0,288,de,0,a.work,{bits:9}),t=0;t<32;)a.lens[t++]=5;s(o,a.lens,0,32,le,0,a.work,{bits:5}),fe=!1}a.lencode=de,a.lenbits=9,a.distcode=le,a.distbits=5}function he(a,t,i,s){var n,r=a.state;return null===r.window&&(r.wsize=1<=r.wsize?(e.arraySet(r.window,t,i-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):((n=r.wsize-r.wnext)>s&&(n=s),e.arraySet(r.window,t,i-s,n,r.wnext),(s-=n)?(e.arraySet(r.window,t,i-s,s,0),r.wnext=s,r.whave=r.wsize):(r.wnext+=n,r.wnext===r.wsize&&(r.wnext=0),r.whave>>8&255,$.check=t($.check,qe,2,0),oe=0,de=0,$.mode=x;break}if($.flags=0,$.head&&($.head.done=!1),!(1&$.wrap)||(((255&oe)<<8)+(oe>>8))%31){Y.msg="incorrect header check",$.mode=V;break}if((15&oe)!==g){Y.msg="unknown compression method",$.mode=V;break}if(de-=4,_e=8+(15&(oe>>>=4)),0===$.wbits)$.wbits=_e;else if(_e>$.wbits){Y.msg="invalid window size",$.mode=V;break}$.dmax=1<<_e,Y.adler=$.check=1,$.mode=512&oe?C:R,oe=0,de=0;break;case x:for(;de<16;){if(0===ne)break e;ne--,oe+=ee[ie++]<>8&1),512&$.flags&&(qe[0]=255&oe,qe[1]=oe>>>8&255,$.check=t($.check,qe,2,0)),oe=0,de=0,$.mode=p;case p:for(;de<32;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>8&255,qe[2]=oe>>>16&255,qe[3]=oe>>>24&255,$.check=t($.check,qe,4,0)),oe=0,de=0,$.mode=_;case _:for(;de<16;){if(0===ne)break e;ne--,oe+=ee[ie++]<>8),512&$.flags&&(qe[0]=255&oe,qe[1]=oe>>>8&255,$.check=t($.check,qe,2,0)),oe=0,de=0,$.mode=y;case y:if(1024&$.flags){for(;de<16;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>8&255,$.check=t($.check,qe,2,0)),oe=0,de=0}else $.head&&($.head.extra=null);$.mode=z;case z:if(1024&$.flags&&((ke=$.length)>ne&&(ke=ne),ke&&($.head&&(_e=$.head.extra_len-$.length,$.head.extra||($.head.extra=new Array($.head.extra_len)),e.arraySet($.head.extra,ee,ie,ke,_e)),512&$.flags&&($.check=t($.check,ee,ke,ie)),ne-=ke,ie+=ke,$.length-=ke),$.length))break e;$.length=0,$.mode=B;case B:if(2048&$.flags){if(0===ne)break e;ke=0;do{_e=ee[ie+ke++],$.head&&_e&&$.length<65536&&($.head.name+=String.fromCharCode(_e))}while(_e&&ke>9&1,$.head.done=!0),Y.adler=$.check=0,$.mode=R;break;case C:for(;de<32;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=7&de,de-=7&de,$.mode=Q;break}for(;de<3;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=1)){case 0:$.mode=A;break;case 1:if(ce($),$.mode=N,Z===f){oe>>>=2,de-=2;break e}break;case 2:$.mode=G;break;case 3:Y.msg="invalid block type",$.mode=V}oe>>>=2,de-=2;break;case A:for(oe>>>=7&de,de-=7&de;de<32;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>16^65535)){Y.msg="invalid stored block lengths",$.mode=V;break}if($.length=65535&oe,oe=0,de=0,$.mode=D,Z===f)break e;case D:$.mode=E;case E:if(ke=$.length){if(ke>ne&&(ke=ne),ke>re&&(ke=re),0===ke)break e;e.arraySet(te,ee,ie,ke,se),ne-=ke,ie+=ke,re-=ke,se+=ke,$.length-=ke;break}$.mode=R;break;case G:for(;de<14;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=5,de-=5,$.ndist=1+(31&oe),oe>>>=5,de-=5,$.ncode=4+(15&oe),oe>>>=4,de-=4,$.nlen>286||$.ndist>30){Y.msg="too many length or distance symbols",$.mode=V;break}$.have=0,$.mode=H;case H:for(;$.have<$.ncode;){for(;de<3;){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=3,de-=3}for(;$.have<19;)$.lens[Ce[$.have++]]=0;if($.lencode=$.lendyn,$.lenbits=7,ze={bits:$.lenbits},ye=s(n,$.lens,0,19,$.lencode,0,$.work,ze),$.lenbits=ze.bits,ye){Y.msg="invalid code lengths set",$.mode=V;break}$.have=0,$.mode=K;case K:for(;$.have<$.nlen+$.ndist;){for(;ue=(Se=$.lencode[oe&(1<<$.lenbits)-1])>>>16&255,ge=65535&Se,!((we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=we,de-=we,$.lens[$.have++]=ge;else{if(16===ge){for(Be=we+2;de>>=we,de-=we,0===$.have){Y.msg="invalid bit length repeat",$.mode=V;break}_e=$.lens[$.have-1],ke=3+(3&oe),oe>>>=2,de-=2}else if(17===ge){for(Be=we+3;de>>=we)),oe>>>=3,de-=3}else{for(Be=we+7;de>>=we)),oe>>>=7,de-=7}if($.have+ke>$.nlen+$.ndist){Y.msg="invalid bit length repeat",$.mode=V;break}for(;ke--;)$.lens[$.have++]=_e}}if($.mode===V)break;if(0===$.lens[256]){Y.msg="invalid code -- missing end-of-block",$.mode=V;break}if($.lenbits=9,ze={bits:$.lenbits},ye=s(r,$.lens,0,$.nlen,$.lencode,0,$.work,ze),$.lenbits=ze.bits,ye){Y.msg="invalid literal/lengths set",$.mode=V;break}if($.distbits=6,$.distcode=$.distdyn,ze={bits:$.distbits},ye=s(o,$.lens,$.nlen,$.ndist,$.distcode,0,$.work,ze),$.distbits=ze.bits,ye){Y.msg="invalid distances set",$.mode=V;break}if($.mode=N,Z===f)break e;case N:$.mode=F;case F:if(ne>=6&&re>=258){Y.next_out=se,Y.avail_out=re,Y.next_in=ie,Y.avail_in=ne,$.hold=oe,$.bits=de,i(Y,fe),se=Y.next_out,te=Y.output,re=Y.avail_out,ie=Y.next_in,ee=Y.input,ne=Y.avail_in,oe=$.hold,de=$.bits,$.mode===R&&($.back=-1);break}for($.back=0;ue=(Se=$.lencode[oe&(1<<$.lenbits)-1])>>>16&255,ge=65535&Se,!((we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>ve)])>>>16&255,ge=65535&Se,!(ve+(we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=ve,de-=ve,$.back+=ve}if(oe>>>=we,de-=we,$.back+=we,$.length=ge,0===ue){$.mode=P;break}if(32&ue){$.back=-1,$.mode=R;break}if(64&ue){Y.msg="invalid literal/length code",$.mode=V;break}$.extra=15&ue,$.mode=J;case J:if($.extra){for(Be=$.extra;de>>=$.extra,de-=$.extra,$.back+=$.extra}$.was=$.length,$.mode=L;case L:for(;ue=(Se=$.distcode[oe&(1<<$.distbits)-1])>>>16&255,ge=65535&Se,!((we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>ve)])>>>16&255,ge=65535&Se,!(ve+(we=Se>>>24)<=de);){if(0===ne)break e;ne--,oe+=ee[ie++]<>>=ve,de-=ve,$.back+=ve}if(oe>>>=we,de-=we,$.back+=we,64&ue){Y.msg="invalid distance code",$.mode=V;break}$.offset=ge,$.extra=15&ue,$.mode=M;case M:if($.extra){for(Be=$.extra;de>>=$.extra,de-=$.extra,$.back+=$.extra}if($.offset>$.dmax){Y.msg="invalid distance too far back",$.mode=V;break}$.mode=O;case O:if(0===re)break e;if(ke=fe-re,$.offset>ke){if((ke=$.offset-ke)>$.whave&&$.sane){Y.msg="invalid distance too far back",$.mode=V;break}ke>$.wnext?(ke-=$.wnext,be=$.wsize-ke):be=$.wnext-ke,ke>$.length&&(ke=$.length),me=$.window}else me=te,be=se-$.offset,ke=$.length;ke>re&&(ke=re),re-=ke,$.length-=ke;do{te[se++]=me[be++]}while(--ke);0===$.length&&($.mode=F);break;case P:if(0===re)break e;te[se++]=$.length,re--,$.mode=F;break;case Q:if($.wrap){for(;de<32;){if(0===ne)break e;ne--,oe|=ee[ie++]<=0&&u.windowBits<16&&(u.windowBits=-u.windowBits,0===u.windowBits&&(u.windowBits=-15)),!(u.windowBits>=0&&u.windowBits<16)||n&&n.windowBits||(u.windowBits+=32),u.windowBits>15&&u.windowBits<48&&0==(15&u.windowBits)&&(u.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new e,this.strm.avail_out=0;var h=t.inflateInit2(this.strm,u.windowBits);if(h!==s.Z_OK)throw new Error(r[h]);this.header=new o,t.inflateGetHeader(this.strm,this.header)}function h(t,i){var n=new a(i);if(n.push(t,!0),n.err)throw n.msg||r[n.err];return n.result}function _(t,i){return(i=i||{}).raw=!0,h(t,i)}a.prototype.push=function(r,e){var o,a,h,_,w,l,d=this.strm,f=this.options.chunkSize,p=this.options.dictionary,c=!1;if(this.ended)return!1;a=e===~~e?e:!0===e?s.Z_FINISH:s.Z_NO_FLUSH,"string"==typeof r?d.input=n.binstring2buf(r):"[object ArrayBuffer]"===u.call(r)?d.input=new Uint8Array(r):d.input=r,d.next_in=0,d.avail_in=d.input.length;do{if(0===d.avail_out&&(d.output=new i.Buf8(f),d.next_out=0,d.avail_out=f),(o=t.inflate(d,s.Z_NO_FLUSH))===s.Z_NEED_DICT&&p&&(l="string"==typeof p?n.string2buf(p):"[object ArrayBuffer]"===u.call(p)?new Uint8Array(p):p,o=t.inflateSetDictionary(this.strm,l)),o===s.Z_BUF_ERROR&&!0===c&&(o=s.Z_OK,c=!1),o!==s.Z_STREAM_END&&o!==s.Z_OK)return this.onEnd(o),this.ended=!0,!1;d.next_out&&(0!==d.avail_out&&o!==s.Z_STREAM_END&&(0!==d.avail_in||a!==s.Z_FINISH&&a!==s.Z_SYNC_FLUSH)||("string"===this.options.to?(h=n.utf8border(d.output,d.next_out),_=d.next_out-h,w=n.buf2string(d.output,h),d.next_out=_,d.avail_out=f-_,_&&i.arraySet(d.output,d.output,h,_,0),this.onData(w)):this.onData(i.shrinkBuf(d.output,d.next_out)))),0===d.avail_in&&0===d.avail_out&&(c=!0)}while((d.avail_in>0||0===d.avail_out)&&o!==s.Z_STREAM_END);return o===s.Z_STREAM_END&&(a=s.Z_FINISH),a===s.Z_FINISH?(o=t.inflateEnd(this.strm),this.onEnd(o),this.ended=!0,o===s.Z_OK):a!==s.Z_SYNC_FLUSH||(this.onEnd(s.Z_OK),d.avail_out=0,!0)},a.prototype.onData=function(t){this.chunks.push(t)},a.prototype.onEnd=function(t){t===s.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},exports.Inflate=a,exports.inflate=h,exports.inflateRaw=_,exports.ungzip=h; +},{"./zlib/inflate":172,"./utils/common":166,"./utils/strings":169,"./zlib/constants":167,"./zlib/messages":170,"./zlib/zstream":171,"./zlib/gzheader":173}],161:[function(require,module,exports) { +"use strict";var e=require("./lib/utils/common").assign,i=require("./lib/deflate"),r=require("./lib/inflate"),l=require("./lib/zlib/constants"),s={};e(s,i,r,l),module.exports=s; +},{"./lib/utils/common":166,"./lib/deflate":164,"./lib/inflate":165,"./lib/zlib/constants":167}],153:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MaybeCompressedDataReader=exports.TextProfileDataSource=void 0;var e=require("pako"),r=t(e);function t(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r.default=e,r}var n=function(e,r,t,n){return new(t||(t=Promise))(function(o,i){function s(e){try{u(n.next(e))}catch(e){i(e)}}function a(e){try{u(n.throw(e))}catch(e){i(e)}}function u(e){e.done?o(e.value):new t(function(r){r(e.value)}).then(s,a)}u((n=n.apply(e,r||[])).next())})};class o{constructor(e,r){this.fileName=e,this.contents=r}name(){return n(this,void 0,void 0,function*(){return this.fileName})}readAsArrayBuffer(){return n(this,void 0,void 0,function*(){return new ArrayBuffer(0)})}readAsText(){return n(this,void 0,void 0,function*(){return this.contents})}}exports.TextProfileDataSource=o;class i{constructor(e,t){this.namePromise=e,this.uncompressedData=t.then(e=>n(this,void 0,void 0,function*(){try{return r.inflate(new Uint8Array(e)).buffer}catch(r){return e}}))}name(){return n(this,void 0,void 0,function*(){return yield this.namePromise})}readAsArrayBuffer(){return n(this,void 0,void 0,function*(){return yield this.uncompressedData})}readAsText(){return n(this,void 0,void 0,function*(){const e=yield this.readAsArrayBuffer();let r="";if("undefined"!=typeof TextDecoder){return(new TextDecoder).decode(e)}{const t=new Uint8Array(e);for(let e=0;e{const t=new FileReader;t.addEventListener("loadend",()=>{if(!(t.result instanceof ArrayBuffer))throw new Error("Expected reader.result to be an instance of ArrayBuffer");r(t.result)}),t.readAsArrayBuffer(e)});return new i(Promise.resolve(e.name),r)}static fromArrayBuffer(e,r){return new i(Promise.resolve(e),Promise.resolve(r))}}exports.MaybeCompressedDataReader=i; +},{"pako":161}],147:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.UID=void 0,exports.importFromInstrumentsDeepCopy=a,exports.importFromInstrumentsTrace=w,exports.importRunFromInstrumentsTrace=g,exports.importThreadFromInstrumentsTrace=b,exports.readInstrumentsKeyedArchive=y,exports.decodeUTF8=v;var e=require("../lib/profile"),t=require("../lib/utils"),r=require("../lib/value-formatters"),n=require("./utils"),s=function(e,t,r,n){return new(r||(r=Promise))(function(s,i){function o(e){try{l(n.next(e))}catch(e){i(e)}}function a(e){try{l(n.throw(e))}catch(e){i(e)}}function l(e){e.done?s(e.value):new r(function(t){t(e.value)}).then(o,a)}l((n=n.apply(e,t||[])).next())})};function i(e){const t=e.split("\n").map(e=>e.split("\t")),r=t.shift();if(!r)return[];const n=new Map;for(let e=0;e0;){const e=a.pop();l=Math.max(l,e.endValue),n.leaveFrame(e,l)}return"Bytes Used"in s[0]?n.setValueFormatter(new r.ByteFormatter):("Weight"in s[0]||"Running Time"in s[0])&&n.setValueFormatter(new r.TimeFormatter("milliseconds")),n.build()}function l(e){return s(this,void 0,void 0,function*(){const t={name:e.name,files:new Map,subdirectories:new Map},r=yield new Promise((t,r)=>{e.createReader().readEntries(e=>{t(e)},r)});for(let e of r)if(e.isDirectory){const r=yield l(e);t.subdirectories.set(r.name,r)}else{const r=yield new Promise((t,r)=>{e.file(t,r)});t.files.set(r.name,r)}return t})}function c(e){return n.MaybeCompressedDataReader.fromFile(e).readAsArrayBuffer()}function u(e){return n.MaybeCompressedDataReader.fromFile(e).readAsText()}function f(e,r){const n=(0,t.getOrThrow)(e.subdirectories,"corespace"),s=(0,t.getOrThrow)(n.subdirectories,`run${r}`);return(0,t.getOrThrow)(s.subdirectories,"core")}class h{constructor(e){this.bytePos=0,this.view=new DataView(e)}seek(e){this.bytePos=e}skip(e){this.bytePos+=e}hasMore(){return this.bytePosthis.view.byteLength?0:this.view.getUint8(this.bytePos-1)}readUint32(){return this.bytePos+=4,this.bytePos>this.view.byteLength?0:this.view.getUint32(this.bytePos-4,!0)}readUint48(){return this.bytePos+=6,this.bytePos>this.view.byteLength?0:this.view.getUint32(this.bytePos-6,!0)+this.view.getUint16(this.bytePos-2,!0)*Math.pow(2,32)}readUint64(){return this.bytePos+=8,this.bytePos>this.view.byteLength?0:this.view.getUint32(this.bytePos-8,!0)+this.view.getUint32(this.bytePos-4,!0)*Math.pow(2,32)}}function p(e){return s(this,void 0,void 0,function*(){const r=(0,t.getOrThrow)(e.subdirectories,"stores");for(let e of r.subdirectories.values()){const r=e.files.get("schema.xml");if(!r)continue;const n=yield u(r);if(!/name="time-profile"/.exec(n))continue;const s=new h(yield c((0,t.getOrThrow)(e.files,"bulkstore")));s.readUint32(),s.readUint32(),s.readUint32();const i=s.readUint32(),o=s.readUint32();s.seek(i);const a=[];for(;;){const e=s.readUint48();if(0===e)break;const t=s.readUint32();s.skip(o-6-4-4);const r=s.readUint32();a.push({timestamp:e,threadID:t,backtraceID:r})}return a}throw new Error("Could not find sample list")})}function d(e,r){return s(this,void 0,void 0,function*(){const e=(0,t.getOrThrow)(r.subdirectories,"uniquing"),n=(0,t.getOrThrow)(e.subdirectories,"arrayUniquer"),s=(0,t.getOrThrow)(n.files,"integeruniquer.index"),i=(0,t.getOrThrow)(n.files,"integeruniquer.data"),o=new h(yield c(s)),a=new h(yield c(i));o.seek(32);let l=[];for(;o.hasMore();){const e=o.readUint32()+1048576*o.readUint32();if(0===e)continue;a.seek(e);let t=a.readUint32(),r=[];for(;t--;)r.push(a.readUint64());l.push(r)}return l})}function m(e){return s(this,void 0,void 0,function*(){const r=y(yield c((0,t.getOrThrow)(e.files,"form.template"))),n=r["com.apple.xray.owner.template.version"];let s=1;"com.apple.xray.owner.template"in r&&(s=r["com.apple.xray.owner.template"].get("_selectedRunNumber"));let i=r.$1;"stubInfoByUUID"in r&&(i=Array.from(r.stubInfoByUUID.keys())[0]);const o=r["com.apple.xray.run.data"],a=[];for(let e of o.runNumbers){const r=(0,t.getOrThrow)(o.runData,e),n=(0,t.getOrThrow)(r,"symbolsByPid"),s=new Map;for(let r of n.values()){for(let e of r.symbols){if(!e)continue;const{sourcePath:r,symbolName:n,addressToLine:i}=e;for(let e of i.keys())(0,t.getOrInsert)(s,e,()=>{const s=n||`0x${(0,t.zeroPad)(e.toString(16),16)}`,i={key:`${r}:${s}`,name:s};return r&&(i.file=r),i})}a.push({number:e,addressToFrameMap:s})}}return{version:n,instrument:i,selectedRunNumber:s,runs:a}})}function w(e){return s(this,void 0,void 0,function*(){const t=yield l(e),{version:r,runs:n,instrument:s,selectedRunNumber:i}=yield m(t);if("com.apple.xray.instrument-type.coresampler2"!==s)throw new Error(`The only supported instrument from .trace import is "com.apple.xray.instrument-type.coresampler2". Got ${s}`);console.log("version: ",r),console.log("Importing time profile");const o=[];let a=0;for(let r of n){const{addressToFrameMap:n,number:s}=r,l=yield g({fileName:e.name,tree:t,addressToFrameMap:n,runNumber:s});r.number===i&&(a=o.length+l.indexToView),o.push(...l.profiles)}return{name:e.name,indexToView:a,profiles:o}})}function g(e){return s(this,void 0,void 0,function*(){const{fileName:r,tree:n,addressToFrameMap:s,runNumber:i}=e,o=f(n,i);let a=yield p(o);const l=yield d(a,o),c=new Map;for(let e of a)c.set(e.threadID,(0,t.getOrElse)(c,e.threadID,()=>0)+1);const u=Array.from(c.entries());(0,t.sortBy)(u,e=>-e[1]);const h=u.map(e=>e[0]);return{name:r,indexToView:0,profiles:h.map(e=>b({threadID:e,fileName:r,arrays:l,addressToFrameMap:s,samples:a}))}})}function b(n){let{fileName:s,addressToFrameMap:i,arrays:o,threadID:a,samples:l}=n;const c=new Map;l=l.filter(e=>e.threadID===a);const u=new e.StackListProfileBuilder((0,t.lastOf)(l).timestamp);function f(e,r){const n=i.get(e);if(n)r.push(n);else if(e in o)for(let t of o[e])f(t,r);else{const n={key:e,name:`0x${(0,t.zeroPad)(e.toString(16),16)}`};i.set(e,n),r.push(n)}}u.setName(`${s} - thread ${a}`);let h=null;for(let e of l){const r=(0,t.getOrInsert)(c,e.backtraceID,e=>{const t=[];return f(e,t),t.reverse(),t});if(null===h&&(u.appendSampleWithWeight([],e.timestamp),h=e.timestamp),e.timestamp{switch(e){case"NSTextStorage":case"NSParagraphStyle":case"NSFont":return null;case"PFTSymbolData":{const e=Object.create(null);e.symbolName=t.$0,e.sourcePath=t.$1,e.addressToLine=new Map;for(let r=3;;r+=2){const n=t["$"+r],s=t["$"+(r+1)];if(null==n||null==s)break;e.addressToLine.set(n,s)}return e}case"PFTOwnerData":{const e=Object.create(null);return e.ownerName=t.$0,e.ownerPath=t.$1,e}case"PFTPersistentSymbols":{const e=Object.create(null),r=t.$4;e.threadNames=t.$3,e.symbols=[];for(let n=1;ne)){if(1e5!==e.$version||"NSKeyedArchiver"!==e.$archiver||!S(e.$top)||!U(e.$objects))throw new Error("Invalid keyed archive");"$null"===e.$objects[0]&&(e.$objects[0]=null);for(let r=0;r{if(t instanceof x)return e.$objects[t.index];if(U(t))for(let e=0;ee)){if(S(t)&&t.$class){let n=N(e,t.$class).$classname;switch(n){case"NSDecimalNumberPlaceholder":{let e=t["NS.length"],r=t["NS.exponent"],n=t["NS.mantissa.bo"],s=t["NS.negative"],i=new Uint16Array(new Uint8Array(t["NS.mantissa"]).buffer),o=0;for(let t=0;t>8|(255&e)<<8),o+=e*Math.pow(65536,t)}return o*=Math.pow(10,r),s?-o:o}case"NSData":case"NSMutableData":return t["NS.bytes"]||t["NS.data"];case"NSString":case"NSMutableString":return v(t["NS.bytes"]);case"NSArray":case"NSMutableArray":if("NS.objects"in t)return t["NS.objects"];let e=[];for(;;){let r="NS.object."+e.length;if(!(r in t))break;e.push(t[r])}return e;case"_NSKeyedCoderOldStyleArray":{const e=t["NS.count"];let r=[];for(let n=0;n>4){case 0:return this.parseSingleton(e,r);case 1:return this.parseInteger(e,1<(r.push({stack:t.split(";").map(e=>({key:e,name:e})),duration:parseInt(i,10)}),e)),r}function t(t){const i=r(t),n=i.reduce((e,r)=>e+r.duration,0),o=new e.StackListProfileBuilder(n);if(0===i.length)return null;for(let e of i)o.appendSampleWithWeight(e.stack,e.duration);return o.build()} +},{"../lib/profile":109}],149:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromFirefox=l;var e=require("../lib/profile"),t=require("../lib/utils"),r=require("../lib/value-formatters");function l(l){const n=l.profile,s=1===n.threads.length?n.threads[0]:n.threads.filter(e=>"GeckoMain"===e.name)[0],a=new Map;function o(e){let r=e[0];const l=[];for(;null!=r;){const e=s.stackTable.data[r],[t,n]=e;l.push(n),r=t}return l.reverse(),l.map(e=>{const r=s.frameTable.data[e],l=s.stringTable[r[0]],n=/(.*)\s+\((.*?):?(\d+)?\)$/.exec(l);return n?n[2].startsWith("resource:")||"self-hosted"===n[2]||n[2].startsWith("self-hosted:")?null:(0,t.getOrInsert)(a,l,()=>({key:l,name:n[1],file:n[2],line:n[3]?parseInt(n[3]):void 0})):null}).filter(e=>null!=e)}const i=new e.CallTreeProfileBuilder(l.duration);let u=[];for(let e of s.samples.data){const t=o(e),r=e[1];let l=-1;for(let e=0;el;e--)i.leaveFrame(u[e],r);for(let e=l+1;e0?e[1]:"(anonymous)",file:e[2].length>0?e[2]:"(unknown file)",line:parseInt(e[3],10),col:parseInt(e[4],10)};break}case"CODE":switch(e.kind){case"LoadIC":case"StoreIC":case"KeyedStoreIC":case"KeyedLoadIC":case"LoadGlobalIC":case"Handler":r="(IC) "+r;break;case"BytecodeHandler":r="(bytecode) ~"+r;break;case"Stub":r="(stub) "+r;break;case"Builtin":r="(builtin) "+r;break;case"RegExp":r="(regexp) "+r}break;default:r=`(${e.type}) ${r}`}return{key:r,name:r}}function n(n){const s=new e.StackListProfileBuilder,o=new Map;let c=0;(0,t.sortBy)(n.ticks,e=>e.tm);for(let e of n.ticks){const r=[];for(let s=e.s.length-2;s>=0;s-=2){const c=e.s[s];-1!==c&&(c>n.code.length?r.push({key:c,name:`0x${c.toString(16)}`}):r.push((i=c,(0,t.getOrInsert)(o,i,e=>a(n.code[e],n)))))}s.appendSampleWithWeight(r,e.tm-c),c=e.tm}var i;return s.setValueFormatter(new r.TimeFormatter("microseconds")),s.build()} +},{"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110}],151:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromLinuxPerf=r;var e=require("../lib/profile"),t=require("../lib/utils"),n=require("../lib/value-formatters");function s(e){const t=e.split("\n").filter(e=>!/^\s*#/.exec(e)),n={command:null,processID:null,threadID:null,time:null,eventType:"",stack:[]},s=t.shift();if(!s)return null;const r=/^(\S.+?)\s+(\d+)(?:\/?(\d+))?\s+/.exec(s);if(!r)return null;n.command=r[1],r[3]?(n.processID=parseInt(r[2],10),n.threadID=parseInt(r[3],10)):n.threadID=parseInt(r[2],10);const l=/\s+(\d+\.\d+):\s+/.exec(s);l&&(n.time=parseFloat(l[1]));const i=/(\S+):\s*$/.exec(s);i&&(n.eventType=i[1]);for(let e of t){const t=/^\s*(\w+)\s*(.+) \((\S*)\)/.exec(e);if(!t)continue;let[,s,r,l]=t;r=r.replace(/\+0x[\da-f]+$/,""),n.stack.push({address:`0x${s}`,symbolName:r,file:l})}return n.stack.reverse(),n}function r(r){const l=new Map;let i=null;const o=r.split("\n\n").map(s);for(let s of o){if(null==s)continue;if(null!=i&&i!=s.eventType)continue;if(null==s.time)continue;i=s.eventType;let r=[];s.command&&r.push(s.command),s.processID&&r.push(`pid: ${s.processID}`),s.threadID&&r.push(`tid: ${s.threadID}`);const o=r.join(" ");(0,t.getOrInsert)(l,o,()=>{const t=new e.StackListProfileBuilder;return t.setName(o),t.setValueFormatter(new n.TimeFormatter("seconds")),t}).appendSampleWithTimestamp(s.stack.map(({symbolName:e,file:t})=>({key:`${e} (${t})`,name:"[unknown]"===e?`??? (${t})`:e,file:t})),s.time)}return 0===l.size?null:{name:1===l.size?Array.from(l.keys())[0]:"",indexToView:0,profiles:Array.from((0,t.itMap)(l.values(),e=>e.build()))}} +},{"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110}],152:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromHaskell=l;var e=require("../lib/profile"),r=require("../lib/value-formatters");function t(e,r,l,o,i){if(0===e.ticks&&0===e.entries&&0===e.alloc&&0===e.children.length)return r;let a=r,s=o.get(e.id);l.enterFrame(s,a);for(let r of e.children)a=t(r,a,l,o,i);return a+=i(e),l.leaveFrame(s,a),a}function l(l){const o=new Map;for(let e of l.cost_centres){const r={key:e.id,name:`${e.module}.${e.label}`};e.src_loc.startsWith("<")||(r.file=e.src_loc),o.set(e.id,r)}const i=new e.CallTreeProfileBuilder(l.total_ticks);t(l.profile,0,i,o,e=>e.ticks),i.setValueFormatter(new r.TimeFormatter("milliseconds")),i.setName(`${l.program} time`);const a=new e.CallTreeProfileBuilder(l.total_ticks);return t(l.profile,0,a,o,e=>e.alloc),a.setValueFormatter(new r.ByteFormatter),a.setName(`${l.program} allocation`),{name:l.program,indexToView:0,profiles:[i.build(),a.build()]}} +},{"../lib/profile":109,"../lib/value-formatters":110}],194:[function(require,module,exports) { +"use strict";function n(n,e){for(var r=new Array(arguments.length-1),t=0,l=2,o=!0;l1&&"="===r.charAt(e);)++a;return Math.ceil(3*r.length)/4-a};for(var e=new Array(64),a=new Array(123),t=0;t<64;)a[e[t]=t<26?t+65:t<52?t+71:t<62?t-4:t-59|43]=t++;r.encode=function(r,a,t){for(var n,i=null,o=[],c=0,s=0;a>2],n=(3&h)<<4,s=1;break;case 1:o[c++]=e[n|h>>4],n=(15&h)<<2,s=2;break;case 2:o[c++]=e[n|h>>6],o[c++]=e[63&h],s=0}c>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,o)),c=0)}return s&&(o[c++]=e[n],o[c++]=61,1===s&&(o[c++]=61)),i?(c&&i.push(String.fromCharCode.apply(String,o.slice(0,c))),i.join("")):String.fromCharCode.apply(String,o.slice(0,c))};var n="invalid encoding";r.decode=function(r,e,t){for(var i,o=t,c=0,s=0;s1)break;if(void 0===(h=a[h]))throw Error(n);switch(c){case 0:i=h,c=1;break;case 1:e[t++]=i<<2|(48&h)>>4,i=h,c=2;break;case 2:e[t++]=(15&i)<<4|(60&h)>>2,i=h,c=3;break;case 3:e[t++]=(3&i)<<6|h,c=0}}if(1===c)throw Error(n);return t-o},r.test=function(r){return/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/.test(r)}; +},{}],191:[function(require,module,exports) { +"use strict";function t(){this._listeners={}}module.exports=t,t.prototype.on=function(t,s,e){return(this._listeners[t]||(this._listeners[t]=[])).push({fn:s,ctx:e||this}),this},t.prototype.off=function(t,s){if(void 0===t)this._listeners={};else if(void 0===s)this._listeners[t]=[];else for(var e=this._listeners[t],i=0;i0?0:2147483648,t,r);else if(isNaN(e))n(2143289344,t,r);else if(e>3.4028234663852886e38)n((o<<31|2139095040)>>>0,t,r);else if(e<1.1754943508222875e-38)n((o<<31|Math.round(e/1.401298464324817e-45))>>>0,t,r);else{var u=Math.floor(Math.log(e)/Math.LN2);n((o<<31|u+127<<23|8388607&Math.round(e*Math.pow(2,-u)*8388608))>>>0,t,r)}}function i(n,e,t){var r=n(e,t),o=2*(r>>31)+1,u=r>>>23&255,i=8388607&r;return 255===u?i?NaN:o*(1/0):0===u?1.401298464324817e-45*o*i:o*Math.pow(2,u-150)*(i+8388608)}n.writeFloatLE=u.bind(null,e),n.writeFloatBE=u.bind(null,t),n.readFloatLE=i.bind(null,r),n.readFloatBE=i.bind(null,o)}(),"undefined"!=typeof Float64Array?function(){var e=new Float64Array([-0]),t=new Uint8Array(e.buffer),r=128===t[7];function o(n,r,o){e[0]=n,r[o]=t[0],r[o+1]=t[1],r[o+2]=t[2],r[o+3]=t[3],r[o+4]=t[4],r[o+5]=t[5],r[o+6]=t[6],r[o+7]=t[7]}function u(n,r,o){e[0]=n,r[o]=t[7],r[o+1]=t[6],r[o+2]=t[5],r[o+3]=t[4],r[o+4]=t[3],r[o+5]=t[2],r[o+6]=t[1],r[o+7]=t[0]}function i(n,r){return t[0]=n[r],t[1]=n[r+1],t[2]=n[r+2],t[3]=n[r+3],t[4]=n[r+4],t[5]=n[r+5],t[6]=n[r+6],t[7]=n[r+7],e[0]}function a(n,r){return t[7]=n[r],t[6]=n[r+1],t[5]=n[r+2],t[4]=n[r+3],t[3]=n[r+4],t[2]=n[r+5],t[1]=n[r+6],t[0]=n[r+7],e[0]}n.writeDoubleLE=r?o:u,n.writeDoubleBE=r?u:o,n.readDoubleLE=r?i:a,n.readDoubleBE=r?a:i}():function(){function u(n,e,t,r,o,u){var i=r<0?1:0;if(i&&(r=-r),0===r)n(0,o,u+e),n(1/r>0?0:2147483648,o,u+t);else if(isNaN(r))n(0,o,u+e),n(2146959360,o,u+t);else if(r>1.7976931348623157e308)n(0,o,u+e),n((i<<31|2146435072)>>>0,o,u+t);else{var a;if(r<2.2250738585072014e-308)n((a=r/5e-324)>>>0,o,u+e),n((i<<31|a/4294967296)>>>0,o,u+t);else{var l=Math.floor(Math.log(r)/Math.LN2);1024===l&&(l=1023),n(4503599627370496*(a=r*Math.pow(2,-l))>>>0,o,u+e),n((i<<31|l+1023<<20|1048576*a&1048575)>>>0,o,u+t)}}}function i(n,e,t,r,o){var u=n(r,o+e),i=n(r,o+t),a=2*(i>>31)+1,l=i>>>20&2047,f=4294967296*(1048575&i)+u;return 2047===l?f?NaN:a*(1/0):0===l?5e-324*a*f:a*Math.pow(2,l-1075)*(f+4503599627370496)}n.writeDoubleLE=u.bind(null,e,0,4),n.writeDoubleBE=u.bind(null,t,4,0),n.readDoubleLE=i.bind(null,r,0,4),n.readDoubleBE=i.bind(null,o,4,0)}(),n}function e(n,e,t){e[t]=255&n,e[t+1]=n>>>8&255,e[t+2]=n>>>16&255,e[t+3]=n>>>24}function t(n,e,t){e[t]=n>>>24,e[t+1]=n>>>16&255,e[t+2]=n>>>8&255,e[t+3]=255&n}function r(n,e){return(n[e]|n[e+1]<<8|n[e+2]<<16|n[e+3]<<24)>>>0}function o(n,e){return(n[e]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3])>>>0}module.exports=n(n); +},{}],195:[function(require,module,exports) { +"use strict";function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(e){}return null}module.exports=inquire; +},{}],192:[function(require,module,exports) { +"use strict";var r=exports;r.length=function(r){for(var t=0,n=0,e=0;e191&&e<224?a[i++]=(31&e)<<6|63&r[t++]:e>239&&e<365?(e=((7&e)<<18|(63&r[t++])<<12|(63&r[t++])<<6|63&r[t++])-65536,a[i++]=55296+(e>>10),a[i++]=56320+(1023&e)):a[i++]=(15&e)<<12|(63&r[t++])<<6|63&r[t++],i>8191&&((o||(o=[])).push(String.fromCharCode.apply(String,a)),i=0);return o?(i&&o.push(String.fromCharCode.apply(String,a.slice(0,i))),o.join("")):String.fromCharCode.apply(String,a.slice(0,i))},r.write=function(r,t,n){for(var e,o,a=n,i=0;i>6|192,t[n++]=63&e|128):55296==(64512&e)&&56320==(64512&(o=r.charCodeAt(i+1)))?(e=65536+((1023&e)<<10)+(1023&o),++i,t[n++]=e>>18|240,t[n++]=e>>12&63|128,t[n++]=e>>6&63|128,t[n++]=63&e|128):(t[n++]=e>>12|224,t[n++]=e>>6&63|128,t[n++]=63&e|128);return n-a}; +},{}],196:[function(require,module,exports) { +"use strict";function r(r,n,t){var u=t||8192,e=u>>>1,l=null,c=u;return function(t){if(t<1||t>e)return r(t);c+t>u&&(l=r(u),c=0);var i=n.call(l,c,c+=t);return 7&c&&(c=1+(7|c)),i}}module.exports=r; +},{}],188:[function(require,module,exports) { +"use strict";module.exports=i;var t=require("../util/minimal");function i(t,i){this.lo=t>>>0,this.hi=i>>>0}var o=i.zero=new i(0,0);o.toNumber=function(){return 0},o.zzEncode=o.zzDecode=function(){return this},o.length=function(){return 1};var r=i.zeroHash="\0\0\0\0\0\0\0\0";i.fromNumber=function(t){if(0===t)return o;var r=t<0;r&&(t=-t);var h=t>>>0,n=(t-h)/4294967296>>>0;return r&&(n=~n>>>0,h=~h>>>0,++h>4294967295&&(h=0,++n>4294967295&&(n=0))),new i(h,n)},i.from=function(r){if("number"==typeof r)return i.fromNumber(r);if(t.isString(r)){if(!t.Long)return i.fromNumber(parseInt(r,10));r=t.Long.fromString(r)}return r.low||r.high?new i(r.low>>>0,r.high>>>0):o},i.prototype.toNumber=function(t){if(!t&&this.hi>>>31){var i=1+~this.lo>>>0,o=~this.hi>>>0;return i||(o=o+1>>>0),-(i+4294967296*o)}return this.lo+4294967296*this.hi},i.prototype.toLong=function(i){return t.Long?new t.Long(0|this.lo,0|this.hi,Boolean(i)):{low:0|this.lo,high:0|this.hi,unsigned:Boolean(i)}};var h=String.prototype.charCodeAt;i.fromHash=function(t){return t===r?o:new i((h.call(t,0)|h.call(t,1)<<8|h.call(t,2)<<16|h.call(t,3)<<24)>>>0,(h.call(t,4)|h.call(t,5)<<8|h.call(t,6)<<16|h.call(t,7)<<24)>>>0)},i.prototype.toHash=function(){return String.fromCharCode(255&this.lo,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,255&this.hi,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},i.prototype.zzEncode=function(){var t=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^t)>>>0,this.lo=(this.lo<<1^t)>>>0,this},i.prototype.zzDecode=function(){var t=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^t)>>>0,this.hi=(this.hi>>>1^t)>>>0,this},i.prototype.length=function(){var t=this.lo,i=(this.lo>>>28|this.hi<<4)>>>0,o=this.hi>>>24;return 0===o?0===i?t<16384?t<128?1:2:t<2097152?3:4:i<16384?i<128?5:6:i<2097152?7:8:o<128?9:10}; +},{"../util/minimal":187}],199:[function(require,module,exports) { +"use strict";exports.byteLength=u,exports.toByteArray=i,exports.fromByteArray=d;for(var r=[],t=[],e="undefined"!=typeof Uint8Array?Uint8Array:Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,a=n.length;o0)throw new Error("Invalid string. Length must be a multiple of 4");var e=r.indexOf("=");return-1===e&&(e=t),[e,e===t?0:4-e%4]}function u(r){var t=h(r),e=t[0],n=t[1];return 3*(e+n)/4-n}function c(r,t,e){return 3*(t+e)/4-e}function i(r){for(var n,o=h(r),a=o[0],u=o[1],i=new e(c(r,a,u)),f=0,A=u>0?a-4:a,d=0;d>16&255,i[f++]=n>>8&255,i[f++]=255&n;return 2===u&&(n=t[r.charCodeAt(d)]<<2|t[r.charCodeAt(d+1)]>>4,i[f++]=255&n),1===u&&(n=t[r.charCodeAt(d)]<<10|t[r.charCodeAt(d+1)]<<4|t[r.charCodeAt(d+2)]>>2,i[f++]=n>>8&255,i[f++]=255&n),i}function f(t){return r[t>>18&63]+r[t>>12&63]+r[t>>6&63]+r[63&t]}function A(r,t,e){for(var n,o=[],a=t;au?u:h+16383));return 1===o?(e=t[n-1],a.push(r[e>>2]+r[e<<4&63]+"==")):2===o&&(e=(t[n-2]<<8)+t[n-1],a.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"=")),a.join("")}t["-".charCodeAt(0)]=62,t["_".charCodeAt(0)]=63; +},{}],200:[function(require,module,exports) { +exports.read=function(a,o,t,r,h){var M,p,w=8*h-r-1,f=(1<>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:1/0*(s?-1:1);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=o<0||0===o&&1/o<0?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),(o+=p+N>=1?n/f:n*Math.pow(2,1-N))*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l}; +},{}],198:[function(require,module,exports) { +var r={}.toString;module.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}; +},{}],189:[function(require,module,exports) { + +var global = arguments[3]; +var t=arguments[3],r=require("base64-js"),e=require("ieee754"),n=require("isarray");function i(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(t){return!1}}function o(){return f.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function u(t,r){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|t}function d(t){return+t!=t&&(t=0),f.alloc(+t)}function v(t,r){if(f.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var e=t.length;if(0===e)return 0;for(var n=!1;;)switch(r){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return $(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return K(t).length;default:if(n)return $(t).length;r=(""+r).toLowerCase(),n=!0}}function E(t,r,e){var n=!1;if((void 0===r||r<0)&&(r=0),r>this.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(r>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return x(this,r,e);case"utf8":case"utf-8":return Y(this,r,e);case"ascii":return L(this,r,e);case"latin1":case"binary":return D(this,r,e);case"base64":return S(this,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return C(this,r,e);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function b(t,r,e){var n=t[r];t[r]=t[e],t[e]=n}function R(t,r,e,n,i){if(0===t.length)return-1;if("string"==typeof e?(n=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=i?0:t.length-1),e<0&&(e=t.length+e),e>=t.length){if(i)return-1;e=t.length-1}else if(e<0){if(!i)return-1;e=0}if("string"==typeof r&&(r=f.from(r,n)),f.isBuffer(r))return 0===r.length?-1:_(t,r,e,n,i);if("number"==typeof r)return r&=255,f.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,r,e):Uint8Array.prototype.lastIndexOf.call(t,r,e):_(t,[r],e,n,i);throw new TypeError("val must be string, number or Buffer")}function _(t,r,e,n,i){var o,u=1,f=t.length,s=r.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||r.length<2)return-1;u=2,f/=2,s/=2,e/=2}function h(t,r){return 1===u?t[r]:t.readUInt16BE(r*u)}if(i){var a=-1;for(o=e;of&&(e=f-s),o=e;o>=0;o--){for(var c=!0,l=0;li&&(n=i):n=i;var o=r.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var u=0;u239?4:h>223?3:h>191?2:1;if(i+c<=e)switch(c){case 1:h<128&&(a=h);break;case 2:128==(192&(o=t[i+1]))&&(s=(31&h)<<6|63&o)>127&&(a=s);break;case 3:o=t[i+1],u=t[i+2],128==(192&o)&&128==(192&u)&&(s=(15&h)<<12|(63&o)<<6|63&u)>2047&&(s<55296||s>57343)&&(a=s);break;case 4:o=t[i+1],u=t[i+2],f=t[i+3],128==(192&o)&&128==(192&u)&&128==(192&f)&&(s=(15&h)<<18|(63&o)<<12|(63&u)<<6|63&f)>65535&&s<1114112&&(a=s)}null===a?(a=65533,c=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|1023&a),n.push(a),i+=c}return O(n)}exports.Buffer=f,exports.SlowBuffer=d,exports.INSPECT_MAX_BYTES=50,f.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:i(),exports.kMaxLength=o(),f.poolSize=8192,f._augment=function(t){return t.__proto__=f.prototype,t},f.from=function(t,r,e){return s(null,t,r,e)},f.TYPED_ARRAY_SUPPORT&&(f.prototype.__proto__=Uint8Array.prototype,f.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&f[Symbol.species]===f&&Object.defineProperty(f,Symbol.species,{value:null,configurable:!0})),f.alloc=function(t,r,e){return a(null,t,r,e)},f.allocUnsafe=function(t){return c(null,t)},f.allocUnsafeSlow=function(t){return c(null,t)},f.isBuffer=function(t){return!(null==t||!t._isBuffer)},f.compare=function(t,r){if(!f.isBuffer(t)||!f.isBuffer(r))throw new TypeError("Arguments must be Buffers");if(t===r)return 0;for(var e=t.length,n=r.length,i=0,o=Math.min(e,n);i0&&(t=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(t+=" ... ")),""},f.prototype.compare=function(t,r,e,n,i){if(!f.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===r&&(r=0),void 0===e&&(e=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),r<0||e>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&r>=e)return 0;if(n>=i)return-1;if(r>=e)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(n>>>=0),u=(e>>>=0)-(r>>>=0),s=Math.min(o,u),h=this.slice(n,i),a=t.slice(r,e),c=0;ci)&&(e=i),t.length>0&&(e<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return A(this,t,r,e);case"utf8":case"utf-8":return m(this,t,r,e);case"ascii":return P(this,t,r,e);case"latin1":case"binary":return T(this,t,r,e);case"base64":return B(this,t,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return U(this,t,r,e);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},f.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var I=4096;function O(t){var r=t.length;if(r<=I)return String.fromCharCode.apply(String,t);for(var e="",n=0;nn)&&(e=n);for(var i="",o=r;oe)throw new RangeError("Trying to access beyond buffer length")}function k(t,r,e,n,i,o){if(!f.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(r>i||rt.length)throw new RangeError("Index out of range")}function N(t,r,e,n){r<0&&(r=65535+r+1);for(var i=0,o=Math.min(t.length-e,2);i>>8*(n?i:1-i)}function z(t,r,e,n){r<0&&(r=4294967295+r+1);for(var i=0,o=Math.min(t.length-e,4);i>>8*(n?i:3-i)&255}function F(t,r,e,n,i,o){if(e+n>t.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function j(t,r,n,i,o){return o||F(t,r,n,4,3.4028234663852886e38,-3.4028234663852886e38),e.write(t,r,n,i,23,4),n+4}function q(t,r,n,i,o){return o||F(t,r,n,8,1.7976931348623157e308,-1.7976931348623157e308),e.write(t,r,n,i,52,8),n+8}f.prototype.slice=function(t,r){var e,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(r=void 0===r?n:~~r)<0?(r+=n)<0&&(r=0):r>n&&(r=n),r0&&(i*=256);)n+=this[t+--r]*i;return n},f.prototype.readUInt8=function(t,r){return r||M(t,1,this.length),this[t]},f.prototype.readUInt16LE=function(t,r){return r||M(t,2,this.length),this[t]|this[t+1]<<8},f.prototype.readUInt16BE=function(t,r){return r||M(t,2,this.length),this[t]<<8|this[t+1]},f.prototype.readUInt32LE=function(t,r){return r||M(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},f.prototype.readUInt32BE=function(t,r){return r||M(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},f.prototype.readIntLE=function(t,r,e){t|=0,r|=0,e||M(t,r,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*r)),n},f.prototype.readIntBE=function(t,r,e){t|=0,r|=0,e||M(t,r,this.length);for(var n=r,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*r)),o},f.prototype.readInt8=function(t,r){return r||M(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},f.prototype.readInt16LE=function(t,r){r||M(t,2,this.length);var e=this[t]|this[t+1]<<8;return 32768&e?4294901760|e:e},f.prototype.readInt16BE=function(t,r){r||M(t,2,this.length);var e=this[t+1]|this[t]<<8;return 32768&e?4294901760|e:e},f.prototype.readInt32LE=function(t,r){return r||M(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},f.prototype.readInt32BE=function(t,r){return r||M(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},f.prototype.readFloatLE=function(t,r){return r||M(t,4,this.length),e.read(this,t,!0,23,4)},f.prototype.readFloatBE=function(t,r){return r||M(t,4,this.length),e.read(this,t,!1,23,4)},f.prototype.readDoubleLE=function(t,r){return r||M(t,8,this.length),e.read(this,t,!0,52,8)},f.prototype.readDoubleBE=function(t,r){return r||M(t,8,this.length),e.read(this,t,!1,52,8)},f.prototype.writeUIntLE=function(t,r,e,n){(t=+t,r|=0,e|=0,n)||k(this,t,r,e,Math.pow(2,8*e)-1,0);var i=1,o=0;for(this[r]=255&t;++o=0&&(o*=256);)this[r+i]=t/o&255;return r+e},f.prototype.writeUInt8=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,1,255,0),f.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[r]=255&t,r+1},f.prototype.writeUInt16LE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,2,65535,0),f.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):N(this,t,r,!0),r+2},f.prototype.writeUInt16BE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,2,65535,0),f.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):N(this,t,r,!1),r+2},f.prototype.writeUInt32LE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=255&t):z(this,t,r,!0),r+4},f.prototype.writeUInt32BE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):z(this,t,r,!1),r+4},f.prototype.writeIntLE=function(t,r,e,n){if(t=+t,r|=0,!n){var i=Math.pow(2,8*e-1);k(this,t,r,e,i-1,-i)}var o=0,u=1,f=0;for(this[r]=255&t;++o>0)-f&255;return r+e},f.prototype.writeIntBE=function(t,r,e,n){if(t=+t,r|=0,!n){var i=Math.pow(2,8*e-1);k(this,t,r,e,i-1,-i)}var o=e-1,u=1,f=0;for(this[r+o]=255&t;--o>=0&&(u*=256);)t<0&&0===f&&0!==this[r+o+1]&&(f=1),this[r+o]=(t/u>>0)-f&255;return r+e},f.prototype.writeInt8=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,1,127,-128),f.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[r]=255&t,r+1},f.prototype.writeInt16LE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):N(this,t,r,!0),r+2},f.prototype.writeInt16BE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):N(this,t,r,!1),r+2},f.prototype.writeInt32LE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,4,2147483647,-2147483648),f.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24):z(this,t,r,!0),r+4},f.prototype.writeInt32BE=function(t,r,e){return t=+t,r|=0,e||k(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),f.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):z(this,t,r,!1),r+4},f.prototype.writeFloatLE=function(t,r,e){return j(this,t,r,!0,e)},f.prototype.writeFloatBE=function(t,r,e){return j(this,t,r,!1,e)},f.prototype.writeDoubleLE=function(t,r,e){return q(this,t,r,!0,e)},f.prototype.writeDoubleBE=function(t,r,e){return q(this,t,r,!1,e)},f.prototype.copy=function(t,r,e,n){if(e||(e=0),n||0===n||(n=this.length),r>=t.length&&(r=t.length),r||(r=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-r=0;--i)t[i+r]=this[i+e];else if(o<1e3||!f.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,e=void 0===e?this.length:e>>>0,t||(t=0),"number"==typeof t)for(o=r;o55295&&e<57344){if(!i){if(e>56319){(r-=3)>-1&&o.push(239,191,189);continue}if(u+1===n){(r-=3)>-1&&o.push(239,191,189);continue}i=e;continue}if(e<56320){(r-=3)>-1&&o.push(239,191,189),i=e;continue}e=65536+(i-55296<<10|e-56320)}else i&&(r-=3)>-1&&o.push(239,191,189);if(i=null,e<128){if((r-=1)<0)break;o.push(e)}else if(e<2048){if((r-=2)<0)break;o.push(e>>6|192,63&e|128)}else if(e<65536){if((r-=3)<0)break;o.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((r-=4)<0)break;o.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return o}function G(t){for(var r=[],e=0;e>8,i=e%256,o.push(i),o.push(n);return o}function K(t){return r.toByteArray(X(t))}function Q(t,r,e,n){for(var i=0;i=r.length||i>=t.length);++i)r[i+e]=t[i];return i}function W(t){return t!=t} +},{"base64-js":199,"ieee754":200,"isarray":198,"buffer":189}],187:[function(require,module,exports) { +var global = arguments[3]; +var Buffer = require("buffer").Buffer; +var e=arguments[3],r=require("buffer").Buffer,t=exports;function n(e,r,t){for(var n=Object.keys(r),o=0;o0)},t.Buffer=function(){try{var e=t.inquire("buffer").Buffer;return e.prototype.utf8Write?e:null}catch(e){return null}}(),t._Buffer_from=null,t._Buffer_allocUnsafe=null,t.newBuffer=function(e){return"number"==typeof e?t.Buffer?t._Buffer_allocUnsafe(e):new t.Array(e):t.Buffer?t._Buffer_from(e):"undefined"==typeof Uint8Array?e:new Uint8Array(e)},t.Array="undefined"!=typeof Uint8Array?Uint8Array:Array,t.Long=t.global.dcodeIO&&t.global.dcodeIO.Long||t.global.Long||t.inquire("long"),t.key2Re=/^true|false|0|1$/,t.key32Re=/^-?(?:0|[1-9][0-9]*)$/,t.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,t.longToHash=function(e){return e?t.LongBits.from(e).toHash():t.LongBits.zeroHash},t.longFromHash=function(e,r){var n=t.LongBits.fromHash(e);return t.Long?t.Long.fromBits(n.lo,n.hi,r):n.toNumber(Boolean(r))},t.merge=n,t.lcFirst=function(e){return e.charAt(0).toLowerCase()+e.substring(1)},t.newError=o,t.ProtocolError=o("ProtocolError"),t.oneOfGetter=function(e){for(var r={},t=0;t-1;--t)if(1===r[e[t]]&&void 0!==this[e[t]]&&null!==this[e[t]])return e[t]}},t.oneOfSetter=function(e){return function(r){for(var t=0;t127;)i[n++]=127&t|128,t>>>=7;i[n]=t}function a(t,i){this.len=t,this.next=void 0,this.val=i}function f(t,i,n){for(;t.hi;)i[n++]=127&t.lo|128,t.lo=(t.lo>>>7|t.hi<<25)>>>0,t.hi>>>=7;for(;t.lo>127;)i[n++]=127&t.lo|128,t.lo=t.lo>>>7;i[n++]=t.lo}function c(t,i,n){i[n]=255&t,i[n+1]=t>>>8&255,i[n+2]=t>>>16&255,i[n+3]=t>>>24}u.create=i.Buffer?function(){return(u.create=function(){return new t})()}:function(){return new u},u.alloc=function(t){return new i.Array(t)},i.Array!==Array&&(u.alloc=i.pool(u.alloc,i.Array.prototype.subarray)),u.prototype._push=function(t,i,n){return this.tail=this.tail.next=new r(t,i,n),this.len+=i,this},a.prototype=Object.create(r.prototype),a.prototype.fn=p,u.prototype.uint32=function(t){return this.len+=(this.tail=this.tail.next=new a((t>>>=0)<128?1:t<16384?2:t<2097152?3:t<268435456?4:5,t)).len,this},u.prototype.int32=function(t){return t<0?this._push(f,10,n.fromNumber(t)):this.uint32(t)},u.prototype.sint32=function(t){return this.uint32((t<<1^t>>31)>>>0)},u.prototype.uint64=function(t){var i=n.from(t);return this._push(f,i.length(),i)},u.prototype.int64=u.prototype.uint64,u.prototype.sint64=function(t){var i=n.from(t).zzEncode();return this._push(f,i.length(),i)},u.prototype.bool=function(t){return this._push(l,1,t?1:0)},u.prototype.fixed32=function(t){return this._push(c,4,t>>>0)},u.prototype.sfixed32=u.prototype.fixed32,u.prototype.fixed64=function(t){var i=n.from(t);return this._push(c,4,i.lo)._push(c,4,i.hi)},u.prototype.sfixed64=u.prototype.fixed64,u.prototype.float=function(t){return this._push(i.float.writeFloatLE,4,t)},u.prototype.double=function(t){return this._push(i.float.writeDoubleLE,8,t)};var y=i.Array.prototype.set?function(t,i,n){i.set(t,n)}:function(t,i,n){for(var e=0;e>>0;if(!n)return this._push(l,1,0);if(i.isString(t)){var o=u.alloc(n=e.length(t));e.decode(t,o,0),t=o}return this.uint32(n)._push(y,n,t)},u.prototype.string=function(t){var i=o.length(t);return i?this.uint32(i)._push(o.write,i,t):this._push(l,1,0)},u.prototype.fork=function(){return this.states=new h(this),this.head=this.tail=new r(s,0,0),this.len=0,this},u.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new r(s,0,0),this.len=0),this},u.prototype.ldelim=function(){var t=this.head,i=this.tail,n=this.len;return this.reset().uint32(n),n&&(this.tail.next=t.next,this.tail=i,this.len+=n),this},u.prototype.finish=function(){for(var t=this.head.next,i=this.constructor.alloc(this.len),n=0;t;)t.fn(t.val,i,n),n+=t.len,t=t.next;return i},u._configure=function(i){t=i}; +},{"./util/minimal":187}],183:[function(require,module,exports) { + +"use strict";module.exports=n;var t=require("./writer");(n.prototype=Object.create(t.prototype)).constructor=n;var e=require("./util/minimal"),r=e.Buffer;function n(){t.call(this)}n.alloc=function(t){return(n.alloc=e._Buffer_allocUnsafe)(t)};var i=r&&r.prototype instanceof Uint8Array&&"set"===r.prototype.set.name?function(t,e,r){e.set(t,r)}:function(t,e,r){if(t.copy)t.copy(e,r,0,t.length);else for(var n=0;n>>0;return this.uint32(r),r&&this._push(i,r,t),this},n.prototype.string=function(t){var e=r.byteLength(t);return this.uint32(e),e&&this._push(o,e,t),this}; +},{"./writer":181,"./util/minimal":187}],182:[function(require,module,exports) { +"use strict";module.exports=h;var t,i=require("./util/minimal"),s=i.LongBits,r=i.utf8;function o(t,i){return RangeError("index out of range: "+t.pos+" + "+(i||1)+" > "+t.len)}function h(t){this.buf=t,this.pos=0,this.len=t.length}var n="undefined"!=typeof Uint8Array?function(t){if(t instanceof Uint8Array||Array.isArray(t))return new h(t);throw Error("illegal buffer")}:function(t){if(Array.isArray(t))return new h(t);throw Error("illegal buffer")};function e(){var t=new s(0,0),i=0;if(!(this.len-this.pos>4)){for(;i<3;++i){if(this.pos>=this.len)throw o(this);if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*i)>>>0,this.buf[this.pos++]<128)return t}return t.lo=(t.lo|(127&this.buf[this.pos++])<<7*i)>>>0,t}for(;i<4;++i)if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*i)>>>0,this.buf[this.pos++]<128)return t;if(t.lo=(t.lo|(127&this.buf[this.pos])<<28)>>>0,t.hi=(t.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return t;if(i=0,this.len-this.pos>4){for(;i<5;++i)if(t.hi=(t.hi|(127&this.buf[this.pos])<<7*i+3)>>>0,this.buf[this.pos++]<128)return t}else for(;i<5;++i){if(this.pos>=this.len)throw o(this);if(t.hi=(t.hi|(127&this.buf[this.pos])<<7*i+3)>>>0,this.buf[this.pos++]<128)return t}throw Error("invalid varint encoding")}function u(t,i){return(t[i-4]|t[i-3]<<8|t[i-2]<<16|t[i-1]<<24)>>>0}function f(){if(this.pos+8>this.len)throw o(this,8);return new s(u(this.buf,this.pos+=4),u(this.buf,this.pos+=4))}h.create=i.Buffer?function(s){return(h.create=function(s){return i.Buffer.isBuffer(s)?new t(s):n(s)})(s)}:n,h.prototype._slice=i.Array.prototype.subarray||i.Array.prototype.slice,h.prototype.uint32=function(){var t=4294967295;return function(){if(t=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128)return t;if(t=(t|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128)return t;if(t=(t|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128)return t;if(t=(t|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128)return t;if(t=(t|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128)return t;if((this.pos+=5)>this.len)throw this.pos=this.len,o(this,10);return t}}(),h.prototype.int32=function(){return 0|this.uint32()},h.prototype.sint32=function(){var t=this.uint32();return t>>>1^-(1&t)|0},h.prototype.bool=function(){return 0!==this.uint32()},h.prototype.fixed32=function(){if(this.pos+4>this.len)throw o(this,4);return u(this.buf,this.pos+=4)},h.prototype.sfixed32=function(){if(this.pos+4>this.len)throw o(this,4);return 0|u(this.buf,this.pos+=4)},h.prototype.float=function(){if(this.pos+4>this.len)throw o(this,4);var t=i.float.readFloatLE(this.buf,this.pos);return this.pos+=4,t},h.prototype.double=function(){if(this.pos+8>this.len)throw o(this,4);var t=i.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,t},h.prototype.bytes=function(){var t=this.uint32(),i=this.pos,s=this.pos+t;if(s>this.len)throw o(this,t);return this.pos+=t,Array.isArray(this.buf)?this.buf.slice(i,s):i===s?new this.buf.constructor(0):this._slice.call(this.buf,i,s)},h.prototype.string=function(){var t=this.bytes();return r.read(t,0,t.length)},h.prototype.skip=function(t){if("number"==typeof t){if(this.pos+t>this.len)throw o(this,t);this.pos+=t}else do{if(this.pos>=this.len)throw o(this)}while(128&this.buf[this.pos++]);return this},h.prototype.skipType=function(t){switch(t){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;4!=(t=7&this.uint32());)this.skipType(t);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+t+" at offset "+this.pos)}return this},h._configure=function(s){t=s;var r=i.Long?"toLong":"toNumber";i.merge(h.prototype,{int64:function(){return e.call(this)[r](!1)},uint64:function(){return e.call(this)[r](!0)},sint64:function(){return e.call(this).zzDecode()[r](!1)},fixed64:function(){return f.call(this)[r](!0)},sfixed64:function(){return f.call(this)[r](!1)}})}; +},{"./util/minimal":187}],184:[function(require,module,exports) { +"use strict";module.exports=r;var t=require("./reader");(r.prototype=Object.create(t.prototype)).constructor=r;var e=require("./util/minimal");function r(e){t.call(this,e)}e.Buffer&&(r.prototype._slice=e.Buffer.prototype.slice),r.prototype.string=function(){var t=this.uint32();return this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+t,this.len))}; +},{"./reader":182,"./util/minimal":187}],197:[function(require,module,exports) { +"use strict";module.exports=t;var e=require("../util/minimal");function t(t,r,i){if("function"!=typeof t)throw TypeError("rpcImpl must be a function");e.EventEmitter.call(this),this.rpcImpl=t,this.requestDelimited=Boolean(r),this.responseDelimited=Boolean(i)}(t.prototype=Object.create(e.EventEmitter.prototype)).constructor=t,t.prototype.rpcCall=function t(r,i,n,o,l){if(!o)throw TypeError("request must be specified");var u=this;if(!l)return e.asPromise(t,u,r,i,n,o);if(u.rpcImpl)try{return u.rpcImpl(r,i[u.requestDelimited?"encodeDelimited":"encode"](o).finish(),function(e,t){if(e)return u.emit("error",e,r),l(e);if(null!==t){if(!(t instanceof n))try{t=n[u.responseDelimited?"decodeDelimited":"decode"](t)}catch(e){return u.emit("error",e,r),l(e)}return u.emit("data",t,r),l(null,t)}u.end(!0)})}catch(e){return u.emit("error",e,r),void setTimeout(function(){l(e)},0)}else setTimeout(function(){l(Error("already ended"))},0)},t.prototype.end=function(e){return this.rpcImpl&&(e||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}; +},{"../util/minimal":187}],185:[function(require,module,exports) { +"use strict";var e=exports;e.Service=require("./rpc/service"); +},{"./rpc/service":197}],186:[function(require,module,exports) { +"use strict";module.exports={}; +},{}],175:[function(require,module,exports) { +"use strict";var r=exports;function e(){r.Reader._configure(r.BufferReader),r.util._configure()}r.build="minimal",r.Writer=require("./writer"),r.BufferWriter=require("./writer_buffer"),r.Reader=require("./reader"),r.BufferReader=require("./reader_buffer"),r.util=require("./util/minimal"),r.rpc=require("./rpc"),r.roots=require("./roots"),r.configure=e,r.Writer._configure(r.BufferWriter),e(); +},{"./writer":181,"./writer_buffer":183,"./reader":182,"./reader_buffer":184,"./util/minimal":187,"./rpc":185,"./roots":186}],174:[function(require,module,exports) { +"use strict";module.exports=require("./src/index-minimal"); +},{"./src/index-minimal":175}],162:[function(require,module,exports) { +"use strict";var e=require("protobufjs/minimal"),n=e.Reader,t=e.Writer,o=e.util,r=e.roots.default||(e.roots.default={});r.perftools=function(){var i,l={};return l.profiles=((i={}).Profile=function(){function i(e){if(this.sampleType=[],this.sample=[],this.mapping=[],this.location=[],this.function=[],this.stringTable=[],this.comment=[],e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.sampleType&&i.sampleType.length||(i.sampleType=[]),i.sampleType.push(r.perftools.profiles.ValueType.decode(e,e.uint32()));break;case 2:i.sample&&i.sample.length||(i.sample=[]),i.sample.push(r.perftools.profiles.Sample.decode(e,e.uint32()));break;case 3:i.mapping&&i.mapping.length||(i.mapping=[]),i.mapping.push(r.perftools.profiles.Mapping.decode(e,e.uint32()));break;case 4:i.location&&i.location.length||(i.location=[]),i.location.push(r.perftools.profiles.Location.decode(e,e.uint32()));break;case 5:i.function&&i.function.length||(i.function=[]),i.function.push(r.perftools.profiles.Function.decode(e,e.uint32()));break;case 6:i.stringTable&&i.stringTable.length||(i.stringTable=[]),i.stringTable.push(e.string());break;case 7:i.dropFrames=e.int64();break;case 8:i.keepFrames=e.int64();break;case 9:i.timeNanos=e.int64();break;case 10:i.durationNanos=e.int64();break;case 11:i.periodType=r.perftools.profiles.ValueType.decode(e,e.uint32());break;case 12:i.period=e.int64();break;case 13:if(i.comment&&i.comment.length||(i.comment=[]),2==(7&l))for(var s=e.uint32()+e.pos;e.pos>>0,e.dropFrames.high>>>0).toNumber())),null!=e.keepFrames&&(o.Long?(n.keepFrames=o.Long.fromValue(e.keepFrames)).unsigned=!1:"string"==typeof e.keepFrames?n.keepFrames=parseInt(e.keepFrames,10):"number"==typeof e.keepFrames?n.keepFrames=e.keepFrames:"object"==typeof e.keepFrames&&(n.keepFrames=new o.LongBits(e.keepFrames.low>>>0,e.keepFrames.high>>>0).toNumber())),null!=e.timeNanos&&(o.Long?(n.timeNanos=o.Long.fromValue(e.timeNanos)).unsigned=!1:"string"==typeof e.timeNanos?n.timeNanos=parseInt(e.timeNanos,10):"number"==typeof e.timeNanos?n.timeNanos=e.timeNanos:"object"==typeof e.timeNanos&&(n.timeNanos=new o.LongBits(e.timeNanos.low>>>0,e.timeNanos.high>>>0).toNumber())),null!=e.durationNanos&&(o.Long?(n.durationNanos=o.Long.fromValue(e.durationNanos)).unsigned=!1:"string"==typeof e.durationNanos?n.durationNanos=parseInt(e.durationNanos,10):"number"==typeof e.durationNanos?n.durationNanos=e.durationNanos:"object"==typeof e.durationNanos&&(n.durationNanos=new o.LongBits(e.durationNanos.low>>>0,e.durationNanos.high>>>0).toNumber())),null!=e.periodType){if("object"!=typeof e.periodType)throw TypeError(".perftools.profiles.Profile.periodType: object expected");n.periodType=r.perftools.profiles.ValueType.fromObject(e.periodType)}if(null!=e.period&&(o.Long?(n.period=o.Long.fromValue(e.period)).unsigned=!1:"string"==typeof e.period?n.period=parseInt(e.period,10):"number"==typeof e.period?n.period=e.period:"object"==typeof e.period&&(n.period=new o.LongBits(e.period.low>>>0,e.period.high>>>0).toNumber())),e.comment){if(!Array.isArray(e.comment))throw TypeError(".perftools.profiles.Profile.comment: array expected");for(n.comment=[],t=0;t>>0,e.comment[t].high>>>0).toNumber())}return null!=e.defaultSampleType&&(o.Long?(n.defaultSampleType=o.Long.fromValue(e.defaultSampleType)).unsigned=!1:"string"==typeof e.defaultSampleType?n.defaultSampleType=parseInt(e.defaultSampleType,10):"number"==typeof e.defaultSampleType?n.defaultSampleType=e.defaultSampleType:"object"==typeof e.defaultSampleType&&(n.defaultSampleType=new o.LongBits(e.defaultSampleType.low>>>0,e.defaultSampleType.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if((n.arrays||n.defaults)&&(t.sampleType=[],t.sample=[],t.mapping=[],t.location=[],t.function=[],t.stringTable=[],t.comment=[]),n.defaults){if(o.Long){var i=new o.Long(0,0,!1);t.dropFrames=n.longs===String?i.toString():n.longs===Number?i.toNumber():i}else t.dropFrames=n.longs===String?"0":0;o.Long?(i=new o.Long(0,0,!1),t.keepFrames=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.keepFrames=n.longs===String?"0":0,o.Long?(i=new o.Long(0,0,!1),t.timeNanos=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.timeNanos=n.longs===String?"0":0,o.Long?(i=new o.Long(0,0,!1),t.durationNanos=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.durationNanos=n.longs===String?"0":0,t.periodType=null,o.Long?(i=new o.Long(0,0,!1),t.period=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.period=n.longs===String?"0":0,o.Long?(i=new o.Long(0,0,!1),t.defaultSampleType=n.longs===String?i.toString():n.longs===Number?i.toNumber():i):t.defaultSampleType=n.longs===String?"0":0}if(e.sampleType&&e.sampleType.length){t.sampleType=[];for(var l=0;l>>0,e.dropFrames.high>>>0).toNumber():e.dropFrames),null!=e.keepFrames&&e.hasOwnProperty("keepFrames")&&("number"==typeof e.keepFrames?t.keepFrames=n.longs===String?String(e.keepFrames):e.keepFrames:t.keepFrames=n.longs===String?o.Long.prototype.toString.call(e.keepFrames):n.longs===Number?new o.LongBits(e.keepFrames.low>>>0,e.keepFrames.high>>>0).toNumber():e.keepFrames),null!=e.timeNanos&&e.hasOwnProperty("timeNanos")&&("number"==typeof e.timeNanos?t.timeNanos=n.longs===String?String(e.timeNanos):e.timeNanos:t.timeNanos=n.longs===String?o.Long.prototype.toString.call(e.timeNanos):n.longs===Number?new o.LongBits(e.timeNanos.low>>>0,e.timeNanos.high>>>0).toNumber():e.timeNanos),null!=e.durationNanos&&e.hasOwnProperty("durationNanos")&&("number"==typeof e.durationNanos?t.durationNanos=n.longs===String?String(e.durationNanos):e.durationNanos:t.durationNanos=n.longs===String?o.Long.prototype.toString.call(e.durationNanos):n.longs===Number?new o.LongBits(e.durationNanos.low>>>0,e.durationNanos.high>>>0).toNumber():e.durationNanos),null!=e.periodType&&e.hasOwnProperty("periodType")&&(t.periodType=r.perftools.profiles.ValueType.toObject(e.periodType,n)),null!=e.period&&e.hasOwnProperty("period")&&("number"==typeof e.period?t.period=n.longs===String?String(e.period):e.period:t.period=n.longs===String?o.Long.prototype.toString.call(e.period):n.longs===Number?new o.LongBits(e.period.low>>>0,e.period.high>>>0).toNumber():e.period),e.comment&&e.comment.length)for(t.comment=[],l=0;l>>0,e.comment[l].high>>>0).toNumber():e.comment[l];return null!=e.defaultSampleType&&e.hasOwnProperty("defaultSampleType")&&("number"==typeof e.defaultSampleType?t.defaultSampleType=n.longs===String?String(e.defaultSampleType):e.defaultSampleType:t.defaultSampleType=n.longs===String?o.Long.prototype.toString.call(e.defaultSampleType):n.longs===Number?new o.LongBits(e.defaultSampleType.low>>>0,e.defaultSampleType.high>>>0).toNumber():e.defaultSampleType),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.ValueType=function(){function i(e){if(e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.type=e.int64();break;case 2:i.unit=e.int64();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.type&&e.hasOwnProperty("type")&&!(o.isInteger(e.type)||e.type&&o.isInteger(e.type.low)&&o.isInteger(e.type.high))?"type: integer|Long expected":null!=e.unit&&e.hasOwnProperty("unit")&&!(o.isInteger(e.unit)||e.unit&&o.isInteger(e.unit.low)&&o.isInteger(e.unit.high))?"unit: integer|Long expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.ValueType)return e;var n=new r.perftools.profiles.ValueType;return null!=e.type&&(o.Long?(n.type=o.Long.fromValue(e.type)).unsigned=!1:"string"==typeof e.type?n.type=parseInt(e.type,10):"number"==typeof e.type?n.type=e.type:"object"==typeof e.type&&(n.type=new o.LongBits(e.type.low>>>0,e.type.high>>>0).toNumber())),null!=e.unit&&(o.Long?(n.unit=o.Long.fromValue(e.unit)).unsigned=!1:"string"==typeof e.unit?n.unit=parseInt(e.unit,10):"number"==typeof e.unit?n.unit=e.unit:"object"==typeof e.unit&&(n.unit=new o.LongBits(e.unit.low>>>0,e.unit.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!1);t.type=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.type=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!1),t.unit=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.unit=n.longs===String?"0":0}return null!=e.type&&e.hasOwnProperty("type")&&("number"==typeof e.type?t.type=n.longs===String?String(e.type):e.type:t.type=n.longs===String?o.Long.prototype.toString.call(e.type):n.longs===Number?new o.LongBits(e.type.low>>>0,e.type.high>>>0).toNumber():e.type),null!=e.unit&&e.hasOwnProperty("unit")&&("number"==typeof e.unit?t.unit=n.longs===String?String(e.unit):e.unit:t.unit=n.longs===String?o.Long.prototype.toString.call(e.unit):n.longs===Number?new o.LongBits(e.unit.low>>>0,e.unit.high>>>0).toNumber():e.unit),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.Sample=function(){function i(e){if(this.locationId=[],this.value=[],this.label=[],e)for(var n=Object.keys(e),t=0;t>>3){case 1:if(i.locationId&&i.locationId.length||(i.locationId=[]),2==(7&l))for(var s=e.uint32()+e.pos;e.pos>>0,e.locationId[t].high>>>0).toNumber(!0))}if(e.value){if(!Array.isArray(e.value))throw TypeError(".perftools.profiles.Sample.value: array expected");for(n.value=[],t=0;t>>0,e.value[t].high>>>0).toNumber())}if(e.label){if(!Array.isArray(e.label))throw TypeError(".perftools.profiles.Sample.label: array expected");for(n.label=[],t=0;t>>0,e.locationId[i].high>>>0).toNumber(!0):e.locationId[i]}if(e.value&&e.value.length)for(t.value=[],i=0;i>>0,e.value[i].high>>>0).toNumber():e.value[i];if(e.label&&e.label.length)for(t.label=[],i=0;i>>3){case 1:i.key=e.int64();break;case 2:i.str=e.int64();break;case 3:i.num=e.int64();break;case 4:i.numUnit=e.int64();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.key&&e.hasOwnProperty("key")&&!(o.isInteger(e.key)||e.key&&o.isInteger(e.key.low)&&o.isInteger(e.key.high))?"key: integer|Long expected":null!=e.str&&e.hasOwnProperty("str")&&!(o.isInteger(e.str)||e.str&&o.isInteger(e.str.low)&&o.isInteger(e.str.high))?"str: integer|Long expected":null!=e.num&&e.hasOwnProperty("num")&&!(o.isInteger(e.num)||e.num&&o.isInteger(e.num.low)&&o.isInteger(e.num.high))?"num: integer|Long expected":null!=e.numUnit&&e.hasOwnProperty("numUnit")&&!(o.isInteger(e.numUnit)||e.numUnit&&o.isInteger(e.numUnit.low)&&o.isInteger(e.numUnit.high))?"numUnit: integer|Long expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.Label)return e;var n=new r.perftools.profiles.Label;return null!=e.key&&(o.Long?(n.key=o.Long.fromValue(e.key)).unsigned=!1:"string"==typeof e.key?n.key=parseInt(e.key,10):"number"==typeof e.key?n.key=e.key:"object"==typeof e.key&&(n.key=new o.LongBits(e.key.low>>>0,e.key.high>>>0).toNumber())),null!=e.str&&(o.Long?(n.str=o.Long.fromValue(e.str)).unsigned=!1:"string"==typeof e.str?n.str=parseInt(e.str,10):"number"==typeof e.str?n.str=e.str:"object"==typeof e.str&&(n.str=new o.LongBits(e.str.low>>>0,e.str.high>>>0).toNumber())),null!=e.num&&(o.Long?(n.num=o.Long.fromValue(e.num)).unsigned=!1:"string"==typeof e.num?n.num=parseInt(e.num,10):"number"==typeof e.num?n.num=e.num:"object"==typeof e.num&&(n.num=new o.LongBits(e.num.low>>>0,e.num.high>>>0).toNumber())),null!=e.numUnit&&(o.Long?(n.numUnit=o.Long.fromValue(e.numUnit)).unsigned=!1:"string"==typeof e.numUnit?n.numUnit=parseInt(e.numUnit,10):"number"==typeof e.numUnit?n.numUnit=e.numUnit:"object"==typeof e.numUnit&&(n.numUnit=new o.LongBits(e.numUnit.low>>>0,e.numUnit.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!1);t.key=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.key=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!1),t.str=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.str=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.num=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.num=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.numUnit=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.numUnit=n.longs===String?"0":0}return null!=e.key&&e.hasOwnProperty("key")&&("number"==typeof e.key?t.key=n.longs===String?String(e.key):e.key:t.key=n.longs===String?o.Long.prototype.toString.call(e.key):n.longs===Number?new o.LongBits(e.key.low>>>0,e.key.high>>>0).toNumber():e.key),null!=e.str&&e.hasOwnProperty("str")&&("number"==typeof e.str?t.str=n.longs===String?String(e.str):e.str:t.str=n.longs===String?o.Long.prototype.toString.call(e.str):n.longs===Number?new o.LongBits(e.str.low>>>0,e.str.high>>>0).toNumber():e.str),null!=e.num&&e.hasOwnProperty("num")&&("number"==typeof e.num?t.num=n.longs===String?String(e.num):e.num:t.num=n.longs===String?o.Long.prototype.toString.call(e.num):n.longs===Number?new o.LongBits(e.num.low>>>0,e.num.high>>>0).toNumber():e.num),null!=e.numUnit&&e.hasOwnProperty("numUnit")&&("number"==typeof e.numUnit?t.numUnit=n.longs===String?String(e.numUnit):e.numUnit:t.numUnit=n.longs===String?o.Long.prototype.toString.call(e.numUnit):n.longs===Number?new o.LongBits(e.numUnit.low>>>0,e.numUnit.high>>>0).toNumber():e.numUnit),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.Mapping=function(){function i(e){if(e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.id=e.uint64();break;case 2:i.memoryStart=e.uint64();break;case 3:i.memoryLimit=e.uint64();break;case 4:i.fileOffset=e.uint64();break;case 5:i.filename=e.int64();break;case 6:i.buildId=e.int64();break;case 7:i.hasFunctions=e.bool();break;case 8:i.hasFilenames=e.bool();break;case 9:i.hasLineNumbers=e.bool();break;case 10:i.hasInlineFrames=e.bool();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.id&&e.hasOwnProperty("id")&&!(o.isInteger(e.id)||e.id&&o.isInteger(e.id.low)&&o.isInteger(e.id.high))?"id: integer|Long expected":null!=e.memoryStart&&e.hasOwnProperty("memoryStart")&&!(o.isInteger(e.memoryStart)||e.memoryStart&&o.isInteger(e.memoryStart.low)&&o.isInteger(e.memoryStart.high))?"memoryStart: integer|Long expected":null!=e.memoryLimit&&e.hasOwnProperty("memoryLimit")&&!(o.isInteger(e.memoryLimit)||e.memoryLimit&&o.isInteger(e.memoryLimit.low)&&o.isInteger(e.memoryLimit.high))?"memoryLimit: integer|Long expected":null!=e.fileOffset&&e.hasOwnProperty("fileOffset")&&!(o.isInteger(e.fileOffset)||e.fileOffset&&o.isInteger(e.fileOffset.low)&&o.isInteger(e.fileOffset.high))?"fileOffset: integer|Long expected":null!=e.filename&&e.hasOwnProperty("filename")&&!(o.isInteger(e.filename)||e.filename&&o.isInteger(e.filename.low)&&o.isInteger(e.filename.high))?"filename: integer|Long expected":null!=e.buildId&&e.hasOwnProperty("buildId")&&!(o.isInteger(e.buildId)||e.buildId&&o.isInteger(e.buildId.low)&&o.isInteger(e.buildId.high))?"buildId: integer|Long expected":null!=e.hasFunctions&&e.hasOwnProperty("hasFunctions")&&"boolean"!=typeof e.hasFunctions?"hasFunctions: boolean expected":null!=e.hasFilenames&&e.hasOwnProperty("hasFilenames")&&"boolean"!=typeof e.hasFilenames?"hasFilenames: boolean expected":null!=e.hasLineNumbers&&e.hasOwnProperty("hasLineNumbers")&&"boolean"!=typeof e.hasLineNumbers?"hasLineNumbers: boolean expected":null!=e.hasInlineFrames&&e.hasOwnProperty("hasInlineFrames")&&"boolean"!=typeof e.hasInlineFrames?"hasInlineFrames: boolean expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.Mapping)return e;var n=new r.perftools.profiles.Mapping;return null!=e.id&&(o.Long?(n.id=o.Long.fromValue(e.id)).unsigned=!0:"string"==typeof e.id?n.id=parseInt(e.id,10):"number"==typeof e.id?n.id=e.id:"object"==typeof e.id&&(n.id=new o.LongBits(e.id.low>>>0,e.id.high>>>0).toNumber(!0))),null!=e.memoryStart&&(o.Long?(n.memoryStart=o.Long.fromValue(e.memoryStart)).unsigned=!0:"string"==typeof e.memoryStart?n.memoryStart=parseInt(e.memoryStart,10):"number"==typeof e.memoryStart?n.memoryStart=e.memoryStart:"object"==typeof e.memoryStart&&(n.memoryStart=new o.LongBits(e.memoryStart.low>>>0,e.memoryStart.high>>>0).toNumber(!0))),null!=e.memoryLimit&&(o.Long?(n.memoryLimit=o.Long.fromValue(e.memoryLimit)).unsigned=!0:"string"==typeof e.memoryLimit?n.memoryLimit=parseInt(e.memoryLimit,10):"number"==typeof e.memoryLimit?n.memoryLimit=e.memoryLimit:"object"==typeof e.memoryLimit&&(n.memoryLimit=new o.LongBits(e.memoryLimit.low>>>0,e.memoryLimit.high>>>0).toNumber(!0))),null!=e.fileOffset&&(o.Long?(n.fileOffset=o.Long.fromValue(e.fileOffset)).unsigned=!0:"string"==typeof e.fileOffset?n.fileOffset=parseInt(e.fileOffset,10):"number"==typeof e.fileOffset?n.fileOffset=e.fileOffset:"object"==typeof e.fileOffset&&(n.fileOffset=new o.LongBits(e.fileOffset.low>>>0,e.fileOffset.high>>>0).toNumber(!0))),null!=e.filename&&(o.Long?(n.filename=o.Long.fromValue(e.filename)).unsigned=!1:"string"==typeof e.filename?n.filename=parseInt(e.filename,10):"number"==typeof e.filename?n.filename=e.filename:"object"==typeof e.filename&&(n.filename=new o.LongBits(e.filename.low>>>0,e.filename.high>>>0).toNumber())),null!=e.buildId&&(o.Long?(n.buildId=o.Long.fromValue(e.buildId)).unsigned=!1:"string"==typeof e.buildId?n.buildId=parseInt(e.buildId,10):"number"==typeof e.buildId?n.buildId=e.buildId:"object"==typeof e.buildId&&(n.buildId=new o.LongBits(e.buildId.low>>>0,e.buildId.high>>>0).toNumber())),null!=e.hasFunctions&&(n.hasFunctions=Boolean(e.hasFunctions)),null!=e.hasFilenames&&(n.hasFilenames=Boolean(e.hasFilenames)),null!=e.hasLineNumbers&&(n.hasLineNumbers=Boolean(e.hasLineNumbers)),null!=e.hasInlineFrames&&(n.hasInlineFrames=Boolean(e.hasInlineFrames)),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!0);t.id=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.id=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!0),t.memoryStart=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.memoryStart=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!0),t.memoryLimit=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.memoryLimit=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!0),t.fileOffset=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.fileOffset=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.filename=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.filename=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.buildId=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.buildId=n.longs===String?"0":0,t.hasFunctions=!1,t.hasFilenames=!1,t.hasLineNumbers=!1,t.hasInlineFrames=!1}return null!=e.id&&e.hasOwnProperty("id")&&("number"==typeof e.id?t.id=n.longs===String?String(e.id):e.id:t.id=n.longs===String?o.Long.prototype.toString.call(e.id):n.longs===Number?new o.LongBits(e.id.low>>>0,e.id.high>>>0).toNumber(!0):e.id),null!=e.memoryStart&&e.hasOwnProperty("memoryStart")&&("number"==typeof e.memoryStart?t.memoryStart=n.longs===String?String(e.memoryStart):e.memoryStart:t.memoryStart=n.longs===String?o.Long.prototype.toString.call(e.memoryStart):n.longs===Number?new o.LongBits(e.memoryStart.low>>>0,e.memoryStart.high>>>0).toNumber(!0):e.memoryStart),null!=e.memoryLimit&&e.hasOwnProperty("memoryLimit")&&("number"==typeof e.memoryLimit?t.memoryLimit=n.longs===String?String(e.memoryLimit):e.memoryLimit:t.memoryLimit=n.longs===String?o.Long.prototype.toString.call(e.memoryLimit):n.longs===Number?new o.LongBits(e.memoryLimit.low>>>0,e.memoryLimit.high>>>0).toNumber(!0):e.memoryLimit),null!=e.fileOffset&&e.hasOwnProperty("fileOffset")&&("number"==typeof e.fileOffset?t.fileOffset=n.longs===String?String(e.fileOffset):e.fileOffset:t.fileOffset=n.longs===String?o.Long.prototype.toString.call(e.fileOffset):n.longs===Number?new o.LongBits(e.fileOffset.low>>>0,e.fileOffset.high>>>0).toNumber(!0):e.fileOffset),null!=e.filename&&e.hasOwnProperty("filename")&&("number"==typeof e.filename?t.filename=n.longs===String?String(e.filename):e.filename:t.filename=n.longs===String?o.Long.prototype.toString.call(e.filename):n.longs===Number?new o.LongBits(e.filename.low>>>0,e.filename.high>>>0).toNumber():e.filename),null!=e.buildId&&e.hasOwnProperty("buildId")&&("number"==typeof e.buildId?t.buildId=n.longs===String?String(e.buildId):e.buildId:t.buildId=n.longs===String?o.Long.prototype.toString.call(e.buildId):n.longs===Number?new o.LongBits(e.buildId.low>>>0,e.buildId.high>>>0).toNumber():e.buildId),null!=e.hasFunctions&&e.hasOwnProperty("hasFunctions")&&(t.hasFunctions=e.hasFunctions),null!=e.hasFilenames&&e.hasOwnProperty("hasFilenames")&&(t.hasFilenames=e.hasFilenames),null!=e.hasLineNumbers&&e.hasOwnProperty("hasLineNumbers")&&(t.hasLineNumbers=e.hasLineNumbers),null!=e.hasInlineFrames&&e.hasOwnProperty("hasInlineFrames")&&(t.hasInlineFrames=e.hasInlineFrames),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.Location=function(){function i(e){if(this.line=[],e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.id=e.uint64();break;case 2:i.mappingId=e.uint64();break;case 3:i.address=e.uint64();break;case 4:i.line&&i.line.length||(i.line=[]),i.line.push(r.perftools.profiles.Line.decode(e,e.uint32()));break;case 5:i.isFolded=e.bool();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){if("object"!=typeof e||null===e)return"object expected";if(null!=e.id&&e.hasOwnProperty("id")&&!(o.isInteger(e.id)||e.id&&o.isInteger(e.id.low)&&o.isInteger(e.id.high)))return"id: integer|Long expected";if(null!=e.mappingId&&e.hasOwnProperty("mappingId")&&!(o.isInteger(e.mappingId)||e.mappingId&&o.isInteger(e.mappingId.low)&&o.isInteger(e.mappingId.high)))return"mappingId: integer|Long expected";if(null!=e.address&&e.hasOwnProperty("address")&&!(o.isInteger(e.address)||e.address&&o.isInteger(e.address.low)&&o.isInteger(e.address.high)))return"address: integer|Long expected";if(null!=e.line&&e.hasOwnProperty("line")){if(!Array.isArray(e.line))return"line: array expected";for(var n=0;n>>0,e.id.high>>>0).toNumber(!0))),null!=e.mappingId&&(o.Long?(n.mappingId=o.Long.fromValue(e.mappingId)).unsigned=!0:"string"==typeof e.mappingId?n.mappingId=parseInt(e.mappingId,10):"number"==typeof e.mappingId?n.mappingId=e.mappingId:"object"==typeof e.mappingId&&(n.mappingId=new o.LongBits(e.mappingId.low>>>0,e.mappingId.high>>>0).toNumber(!0))),null!=e.address&&(o.Long?(n.address=o.Long.fromValue(e.address)).unsigned=!0:"string"==typeof e.address?n.address=parseInt(e.address,10):"number"==typeof e.address?n.address=e.address:"object"==typeof e.address&&(n.address=new o.LongBits(e.address.low>>>0,e.address.high>>>0).toNumber(!0))),e.line){if(!Array.isArray(e.line))throw TypeError(".perftools.profiles.Location.line: array expected");n.line=[];for(var t=0;t>>0,e.id.high>>>0).toNumber(!0):e.id),null!=e.mappingId&&e.hasOwnProperty("mappingId")&&("number"==typeof e.mappingId?t.mappingId=n.longs===String?String(e.mappingId):e.mappingId:t.mappingId=n.longs===String?o.Long.prototype.toString.call(e.mappingId):n.longs===Number?new o.LongBits(e.mappingId.low>>>0,e.mappingId.high>>>0).toNumber(!0):e.mappingId),null!=e.address&&e.hasOwnProperty("address")&&("number"==typeof e.address?t.address=n.longs===String?String(e.address):e.address:t.address=n.longs===String?o.Long.prototype.toString.call(e.address):n.longs===Number?new o.LongBits(e.address.low>>>0,e.address.high>>>0).toNumber(!0):e.address),e.line&&e.line.length){t.line=[];for(var l=0;l>>3){case 1:i.functionId=e.uint64();break;case 2:i.line=e.int64();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.functionId&&e.hasOwnProperty("functionId")&&!(o.isInteger(e.functionId)||e.functionId&&o.isInteger(e.functionId.low)&&o.isInteger(e.functionId.high))?"functionId: integer|Long expected":null!=e.line&&e.hasOwnProperty("line")&&!(o.isInteger(e.line)||e.line&&o.isInteger(e.line.low)&&o.isInteger(e.line.high))?"line: integer|Long expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.Line)return e;var n=new r.perftools.profiles.Line;return null!=e.functionId&&(o.Long?(n.functionId=o.Long.fromValue(e.functionId)).unsigned=!0:"string"==typeof e.functionId?n.functionId=parseInt(e.functionId,10):"number"==typeof e.functionId?n.functionId=e.functionId:"object"==typeof e.functionId&&(n.functionId=new o.LongBits(e.functionId.low>>>0,e.functionId.high>>>0).toNumber(!0))),null!=e.line&&(o.Long?(n.line=o.Long.fromValue(e.line)).unsigned=!1:"string"==typeof e.line?n.line=parseInt(e.line,10):"number"==typeof e.line?n.line=e.line:"object"==typeof e.line&&(n.line=new o.LongBits(e.line.low>>>0,e.line.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!0);t.functionId=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.functionId=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!1),t.line=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.line=n.longs===String?"0":0}return null!=e.functionId&&e.hasOwnProperty("functionId")&&("number"==typeof e.functionId?t.functionId=n.longs===String?String(e.functionId):e.functionId:t.functionId=n.longs===String?o.Long.prototype.toString.call(e.functionId):n.longs===Number?new o.LongBits(e.functionId.low>>>0,e.functionId.high>>>0).toNumber(!0):e.functionId),null!=e.line&&e.hasOwnProperty("line")&&("number"==typeof e.line?t.line=n.longs===String?String(e.line):e.line:t.line=n.longs===String?o.Long.prototype.toString.call(e.line):n.longs===Number?new o.LongBits(e.line.low>>>0,e.line.high>>>0).toNumber():e.line),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i.Function=function(){function i(e){if(e)for(var n=Object.keys(e),t=0;t>>3){case 1:i.id=e.uint64();break;case 2:i.name=e.int64();break;case 3:i.systemName=e.int64();break;case 4:i.filename=e.int64();break;case 5:i.startLine=e.int64();break;default:e.skipType(7&l)}}return i},i.decodeDelimited=function(e){return e instanceof n||(e=new n(e)),this.decode(e,e.uint32())},i.verify=function(e){return"object"!=typeof e||null===e?"object expected":null!=e.id&&e.hasOwnProperty("id")&&!(o.isInteger(e.id)||e.id&&o.isInteger(e.id.low)&&o.isInteger(e.id.high))?"id: integer|Long expected":null!=e.name&&e.hasOwnProperty("name")&&!(o.isInteger(e.name)||e.name&&o.isInteger(e.name.low)&&o.isInteger(e.name.high))?"name: integer|Long expected":null!=e.systemName&&e.hasOwnProperty("systemName")&&!(o.isInteger(e.systemName)||e.systemName&&o.isInteger(e.systemName.low)&&o.isInteger(e.systemName.high))?"systemName: integer|Long expected":null!=e.filename&&e.hasOwnProperty("filename")&&!(o.isInteger(e.filename)||e.filename&&o.isInteger(e.filename.low)&&o.isInteger(e.filename.high))?"filename: integer|Long expected":null!=e.startLine&&e.hasOwnProperty("startLine")&&!(o.isInteger(e.startLine)||e.startLine&&o.isInteger(e.startLine.low)&&o.isInteger(e.startLine.high))?"startLine: integer|Long expected":null},i.fromObject=function(e){if(e instanceof r.perftools.profiles.Function)return e;var n=new r.perftools.profiles.Function;return null!=e.id&&(o.Long?(n.id=o.Long.fromValue(e.id)).unsigned=!0:"string"==typeof e.id?n.id=parseInt(e.id,10):"number"==typeof e.id?n.id=e.id:"object"==typeof e.id&&(n.id=new o.LongBits(e.id.low>>>0,e.id.high>>>0).toNumber(!0))),null!=e.name&&(o.Long?(n.name=o.Long.fromValue(e.name)).unsigned=!1:"string"==typeof e.name?n.name=parseInt(e.name,10):"number"==typeof e.name?n.name=e.name:"object"==typeof e.name&&(n.name=new o.LongBits(e.name.low>>>0,e.name.high>>>0).toNumber())),null!=e.systemName&&(o.Long?(n.systemName=o.Long.fromValue(e.systemName)).unsigned=!1:"string"==typeof e.systemName?n.systemName=parseInt(e.systemName,10):"number"==typeof e.systemName?n.systemName=e.systemName:"object"==typeof e.systemName&&(n.systemName=new o.LongBits(e.systemName.low>>>0,e.systemName.high>>>0).toNumber())),null!=e.filename&&(o.Long?(n.filename=o.Long.fromValue(e.filename)).unsigned=!1:"string"==typeof e.filename?n.filename=parseInt(e.filename,10):"number"==typeof e.filename?n.filename=e.filename:"object"==typeof e.filename&&(n.filename=new o.LongBits(e.filename.low>>>0,e.filename.high>>>0).toNumber())),null!=e.startLine&&(o.Long?(n.startLine=o.Long.fromValue(e.startLine)).unsigned=!1:"string"==typeof e.startLine?n.startLine=parseInt(e.startLine,10):"number"==typeof e.startLine?n.startLine=e.startLine:"object"==typeof e.startLine&&(n.startLine=new o.LongBits(e.startLine.low>>>0,e.startLine.high>>>0).toNumber())),n},i.toObject=function(e,n){n||(n={});var t={};if(n.defaults){if(o.Long){var r=new o.Long(0,0,!0);t.id=n.longs===String?r.toString():n.longs===Number?r.toNumber():r}else t.id=n.longs===String?"0":0;o.Long?(r=new o.Long(0,0,!1),t.name=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.name=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.systemName=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.systemName=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.filename=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.filename=n.longs===String?"0":0,o.Long?(r=new o.Long(0,0,!1),t.startLine=n.longs===String?r.toString():n.longs===Number?r.toNumber():r):t.startLine=n.longs===String?"0":0}return null!=e.id&&e.hasOwnProperty("id")&&("number"==typeof e.id?t.id=n.longs===String?String(e.id):e.id:t.id=n.longs===String?o.Long.prototype.toString.call(e.id):n.longs===Number?new o.LongBits(e.id.low>>>0,e.id.high>>>0).toNumber(!0):e.id),null!=e.name&&e.hasOwnProperty("name")&&("number"==typeof e.name?t.name=n.longs===String?String(e.name):e.name:t.name=n.longs===String?o.Long.prototype.toString.call(e.name):n.longs===Number?new o.LongBits(e.name.low>>>0,e.name.high>>>0).toNumber():e.name),null!=e.systemName&&e.hasOwnProperty("systemName")&&("number"==typeof e.systemName?t.systemName=n.longs===String?String(e.systemName):e.systemName:t.systemName=n.longs===String?o.Long.prototype.toString.call(e.systemName):n.longs===Number?new o.LongBits(e.systemName.low>>>0,e.systemName.high>>>0).toNumber():e.systemName),null!=e.filename&&e.hasOwnProperty("filename")&&("number"==typeof e.filename?t.filename=n.longs===String?String(e.filename):e.filename:t.filename=n.longs===String?o.Long.prototype.toString.call(e.filename):n.longs===Number?new o.LongBits(e.filename.low>>>0,e.filename.high>>>0).toNumber():e.filename),null!=e.startLine&&e.hasOwnProperty("startLine")&&("number"==typeof e.startLine?t.startLine=n.longs===String?String(e.startLine):e.startLine:t.startLine=n.longs===String?o.Long.prototype.toString.call(e.startLine):n.longs===Number?new o.LongBits(e.startLine.low>>>0,e.startLine.high>>>0).toNumber():e.startLine),t},i.prototype.toJSON=function(){return this.constructor.toObject(this,e.util.toJSONOptions)},i}(),i),l}(),module.exports=r; +},{"protobufjs/minimal":174}],154:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importAsPprofProfile=r;var e=require("./profile.proto.js"),n=require("../lib/profile"),t=require("../lib/utils"),l=require("../lib/value-formatters");function r(r){if(0===r.byteLength)return null;let o;try{o=e.perftools.profiles.Profile.decode(new Uint8Array(r))}catch(e){return null}function i(e){return"number"==typeof e?e:e.low}function u(e){return o.stringTable[i(e)]||null}const s=new Map;function a(e){const{name:n,filename:t,startLine:l}=e,r=null!=n&&u(n)||"(unknown)",o=null!=t?u(t):null,i=null!=l?+l:null,s={key:`${r}:${o}:${i}`,name:r};return null!=o&&(s.file=o),null!=i&&(s.line=i),s}for(let e of o.function)if(e.id){const n=a(e);null!=n&&s.set(i(e.id),n)}function c(e){const{line:n}=e;if(null==n)return null;const l=(0,t.lastOf)(n);return null==l?null:l.functionId&&s.get(i(l.functionId))||null}const f=new Map;for(let e of o.location)if(null!=e.id){const n=c(e);n&&f.set(i(e.id),n)}const p=o.sampleType.map(e=>({type:e.type&&u(e.type)||"samples",unit:e.unit&&u(e.unit)||"count"})),d=o.defaultSampleType?+o.defaultSampleType:p.length-1,m=p[d],y=new n.StackListProfileBuilder;switch(m.unit){case"nanoseconds":case"microseconds":case"milliseconds":case"seconds":y.setValueFormatter(new l.TimeFormatter(m.unit));break;case"bytes":y.setValueFormatter(new l.ByteFormatter)}for(let e of o.sample){const n=e.locationId?e.locationId.map(e=>f.get(i(e))):[];n.reverse();const t=e.value[d];y.appendSampleWithWeight(n.filter(e=>null!=e),+t)}return y.build()} +},{"./profile.proto.js":162,"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110}],155:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importFromChromeHeapProfile=o;var e=require("../lib/profile"),r=require("../lib/utils"),t=require("../lib/value-formatters");const n=new Map;function i(e){return(0,r.getOrInsert)(n,e,e=>{const r=e.functionName||"(anonymous)",t=e.url,n=e.lineNumber,i=e.columnNumber;return{key:`${r}:${t}:${n}:${i}`,name:r,file:t,line:n,col:i}})}function o(r){const n=new Map;let o=0;const l=(e,r)=>{e.id=o++,n.set(e.id,e),r&&(e.parent=r.id),e.children.forEach(r=>l(r,e))};l(r.head);const u=e=>{if(0===e.children.length)return e.selfSize||0;const r=e.children.reduce((e,r)=>e+=u(r),e.selfSize);return e.totalSize=r,r},a=u(r.head),s=[];for(let e of n.values()){let r=[];for(r.push(e);void 0!==e.parent;){const t=n.get(e.parent);if(void 0===t)break;r.unshift(t),e=t}s.push(r)}const c=new e.StackListProfileBuilder(a);for(let e of s){const r=e[e.length-1];c.appendSampleWithWeight(e.map(e=>i(e.callFrame)),r.selfSize)}return c.setValueFormatter(new t.ByteFormatter),c.build()} +},{"../lib/profile":109,"../lib/utils":60,"../lib/value-formatters":110}],156:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isTraceEventFormatted=l,exports.importTraceEvents=p;var e=require("../lib/utils"),t=require("../lib/profile"),r=require("../lib/value-formatters");function n(e){const t=[];for(let r of e)switch(r.ph){case"B":case"E":case"X":t.push(r)}return t}function s(e){const t=[];for(let r of e)switch(r.ph){case"B":case"E":t.push(r);break;case"X":let e=null;if(null!=r.dur?e=r.dur:null!=r.tdur&&(e=r.tdur),null==e){console.warn("Found a complete event (X) with no duration. Skipping: ",r);continue}t.push(Object.assign({},r,{ph:"B"})),t.push(Object.assign({},r,{ph:"E",ts:r.ts+e}));break;default:return r}return t}function i(e){const t=new Map;for(let r of e)"M"===r.ph&&"process_name"===r.name&&r.args&&r.args.name&&t.set(r.pid,r.args.name);return t}function a(e){const t=new Map;for(let r of e)if("M"===r.ph&&"thread_name"===r.name&&r.args&&r.args.name){const e=`${r.pid}:${r.tid}`;t.set(e,r.args.name)}return t}function o(e){let t=`${e.name||"(unnamed)"}`;return e.args&&(t+=` ${JSON.stringify(e.args)}`),t}function u(u){const c=new Map,f=s(n(u)),l=i(u),p=a(u);if(f.sort((e,t)=>{if(e.tst.ts)return 1;if(e.pid===t.pid&&e.tid===t.tid){if(o(e)===o(t)){if("B"===e.ph&&"E"===t.ph)return-1;if("E"===e.ph&&"B"===t.ph)return 1}else{if("B"===e.ph&&"E"===t.ph)return 1;if("E"===e.ph&&"B"===t.ph)return-1}}return-1}),f.length>0){const e=f[0].ts;for(let t of f)t.ts-=e}function d(n,s){const i=`${(0,e.zeroPad)(""+n,10)}:${(0,e.zeroPad)(""+s,10)}`;let a=c.get(i);if(null!=a)return a;let o=new t.CallTreeProfileBuilder;a={profile:o,eventStack:[]},o.setValueFormatter(new r.TimeFormatter("microseconds")),c.set(i,a);const u=l.get(n),f=p.get(`${n}:${s}`);return null!=u&&null!=f?o.setName(`${u} (pid ${n}), ${f} (tid ${s})`):null!=u?o.setName(`${u} (pid ${n}, tid ${s})`):null!=f?o.setName(`${f} (pid ${n}, tid ${s})`):o.setName(`pid ${n}, tid ${s}`),a}for(let t of f){const{profile:r,eventStack:n}=d(t.pid,t.tid),s=o(t),i={key:s,name:s};switch(t.ph){case"B":n.push(t),r.enterFrame(i,t.ts);break;case"E":const s=(0,e.lastOf)(n);null!=s&&s.name===t.name?(r.leaveFrame(i,t.ts),n.pop()):console.warn("Event discarded because it did not match top-of-stack. Discarded event:",t,"Top of stack:",s);break;default:return t}}const h=Array.from(c.entries());return(0,e.sortBy)(h,e=>e[0]),{name:"",indexToView:0,profiles:h.map(e=>e[1].profile)}}function c(e){if(!Array.isArray(e))return!1;if(0===e.length)return!1;for(let t of e){if(!("ph"in t))return!1;switch(t.ph){case"B":case"E":case"X":if(!("ts"in t))return!1}}return!0}function f(e){return"traceEvents"in e&&c(e.traceEvents)}function l(e){return f(e)||c(e)}function p(e){if(f(e))return u(e.traceEvents);if(c(e))return u(e);return e} +},{"../lib/utils":60,"../lib/profile":109,"../lib/value-formatters":110}],101:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.importProfileGroupFromText=g,exports.importProfileGroupFromBase64=h,exports.importProfilesFromFile=F,exports.importProfilesFromArrayBuffer=y,exports.importFromFileSystemDirectoryEntry=C;var e=require("./chrome"),r=require("./stackprof"),o=require("./instruments"),t=require("./bg-flamegraph"),i=require("./firefox"),n=require("../lib/file-format"),s=require("./v8proflog"),p=require("./linux-tools-perf"),l=require("./haskell"),m=require("./utils"),a=require("./pprof"),f=require("../lib/utils"),u=require("./v8heapalloc"),c=require("./trace-event"),d=function(e,r,o,t){return new(o||(o=Promise))(function(i,n){function s(e){try{l(t.next(e))}catch(e){n(e)}}function p(e){try{l(t.throw(e))}catch(e){n(e)}}function l(e){e.done?i(e.value):new o(function(r){r(e.value)}).then(s,p)}l((t=t.apply(e,r||[])).next())})};function g(e,r){return d(this,void 0,void 0,function*(){return yield P(new m.TextProfileDataSource(e,r))})}function h(e,r){return d(this,void 0,void 0,function*(){return yield P(m.MaybeCompressedDataReader.fromArrayBuffer(e,(0,f.decodeBase64)(r).buffer))})}function F(e){return d(this,void 0,void 0,function*(){return P(m.MaybeCompressedDataReader.fromFile(e))})}function y(e,r){return d(this,void 0,void 0,function*(){return P(m.MaybeCompressedDataReader.fromArrayBuffer(e,r))})}function P(e){return d(this,void 0,void 0,function*(){const r=yield e.name(),o=yield I(e);if(o){o.name||(o.name=r);for(let e of o.profiles)e&&!e.getName()&&e.setName(r);return o}return null})}function v(e){return e?{name:e.getName(),indexToView:0,profiles:[e]}:null}function x(e){return"["===(e=e.trim())[0]&&"]"!==(e=e.replace(/,\s*$/,""))[e.length-1]&&(e+="]"),e}function I(m){return d(this,void 0,void 0,function*(){const f=yield m.name(),d=yield m.readAsArrayBuffer();{const e=(0,a.importAsPprofProfile)(d);if(e)return console.log("Importing as protobuf encoded pprof file"),v(e)}const g=yield m.readAsText();if(f.endsWith(".speedscope.json"))return console.log("Importing as speedscope json file"),(0,n.importSpeedscopeProfiles)(JSON.parse(g));if(f.endsWith(".chrome.json")||/Profile-\d{8}T\d{6}/.exec(f))return console.log("Importing as Chrome Timeline"),(0,e.importFromChromeTimeline)(JSON.parse(g),f);if(f.endsWith(".stackprof.json"))return console.log("Importing as stackprof profile"),v((0,r.importFromStackprof)(JSON.parse(g)));if(f.endsWith(".instruments.txt"))return console.log("Importing as Instruments.app deep copy"),v((0,o.importFromInstrumentsDeepCopy)(g));if(f.endsWith(".linux-perf.txt"))return console.log("Importing as output of linux perf script"),(0,p.importFromLinuxPerf)(g);if(f.endsWith(".collapsedstack.txt"))return console.log("Importing as collapsed stack format"),v((0,t.importFromBGFlameGraph)(g));if(f.endsWith(".v8log.json"))return console.log("Importing as --prof-process v8 log"),v((0,s.importFromV8ProfLog)(JSON.parse(g)));if(f.endsWith(".heapprofile"))return console.log("Importing as Chrome Heap Profile"),v((0,u.importFromChromeHeapProfile)(JSON.parse(g)));let h;try{h=JSON.parse(x(g))}catch(e){}if(h){if("https://www.speedscope.app/file-format-schema.json"===h.$schema)return console.log("Importing as speedscope json file"),(0,n.importSpeedscopeProfiles)(JSON.parse(g));if(h.systemHost&&"Firefox"==h.systemHost.name)return console.log("Importing as Firefox profile"),v((0,i.importFromFirefox)(h));if((0,e.isChromeTimeline)(h))return console.log("Importing as Chrome Timeline"),(0,e.importFromChromeTimeline)(h,f);if("nodes"in h&&"samples"in h&&"timeDeltas"in h)return console.log("Importing as Chrome CPU Profile"),v((0,e.importFromChromeCPUProfile)(h));if((0,c.isTraceEventFormatted)(h))return console.log("Importing as Trace Event Format profile"),(0,c.importTraceEvents)(h);if("head"in h&&"samples"in h&&"timestamps"in h)return console.log("Importing as Chrome CPU Profile (old format)"),v((0,e.importFromOldV8CPUProfile)(h));if("mode"in h&&"frames"in h&&"raw_timestamp_deltas"in h)return console.log("Importing as stackprof profile"),v((0,r.importFromStackprof)(h));if("code"in h&&"functions"in h&&"ticks"in h)return console.log("Importing as --prof-process v8 log"),v((0,s.importFromV8ProfLog)(h));if("head"in h&&"selfSize"in h.head)return console.log("Importing as Chrome Heap Profile"),v((0,u.importFromChromeHeapProfile)(JSON.parse(g)));if("rts_arguments"in h&&"initial_capabilities"in h)return console.log("Importing as Haskell GHC JSON Profile"),(0,l.importFromHaskell)(h)}else{if(/^[\w \t\(\)]*\tSymbol Name/.exec(g))return console.log("Importing as Instruments.app deep copy"),v((0,o.importFromInstrumentsDeepCopy)(g));const e=g.split(/\n/).length;if(e>=1&&e===g.split(/ \d+\r?\n/).length)return console.log("Importing as collapsed stack format"),v((0,t.importFromBGFlameGraph)(g));const r=(0,p.importFromLinuxPerf)(g);if(r)return console.log("Importing from linux perf script output"),r}return null})}function C(e){return d(this,void 0,void 0,function*(){return(0,o.importFromInstrumentsTrace)(e)})} +},{"./chrome":145,"./stackprof":146,"./instruments":147,"./bg-flamegraph":148,"./firefox":149,"../lib/file-format":82,"./v8proflog":150,"./linux-tools-perf":151,"./haskell":152,"./utils":153,"./pprof":154,"../lib/utils":60,"./v8heapalloc":155,"./trace-event":156}]},{},[101], null) //# sourceMappingURL=import.0a51feeb.map \ No newline at end of file diff --git a/profiler_vis/speedscope/perf-vertx-stacks-01-collapsed-all.1841aedb.txt b/profiler_vis/speedscope/perf-vertx-stacks-01-collapsed-all.1841aedb.txt index 4b5f79f..7575eea 100644 --- a/profiler_vis/speedscope/perf-vertx-stacks-01-collapsed-all.1841aedb.txt +++ b/profiler_vis/speedscope/perf-vertx-stacks-01-collapsed-all.1841aedb.txt @@ -1,199 +1,199 @@ -java;read;check_events_[k];hypercall_page_[k] 1 -java;start_thread;java_start;GCTaskThread::run;ScavengeRootsTask::do_it;ClassLoaderDataGraph::oops_do;ClassLoaderData::oops_do;PSScavengeKlassClosure::do_klass 1 -java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;PSPromotionManager::drain_stacks_depth;oopDesc* PSPromotionManager::copy_to_survivor_space;InstanceKlass::oop_push_contents 1 -java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 5 -java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 7 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];io/netty/buffer/PooledByteBuf:.internalNioBuffer_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/NativeThread:.current_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j]; 3 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];Java_sun_nio_ch_FileDispatcherImpl_write0 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;sys_write_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];fget_light_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];__srcu_read_lock_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];__tcp_push_pending_frames_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];ktime_get_real_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];skb_clone_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_set_skb_tso_segs_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_hard_start_xmit_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_pick_tx_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];dev_queue_xmit_nit_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_end_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];dma_issue_pending_all_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];__inet_lookup_established_[k] 3 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_event_data_recv_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];sock_def_readable_[k];__wake_up_sync_key_[k];check_events_[k];hypercall_page_[k] 19 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k] 3 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];bictcp_acked_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_rtt_estimator_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_valid_rtt_meas_[k];tcp_rtt_estimator_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_finish_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];rcu_bh_qs_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];netif_skb_features_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_output_[k] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];pvclock_clocksource_read_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k];pvclock_clocksource_read_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];xen_clocksource_get_cycles_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];skb_dst_set_noref_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];lock_sock_nested_[k];_raw_spin_lock_bh_[k];local_bh_disable_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k];arch_local_irq_save_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__phys_addr_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];get_slab_[k] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];kmem_cache_alloc_node_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];ksize_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];ipv4_mtu_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];tcp_established_options_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_xmit_size_goal_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_xmit_size_goal_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k];__srcu_read_lock_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];apparmor_file_permission_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];security_file_permission_[k];apparmor_file_permission_[k];common_file_perm_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];sock_aio_write_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/util/Recycler:.recycle_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];java/util/concurrent/ConcurrentHashMap:.get_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/mozilla/javascript/Context:.getWrapFactory_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j] 3 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j];java/util/HashMap:.get_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrap_[j];java/util/HashMap:.get_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];vtable chunks_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/WrapFactory:.wrap_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.findFunction_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaObject:.get_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j];org/mozilla/javascript/NativeJavaObject:.get_[j];java/util/HashMap:.get_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];jint_disjoint_arraycopy_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 3 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];vtable chunks_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/NativeFunction:.initScriptFunction_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 4 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 5 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getPrototype_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];vtable chunks_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectElem_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j] 3 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];java/util/ArrayList:.add_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/util/internal/RecyclableArrayList:.newInstance_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];java/util/ArrayList:.ensureExplicitCapacity_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];vtable chunks_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.add0_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];sun/nio/cs/UTF_8$Encoder:._[j];jbyte_disjoint_arraycopy_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j];io/netty/util/internal/AppendableCharSequence:.append_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpHeaders:.isTransferEncodingChunked_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j] 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpHeaders:.hash_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpObjectDecoder:.splitHeader_[j] 5 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];java/util/Arrays:.fill_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];java/nio/channels/spi/AbstractInterruptibleChannel:.end_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read 2 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;sys_read_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];do_sync_read_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];__kfree_skb_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_rcv_space_adjust_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_data_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_head_state_[k];dst_release_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];_raw_spin_lock_bh_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k];copy_user_enhanced_fast_string_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k];__tcp_select_window_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];rw_verify_area_[k] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j] 1 -java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j] 1 -java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;PSIsAliveClosure::do_object_b 1 -java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;StringTable::unlink_or_oops_do 2 -java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;pthread_cond_signal@@GLIBC_2.3.2;system_call_fastpath_[k];sys_futex_[k];do_futex_[k];futex_wake_op_[k] 1 -java;write;check_events_[k];hypercall_page_[k] 3 +java;read;check_events_[k];hypercall_page_[k] 1 +java;start_thread;java_start;GCTaskThread::run;ScavengeRootsTask::do_it;ClassLoaderDataGraph::oops_do;ClassLoaderData::oops_do;PSScavengeKlassClosure::do_klass 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;PSPromotionManager::drain_stacks_depth;oopDesc* PSPromotionManager::copy_to_survivor_space;InstanceKlass::oop_push_contents 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 5 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 7 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];io/netty/buffer/PooledByteBuf:.internalNioBuffer_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/NativeThread:.current_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j]; 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];Java_sun_nio_ch_FileDispatcherImpl_write0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;sys_write_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];fget_light_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];__srcu_read_lock_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];__tcp_push_pending_frames_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];ktime_get_real_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];skb_clone_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_set_skb_tso_segs_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_hard_start_xmit_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_pick_tx_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];dev_queue_xmit_nit_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_end_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];dma_issue_pending_all_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];__inet_lookup_established_[k] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_event_data_recv_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];sock_def_readable_[k];__wake_up_sync_key_[k];check_events_[k];hypercall_page_[k] 19 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];bictcp_acked_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_rtt_estimator_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_valid_rtt_meas_[k];tcp_rtt_estimator_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_finish_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];rcu_bh_qs_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];netif_skb_features_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_output_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];pvclock_clocksource_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k];pvclock_clocksource_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];xen_clocksource_get_cycles_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];skb_dst_set_noref_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];lock_sock_nested_[k];_raw_spin_lock_bh_[k];local_bh_disable_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k];arch_local_irq_save_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__phys_addr_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];get_slab_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];kmem_cache_alloc_node_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];ksize_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];ipv4_mtu_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];tcp_established_options_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_xmit_size_goal_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_xmit_size_goal_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k];__srcu_read_lock_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];apparmor_file_permission_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];security_file_permission_[k];apparmor_file_permission_[k];common_file_perm_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];sock_aio_write_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/util/Recycler:.recycle_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];java/util/concurrent/ConcurrentHashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/mozilla/javascript/Context:.getWrapFactory_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j];java/util/HashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrap_[j];java/util/HashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/WrapFactory:.wrap_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.findFunction_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaObject:.get_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j];org/mozilla/javascript/NativeJavaObject:.get_[j];java/util/HashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];jint_disjoint_arraycopy_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/NativeFunction:.initScriptFunction_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getPrototype_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectElem_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];java/util/ArrayList:.add_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/util/internal/RecyclableArrayList:.newInstance_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];java/util/ArrayList:.ensureExplicitCapacity_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.add0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];sun/nio/cs/UTF_8$Encoder:._[j];jbyte_disjoint_arraycopy_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j];io/netty/util/internal/AppendableCharSequence:.append_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpHeaders:.isTransferEncodingChunked_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpHeaders:.hash_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpObjectDecoder:.splitHeader_[j] 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];java/util/Arrays:.fill_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];java/nio/channels/spi/AbstractInterruptibleChannel:.end_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;sys_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];do_sync_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];__kfree_skb_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_rcv_space_adjust_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_data_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_head_state_[k];dst_release_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];_raw_spin_lock_bh_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k];copy_user_enhanced_fast_string_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k];__tcp_select_window_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];rw_verify_area_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j] 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;PSIsAliveClosure::do_object_b 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;StringTable::unlink_or_oops_do 2 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;pthread_cond_signal@@GLIBC_2.3.2;system_call_fastpath_[k];sys_futex_[k];do_futex_[k];futex_wake_op_[k] 1 +java;write;check_events_[k];hypercall_page_[k] 3 diff --git a/profiler_vis/speedscope/release.txt b/profiler_vis/speedscope/release.txt index 5e4db57..a679afe 100644 --- a/profiler_vis/speedscope/release.txt +++ b/profiler_vis/speedscope/release.txt @@ -1,3 +1,3 @@ -speedscope@1.5.2 -Thu Oct 10 18:34:24 PDT 2019 -c3074b73436eddc789b96d0142c6ee56b34ff399 +speedscope@1.5.2 +Thu Oct 10 18:34:24 PDT 2019 +c3074b73436eddc789b96d0142c6ee56b34ff399 diff --git a/profiler_vis/speedscope/speedscope.f741b731.js b/profiler_vis/speedscope/speedscope.f741b731.js index 87c2a36..60c874e 100644 --- a/profiler_vis/speedscope/speedscope.f741b731.js +++ b/profiler_vis/speedscope/speedscope.f741b731.js @@ -1,173 +1,173 @@ -parcelRequire=function(e,r,n,t){var i="function"==typeof parcelRequire&&parcelRequire,o="function"==typeof require&&require;function u(n,t){if(!r[n]){if(!e[n]){var f="function"==typeof parcelRequire&&parcelRequire;if(!t&&f)return f(n,!0);if(i)return i(n,!0);if(o&&"string"==typeof n)return o(n);var c=new Error("Cannot find module '"+n+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[n][1][r]||r};var l=r[n]=new u.Module(n);e[n][0].call(l.exports,p,l,l.exports,this)}return r[n].exports;function p(e){return u(p.resolve(e))}}u.isParcelRequire=!0,u.Module=function(e){this.id=e,this.bundle=u,this.exports={}},u.modules=e,u.cache=r,u.parent=i,u.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]};for(var f=0;f2;)n.push(arguments[s]);for(i&&null!=i.children&&(n.length||n.push(i.children),delete i.children);n.length;)if((a=n.pop())&&void 0!==a.pop)for(s=a.length;s--;)n.push(a[s]);else"boolean"==typeof a&&(a=null),(p="function"!=typeof r)&&(null==a?a="":"number"==typeof a?a=String(a):"string"!=typeof a&&(p=!1)),p&&l?c[c.length-1]+=a:c===o?c=[a]:c.push(a),l=p;var u=new e;return u.nodeName=r,u.children=c,u.attributes=null==i?void 0:i,u.key=null==i?void 0:i.key,void 0!==t.vnode&&t.vnode(u),u}function i(e,t){for(var n in t)e[n]=t[n];return e}var l="function"==typeof Promise?Promise.resolve().then.bind(Promise.resolve()):setTimeout;function a(e,t){return r(e.nodeName,i(i({},e.attributes),t),arguments.length>2?[].slice.call(arguments,2):e.children)}var p=/acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i,s=[];function c(e){!e._dirty&&(e._dirty=!0)&&1==s.push(e)&&(t.debounceRendering||l)(u)}function u(){var e,t=s;for(s=[];e=t.pop();)e._dirty&&A(e)}function f(e,t,n){return"string"==typeof t||"number"==typeof t?void 0!==e.splitText:"string"==typeof t.nodeName?!e._componentConstructor&&d(e,t.nodeName):n||e._componentConstructor===t.nodeName}function d(e,t){return e.normalizedNodeName===t||e.nodeName.toLowerCase()===t.toLowerCase()}function _(e){var t=i({},e.attributes);t.children=e.children;var n=e.nodeName.defaultProps;if(void 0!==n)for(var o in n)void 0===t[o]&&(t[o]=n[o]);return t}function v(e,t){var n=t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e);return n.normalizedNodeName=e,n}function m(e){var t=e.parentNode;t&&t.removeChild(e)}function h(e,t,n,o,r){if("className"===t&&(t="class"),"key"===t);else if("ref"===t)n&&n(null),o&&o(e);else if("class"!==t||r)if("style"===t){if(o&&"string"!=typeof o&&"string"!=typeof n||(e.style.cssText=o||""),o&&"object"==typeof o){if("string"!=typeof n)for(var i in n)i in o||(e.style[i]="");for(var i in o)e.style[i]="number"==typeof o[i]&&!1===p.test(i)?o[i]+"px":o[i]}}else if("dangerouslySetInnerHTML"===t)o&&(e.innerHTML=o.__html||"");else if("o"==t[0]&&"n"==t[1]){var l=t!==(t=t.replace(/Capture$/,""));t=t.toLowerCase().substring(2),o?n||e.addEventListener(t,y,l):e.removeEventListener(t,y,l),(e._listeners||(e._listeners={}))[t]=o}else if("list"!==t&&"type"!==t&&!r&&t in e)b(e,t,null==o?"":o),null!=o&&!1!==o||e.removeAttribute(t);else{var a=r&&t!==(t=t.replace(/^xlink\:?/,""));null==o||!1===o?a?e.removeAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase()):e.removeAttribute(t):"function"!=typeof o&&(a?e.setAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase(),o):e.setAttribute(t,o))}else e.className=o||""}function b(e,t,n){try{e[t]=n}catch(e){}}function y(e){return this._listeners[e.type](t.event&&t.event(e)||e)}var x=[],C=0,g=!1,N=!1;function k(){for(var e;e=x.pop();)t.afterMount&&t.afterMount(e),e.componentDidMount&&e.componentDidMount()}function w(e,t,n,o,r,i){C++||(g=null!=r&&void 0!==r.ownerSVGElement,N=null!=e&&!("__preactattr_"in e));var l=S(e,t,n,o,i);return r&&l.parentNode!==r&&r.appendChild(l),--C||(N=!1,i||k()),l}function S(e,t,n,o,r){var i=e,l=g;if(null!=t&&"boolean"!=typeof t||(t=""),"string"==typeof t||"number"==typeof t)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=t&&(e.nodeValue=t):(i=document.createTextNode(t),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),L(e,!0))),i.__preactattr_=!0,i;var a=t.nodeName;if("function"==typeof a)return D(e,t,n,o);if(g="svg"===a||"foreignObject"!==a&&g,a=String(a),(!e||!d(e,a))&&(i=v(a,g),e)){for(;e.firstChild;)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),L(e,!0)}var p=i.firstChild,s=i.__preactattr_,c=t.children;if(null==s){s=i.__preactattr_={};for(var u=i.attributes,f=u.length;f--;)s[u[f].name]=u[f].value}return!N&&c&&1===c.length&&"string"==typeof c[0]&&null!=p&&void 0!==p.splitText&&null==p.nextSibling?p.nodeValue!=c[0]&&(p.nodeValue=c[0]):(c&&c.length||null!=p)&&U(i,c,n,o,N||null!=s.dangerouslySetInnerHTML),P(i,t.attributes,s),g=l,i}function U(e,t,n,o,r){var i,l,a,p,s,c=e.childNodes,u=[],d={},_=0,v=0,h=c.length,b=0,y=t?t.length:0;if(0!==h)for(var x=0;x0?"Unexpected "+(c.length>1?"keys":"key")+' "'+c.join('", "')+'" found in '+a+'. Expected to find one of the known reducer keys instead: "'+i.join('", "')+'". Unexpected keys will be ignored.':void 0}function f(e){Object.keys(e).forEach(function(t){var r=e[t];if(void 0===r(void 0,{type:n.INIT}))throw new Error('Reducer "'+t+"\" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.");if(void 0===r(void 0,{type:"@@redux/PROBE_UNKNOWN_ACTION_"+Math.random().toString(36).substring(7).split("").join(".")}))throw new Error('Reducer "'+t+"\" returned undefined when probed with a random type. Don't try to handle "+n.INIT+' or other actions in "redux/*" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.')})}function l(e){for(var t=Object.keys(e),r={},n=0;n0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];if(u)throw u;for(var n=!1,o={},a=0;a=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},h=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},b=!1;function y(){b||(b=!0,p(" does not support changing `store` on the fly. It is most likely that you see this error because you updated to Redux 2.x and React Redux 2.x which no longer hot reload reducers automatically. See https://github.com/reactjs/react-redux/releases/tag/v2.0.0 for the migration instructions."))}function v(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"store",o=arguments[1]||n+"Subscription",i=function(t){function e(r,o){a(this,e);var i=h(this,t.call(this,r,o));return i[n]=r.store,i}return f(e,t),e.prototype.getChildContext=function(){var t;return(t={})[n]=this[n],t[o]=null,t},e.prototype.render=function(){return r.only(this.props.children)},e}(e.Component);return i.prototype.componentWillReceiveProps=function(t){this[n]!==t.store&&y()},i.childContextTypes=((t={})[n]=u.isRequired,t[o]=s,t),i}var m=v(),P={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},O={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},S=Object.defineProperty,g=Object.getOwnPropertyNames,w=Object.getOwnPropertySymbols,C=Object.getOwnPropertyDescriptor,j=Object.getPrototypeOf,T=j&&j(Object);function x(t,e,n){if("string"!=typeof e){if(T){var r=j(e);r&&r!==T&&x(t,r,n)}var o=g(e);w&&(o=o.concat(w(e)));for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:{},i=o.getDisplayName,p=void 0===i?function(t){return"ConnectAdvanced("+t+")"}:i,c=o.methodName,b=void 0===c?"connectAdvanced":c,y=o.renderCountProp,v=void 0===y?void 0:y,m=o.shouldHandleStateChanges,P=void 0===m||m,O=o.storeKey,S=void 0===O?"store":O,g=o.withRef,w=void 0!==g&&g,C=l(o,["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef"]),j=S+"Subscription",T=R++,x=((n={})[S]=u,n[j]=s,n),E=((r={})[j]=s,r);return function(n){q("function"==typeof n,"You must pass a component to the function returned by "+b+". Instead received "+JSON.stringify(n));var r=n.displayName||n.name||"Component",o=p(r),i=d({},C,{getDisplayName:p,methodName:b,renderCountProp:v,shouldHandleStateChanges:P,storeKey:S,withRef:w,displayName:o,wrappedComponentName:r,WrappedComponent:n}),s=function(r){function s(t,e){a(this,s);var n=h(this,r.call(this,t,e));return n.version=T,n.state={},n.renderCount=0,n.store=t[S]||e[S],n.propsMode=Boolean(t[S]),n.setWrappedInstance=n.setWrappedInstance.bind(n),q(n.store,'Could not find "'+S+'" in either the context or props of "'+o+'". Either wrap the root component in a , or explicitly pass "'+S+'" as a prop to "'+o+'".'),n.initSelector(),n.initSubscription(),n}return f(s,r),s.prototype.getChildContext=function(){var t,e=this.propsMode?null:this.subscription;return(t={})[j]=e||this.context[j],t},s.prototype.componentDidMount=function(){P&&(this.subscription.trySubscribe(),this.selector.run(this.props),this.selector.shouldComponentUpdate&&this.forceUpdate())},s.prototype.componentWillReceiveProps=function(t){this.selector.run(t)},s.prototype.shouldComponentUpdate=function(){return this.selector.shouldComponentUpdate},s.prototype.componentWillUnmount=function(){this.subscription&&this.subscription.tryUnsubscribe(),this.subscription=null,this.notifyNestedSubs=W,this.store=null,this.selector.run=W,this.selector.shouldComponentUpdate=!1},s.prototype.getWrappedInstance=function(){return q(w,"To access the wrapped instance, you need to specify { withRef: true } in the options argument of the "+b+"() call."),this.wrappedInstance},s.prototype.setWrappedInstance=function(t){this.wrappedInstance=t},s.prototype.initSelector=function(){var e=t(this.store.dispatch,i);this.selector=F(e,this.store),this.selector.run(this.props)},s.prototype.initSubscription=function(){if(P){var t=(this.propsMode?this.props:this.context)[j];this.subscription=new M(this.store,t,this.onStateChange.bind(this)),this.notifyNestedSubs=this.subscription.notifyNestedSubs.bind(this.subscription)}},s.prototype.onStateChange=function(){this.selector.run(this.props),this.selector.shouldComponentUpdate?(this.componentDidUpdate=this.notifyNestedSubsOnComponentDidUpdate,this.setState(I)):this.notifyNestedSubs()},s.prototype.notifyNestedSubsOnComponentDidUpdate=function(){this.componentDidUpdate=void 0,this.notifyNestedSubs()},s.prototype.isSubscribed=function(){return Boolean(this.subscription)&&this.subscription.isSubscribed()},s.prototype.addExtraProps=function(t){if(!(w||v||this.propsMode&&this.subscription))return t;var e=d({},t);return w&&(e.ref=this.setWrappedInstance),v&&(e[v]=this.renderCount++),this.propsMode&&this.subscription&&(e[j]=this.subscription),e},s.prototype.render=function(){var t=this.selector;if(t.shouldComponentUpdate=!1,t.error)throw t.error;return(0,e.h)(n,this.addExtraProps(t.props))},s}(e.Component);return s.WrappedComponent=n,s.displayName=o,s.childContextTypes=E,s.contextTypes=x,s.prototype.componentWillUpdate=function(){var t=this;if(this.version!==T){this.version=T,this.initSelector();var e=[];this.subscription&&(e=this.subscription.listeners.get(),this.subscription.tryUnsubscribe()),this.initSubscription(),P&&(this.subscription.trySubscribe(),e.forEach(function(e){return t.subscription.listeners.subscribe(e)}))}},N(s,n)}}var _=Object.prototype.hasOwnProperty;function B(t,e){return t===e?0!==t||0!==e||1/t==1/e:t!=t&&e!=e}function H(t,e){if(B(t,e))return!0;if("object"!==(void 0===t?"undefined":c(t))||null===t||"object"!==(void 0===e?"undefined":c(e))||null===e)return!1;var n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(var o=0;o=0;r--){var o=e[r](t);if(o)return o}return function(e,r){throw new Error("Invalid value of type "+(void 0===t?"undefined":c(t))+" for "+n+" argument when connecting component "+r.wrappedComponentName+".")}}function Wt(t,e){return t===e}function Ft(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.connectHOC,n=void 0===e?A:e,r=t.mapStateToPropsFactories,o=void 0===r?Ct:r,i=t.mapDispatchToPropsFactories,s=void 0===i?St:i,u=t.mergePropsFactories,p=void 0===u?qt:u,c=t.selectorFactory,a=void 0===c?Rt:c;return function(t,e,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},u=i.pure,c=void 0===u||u,f=i.areStatesEqual,h=void 0===f?Wt:f,b=i.areOwnPropsEqual,y=void 0===b?H:b,v=i.areStatePropsEqual,m=void 0===v?H:v,P=i.areMergedPropsEqual,O=void 0===P?H:P,S=l(i,["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"]),g=It(t,o,"mapStateToProps"),w=It(e,s,"mapDispatchToProps"),C=It(r,p,"mergeProps");return n(a,d({methodName:"connect",getDisplayName:function(t){return"Connect("+t+")"},shouldHandleStateChanges:Boolean(t),initMapStateToProps:g,initMapDispatchToProps:w,initMergeProps:C,pure:c,areStatesEqual:h,areOwnPropsEqual:y,areStatePropsEqual:m,areMergedPropsEqual:O},S))}}var At=Ft(),_t={Provider:m,connect:At,connectAdvanced:A};exports.Provider=m,exports.connect=At,exports.connectAdvanced=A,exports.default=_t; -},{"preact":24,"redux":32}],36:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.StatelessComponent=void 0,exports.actionCreator=n,exports.setter=o,exports.createContainer=s,exports.bindActionCreator=c;var e=require("preact-redux"),t=require("preact");const r=new Set;function n(e){if(r.has(e))throw new Error(`Cannot re-use action type name: ${e}`);const t=(t={})=>({type:e,payload:t});return t.matches=(t=>t.type===e),t}function o(e,t){return(r=t,n)=>e.matches(n)?n.payload:r}function s(t,r){return(0,e.connect)(e=>e,e=>({dispatch:e}),(e,t,n)=>r(e,t.dispatch,n))(t)}class a extends t.Component{}function c(e,t){return r=>{e(t(r))}}exports.StatelessComponent=a; -},{"preact-redux":26,"preact":24}],97:[function(require,module,exports) { -"use strict";function t(t,i,s){return ts?s:t}Object.defineProperty(exports,"__esModule",{value:!0}),exports.clamp=t;class i{constructor(t,i){this.x=t,this.y=i}withX(t){return new i(t,this.y)}withY(t){return new i(this.x,t)}plus(t){return new i(this.x+t.x,this.y+t.y)}minus(t){return new i(this.x-t.x,this.y-t.y)}times(t){return new i(this.x*t,this.y*t)}timesPointwise(t){return new i(this.x*t.x,this.y*t.y)}dividedByPointwise(t){return new i(this.x/t.x,this.y/t.y)}dot(t){return this.x*t.x+this.y*t.y}equals(t){return this.x===t.x&&this.y===t.y}approxEquals(t,i=1e-9){return Math.abs(this.x-t.x){if(t.actions.flamechart.setHoveredNode.matches(a)&&r(a)){const{hover:t}=a.payload.args;return Object.assign({},e,{hover:t})}if(t.actions.flamechart.setSelectedNode.matches(a)&&r(a)){const{selectedNode:t}=a.payload.args;return Object.assign({},e,{selectedNode:t})}if(t.actions.flamechart.setConfigSpaceViewportRect.matches(a)&&r(a)){const{configSpaceViewportRect:t}=a.payload.args;return Object.assign({},e,{configSpaceViewportRect:t})}if(t.actions.flamechart.setLogicalSpaceViewportSize.matches(a)&&r(a)){const{logicalSpaceViewportSize:t}=a.payload.args;return Object.assign({},e,{logicalSpaceViewportSize:t})}return t.actions.setViewMode.matches(a)?Object.assign({},e,{hover:null}):e}}!function(e){e.LEFT_HEAVY="LEFT_HEAVY",e.CHRONO="CHRONO",e.SANDWICH_INVERTED_CALLERS="SANDWICH_INVERTED_CALLERS",e.SANDWICH_CALLEES="SANDWICH_CALLEES"}(a||(exports.FlamechartID=a={})); -},{"../lib/math":97,"./actions":40}],96:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createSandwichView=l;var e=require("./flamechart-view-state"),a=require("./actions");function l(l){const r=(0,e.createFlamechartViewStateReducer)(e.FlamechartID.SANDWICH_CALLEES,l),t=(0,e.createFlamechartViewStateReducer)(e.FlamechartID.SANDWICH_INVERTED_CALLERS,l);return(e={callerCallee:null},c)=>{if(a.actions.sandwichView.setSelectedFrame.matches(c)&&function(e){const{payload:a}=e;return a.profileIndex===l}(c))return null==c.payload.args?Object.assign({},e,{callerCallee:null}):Object.assign({},e,{callerCallee:{selectedFrame:c.payload.args,calleeFlamegraph:r(void 0,c),invertedCallerFlamegraph:t(void 0,c)}});const{callerCallee:n}=e;if(n){const{calleeFlamegraph:a,invertedCallerFlamegraph:l}=n,i=r(a,c),s=t(l,c);return i===a&&s===l?e:Object.assign({},e,{callerCallee:Object.assign({},n,{calleeFlamegraph:i,invertedCallerFlamegraph:s})})}return e}} -},{"./flamechart-view-state":95,"./actions":40}],60:[function(require,module,exports) { -"use strict";function t(t){return t[t.length-1]||null}function e(t,e){t.sort(function(t,r){return e(t)99?e=">99%":t<.01?e="<0.01%":t<1?e=`${t.toFixed(2)}%`:t<10&&(e=`${t.toFixed(1)}%`),e}function f(t){return t-Math.floor(t)}function h(t){return 2*Math.abs(f(t)-.5)-1}function g(t,e,r,n,o=1){for(console.assert(!isNaN(o)&&!isNaN(n));;){if(e-t<=o)return[t,e];const s=(e+t)/2;r(s){let n;return null==e?(n=t(r),e={args:r,result:n},n):x(e.args,r)?e.result:(e.args=r,e.result=t(r),e.result)}}function y(t){let e=null;return r=>{let n;return null==e?(n=t(r),e={args:r,result:n},n):e.args===r?e.result:(e.args=r,e.result=t(r),e.result)}}function w(t){let e=null;return()=>(null==e&&(e={result:t()}),e.result)}exports.KeyedSet=s;const E=w(()=>{const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=new Map;for(let r=0;r>4,"="!==u&&(o[s++]=(15&c)<<4|f>>2),"="!==a&&(o[s++]=(7&f)<<6|h)}if(s!==n)throw new Error(`Expected to decode ${n} bytes, but only decoded ${s})`);return o} -},{}],49:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.profileGroup=void 0,exports.actionCreatorWithIndex=n;var e=require("./flamechart-view-state"),t=require("./sandwich-view-state"),i=require("../lib/typed-redux"),r=require("./actions"),a=require("../lib/math"),o=require("../lib/utils");function n(e){return(0,i.actionCreator)(e)}function l(i,r){const a=(0,e.createFlamechartViewStateReducer)(e.FlamechartID.CHRONO,r),n=(0,e.createFlamechartViewStateReducer)(e.FlamechartID.LEFT_HEAVY,r),l=(0,t.createSandwichView)(r);return(e,t)=>{if(void 0===e)return{profile:i,chronoViewState:a(void 0,t),leftHeavyViewState:n(void 0,t),sandwichViewState:l(void 0,t)};const r={profile:i,chronoViewState:a(e.chronoViewState,t),leftHeavyViewState:n(e.leftHeavyViewState,t),sandwichViewState:l(e.sandwichViewState,t)};return(0,o.objectsHaveShallowEquality)(e,r)?e:r}}const c=exports.profileGroup=((e=null,t)=>{if(r.actions.setProfileGroup.matches(t)){const{indexToView:e,profiles:i,name:r}=t.payload;return{indexToView:e,name:r,profiles:i.map((e,i)=>l(e,i)(void 0,t))}}if(null!=e){const{indexToView:n,profiles:c}=e,s=(0,a.clamp)((0,i.setter)(r.actions.setProfileIndexToView,0)(n,t),0,c.length-1),u=c.map((e,i)=>l(e.profile,i)(e,t));return n===s&&(0,o.objectsHaveShallowEquality)(c,u)?e:Object.assign({},e,{indexToView:s,profiles:u})}return e}); -},{"./flamechart-view-state":95,"./sandwich-view-state":96,"../lib/typed-redux":36,"./actions":40,"../lib/math":97,"../lib/utils":60}],40:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.actions=void 0;var e=require("../lib/typed-redux"),t=require("./profiles-state"),a=exports.actions=void 0;!function(a){let o,r;a.setProfileGroup=(0,e.actionCreator)("setProfileGroup"),a.setProfileIndexToView=(0,e.actionCreator)("setProfileIndexToView"),a.setGLCanvas=(0,e.actionCreator)("setGLCanvas"),a.setViewMode=(0,e.actionCreator)("setViewMode"),a.setFlattenRecursion=(0,e.actionCreator)("setFlattenRecursion"),a.setDragActive=(0,e.actionCreator)("setDragActive"),a.setLoading=(0,e.actionCreator)("setLoading"),a.setError=(0,e.actionCreator)("setError"),a.setHashParams=(0,e.actionCreator)("setHashParams"),function(a){a.setTableSortMethod=(0,e.actionCreator)("sandwichView.setTableSortMethod"),a.setSelectedFrame=(0,t.actionCreatorWithIndex)("sandwichView.setSelectedFarmr")}(o=a.sandwichView||(a.sandwichView={})),function(e){e.setHoveredNode=(0,t.actionCreatorWithIndex)("flamechart.setHoveredNode"),e.setSelectedNode=(0,t.actionCreatorWithIndex)("flamechart.setSelectedNode"),e.setConfigSpaceViewportRect=(0,t.actionCreatorWithIndex)("flamechart.setConfigSpaceViewportRect"),e.setLogicalSpaceViewportSize=(0,t.actionCreatorWithIndex)("flamechart.setLogicalSpaceViewportSpace")}(r=a.flamechart||(a.flamechart={}))}(a||(exports.actions=a={})); -},{"../lib/typed-redux":36,"./profiles-state":49}],47:[function(require,module,exports) { -"use strict";function t(t=window.location.hash){try{if(!t.startsWith("#"))return{};const e=t.substr(1).split("&"),r={};for(const t of e){let[e,o]=t.split("=");o=decodeURIComponent(o),"profileURL"===e?r.profileURL=o:"title"===e?r.title=o:"localProfilePath"===e&&(r.localProfilePath=o)}return r}catch(t){return console.error("Error when loading hash fragment."),console.error(t),{}}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.getHashParams=t; -},{}],132:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=t;var e=/-webkit-|-moz-|-ms-/;function t(t){return"string"==typeof t&&e.test(t)}module.exports=exports.default; -},{}],116:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=i;var e=require("css-in-js-utils/lib/isPrefixedValue"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}var u=["-webkit-","-moz-",""];function i(e,r){if("string"==typeof r&&!(0,t.default)(r)&&r.indexOf("calc(")>-1)return u.map(function(e){return r.replace(/calc\(/g,e+"calc(")})}module.exports=exports.default; -},{"css-in-js-utils/lib/isPrefixedValue":132}],128:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("css-in-js-utils/lib/isPrefixedValue"),r=t(e);function t(e){return e&&e.__esModule?e:{default:e}}var s=["-webkit-",""];function u(e,t){if("string"==typeof t&&!(0,r.default)(t)&&t.indexOf("cross-fade(")>-1)return s.map(function(e){return t.replace(/cross-fade\(/g,e+"cross-fade(")})}module.exports=exports.default; -},{"css-in-js-utils/lib/isPrefixedValue":132}],120:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=o;var e=["-webkit-","-moz-",""],r={"zoom-in":!0,"zoom-out":!0,grab:!0,grabbing:!0};function o(o,t){if("cursor"===o&&r.hasOwnProperty(t))return e.map(function(e){return e+t})}module.exports=exports.default; -},{}],118:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("css-in-js-utils/lib/isPrefixedValue"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}var i=["-webkit-",""];function u(e,r){if("string"==typeof r&&!(0,t.default)(r)&&r.indexOf("filter(")>-1)return i.map(function(e){return r.replace(/filter\(/g,e+"filter(")})}module.exports=exports.default; -},{"css-in-js-utils/lib/isPrefixedValue":132}],117:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=i;var e={flex:["-webkit-box","-moz-box","-ms-flexbox","-webkit-flex","flex"],"inline-flex":["-webkit-inline-box","-moz-inline-box","-ms-inline-flexbox","-webkit-inline-flex","inline-flex"]};function i(i,l){if("display"===i&&e.hasOwnProperty(l))return e[l]}module.exports=exports.default; -},{}],119:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=s;var e={"space-around":"distribute","space-between":"justify","flex-start":"start","flex-end":"end"},t={alignContent:"msFlexLinePack",alignSelf:"msFlexItemAlign",alignItems:"msFlexAlign",justifyContent:"msFlexPack",order:"msFlexOrder",flexGrow:"msFlexPositive",flexShrink:"msFlexNegative",flexBasis:"msFlexPreferredSize"};function s(s,l,r){t.hasOwnProperty(s)&&(r[t[s]]=e[l]||l)}module.exports=exports.default; -},{}],124:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=i;var e={"space-around":"justify","space-between":"justify","flex-start":"start","flex-end":"end","wrap-reverse":"multiple",wrap:"multiple"},t={alignItems:"WebkitBoxAlign",justifyContent:"WebkitBoxPack",flexWrap:"WebkitBoxLines"};function i(i,r,o){"flexDirection"===i&&"string"==typeof r&&(r.indexOf("column")>-1?o.WebkitBoxOrient="vertical":o.WebkitBoxOrient="horizontal",r.indexOf("reverse")>-1?o.WebkitBoxDirection="reverse":o.WebkitBoxDirection="normal"),t.hasOwnProperty(i)&&(o[t[i]]=e[r]||r)}module.exports=exports.default; -},{}],121:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=n;var e=require("css-in-js-utils/lib/isPrefixedValue"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}var i=["-webkit-","-moz-",""],a=/linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/;function n(e,r){if("string"==typeof r&&!(0,t.default)(r)&&a.test(r))return i.map(function(e){return e+r})}module.exports=exports.default; -},{"css-in-js-utils/lib/isPrefixedValue":132}],122:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("css-in-js-utils/lib/isPrefixedValue"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}var i=["-webkit-",""];function u(e,r){if("string"==typeof r&&!(0,t.default)(r)&&r.indexOf("image-set(")>-1)return i.map(function(e){return r.replace(/image-set\(/g,e+"image-set(")})}module.exports=exports.default; -},{"css-in-js-utils/lib/isPrefixedValue":132}],123:[function(require,module,exports) { -"use strict";function e(e,t){if("position"===e&&"sticky"===t)return["-webkit-sticky","sticky"]}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=e,module.exports=exports.default; -},{}],127:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=i;var t=["-webkit-","-moz-",""],e={maxHeight:!0,maxWidth:!0,width:!0,height:!0,columnWidth:!0,minWidth:!0,minHeight:!0},n={"min-content":!0,"max-content":!0,"fill-available":!0,"fit-content":!0,"contain-floats":!0};function i(i,o){if(e.hasOwnProperty(i)&&n.hasOwnProperty(o))return t.map(function(t){return t+o})}module.exports=exports.default; -},{}],144:[function(require,module,exports) { -"use strict";var e=/[A-Z]/g,r=/^ms-/,s={};function t(t){return t in s?s[t]:s[t]=t.replace(e,"-$&").toLowerCase().replace(r,"-ms-")}module.exports=t; -},{}],141:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("hyphenate-style-name"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}function u(e){return(0,t.default)(e)}module.exports=exports.default; -},{"hyphenate-style-name":144}],140:[function(require,module,exports) { -"use strict";function e(e){return e.charAt(0).toUpperCase()+e.slice(1)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=e,module.exports=exports.default; -},{}],125:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=l;var t=require("css-in-js-utils/lib/hyphenateProperty"),e=s(t),r=require("css-in-js-utils/lib/isPrefixedValue"),i=s(r),n=require("../../utils/capitalizeString"),o=s(n);function s(t){return t&&t.__esModule?t:{default:t}}var u={transition:!0,transitionProperty:!0,WebkitTransition:!0,WebkitTransitionProperty:!0,MozTransition:!0,MozTransitionProperty:!0},a={Webkit:"-webkit-",Moz:"-moz-",ms:"-ms-"};function f(t,r){if((0,i.default)(t))return t;for(var n=t.split(/,(?![^()]*(?:\([^()]*\))?\))/g),o=0,s=n.length;o-1&&"order"!==p)for(var d=r[l],c=0,b=d.length;c-1)return s;var a=n.split(/,(?![^()]*(?:\([^()]*\))?\))/g).filter(function(t){return!/-webkit-|-ms-/.test(t)}).join(",");return t.indexOf("Moz")>-1?a:(r["Webkit"+(0,o.default)(t)]=s,r["Moz"+(0,o.default)(t)]=a,n)}}module.exports=exports.default; -},{"css-in-js-utils/lib/hyphenateProperty":141,"css-in-js-utils/lib/isPrefixedValue":132,"../../utils/capitalizeString":140}],130:[function(require,module,exports) { -"use strict";function r(r){for(var t=5381,e=r.length;e;)t=33*t^r.charCodeAt(--e);return t>>>0}module.exports=r; -},{}],136:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("./capitalizeString"),r=t(e);function t(e){return e&&e.__esModule?e:{default:e}}function u(e,t,u){if(e.hasOwnProperty(t)){for(var o={},a=e[t],n=(0,r.default)(t),f=Object.keys(u),l=0;l0&&(i[s]=d)}else{var x=(0,u.default)(l,s,n,i,t);x&&(i[s]=x),i=(0,r.default)(t,s,i)}}return i}}module.exports=exports.default; -},{"../utils/prefixProperty":136,"../utils/prefixValue":137,"../utils/addNewValuesOnly":138,"../utils/isObject":139}],133:[function(require,module,exports) { -var global = arguments[3]; -var e=arguments[3];function t(e){r.length||(n(),a=!0),r[r.length]=e}module.exports=t;var n,r=[],a=!1,o=0,u=1024;function l(){for(;ou){for(var t=0,n=r.length-o;t4&&void 0!==arguments[4]?arguments[4]:[];if(!pe[e]){var o=ne(t,r,i,ye,n);he(e,o)}},Se=function(){de=[],pe={},me=!1,fe=null},ve=function(){return de},xe=function(){if(me)throw new Error("Cannot buffer while already buffering");me=!0},be=function(){me=!1;var e=de;return de=[],e},ke=function(){return be().join("")},Oe=function(){var e=be();e.length>0&&ce(e)},we=function(){return Object.keys(pe)},Ae=function(e){e.forEach(function(e){pe[e]=!0})},Ce=function e(t,r,n,i){for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:[];Ae(e)}}()},Me="undefined"!=typeof window?null:{renderStatic:function(){return function(e){return Se(),xe(),{html:e(),css:{content:ke(),renderedClassNames:we()}}}}()},qe=null;function Fe(e,t){return{StyleSheet:Object.assign({},Re,{extend:function(){return function(r){var n=r.map(function(e){return e.selectorHandler}).filter(function(e){return e});return Fe(e,t.concat(n))}}()}),StyleSheetServer:Me,StyleSheetTestUtils:qe,minify:function(){return function(e){Ie=e?V:Te}}(),css:function(){return function(){for(var r=arguments.length,n=Array(r),i=0;i{this.viewport=e||null}),this.pendingScroll=0,this.onWindowResize=(()=>{this.recomputeVisibleIndices(this.props)}),this.onViewportScroll=(e=>{this.recomputeVisibleIndices(this.props)}),this.state={firstVisibleIndex:null,lastVisibleIndex:null,invisiblePrefixSize:null,viewportSize:null,cachedTotalSize:e.items.reduce((e,i)=>e+i.size,0)}}recomputeVisibleIndices(e){if(!this.viewport)return;const{items:i}=e,t=this.viewport.getBoundingClientRect().height,s=this.viewport.scrollTop-t/4,o=this.viewport.scrollTop+t+t/4;let l=0,r=0,n=0;for(;n=s)break}const p=n;for(;n=o)break}const c=Math.min(n,i.length-1);this.setState({invisiblePrefixSize:r,firstVisibleIndex:p,lastVisibleIndex:c})}scrollIndexIntoView(e){this.pendingScroll=this.props.items.reduce((i,t,s)=>s>=e?i:i+t.size,0)}applyPendingScroll(){if(!this.viewport)return;const e="y"===this.props.axis?"top":"left";this.viewport.scrollTo({[e]:this.pendingScroll})}componentWillReceiveProps(e){this.props.items!==e.items&&this.recomputeVisibleIndices(e)}componentDidMount(){this.applyPendingScroll(),this.recomputeVisibleIndices(this.props),window.addEventListener("resize",this.onWindowResize)}componentWillUnmount(){window.removeEventListener("resize",this.onWindowResize)}render(){const{cachedTotalSize:i,firstVisibleIndex:t,lastVisibleIndex:s,invisiblePrefixSize:o}=this.state;return(0,e.h)("div",{className:this.props.className,ref:this.viewportRef,onScroll:this.onViewportScroll},(0,e.h)("div",{style:{height:i}},(0,e.h)("div",{style:{transform:`translateY(${o}px)`}},null!=t&&null!=s&&this.props.renderItems(t,s))))}}exports.ScrollableListView=i; -},{"preact":24}],106:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0});class t{constructor(t){this.data=t,this.prev=null,this.next=null}}class e{constructor(){this.head=null,this.tail=null,this.size=0}getHead(){return this.head}getTail(){return this.tail}getSize(){return this.size}append(t){this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this.size++}prepend(t){return this.head?(this.head.prev=t,t.next=this.head,this.head=t):this.head=this.tail=t,this.size++,t}pop(){if(this.tail){const t=this.tail;return t.prev?(this.tail=t.prev,this.tail.next=null):this.head=this.tail=null,this.size--,t.prev=null,t}return null}dequeue(){if(this.head){const t=this.head;return t.next?(this.head=t.next,this.head.prev=null):this.head=this.tail=null,this.size--,t.next=null,t}return null}remove(t){null==t.prev?this.dequeue():null==t.next?this.pop():(t.next.prev=t.prev,t.prev.next=t.next,t.next=null,t.prev=null,this.size--)}}exports.List=e;class i{constructor(t){this.capacity=t,this.list=new e,this.map=new Map}has(t){return this.map.has(t)}get(t){const e=this.map.get(t);return e?(this.list.remove(e.listNode),this.list.prepend(e.listNode),e?e.value:null):null}getSize(){return this.list.getSize()}getCapacity(){return this.capacity}insert(e,i){const s=this.map.get(e);for(s&&this.list.remove(s.listNode);this.list.getSize()>=this.capacity;)this.map.delete(this.list.pop().data);const h=this.list.prepend(new t(e));this.map.set(e,{value:i,listNode:h})}getOrInsert(t,e){let i=this.get(t);return null==i&&(i=e(t),this.insert(t,i)),i}removeLRU(){const t=this.list.pop();if(!t)return null;const e=t.data,i=this.map.get(e).value;return this.map.delete(e),[e,i]}clear(){this.list=new e,this.map=new Map}}exports.LRUCache=i; -},{}],94:[function(require,module,exports) { - -var t,e,n=module.exports={};function r(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function i(e){if(t===setTimeout)return setTimeout(e,0);if((t===r||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}function u(t){if(e===clearTimeout)return clearTimeout(t);if((e===o||!e)&&clearTimeout)return e=clearTimeout,clearTimeout(t);try{return e(t)}catch(n){try{return e.call(null,t)}catch(n){return e.call(this,t)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:r}catch(e){t=r}try{e="function"==typeof clearTimeout?clearTimeout:o}catch(t){e=o}}();var c,s=[],l=!1,a=-1;function f(){l&&c&&(l=!1,c.length?s=c.concat(s):a=-1,s.length&&h())}function h(){if(!l){var t=i(f);l=!0;for(var e=s.length;e;){for(c=s,s=[];++a1)for(var n=1;n=0&&e<=31),t.TEXTURE0+e}var h=exports.Graphics=void 0;!function(t){t.Rect=class{constructor(t=0,e=0,i=0,r=0){this.x=t,this.y=e,this.width=i,this.height=r}set(t,e,i,r){this.x=t,this.y=e,this.width=i,this.height=r}equals(t){return this.x===t.x&&this.y===t.y&&this.width===t.width&&this.height===t.height}};class e{constructor(t,e,i,r){this.redF=t,this.greenF=e,this.blueF=i,this.alphaF=r}}let i,r,s,n,h;e.TRANSPARENT=new e(0,0,0,0),t.Color=e,function(t){t[t.ZERO=0]="ZERO",t[t.ONE=1]="ONE",t[t.SOURCE_COLOR=2]="SOURCE_COLOR",t[t.TARGET_COLOR=3]="TARGET_COLOR",t[t.INVERSE_SOURCE_COLOR=4]="INVERSE_SOURCE_COLOR",t[t.INVERSE_TARGET_COLOR=5]="INVERSE_TARGET_COLOR",t[t.SOURCE_ALPHA=6]="SOURCE_ALPHA",t[t.TARGET_ALPHA=7]="TARGET_ALPHA",t[t.INVERSE_SOURCE_ALPHA=8]="INVERSE_SOURCE_ALPHA",t[t.INVERSE_TARGET_ALPHA=9]="INVERSE_TARGET_ALPHA",t[t.CONSTANT=10]="CONSTANT",t[t.INVERSE_CONSTANT=11]="INVERSE_CONSTANT"}(i=t.BlendOperation||(t.BlendOperation={})),function(t){t[t.TRIANGLES=0]="TRIANGLES",t[t.TRIANGLE_STRIP=1]="TRIANGLE_STRIP"}(r=t.Primitive||(t.Primitive={}));function a(t){return t==s.FLOAT?4:1}t.Context=class{setCopyBlendState(){this.setBlendState(i.ONE,i.ZERO)}setAddBlendState(){this.setBlendState(i.ONE,i.ONE)}setPremultipliedBlendState(){this.setBlendState(i.ONE,i.INVERSE_SOURCE_ALPHA)}setUnpremultipliedBlendState(){this.setBlendState(i.SOURCE_ALPHA,i.INVERSE_SOURCE_ALPHA)}},function(t){t[t.FLOAT=0]="FLOAT",t[t.BYTE=1]="BYTE"}(s=t.AttributeType||(t.AttributeType={})),t.attributeByteLength=a;class _{constructor(t,e,i,r){this.name=t,this.type=e,this.count=i,this.byteOffset=r}}t.Attribute=_;t.VertexFormat=class{constructor(){this._attributes=[],this._stride=0}get attributes(){return this._attributes}get stride(){return this._stride}add(t,e,i){return this.attributes.push(new _(t,e,i,this.stride)),this._stride+=i*a(e),this}};t.VertexBuffer=class{uploadFloat32Array(t){this.upload(new Uint8Array(t.buffer),0)}uploadFloats(t){this.uploadFloat32Array(new Float32Array(t))}},function(t){t[t.NEAREST=0]="NEAREST",t[t.LINEAR=1]="LINEAR"}(n=t.PixelFilter||(t.PixelFilter={})),function(t){t[t.REPEAT=0]="REPEAT",t[t.CLAMP=1]="CLAMP"}(h=t.PixelWrap||(t.PixelWrap={}));class o{constructor(t,e,i){this.minFilter=t,this.magFilter=e,this.wrap=i}}o.LINEAR_CLAMP=new o(n.LINEAR,n.LINEAR,h.CLAMP),o.LINEAR_MIN_NEAREST_MAG_CLAMP=new o(n.LINEAR,n.NEAREST,h.CLAMP),o.NEAREST_CLAMP=new o(n.NEAREST,n.NEAREST,h.CLAMP),t.TextureFormat=o}(h||(exports.Graphics=h={}));var a=exports.WebGL=void 0;!function(t){class a extends h.Context{constructor(t=document.createElement("canvas")){super(),this._attributeCount=0,this._blendOperations=0,this._contextResetHandlers=[],this._currentClearColor=h.Color.TRANSPARENT,this._currentRenderTarget=null,this._defaultViewport=new h.Rect,this._forceStateUpdate=!0,this._generation=1,this._height=0,this._oldBlendOperations=0,this._oldRenderTarget=null,this._oldViewport=new h.Rect,this._width=0,this.handleWebglContextRestored=(()=>{this._attributeCount=0,this._currentClearColor=h.Color.TRANSPARENT,this._forceStateUpdate=!0,this._generation++;for(let t of this._contextResetHandlers)t()}),this.ANGLE_instanced_arrays=null,this.ANGLE_instanced_arrays_generation=-1;let e=t.getContext("webgl",{alpha:!1,antialias:!1,depth:!1,preserveDrawingBuffer:!1,stencil:!1});if(null==e)throw new Error("Setup failure");this._gl=e;let i=t.style;t.width=0,t.height=0,i.width=i.height="0",t.addEventListener("webglcontextlost",t=>{t.preventDefault()}),t.addEventListener("webglcontextrestored",this.handleWebglContextRestored),this._blendOperationMap={[h.BlendOperation.ZERO]:this._gl.ZERO,[h.BlendOperation.ONE]:this._gl.ONE,[h.BlendOperation.SOURCE_COLOR]:this._gl.SRC_COLOR,[h.BlendOperation.TARGET_COLOR]:this._gl.DST_COLOR,[h.BlendOperation.INVERSE_SOURCE_COLOR]:this._gl.ONE_MINUS_SRC_COLOR,[h.BlendOperation.INVERSE_TARGET_COLOR]:this._gl.ONE_MINUS_DST_COLOR,[h.BlendOperation.SOURCE_ALPHA]:this._gl.SRC_ALPHA,[h.BlendOperation.TARGET_ALPHA]:this._gl.DST_ALPHA,[h.BlendOperation.INVERSE_SOURCE_ALPHA]:this._gl.ONE_MINUS_SRC_ALPHA,[h.BlendOperation.INVERSE_TARGET_ALPHA]:this._gl.ONE_MINUS_DST_ALPHA,[h.BlendOperation.CONSTANT]:this._gl.CONSTANT_COLOR,[h.BlendOperation.INVERSE_CONSTANT]:this._gl.ONE_MINUS_CONSTANT_COLOR}}get widthInPixels(){return this._width}get heightInPixels(){return this._height}testContextLoss(){this.handleWebglContextRestored()}get gl(){return this._gl}get generation(){return this._generation}addContextResetHandler(t){r(this._contextResetHandlers,t)}removeContextResetHandler(t){s(this._contextResetHandlers,t)}get currentRenderTarget(){return this._currentRenderTarget}beginFrame(){this.setRenderTarget(null)}endFrame(){}setBlendState(t,e){this._blendOperations=a._packBlendModes(t,e)}setViewport(t,e,i,r){(null!=this._currentRenderTarget?this._currentRenderTarget.viewport:this._defaultViewport).set(t,e,i,r)}get viewport(){return null!=this._currentRenderTarget?this._currentRenderTarget.viewport:this._defaultViewport}get renderTargetWidthInPixels(){return null!=this._currentRenderTarget?this._currentRenderTarget.viewport.width:this._width}get renderTargetHeightInPixels(){return null!=this._currentRenderTarget?this._currentRenderTarget.viewport.height:this._height}draw(t,e,i){this._updateRenderTargetAndViewport(),f.from(e).prepare(),R.from(i).prepare(),this._updateFormat(e.format),this._updateBlendState(),this._gl.drawArrays(t==h.Primitive.TRIANGLES?this._gl.TRIANGLES:this._gl.TRIANGLE_STRIP,0,Math.floor(i.byteCount/e.format.stride)),this._forceStateUpdate=!1}resize(t,e,i,r){const s=this._gl.canvas.getBoundingClientRect();if(this._width===i&&this._height===e&&s.width===i&&s.height===r)return;let n=this._gl.canvas,h=n.style;n.width=t,n.height=e,h.width=`${i}px`,h.height=`${r}px`,this.setViewport(0,0,t,e),this._width=t,this._height=e}clear(t){this._updateRenderTargetAndViewport(),this._updateBlendState(),t!=this._currentClearColor&&(this._gl.clearColor(t.redF,t.greenF,t.blueF,t.alphaF),this._currentClearColor=t),this._gl.clear(this._gl.COLOR_BUFFER_BIT)}setRenderTarget(t){this._currentRenderTarget=A.from(t)}createMaterial(t,e,i){let r=new f(this,t,e,i);return r.program,r}createVertexBuffer(t){return i(t>0&&t%4==0),new R(this,t)}createTexture(t,e,i,r){return new p(this,t,e,i,r)}createRenderTarget(t){return new A(this,p.from(t))}getANGLE_instanced_arrays(){if(this.ANGLE_instanced_arrays_generation!==this._generation&&(this.ANGLE_instanced_arrays=null),!this.ANGLE_instanced_arrays&&(this.ANGLE_instanced_arrays=this.gl.getExtension("ANGLE_instanced_arrays"),!this.ANGLE_instanced_arrays))throw new Error("Failed to get extension ANGLE_instanced_arrays");return this.ANGLE_instanced_arrays}_updateRenderTargetAndViewport(){let t=this._currentRenderTarget,e=null!=t?t.viewport:this._defaultViewport,i=this._gl;(this._forceStateUpdate||this._oldRenderTarget!=t)&&(i.bindFramebuffer(i.FRAMEBUFFER,t?t.framebuffer:null),this._oldRenderTarget=t),!this._forceStateUpdate&&this._oldViewport.equals(e)||(i.viewport(e.x,this.renderTargetHeightInPixels-e.y-e.height,e.width,e.height),this._oldViewport.set(e.x,e.y,e.width,e.height))}_updateBlendState(){if(this._forceStateUpdate||this._oldBlendOperations!=this._blendOperations){let t=this._gl,e=this._blendOperations,r=this._oldBlendOperations,s=15&e,n=e>>4;i(s in this._blendOperationMap),i(n in this._blendOperationMap),e==a.COPY_BLEND_OPERATIONS?t.disable(t.BLEND):((this._forceStateUpdate||r==a.COPY_BLEND_OPERATIONS)&&t.enable(t.BLEND),t.blendFunc(this._blendOperationMap[s],this._blendOperationMap[n])),this._oldBlendOperations=e}}_updateFormat(t){let e=this._gl,i=t.attributes,r=i.length;for(let s=0;sr;)this._attributeCount--,e.disableVertexAttribArray(this._attributeCount);this._attributeCount=r}getWebGLInfo(){const t=this.gl.getExtension("WEBGL_debug_renderer_info");return{renderer:t?this.gl.getParameter(t.UNMASKED_RENDERER_WEBGL):null,vendor:t?this.gl.getParameter(t.UNMASKED_VENDOR_WEBGL):null,version:this.gl.getParameter(this.gl.VERSION)}}static from(t){return i(null==t||t instanceof a),t}static _packBlendModes(t,e){return t|e<<4}}a.COPY_BLEND_OPERATIONS=a._packBlendModes(h.BlendOperation.ONE,h.BlendOperation.ZERO),t.Context=a;class _{constructor(t,e,i=0,r=null,s=!0){this._material=t,this._name=e,this._generation=i,this._location=r,this._isDirty=s}get location(){let t=a.from(this._material.context);if(this._generation!=t.generation&&(this._location=t.gl.getUniformLocation(this._material.program,this._name),this._generation=t.generation,!e)){let e=this._material.program,r=t.gl;for(let t=0,s=r.getProgramParameter(e,r.ACTIVE_UNIFORMS);t0&&this._texture.height>0?this._texture.texture:null)}}class f{constructor(t,e,i,r,s={},n=[],h=0,a=null){this._context=t,this._format=e,this._vertexSource=i,this._fragmentSource=r,this._uniformsMap=s,this._uniformsList=n,this._generation=h,this._program=a}get context(){return this._context}get format(){return this._format}get vertexSource(){return this._vertexSource}get fragmentSource(){return this._fragmentSource}setUniformFloat(t,e){let r=this._uniformsMap[t]||null;null==r&&(r=new o(this,t),this._uniformsMap[t]=r,this._uniformsList.push(r)),i(r instanceof o),r.set(e)}setUniformInt(t,e){let r=this._uniformsMap[t]||null;null==r&&(r=new l(this,t),this._uniformsMap[t]=r,this._uniformsList.push(r)),i(r instanceof l),r.set(e)}setUniformVec2(t,e,r){let s=this._uniformsMap[t]||null;null==s&&(s=new u(this,t),this._uniformsMap[t]=s,this._uniformsList.push(s)),i(s instanceof u),s.set(e,r)}setUniformVec3(t,e,r,s){let n=this._uniformsMap[t]||null;null==n&&(n=new c(this,t),this._uniformsMap[t]=n,this._uniformsList.push(n)),i(n instanceof c),n.set(e,r,s)}setUniformVec4(t,e,r,s,n){let h=this._uniformsMap[t]||null;null==h&&(h=new d(this,t),this._uniformsMap[t]=h,this._uniformsList.push(h)),i(h instanceof d),h.set(e,r,s,n)}setUniformMat3(t,e,r,s,n,h,a,_,o,l){let u=this._uniformsMap[t]||null;null==u&&(u=new g(this,t),this._uniformsMap[t]=u,this._uniformsList.push(u)),i(u instanceof g),u.set(e,r,s,n,h,a,_,o,l)}setUniformSampler(t,e,r){let s=this._uniformsMap[t]||null;null==s&&(s=new E(this,t),this._uniformsMap[t]=s,this._uniformsList.push(s)),i(s instanceof E),s.set(e,r)}get program(){let t=this._context.gl;if(this._generation!=this._context.generation){this._program=t.createProgram(),this._compileShader(t,t.VERTEX_SHADER,this.vertexSource),this._compileShader(t,t.FRAGMENT_SHADER,this.fragmentSource);let r=this.format.attributes;for(let e=0;e=0),i(0<=t&&t+r<=this._byteCount),i(0<=e&&e+r<=this._byteCount),this._bytes&&t!=e&&0!=r&&(this._bytes.set(this._bytes.subarray(t,this._byteCount),e),this._growDirtyRegion(Math.min(t,e),Math.max(t,e)+r))}upload(t,e=0){i(0<=e&&e+t.length<=this._byteCount),i(null!=this._bytes),this._bytes.set(t,e),this._growDirtyRegion(e,e+t.length)}free(){this._buffer&&this._context.gl.deleteBuffer(this._buffer),this._generation=0}prepare(){let t=this._context.gl;this._generation!==this._context.generation&&(this._buffer=t.createBuffer(),this._generation=this._context.generation,this._isDirty=!0),t.bindBuffer(t.ARRAY_BUFFER,this._buffer),this._isDirty&&(t.bufferData(t.ARRAY_BUFFER,this._byteCount,t.DYNAMIC_DRAW),this._dirtyMin=this._totalMin,this._dirtyMax=this._totalMax,this._isDirty=!1),this._dirtyMin{const t=e.AffineTransform.betweenRects(i.configSpaceSrcRect,i.physicalSpaceDstRect),r=new e.Vec2(this.gl.viewport.width,this.gl.viewport.height);return e.AffineTransform.withTranslation(new e.Vec2(-1,1)).times(e.AffineTransform.withScale(new e.Vec2(2,-2).dividedByPointwise(r))).times(t)})()),this.gl.setUnpremultipliedBlendState(),this.gl.draw(t.Graphics.Primitive.TRIANGLES,this.material,i.batch.getBuffer())}}exports.RectangleBatchRenderer=c; -},{"../lib/math":97,"./graphics":42,"./utils":107}],66:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Color=void 0;var t=require("./math");class r{constructor(t=0,r=0,e=0,o=1){this.r=t,this.g=r,this.b=e,this.a=o}static fromLumaChromaHue(e,o,s){const i=s/60,a=o*(1-Math.abs(i%2-1)),[h,c,u]=i<1?[o,a,0]:i<2?[a,o,0]:i<3?[0,o,a]:i<4?[0,a,o]:i<5?[a,0,o]:[o,0,a],l=e-(.3*h+.59*c+.11*u);return new r((0,t.clamp)(h+l,0,1),(0,t.clamp)(c+l,0,1),(0,t.clamp)(u+l,0,1),1)}toCSS(){return`rgba(${(255*this.r).toFixed()}, ${(255*this.g).toFixed()}, ${(255*this.b).toFixed()}, ${this.a.toFixed(2)})`}}exports.Color=r; -},{"./math":97}],62:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.RowAtlas=void 0;var e=require("../lib/lru-cache"),t=require("./rectangle-batch-renderer"),r=require("../lib/math"),i=require("../lib/color"),c=require("./graphics"),h=require("./utils");class a{constructor(h,a,s){this.gl=h,this.rectangleBatchRenderer=a,this.textureRenderer=s,this.texture=h.createTexture(c.Graphics.TextureFormat.NEAREST_CLAMP,4096,4096),this.renderTarget=h.createRenderTarget(this.texture),this.rowCache=new e.LRUCache(this.texture.height),this.clearLineBatch=new t.RectangleBatch(h),this.clearLineBatch.addRect(r.Rect.unit,new i.Color(0,0,0,0)),h.addContextResetHandler(()=>{this.rowCache.clear()})}has(e){return this.rowCache.has(e)}getResolution(){return this.texture.width}getCapacity(){return this.texture.height}allocateLine(e){if(this.rowCache.getSize(){for(let i of e){let e=this.rowCache.get(i);if(null!=e)continue;e=this.allocateLine(i);const c=new r.Rect(new r.Vec2(0,e),new r.Vec2(this.texture.width,1));this.rectangleBatchRenderer.render({batch:this.clearLineBatch,configSpaceSrcRect:r.Rect.unit,physicalSpaceDstRect:c}),t(c,i)}})}renderViaAtlas(e,t){let i=this.rowCache.get(e);if(null==i)return!1;const c=new r.Rect(new r.Vec2(0,i),new r.Vec2(this.texture.width,1));return this.textureRenderer.render({texture:this.texture,srcRect:c,dstRect:t}),!0}}exports.RowAtlas=a; -},{"../lib/lru-cache":106,"./rectangle-batch-renderer":102,"../lib/math":97,"../lib/color":66,"./graphics":42,"./utils":107}],103:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.TextureRenderer=void 0;var e=require("../lib/math"),t=require("./graphics"),r=require("./utils");const n="\n uniform mat3 uvTransform;\n uniform mat3 positionTransform;\n\n attribute vec2 position;\n attribute vec2 uv;\n varying vec2 vUv;\n\n void main() {\n vUv = (uvTransform * vec3(uv, 1)).xy;\n gl_Position = vec4((positionTransform * vec3(position, 1)).xy, 0, 1);\n }\n",i="\n precision mediump float;\n\n varying vec2 vUv;\n uniform sampler2D texture;\n\n void main() {\n gl_FragColor = texture2D(texture, vUv);\n }\n";class s{constructor(e){this.gl=e;const r=new t.Graphics.VertexFormat;r.add("position",t.Graphics.AttributeType.FLOAT,2),r.add("uv",t.Graphics.AttributeType.FLOAT,2);const s=[{pos:[-1,1],uv:[0,1]},{pos:[1,1],uv:[1,1]},{pos:[-1,-1],uv:[0,0]},{pos:[1,-1],uv:[1,0]}],o=[];for(let e of s)o.push(e.pos[0]),o.push(e.pos[1]),o.push(e.uv[0]),o.push(e.uv[1]);this.buffer=e.createVertexBuffer(r.stride*s.length),this.buffer.upload(new Uint8Array(new Float32Array(o).buffer)),this.material=e.createMaterial(r,n,i)}render(n){this.material.setUniformSampler("texture",n.texture,0),(0,r.setUniformAffineTransform)(this.material,"uvTransform",(()=>{const{srcRect:t,texture:r}=n,i=e.AffineTransform.withTranslation(new e.Vec2(0,1)).times(e.AffineTransform.withScale(new e.Vec2(1,-1))).times(e.AffineTransform.betweenRects(new e.Rect(e.Vec2.zero,new e.Vec2(r.width,r.height)),e.Rect.unit)).transformRect(t);return e.AffineTransform.betweenRects(e.Rect.unit,i)})()),(0,r.setUniformAffineTransform)(this.material,"positionTransform",(()=>{const{dstRect:t}=n,{viewport:r}=this.gl,i=new e.Vec2(r.width,r.height),s=e.AffineTransform.withScale(new e.Vec2(1,-1)).times(e.AffineTransform.betweenRects(new e.Rect(e.Vec2.zero,i),e.Rect.NDC)).transformRect(t);return e.AffineTransform.betweenRects(e.Rect.NDC,s)})()),this.gl.setUnpremultipliedBlendState(),this.gl.draw(t.Graphics.Primitive.TRIANGLE_STRIP,this.material,this.buffer)}}exports.TextureRenderer=s; -},{"../lib/math":97,"./graphics":42,"./utils":107}],104:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ViewportRectangleRenderer=void 0;var e=require("./graphics"),i=require("./utils");const r=new e.Graphics.VertexFormat;r.add("position",e.Graphics.AttributeType.FLOAT,2);const o="\n attribute vec2 position;\n\n void main() {\n gl_Position = vec4(position, 0, 1);\n }\n",n="\n precision mediump float;\n\n uniform mat3 configSpaceToPhysicalViewSpace;\n uniform vec2 physicalSize;\n uniform vec2 physicalOrigin;\n uniform vec2 configSpaceViewportOrigin;\n uniform vec2 configSpaceViewportSize;\n uniform float framebufferHeight;\n\n void main() {\n vec2 origin = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportOrigin, 1.0)).xy;\n vec2 size = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportSize, 0.0)).xy;\n\n vec2 halfSize = physicalSize / 2.0;\n\n float borderWidth = 2.0;\n\n origin = floor(origin * halfSize) / halfSize + borderWidth * vec2(1.0, 1.0);\n size = floor(size * halfSize) / halfSize - 2.0 * borderWidth * vec2(1.0, 1.0);\n\n vec2 coord = gl_FragCoord.xy;\n coord.x = coord.x - physicalOrigin.x;\n coord.y = framebufferHeight - coord.y - physicalOrigin.y;\n vec2 clamped = clamp(coord, origin, origin + size);\n vec2 gap = clamped - coord;\n float maxdist = max(abs(gap.x), abs(gap.y));\n\n // TOOD(jlfwong): Could probably optimize this to use mix somehow.\n if (maxdist == 0.0) {\n // Inside viewport rectangle\n gl_FragColor = vec4(0, 0, 0, 0);\n } else if (maxdist < borderWidth) {\n // Inside viewport rectangle at border\n gl_FragColor = vec4(0.7, 0.7, 0.7, 0.8);\n } else {\n // Outside viewport rectangle\n gl_FragColor = vec4(0.7, 0.7, 0.7, 0.5);\n }\n }\n";class t{constructor(e){this.gl=e;const i=[[-1,1],[1,1],[-1,-1],[1,-1]],t=[];for(let e of i)t.push(e[0]),t.push(e[1]);this.buffer=e.createVertexBuffer(r.stride*i.length),this.buffer.upload(new Uint8Array(new Float32Array(t).buffer)),this.material=e.createMaterial(r,o,n)}render(r){(0,i.setUniformAffineTransform)(this.material,"configSpaceToPhysicalViewSpace",r.configSpaceToPhysicalViewSpace),(0,i.setUniformVec2)(this.material,"configSpaceViewportOrigin",r.configSpaceViewportRect.origin),(0,i.setUniformVec2)(this.material,"configSpaceViewportSize",r.configSpaceViewportRect.size);const o=this.gl.viewport;this.material.setUniformVec2("physicalOrigin",o.x,o.y),this.material.setUniformVec2("physicalSize",o.width,o.height),this.material.setUniformFloat("framebufferHeight",this.gl.renderTargetHeightInPixels),this.gl.setBlendState(e.Graphics.BlendOperation.SOURCE_ALPHA,e.Graphics.BlendOperation.INVERSE_SOURCE_ALPHA),this.gl.draw(e.Graphics.Primitive.TRIANGLE_STRIP,this.material,this.buffer)}}exports.ViewportRectangleRenderer=t; -},{"./graphics":42,"./utils":107}],105:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlamechartColorPassRenderer=void 0;var e=require("../lib/math"),t=require("./graphics"),n=require("./utils");const r=new t.Graphics.VertexFormat;r.add("position",t.Graphics.AttributeType.FLOAT,2),r.add("uv",t.Graphics.AttributeType.FLOAT,2);const i="\n uniform mat3 uvTransform;\n uniform mat3 positionTransform;\n\n attribute vec2 position;\n attribute vec2 uv;\n varying vec2 vUv;\n\n void main() {\n vUv = (uvTransform * vec3(uv, 1)).xy;\n gl_Position = vec4((positionTransform * vec3(position, 1)).xy, 0, 1);\n }\n",o="\n precision mediump float;\n\n uniform vec2 uvSpacePixelSize;\n uniform float renderOutlines;\n\n varying vec2 vUv;\n uniform sampler2D colorTexture;\n\n // https://en.wikipedia.org/wiki/HSL_and_HSV#From_luma/chroma/hue\n vec3 hcl2rgb(float H, float C, float L) {\n float hPrime = H / 60.0;\n float X = C * (1.0 - abs(mod(hPrime, 2.0) - 1.0));\n vec3 RGB =\n hPrime < 1.0 ? vec3(C, X, 0) :\n hPrime < 2.0 ? vec3(X, C, 0) :\n hPrime < 3.0 ? vec3(0, C, X) :\n hPrime < 4.0 ? vec3(0, X, C) :\n hPrime < 5.0 ? vec3(X, 0, C) :\n vec3(C, 0, X);\n\n float m = L - dot(RGB, vec3(0.30, 0.59, 0.11));\n return RGB + vec3(m, m, m);\n }\n\n float triangle(float x) {\n return 2.0 * abs(fract(x) - 0.5) - 1.0;\n }\n\n vec3 colorForBucket(float t) {\n float x = triangle(30.0 * t);\n float H = 360.0 * (0.9 * t);\n float C = 0.25 + 0.2 * x;\n float L = 0.80 - 0.15 * x;\n return hcl2rgb(H, C, L);\n }\n\n void main() {\n vec4 here = texture2D(colorTexture, vUv);\n\n if (here.z == 0.0) {\n // Background color\n gl_FragColor = vec4(0, 0, 0, 0);\n return;\n }\n\n // Sample the 4 surrounding pixels in the depth texture to determine\n // if we should draw a boundary here or not.\n vec4 N = texture2D(colorTexture, vUv + vec2(0, uvSpacePixelSize.y));\n vec4 E = texture2D(colorTexture, vUv + vec2(uvSpacePixelSize.x, 0));\n vec4 S = texture2D(colorTexture, vUv + vec2(0, -uvSpacePixelSize.y));\n vec4 W = texture2D(colorTexture, vUv + vec2(-uvSpacePixelSize.x, 0));\n\n // NOTE: For outline checks, we intentionally check both the right\n // and the left to determine if we're an edge. If a rectangle is a single\n // pixel wide, we don't want to render it as an outline, so this method\n // of checking ensures that we don't outline single physical-space\n // pixel width rectangles.\n if (\n renderOutlines > 0.0 &&\n (\n here.y == N.y && here.y != S.y || // Top edge\n here.y == S.y && here.y != N.y || // Bottom edge\n here.x == E.x && here.x != W.x || // Left edge\n here.x == W.x && here.x != E.x\n )\n ) {\n // We're on an edge! Draw transparent.\n gl_FragColor = vec4(0, 0, 0, 0);\n } else {\n // Not on an edge. Draw the appropriate color.\n gl_FragColor = vec4(colorForBucket(here.z), here.a);\n }\n }\n";class a{constructor(e){this.gl=e;const t=[{pos:[-1,1],uv:[0,1]},{pos:[1,1],uv:[1,1]},{pos:[-1,-1],uv:[0,0]},{pos:[1,-1],uv:[1,0]}],n=[];for(let e of t)n.push(e.pos[0]),n.push(e.pos[1]),n.push(e.uv[0]),n.push(e.uv[1]);this.buffer=e.createVertexBuffer(r.stride*t.length),this.buffer.uploadFloats(n),this.material=e.createMaterial(r,i,o)}render(r){const{srcRect:i,rectInfoTexture:o}=r,a=e.AffineTransform.withTranslation(new e.Vec2(0,1)).times(e.AffineTransform.withScale(new e.Vec2(1,-1))).times(e.AffineTransform.betweenRects(new e.Rect(e.Vec2.zero,new e.Vec2(o.width,o.height)),e.Rect.unit)).transformRect(i),s=e.AffineTransform.betweenRects(e.Rect.unit,a),{dstRect:c}=r,l=new e.Vec2(this.gl.viewport.width,this.gl.viewport.height),u=e.AffineTransform.withScale(new e.Vec2(1,-1)).times(e.AffineTransform.betweenRects(new e.Rect(e.Vec2.zero,l),e.Rect.NDC)).transformRect(c),f=e.AffineTransform.betweenRects(e.Rect.NDC,u),h=e.Vec2.unit.dividedByPointwise(new e.Vec2(r.rectInfoTexture.width,r.rectInfoTexture.height));this.material.setUniformSampler("colorTexture",r.rectInfoTexture,0),(0,n.setUniformAffineTransform)(this.material,"uvTransform",s),this.material.setUniformFloat("renderOutlines",r.renderOutlines?1:0),this.material.setUniformVec2("uvSpacePixelSize",h.x,h.y),(0,n.setUniformAffineTransform)(this.material,"positionTransform",f),this.gl.setUnpremultipliedBlendState(),this.gl.draw(t.Graphics.Primitive.TRIANGLE_STRIP,this.material,this.buffer)}}exports.FlamechartColorPassRenderer=a; -},{"../lib/math":97,"./graphics":42,"./utils":107}],64:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CanvasContext=void 0;var e=require("./graphics"),r=require("./rectangle-batch-renderer"),t=require("./texture-renderer"),i=require("../lib/math"),n=require("./overlay-rectangle-renderer"),s=require("./flamechart-color-pass-renderer");class o{constructor(i){this.animationFrameRequest=null,this.beforeFrameHandlers=new Set,this.onBeforeFrame=(()=>{this.animationFrameRequest=null,this.gl.setViewport(0,0,this.gl.renderTargetWidthInPixels,this.gl.renderTargetHeightInPixels),this.gl.clear(new e.Graphics.Color(1,1,1,1));for(const e of this.beforeFrameHandlers)e()}),this.gl=new e.WebGL.Context(i),this.rectangleBatchRenderer=new r.RectangleBatchRenderer(this.gl),this.textureRenderer=new t.TextureRenderer(this.gl),this.viewportRectangleRenderer=new n.ViewportRectangleRenderer(this.gl),this.flamechartColorPassRenderer=new s.FlamechartColorPassRenderer(this.gl);const o=this.gl.getWebGLInfo();o&&console.log(`WebGL initialized. renderer: ${o.renderer}, vendor: ${o.vendor}, version: ${o.version}`),window.testContextLoss=(()=>{this.gl.testContextLoss()})}addBeforeFrameHandler(e){this.beforeFrameHandlers.add(e)}removeBeforeFrameHandler(e){this.beforeFrameHandlers.delete(e)}requestFrame(){this.animationFrameRequest||(this.animationFrameRequest=requestAnimationFrame(this.onBeforeFrame))}setViewport(e,r){const{origin:t,size:i}=e;let n=this.gl.viewport;this.gl.setViewport(t.x,t.y,i.x,i.y),r();let{x:s,y:o,width:a,height:l}=n;this.gl.setViewport(s,o,a,l)}renderBehind(e,r){const t=e.getBoundingClientRect(),n=new i.Rect(new i.Vec2(t.left*window.devicePixelRatio,t.top*window.devicePixelRatio),new i.Vec2(t.width*window.devicePixelRatio,t.height*window.devicePixelRatio));this.setViewport(n,r)}}exports.CanvasContext=o; -},{"./graphics":42,"./rectangle-batch-renderer":102,"./texture-renderer":103,"../lib/math":97,"./overlay-rectangle-renderer":104,"./flamechart-color-pass-renderer":105}],38:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getFrameToColorBucket=exports.getProfileToView=exports.getProfileWithRecursionFlattened=exports.getRowAtlas=exports.getCanvasContext=exports.createGetCSSColorForFrame=exports.createGetColorBucketForFrame=void 0;var e=require("../lib/utils"),t=require("../gl/row-atlas"),r=require("../gl/canvas-context"),o=require("../lib/color");const n=exports.createGetColorBucketForFrame=(0,e.memoizeByReference)(e=>t=>e.get(t.key)||0),a=exports.createGetCSSColorForFrame=(0,e.memoizeByReference)(t=>{const r=n(t);return t=>{const n=r(t)/255,a=(0,e.triangle)(30*n),l=.9*n*360,i=.25+.2*a,s=.8-.15*a;return o.Color.fromLumaChromaHue(s,i,l).toCSS()}}),l=exports.getCanvasContext=(0,e.memoizeByReference)(e=>new r.CanvasContext(e)),i=exports.getRowAtlas=(0,e.memoizeByReference)(e=>new t.RowAtlas(e.gl,e.rectangleBatchRenderer,e.textureRenderer)),s=exports.getProfileWithRecursionFlattened=(0,e.memoizeByReference)(e=>e.getProfileWithRecursionFlattened()),c=exports.getProfileToView=(0,e.memoizeByShallowEquality)(({profile:e,flattenRecursion:t})=>t?e.getProfileWithRecursionFlattened():e),u=exports.getFrameToColorBucket=(0,e.memoizeByReference)(e=>{const t=[];function r(e){return(e.file||"")+e.name}e.forEachFrame(e=>t.push(e)),t.sort(function(e,t){return r(e)>r(t)?1:-1});const o=new Map;for(let e=0;e{t.preventDefault();const{sortMethod:o}=this.props;if(o.field==e)this.props.setSortMethod({field:e,direction:o.direction===h.ASCENDING?h.DESCENDING:h.ASCENDING});else switch(e){case n.SYMBOL_NAME:this.props.setSortMethod({field:e,direction:h.ASCENDING});break;case n.SELF:case n.TOTAL:this.props.setSortMethod({field:e,direction:h.DESCENDING})}}),this.getFrameList=(()=>{const{profile:e,sortMethod:t}=this.props,r=[];switch(e.forEachFrame(e=>r.push(e)),t.field){case n.SYMBOL_NAME:(0,o.sortBy)(r,e=>e.name.toLowerCase());break;case n.SELF:(0,o.sortBy)(r,e=>e.getSelfWeight());break;case n.TOTAL:(0,o.sortBy)(r,e=>e.getTotalWeight())}return t.direction===h.DESCENDING&&r.reverse(),r}),this.listView=null,this.listViewRef=(e=>{if(e===this.listView)return;this.listView=e;const{selectedFrame:t}=this.props;if(!t||!e)return;const o=this.getFrameList().indexOf(t);-1!==o&&e.scrollIndexIntoView(o)})}renderRow(r,s){const{profile:l,selectedFrame:a}=this.props,c=r.getTotalWeight(),n=r.getSelfWeight(),h=100*c/l.getTotalNonIdleWeight(),p=100*n/l.getTotalNonIdleWeight(),S=r===a;return(0,e.h)("tr",{key:`${s}`,onClick:this.props.setSelectedFrame.bind(null,r),className:(0,t.css)(E.tableRow,s%2==0&&E.tableRowEven,S&&E.tableRowSelected)},(0,e.h)("td",{className:(0,t.css)(E.numericCell)},l.formatValue(c)," (",(0,o.formatPercent)(h),")",(0,e.h)(d,{perc:h})),(0,e.h)("td",{className:(0,t.css)(E.numericCell)},l.formatValue(n)," (",(0,o.formatPercent)(p),")",(0,e.h)(d,{perc:p})),(0,e.h)("td",{title:r.file,className:(0,t.css)(E.textCell)},(0,e.h)(i.ColorChit,{color:this.props.getCSSColorForFrame(r)}),r.name))}render(){const{sortMethod:o}=this.props,i=this.getFrameList(),l=i.map(e=>({size:r.Sizes.FRAME_HEIGHT}));return(0,e.h)("div",{className:(0,t.css)(r.commonStyle.vbox,E.profileTableView)},(0,e.h)("table",{className:(0,t.css)(E.tableView)},(0,e.h)("thead",{className:(0,t.css)(E.tableHeader)},(0,e.h)("tr",null,(0,e.h)("th",{className:(0,t.css)(E.numericCell),onClick:e=>this.onSortClick(n.TOTAL,e)},(0,e.h)(p,{activeDirection:o.field===n.TOTAL?o.direction:null}),"Total"),(0,e.h)("th",{className:(0,t.css)(E.numericCell),onClick:e=>this.onSortClick(n.SELF,e)},(0,e.h)(p,{activeDirection:o.field===n.SELF?o.direction:null}),"Self"),(0,e.h)("th",{className:(0,t.css)(E.textCell),onClick:e=>this.onSortClick(n.SYMBOL_NAME,e)},(0,e.h)(p,{activeDirection:o.field===n.SYMBOL_NAME?o.direction:null}),"Symbol Name")))),(0,e.h)(s.ScrollableListView,{ref:this.listViewRef,axis:"y",items:l,className:(0,t.css)(E.scrollView),renderItems:(o,r)=>{const s=[];for(let e=o;e<=r;e++)s.push(this.renderRow(i[e],e));return(0,e.h)("table",{className:(0,t.css)(E.tableView)},s)}}))}}exports.ProfileTableView=S;const E=t.StyleSheet.create({profileTableView:{background:r.Colors.WHITE,height:"100%"},scrollView:{overflowY:"auto",overflowX:"hidden"},tableView:{width:"100%",fontSize:r.FontSize.LABEL,background:r.Colors.WHITE},tableHeader:{borderBottom:`2px solid ${r.Colors.LIGHT_GRAY}`,textAlign:"left",color:r.Colors.GRAY,userSelect:"none"},sortIcon:{position:"relative",top:1,marginRight:r.Sizes.FRAME_HEIGHT/4},tableRow:{height:r.Sizes.FRAME_HEIGHT},tableRowEven:{background:r.Colors.OFF_WHITE},tableRowSelected:{background:r.Colors.DARK_BLUE,color:r.Colors.WHITE},numericCell:{textOverflow:"ellipsis",overflow:"hidden",whiteSpace:"nowrap",position:"relative",textAlign:"right",paddingRight:r.Sizes.FRAME_HEIGHT,width:6*r.Sizes.FRAME_HEIGHT,minWidth:6*r.Sizes.FRAME_HEIGHT},textCell:{textOverflow:"ellipsis",overflow:"hidden",whiteSpace:"nowrap",width:"100%",maxWidth:0},hBarDisplay:{position:"absolute",background:r.Colors.TRANSPARENT_GREEN,bottom:2,height:2,width:`calc(100% - ${2*r.Sizes.FRAME_HEIGHT}px)`,right:r.Sizes.FRAME_HEIGHT},hBarDisplayFilled:{height:"100%",position:"absolute",background:r.Colors.GREEN,right:0}}),m=exports.ProfileTableViewContainer=(0,a.createContainer)(S,(e,t,o)=>{const{activeProfileState:r}=o,{profile:i,sandwichViewState:s,index:a}=r;if(!i)throw new Error("profile missing");const{tableSortMethod:n}=e,{callerCallee:h}=s,d=h?h.selectedFrame:null,p=(0,c.getFrameToColorBucket)(i),S=(0,c.createGetCSSColorForFrame)(p);return{profile:i,profileIndex:r.index,selectedFrame:d,getCSSColorForFrame:S,sortMethod:n,setSelectedFrame:e=>{t(l.actions.sandwichView.setSelectedFrame({profileIndex:a,args:e}))},setSortMethod:e=>{t(l.actions.sandwichView.setTableSortMethod(e))}}}); -},{"preact":24,"aphrodite":76,"../lib/utils":60,"./style":78,"./color-chit":99,"./scrollable-list-view":100,"../store/actions":40,"../lib/typed-redux":36,"../store/getters":38}],29:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.canUseXHR=exports.ViewMode=void 0,exports.createApplicationStore=d;var e=require("./actions"),t=require("redux"),r=n(t),o=require("../lib/typed-redux"),s=require("../lib/hash-params"),i=require("./profiles-state"),a=require("../views/profile-table-view");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}var c=exports.ViewMode=void 0;!function(e){e[e.CHRONO_FLAME_CHART=0]="CHRONO_FLAME_CHART",e[e.LEFT_HEAVY_FLAME_GRAPH=1]="LEFT_HEAVY_FLAME_GRAPH",e[e.SANDWICH_VIEW=2]="SANDWICH_VIEW"}(c||(exports.ViewMode=c={}));const l=window.location.protocol,u=exports.canUseXHR="http:"===l||"https:"===l;function d(t){const n=(0,s.getHashParams)(),l=u&&null!=n.profileURL,d=r.combineReducers({profileGroup:i.profileGroup,hashParams:(0,o.setter)(e.actions.setHashParams,n),flattenRecursion:(0,o.setter)(e.actions.setFlattenRecursion,!1),viewMode:(0,o.setter)(e.actions.setViewMode,c.CHRONO_FLAME_CHART),glCanvas:(0,o.setter)(e.actions.setGLCanvas,null),dragActive:(0,o.setter)(e.actions.setDragActive,!1),loading:(0,o.setter)(e.actions.setLoading,l),error:(0,o.setter)(e.actions.setError,!1),tableSortMethod:(0,o.setter)(e.actions.sandwichView.setTableSortMethod,{field:a.SortField.SELF,direction:a.SortDirection.DESCENDING})});return r.createStore(d,t)} -},{"./actions":40,"redux":32,"../lib/typed-redux":36,"../lib/hash-params":47,"./profiles-state":49,"../views/profile-table-view":53}],80:[function(require,module,exports) { -"use strict";function e(e){return e.replace(/\\([a-fA-F0-9]{2})/g,(e,n)=>{const t=parseInt(n,16);return String.fromCharCode(t)})}function n(n){const t=n.split("\n");if(!t.length)return null;if(""===t[t.length-1]&&t.pop(),!t.length)return null;const r=new Map,o=/^(\d+):(.+)$/,s=/^([\$\w]+):([\$\w-]+)$/;for(const n of t){const t=o.exec(n);if(t){r.set(`wasm-function[${t[1]}]`,e(t[2]));continue}const c=s.exec(n);if(!c)return null;r.set(c[1],e(c[2]))}return r}Object.defineProperty(exports,"__esModule",{value:!0}),exports.importEmscriptenSymbolMap=n; -},{}],114:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Flamechart=void 0;var t=require("./utils"),e=require("./math");class r{constructor(e){this.source=e,this.layers=[],this.totalWeight=0,this.minFrameWidth=1;const r=[];this.minFrameWidth=1/0;this.totalWeight=e.getTotalWeight(),e.forEachCall((e,i)=>{const s=(0,t.lastOf)(r),h={node:e,parent:s,children:[],start:i,end:i};s&&s.children.push(h),r.push(h)},(t,e)=>{console.assert(r.length>0);const i=r.pop();if(i.end=e,i.end-i.start==0)return;const s=r.length;for(;this.layers.length<=s;)this.layers.push([]);this.layers[s].push(i),this.minFrameWidth=Math.min(this.minFrameWidth,i.end-i.start)}),isFinite(this.minFrameWidth)||(this.minFrameWidth=1)}getTotalWeight(){return this.totalWeight}getLayers(){return this.layers}getColorBucketForFrame(t){return this.source.getColorBucketForFrame(t)}getMinFrameWidth(){return this.minFrameWidth}formatValue(t){return this.source.formatValue(t)}getClampedViewportWidth(t){const r=this.getTotalWeight(),i=Math.pow(2,40),s=(0,e.clamp)(3*this.getMinFrameWidth(),r/i,r);return(0,e.clamp)(t,s,r)}}exports.Flamechart=r; -},{"./utils":60,"./math":97}],115:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlamechartRenderer=exports.FlamechartRowAtlasKey=void 0;var e=require("./rectangle-batch-renderer"),t=require("../lib/math"),r=require("../lib/color"),n=require("../lib/utils"),s=require("./graphics"),o=require("./utils");const c=1e4;class i{constructor(e,t,r){this.batch=e,this.bounds=t,this.numPrecedingRectanglesInRow=r,this.children=[]}getBatch(){return this.batch}getBounds(){return this.bounds}getRectCount(){return this.batch.getRectCount()}getChildren(){return this.children}getParity(){return this.numPrecedingRectanglesInRow%2}forEachLeafNodeWithinBounds(e,t){this.bounds.hasIntersectionWith(e)&&t(this)}}class h{constructor(e){if(this.children=e,this.rectCount=0,0===e.length)throw new Error("Empty interior node");let r=1/0,n=-1/0,s=1/0,o=-1/0;for(let t of e){this.rectCount+=t.getRectCount();const e=t.getBounds();r=Math.min(r,e.left()),n=Math.max(n,e.right()),s=Math.min(s,e.top()),o=Math.max(o,e.bottom())}this.bounds=new t.Rect(new t.Vec2(r,s),new t.Vec2(n-r,o-s))}getBounds(){return this.bounds}getRectCount(){return this.rectCount}getChildren(){return this.children}forEachLeafNodeWithinBounds(e,t){if(this.bounds.hasIntersectionWith(e))for(let r of this.children)r.forEachLeafNodeWithinBounds(e,t)}}class a{get key(){return`${this.stackDepth}_${this.index}_${this.zoomLevel}`}constructor(e){this.stackDepth=e.stackDepth,this.zoomLevel=e.zoomLevel,this.index=e.index}static getOrInsert(e,t){return e.getOrInsert(new a(t))}}exports.FlamechartRowAtlasKey=a;class l{constructor(s,o,a,l,g,d={inverted:!1}){this.gl=s,this.rowAtlas=o,this.flamechart=a,this.rectangleBatchRenderer=l,this.colorPassRenderer=g,this.options=d,this.layers=[],this.rectInfoTexture=null,this.rectInfoRenderTarget=null,this.atlasKeys=new n.KeyedSet;const f=a.getLayers().length;for(let n=0;n=c&&(s.push(new i(u,new t.Rect(new t.Vec2(l,o),new t.Vec2(g-l,1)),R)),l=1/0,g=-1/0,u=new e.RectangleBatch(this.gl));const d=new t.Rect(new t.Vec2(a.start,o),new t.Vec2(a.end-a.start,1));l=Math.min(l,d.left()),g=Math.max(g,d.right());const f=new r.Color((1+h%255)/256,(1+n%255)/256,(1+this.flamechart.getColorBucketForFrame(a.node.frame))/256);u.addRect(d,f),R++}u.getRectCount()>0&&s.push(new i(u,new t.Rect(new t.Vec2(l,o),new t.Vec2(g-l,1)),R)),this.layers.push(new h(s))}}getRectInfoTexture(e,t){if(this.rectInfoTexture){const r=this.rectInfoTexture;r.width==e&&r.height==t||r.resize(e,t)}else this.rectInfoTexture=this.gl.createTexture(s.Graphics.TextureFormat.NEAREST_CLAMP,e,t);return this.rectInfoTexture}getRectInfoRenderTarget(e,t){const r=this.getRectInfoTexture(e,t);return this.rectInfoRenderTarget&&this.rectInfoRenderTarget.texture!=r&&(this.rectInfoRenderTarget.texture.free(),this.rectInfoRenderTarget.setColor(r)),this.rectInfoRenderTarget||(this.rectInfoRenderTarget=this.gl.createRenderTarget(r)),this.rectInfoRenderTarget}free(){this.rectInfoRenderTarget&&this.rectInfoRenderTarget.free(),this.rectInfoTexture&&this.rectInfoTexture.free()}configSpaceBoundsForKey(e){const{stackDepth:r,zoomLevel:n,index:s}=e,o=this.flamechart.getTotalWeight()/Math.pow(2,n),c=this.flamechart.getLayers().length,i=this.options.inverted?c-1-r:r;return new t.Rect(new t.Vec2(o*s,i),new t.Vec2(o,1))}render(e){const{configSpaceSrcRect:r,physicalSpaceDstRect:n}=e,c=[],i=t.AffineTransform.betweenRects(r,n);if(r.isEmpty())return;let h=0;for(;;){const e=a.getOrInsert(this.atlasKeys,{stackDepth:0,zoomLevel:h,index:0}),t=this.configSpaceBoundsForKey(e);if(i.transformRect(t).width(){const r=this.configSpaceBoundsForKey(t);this.layers[t.stackDepth].forEachLeafNodeWithinBounds(r,t=>{this.rectangleBatchRenderer.render({batch:t.getBatch(),configSpaceSrcRect:r,physicalSpaceDstRect:e})})});const T=this.getRectInfoRenderTarget(n.width(),n.height());(0,o.renderInto)(this.gl,T,()=>{this.gl.clear(new s.Graphics.Color(0,0,0,0));const e=new t.Rect(t.Vec2.zero,new t.Vec2(this.gl.viewport.width,this.gl.viewport.height)),n=t.AffineTransform.betweenRects(r,e);for(let e of m){const t=this.configSpaceBoundsForKey(e);this.rowAtlas.renderViaAtlas(e,n.transformRect(t))}for(let e of I){const t=this.configSpaceBoundsForKey(e),r=n.transformRect(t);this.layers[e.stackDepth].forEachLeafNodeWithinBounds(t,e=>{this.rectangleBatchRenderer.render({batch:e.getBatch(),configSpaceSrcRect:t,physicalSpaceDstRect:r})})}});const x=this.getRectInfoTexture(n.width(),n.height());this.colorPassRenderer.render({rectInfoTexture:x,srcRect:new t.Rect(t.Vec2.zero,new t.Vec2(x.width,x.height)),dstRect:n,renderOutlines:e.renderOutlines})}}exports.FlamechartRenderer=l; -},{"./rectangle-batch-renderer":102,"../lib/math":97,"../lib/color":66,"../lib/utils":60,"./graphics":42,"./utils":107}],159:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.style=void 0;var e=require("aphrodite"),o=require("./style");const t=exports.style=e.StyleSheet.create({hoverCount:{color:o.Colors.GREEN},fill:{width:"100%",height:"100%",position:"absolute",left:0,top:0},minimap:{height:o.Sizes.MINIMAP_HEIGHT,borderBottom:`${o.Sizes.SEPARATOR_HEIGHT}px solid ${o.Colors.LIGHT_GRAY}`},panZoomView:{flex:1},detailView:{display:"grid",height:o.Sizes.DETAIL_VIEW_HEIGHT,overflow:"hidden",gridTemplateColumns:"120px 120px 1fr",gridTemplateRows:"repeat(4, 1fr)",borderTop:`${o.Sizes.SEPARATOR_HEIGHT}px solid ${o.Colors.LIGHT_GRAY}`,fontSize:o.FontSize.LABEL,position:"absolute",background:o.Colors.WHITE,width:"100vw",bottom:0},stackTraceViewPadding:{padding:5},stackTraceView:{height:o.Sizes.DETAIL_VIEW_HEIGHT,lineHeight:`${o.FontSize.LABEL+2}px`,overflow:"auto"},stackLine:{whiteSpace:"nowrap"},stackFileLine:{color:o.Colors.LIGHT_GRAY},statsTable:{display:"grid",gridTemplateColumns:"1fr 1fr",gridTemplateRows:`repeat(3, ${o.FontSize.LABEL+10}px)`,gridGap:"1px 1px",textAlign:"center",paddingRight:1},statsTableHeader:{gridColumn:"1 / 3"},statsTableCell:{position:"relative",display:"flex",justifyContent:"center",alignItems:"center"},thisInstanceCell:{background:o.Colors.DARK_BLUE,color:o.Colors.WHITE},allInstancesCell:{background:o.Colors.PALE_DARK_BLUE,color:o.Colors.WHITE},barDisplay:{position:"absolute",top:0,left:0,background:"rgba(0, 0, 0, 0.2)",width:"100%"}}); -},{"aphrodite":76,"./style":78}],160:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ELLIPSIS=void 0,exports.cachedMeasureTextWidth=n,exports.trimTextMid=s;var e=require("./utils");const t=exports.ELLIPSIS="โ€ฆ",r=new Map;let i=-1;function n(e,t){return window.devicePixelRatio!==i&&(r.clear(),i=window.devicePixelRatio),r.has(t)||r.set(t,e.measureText(t).width),r.get(t)}function o(e,r){const i=Math.floor(r/2),n=e.substr(0,i),o=e.substr(e.length-i,i);return n+t+o}function s(t,r,i){if(n(t,r)<=i)return r;const[s]=(0,e.binarySearch)(0,r.length,e=>n(t,o(r,e)),i);return o(r,s)} -},{"./utils":60}],157:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlamechartMinimapView=void 0;var e,i=require("preact"),t=require("aphrodite"),o=require("../lib/math"),s=require("./flamechart-style"),n=require("./style"),a=require("../lib/text-utils");!function(e){e[e.DRAW_NEW_VIEWPORT=0]="DRAW_NEW_VIEWPORT",e[e.TRANSLATE_VIEWPORT=1]="TRANSLATE_VIEWPORT"}(e||(e={}));class r extends i.Component{constructor(){super(...arguments),this.container=null,this.containerRef=(e=>{this.container=e||null}),this.overlayCanvas=null,this.overlayCtx=null,this.onWindowResize=(()=>{this.onBeforeFrame()}),this.onBeforeFrame=(()=>{this.maybeClearInteractionLock(),this.resizeOverlayCanvasIfNeeded(),this.renderRects(),this.renderOverlays()}),this.renderCanvas=(()=>{this.props.canvasContext.requestFrame()}),this.frameHadWheelEvent=!1,this.framesWithoutWheelEvents=0,this.interactionLock=null,this.maybeClearInteractionLock=(()=>{this.interactionLock&&(this.frameHadWheelEvent||(this.framesWithoutWheelEvents++,this.framesWithoutWheelEvents>=2&&(this.interactionLock=null,this.framesWithoutWheelEvents=0)),this.props.canvasContext.requestFrame()),this.frameHadWheelEvent=!1}),this.onWheel=(e=>{if(e.preventDefault(),this.frameHadWheelEvent=!0,(e.metaKey||e.ctrlKey)&&"pan"!==this.interactionLock){let i=1+e.deltaY/100;e.ctrlKey&&(i=1+e.deltaY/40),i=(0,o.clamp)(i,.1,10),this.zoom(i)}else"zoom"!==this.interactionLock&&this.pan(new o.Vec2(e.deltaX,e.deltaY));this.renderCanvas()}),this.dragStartConfigSpaceMouse=null,this.dragConfigSpaceViewportOffset=null,this.draggingMode=null,this.onMouseDown=(i=>{const t=this.configSpaceMouse(i);t&&(this.props.configSpaceViewportRect.contains(t)?(this.draggingMode=e.TRANSLATE_VIEWPORT,this.dragConfigSpaceViewportOffset=t.minus(this.props.configSpaceViewportRect.origin)):this.draggingMode=e.DRAW_NEW_VIEWPORT,this.dragStartConfigSpaceMouse=t,window.addEventListener("mousemove",this.onWindowMouseMove),window.addEventListener("mouseup",this.onWindowMouseUp),this.updateCursor(t))}),this.onWindowMouseMove=(i=>{if(!this.dragStartConfigSpaceMouse)return;let t=this.configSpaceMouse(i);if(t)if(this.updateCursor(t),t=new o.Rect(new o.Vec2(0,0),this.configSpaceSize()).closestPointTo(t),this.draggingMode===e.DRAW_NEW_VIEWPORT){const e=this.dragStartConfigSpaceMouse;let i=t;if(!e||!i)return;const s=Math.min(e.x,i.x),n=Math.max(e.x,i.x)-s,a=this.props.configSpaceViewportRect.height();this.props.setConfigSpaceViewportRect(new o.Rect(new o.Vec2(s,i.y-a/2),new o.Vec2(n,a)))}else if(this.draggingMode===e.TRANSLATE_VIEWPORT){if(!this.dragConfigSpaceViewportOffset)return;const e=t.minus(this.dragConfigSpaceViewportOffset);this.props.setConfigSpaceViewportRect(this.props.configSpaceViewportRect.withOrigin(e))}}),this.updateCursor=(i=>{this.draggingMode===e.TRANSLATE_VIEWPORT?(document.body.style.cursor="grabbing",document.body.style.cursor="-webkit-grabbing"):this.draggingMode===e.DRAW_NEW_VIEWPORT?document.body.style.cursor="col-resize":this.props.configSpaceViewportRect.contains(i)?(document.body.style.cursor="grab",document.body.style.cursor="-webkit-grab"):document.body.style.cursor="col-resize"}),this.onMouseLeave=(()=>{null==this.draggingMode&&(document.body.style.cursor="default")}),this.onMouseMove=(e=>{const i=this.configSpaceMouse(e);i&&this.updateCursor(i)}),this.onWindowMouseUp=(e=>{this.draggingMode=null,window.removeEventListener("mousemove",this.onWindowMouseMove),window.removeEventListener("mouseup",this.onWindowMouseUp);const i=this.configSpaceMouse(e);i&&this.updateCursor(i)}),this.overlayCanvasRef=(e=>{e?(this.overlayCanvas=e,this.overlayCtx=this.overlayCanvas.getContext("2d"),this.renderCanvas()):(this.overlayCanvas=null,this.overlayCtx=null)})}physicalViewSize(){return new o.Vec2(this.overlayCanvas?this.overlayCanvas.width:0,this.overlayCanvas?this.overlayCanvas.height:0)}minimapOrigin(){return new o.Vec2(0,n.Sizes.FRAME_HEIGHT*window.devicePixelRatio)}configSpaceSize(){return new o.Vec2(this.props.flamechart.getTotalWeight(),this.props.flamechart.getLayers().length)}configSpaceToPhysicalViewSpace(){const e=this.minimapOrigin();return o.AffineTransform.betweenRects(new o.Rect(new o.Vec2(0,0),this.configSpaceSize()),new o.Rect(e,this.physicalViewSize().minus(e)))}logicalToPhysicalViewSpace(){return o.AffineTransform.withScale(new o.Vec2(window.devicePixelRatio,window.devicePixelRatio))}windowToLogicalViewSpace(){if(!this.container)return new o.AffineTransform;const e=this.container.getBoundingClientRect();return o.AffineTransform.withTranslation(new o.Vec2(-e.left,-e.top))}renderRects(){this.container&&(this.physicalViewSize().x<2||this.props.canvasContext.renderBehind(this.container,()=>{this.props.flamechartRenderer.render({configSpaceSrcRect:new o.Rect(new o.Vec2(0,0),this.configSpaceSize()),physicalSpaceDstRect:new o.Rect(this.minimapOrigin(),this.physicalViewSize().minus(this.minimapOrigin())),renderOutlines:!1}),this.props.canvasContext.viewportRectangleRenderer.render({configSpaceViewportRect:this.props.configSpaceViewportRect,configSpaceToPhysicalViewSpace:this.configSpaceToPhysicalViewSpace()})}))}renderOverlays(){const e=this.overlayCtx;if(!e)return;const i=this.physicalViewSize();e.clearRect(0,0,i.x,i.y);const t=this.configSpaceToPhysicalViewSpace(),s=this.configSpaceSize().x,r=(this.configSpaceToPhysicalViewSpace().inverted()||new o.AffineTransform).times(this.logicalToPhysicalViewSpace()).transformVector(new o.Vec2(200,1)).x,c=n.Sizes.FRAME_HEIGHT*window.devicePixelRatio,h=n.FontSize.LABEL*window.devicePixelRatio,l=(c-h)/2;e.font=`${h}px/${c}px ${n.FontFamily.MONOSPACE}`,e.textBaseline="top";let p=Math.pow(10,Math.floor(Math.log10(r)));r/p>5?p*=5:r/p>2&&(p*=2),e.fillStyle="rgba(255, 255, 255, 0.8)",e.fillRect(0,0,i.x,c),e.textBaseline="top",e.fillStyle=n.Colors.DARK_GRAY;for(let n=Math.ceil(0/p)*p;n ")),i.push(c.name),c.file){let l=c.file;c.line&&(l+=`:${c.line}`,c.col&&(l+=`:${c.col}`)),i.push((0,s.h)("span",{className:(0,e.css)(t.style.stackFileLine)}," (",l,")"))}l.push((0,s.h)("div",{className:(0,e.css)(t.style.stackLine)},i))}return(0,s.h)("div",{className:(0,e.css)(t.style.stackTraceView)},(0,s.h)("div",{className:(0,e.css)(t.style.stackTraceViewPadding)},l))}}class c extends s.Component{render(){const{flamechart:l,selectedNode:a}=this.props,{frame:c}=a;return(0,s.h)("div",{className:(0,e.css)(t.style.detailView)},(0,s.h)(r,{title:"This Instance",cellStyle:t.style.thisInstanceCell,grandTotal:l.getTotalWeight(),selectedTotal:a.getTotalWeight(),selectedSelf:a.getSelfWeight(),formatter:l.formatValue.bind(l)}),(0,s.h)(r,{title:"All Instances",cellStyle:t.style.allInstancesCell,grandTotal:l.getTotalWeight(),selectedTotal:c.getTotalWeight(),selectedSelf:c.getSelfWeight(),formatter:l.formatValue.bind(l)}),(0,s.h)(i,{node:a,getFrameColor:this.props.getCSSColorForFrame}))}}exports.FlamechartDetailView=c; -},{"aphrodite":76,"preact":24,"./flamechart-style":159,"../lib/utils":60,"./color-chit":99}],142:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlamechartPanZoomView=void 0;var e=require("../lib/math"),t=require("./style"),i=require("../lib/text-utils"),o=require("./flamechart-style"),s=require("preact"),n=require("aphrodite");class r extends s.Component{constructor(){super(...arguments),this.container=null,this.containerRef=(e=>{this.container=e||null}),this.overlayCanvas=null,this.overlayCtx=null,this.hoveredLabel=null,this.overlayCanvasRef=(e=>{e?(this.overlayCanvas=e,this.overlayCtx=this.overlayCanvas.getContext("2d"),this.renderCanvas()):(this.overlayCanvas=null,this.overlayCtx=null)}),this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT=t.Sizes.FRAME_HEIGHT,this.onWindowResize=(()=>{this.updateConfigSpaceViewport(),this.onBeforeFrame()}),this.frameHadWheelEvent=!1,this.framesWithoutWheelEvents=0,this.interactionLock=null,this.maybeClearInteractionLock=(()=>{this.interactionLock&&(this.frameHadWheelEvent||(this.framesWithoutWheelEvents++,this.framesWithoutWheelEvents>=2&&(this.interactionLock=null,this.framesWithoutWheelEvents=0)),this.props.canvasContext.requestFrame()),this.frameHadWheelEvent=!1}),this.onBeforeFrame=(()=>{this.resizeOverlayCanvasIfNeeded(),this.renderRects(),this.renderOverlays(),this.maybeClearInteractionLock()}),this.renderCanvas=(()=>{this.props.canvasContext.requestFrame()}),this.lastDragPos=null,this.mouseDownPos=null,this.onMouseDown=(t=>{this.mouseDownPos=this.lastDragPos=new e.Vec2(t.offsetX,t.offsetY),this.updateCursor(),window.addEventListener("mouseup",this.onWindowMouseUp)}),this.onMouseDrag=(t=>{if(!this.lastDragPos)return;const i=new e.Vec2(t.offsetX,t.offsetY);this.pan(this.lastDragPos.minus(i)),this.lastDragPos=i,this.hoveredLabel&&this.props.onNodeHover(null)}),this.onDblClick=(t=>{if(this.hoveredLabel){const t=this.hoveredLabel.configSpaceBounds,i=new e.Rect(t.origin.minus(new e.Vec2(0,1)),t.size.withY(this.props.configSpaceViewportRect.height()));this.props.setConfigSpaceViewportRect(i)}}),this.onClick=(t=>{const i=new e.Vec2(t.offsetX,t.offsetY),o=this.mouseDownPos;this.mouseDownPos=null,o&&i.minus(o).length()>5||(this.hoveredLabel?(this.props.onNodeSelect(this.hoveredLabel.node),this.renderCanvas()):this.props.onNodeSelect(null))}),this.onWindowMouseUp=(e=>{this.lastDragPos=null,this.updateCursor(),window.removeEventListener("mouseup",this.onWindowMouseUp)}),this.onMouseMove=(t=>{if(this.updateCursor(),this.lastDragPos)return t.preventDefault(),void this.onMouseDrag(t);this.hoveredLabel=null;const i=new e.Vec2(t.offsetX,t.offsetY),o=this.logicalToPhysicalViewSpace().transformPosition(i),s=this.configSpaceToPhysicalViewSpace().inverseTransformPosition(o);if(!s)return;const n=(t,i=0)=>{const o=t.end-t.start,r=this.props.renderInverted?this.configSpaceSize().y-1-i:i,a=new e.Rect(new e.Vec2(t.start,r),new e.Vec2(o,1));if(s.xa.right())return null;a.contains(s)&&(this.hoveredLabel={configSpaceBounds:a,node:t.node});for(let e of t.children)n(e,i+1)};for(let e of this.props.flamechart.getLayers()[0]||[])n(e);this.hoveredLabel?this.props.onNodeHover({node:this.hoveredLabel.node,event:t}):this.props.onNodeHover(null),this.renderCanvas()}),this.onMouseLeave=(e=>{this.hoveredLabel=null,this.props.onNodeHover(null),this.renderCanvas()}),this.onWheel=(t=>{t.preventDefault(),this.frameHadWheelEvent=!0;const i=t.metaKey||t.ctrlKey;let o=t.deltaY,s=t.deltaX;if(t.deltaMode===t.DOM_DELTA_LINE&&(o*=this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT,s*=this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT),i&&"pan"!==this.interactionLock){let i=1+o/100;t.ctrlKey&&(i=1+o/40),i=(0,e.clamp)(i,.1,10),this.zoom(new e.Vec2(t.offsetX,t.offsetY),i)}else"zoom"!==this.interactionLock&&this.pan(new e.Vec2(s,o));this.renderCanvas()}),this.onWindowKeyPress=(t=>{if(!this.container)return;const{width:i,height:o}=this.container.getBoundingClientRect();"="===t.key||"+"===t.key?(this.zoom(new e.Vec2(i/2,o/2),.5),t.preventDefault()):"-"!==t.key&&"_"!==t.key||(this.zoom(new e.Vec2(i/2,o/2),2),t.preventDefault()),t.ctrlKey||t.shiftKey||t.metaKey||("0"===t.key?this.zoom(new e.Vec2(i/2,o/2),1e9):"ArrowRight"===t.key||"KeyD"===t.code?this.pan(new e.Vec2(100,0)):"ArrowLeft"===t.key||"KeyA"===t.code?this.pan(new e.Vec2(-100,0)):"ArrowUp"===t.key||"KeyW"===t.code?this.pan(new e.Vec2(0,-100)):"ArrowDown"===t.key||"KeyS"===t.code?this.pan(new e.Vec2(0,100)):"Escape"===t.key&&(this.props.onNodeSelect(null),this.renderCanvas()))})}setConfigSpaceViewportRect(e){this.props.setConfigSpaceViewportRect(e)}configSpaceSize(){return new e.Vec2(this.props.flamechart.getTotalWeight(),this.props.flamechart.getLayers().length)}physicalViewSize(){return new e.Vec2(this.overlayCanvas?this.overlayCanvas.width:0,this.overlayCanvas?this.overlayCanvas.height:0)}physicalBounds(){if(this.props.renderInverted){const t=this.physicalViewSize().y,i=(this.configSpaceSize().y+1)*this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT*window.devicePixelRatio;if(i{const f=t.end-t.start,w=this.props.renderInverted?this.configSpaceSize().y-1-d:d,u=new e.Rect(new e.Vec2(t.start,w),new e.Vec2(f,1));if(!(fthis.props.configSpaceViewportRect.right()||u.right()this.props.configSpaceViewportRect.bottom())return;if(u.hasIntersectionWith(this.props.configSpaceViewportRect)){let e=s.transformRect(u);if(e.left()<0&&(e=e.withOrigin(e.origin.withX(0)).withSize(e.size.withX(e.size.x+e.left()))),e.right()>a.x&&(e=e.withSize(e.size.withX(a.x-e.left()))),e.width()>h){const s=(0,i.trimTextMid)(o,t.node.frame.name,e.width()-2*l);o.fillText(s,e.left()+l,Math.round(e.bottom()-(r-n)/2))}}for(let e of t.children)p(e,d+1)}};for(let e of this.props.flamechart.getLayers()[0]||[])p(e);const d=2*window.devicePixelRatio;o.strokeStyle=t.Colors.PALE_DARK_BLUE,o.lineWidth=d;const f=(s.inverseTransformVector(new e.Vec2(1,0))||new e.Vec2(0,0)).x,w=(i,n=0)=>{if(!this.props.selectedNode)return;const r=i.end-i.start,a=this.props.renderInverted?this.configSpaceSize().y-1-n:n,h=new e.Rect(new e.Vec2(i.start,a),new e.Vec2(r,1));if(!(rthis.props.configSpaceViewportRect.right()||h.right()this.props.configSpaceViewportRect.bottom())){if(h.hasIntersectionWith(this.props.configSpaceViewportRect)){const e=s.transformRect(h);i.node.frame===this.props.selectedNode.frame&&(i.node===this.props.selectedNode?o.strokeStyle!==t.Colors.DARK_BLUE&&(o.stroke(),o.beginPath(),o.strokeStyle=t.Colors.DARK_BLUE):o.strokeStyle!==t.Colors.PALE_DARK_BLUE&&(o.stroke(),o.beginPath(),o.strokeStyle=t.Colors.PALE_DARK_BLUE),o.rect(Math.round(e.left()+1+d/2),Math.round(e.top()+1+d/2),Math.round(Math.max(0,e.width()-2-d)),Math.round(Math.max(0,e.height()-2-d))))}for(let e of i.children)w(e,n+1)}};o.beginPath();for(let e of this.props.flamechart.getLayers()[0]||[])w(e);o.stroke(),this.renderTimeIndicators()}renderTimeIndicators(){const o=this.overlayCtx;if(!o)return;const s=this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT*window.devicePixelRatio,n=this.physicalViewSize(),r=this.configSpaceToPhysicalViewSpace(),a=(s-t.FontSize.LABEL*window.devicePixelRatio)/2,h=this.props.configSpaceViewportRect.left(),c=this.props.configSpaceViewportRect.right(),l=(this.configSpaceToPhysicalViewSpace().inverted()||new e.AffineTransform).times(this.logicalToPhysicalViewSpace()).transformVector(new e.Vec2(200,1)).x;let p=Math.pow(10,Math.floor(Math.log10(l)));l/p>5?p*=5:l/p>2&&(p*=2);{const l=this.props.renderInverted?n.y-s:0;o.fillStyle="rgba(255, 255, 255, 0.8)",o.fillRect(0,l,n.x,s),o.fillStyle=t.Colors.DARK_GRAY,o.textBaseline="top";for(let t=Math.ceil(h/p)*p;t{this.props.flamechartRenderer.render({physicalSpaceDstRect:this.physicalBounds(),configSpaceSrcRect:this.props.configSpaceViewportRect,renderOutlines:!0})}))}pan(t){this.interactionLock="pan";const i=this.logicalToPhysicalViewSpace().transformVector(t),o=this.configSpaceToPhysicalViewSpace().inverseTransformVector(i);this.hoveredLabel&&this.props.onNodeHover(null),o&&this.props.transformViewport(e.AffineTransform.withTranslation(o))}zoom(t,i){this.interactionLock="zoom";const o=this.logicalToPhysicalViewSpace().transformPosition(t),s=this.configSpaceToPhysicalViewSpace().inverseTransformPosition(o);if(!s)return;const n=e.AffineTransform.withTranslation(s.times(-1)).scaledBy(new e.Vec2(i,1)).translatedBy(s);this.props.transformViewport(n)}updateCursor(){this.lastDragPos?(document.body.style.cursor="grabbing",document.body.style.cursor="-webkit-grabbing"):document.body.style.cursor="default"}shouldComponentUpdate(){return!1}componentWillReceiveProps(e){this.props.flamechart!==e.flamechart?(this.hoveredLabel=null,this.renderCanvas()):this.props.selectedNode!==e.selectedNode?this.renderCanvas():this.props.configSpaceViewportRect!==e.configSpaceViewportRect&&this.renderCanvas()}componentDidMount(){this.props.canvasContext.addBeforeFrameHandler(this.onBeforeFrame),window.addEventListener("resize",this.onWindowResize),window.addEventListener("keydown",this.onWindowKeyPress)}componentWillUnmount(){this.props.canvasContext.removeBeforeFrameHandler(this.onBeforeFrame),window.removeEventListener("resize",this.onWindowResize),window.removeEventListener("keydown",this.onWindowKeyPress)}render(){return(0,s.h)("div",{className:(0,n.css)(o.style.panZoomView,t.commonStyle.vbox),onMouseDown:this.onMouseDown,onMouseMove:this.onMouseMove,onMouseLeave:this.onMouseLeave,onClick:this.onClick,onDblClick:this.onDblClick,onWheel:this.onWheel,ref:this.containerRef},(0,s.h)("canvas",{width:1,height:1,ref:this.overlayCanvasRef,className:(0,n.css)(o.style.fill)}))}}exports.FlamechartPanZoomView=r; -},{"../lib/math":97,"./style":78,"../lib/text-utils":160,"./flamechart-style":159,"preact":24,"aphrodite":76}],143:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Hovertip=void 0;var e=require("./style"),o=require("aphrodite"),t=require("preact");class i extends t.Component{render(){const{containerSize:i,offset:r}=this.props,n=i.x,p=i.y,d={};return r.x+7+e.Sizes.TOOLTIP_WIDTH_MAX{const t=a.Sizes.DETAIL_VIEW_HEIGHT/a.Sizes.FRAME_HEIGHT,i=this.configSpaceSize(),o=this.props.flamechart.getClampedViewportWidth(e.size.x),s=e.size.withX(o),c=r.Vec2.clamp(e.origin,new r.Vec2(0,-1),r.Vec2.max(r.Vec2.zero,i.minus(s).plus(new r.Vec2(0,t+1))));this.props.setConfigSpaceViewportRect(new r.Rect(c,e.size.withX(o)))}),this.setLogicalSpaceViewportSize=(e=>{this.props.setLogicalSpaceViewportSize(e)}),this.transformViewport=(e=>{const t=e.transformRect(this.props.configSpaceViewportRect);this.setConfigSpaceViewportRect(t)}),this.onNodeHover=(e=>{this.props.setNodeHover(e)}),this.onNodeClick=(e=>{this.props.setSelectedNode(e)}),this.container=null,this.containerRef=(e=>{this.container=e||null})}configSpaceSize(){return new r.Vec2(this.props.flamechart.getTotalWeight(),this.props.flamechart.getLayers().length)}formatValue(e){const t=100*e/this.props.flamechart.getTotalWeight(),r=(0,i.formatPercent)(t);return`${this.props.flamechart.formatValue(e)} (${r})`}renderTooltip(){if(!this.container)return null;const{hover:i}=this.props;if(!i)return null;const{width:o,height:a,left:c,top:p}=this.container.getBoundingClientRect(),h=new r.Vec2(i.event.clientX-c,i.event.clientY-p);return(0,e.h)(n.Hovertip,{containerSize:new r.Vec2(o,a),offset:h},(0,e.h)("span",{className:(0,t.css)(s.style.hoverCount)},this.formatValue(i.node.getTotalWeight()))," ",i.node.frame.name)}render(){return(0,e.h)("div",{className:(0,t.css)(s.style.fill,a.commonStyle.vbox),ref:this.containerRef},(0,e.h)(o.FlamechartMinimapView,{configSpaceViewportRect:this.props.configSpaceViewportRect,transformViewport:this.transformViewport,flamechart:this.props.flamechart,flamechartRenderer:this.props.flamechartRenderer,canvasContext:this.props.canvasContext,setConfigSpaceViewportRect:this.setConfigSpaceViewportRect}),(0,e.h)(p.FlamechartPanZoomView,{canvasContext:this.props.canvasContext,flamechart:this.props.flamechart,flamechartRenderer:this.props.flamechartRenderer,renderInverted:!1,onNodeHover:this.onNodeHover,onNodeSelect:this.onNodeClick,selectedNode:this.props.selectedNode,transformViewport:this.transformViewport,configSpaceViewportRect:this.props.configSpaceViewportRect,setConfigSpaceViewportRect:this.setConfigSpaceViewportRect,logicalSpaceViewportSize:this.props.logicalSpaceViewportSize,setLogicalSpaceViewportBounds:this.setLogicalSpaceViewportSize}),this.renderTooltip(),this.props.selectedNode&&(0,e.h)(c.FlamechartDetailView,{flamechart:this.props.flamechart,getCSSColorForFrame:this.props.getCSSColorForFrame,selectedNode:this.props.selectedNode}))}}exports.FlamechartView=l; -},{"preact":24,"aphrodite":76,"../lib/math":97,"../lib/utils":60,"./flamechart-minimap-view":157,"./flamechart-style":159,"./style":78,"./flamechart-detail-view":158,"./flamechart-pan-zoom-view":142,"./hovertip":143,"../lib/typed-redux":36}],70:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LeftHeavyFlamechartView=exports.getLeftHeavyFlamechart=exports.ChronoFlamechartView=exports.createMemoizedFlamechartRenderer=exports.getChronoViewFlamechart=void 0,exports.createFlamechartSetters=n;var e=require("../store/flamechart-view-state"),t=require("../lib/flamechart"),r=require("../gl/flamechart-renderer"),a=require("../lib/typed-redux"),o=require("../lib/utils"),l=require("./flamechart-view"),c=require("../store/getters"),i=require("../store/actions");function n(e,t,r){function a(a,o){return l=>{const c=Object.assign({},o(l),{id:t});e(a({profileIndex:r,args:c}))}}const{setHoveredNode:o,setLogicalSpaceViewportSize:l,setConfigSpaceViewportRect:c,setSelectedNode:n}=i.actions.flamechart;return{setNodeHover:a(o,e=>({hover:e})),setLogicalSpaceViewportSize:a(l,e=>({logicalSpaceViewportSize:e})),setConfigSpaceViewportRect:a(c,e=>({configSpaceViewportRect:e})),setSelectedNode:a(n,e=>({selectedNode:e}))}}const m=exports.getChronoViewFlamechart=(0,o.memoizeByShallowEquality)(({profile:e,getColorBucketForFrame:r})=>new t.Flamechart({getTotalWeight:e.getTotalWeight.bind(e),forEachCall:e.forEachCall.bind(e),formatValue:e.formatValue.bind(e),getColorBucketForFrame:r})),s=exports.createMemoizedFlamechartRenderer=(e=>(0,o.memoizeByShallowEquality)(({canvasContext:t,flamechart:a})=>new r.FlamechartRenderer(t.gl,(0,c.getRowAtlas)(t),a,t.rectangleBatchRenderer,t.flamechartColorPassRenderer,e))),h=s(),F=exports.ChronoFlamechartView=(0,a.createContainer)(l.FlamechartView,(t,r,a)=>{const{activeProfileState:o,glCanvas:l}=a,{index:i,profile:s,chronoViewState:F}=o,C=(0,c.getCanvasContext)(l),f=(0,c.getFrameToColorBucket)(s),g=(0,c.createGetColorBucketForFrame)(f),d=(0,c.createGetCSSColorForFrame)(f),u=m({profile:s,getColorBucketForFrame:g}),p=h({canvasContext:C,flamechart:u});return Object.assign({renderInverted:!1,flamechart:u,flamechartRenderer:p,canvasContext:C,getCSSColorForFrame:d},n(r,e.FlamechartID.CHRONO,i),F)}),C=exports.getLeftHeavyFlamechart=(0,o.memoizeByShallowEquality)(({profile:e,getColorBucketForFrame:r})=>new t.Flamechart({getTotalWeight:e.getTotalNonIdleWeight.bind(e),forEachCall:e.forEachCallGrouped.bind(e),formatValue:e.formatValue.bind(e),getColorBucketForFrame:r})),f=s(),g=exports.LeftHeavyFlamechartView=(0,a.createContainer)(l.FlamechartView,(t,r,a)=>{const{activeProfileState:o,glCanvas:l}=a,{index:i,profile:m,leftHeavyViewState:s}=o,h=(0,c.getCanvasContext)(l),F=(0,c.getFrameToColorBucket)(m),g=(0,c.createGetColorBucketForFrame)(F),d=(0,c.createGetCSSColorForFrame)(F),u=C({profile:m,getColorBucketForFrame:g}),p=f({canvasContext:h,flamechart:u});return Object.assign({renderInverted:!1,flamechart:u,flamechartRenderer:p,canvasContext:h,getCSSColorForFrame:d},n(r,e.FlamechartID.LEFT_HEAVY,i),s)}); -},{"../store/flamechart-view-state":95,"../lib/flamechart":114,"../gl/flamechart-renderer":115,"../lib/typed-redux":36,"../lib/utils":60,"./flamechart-view":108,"../store/getters":38,"../store/actions":40}],134:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.style=exports.FlamechartWrapper=void 0;var e=require("aphrodite"),t=require("preact"),r=require("./style"),o=require("../lib/math"),i=require("./flamechart-pan-zoom-view"),s=require("../lib/utils"),a=require("./hovertip"),n=require("../lib/typed-redux");class p extends n.StatelessComponent{constructor(){super(...arguments),this.setConfigSpaceViewportRect=(e=>{this.props.setConfigSpaceViewportRect(this.clampViewportToFlamegraph(e))}),this.setLogicalSpaceViewportSize=(e=>{this.props.setLogicalSpaceViewportSize(e)}),this.transformViewport=(e=>{this.setConfigSpaceViewportRect(e.transformRect(this.props.configSpaceViewportRect))}),this.container=null,this.containerRef=(e=>{this.container=e||null}),this.setNodeHover=(e=>{this.props.setNodeHover(e)})}clampViewportToFlamegraph(e){const{flamechart:t,renderInverted:r}=this.props,i=new o.Vec2(t.getTotalWeight(),t.getLayers().length),s=this.props.flamechart.getClampedViewportWidth(e.size.x),a=e.size.withX(s),n=o.Vec2.clamp(e.origin,new o.Vec2(0,r?0:-1),o.Vec2.max(o.Vec2.zero,i.minus(a).plus(new o.Vec2(0,1))));return new o.Rect(n,e.size.withX(s))}formatValue(e){const t=100*e/this.props.flamechart.getTotalWeight(),r=(0,s.formatPercent)(t);return`${this.props.flamechart.formatValue(e)} (${r})`}renderTooltip(){if(!this.container)return null;const{hover:r}=this.props;if(!r)return null;const{width:i,height:s,left:n,top:p}=this.container.getBoundingClientRect(),l=new o.Vec2(r.event.clientX-n,r.event.clientY-p);return(0,t.h)(a.Hovertip,{containerSize:new o.Vec2(i,s),offset:l},(0,t.h)("span",{className:(0,e.css)(c.hoverCount)},this.formatValue(r.node.getTotalWeight()))," ",r.node.frame.name)}render(){return(0,t.h)("div",{className:(0,e.css)(r.commonStyle.fillY,r.commonStyle.fillX,r.commonStyle.vbox),ref:this.containerRef},(0,t.h)(i.FlamechartPanZoomView,{selectedNode:null,onNodeHover:this.setNodeHover,onNodeSelect:s.noop,configSpaceViewportRect:this.props.configSpaceViewportRect,setConfigSpaceViewportRect:this.setConfigSpaceViewportRect,transformViewport:this.transformViewport,flamechart:this.props.flamechart,flamechartRenderer:this.props.flamechartRenderer,canvasContext:this.props.canvasContext,renderInverted:this.props.renderInverted,logicalSpaceViewportSize:this.props.logicalSpaceViewportSize,setLogicalSpaceViewportBounds:this.setLogicalSpaceViewportSize}),this.renderTooltip())}}exports.FlamechartWrapper=p;const c=exports.style=e.StyleSheet.create({hoverCount:{color:r.Colors.GREEN}}); -},{"aphrodite":76,"preact":24,"./style":78,"../lib/math":97,"./flamechart-pan-zoom-view":142,"../lib/utils":60,"./hovertip":143,"../lib/typed-redux":36}],112:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.InvertedCallerFlamegraphView=void 0;var e=require("../lib/utils"),r=require("../lib/flamechart"),t=require("./flamechart-view-container"),a=require("../lib/typed-redux"),l=require("../store/getters"),o=require("../store/flamechart-view-state"),i=require("./flamechart-wrapper");const n=(0,e.memoizeByShallowEquality)(({profile:e,frame:r,flattenRecursion:t})=>{let a=e.getInvertedProfileForCallersOf(r);return t?a.getProfileWithRecursionFlattened():a}),c=(0,e.memoizeByShallowEquality)(({invertedCallerProfile:e,getColorBucketForFrame:t})=>new r.Flamechart({getTotalWeight:e.getTotalNonIdleWeight.bind(e),forEachCall:e.forEachCallGrouped.bind(e),formatValue:e.formatValue.bind(e),getColorBucketForFrame:t})),s=(0,t.createMemoizedFlamechartRenderer)({inverted:!0}),m=exports.InvertedCallerFlamegraphView=(0,a.createContainer)(i.FlamechartWrapper,(e,r,a)=>{const{activeProfileState:i}=a;let{profile:m,sandwichViewState:f,index:d}=i,{flattenRecursion:u,glCanvas:C}=e;if(!m)throw new Error("profile missing");if(!C)throw new Error("glCanvas missing");const{callerCallee:h}=f;if(!h)throw new Error("callerCallee missing");const{selectedFrame:F}=h;m=u?(0,l.getProfileWithRecursionFlattened)(m):m;const g=(0,l.getFrameToColorBucket)(m),v=(0,l.createGetColorBucketForFrame)(g),p=(0,l.createGetCSSColorForFrame)(g),w=(0,l.getCanvasContext)(C),S=c({invertedCallerProfile:n({profile:m,frame:F,flattenRecursion:u}),getColorBucketForFrame:v}),E=s({canvasContext:w,flamechart:S});return Object.assign({renderInverted:!0,flamechart:S,flamechartRenderer:E,canvasContext:w,getCSSColorForFrame:p},(0,t.createFlamechartSetters)(r,o.FlamechartID.SANDWICH_INVERTED_CALLERS,d),{setSelectedNode:()=>{}},h.invertedCallerFlamegraph)}); -},{"../lib/utils":60,"../lib/flamechart":114,"./flamechart-view-container":70,"../lib/typed-redux":36,"../store/getters":38,"../store/flamechart-view-state":95,"./flamechart-wrapper":134}],113:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CalleeFlamegraphView=void 0;var e=require("../lib/utils"),r=require("../lib/flamechart"),t=require("./flamechart-view-container"),a=require("../lib/typed-redux"),l=require("../store/getters"),o=require("../store/flamechart-view-state"),i=require("./flamechart-wrapper");const c=(0,e.memoizeByShallowEquality)(({profile:e,frame:r,flattenRecursion:t})=>{let a=e.getProfileForCalleesOf(r);return t?a.getProfileWithRecursionFlattened():a}),n=(0,e.memoizeByShallowEquality)(({calleeProfile:e,getColorBucketForFrame:t})=>new r.Flamechart({getTotalWeight:e.getTotalNonIdleWeight.bind(e),forEachCall:e.forEachCallGrouped.bind(e),formatValue:e.formatValue.bind(e),getColorBucketForFrame:t})),s=(0,t.createMemoizedFlamechartRenderer)(),m=exports.CalleeFlamegraphView=(0,a.createContainer)(i.FlamechartWrapper,(e,r,a)=>{const{activeProfileState:i}=a,{index:m,profile:f,sandwichViewState:u}=i,{flattenRecursion:h,glCanvas:C}=e;if(!f)throw new Error("profile missing");if(!C)throw new Error("glCanvas missing");const{callerCallee:F}=u;if(!F)throw new Error("callerCallee missing");const{selectedFrame:g}=F,d=(0,l.getFrameToColorBucket)(f),p=(0,l.createGetColorBucketForFrame)(d),w=(0,l.createGetCSSColorForFrame)(d),v=(0,l.getCanvasContext)(C),S=n({calleeProfile:c({profile:f,frame:g,flattenRecursion:h}),getColorBucketForFrame:p}),q=s({canvasContext:v,flamechart:S});return Object.assign({renderInverted:!1,flamechart:S,flamechartRenderer:q,canvasContext:v,getCSSColorForFrame:w},(0,t.createFlamechartSetters)(r,o.FlamechartID.SANDWICH_CALLEES,m),{setSelectedNode:()=>{}},F.calleeFlamegraph)}); -},{"../lib/utils":60,"../lib/flamechart":114,"./flamechart-view-container":70,"../lib/typed-redux":36,"../store/getters":38,"../store/flamechart-view-state":95,"./flamechart-wrapper":134}],68:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.SandwichViewContainer=void 0;var e=require("aphrodite"),t=require("./profile-table-view"),a=require("preact"),l=require("./style"),r=require("../store/actions"),s=require("../lib/typed-redux"),i=require("./inverted-caller-flamegraph-view"),o=require("./callee-flamegraph-view");class n extends s.StatelessComponent{constructor(){super(...arguments),this.setSelectedFrame=(e=>{this.props.setSelectedFrame(e)}),this.onWindowKeyPress=(e=>{"Escape"===e.key&&this.setSelectedFrame(null)})}componentDidMount(){window.addEventListener("keydown",this.onWindowKeyPress)}componentWillUnmount(){window.removeEventListener("keydown",this.onWindowKeyPress)}render(){const{selectedFrame:r}=this.props;let s=null;return r&&(s=(0,a.h)("div",{className:(0,e.css)(l.commonStyle.fillY,c.callersAndCallees,l.commonStyle.vbox)},(0,a.h)("div",{className:(0,e.css)(l.commonStyle.hbox,c.panZoomViewWraper)},(0,a.h)("div",{className:(0,e.css)(c.flamechartLabelParent)},(0,a.h)("div",{className:(0,e.css)(c.flamechartLabel)},"Callers")),(0,a.h)(i.InvertedCallerFlamegraphView,{glCanvas:this.props.glCanvas,activeProfileState:this.props.activeProfileState})),(0,a.h)("div",{className:(0,e.css)(c.divider)}),(0,a.h)("div",{className:(0,e.css)(l.commonStyle.hbox,c.panZoomViewWraper)},(0,a.h)("div",{className:(0,e.css)(c.flamechartLabelParent,c.flamechartLabelParentBottom)},(0,a.h)("div",{className:(0,e.css)(c.flamechartLabel,c.flamechartLabelBottom)},"Callees")),(0,a.h)(o.CalleeFlamegraphView,{glCanvas:this.props.glCanvas,activeProfileState:this.props.activeProfileState})))),(0,a.h)("div",{className:(0,e.css)(l.commonStyle.hbox,l.commonStyle.fillY)},(0,a.h)("div",{className:(0,e.css)(c.tableView)},(0,a.h)(t.ProfileTableViewContainer,{activeProfileState:this.props.activeProfileState})),s)}}const c=e.StyleSheet.create({tableView:{flex:1},panZoomViewWraper:{flex:1},flamechartLabelParent:{display:"flex",flexDirection:"column",justifyContent:"flex-end",alignItems:"flex-start",fontSize:l.FontSize.TITLE,width:1.2*l.FontSize.TITLE,borderRight:`1px solid ${l.Colors.LIGHT_GRAY}`},flamechartLabelParentBottom:{justifyContent:"flex-start"},flamechartLabel:{transform:"rotate(-90deg)",transformOrigin:"50% 50% 0",width:1.2*l.FontSize.TITLE,flexShrink:1},flamechartLabelBottom:{transform:"rotate(-90deg)",display:"flex",justifyContent:"flex-end"},callersAndCallees:{flex:1,borderLeft:`${l.Sizes.SEPARATOR_HEIGHT}px solid ${l.Colors.LIGHT_GRAY}`},divider:{height:2,background:l.Colors.LIGHT_GRAY}}),d=exports.SandwichViewContainer=(0,s.createContainer)(n,(e,t,a)=>{const{activeProfileState:l,glCanvas:s}=a,{sandwichViewState:i,index:o}=l,{callerCallee:n}=i;return{activeProfileState:l,glCanvas:s,setSelectedFrame:e=>{t(r.actions.sandwichView.setSelectedFrame({profileIndex:o,args:e}))},selectedFrame:n?n.selectedFrame:null,profileIndex:o}}); -},{"aphrodite":76,"./profile-table-view":53,"preact":24,"./style":78,"../store/actions":40,"../lib/typed-redux":36,"./inverted-caller-flamegraph-view":112,"./callee-flamegraph-view":113}],110:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ByteFormatter=exports.TimeFormatter=exports.RawValueFormatter=void 0;var t=require("./utils");class e{constructor(){this.unit="none"}format(t){return t.toLocaleString()}}exports.RawValueFormatter=e;class r{constructor(t){this.unit=t,this.multiplier="nanoseconds"===t?1e-9:"microseconds"===t?1e-6:"milliseconds"===t?.001:1}formatUnsigned(e){const r=e*this.multiplier;if(r/60>=1){const e=Math.floor(r/60),o=Math.floor(r-60*e).toString();return`${e}:${(0,t.zeroPad)(o,2)}`}return r/1>=1?`${r.toFixed(2)}s`:r/.001>=1?`${(r/.001).toFixed(2)}ms`:r/1e-6>=1?`${(r/1e-6).toFixed(2)}ยตs`:`${(r/1e-9).toFixed(2)}ns`}format(t){return`${t<0?"-":""}${this.formatUnsigned(Math.abs(t))}`}}exports.TimeFormatter=r;class o{constructor(){this.unit="bytes"}format(t){return t<1024?`${t.toFixed(0)} B`:(t/=1024)<1024?`${t.toFixed(2)} KB`:(t/=1024)<1024?`${t.toFixed(2)} MB`:`${(t/=1024).toFixed(2)} GB`}}exports.ByteFormatter=o; -},{"./utils":60}],131:[function(require,module,exports) { -var t=null;function r(){return t||(t=e()),t}function e(){try{throw new Error}catch(r){var t=(""+r.stack).match(/(https?|file|ftp):\/\/[^)\n]+/g);if(t)return n(t[0])}return"/"}function n(t){return(""+t).replace(/^((?:https?|file|ftp):\/\/.+)\/[^\/]+$/,"$1")+"/"}exports.getBundleURL=r,exports.getBaseURL=n; -},{}],74:[function(require,module,exports) { -var r=require("./bundle-url").getBundleURL;function e(r){Array.isArray(r)||(r=[r]);var e=r[r.length-1];try{return Promise.resolve(require(e))}catch(n){if("MODULE_NOT_FOUND"===n.code)return new u(function(n,i){t(r.slice(0,-1)).then(function(){return require(e)}).then(n,i)});throw n}}function t(r){return Promise.all(r.map(s))}var n={};function i(r,e){n[r]=e}module.exports=exports=e,exports.load=t,exports.register=i;var o={};function s(e){var t;if(Array.isArray(e)&&(t=e[1],e=e[0]),o[e])return o[e];var i=(e.substring(e.lastIndexOf(".")+1,e.length)||e).toLowerCase(),s=n[i];return s?o[e]=s(r()+e).then(function(r){return r&&module.bundle.register(t,r),r}):void 0}function u(r){this.executor=r,this.promise=null}u.prototype.then=function(r,e){return null===this.promise&&(this.promise=new Promise(this.executor)),this.promise.then(r,e)},u.prototype.catch=function(r){return null===this.promise&&(this.promise=new Promise(this.executor)),this.promise.catch(r)}; -},{"./bundle-url":131}],109:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CallTreeProfileBuilder=exports.StackListProfileBuilder=exports.Profile=exports.CallTreeNode=exports.Frame=exports.HasWeights=void 0;var e=require("./utils"),t=require("./value-formatters"),s=function(e,t,s,r){return new(s||(s=Promise))(function(a,i){function l(e){try{h(r.next(e))}catch(e){i(e)}}function o(e){try{h(r.throw(e))}catch(e){i(e)}}function h(e){e.done?a(e.value):new s(function(t){t(e.value)}).then(l,o)}h((r=r.apply(e,t||[])).next())})};const r=require("_bundle_loader")(require.resolve("./demangle-cpp"));r.then(()=>{});class a{constructor(){this.selfWeight=0,this.totalWeight=0}getSelfWeight(){return this.selfWeight}getTotalWeight(){return this.totalWeight}addToTotalWeight(e){this.totalWeight+=e}addToSelfWeight(e){this.selfWeight+=e}overwriteWeightWith(e){this.selfWeight=e.selfWeight,this.totalWeight=e.totalWeight}}exports.HasWeights=a;class i extends a{constructor(e){super(),this.key=e.key,this.name=e.name,this.file=e.file,this.line=e.line,this.col=e.col}static getOrInsert(e,t){return e.getOrInsert(new i(t))}}exports.Frame=i,i.root=new i({key:"(speedscope root)",name:"(speedscope root)"});class l extends a{constructor(e,t){super(),this.frame=e,this.parent=t,this.children=[],this.frozen=!1}isRoot(){return this.frame===i.root}isFrozen(){return this.frozen}freeze(){this.frozen=!0}}exports.CallTreeNode=l;class o{constructor(s=0){this.name="",this.frames=new e.KeyedSet,this.appendOrderCalltreeRoot=new l(i.root,null),this.groupedCalltreeRoot=new l(i.root,null),this.samples=[],this.weights=[],this.valueFormatter=new t.RawValueFormatter,this.totalNonIdleWeight=null,this.totalWeight=s}getAppendOrderCalltreeRoot(){return this.appendOrderCalltreeRoot}getGroupedCalltreeRoot(){return this.groupedCalltreeRoot}formatValue(e){return this.valueFormatter.format(e)}setValueFormatter(e){this.valueFormatter=e}getWeightUnit(){return this.valueFormatter.unit}getName(){return this.name}setName(e){this.name=e}getTotalWeight(){return this.totalWeight}getTotalNonIdleWeight(){return null===this.totalNonIdleWeight&&(this.totalNonIdleWeight=this.groupedCalltreeRoot.children.reduce((e,t)=>e+t.getTotalWeight(),0)),this.totalNonIdleWeight}forEachCallGrouped(e,t){!function s(r,a){r.frame!==i.root&&e(r,a);let l=0;const o=[...r.children];o.sort((e,t)=>e.getTotalWeight()>t.getTotalWeight()?-1:1),o.forEach(function(e){s(e,a+l),l+=e.getTotalWeight()}),r.frame!==i.root&&t(r,a+r.getTotalWeight())}(this.groupedCalltreeRoot,0)}forEachCall(t,s){let r=[],a=0,l=0;for(let o of this.samples){let h=null;for(h=o;h&&h.frame!=i.root&&-1===r.indexOf(h);h=h.parent);for(;r.length>0&&(0,e.lastOf)(r)!=h;){s(r.pop(),a)}const n=[];for(let e=o;e&&e.frame!=i.root&&e!=h;e=e.parent)n.push(e);n.reverse();for(let e of n)t(e,a);r=r.concat(n),a+=this.weights[l++]}for(let e=r.length-1;e>=0;e--)s(r[e],a)}forEachFrame(e){this.frames.forEach(e)}forEachSample(e){for(let t=0;t{r.frames.getOrInsert(e).overwriteWeightWith(e)}),r}getInvertedProfileForCallersOf(e){const t=i.getOrInsert(this.frames,e),s=new h,r=[];!function e(s){if(s.frame===t)r.push(s);else for(let t of s.children)e(t)}(this.appendOrderCalltreeRoot);for(let e of r){const t=[];for(let s=e;null!=s&&s.frame!==i.root;s=s.parent)t.push(s.frame);s.appendSampleWithWeight(t,e.getTotalWeight())}const a=s.build();return a.name=this.name,a.valueFormatter=this.valueFormatter,a}getProfileForCalleesOf(e){const t=i.getOrInsert(this.frames,e),s=new h;!function e(r){if(r.frame===t)!function(e){const t=[];!function e(r){t.push(r.frame),s.appendSampleWithWeight(t,r.getSelfWeight());for(let t of r.children)e(t);t.pop()}(e)}(r);else for(let t of r.children)e(t)}(this.appendOrderCalltreeRoot);const r=s.build();return r.name=this.name,r.valueFormatter=this.valueFormatter,r}demangle(){return s(this,void 0,void 0,function*(){let e=null;for(let t of this.frames)t.name.startsWith("__Z")&&(e||(e=(yield r).demangleCpp),t.name=e(t.name))})}remapNames(e){for(let t of this.frames)t.name=e(t.name)}}exports.Profile=o;class h extends o{constructor(){super(...arguments),this.pendingSample=null}_appendSample(t,s,r){if(isNaN(s))throw new Error("invalid weight");let a=r?this.appendOrderCalltreeRoot:this.groupedCalltreeRoot,o=new Set;for(let h of t){const t=i.getOrInsert(this.frames,h),n=r?(0,e.lastOf)(a.children):a.children.find(e=>e.frame===t);if(n&&!n.isFrozen()&&n.frame==t)a=n;else{const e=a;a=new l(t,a),e.children.push(a)}a.addToTotalWeight(s),o.add(a.frame)}if(a.addToSelfWeight(s),r)for(let e of a.children)e.freeze();if(r){a.frame.addToSelfWeight(s);for(let e of o)e.addToTotalWeight(s);a===(0,e.lastOf)(this.samples)?this.weights[this.weights.length-1]+=s:(this.samples.push(a),this.weights.push(s))}}appendSampleWithWeight(e,t){if(0!==t){if(t<0)throw new Error("Samples must have positive weights");this._appendSample(e,t,!0),this._appendSample(e,t,!1)}}appendSampleWithTimestamp(e,t){if(this.pendingSample){if(t0?this.appendSampleWithWeight(this.pendingSample.stack,this.pendingSample.centralTimestamp-this.pendingSample.startTimestamp):(this.appendSampleWithWeight(this.pendingSample.stack,1),this.setValueFormatter(new t.RawValueFormatter))),this.totalWeight=Math.max(this.totalWeight,this.weights.reduce((e,t)=>e+t,0)),this}}exports.StackListProfileBuilder=h;class n extends o{constructor(){super(...arguments),this.appendOrderStack=[this.appendOrderCalltreeRoot],this.groupedOrderStack=[this.groupedCalltreeRoot],this.framesInStack=new Map,this.stack=[],this.lastValue=0}addWeightsToFrames(t){const s=t-this.lastValue;for(let e of this.framesInStack.keys())e.addToTotalWeight(s);const r=(0,e.lastOf)(this.stack);r&&r.addToSelfWeight(s)}addWeightsToNodes(t,s){const r=t-this.lastValue;for(let e of s)e.addToTotalWeight(r);const a=(0,e.lastOf)(s);a&&a.addToSelfWeight(r)}_enterFrame(t,s,r){let a=r?this.appendOrderStack:this.groupedOrderStack;this.addWeightsToNodes(s,a);let i=(0,e.lastOf)(a);if(i){if(r){const e=s-this.lastValue;if(e>0)this.samples.push(i),this.weights.push(s-this.lastValue);else if(e<0)throw new Error(`Samples must be provided in increasing order of cumulative value. Last sample was ${this.lastValue}, this sample was ${s}`)}const o=r?(0,e.lastOf)(i.children):i.children.find(e=>e.frame===t);let h;o&&!o.isFrozen()&&o.frame==t?h=o:(h=new l(t,i),i.children.push(h)),a.push(h)}}enterFrame(e,t){const s=i.getOrInsert(this.frames,e);this.addWeightsToFrames(t),this._enterFrame(s,t,!0),this._enterFrame(s,t,!1),this.stack.push(s);const r=this.framesInStack.get(s)||0;this.framesInStack.set(s,r+1),this.lastValue=t}_leaveFrame(e,t,s){let r=s?this.appendOrderStack:this.groupedOrderStack;if(this.addWeightsToNodes(t,r),s){const s=this.appendOrderStack.pop();if(null==s)throw new Error(`Trying to leave ${e.key} when stack is empty`);if(null==this.lastValue)throw new Error(`Trying to leave a ${e.key} before any have been entered`);s.freeze();const r=t-this.lastValue;if(r>0)this.samples.push(s),this.weights.push(t-this.lastValue);else if(r<0)throw new Error(`Samples must be provided in increasing order of cumulative value. Last sample was ${this.lastValue}, this sample was ${t}`)}else this.groupedOrderStack.pop()}leaveFrame(e,t){const s=i.getOrInsert(this.frames,e);this.addWeightsToFrames(t),this._leaveFrame(s,t,!0),this._leaveFrame(s,t,!1),this.stack.pop();const r=this.framesInStack.get(s);null!=r&&(1===r?this.framesInStack.delete(s):this.framesInStack.set(s,r-1),this.lastValue=t,this.totalWeight=Math.max(this.totalWeight,this.lastValue))}build(){if(this.appendOrderStack.length>1||this.groupedOrderStack.length>1)throw new Error("Tried to complete profile construction with a non-empty stack");return this}}exports.CallTreeProfileBuilder=n; -},{"./utils":60,"./value-formatters":110,"_bundle_loader":74,"./demangle-cpp":[["demangle-cpp.6caf93ee.js",135],"demangle-cpp.6caf93ee.map",135]}],111:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=exports.FileFormat=void 0;!function(e){let t,o;!function(e){e.EVENTED="evented",e.SAMPLED="sampled"}(t=e.ProfileType||(e.ProfileType={})),function(e){e.OPEN_FRAME="O",e.CLOSE_FRAME="C"}(o=e.EventType||(e.EventType={}))}(e||(exports.FileFormat=e={})); -},{}],19:[function(require,module,exports) { -module.exports={name:"speedscope",version:"1.5.2",description:"",repository:"jlfwong/speedscope",main:"index.js",bin:{speedscope:"./bin/cli.js"},scripts:{deploy:"./scripts/deploy.sh",prepack:"./scripts/build-release.sh",prettier:"prettier --write 'src/**/*.ts' 'src/**/*.tsx'",lint:"eslint 'src/**/*.ts' 'src/**/*.tsx'",jest:"./scripts/test-setup.sh && jest --runInBand",coverage:"npm run jest -- --coverage && coveralls < coverage/lcov.info",test:"tsc --noEmit && npm run lint && npm run coverage",serve:"parcel assets/index.html --open --no-autoinstall"},files:["bin/cli.js","dist/release/**","!*.map"],browserslist:["last 2 Chrome versions","last 2 Firefox versions"],author:"",license:"MIT",devDependencies:{"@types/jest":"22.2.3","@types/jszip":"3.1.4","@types/node":"10.1.4","@types/pako":"1.0.0",aphrodite:"2.1.0",coveralls:"3.0.1",eslint:"4.19.1","eslint-plugin-prettier":"2.6.0",jest:"23.0.1",jsverify:"0.8.3",jszip:"3.1.5",pako:"1.0.6","parcel-bundler":"1.9.2",preact:"8.2.7","preact-redux":"jlfwong/preact-redux#a56dcc4",prettier:"1.12.0",protobufjs:"6.8.8",quicktype:"15.0.45",redux:"^4.0.0","ts-jest":"22.4.6",typescript:"2.8.1","typescript-eslint-parser":"17.0.1","uglify-es":"3.2.2"},jest:{transform:{"^.+\\.tsx?$":"ts-jest"},testRegex:"\\.test\\.tsx?$",collectCoverageFrom:["**/*.{ts,tsx}","!**/*.d.{ts,tsx}"],moduleFileExtensions:["ts","tsx","js","jsx","json"]},dependencies:{opn:"5.3.0"}}; -},{}],82:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.exportProfileGroup=r,exports.importSpeedscopeProfiles=s,exports.saveToFile=l;var e=require("./profile"),t=require("./value-formatters"),n=require("./file-format-spec");function r(e){const t=[],n=new Map;function r(e){let r=n.get(e);if(null==r){const o={name:e.name};null!=e.file&&(o.file=e.file),null!=e.line&&(o.line=e.line),null!=e.col&&(o.col=e.col),r=t.length,n.set(e,r),t.push(o)}return r}const a={exporter:`speedscope@${require("../../package.json").version}`,name:e.name,activeProfileIndex:e.indexToView,$schema:"https://www.speedscope.app/file-format-schema.json",shared:{frames:t},profiles:[]};for(let t of e.profiles)a.profiles.push(o(t,r));return a}function o(e,t){const r={type:n.FileFormat.ProfileType.EVENTED,name:e.getName(),unit:e.getWeightUnit(),startValue:0,endValue:e.getTotalWeight(),events:[]};return e.forEachCall((e,o)=>{r.events.push({type:n.FileFormat.EventType.OPEN_FRAME,frame:t(e.frame),at:o})},(e,o)=>{r.events.push({type:n.FileFormat.EventType.CLOSE_FRAME,frame:t(e.frame),at:o})}),r}function a(r,o){function a(e){const{name:n,unit:o}=r;switch(o){case"nanoseconds":case"microseconds":case"milliseconds":case"seconds":e.setValueFormatter(new t.TimeFormatter(o));break;case"bytes":e.setValueFormatter(new t.ByteFormatter);break;case"none":e.setValueFormatter(new t.RawValueFormatter)}e.setName(n)}switch(r.type){case n.FileFormat.ProfileType.EVENTED:return function(t){const{startValue:r,endValue:s,events:l}=t,i=new e.CallTreeProfileBuilder(s-r);a(i);const c=o.map((e,t)=>Object.assign({key:t},e));for(let e of l)switch(e.type){case n.FileFormat.EventType.OPEN_FRAME:i.enterFrame(c[e.frame],e.at-r);break;case n.FileFormat.EventType.CLOSE_FRAME:i.leaveFrame(c[e.frame],e.at-r)}return i.build()}(r);case n.FileFormat.ProfileType.SAMPLED:return function(t){const{startValue:n,endValue:r,samples:s,weights:l}=t,i=new e.StackListProfileBuilder(r-n);a(i);const c=o.map((e,t)=>Object.assign({key:t},e));if(s.length!==l.length)throw new Error(`Expected samples.length (${s.length}) to equal weights.length (${l.length})`);for(let e=0;ec[e]),n)}return i.build()}(r)}}function s(e){return{name:e.name||e.profiles[0].name||"profile",indexToView:e.activeProfileIndex||0,profiles:e.profiles.map(t=>a(t,e.shared.frames))}}function l(e){const t=r(e),n=new Blob([JSON.stringify(t)],{type:"text/json"}),o=`${(t.name?t.name.split(".")[0]:"profile").replace(/\W+/g,"_")}.speedscope.json`;console.log("Saving",o);const a=document.createElement("a");a.download=o,a.href=window.URL.createObjectURL(n),a.dataset.downloadurl=["text/json",a.download,a.href].join(":"),document.body.appendChild(a),a.click(),document.body.removeChild(a)} -},{"./profile":109,"./value-formatters":110,"./file-format-spec":111,"../../package.json":19}],72:[function(require,module,exports) { -module.exports="perf-vertx-stacks-01-collapsed-all.1841aedb.txt"; -},{}],34:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Application=exports.GLCanvas=exports.Toolbar=void 0;var e=require("preact"),t=require("aphrodite"),o=require("./style"),i=require("../lib/emscripten"),s=require("./sandwich-view"),r=require("../lib/file-format"),n=require("../store"),a=require("../lib/typed-redux"),l=require("./flamechart-view-container"),c=require("../gl/graphics"),d=function(e,t,o,i){return new(o||(o=Promise))(function(s,r){function n(e){try{l(i.next(e))}catch(e){r(e)}}function a(e){try{l(i.throw(e))}catch(e){r(e)}}function l(e){e.done?s(e.value):new o(function(t){t(e.value)}).then(n,a)}l((i=i.apply(e,t||[])).next())})};const p=require("_bundle_loader")(require.resolve("../import"));function h(e,t){return d(this,void 0,void 0,function*(){return(yield p).importProfileGroupFromText(e,t)})}function f(e,t){return d(this,void 0,void 0,function*(){return(yield p).importProfileGroupFromBase64(e,t)})}function m(e,t){return d(this,void 0,void 0,function*(){return(yield p).importProfilesFromArrayBuffer(e,t)})}function u(e){return d(this,void 0,void 0,function*(){return(yield p).importProfilesFromFile(e)})}function v(e){return d(this,void 0,void 0,function*(){return(yield p).importFromFileSystemDirectoryEntry(e)})}p.then(()=>{});const g=require("../../sample/profiles/stackcollapse/perf-vertx-stacks-01-collapsed-all.txt");class w extends a.StatelessComponent{constructor(){super(...arguments),this.setTimeOrder=(()=>{this.props.setViewMode(n.ViewMode.CHRONO_FLAME_CHART)}),this.setLeftHeavyOrder=(()=>{this.props.setViewMode(n.ViewMode.LEFT_HEAVY_FLAME_GRAPH)}),this.setSandwichView=(()=>{this.props.setViewMode(n.ViewMode.SANDWICH_VIEW)})}renderLeftContent(){return this.props.activeProfileState?(0,e.h)("div",{className:(0,t.css)(y.toolbarLeft)},(0,e.h)("div",{className:(0,t.css)(y.toolbarTab,this.props.viewMode===n.ViewMode.CHRONO_FLAME_CHART&&y.toolbarTabActive),onClick:this.setTimeOrder},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"๐Ÿ•ฐ"),"Time Order"),(0,e.h)("div",{className:(0,t.css)(y.toolbarTab,this.props.viewMode===n.ViewMode.LEFT_HEAVY_FLAME_GRAPH&&y.toolbarTabActive),onClick:this.setLeftHeavyOrder},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"โฌ…๏ธ"),"Left Heavy"),(0,e.h)("div",{className:(0,t.css)(y.toolbarTab,this.props.viewMode===n.ViewMode.SANDWICH_VIEW&&y.toolbarTabActive),onClick:this.setSandwichView},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"๐Ÿฅช"),"Sandwich")):null}renderCenterContent(){const{activeProfileState:o,profileGroup:i}=this.props;if(o&&i){const{index:r}=o;if(1===i.profiles.length)return o.profile.getName();{function s(o,i,s){return(0,e.h)("button",{disabled:i,onClick:s,className:(0,t.css)(y.emoji,y.toolbarProfileNavButton,i&&y.toolbarProfileNavButtonDisabled)},o)}const n=s("โฌ…๏ธ",0===r,()=>this.props.setProfileIndexToView(r-1)),a=s("โžก๏ธ",r>=i.profiles.length-1,()=>this.props.setProfileIndexToView(r+1));return(0,e.h)("div",{className:(0,t.css)(y.toolbarCenter)},n,o.profile.getName()," ",(0,e.h)("span",{className:(0,t.css)(y.toolbarProfileIndex)},"(",o.index+1,"/",i.profiles.length,")"),a)}}return"๐Ÿ”ฌspeedscope"}renderRightContent(){const o=(0,e.h)("div",{className:(0,t.css)(y.toolbarTab),onClick:this.props.browseForFile},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"โคต๏ธ"),"Import"),i=(0,e.h)("div",{className:(0,t.css)(y.toolbarTab)},(0,e.h)("a",{href:"https://github.com/jlfwong/speedscope#usage",className:(0,t.css)(y.noLinkStyle),target:"_blank"},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"โ“"),"Help"));return(0,e.h)("div",{className:(0,t.css)(y.toolbarRight)},this.props.activeProfileState&&(0,e.h)("div",{className:(0,t.css)(y.toolbarTab),onClick:this.props.saveFile},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"โคด๏ธ"),"Export"),o,i)}render(){return(0,e.h)("div",{className:(0,t.css)(y.toolbar)},this.renderLeftContent(),this.renderCenterContent(),this.renderRightContent())}}exports.Toolbar=w;class b extends e.Component{constructor(){super(...arguments),this.canvas=null,this.ref=(e=>{e instanceof HTMLCanvasElement?this.canvas=e:this.canvas=null,this.props.setGLCanvas(this.canvas)}),this.container=null,this.containerRef=(e=>{e instanceof HTMLElement?this.container=e:this.container=null}),this.maybeResize=(()=>{if(!this.container)return;if(!this.props.canvasContext)return;let{width:e,height:t}=this.container.getBoundingClientRect();const o=e,i=t,s=e*window.devicePixelRatio,r=t*window.devicePixelRatio;this.props.canvasContext.gl.resize(s,r,o,i),this.props.canvasContext.gl.clear(new c.Graphics.Color(1,1,1,1))}),this.onWindowResize=(()=>{this.props.canvasContext&&this.props.canvasContext.requestFrame()})}componentWillReceiveProps(e){this.props.canvasContext!==e.canvasContext&&(this.props.canvasContext&&this.props.canvasContext.removeBeforeFrameHandler(this.maybeResize),e.canvasContext&&(e.canvasContext.addBeforeFrameHandler(this.maybeResize),e.canvasContext.requestFrame()))}componentDidMount(){window.addEventListener("resize",this.onWindowResize)}componentWillUnmount(){this.props.canvasContext&&this.props.canvasContext.removeBeforeFrameHandler(this.maybeResize),window.removeEventListener("resize",this.onWindowResize)}render(){return(0,e.h)("div",{ref:this.containerRef,className:(0,t.css)(y.glCanvasView)},(0,e.h)("canvas",{ref:this.ref,width:1,height:1}))}}exports.GLCanvas=b;class C extends a.StatelessComponent{constructor(){super(...arguments),this.loadExample=(()=>{this.loadProfile(()=>d(this,void 0,void 0,function*(){return yield h("perf-vertx-stacks-01-collapsed-all.txt",yield fetch(g).then(e=>e.text()))}))}),this.onDrop=(e=>{this.props.setDragActive(!1),e.preventDefault();const t=e.dataTransfer.items[0];if("webkitGetAsEntry"in t){const e=t.webkitGetAsEntry();if(e.isDirectory&&e.name.endsWith(".trace"))return console.log("Importing as Instruments.app .trace file"),void this.loadProfile(()=>d(this,void 0,void 0,function*(){return yield v(e)}))}let o=e.dataTransfer.files.item(0);o&&this.loadFromFile(o)}),this.onDragOver=(e=>{this.props.setDragActive(!0),e.preventDefault()}),this.onDragLeave=(e=>{this.props.setDragActive(!1),e.preventDefault()}),this.onWindowKeyPress=(e=>d(this,void 0,void 0,function*(){if("1"===e.key)this.props.setViewMode(n.ViewMode.CHRONO_FLAME_CHART);else if("2"===e.key)this.props.setViewMode(n.ViewMode.LEFT_HEAVY_FLAME_GRAPH);else if("3"===e.key)this.props.setViewMode(n.ViewMode.SANDWICH_VIEW);else if("r"===e.key){const{flattenRecursion:e}=this.props;this.props.setFlattenRecursion(!e)}else if("n"===e.key){const{activeProfileState:e}=this.props;e&&this.props.setProfileIndexToView(e.index+1)}else if("p"===e.key){const{activeProfileState:e}=this.props;e&&this.props.setProfileIndexToView(e.index-1)}})),this.saveFile=(()=>{if(this.props.profileGroup){const{name:e,indexToView:t,profiles:o}=this.props.profileGroup,i={name:e,indexToView:t,profiles:o.map(e=>e.profile)};(0,r.saveToFile)(i)}}),this.browseForFile=(()=>{const e=document.createElement("input");e.type="file",e.addEventListener("change",this.onFileSelect),e.click()}),this.onWindowKeyDown=(e=>d(this,void 0,void 0,function*(){"s"===e.key&&(e.ctrlKey||e.metaKey)?(e.preventDefault(),this.saveFile()):"o"===e.key&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),this.browseForFile())})),this.onDocumentPaste=(e=>{e.preventDefault(),e.stopPropagation();const t=e.clipboardData.getData("text");this.loadProfile(()=>d(this,void 0,void 0,function*(){return yield h("From Clipboard",t)}))}),this.onFileSelect=(e=>{const t=e.target.files.item(0);t&&this.loadFromFile(t)})}loadProfile(e){return d(this,void 0,void 0,function*(){if(this.props.setLoading(!0),yield new Promise(e=>setTimeout(e,0)),!this.props.glCanvas)return;console.time("import");let t=null;try{t=yield e()}catch(e){return console.log("Failed to load format",e),void this.props.setError(!0)}if(null==t)return alert("Unrecognized format! See documentation about supported formats."),void this.props.setLoading(!1);if(0===t.profiles.length)return alert("Successfully imported profile, but it's empty!"),void this.props.setLoading(!1);this.props.hashParams.title&&(t=Object.assign({name:this.props.hashParams.title},t)),document.title=`${t.name} - speedscope`;for(let e of t.profiles)yield e.demangle();for(let e of t.profiles){const t=this.props.hashParams.title||e.getName();e.setName(t)}console.timeEnd("import"),this.props.setProfileGroup(t),this.props.setLoading(!1)})}loadFromFile(e){this.loadProfile(()=>d(this,void 0,void 0,function*(){const t=yield u(e);if(t){for(let o of t.profiles)o.getName()||o.setName(e.name);return t}if(this.props.profileGroup&&this.props.activeProfileState){const t=new FileReader,o=new Promise(e=>{t.addEventListener("loadend",()=>{if("string"!=typeof t.result)throw new Error("Expected reader.result to be a string");e(t.result)})});t.readAsText(e);const s=yield o,r=(0,i.importEmscriptenSymbolMap)(s);if(r){const{profile:e,index:t}=this.props.activeProfileState;return console.log("Importing as emscripten symbol map"),e.remapNames(e=>r.get(e)||e),{name:this.props.profileGroup.name||"profile",indexToView:t,profiles:[e]}}}return null}))}componentDidMount(){window.addEventListener("keydown",this.onWindowKeyDown),window.addEventListener("keypress",this.onWindowKeyPress),document.addEventListener("paste",this.onDocumentPaste),this.maybeLoadHashParamProfile()}componentWillUnmount(){window.removeEventListener("keydown",this.onWindowKeyDown),window.removeEventListener("keypress",this.onWindowKeyPress),document.removeEventListener("paste",this.onDocumentPaste)}maybeLoadHashParamProfile(){return d(this,void 0,void 0,function*(){if(this.props.hashParams.profileURL){if(!n.canUseXHR)return void alert(`Cannot load a profile URL when loading from "${window.location.protocol}" URL protocol`);this.loadProfile(()=>d(this,void 0,void 0,function*(){const e=yield fetch(this.props.hashParams.profileURL);let t=new URL(this.props.hashParams.profileURL).pathname;return t.includes("/")&&(t=t.slice(t.lastIndexOf("/")+1)),yield m(t,yield e.arrayBuffer())}))}else if(this.props.hashParams.localProfilePath){window.speedscope={loadFileFromBase64:(e,t)=>{this.loadProfile(()=>f(e,t))}};const e=document.createElement("script");e.src=`file:///${this.props.hashParams.localProfilePath}`,document.head.appendChild(e)}})}renderLanding(){return(0,e.h)("div",{className:(0,t.css)(y.landingContainer)},(0,e.h)("div",{className:(0,t.css)(y.landingMessage)},(0,e.h)("p",{className:(0,t.css)(y.landingP)},"๐Ÿ‘‹ Hi there! Welcome to ๐Ÿ”ฌspeedscope, an interactive"," ",(0,e.h)("a",{className:(0,t.css)(y.link),href:"http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html"},"flamegraph")," ","visualizer. Use it to help you make your software faster."),n.canUseXHR?(0,e.h)("p",{className:(0,t.css)(y.landingP)},"Drag and drop a profile file onto this window to get started, click the big blue button below to browse for a profile to explore, or"," ",(0,e.h)("a",{tabIndex:0,className:(0,t.css)(y.link),onClick:this.loadExample},"click here")," ","to load an example profile."):(0,e.h)("p",{className:(0,t.css)(y.landingP)},"Drag and drop a profile file onto this window to get started, or click the big blue button below to browse for a profile to explore."),(0,e.h)("div",{className:(0,t.css)(y.browseButtonContainer)},(0,e.h)("input",{type:"file",name:"file",id:"file",onChange:this.onFileSelect,className:(0,t.css)(y.hide)}),(0,e.h)("label",{for:"file",className:(0,t.css)(y.browseButton),tabIndex:0},"Browse")),(0,e.h)("p",{className:(0,t.css)(y.landingP)},"See the"," ",(0,e.h)("a",{className:(0,t.css)(y.link),href:"https://github.com/jlfwong/speedscope#usage",target:"_blank"},"documentation")," ","for information about supported file formats, keyboard shortcuts, and how to navigate around the profile."),(0,e.h)("p",{className:(0,t.css)(y.landingP)},"speedscope is open source. Please"," ",(0,e.h)("a",{className:(0,t.css)(y.link),target:"_blank",href:"https://github.com/jlfwong/speedscope/issues"},"report any issues on GitHub"),".")))}renderError(){return(0,e.h)("div",{className:(0,t.css)(y.error)},(0,e.h)("div",null,"๐Ÿ˜ฟ Something went wrong."),(0,e.h)("div",null,"Check the JS console for more details."))}renderLoadingBar(){return(0,e.h)("div",{className:(0,t.css)(y.loading)})}renderContent(){const{viewMode:t,activeProfileState:o,error:i,loading:r,glCanvas:a}=this.props;if(i)return this.renderError();if(r)return this.renderLoadingBar();if(!o||!a)return this.renderLanding();switch(t){case n.ViewMode.CHRONO_FLAME_CHART:return(0,e.h)(l.ChronoFlamechartView,{activeProfileState:o,glCanvas:a});case n.ViewMode.LEFT_HEAVY_FLAME_GRAPH:return(0,e.h)(l.LeftHeavyFlamechartView,{activeProfileState:o,glCanvas:a});case n.ViewMode.SANDWICH_VIEW:return(0,e.h)(s.SandwichViewContainer,{activeProfileState:o,glCanvas:a})}}render(){return(0,e.h)("div",{onDrop:this.onDrop,onDragOver:this.onDragOver,onDragLeave:this.onDragLeave,className:(0,t.css)(y.root,this.props.dragActive&&y.dragTargetRoot)},(0,e.h)(b,{setGLCanvas:this.props.setGLCanvas,canvasContext:this.props.canvasContext}),(0,e.h)(w,Object.assign({saveFile:this.saveFile,browseForFile:this.browseForFile},this.props)),(0,e.h)("div",{className:(0,t.css)(y.contentContainer)},this.renderContent()),this.props.dragActive&&(0,e.h)("div",{className:(0,t.css)(y.dragTarget)}))}}exports.Application=C;const y=t.StyleSheet.create({glCanvasView:{position:"absolute",width:"100vw",height:"100vh",zIndex:-1,pointerEvents:"none"},error:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%"},loading:{height:3,marginBottom:-3,background:o.Colors.DARK_BLUE,transformOrigin:"0% 50%",animationName:[{from:{transform:"scaleX(0)"},to:{transform:"scaleX(1)"}}],animationTimingFunction:"cubic-bezier(0, 1, 0, 1)",animationDuration:"30s"},root:{width:"100vw",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",position:"relative",fontFamily:o.FontFamily.MONOSPACE,lineHeight:"20px"},dragTargetRoot:{cursor:"copy"},dragTarget:{boxSizing:"border-box",position:"absolute",top:0,left:0,width:"100%",height:"100%",border:`5px dashed ${o.Colors.DARK_BLUE}`,pointerEvents:"none"},contentContainer:{position:"relative",display:"flex",overflow:"hidden",flexDirection:"column",flex:1},landingContainer:{display:"flex",alignItems:"center",justifyContent:"center",flex:1},landingMessage:{maxWidth:600},landingP:{marginBottom:16},hide:{display:"none"},browseButtonContainer:{display:"flex",alignItems:"center",justifyContent:"center"},browseButton:{marginBottom:16,height:72,flex:1,maxWidth:256,textAlign:"center",fontSize:o.FontSize.BIG_BUTTON,lineHeight:"72px",background:o.Colors.DARK_BLUE,color:o.Colors.WHITE,transition:`all ${o.Duration.HOVER_CHANGE} ease-in`,":hover":{background:o.Colors.BRIGHT_BLUE}},link:{color:o.Colors.BRIGHT_BLUE,cursor:"pointer",textDecoration:"none"},toolbar:{height:o.Sizes.TOOLBAR_HEIGHT,flexShrink:0,background:o.Colors.BLACK,color:o.Colors.WHITE,textAlign:"center",fontFamily:o.FontFamily.MONOSPACE,fontSize:o.FontSize.TITLE,lineHeight:`${o.Sizes.TOOLBAR_TAB_HEIGHT}px`,userSelect:"none"},toolbarLeft:{position:"absolute",height:o.Sizes.TOOLBAR_HEIGHT,overflow:"hidden",top:0,left:0,marginRight:2,textAlign:"left"},toolbarCenter:{paddingTop:1,height:o.Sizes.TOOLBAR_HEIGHT},toolbarRight:{height:o.Sizes.TOOLBAR_HEIGHT,overflow:"hidden",position:"absolute",top:0,right:0,marginRight:2,textAlign:"right"},toolbarProfileIndex:{color:o.Colors.LIGHT_GRAY},toolbarProfileNavButton:{opacity:.8,fontSize:o.FontSize.TITLE,lineHeight:`${o.Sizes.TOOLBAR_TAB_HEIGHT}px`,":hover":{opacity:1},background:"none",border:"none",padding:0,marginLeft:"0.3em",marginRight:"0.3em",transition:`all ${o.Duration.HOVER_CHANGE} ease-in`},toolbarProfileNavButtonDisabled:{opacity:.5,":hover":{opacity:.5}},toolbarTab:{background:o.Colors.DARK_GRAY,marginTop:o.Sizes.SEPARATOR_HEIGHT,height:o.Sizes.TOOLBAR_TAB_HEIGHT,lineHeight:`${o.Sizes.TOOLBAR_TAB_HEIGHT}px`,paddingLeft:2,paddingRight:8,display:"inline-block",marginLeft:2,transition:`all ${o.Duration.HOVER_CHANGE} ease-in`,":hover":{background:o.Colors.GRAY}},toolbarTabActive:{background:o.Colors.BRIGHT_BLUE,":hover":{background:o.Colors.BRIGHT_BLUE}},noLinkStyle:{textDecoration:"none",color:"inherit"},emoji:{display:"inline-block",verticalAlign:"middle",paddingTop:"0px",marginRight:"0.3em"}}); -},{"preact":24,"aphrodite":76,"./style":78,"../lib/emscripten":80,"./sandwich-view":68,"../lib/file-format":82,"../store":29,"../lib/typed-redux":36,"./flamechart-view-container":70,"../gl/graphics":42,"_bundle_loader":74,"../import":[["import.0a51feeb.js",101],"import.0a51feeb.map",101],"../../sample/profiles/stackcollapse/perf-vertx-stacks-01-collapsed-all.txt":72}],21:[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ApplicationContainer=void 0;var e=require("../lib/typed-redux"),t=require("./application"),i=require("../store/getters"),o=require("../store/actions"),n=require("../gl/graphics");const r=exports.ApplicationContainer=(0,e.createContainer)(t.Application,(t,r)=>{const{flattenRecursion:s,profileGroup:a}=t;let l=null;if(a&&a.profiles.length>a.indexToView){const e=a.indexToView,t=a.profiles[e];l=Object.assign({},a.profiles[a.indexToView],{profile:(0,i.getProfileToView)({profile:t.profile,flattenRecursion:s}),index:a.indexToView})}function c(t){return(0,e.bindActionCreator)(r,t)}const p={setGLCanvas:c(o.actions.setGLCanvas),setLoading:c(o.actions.setLoading),setError:c(o.actions.setError),setProfileGroup:c(o.actions.setProfileGroup),setDragActive:c(o.actions.setDragActive),setViewMode:c(o.actions.setViewMode),setFlattenRecursion:c(o.actions.setFlattenRecursion),setProfileIndexToView:c(o.actions.setProfileIndexToView)};return Object.assign({activeProfileState:l,dispatch:r,canvasContext:t.glCanvas?(0,i.getCanvasContext)(t.glCanvas):null,resizeCanvas:(e,o,r,s)=>{if(t.glCanvas){const a=(0,i.getCanvasContext)(t.glCanvas).gl;a.resize(e,o,r,s),a.clear(new n.Graphics.Color(1,1,1,1))}}},p,t)}); -},{"../lib/typed-redux":36,"./application":34,"../store/getters":38,"../store/actions":40,"../gl/graphics":42}],13:[function(require,module,exports) { -"use strict";var e=require("preact"),o=require("./store"),t=require("preact-redux"),r=require("./views/application-container");console.log(`speedscope v${require("../package.json").version}`),module.hot&&(module.hot.dispose(()=>{(0,e.render)((0,e.h)("div",null),document.body,document.body.lastElementChild||void 0)}),module.hot.accept());const i=window.store,d=(0,o.createApplicationStore)(i?i.getState():{});window.store=d,(0,e.render)((0,e.h)(t.Provider,{store:d},(0,e.h)(r.ApplicationContainer,null)),document.body,document.body.lastElementChild||void 0); -},{"preact":24,"./store":29,"preact-redux":26,"./views/application-container":21,"../package.json":19}],201:[function(require,module,exports) { -module.exports=function(n){return new Promise(function(e,o){var r=document.createElement("script");r.async=!0,r.type="text/javascript",r.charset="utf-8",r.src=n,r.onerror=function(n){r.onerror=r.onload=null,o(n)},r.onload=function(){r.onerror=r.onload=null,e()},document.getElementsByTagName("head")[0].appendChild(r)})}; -},{}],0:[function(require,module,exports) { -var b=require(74);b.register("js",require(201)); -},{}]},{},[0,13], null) +parcelRequire=function(e,r,n,t){var i="function"==typeof parcelRequire&&parcelRequire,o="function"==typeof require&&require;function u(n,t){if(!r[n]){if(!e[n]){var f="function"==typeof parcelRequire&&parcelRequire;if(!t&&f)return f(n,!0);if(i)return i(n,!0);if(o&&"string"==typeof n)return o(n);var c=new Error("Cannot find module '"+n+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[n][1][r]||r};var l=r[n]=new u.Module(n);e[n][0].call(l.exports,p,l,l.exports,this)}return r[n].exports;function p(e){return u(p.resolve(e))}}u.isParcelRequire=!0,u.Module=function(e){this.id=e,this.bundle=u,this.exports={}},u.modules=e,u.cache=r,u.parent=i,u.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]};for(var f=0;f2;)n.push(arguments[s]);for(i&&null!=i.children&&(n.length||n.push(i.children),delete i.children);n.length;)if((a=n.pop())&&void 0!==a.pop)for(s=a.length;s--;)n.push(a[s]);else"boolean"==typeof a&&(a=null),(p="function"!=typeof r)&&(null==a?a="":"number"==typeof a?a=String(a):"string"!=typeof a&&(p=!1)),p&&l?c[c.length-1]+=a:c===o?c=[a]:c.push(a),l=p;var u=new e;return u.nodeName=r,u.children=c,u.attributes=null==i?void 0:i,u.key=null==i?void 0:i.key,void 0!==t.vnode&&t.vnode(u),u}function i(e,t){for(var n in t)e[n]=t[n];return e}var l="function"==typeof Promise?Promise.resolve().then.bind(Promise.resolve()):setTimeout;function a(e,t){return r(e.nodeName,i(i({},e.attributes),t),arguments.length>2?[].slice.call(arguments,2):e.children)}var p=/acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i,s=[];function c(e){!e._dirty&&(e._dirty=!0)&&1==s.push(e)&&(t.debounceRendering||l)(u)}function u(){var e,t=s;for(s=[];e=t.pop();)e._dirty&&A(e)}function f(e,t,n){return"string"==typeof t||"number"==typeof t?void 0!==e.splitText:"string"==typeof t.nodeName?!e._componentConstructor&&d(e,t.nodeName):n||e._componentConstructor===t.nodeName}function d(e,t){return e.normalizedNodeName===t||e.nodeName.toLowerCase()===t.toLowerCase()}function _(e){var t=i({},e.attributes);t.children=e.children;var n=e.nodeName.defaultProps;if(void 0!==n)for(var o in n)void 0===t[o]&&(t[o]=n[o]);return t}function v(e,t){var n=t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e);return n.normalizedNodeName=e,n}function m(e){var t=e.parentNode;t&&t.removeChild(e)}function h(e,t,n,o,r){if("className"===t&&(t="class"),"key"===t);else if("ref"===t)n&&n(null),o&&o(e);else if("class"!==t||r)if("style"===t){if(o&&"string"!=typeof o&&"string"!=typeof n||(e.style.cssText=o||""),o&&"object"==typeof o){if("string"!=typeof n)for(var i in n)i in o||(e.style[i]="");for(var i in o)e.style[i]="number"==typeof o[i]&&!1===p.test(i)?o[i]+"px":o[i]}}else if("dangerouslySetInnerHTML"===t)o&&(e.innerHTML=o.__html||"");else if("o"==t[0]&&"n"==t[1]){var l=t!==(t=t.replace(/Capture$/,""));t=t.toLowerCase().substring(2),o?n||e.addEventListener(t,y,l):e.removeEventListener(t,y,l),(e._listeners||(e._listeners={}))[t]=o}else if("list"!==t&&"type"!==t&&!r&&t in e)b(e,t,null==o?"":o),null!=o&&!1!==o||e.removeAttribute(t);else{var a=r&&t!==(t=t.replace(/^xlink\:?/,""));null==o||!1===o?a?e.removeAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase()):e.removeAttribute(t):"function"!=typeof o&&(a?e.setAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase(),o):e.setAttribute(t,o))}else e.className=o||""}function b(e,t,n){try{e[t]=n}catch(e){}}function y(e){return this._listeners[e.type](t.event&&t.event(e)||e)}var x=[],C=0,g=!1,N=!1;function k(){for(var e;e=x.pop();)t.afterMount&&t.afterMount(e),e.componentDidMount&&e.componentDidMount()}function w(e,t,n,o,r,i){C++||(g=null!=r&&void 0!==r.ownerSVGElement,N=null!=e&&!("__preactattr_"in e));var l=S(e,t,n,o,i);return r&&l.parentNode!==r&&r.appendChild(l),--C||(N=!1,i||k()),l}function S(e,t,n,o,r){var i=e,l=g;if(null!=t&&"boolean"!=typeof t||(t=""),"string"==typeof t||"number"==typeof t)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=t&&(e.nodeValue=t):(i=document.createTextNode(t),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),L(e,!0))),i.__preactattr_=!0,i;var a=t.nodeName;if("function"==typeof a)return D(e,t,n,o);if(g="svg"===a||"foreignObject"!==a&&g,a=String(a),(!e||!d(e,a))&&(i=v(a,g),e)){for(;e.firstChild;)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),L(e,!0)}var p=i.firstChild,s=i.__preactattr_,c=t.children;if(null==s){s=i.__preactattr_={};for(var u=i.attributes,f=u.length;f--;)s[u[f].name]=u[f].value}return!N&&c&&1===c.length&&"string"==typeof c[0]&&null!=p&&void 0!==p.splitText&&null==p.nextSibling?p.nodeValue!=c[0]&&(p.nodeValue=c[0]):(c&&c.length||null!=p)&&U(i,c,n,o,N||null!=s.dangerouslySetInnerHTML),P(i,t.attributes,s),g=l,i}function U(e,t,n,o,r){var i,l,a,p,s,c=e.childNodes,u=[],d={},_=0,v=0,h=c.length,b=0,y=t?t.length:0;if(0!==h)for(var x=0;x0?"Unexpected "+(c.length>1?"keys":"key")+' "'+c.join('", "')+'" found in '+a+'. Expected to find one of the known reducer keys instead: "'+i.join('", "')+'". Unexpected keys will be ignored.':void 0}function f(e){Object.keys(e).forEach(function(t){var r=e[t];if(void 0===r(void 0,{type:n.INIT}))throw new Error('Reducer "'+t+"\" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.");if(void 0===r(void 0,{type:"@@redux/PROBE_UNKNOWN_ACTION_"+Math.random().toString(36).substring(7).split("").join(".")}))throw new Error('Reducer "'+t+"\" returned undefined when probed with a random type. Don't try to handle "+n.INIT+' or other actions in "redux/*" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.')})}function l(e){for(var t=Object.keys(e),r={},n=0;n0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];if(u)throw u;for(var n=!1,o={},a=0;a=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},h=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},b=!1;function y(){b||(b=!0,p(" does not support changing `store` on the fly. It is most likely that you see this error because you updated to Redux 2.x and React Redux 2.x which no longer hot reload reducers automatically. See https://github.com/reactjs/react-redux/releases/tag/v2.0.0 for the migration instructions."))}function v(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"store",o=arguments[1]||n+"Subscription",i=function(t){function e(r,o){a(this,e);var i=h(this,t.call(this,r,o));return i[n]=r.store,i}return f(e,t),e.prototype.getChildContext=function(){var t;return(t={})[n]=this[n],t[o]=null,t},e.prototype.render=function(){return r.only(this.props.children)},e}(e.Component);return i.prototype.componentWillReceiveProps=function(t){this[n]!==t.store&&y()},i.childContextTypes=((t={})[n]=u.isRequired,t[o]=s,t),i}var m=v(),P={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},O={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},S=Object.defineProperty,g=Object.getOwnPropertyNames,w=Object.getOwnPropertySymbols,C=Object.getOwnPropertyDescriptor,j=Object.getPrototypeOf,T=j&&j(Object);function x(t,e,n){if("string"!=typeof e){if(T){var r=j(e);r&&r!==T&&x(t,r,n)}var o=g(e);w&&(o=o.concat(w(e)));for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:{},i=o.getDisplayName,p=void 0===i?function(t){return"ConnectAdvanced("+t+")"}:i,c=o.methodName,b=void 0===c?"connectAdvanced":c,y=o.renderCountProp,v=void 0===y?void 0:y,m=o.shouldHandleStateChanges,P=void 0===m||m,O=o.storeKey,S=void 0===O?"store":O,g=o.withRef,w=void 0!==g&&g,C=l(o,["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef"]),j=S+"Subscription",T=R++,x=((n={})[S]=u,n[j]=s,n),E=((r={})[j]=s,r);return function(n){q("function"==typeof n,"You must pass a component to the function returned by "+b+". Instead received "+JSON.stringify(n));var r=n.displayName||n.name||"Component",o=p(r),i=d({},C,{getDisplayName:p,methodName:b,renderCountProp:v,shouldHandleStateChanges:P,storeKey:S,withRef:w,displayName:o,wrappedComponentName:r,WrappedComponent:n}),s=function(r){function s(t,e){a(this,s);var n=h(this,r.call(this,t,e));return n.version=T,n.state={},n.renderCount=0,n.store=t[S]||e[S],n.propsMode=Boolean(t[S]),n.setWrappedInstance=n.setWrappedInstance.bind(n),q(n.store,'Could not find "'+S+'" in either the context or props of "'+o+'". Either wrap the root component in a , or explicitly pass "'+S+'" as a prop to "'+o+'".'),n.initSelector(),n.initSubscription(),n}return f(s,r),s.prototype.getChildContext=function(){var t,e=this.propsMode?null:this.subscription;return(t={})[j]=e||this.context[j],t},s.prototype.componentDidMount=function(){P&&(this.subscription.trySubscribe(),this.selector.run(this.props),this.selector.shouldComponentUpdate&&this.forceUpdate())},s.prototype.componentWillReceiveProps=function(t){this.selector.run(t)},s.prototype.shouldComponentUpdate=function(){return this.selector.shouldComponentUpdate},s.prototype.componentWillUnmount=function(){this.subscription&&this.subscription.tryUnsubscribe(),this.subscription=null,this.notifyNestedSubs=W,this.store=null,this.selector.run=W,this.selector.shouldComponentUpdate=!1},s.prototype.getWrappedInstance=function(){return q(w,"To access the wrapped instance, you need to specify { withRef: true } in the options argument of the "+b+"() call."),this.wrappedInstance},s.prototype.setWrappedInstance=function(t){this.wrappedInstance=t},s.prototype.initSelector=function(){var e=t(this.store.dispatch,i);this.selector=F(e,this.store),this.selector.run(this.props)},s.prototype.initSubscription=function(){if(P){var t=(this.propsMode?this.props:this.context)[j];this.subscription=new M(this.store,t,this.onStateChange.bind(this)),this.notifyNestedSubs=this.subscription.notifyNestedSubs.bind(this.subscription)}},s.prototype.onStateChange=function(){this.selector.run(this.props),this.selector.shouldComponentUpdate?(this.componentDidUpdate=this.notifyNestedSubsOnComponentDidUpdate,this.setState(I)):this.notifyNestedSubs()},s.prototype.notifyNestedSubsOnComponentDidUpdate=function(){this.componentDidUpdate=void 0,this.notifyNestedSubs()},s.prototype.isSubscribed=function(){return Boolean(this.subscription)&&this.subscription.isSubscribed()},s.prototype.addExtraProps=function(t){if(!(w||v||this.propsMode&&this.subscription))return t;var e=d({},t);return w&&(e.ref=this.setWrappedInstance),v&&(e[v]=this.renderCount++),this.propsMode&&this.subscription&&(e[j]=this.subscription),e},s.prototype.render=function(){var t=this.selector;if(t.shouldComponentUpdate=!1,t.error)throw t.error;return(0,e.h)(n,this.addExtraProps(t.props))},s}(e.Component);return s.WrappedComponent=n,s.displayName=o,s.childContextTypes=E,s.contextTypes=x,s.prototype.componentWillUpdate=function(){var t=this;if(this.version!==T){this.version=T,this.initSelector();var e=[];this.subscription&&(e=this.subscription.listeners.get(),this.subscription.tryUnsubscribe()),this.initSubscription(),P&&(this.subscription.trySubscribe(),e.forEach(function(e){return t.subscription.listeners.subscribe(e)}))}},N(s,n)}}var _=Object.prototype.hasOwnProperty;function B(t,e){return t===e?0!==t||0!==e||1/t==1/e:t!=t&&e!=e}function H(t,e){if(B(t,e))return!0;if("object"!==(void 0===t?"undefined":c(t))||null===t||"object"!==(void 0===e?"undefined":c(e))||null===e)return!1;var n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(var o=0;o=0;r--){var o=e[r](t);if(o)return o}return function(e,r){throw new Error("Invalid value of type "+(void 0===t?"undefined":c(t))+" for "+n+" argument when connecting component "+r.wrappedComponentName+".")}}function Wt(t,e){return t===e}function Ft(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.connectHOC,n=void 0===e?A:e,r=t.mapStateToPropsFactories,o=void 0===r?Ct:r,i=t.mapDispatchToPropsFactories,s=void 0===i?St:i,u=t.mergePropsFactories,p=void 0===u?qt:u,c=t.selectorFactory,a=void 0===c?Rt:c;return function(t,e,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},u=i.pure,c=void 0===u||u,f=i.areStatesEqual,h=void 0===f?Wt:f,b=i.areOwnPropsEqual,y=void 0===b?H:b,v=i.areStatePropsEqual,m=void 0===v?H:v,P=i.areMergedPropsEqual,O=void 0===P?H:P,S=l(i,["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"]),g=It(t,o,"mapStateToProps"),w=It(e,s,"mapDispatchToProps"),C=It(r,p,"mergeProps");return n(a,d({methodName:"connect",getDisplayName:function(t){return"Connect("+t+")"},shouldHandleStateChanges:Boolean(t),initMapStateToProps:g,initMapDispatchToProps:w,initMergeProps:C,pure:c,areStatesEqual:h,areOwnPropsEqual:y,areStatePropsEqual:m,areMergedPropsEqual:O},S))}}var At=Ft(),_t={Provider:m,connect:At,connectAdvanced:A};exports.Provider=m,exports.connect=At,exports.connectAdvanced=A,exports.default=_t; +},{"preact":24,"redux":32}],36:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.StatelessComponent=void 0,exports.actionCreator=n,exports.setter=o,exports.createContainer=s,exports.bindActionCreator=c;var e=require("preact-redux"),t=require("preact");const r=new Set;function n(e){if(r.has(e))throw new Error(`Cannot re-use action type name: ${e}`);const t=(t={})=>({type:e,payload:t});return t.matches=(t=>t.type===e),t}function o(e,t){return(r=t,n)=>e.matches(n)?n.payload:r}function s(t,r){return(0,e.connect)(e=>e,e=>({dispatch:e}),(e,t,n)=>r(e,t.dispatch,n))(t)}class a extends t.Component{}function c(e,t){return r=>{e(t(r))}}exports.StatelessComponent=a; +},{"preact-redux":26,"preact":24}],97:[function(require,module,exports) { +"use strict";function t(t,i,s){return ts?s:t}Object.defineProperty(exports,"__esModule",{value:!0}),exports.clamp=t;class i{constructor(t,i){this.x=t,this.y=i}withX(t){return new i(t,this.y)}withY(t){return new i(this.x,t)}plus(t){return new i(this.x+t.x,this.y+t.y)}minus(t){return new i(this.x-t.x,this.y-t.y)}times(t){return new i(this.x*t,this.y*t)}timesPointwise(t){return new i(this.x*t.x,this.y*t.y)}dividedByPointwise(t){return new i(this.x/t.x,this.y/t.y)}dot(t){return this.x*t.x+this.y*t.y}equals(t){return this.x===t.x&&this.y===t.y}approxEquals(t,i=1e-9){return Math.abs(this.x-t.x){if(t.actions.flamechart.setHoveredNode.matches(a)&&r(a)){const{hover:t}=a.payload.args;return Object.assign({},e,{hover:t})}if(t.actions.flamechart.setSelectedNode.matches(a)&&r(a)){const{selectedNode:t}=a.payload.args;return Object.assign({},e,{selectedNode:t})}if(t.actions.flamechart.setConfigSpaceViewportRect.matches(a)&&r(a)){const{configSpaceViewportRect:t}=a.payload.args;return Object.assign({},e,{configSpaceViewportRect:t})}if(t.actions.flamechart.setLogicalSpaceViewportSize.matches(a)&&r(a)){const{logicalSpaceViewportSize:t}=a.payload.args;return Object.assign({},e,{logicalSpaceViewportSize:t})}return t.actions.setViewMode.matches(a)?Object.assign({},e,{hover:null}):e}}!function(e){e.LEFT_HEAVY="LEFT_HEAVY",e.CHRONO="CHRONO",e.SANDWICH_INVERTED_CALLERS="SANDWICH_INVERTED_CALLERS",e.SANDWICH_CALLEES="SANDWICH_CALLEES"}(a||(exports.FlamechartID=a={})); +},{"../lib/math":97,"./actions":40}],96:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createSandwichView=l;var e=require("./flamechart-view-state"),a=require("./actions");function l(l){const r=(0,e.createFlamechartViewStateReducer)(e.FlamechartID.SANDWICH_CALLEES,l),t=(0,e.createFlamechartViewStateReducer)(e.FlamechartID.SANDWICH_INVERTED_CALLERS,l);return(e={callerCallee:null},c)=>{if(a.actions.sandwichView.setSelectedFrame.matches(c)&&function(e){const{payload:a}=e;return a.profileIndex===l}(c))return null==c.payload.args?Object.assign({},e,{callerCallee:null}):Object.assign({},e,{callerCallee:{selectedFrame:c.payload.args,calleeFlamegraph:r(void 0,c),invertedCallerFlamegraph:t(void 0,c)}});const{callerCallee:n}=e;if(n){const{calleeFlamegraph:a,invertedCallerFlamegraph:l}=n,i=r(a,c),s=t(l,c);return i===a&&s===l?e:Object.assign({},e,{callerCallee:Object.assign({},n,{calleeFlamegraph:i,invertedCallerFlamegraph:s})})}return e}} +},{"./flamechart-view-state":95,"./actions":40}],60:[function(require,module,exports) { +"use strict";function t(t){return t[t.length-1]||null}function e(t,e){t.sort(function(t,r){return e(t)99?e=">99%":t<.01?e="<0.01%":t<1?e=`${t.toFixed(2)}%`:t<10&&(e=`${t.toFixed(1)}%`),e}function f(t){return t-Math.floor(t)}function h(t){return 2*Math.abs(f(t)-.5)-1}function g(t,e,r,n,o=1){for(console.assert(!isNaN(o)&&!isNaN(n));;){if(e-t<=o)return[t,e];const s=(e+t)/2;r(s){let n;return null==e?(n=t(r),e={args:r,result:n},n):x(e.args,r)?e.result:(e.args=r,e.result=t(r),e.result)}}function y(t){let e=null;return r=>{let n;return null==e?(n=t(r),e={args:r,result:n},n):e.args===r?e.result:(e.args=r,e.result=t(r),e.result)}}function w(t){let e=null;return()=>(null==e&&(e={result:t()}),e.result)}exports.KeyedSet=s;const E=w(()=>{const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=new Map;for(let r=0;r>4,"="!==u&&(o[s++]=(15&c)<<4|f>>2),"="!==a&&(o[s++]=(7&f)<<6|h)}if(s!==n)throw new Error(`Expected to decode ${n} bytes, but only decoded ${s})`);return o} +},{}],49:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.profileGroup=void 0,exports.actionCreatorWithIndex=n;var e=require("./flamechart-view-state"),t=require("./sandwich-view-state"),i=require("../lib/typed-redux"),r=require("./actions"),a=require("../lib/math"),o=require("../lib/utils");function n(e){return(0,i.actionCreator)(e)}function l(i,r){const a=(0,e.createFlamechartViewStateReducer)(e.FlamechartID.CHRONO,r),n=(0,e.createFlamechartViewStateReducer)(e.FlamechartID.LEFT_HEAVY,r),l=(0,t.createSandwichView)(r);return(e,t)=>{if(void 0===e)return{profile:i,chronoViewState:a(void 0,t),leftHeavyViewState:n(void 0,t),sandwichViewState:l(void 0,t)};const r={profile:i,chronoViewState:a(e.chronoViewState,t),leftHeavyViewState:n(e.leftHeavyViewState,t),sandwichViewState:l(e.sandwichViewState,t)};return(0,o.objectsHaveShallowEquality)(e,r)?e:r}}const c=exports.profileGroup=((e=null,t)=>{if(r.actions.setProfileGroup.matches(t)){const{indexToView:e,profiles:i,name:r}=t.payload;return{indexToView:e,name:r,profiles:i.map((e,i)=>l(e,i)(void 0,t))}}if(null!=e){const{indexToView:n,profiles:c}=e,s=(0,a.clamp)((0,i.setter)(r.actions.setProfileIndexToView,0)(n,t),0,c.length-1),u=c.map((e,i)=>l(e.profile,i)(e,t));return n===s&&(0,o.objectsHaveShallowEquality)(c,u)?e:Object.assign({},e,{indexToView:s,profiles:u})}return e}); +},{"./flamechart-view-state":95,"./sandwich-view-state":96,"../lib/typed-redux":36,"./actions":40,"../lib/math":97,"../lib/utils":60}],40:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.actions=void 0;var e=require("../lib/typed-redux"),t=require("./profiles-state"),a=exports.actions=void 0;!function(a){let o,r;a.setProfileGroup=(0,e.actionCreator)("setProfileGroup"),a.setProfileIndexToView=(0,e.actionCreator)("setProfileIndexToView"),a.setGLCanvas=(0,e.actionCreator)("setGLCanvas"),a.setViewMode=(0,e.actionCreator)("setViewMode"),a.setFlattenRecursion=(0,e.actionCreator)("setFlattenRecursion"),a.setDragActive=(0,e.actionCreator)("setDragActive"),a.setLoading=(0,e.actionCreator)("setLoading"),a.setError=(0,e.actionCreator)("setError"),a.setHashParams=(0,e.actionCreator)("setHashParams"),function(a){a.setTableSortMethod=(0,e.actionCreator)("sandwichView.setTableSortMethod"),a.setSelectedFrame=(0,t.actionCreatorWithIndex)("sandwichView.setSelectedFarmr")}(o=a.sandwichView||(a.sandwichView={})),function(e){e.setHoveredNode=(0,t.actionCreatorWithIndex)("flamechart.setHoveredNode"),e.setSelectedNode=(0,t.actionCreatorWithIndex)("flamechart.setSelectedNode"),e.setConfigSpaceViewportRect=(0,t.actionCreatorWithIndex)("flamechart.setConfigSpaceViewportRect"),e.setLogicalSpaceViewportSize=(0,t.actionCreatorWithIndex)("flamechart.setLogicalSpaceViewportSpace")}(r=a.flamechart||(a.flamechart={}))}(a||(exports.actions=a={})); +},{"../lib/typed-redux":36,"./profiles-state":49}],47:[function(require,module,exports) { +"use strict";function t(t=window.location.hash){try{if(!t.startsWith("#"))return{};const e=t.substr(1).split("&"),r={};for(const t of e){let[e,o]=t.split("=");o=decodeURIComponent(o),"profileURL"===e?r.profileURL=o:"title"===e?r.title=o:"localProfilePath"===e&&(r.localProfilePath=o)}return r}catch(t){return console.error("Error when loading hash fragment."),console.error(t),{}}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.getHashParams=t; +},{}],132:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=t;var e=/-webkit-|-moz-|-ms-/;function t(t){return"string"==typeof t&&e.test(t)}module.exports=exports.default; +},{}],116:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=i;var e=require("css-in-js-utils/lib/isPrefixedValue"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}var u=["-webkit-","-moz-",""];function i(e,r){if("string"==typeof r&&!(0,t.default)(r)&&r.indexOf("calc(")>-1)return u.map(function(e){return r.replace(/calc\(/g,e+"calc(")})}module.exports=exports.default; +},{"css-in-js-utils/lib/isPrefixedValue":132}],128:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("css-in-js-utils/lib/isPrefixedValue"),r=t(e);function t(e){return e&&e.__esModule?e:{default:e}}var s=["-webkit-",""];function u(e,t){if("string"==typeof t&&!(0,r.default)(t)&&t.indexOf("cross-fade(")>-1)return s.map(function(e){return t.replace(/cross-fade\(/g,e+"cross-fade(")})}module.exports=exports.default; +},{"css-in-js-utils/lib/isPrefixedValue":132}],120:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=o;var e=["-webkit-","-moz-",""],r={"zoom-in":!0,"zoom-out":!0,grab:!0,grabbing:!0};function o(o,t){if("cursor"===o&&r.hasOwnProperty(t))return e.map(function(e){return e+t})}module.exports=exports.default; +},{}],118:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("css-in-js-utils/lib/isPrefixedValue"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}var i=["-webkit-",""];function u(e,r){if("string"==typeof r&&!(0,t.default)(r)&&r.indexOf("filter(")>-1)return i.map(function(e){return r.replace(/filter\(/g,e+"filter(")})}module.exports=exports.default; +},{"css-in-js-utils/lib/isPrefixedValue":132}],117:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=i;var e={flex:["-webkit-box","-moz-box","-ms-flexbox","-webkit-flex","flex"],"inline-flex":["-webkit-inline-box","-moz-inline-box","-ms-inline-flexbox","-webkit-inline-flex","inline-flex"]};function i(i,l){if("display"===i&&e.hasOwnProperty(l))return e[l]}module.exports=exports.default; +},{}],119:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=s;var e={"space-around":"distribute","space-between":"justify","flex-start":"start","flex-end":"end"},t={alignContent:"msFlexLinePack",alignSelf:"msFlexItemAlign",alignItems:"msFlexAlign",justifyContent:"msFlexPack",order:"msFlexOrder",flexGrow:"msFlexPositive",flexShrink:"msFlexNegative",flexBasis:"msFlexPreferredSize"};function s(s,l,r){t.hasOwnProperty(s)&&(r[t[s]]=e[l]||l)}module.exports=exports.default; +},{}],124:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=i;var e={"space-around":"justify","space-between":"justify","flex-start":"start","flex-end":"end","wrap-reverse":"multiple",wrap:"multiple"},t={alignItems:"WebkitBoxAlign",justifyContent:"WebkitBoxPack",flexWrap:"WebkitBoxLines"};function i(i,r,o){"flexDirection"===i&&"string"==typeof r&&(r.indexOf("column")>-1?o.WebkitBoxOrient="vertical":o.WebkitBoxOrient="horizontal",r.indexOf("reverse")>-1?o.WebkitBoxDirection="reverse":o.WebkitBoxDirection="normal"),t.hasOwnProperty(i)&&(o[t[i]]=e[r]||r)}module.exports=exports.default; +},{}],121:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=n;var e=require("css-in-js-utils/lib/isPrefixedValue"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}var i=["-webkit-","-moz-",""],a=/linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/;function n(e,r){if("string"==typeof r&&!(0,t.default)(r)&&a.test(r))return i.map(function(e){return e+r})}module.exports=exports.default; +},{"css-in-js-utils/lib/isPrefixedValue":132}],122:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("css-in-js-utils/lib/isPrefixedValue"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}var i=["-webkit-",""];function u(e,r){if("string"==typeof r&&!(0,t.default)(r)&&r.indexOf("image-set(")>-1)return i.map(function(e){return r.replace(/image-set\(/g,e+"image-set(")})}module.exports=exports.default; +},{"css-in-js-utils/lib/isPrefixedValue":132}],123:[function(require,module,exports) { +"use strict";function e(e,t){if("position"===e&&"sticky"===t)return["-webkit-sticky","sticky"]}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=e,module.exports=exports.default; +},{}],127:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=i;var t=["-webkit-","-moz-",""],e={maxHeight:!0,maxWidth:!0,width:!0,height:!0,columnWidth:!0,minWidth:!0,minHeight:!0},n={"min-content":!0,"max-content":!0,"fill-available":!0,"fit-content":!0,"contain-floats":!0};function i(i,o){if(e.hasOwnProperty(i)&&n.hasOwnProperty(o))return t.map(function(t){return t+o})}module.exports=exports.default; +},{}],144:[function(require,module,exports) { +"use strict";var e=/[A-Z]/g,r=/^ms-/,s={};function t(t){return t in s?s[t]:s[t]=t.replace(e,"-$&").toLowerCase().replace(r,"-ms-")}module.exports=t; +},{}],141:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("hyphenate-style-name"),t=r(e);function r(e){return e&&e.__esModule?e:{default:e}}function u(e){return(0,t.default)(e)}module.exports=exports.default; +},{"hyphenate-style-name":144}],140:[function(require,module,exports) { +"use strict";function e(e){return e.charAt(0).toUpperCase()+e.slice(1)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=e,module.exports=exports.default; +},{}],125:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=l;var t=require("css-in-js-utils/lib/hyphenateProperty"),e=s(t),r=require("css-in-js-utils/lib/isPrefixedValue"),i=s(r),n=require("../../utils/capitalizeString"),o=s(n);function s(t){return t&&t.__esModule?t:{default:t}}var u={transition:!0,transitionProperty:!0,WebkitTransition:!0,WebkitTransitionProperty:!0,MozTransition:!0,MozTransitionProperty:!0},a={Webkit:"-webkit-",Moz:"-moz-",ms:"-ms-"};function f(t,r){if((0,i.default)(t))return t;for(var n=t.split(/,(?![^()]*(?:\([^()]*\))?\))/g),o=0,s=n.length;o-1&&"order"!==p)for(var d=r[l],c=0,b=d.length;c-1)return s;var a=n.split(/,(?![^()]*(?:\([^()]*\))?\))/g).filter(function(t){return!/-webkit-|-ms-/.test(t)}).join(",");return t.indexOf("Moz")>-1?a:(r["Webkit"+(0,o.default)(t)]=s,r["Moz"+(0,o.default)(t)]=a,n)}}module.exports=exports.default; +},{"css-in-js-utils/lib/hyphenateProperty":141,"css-in-js-utils/lib/isPrefixedValue":132,"../../utils/capitalizeString":140}],130:[function(require,module,exports) { +"use strict";function r(r){for(var t=5381,e=r.length;e;)t=33*t^r.charCodeAt(--e);return t>>>0}module.exports=r; +},{}],136:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=require("./capitalizeString"),r=t(e);function t(e){return e&&e.__esModule?e:{default:e}}function u(e,t,u){if(e.hasOwnProperty(t)){for(var o={},a=e[t],n=(0,r.default)(t),f=Object.keys(u),l=0;l0&&(i[s]=d)}else{var x=(0,u.default)(l,s,n,i,t);x&&(i[s]=x),i=(0,r.default)(t,s,i)}}return i}}module.exports=exports.default; +},{"../utils/prefixProperty":136,"../utils/prefixValue":137,"../utils/addNewValuesOnly":138,"../utils/isObject":139}],133:[function(require,module,exports) { +var global = arguments[3]; +var e=arguments[3];function t(e){r.length||(n(),a=!0),r[r.length]=e}module.exports=t;var n,r=[],a=!1,o=0,u=1024;function l(){for(;ou){for(var t=0,n=r.length-o;t4&&void 0!==arguments[4]?arguments[4]:[];if(!pe[e]){var o=ne(t,r,i,ye,n);he(e,o)}},Se=function(){de=[],pe={},me=!1,fe=null},ve=function(){return de},xe=function(){if(me)throw new Error("Cannot buffer while already buffering");me=!0},be=function(){me=!1;var e=de;return de=[],e},ke=function(){return be().join("")},Oe=function(){var e=be();e.length>0&&ce(e)},we=function(){return Object.keys(pe)},Ae=function(e){e.forEach(function(e){pe[e]=!0})},Ce=function e(t,r,n,i){for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:[];Ae(e)}}()},Me="undefined"!=typeof window?null:{renderStatic:function(){return function(e){return Se(),xe(),{html:e(),css:{content:ke(),renderedClassNames:we()}}}}()},qe=null;function Fe(e,t){return{StyleSheet:Object.assign({},Re,{extend:function(){return function(r){var n=r.map(function(e){return e.selectorHandler}).filter(function(e){return e});return Fe(e,t.concat(n))}}()}),StyleSheetServer:Me,StyleSheetTestUtils:qe,minify:function(){return function(e){Ie=e?V:Te}}(),css:function(){return function(){for(var r=arguments.length,n=Array(r),i=0;i{this.viewport=e||null}),this.pendingScroll=0,this.onWindowResize=(()=>{this.recomputeVisibleIndices(this.props)}),this.onViewportScroll=(e=>{this.recomputeVisibleIndices(this.props)}),this.state={firstVisibleIndex:null,lastVisibleIndex:null,invisiblePrefixSize:null,viewportSize:null,cachedTotalSize:e.items.reduce((e,i)=>e+i.size,0)}}recomputeVisibleIndices(e){if(!this.viewport)return;const{items:i}=e,t=this.viewport.getBoundingClientRect().height,s=this.viewport.scrollTop-t/4,o=this.viewport.scrollTop+t+t/4;let l=0,r=0,n=0;for(;n=s)break}const p=n;for(;n=o)break}const c=Math.min(n,i.length-1);this.setState({invisiblePrefixSize:r,firstVisibleIndex:p,lastVisibleIndex:c})}scrollIndexIntoView(e){this.pendingScroll=this.props.items.reduce((i,t,s)=>s>=e?i:i+t.size,0)}applyPendingScroll(){if(!this.viewport)return;const e="y"===this.props.axis?"top":"left";this.viewport.scrollTo({[e]:this.pendingScroll})}componentWillReceiveProps(e){this.props.items!==e.items&&this.recomputeVisibleIndices(e)}componentDidMount(){this.applyPendingScroll(),this.recomputeVisibleIndices(this.props),window.addEventListener("resize",this.onWindowResize)}componentWillUnmount(){window.removeEventListener("resize",this.onWindowResize)}render(){const{cachedTotalSize:i,firstVisibleIndex:t,lastVisibleIndex:s,invisiblePrefixSize:o}=this.state;return(0,e.h)("div",{className:this.props.className,ref:this.viewportRef,onScroll:this.onViewportScroll},(0,e.h)("div",{style:{height:i}},(0,e.h)("div",{style:{transform:`translateY(${o}px)`}},null!=t&&null!=s&&this.props.renderItems(t,s))))}}exports.ScrollableListView=i; +},{"preact":24}],106:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0});class t{constructor(t){this.data=t,this.prev=null,this.next=null}}class e{constructor(){this.head=null,this.tail=null,this.size=0}getHead(){return this.head}getTail(){return this.tail}getSize(){return this.size}append(t){this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this.size++}prepend(t){return this.head?(this.head.prev=t,t.next=this.head,this.head=t):this.head=this.tail=t,this.size++,t}pop(){if(this.tail){const t=this.tail;return t.prev?(this.tail=t.prev,this.tail.next=null):this.head=this.tail=null,this.size--,t.prev=null,t}return null}dequeue(){if(this.head){const t=this.head;return t.next?(this.head=t.next,this.head.prev=null):this.head=this.tail=null,this.size--,t.next=null,t}return null}remove(t){null==t.prev?this.dequeue():null==t.next?this.pop():(t.next.prev=t.prev,t.prev.next=t.next,t.next=null,t.prev=null,this.size--)}}exports.List=e;class i{constructor(t){this.capacity=t,this.list=new e,this.map=new Map}has(t){return this.map.has(t)}get(t){const e=this.map.get(t);return e?(this.list.remove(e.listNode),this.list.prepend(e.listNode),e?e.value:null):null}getSize(){return this.list.getSize()}getCapacity(){return this.capacity}insert(e,i){const s=this.map.get(e);for(s&&this.list.remove(s.listNode);this.list.getSize()>=this.capacity;)this.map.delete(this.list.pop().data);const h=this.list.prepend(new t(e));this.map.set(e,{value:i,listNode:h})}getOrInsert(t,e){let i=this.get(t);return null==i&&(i=e(t),this.insert(t,i)),i}removeLRU(){const t=this.list.pop();if(!t)return null;const e=t.data,i=this.map.get(e).value;return this.map.delete(e),[e,i]}clear(){this.list=new e,this.map=new Map}}exports.LRUCache=i; +},{}],94:[function(require,module,exports) { + +var t,e,n=module.exports={};function r(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function i(e){if(t===setTimeout)return setTimeout(e,0);if((t===r||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}function u(t){if(e===clearTimeout)return clearTimeout(t);if((e===o||!e)&&clearTimeout)return e=clearTimeout,clearTimeout(t);try{return e(t)}catch(n){try{return e.call(null,t)}catch(n){return e.call(this,t)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:r}catch(e){t=r}try{e="function"==typeof clearTimeout?clearTimeout:o}catch(t){e=o}}();var c,s=[],l=!1,a=-1;function f(){l&&c&&(l=!1,c.length?s=c.concat(s):a=-1,s.length&&h())}function h(){if(!l){var t=i(f);l=!0;for(var e=s.length;e;){for(c=s,s=[];++a1)for(var n=1;n=0&&e<=31),t.TEXTURE0+e}var h=exports.Graphics=void 0;!function(t){t.Rect=class{constructor(t=0,e=0,i=0,r=0){this.x=t,this.y=e,this.width=i,this.height=r}set(t,e,i,r){this.x=t,this.y=e,this.width=i,this.height=r}equals(t){return this.x===t.x&&this.y===t.y&&this.width===t.width&&this.height===t.height}};class e{constructor(t,e,i,r){this.redF=t,this.greenF=e,this.blueF=i,this.alphaF=r}}let i,r,s,n,h;e.TRANSPARENT=new e(0,0,0,0),t.Color=e,function(t){t[t.ZERO=0]="ZERO",t[t.ONE=1]="ONE",t[t.SOURCE_COLOR=2]="SOURCE_COLOR",t[t.TARGET_COLOR=3]="TARGET_COLOR",t[t.INVERSE_SOURCE_COLOR=4]="INVERSE_SOURCE_COLOR",t[t.INVERSE_TARGET_COLOR=5]="INVERSE_TARGET_COLOR",t[t.SOURCE_ALPHA=6]="SOURCE_ALPHA",t[t.TARGET_ALPHA=7]="TARGET_ALPHA",t[t.INVERSE_SOURCE_ALPHA=8]="INVERSE_SOURCE_ALPHA",t[t.INVERSE_TARGET_ALPHA=9]="INVERSE_TARGET_ALPHA",t[t.CONSTANT=10]="CONSTANT",t[t.INVERSE_CONSTANT=11]="INVERSE_CONSTANT"}(i=t.BlendOperation||(t.BlendOperation={})),function(t){t[t.TRIANGLES=0]="TRIANGLES",t[t.TRIANGLE_STRIP=1]="TRIANGLE_STRIP"}(r=t.Primitive||(t.Primitive={}));function a(t){return t==s.FLOAT?4:1}t.Context=class{setCopyBlendState(){this.setBlendState(i.ONE,i.ZERO)}setAddBlendState(){this.setBlendState(i.ONE,i.ONE)}setPremultipliedBlendState(){this.setBlendState(i.ONE,i.INVERSE_SOURCE_ALPHA)}setUnpremultipliedBlendState(){this.setBlendState(i.SOURCE_ALPHA,i.INVERSE_SOURCE_ALPHA)}},function(t){t[t.FLOAT=0]="FLOAT",t[t.BYTE=1]="BYTE"}(s=t.AttributeType||(t.AttributeType={})),t.attributeByteLength=a;class _{constructor(t,e,i,r){this.name=t,this.type=e,this.count=i,this.byteOffset=r}}t.Attribute=_;t.VertexFormat=class{constructor(){this._attributes=[],this._stride=0}get attributes(){return this._attributes}get stride(){return this._stride}add(t,e,i){return this.attributes.push(new _(t,e,i,this.stride)),this._stride+=i*a(e),this}};t.VertexBuffer=class{uploadFloat32Array(t){this.upload(new Uint8Array(t.buffer),0)}uploadFloats(t){this.uploadFloat32Array(new Float32Array(t))}},function(t){t[t.NEAREST=0]="NEAREST",t[t.LINEAR=1]="LINEAR"}(n=t.PixelFilter||(t.PixelFilter={})),function(t){t[t.REPEAT=0]="REPEAT",t[t.CLAMP=1]="CLAMP"}(h=t.PixelWrap||(t.PixelWrap={}));class o{constructor(t,e,i){this.minFilter=t,this.magFilter=e,this.wrap=i}}o.LINEAR_CLAMP=new o(n.LINEAR,n.LINEAR,h.CLAMP),o.LINEAR_MIN_NEAREST_MAG_CLAMP=new o(n.LINEAR,n.NEAREST,h.CLAMP),o.NEAREST_CLAMP=new o(n.NEAREST,n.NEAREST,h.CLAMP),t.TextureFormat=o}(h||(exports.Graphics=h={}));var a=exports.WebGL=void 0;!function(t){class a extends h.Context{constructor(t=document.createElement("canvas")){super(),this._attributeCount=0,this._blendOperations=0,this._contextResetHandlers=[],this._currentClearColor=h.Color.TRANSPARENT,this._currentRenderTarget=null,this._defaultViewport=new h.Rect,this._forceStateUpdate=!0,this._generation=1,this._height=0,this._oldBlendOperations=0,this._oldRenderTarget=null,this._oldViewport=new h.Rect,this._width=0,this.handleWebglContextRestored=(()=>{this._attributeCount=0,this._currentClearColor=h.Color.TRANSPARENT,this._forceStateUpdate=!0,this._generation++;for(let t of this._contextResetHandlers)t()}),this.ANGLE_instanced_arrays=null,this.ANGLE_instanced_arrays_generation=-1;let e=t.getContext("webgl",{alpha:!1,antialias:!1,depth:!1,preserveDrawingBuffer:!1,stencil:!1});if(null==e)throw new Error("Setup failure");this._gl=e;let i=t.style;t.width=0,t.height=0,i.width=i.height="0",t.addEventListener("webglcontextlost",t=>{t.preventDefault()}),t.addEventListener("webglcontextrestored",this.handleWebglContextRestored),this._blendOperationMap={[h.BlendOperation.ZERO]:this._gl.ZERO,[h.BlendOperation.ONE]:this._gl.ONE,[h.BlendOperation.SOURCE_COLOR]:this._gl.SRC_COLOR,[h.BlendOperation.TARGET_COLOR]:this._gl.DST_COLOR,[h.BlendOperation.INVERSE_SOURCE_COLOR]:this._gl.ONE_MINUS_SRC_COLOR,[h.BlendOperation.INVERSE_TARGET_COLOR]:this._gl.ONE_MINUS_DST_COLOR,[h.BlendOperation.SOURCE_ALPHA]:this._gl.SRC_ALPHA,[h.BlendOperation.TARGET_ALPHA]:this._gl.DST_ALPHA,[h.BlendOperation.INVERSE_SOURCE_ALPHA]:this._gl.ONE_MINUS_SRC_ALPHA,[h.BlendOperation.INVERSE_TARGET_ALPHA]:this._gl.ONE_MINUS_DST_ALPHA,[h.BlendOperation.CONSTANT]:this._gl.CONSTANT_COLOR,[h.BlendOperation.INVERSE_CONSTANT]:this._gl.ONE_MINUS_CONSTANT_COLOR}}get widthInPixels(){return this._width}get heightInPixels(){return this._height}testContextLoss(){this.handleWebglContextRestored()}get gl(){return this._gl}get generation(){return this._generation}addContextResetHandler(t){r(this._contextResetHandlers,t)}removeContextResetHandler(t){s(this._contextResetHandlers,t)}get currentRenderTarget(){return this._currentRenderTarget}beginFrame(){this.setRenderTarget(null)}endFrame(){}setBlendState(t,e){this._blendOperations=a._packBlendModes(t,e)}setViewport(t,e,i,r){(null!=this._currentRenderTarget?this._currentRenderTarget.viewport:this._defaultViewport).set(t,e,i,r)}get viewport(){return null!=this._currentRenderTarget?this._currentRenderTarget.viewport:this._defaultViewport}get renderTargetWidthInPixels(){return null!=this._currentRenderTarget?this._currentRenderTarget.viewport.width:this._width}get renderTargetHeightInPixels(){return null!=this._currentRenderTarget?this._currentRenderTarget.viewport.height:this._height}draw(t,e,i){this._updateRenderTargetAndViewport(),f.from(e).prepare(),R.from(i).prepare(),this._updateFormat(e.format),this._updateBlendState(),this._gl.drawArrays(t==h.Primitive.TRIANGLES?this._gl.TRIANGLES:this._gl.TRIANGLE_STRIP,0,Math.floor(i.byteCount/e.format.stride)),this._forceStateUpdate=!1}resize(t,e,i,r){const s=this._gl.canvas.getBoundingClientRect();if(this._width===i&&this._height===e&&s.width===i&&s.height===r)return;let n=this._gl.canvas,h=n.style;n.width=t,n.height=e,h.width=`${i}px`,h.height=`${r}px`,this.setViewport(0,0,t,e),this._width=t,this._height=e}clear(t){this._updateRenderTargetAndViewport(),this._updateBlendState(),t!=this._currentClearColor&&(this._gl.clearColor(t.redF,t.greenF,t.blueF,t.alphaF),this._currentClearColor=t),this._gl.clear(this._gl.COLOR_BUFFER_BIT)}setRenderTarget(t){this._currentRenderTarget=A.from(t)}createMaterial(t,e,i){let r=new f(this,t,e,i);return r.program,r}createVertexBuffer(t){return i(t>0&&t%4==0),new R(this,t)}createTexture(t,e,i,r){return new p(this,t,e,i,r)}createRenderTarget(t){return new A(this,p.from(t))}getANGLE_instanced_arrays(){if(this.ANGLE_instanced_arrays_generation!==this._generation&&(this.ANGLE_instanced_arrays=null),!this.ANGLE_instanced_arrays&&(this.ANGLE_instanced_arrays=this.gl.getExtension("ANGLE_instanced_arrays"),!this.ANGLE_instanced_arrays))throw new Error("Failed to get extension ANGLE_instanced_arrays");return this.ANGLE_instanced_arrays}_updateRenderTargetAndViewport(){let t=this._currentRenderTarget,e=null!=t?t.viewport:this._defaultViewport,i=this._gl;(this._forceStateUpdate||this._oldRenderTarget!=t)&&(i.bindFramebuffer(i.FRAMEBUFFER,t?t.framebuffer:null),this._oldRenderTarget=t),!this._forceStateUpdate&&this._oldViewport.equals(e)||(i.viewport(e.x,this.renderTargetHeightInPixels-e.y-e.height,e.width,e.height),this._oldViewport.set(e.x,e.y,e.width,e.height))}_updateBlendState(){if(this._forceStateUpdate||this._oldBlendOperations!=this._blendOperations){let t=this._gl,e=this._blendOperations,r=this._oldBlendOperations,s=15&e,n=e>>4;i(s in this._blendOperationMap),i(n in this._blendOperationMap),e==a.COPY_BLEND_OPERATIONS?t.disable(t.BLEND):((this._forceStateUpdate||r==a.COPY_BLEND_OPERATIONS)&&t.enable(t.BLEND),t.blendFunc(this._blendOperationMap[s],this._blendOperationMap[n])),this._oldBlendOperations=e}}_updateFormat(t){let e=this._gl,i=t.attributes,r=i.length;for(let s=0;sr;)this._attributeCount--,e.disableVertexAttribArray(this._attributeCount);this._attributeCount=r}getWebGLInfo(){const t=this.gl.getExtension("WEBGL_debug_renderer_info");return{renderer:t?this.gl.getParameter(t.UNMASKED_RENDERER_WEBGL):null,vendor:t?this.gl.getParameter(t.UNMASKED_VENDOR_WEBGL):null,version:this.gl.getParameter(this.gl.VERSION)}}static from(t){return i(null==t||t instanceof a),t}static _packBlendModes(t,e){return t|e<<4}}a.COPY_BLEND_OPERATIONS=a._packBlendModes(h.BlendOperation.ONE,h.BlendOperation.ZERO),t.Context=a;class _{constructor(t,e,i=0,r=null,s=!0){this._material=t,this._name=e,this._generation=i,this._location=r,this._isDirty=s}get location(){let t=a.from(this._material.context);if(this._generation!=t.generation&&(this._location=t.gl.getUniformLocation(this._material.program,this._name),this._generation=t.generation,!e)){let e=this._material.program,r=t.gl;for(let t=0,s=r.getProgramParameter(e,r.ACTIVE_UNIFORMS);t0&&this._texture.height>0?this._texture.texture:null)}}class f{constructor(t,e,i,r,s={},n=[],h=0,a=null){this._context=t,this._format=e,this._vertexSource=i,this._fragmentSource=r,this._uniformsMap=s,this._uniformsList=n,this._generation=h,this._program=a}get context(){return this._context}get format(){return this._format}get vertexSource(){return this._vertexSource}get fragmentSource(){return this._fragmentSource}setUniformFloat(t,e){let r=this._uniformsMap[t]||null;null==r&&(r=new o(this,t),this._uniformsMap[t]=r,this._uniformsList.push(r)),i(r instanceof o),r.set(e)}setUniformInt(t,e){let r=this._uniformsMap[t]||null;null==r&&(r=new l(this,t),this._uniformsMap[t]=r,this._uniformsList.push(r)),i(r instanceof l),r.set(e)}setUniformVec2(t,e,r){let s=this._uniformsMap[t]||null;null==s&&(s=new u(this,t),this._uniformsMap[t]=s,this._uniformsList.push(s)),i(s instanceof u),s.set(e,r)}setUniformVec3(t,e,r,s){let n=this._uniformsMap[t]||null;null==n&&(n=new c(this,t),this._uniformsMap[t]=n,this._uniformsList.push(n)),i(n instanceof c),n.set(e,r,s)}setUniformVec4(t,e,r,s,n){let h=this._uniformsMap[t]||null;null==h&&(h=new d(this,t),this._uniformsMap[t]=h,this._uniformsList.push(h)),i(h instanceof d),h.set(e,r,s,n)}setUniformMat3(t,e,r,s,n,h,a,_,o,l){let u=this._uniformsMap[t]||null;null==u&&(u=new g(this,t),this._uniformsMap[t]=u,this._uniformsList.push(u)),i(u instanceof g),u.set(e,r,s,n,h,a,_,o,l)}setUniformSampler(t,e,r){let s=this._uniformsMap[t]||null;null==s&&(s=new E(this,t),this._uniformsMap[t]=s,this._uniformsList.push(s)),i(s instanceof E),s.set(e,r)}get program(){let t=this._context.gl;if(this._generation!=this._context.generation){this._program=t.createProgram(),this._compileShader(t,t.VERTEX_SHADER,this.vertexSource),this._compileShader(t,t.FRAGMENT_SHADER,this.fragmentSource);let r=this.format.attributes;for(let e=0;e=0),i(0<=t&&t+r<=this._byteCount),i(0<=e&&e+r<=this._byteCount),this._bytes&&t!=e&&0!=r&&(this._bytes.set(this._bytes.subarray(t,this._byteCount),e),this._growDirtyRegion(Math.min(t,e),Math.max(t,e)+r))}upload(t,e=0){i(0<=e&&e+t.length<=this._byteCount),i(null!=this._bytes),this._bytes.set(t,e),this._growDirtyRegion(e,e+t.length)}free(){this._buffer&&this._context.gl.deleteBuffer(this._buffer),this._generation=0}prepare(){let t=this._context.gl;this._generation!==this._context.generation&&(this._buffer=t.createBuffer(),this._generation=this._context.generation,this._isDirty=!0),t.bindBuffer(t.ARRAY_BUFFER,this._buffer),this._isDirty&&(t.bufferData(t.ARRAY_BUFFER,this._byteCount,t.DYNAMIC_DRAW),this._dirtyMin=this._totalMin,this._dirtyMax=this._totalMax,this._isDirty=!1),this._dirtyMin{const t=e.AffineTransform.betweenRects(i.configSpaceSrcRect,i.physicalSpaceDstRect),r=new e.Vec2(this.gl.viewport.width,this.gl.viewport.height);return e.AffineTransform.withTranslation(new e.Vec2(-1,1)).times(e.AffineTransform.withScale(new e.Vec2(2,-2).dividedByPointwise(r))).times(t)})()),this.gl.setUnpremultipliedBlendState(),this.gl.draw(t.Graphics.Primitive.TRIANGLES,this.material,i.batch.getBuffer())}}exports.RectangleBatchRenderer=c; +},{"../lib/math":97,"./graphics":42,"./utils":107}],66:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Color=void 0;var t=require("./math");class r{constructor(t=0,r=0,e=0,o=1){this.r=t,this.g=r,this.b=e,this.a=o}static fromLumaChromaHue(e,o,s){const i=s/60,a=o*(1-Math.abs(i%2-1)),[h,c,u]=i<1?[o,a,0]:i<2?[a,o,0]:i<3?[0,o,a]:i<4?[0,a,o]:i<5?[a,0,o]:[o,0,a],l=e-(.3*h+.59*c+.11*u);return new r((0,t.clamp)(h+l,0,1),(0,t.clamp)(c+l,0,1),(0,t.clamp)(u+l,0,1),1)}toCSS(){return`rgba(${(255*this.r).toFixed()}, ${(255*this.g).toFixed()}, ${(255*this.b).toFixed()}, ${this.a.toFixed(2)})`}}exports.Color=r; +},{"./math":97}],62:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.RowAtlas=void 0;var e=require("../lib/lru-cache"),t=require("./rectangle-batch-renderer"),r=require("../lib/math"),i=require("../lib/color"),c=require("./graphics"),h=require("./utils");class a{constructor(h,a,s){this.gl=h,this.rectangleBatchRenderer=a,this.textureRenderer=s,this.texture=h.createTexture(c.Graphics.TextureFormat.NEAREST_CLAMP,4096,4096),this.renderTarget=h.createRenderTarget(this.texture),this.rowCache=new e.LRUCache(this.texture.height),this.clearLineBatch=new t.RectangleBatch(h),this.clearLineBatch.addRect(r.Rect.unit,new i.Color(0,0,0,0)),h.addContextResetHandler(()=>{this.rowCache.clear()})}has(e){return this.rowCache.has(e)}getResolution(){return this.texture.width}getCapacity(){return this.texture.height}allocateLine(e){if(this.rowCache.getSize(){for(let i of e){let e=this.rowCache.get(i);if(null!=e)continue;e=this.allocateLine(i);const c=new r.Rect(new r.Vec2(0,e),new r.Vec2(this.texture.width,1));this.rectangleBatchRenderer.render({batch:this.clearLineBatch,configSpaceSrcRect:r.Rect.unit,physicalSpaceDstRect:c}),t(c,i)}})}renderViaAtlas(e,t){let i=this.rowCache.get(e);if(null==i)return!1;const c=new r.Rect(new r.Vec2(0,i),new r.Vec2(this.texture.width,1));return this.textureRenderer.render({texture:this.texture,srcRect:c,dstRect:t}),!0}}exports.RowAtlas=a; +},{"../lib/lru-cache":106,"./rectangle-batch-renderer":102,"../lib/math":97,"../lib/color":66,"./graphics":42,"./utils":107}],103:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.TextureRenderer=void 0;var e=require("../lib/math"),t=require("./graphics"),r=require("./utils");const n="\n uniform mat3 uvTransform;\n uniform mat3 positionTransform;\n\n attribute vec2 position;\n attribute vec2 uv;\n varying vec2 vUv;\n\n void main() {\n vUv = (uvTransform * vec3(uv, 1)).xy;\n gl_Position = vec4((positionTransform * vec3(position, 1)).xy, 0, 1);\n }\n",i="\n precision mediump float;\n\n varying vec2 vUv;\n uniform sampler2D texture;\n\n void main() {\n gl_FragColor = texture2D(texture, vUv);\n }\n";class s{constructor(e){this.gl=e;const r=new t.Graphics.VertexFormat;r.add("position",t.Graphics.AttributeType.FLOAT,2),r.add("uv",t.Graphics.AttributeType.FLOAT,2);const s=[{pos:[-1,1],uv:[0,1]},{pos:[1,1],uv:[1,1]},{pos:[-1,-1],uv:[0,0]},{pos:[1,-1],uv:[1,0]}],o=[];for(let e of s)o.push(e.pos[0]),o.push(e.pos[1]),o.push(e.uv[0]),o.push(e.uv[1]);this.buffer=e.createVertexBuffer(r.stride*s.length),this.buffer.upload(new Uint8Array(new Float32Array(o).buffer)),this.material=e.createMaterial(r,n,i)}render(n){this.material.setUniformSampler("texture",n.texture,0),(0,r.setUniformAffineTransform)(this.material,"uvTransform",(()=>{const{srcRect:t,texture:r}=n,i=e.AffineTransform.withTranslation(new e.Vec2(0,1)).times(e.AffineTransform.withScale(new e.Vec2(1,-1))).times(e.AffineTransform.betweenRects(new e.Rect(e.Vec2.zero,new e.Vec2(r.width,r.height)),e.Rect.unit)).transformRect(t);return e.AffineTransform.betweenRects(e.Rect.unit,i)})()),(0,r.setUniformAffineTransform)(this.material,"positionTransform",(()=>{const{dstRect:t}=n,{viewport:r}=this.gl,i=new e.Vec2(r.width,r.height),s=e.AffineTransform.withScale(new e.Vec2(1,-1)).times(e.AffineTransform.betweenRects(new e.Rect(e.Vec2.zero,i),e.Rect.NDC)).transformRect(t);return e.AffineTransform.betweenRects(e.Rect.NDC,s)})()),this.gl.setUnpremultipliedBlendState(),this.gl.draw(t.Graphics.Primitive.TRIANGLE_STRIP,this.material,this.buffer)}}exports.TextureRenderer=s; +},{"../lib/math":97,"./graphics":42,"./utils":107}],104:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ViewportRectangleRenderer=void 0;var e=require("./graphics"),i=require("./utils");const r=new e.Graphics.VertexFormat;r.add("position",e.Graphics.AttributeType.FLOAT,2);const o="\n attribute vec2 position;\n\n void main() {\n gl_Position = vec4(position, 0, 1);\n }\n",n="\n precision mediump float;\n\n uniform mat3 configSpaceToPhysicalViewSpace;\n uniform vec2 physicalSize;\n uniform vec2 physicalOrigin;\n uniform vec2 configSpaceViewportOrigin;\n uniform vec2 configSpaceViewportSize;\n uniform float framebufferHeight;\n\n void main() {\n vec2 origin = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportOrigin, 1.0)).xy;\n vec2 size = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportSize, 0.0)).xy;\n\n vec2 halfSize = physicalSize / 2.0;\n\n float borderWidth = 2.0;\n\n origin = floor(origin * halfSize) / halfSize + borderWidth * vec2(1.0, 1.0);\n size = floor(size * halfSize) / halfSize - 2.0 * borderWidth * vec2(1.0, 1.0);\n\n vec2 coord = gl_FragCoord.xy;\n coord.x = coord.x - physicalOrigin.x;\n coord.y = framebufferHeight - coord.y - physicalOrigin.y;\n vec2 clamped = clamp(coord, origin, origin + size);\n vec2 gap = clamped - coord;\n float maxdist = max(abs(gap.x), abs(gap.y));\n\n // TOOD(jlfwong): Could probably optimize this to use mix somehow.\n if (maxdist == 0.0) {\n // Inside viewport rectangle\n gl_FragColor = vec4(0, 0, 0, 0);\n } else if (maxdist < borderWidth) {\n // Inside viewport rectangle at border\n gl_FragColor = vec4(0.7, 0.7, 0.7, 0.8);\n } else {\n // Outside viewport rectangle\n gl_FragColor = vec4(0.7, 0.7, 0.7, 0.5);\n }\n }\n";class t{constructor(e){this.gl=e;const i=[[-1,1],[1,1],[-1,-1],[1,-1]],t=[];for(let e of i)t.push(e[0]),t.push(e[1]);this.buffer=e.createVertexBuffer(r.stride*i.length),this.buffer.upload(new Uint8Array(new Float32Array(t).buffer)),this.material=e.createMaterial(r,o,n)}render(r){(0,i.setUniformAffineTransform)(this.material,"configSpaceToPhysicalViewSpace",r.configSpaceToPhysicalViewSpace),(0,i.setUniformVec2)(this.material,"configSpaceViewportOrigin",r.configSpaceViewportRect.origin),(0,i.setUniformVec2)(this.material,"configSpaceViewportSize",r.configSpaceViewportRect.size);const o=this.gl.viewport;this.material.setUniformVec2("physicalOrigin",o.x,o.y),this.material.setUniformVec2("physicalSize",o.width,o.height),this.material.setUniformFloat("framebufferHeight",this.gl.renderTargetHeightInPixels),this.gl.setBlendState(e.Graphics.BlendOperation.SOURCE_ALPHA,e.Graphics.BlendOperation.INVERSE_SOURCE_ALPHA),this.gl.draw(e.Graphics.Primitive.TRIANGLE_STRIP,this.material,this.buffer)}}exports.ViewportRectangleRenderer=t; +},{"./graphics":42,"./utils":107}],105:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlamechartColorPassRenderer=void 0;var e=require("../lib/math"),t=require("./graphics"),n=require("./utils");const r=new t.Graphics.VertexFormat;r.add("position",t.Graphics.AttributeType.FLOAT,2),r.add("uv",t.Graphics.AttributeType.FLOAT,2);const i="\n uniform mat3 uvTransform;\n uniform mat3 positionTransform;\n\n attribute vec2 position;\n attribute vec2 uv;\n varying vec2 vUv;\n\n void main() {\n vUv = (uvTransform * vec3(uv, 1)).xy;\n gl_Position = vec4((positionTransform * vec3(position, 1)).xy, 0, 1);\n }\n",o="\n precision mediump float;\n\n uniform vec2 uvSpacePixelSize;\n uniform float renderOutlines;\n\n varying vec2 vUv;\n uniform sampler2D colorTexture;\n\n // https://en.wikipedia.org/wiki/HSL_and_HSV#From_luma/chroma/hue\n vec3 hcl2rgb(float H, float C, float L) {\n float hPrime = H / 60.0;\n float X = C * (1.0 - abs(mod(hPrime, 2.0) - 1.0));\n vec3 RGB =\n hPrime < 1.0 ? vec3(C, X, 0) :\n hPrime < 2.0 ? vec3(X, C, 0) :\n hPrime < 3.0 ? vec3(0, C, X) :\n hPrime < 4.0 ? vec3(0, X, C) :\n hPrime < 5.0 ? vec3(X, 0, C) :\n vec3(C, 0, X);\n\n float m = L - dot(RGB, vec3(0.30, 0.59, 0.11));\n return RGB + vec3(m, m, m);\n }\n\n float triangle(float x) {\n return 2.0 * abs(fract(x) - 0.5) - 1.0;\n }\n\n vec3 colorForBucket(float t) {\n float x = triangle(30.0 * t);\n float H = 360.0 * (0.9 * t);\n float C = 0.25 + 0.2 * x;\n float L = 0.80 - 0.15 * x;\n return hcl2rgb(H, C, L);\n }\n\n void main() {\n vec4 here = texture2D(colorTexture, vUv);\n\n if (here.z == 0.0) {\n // Background color\n gl_FragColor = vec4(0, 0, 0, 0);\n return;\n }\n\n // Sample the 4 surrounding pixels in the depth texture to determine\n // if we should draw a boundary here or not.\n vec4 N = texture2D(colorTexture, vUv + vec2(0, uvSpacePixelSize.y));\n vec4 E = texture2D(colorTexture, vUv + vec2(uvSpacePixelSize.x, 0));\n vec4 S = texture2D(colorTexture, vUv + vec2(0, -uvSpacePixelSize.y));\n vec4 W = texture2D(colorTexture, vUv + vec2(-uvSpacePixelSize.x, 0));\n\n // NOTE: For outline checks, we intentionally check both the right\n // and the left to determine if we're an edge. If a rectangle is a single\n // pixel wide, we don't want to render it as an outline, so this method\n // of checking ensures that we don't outline single physical-space\n // pixel width rectangles.\n if (\n renderOutlines > 0.0 &&\n (\n here.y == N.y && here.y != S.y || // Top edge\n here.y == S.y && here.y != N.y || // Bottom edge\n here.x == E.x && here.x != W.x || // Left edge\n here.x == W.x && here.x != E.x\n )\n ) {\n // We're on an edge! Draw transparent.\n gl_FragColor = vec4(0, 0, 0, 0);\n } else {\n // Not on an edge. Draw the appropriate color.\n gl_FragColor = vec4(colorForBucket(here.z), here.a);\n }\n }\n";class a{constructor(e){this.gl=e;const t=[{pos:[-1,1],uv:[0,1]},{pos:[1,1],uv:[1,1]},{pos:[-1,-1],uv:[0,0]},{pos:[1,-1],uv:[1,0]}],n=[];for(let e of t)n.push(e.pos[0]),n.push(e.pos[1]),n.push(e.uv[0]),n.push(e.uv[1]);this.buffer=e.createVertexBuffer(r.stride*t.length),this.buffer.uploadFloats(n),this.material=e.createMaterial(r,i,o)}render(r){const{srcRect:i,rectInfoTexture:o}=r,a=e.AffineTransform.withTranslation(new e.Vec2(0,1)).times(e.AffineTransform.withScale(new e.Vec2(1,-1))).times(e.AffineTransform.betweenRects(new e.Rect(e.Vec2.zero,new e.Vec2(o.width,o.height)),e.Rect.unit)).transformRect(i),s=e.AffineTransform.betweenRects(e.Rect.unit,a),{dstRect:c}=r,l=new e.Vec2(this.gl.viewport.width,this.gl.viewport.height),u=e.AffineTransform.withScale(new e.Vec2(1,-1)).times(e.AffineTransform.betweenRects(new e.Rect(e.Vec2.zero,l),e.Rect.NDC)).transformRect(c),f=e.AffineTransform.betweenRects(e.Rect.NDC,u),h=e.Vec2.unit.dividedByPointwise(new e.Vec2(r.rectInfoTexture.width,r.rectInfoTexture.height));this.material.setUniformSampler("colorTexture",r.rectInfoTexture,0),(0,n.setUniformAffineTransform)(this.material,"uvTransform",s),this.material.setUniformFloat("renderOutlines",r.renderOutlines?1:0),this.material.setUniformVec2("uvSpacePixelSize",h.x,h.y),(0,n.setUniformAffineTransform)(this.material,"positionTransform",f),this.gl.setUnpremultipliedBlendState(),this.gl.draw(t.Graphics.Primitive.TRIANGLE_STRIP,this.material,this.buffer)}}exports.FlamechartColorPassRenderer=a; +},{"../lib/math":97,"./graphics":42,"./utils":107}],64:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CanvasContext=void 0;var e=require("./graphics"),r=require("./rectangle-batch-renderer"),t=require("./texture-renderer"),i=require("../lib/math"),n=require("./overlay-rectangle-renderer"),s=require("./flamechart-color-pass-renderer");class o{constructor(i){this.animationFrameRequest=null,this.beforeFrameHandlers=new Set,this.onBeforeFrame=(()=>{this.animationFrameRequest=null,this.gl.setViewport(0,0,this.gl.renderTargetWidthInPixels,this.gl.renderTargetHeightInPixels),this.gl.clear(new e.Graphics.Color(1,1,1,1));for(const e of this.beforeFrameHandlers)e()}),this.gl=new e.WebGL.Context(i),this.rectangleBatchRenderer=new r.RectangleBatchRenderer(this.gl),this.textureRenderer=new t.TextureRenderer(this.gl),this.viewportRectangleRenderer=new n.ViewportRectangleRenderer(this.gl),this.flamechartColorPassRenderer=new s.FlamechartColorPassRenderer(this.gl);const o=this.gl.getWebGLInfo();o&&console.log(`WebGL initialized. renderer: ${o.renderer}, vendor: ${o.vendor}, version: ${o.version}`),window.testContextLoss=(()=>{this.gl.testContextLoss()})}addBeforeFrameHandler(e){this.beforeFrameHandlers.add(e)}removeBeforeFrameHandler(e){this.beforeFrameHandlers.delete(e)}requestFrame(){this.animationFrameRequest||(this.animationFrameRequest=requestAnimationFrame(this.onBeforeFrame))}setViewport(e,r){const{origin:t,size:i}=e;let n=this.gl.viewport;this.gl.setViewport(t.x,t.y,i.x,i.y),r();let{x:s,y:o,width:a,height:l}=n;this.gl.setViewport(s,o,a,l)}renderBehind(e,r){const t=e.getBoundingClientRect(),n=new i.Rect(new i.Vec2(t.left*window.devicePixelRatio,t.top*window.devicePixelRatio),new i.Vec2(t.width*window.devicePixelRatio,t.height*window.devicePixelRatio));this.setViewport(n,r)}}exports.CanvasContext=o; +},{"./graphics":42,"./rectangle-batch-renderer":102,"./texture-renderer":103,"../lib/math":97,"./overlay-rectangle-renderer":104,"./flamechart-color-pass-renderer":105}],38:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getFrameToColorBucket=exports.getProfileToView=exports.getProfileWithRecursionFlattened=exports.getRowAtlas=exports.getCanvasContext=exports.createGetCSSColorForFrame=exports.createGetColorBucketForFrame=void 0;var e=require("../lib/utils"),t=require("../gl/row-atlas"),r=require("../gl/canvas-context"),o=require("../lib/color");const n=exports.createGetColorBucketForFrame=(0,e.memoizeByReference)(e=>t=>e.get(t.key)||0),a=exports.createGetCSSColorForFrame=(0,e.memoizeByReference)(t=>{const r=n(t);return t=>{const n=r(t)/255,a=(0,e.triangle)(30*n),l=.9*n*360,i=.25+.2*a,s=.8-.15*a;return o.Color.fromLumaChromaHue(s,i,l).toCSS()}}),l=exports.getCanvasContext=(0,e.memoizeByReference)(e=>new r.CanvasContext(e)),i=exports.getRowAtlas=(0,e.memoizeByReference)(e=>new t.RowAtlas(e.gl,e.rectangleBatchRenderer,e.textureRenderer)),s=exports.getProfileWithRecursionFlattened=(0,e.memoizeByReference)(e=>e.getProfileWithRecursionFlattened()),c=exports.getProfileToView=(0,e.memoizeByShallowEquality)(({profile:e,flattenRecursion:t})=>t?e.getProfileWithRecursionFlattened():e),u=exports.getFrameToColorBucket=(0,e.memoizeByReference)(e=>{const t=[];function r(e){return(e.file||"")+e.name}e.forEachFrame(e=>t.push(e)),t.sort(function(e,t){return r(e)>r(t)?1:-1});const o=new Map;for(let e=0;e{t.preventDefault();const{sortMethod:o}=this.props;if(o.field==e)this.props.setSortMethod({field:e,direction:o.direction===h.ASCENDING?h.DESCENDING:h.ASCENDING});else switch(e){case n.SYMBOL_NAME:this.props.setSortMethod({field:e,direction:h.ASCENDING});break;case n.SELF:case n.TOTAL:this.props.setSortMethod({field:e,direction:h.DESCENDING})}}),this.getFrameList=(()=>{const{profile:e,sortMethod:t}=this.props,r=[];switch(e.forEachFrame(e=>r.push(e)),t.field){case n.SYMBOL_NAME:(0,o.sortBy)(r,e=>e.name.toLowerCase());break;case n.SELF:(0,o.sortBy)(r,e=>e.getSelfWeight());break;case n.TOTAL:(0,o.sortBy)(r,e=>e.getTotalWeight())}return t.direction===h.DESCENDING&&r.reverse(),r}),this.listView=null,this.listViewRef=(e=>{if(e===this.listView)return;this.listView=e;const{selectedFrame:t}=this.props;if(!t||!e)return;const o=this.getFrameList().indexOf(t);-1!==o&&e.scrollIndexIntoView(o)})}renderRow(r,s){const{profile:l,selectedFrame:a}=this.props,c=r.getTotalWeight(),n=r.getSelfWeight(),h=100*c/l.getTotalNonIdleWeight(),p=100*n/l.getTotalNonIdleWeight(),S=r===a;return(0,e.h)("tr",{key:`${s}`,onClick:this.props.setSelectedFrame.bind(null,r),className:(0,t.css)(E.tableRow,s%2==0&&E.tableRowEven,S&&E.tableRowSelected)},(0,e.h)("td",{className:(0,t.css)(E.numericCell)},l.formatValue(c)," (",(0,o.formatPercent)(h),")",(0,e.h)(d,{perc:h})),(0,e.h)("td",{className:(0,t.css)(E.numericCell)},l.formatValue(n)," (",(0,o.formatPercent)(p),")",(0,e.h)(d,{perc:p})),(0,e.h)("td",{title:r.file,className:(0,t.css)(E.textCell)},(0,e.h)(i.ColorChit,{color:this.props.getCSSColorForFrame(r)}),r.name))}render(){const{sortMethod:o}=this.props,i=this.getFrameList(),l=i.map(e=>({size:r.Sizes.FRAME_HEIGHT}));return(0,e.h)("div",{className:(0,t.css)(r.commonStyle.vbox,E.profileTableView)},(0,e.h)("table",{className:(0,t.css)(E.tableView)},(0,e.h)("thead",{className:(0,t.css)(E.tableHeader)},(0,e.h)("tr",null,(0,e.h)("th",{className:(0,t.css)(E.numericCell),onClick:e=>this.onSortClick(n.TOTAL,e)},(0,e.h)(p,{activeDirection:o.field===n.TOTAL?o.direction:null}),"Total"),(0,e.h)("th",{className:(0,t.css)(E.numericCell),onClick:e=>this.onSortClick(n.SELF,e)},(0,e.h)(p,{activeDirection:o.field===n.SELF?o.direction:null}),"Self"),(0,e.h)("th",{className:(0,t.css)(E.textCell),onClick:e=>this.onSortClick(n.SYMBOL_NAME,e)},(0,e.h)(p,{activeDirection:o.field===n.SYMBOL_NAME?o.direction:null}),"Symbol Name")))),(0,e.h)(s.ScrollableListView,{ref:this.listViewRef,axis:"y",items:l,className:(0,t.css)(E.scrollView),renderItems:(o,r)=>{const s=[];for(let e=o;e<=r;e++)s.push(this.renderRow(i[e],e));return(0,e.h)("table",{className:(0,t.css)(E.tableView)},s)}}))}}exports.ProfileTableView=S;const E=t.StyleSheet.create({profileTableView:{background:r.Colors.WHITE,height:"100%"},scrollView:{overflowY:"auto",overflowX:"hidden"},tableView:{width:"100%",fontSize:r.FontSize.LABEL,background:r.Colors.WHITE},tableHeader:{borderBottom:`2px solid ${r.Colors.LIGHT_GRAY}`,textAlign:"left",color:r.Colors.GRAY,userSelect:"none"},sortIcon:{position:"relative",top:1,marginRight:r.Sizes.FRAME_HEIGHT/4},tableRow:{height:r.Sizes.FRAME_HEIGHT},tableRowEven:{background:r.Colors.OFF_WHITE},tableRowSelected:{background:r.Colors.DARK_BLUE,color:r.Colors.WHITE},numericCell:{textOverflow:"ellipsis",overflow:"hidden",whiteSpace:"nowrap",position:"relative",textAlign:"right",paddingRight:r.Sizes.FRAME_HEIGHT,width:6*r.Sizes.FRAME_HEIGHT,minWidth:6*r.Sizes.FRAME_HEIGHT},textCell:{textOverflow:"ellipsis",overflow:"hidden",whiteSpace:"nowrap",width:"100%",maxWidth:0},hBarDisplay:{position:"absolute",background:r.Colors.TRANSPARENT_GREEN,bottom:2,height:2,width:`calc(100% - ${2*r.Sizes.FRAME_HEIGHT}px)`,right:r.Sizes.FRAME_HEIGHT},hBarDisplayFilled:{height:"100%",position:"absolute",background:r.Colors.GREEN,right:0}}),m=exports.ProfileTableViewContainer=(0,a.createContainer)(S,(e,t,o)=>{const{activeProfileState:r}=o,{profile:i,sandwichViewState:s,index:a}=r;if(!i)throw new Error("profile missing");const{tableSortMethod:n}=e,{callerCallee:h}=s,d=h?h.selectedFrame:null,p=(0,c.getFrameToColorBucket)(i),S=(0,c.createGetCSSColorForFrame)(p);return{profile:i,profileIndex:r.index,selectedFrame:d,getCSSColorForFrame:S,sortMethod:n,setSelectedFrame:e=>{t(l.actions.sandwichView.setSelectedFrame({profileIndex:a,args:e}))},setSortMethod:e=>{t(l.actions.sandwichView.setTableSortMethod(e))}}}); +},{"preact":24,"aphrodite":76,"../lib/utils":60,"./style":78,"./color-chit":99,"./scrollable-list-view":100,"../store/actions":40,"../lib/typed-redux":36,"../store/getters":38}],29:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.canUseXHR=exports.ViewMode=void 0,exports.createApplicationStore=d;var e=require("./actions"),t=require("redux"),r=n(t),o=require("../lib/typed-redux"),s=require("../lib/hash-params"),i=require("./profiles-state"),a=require("../views/profile-table-view");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}var c=exports.ViewMode=void 0;!function(e){e[e.CHRONO_FLAME_CHART=0]="CHRONO_FLAME_CHART",e[e.LEFT_HEAVY_FLAME_GRAPH=1]="LEFT_HEAVY_FLAME_GRAPH",e[e.SANDWICH_VIEW=2]="SANDWICH_VIEW"}(c||(exports.ViewMode=c={}));const l=window.location.protocol,u=exports.canUseXHR="http:"===l||"https:"===l;function d(t){const n=(0,s.getHashParams)(),l=u&&null!=n.profileURL,d=r.combineReducers({profileGroup:i.profileGroup,hashParams:(0,o.setter)(e.actions.setHashParams,n),flattenRecursion:(0,o.setter)(e.actions.setFlattenRecursion,!1),viewMode:(0,o.setter)(e.actions.setViewMode,c.CHRONO_FLAME_CHART),glCanvas:(0,o.setter)(e.actions.setGLCanvas,null),dragActive:(0,o.setter)(e.actions.setDragActive,!1),loading:(0,o.setter)(e.actions.setLoading,l),error:(0,o.setter)(e.actions.setError,!1),tableSortMethod:(0,o.setter)(e.actions.sandwichView.setTableSortMethod,{field:a.SortField.SELF,direction:a.SortDirection.DESCENDING})});return r.createStore(d,t)} +},{"./actions":40,"redux":32,"../lib/typed-redux":36,"../lib/hash-params":47,"./profiles-state":49,"../views/profile-table-view":53}],80:[function(require,module,exports) { +"use strict";function e(e){return e.replace(/\\([a-fA-F0-9]{2})/g,(e,n)=>{const t=parseInt(n,16);return String.fromCharCode(t)})}function n(n){const t=n.split("\n");if(!t.length)return null;if(""===t[t.length-1]&&t.pop(),!t.length)return null;const r=new Map,o=/^(\d+):(.+)$/,s=/^([\$\w]+):([\$\w-]+)$/;for(const n of t){const t=o.exec(n);if(t){r.set(`wasm-function[${t[1]}]`,e(t[2]));continue}const c=s.exec(n);if(!c)return null;r.set(c[1],e(c[2]))}return r}Object.defineProperty(exports,"__esModule",{value:!0}),exports.importEmscriptenSymbolMap=n; +},{}],114:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Flamechart=void 0;var t=require("./utils"),e=require("./math");class r{constructor(e){this.source=e,this.layers=[],this.totalWeight=0,this.minFrameWidth=1;const r=[];this.minFrameWidth=1/0;this.totalWeight=e.getTotalWeight(),e.forEachCall((e,i)=>{const s=(0,t.lastOf)(r),h={node:e,parent:s,children:[],start:i,end:i};s&&s.children.push(h),r.push(h)},(t,e)=>{console.assert(r.length>0);const i=r.pop();if(i.end=e,i.end-i.start==0)return;const s=r.length;for(;this.layers.length<=s;)this.layers.push([]);this.layers[s].push(i),this.minFrameWidth=Math.min(this.minFrameWidth,i.end-i.start)}),isFinite(this.minFrameWidth)||(this.minFrameWidth=1)}getTotalWeight(){return this.totalWeight}getLayers(){return this.layers}getColorBucketForFrame(t){return this.source.getColorBucketForFrame(t)}getMinFrameWidth(){return this.minFrameWidth}formatValue(t){return this.source.formatValue(t)}getClampedViewportWidth(t){const r=this.getTotalWeight(),i=Math.pow(2,40),s=(0,e.clamp)(3*this.getMinFrameWidth(),r/i,r);return(0,e.clamp)(t,s,r)}}exports.Flamechart=r; +},{"./utils":60,"./math":97}],115:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlamechartRenderer=exports.FlamechartRowAtlasKey=void 0;var e=require("./rectangle-batch-renderer"),t=require("../lib/math"),r=require("../lib/color"),n=require("../lib/utils"),s=require("./graphics"),o=require("./utils");const c=1e4;class i{constructor(e,t,r){this.batch=e,this.bounds=t,this.numPrecedingRectanglesInRow=r,this.children=[]}getBatch(){return this.batch}getBounds(){return this.bounds}getRectCount(){return this.batch.getRectCount()}getChildren(){return this.children}getParity(){return this.numPrecedingRectanglesInRow%2}forEachLeafNodeWithinBounds(e,t){this.bounds.hasIntersectionWith(e)&&t(this)}}class h{constructor(e){if(this.children=e,this.rectCount=0,0===e.length)throw new Error("Empty interior node");let r=1/0,n=-1/0,s=1/0,o=-1/0;for(let t of e){this.rectCount+=t.getRectCount();const e=t.getBounds();r=Math.min(r,e.left()),n=Math.max(n,e.right()),s=Math.min(s,e.top()),o=Math.max(o,e.bottom())}this.bounds=new t.Rect(new t.Vec2(r,s),new t.Vec2(n-r,o-s))}getBounds(){return this.bounds}getRectCount(){return this.rectCount}getChildren(){return this.children}forEachLeafNodeWithinBounds(e,t){if(this.bounds.hasIntersectionWith(e))for(let r of this.children)r.forEachLeafNodeWithinBounds(e,t)}}class a{get key(){return`${this.stackDepth}_${this.index}_${this.zoomLevel}`}constructor(e){this.stackDepth=e.stackDepth,this.zoomLevel=e.zoomLevel,this.index=e.index}static getOrInsert(e,t){return e.getOrInsert(new a(t))}}exports.FlamechartRowAtlasKey=a;class l{constructor(s,o,a,l,g,d={inverted:!1}){this.gl=s,this.rowAtlas=o,this.flamechart=a,this.rectangleBatchRenderer=l,this.colorPassRenderer=g,this.options=d,this.layers=[],this.rectInfoTexture=null,this.rectInfoRenderTarget=null,this.atlasKeys=new n.KeyedSet;const f=a.getLayers().length;for(let n=0;n=c&&(s.push(new i(u,new t.Rect(new t.Vec2(l,o),new t.Vec2(g-l,1)),R)),l=1/0,g=-1/0,u=new e.RectangleBatch(this.gl));const d=new t.Rect(new t.Vec2(a.start,o),new t.Vec2(a.end-a.start,1));l=Math.min(l,d.left()),g=Math.max(g,d.right());const f=new r.Color((1+h%255)/256,(1+n%255)/256,(1+this.flamechart.getColorBucketForFrame(a.node.frame))/256);u.addRect(d,f),R++}u.getRectCount()>0&&s.push(new i(u,new t.Rect(new t.Vec2(l,o),new t.Vec2(g-l,1)),R)),this.layers.push(new h(s))}}getRectInfoTexture(e,t){if(this.rectInfoTexture){const r=this.rectInfoTexture;r.width==e&&r.height==t||r.resize(e,t)}else this.rectInfoTexture=this.gl.createTexture(s.Graphics.TextureFormat.NEAREST_CLAMP,e,t);return this.rectInfoTexture}getRectInfoRenderTarget(e,t){const r=this.getRectInfoTexture(e,t);return this.rectInfoRenderTarget&&this.rectInfoRenderTarget.texture!=r&&(this.rectInfoRenderTarget.texture.free(),this.rectInfoRenderTarget.setColor(r)),this.rectInfoRenderTarget||(this.rectInfoRenderTarget=this.gl.createRenderTarget(r)),this.rectInfoRenderTarget}free(){this.rectInfoRenderTarget&&this.rectInfoRenderTarget.free(),this.rectInfoTexture&&this.rectInfoTexture.free()}configSpaceBoundsForKey(e){const{stackDepth:r,zoomLevel:n,index:s}=e,o=this.flamechart.getTotalWeight()/Math.pow(2,n),c=this.flamechart.getLayers().length,i=this.options.inverted?c-1-r:r;return new t.Rect(new t.Vec2(o*s,i),new t.Vec2(o,1))}render(e){const{configSpaceSrcRect:r,physicalSpaceDstRect:n}=e,c=[],i=t.AffineTransform.betweenRects(r,n);if(r.isEmpty())return;let h=0;for(;;){const e=a.getOrInsert(this.atlasKeys,{stackDepth:0,zoomLevel:h,index:0}),t=this.configSpaceBoundsForKey(e);if(i.transformRect(t).width(){const r=this.configSpaceBoundsForKey(t);this.layers[t.stackDepth].forEachLeafNodeWithinBounds(r,t=>{this.rectangleBatchRenderer.render({batch:t.getBatch(),configSpaceSrcRect:r,physicalSpaceDstRect:e})})});const T=this.getRectInfoRenderTarget(n.width(),n.height());(0,o.renderInto)(this.gl,T,()=>{this.gl.clear(new s.Graphics.Color(0,0,0,0));const e=new t.Rect(t.Vec2.zero,new t.Vec2(this.gl.viewport.width,this.gl.viewport.height)),n=t.AffineTransform.betweenRects(r,e);for(let e of m){const t=this.configSpaceBoundsForKey(e);this.rowAtlas.renderViaAtlas(e,n.transformRect(t))}for(let e of I){const t=this.configSpaceBoundsForKey(e),r=n.transformRect(t);this.layers[e.stackDepth].forEachLeafNodeWithinBounds(t,e=>{this.rectangleBatchRenderer.render({batch:e.getBatch(),configSpaceSrcRect:t,physicalSpaceDstRect:r})})}});const x=this.getRectInfoTexture(n.width(),n.height());this.colorPassRenderer.render({rectInfoTexture:x,srcRect:new t.Rect(t.Vec2.zero,new t.Vec2(x.width,x.height)),dstRect:n,renderOutlines:e.renderOutlines})}}exports.FlamechartRenderer=l; +},{"./rectangle-batch-renderer":102,"../lib/math":97,"../lib/color":66,"../lib/utils":60,"./graphics":42,"./utils":107}],159:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.style=void 0;var e=require("aphrodite"),o=require("./style");const t=exports.style=e.StyleSheet.create({hoverCount:{color:o.Colors.GREEN},fill:{width:"100%",height:"100%",position:"absolute",left:0,top:0},minimap:{height:o.Sizes.MINIMAP_HEIGHT,borderBottom:`${o.Sizes.SEPARATOR_HEIGHT}px solid ${o.Colors.LIGHT_GRAY}`},panZoomView:{flex:1},detailView:{display:"grid",height:o.Sizes.DETAIL_VIEW_HEIGHT,overflow:"hidden",gridTemplateColumns:"120px 120px 1fr",gridTemplateRows:"repeat(4, 1fr)",borderTop:`${o.Sizes.SEPARATOR_HEIGHT}px solid ${o.Colors.LIGHT_GRAY}`,fontSize:o.FontSize.LABEL,position:"absolute",background:o.Colors.WHITE,width:"100vw",bottom:0},stackTraceViewPadding:{padding:5},stackTraceView:{height:o.Sizes.DETAIL_VIEW_HEIGHT,lineHeight:`${o.FontSize.LABEL+2}px`,overflow:"auto"},stackLine:{whiteSpace:"nowrap"},stackFileLine:{color:o.Colors.LIGHT_GRAY},statsTable:{display:"grid",gridTemplateColumns:"1fr 1fr",gridTemplateRows:`repeat(3, ${o.FontSize.LABEL+10}px)`,gridGap:"1px 1px",textAlign:"center",paddingRight:1},statsTableHeader:{gridColumn:"1 / 3"},statsTableCell:{position:"relative",display:"flex",justifyContent:"center",alignItems:"center"},thisInstanceCell:{background:o.Colors.DARK_BLUE,color:o.Colors.WHITE},allInstancesCell:{background:o.Colors.PALE_DARK_BLUE,color:o.Colors.WHITE},barDisplay:{position:"absolute",top:0,left:0,background:"rgba(0, 0, 0, 0.2)",width:"100%"}}); +},{"aphrodite":76,"./style":78}],160:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ELLIPSIS=void 0,exports.cachedMeasureTextWidth=n,exports.trimTextMid=s;var e=require("./utils");const t=exports.ELLIPSIS="โ€ฆ",r=new Map;let i=-1;function n(e,t){return window.devicePixelRatio!==i&&(r.clear(),i=window.devicePixelRatio),r.has(t)||r.set(t,e.measureText(t).width),r.get(t)}function o(e,r){const i=Math.floor(r/2),n=e.substr(0,i),o=e.substr(e.length-i,i);return n+t+o}function s(t,r,i){if(n(t,r)<=i)return r;const[s]=(0,e.binarySearch)(0,r.length,e=>n(t,o(r,e)),i);return o(r,s)} +},{"./utils":60}],157:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlamechartMinimapView=void 0;var e,i=require("preact"),t=require("aphrodite"),o=require("../lib/math"),s=require("./flamechart-style"),n=require("./style"),a=require("../lib/text-utils");!function(e){e[e.DRAW_NEW_VIEWPORT=0]="DRAW_NEW_VIEWPORT",e[e.TRANSLATE_VIEWPORT=1]="TRANSLATE_VIEWPORT"}(e||(e={}));class r extends i.Component{constructor(){super(...arguments),this.container=null,this.containerRef=(e=>{this.container=e||null}),this.overlayCanvas=null,this.overlayCtx=null,this.onWindowResize=(()=>{this.onBeforeFrame()}),this.onBeforeFrame=(()=>{this.maybeClearInteractionLock(),this.resizeOverlayCanvasIfNeeded(),this.renderRects(),this.renderOverlays()}),this.renderCanvas=(()=>{this.props.canvasContext.requestFrame()}),this.frameHadWheelEvent=!1,this.framesWithoutWheelEvents=0,this.interactionLock=null,this.maybeClearInteractionLock=(()=>{this.interactionLock&&(this.frameHadWheelEvent||(this.framesWithoutWheelEvents++,this.framesWithoutWheelEvents>=2&&(this.interactionLock=null,this.framesWithoutWheelEvents=0)),this.props.canvasContext.requestFrame()),this.frameHadWheelEvent=!1}),this.onWheel=(e=>{if(e.preventDefault(),this.frameHadWheelEvent=!0,(e.metaKey||e.ctrlKey)&&"pan"!==this.interactionLock){let i=1+e.deltaY/100;e.ctrlKey&&(i=1+e.deltaY/40),i=(0,o.clamp)(i,.1,10),this.zoom(i)}else"zoom"!==this.interactionLock&&this.pan(new o.Vec2(e.deltaX,e.deltaY));this.renderCanvas()}),this.dragStartConfigSpaceMouse=null,this.dragConfigSpaceViewportOffset=null,this.draggingMode=null,this.onMouseDown=(i=>{const t=this.configSpaceMouse(i);t&&(this.props.configSpaceViewportRect.contains(t)?(this.draggingMode=e.TRANSLATE_VIEWPORT,this.dragConfigSpaceViewportOffset=t.minus(this.props.configSpaceViewportRect.origin)):this.draggingMode=e.DRAW_NEW_VIEWPORT,this.dragStartConfigSpaceMouse=t,window.addEventListener("mousemove",this.onWindowMouseMove),window.addEventListener("mouseup",this.onWindowMouseUp),this.updateCursor(t))}),this.onWindowMouseMove=(i=>{if(!this.dragStartConfigSpaceMouse)return;let t=this.configSpaceMouse(i);if(t)if(this.updateCursor(t),t=new o.Rect(new o.Vec2(0,0),this.configSpaceSize()).closestPointTo(t),this.draggingMode===e.DRAW_NEW_VIEWPORT){const e=this.dragStartConfigSpaceMouse;let i=t;if(!e||!i)return;const s=Math.min(e.x,i.x),n=Math.max(e.x,i.x)-s,a=this.props.configSpaceViewportRect.height();this.props.setConfigSpaceViewportRect(new o.Rect(new o.Vec2(s,i.y-a/2),new o.Vec2(n,a)))}else if(this.draggingMode===e.TRANSLATE_VIEWPORT){if(!this.dragConfigSpaceViewportOffset)return;const e=t.minus(this.dragConfigSpaceViewportOffset);this.props.setConfigSpaceViewportRect(this.props.configSpaceViewportRect.withOrigin(e))}}),this.updateCursor=(i=>{this.draggingMode===e.TRANSLATE_VIEWPORT?(document.body.style.cursor="grabbing",document.body.style.cursor="-webkit-grabbing"):this.draggingMode===e.DRAW_NEW_VIEWPORT?document.body.style.cursor="col-resize":this.props.configSpaceViewportRect.contains(i)?(document.body.style.cursor="grab",document.body.style.cursor="-webkit-grab"):document.body.style.cursor="col-resize"}),this.onMouseLeave=(()=>{null==this.draggingMode&&(document.body.style.cursor="default")}),this.onMouseMove=(e=>{const i=this.configSpaceMouse(e);i&&this.updateCursor(i)}),this.onWindowMouseUp=(e=>{this.draggingMode=null,window.removeEventListener("mousemove",this.onWindowMouseMove),window.removeEventListener("mouseup",this.onWindowMouseUp);const i=this.configSpaceMouse(e);i&&this.updateCursor(i)}),this.overlayCanvasRef=(e=>{e?(this.overlayCanvas=e,this.overlayCtx=this.overlayCanvas.getContext("2d"),this.renderCanvas()):(this.overlayCanvas=null,this.overlayCtx=null)})}physicalViewSize(){return new o.Vec2(this.overlayCanvas?this.overlayCanvas.width:0,this.overlayCanvas?this.overlayCanvas.height:0)}minimapOrigin(){return new o.Vec2(0,n.Sizes.FRAME_HEIGHT*window.devicePixelRatio)}configSpaceSize(){return new o.Vec2(this.props.flamechart.getTotalWeight(),this.props.flamechart.getLayers().length)}configSpaceToPhysicalViewSpace(){const e=this.minimapOrigin();return o.AffineTransform.betweenRects(new o.Rect(new o.Vec2(0,0),this.configSpaceSize()),new o.Rect(e,this.physicalViewSize().minus(e)))}logicalToPhysicalViewSpace(){return o.AffineTransform.withScale(new o.Vec2(window.devicePixelRatio,window.devicePixelRatio))}windowToLogicalViewSpace(){if(!this.container)return new o.AffineTransform;const e=this.container.getBoundingClientRect();return o.AffineTransform.withTranslation(new o.Vec2(-e.left,-e.top))}renderRects(){this.container&&(this.physicalViewSize().x<2||this.props.canvasContext.renderBehind(this.container,()=>{this.props.flamechartRenderer.render({configSpaceSrcRect:new o.Rect(new o.Vec2(0,0),this.configSpaceSize()),physicalSpaceDstRect:new o.Rect(this.minimapOrigin(),this.physicalViewSize().minus(this.minimapOrigin())),renderOutlines:!1}),this.props.canvasContext.viewportRectangleRenderer.render({configSpaceViewportRect:this.props.configSpaceViewportRect,configSpaceToPhysicalViewSpace:this.configSpaceToPhysicalViewSpace()})}))}renderOverlays(){const e=this.overlayCtx;if(!e)return;const i=this.physicalViewSize();e.clearRect(0,0,i.x,i.y);const t=this.configSpaceToPhysicalViewSpace(),s=this.configSpaceSize().x,r=(this.configSpaceToPhysicalViewSpace().inverted()||new o.AffineTransform).times(this.logicalToPhysicalViewSpace()).transformVector(new o.Vec2(200,1)).x,c=n.Sizes.FRAME_HEIGHT*window.devicePixelRatio,h=n.FontSize.LABEL*window.devicePixelRatio,l=(c-h)/2;e.font=`${h}px/${c}px ${n.FontFamily.MONOSPACE}`,e.textBaseline="top";let p=Math.pow(10,Math.floor(Math.log10(r)));r/p>5?p*=5:r/p>2&&(p*=2),e.fillStyle="rgba(255, 255, 255, 0.8)",e.fillRect(0,0,i.x,c),e.textBaseline="top",e.fillStyle=n.Colors.DARK_GRAY;for(let n=Math.ceil(0/p)*p;n ")),i.push(c.name),c.file){let l=c.file;c.line&&(l+=`:${c.line}`,c.col&&(l+=`:${c.col}`)),i.push((0,s.h)("span",{className:(0,e.css)(t.style.stackFileLine)}," (",l,")"))}l.push((0,s.h)("div",{className:(0,e.css)(t.style.stackLine)},i))}return(0,s.h)("div",{className:(0,e.css)(t.style.stackTraceView)},(0,s.h)("div",{className:(0,e.css)(t.style.stackTraceViewPadding)},l))}}class c extends s.Component{render(){const{flamechart:l,selectedNode:a}=this.props,{frame:c}=a;return(0,s.h)("div",{className:(0,e.css)(t.style.detailView)},(0,s.h)(r,{title:"This Instance",cellStyle:t.style.thisInstanceCell,grandTotal:l.getTotalWeight(),selectedTotal:a.getTotalWeight(),selectedSelf:a.getSelfWeight(),formatter:l.formatValue.bind(l)}),(0,s.h)(r,{title:"All Instances",cellStyle:t.style.allInstancesCell,grandTotal:l.getTotalWeight(),selectedTotal:c.getTotalWeight(),selectedSelf:c.getSelfWeight(),formatter:l.formatValue.bind(l)}),(0,s.h)(i,{node:a,getFrameColor:this.props.getCSSColorForFrame}))}}exports.FlamechartDetailView=c; +},{"aphrodite":76,"preact":24,"./flamechart-style":159,"../lib/utils":60,"./color-chit":99}],142:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlamechartPanZoomView=void 0;var e=require("../lib/math"),t=require("./style"),i=require("../lib/text-utils"),o=require("./flamechart-style"),s=require("preact"),n=require("aphrodite");class r extends s.Component{constructor(){super(...arguments),this.container=null,this.containerRef=(e=>{this.container=e||null}),this.overlayCanvas=null,this.overlayCtx=null,this.hoveredLabel=null,this.overlayCanvasRef=(e=>{e?(this.overlayCanvas=e,this.overlayCtx=this.overlayCanvas.getContext("2d"),this.renderCanvas()):(this.overlayCanvas=null,this.overlayCtx=null)}),this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT=t.Sizes.FRAME_HEIGHT,this.onWindowResize=(()=>{this.updateConfigSpaceViewport(),this.onBeforeFrame()}),this.frameHadWheelEvent=!1,this.framesWithoutWheelEvents=0,this.interactionLock=null,this.maybeClearInteractionLock=(()=>{this.interactionLock&&(this.frameHadWheelEvent||(this.framesWithoutWheelEvents++,this.framesWithoutWheelEvents>=2&&(this.interactionLock=null,this.framesWithoutWheelEvents=0)),this.props.canvasContext.requestFrame()),this.frameHadWheelEvent=!1}),this.onBeforeFrame=(()=>{this.resizeOverlayCanvasIfNeeded(),this.renderRects(),this.renderOverlays(),this.maybeClearInteractionLock()}),this.renderCanvas=(()=>{this.props.canvasContext.requestFrame()}),this.lastDragPos=null,this.mouseDownPos=null,this.onMouseDown=(t=>{this.mouseDownPos=this.lastDragPos=new e.Vec2(t.offsetX,t.offsetY),this.updateCursor(),window.addEventListener("mouseup",this.onWindowMouseUp)}),this.onMouseDrag=(t=>{if(!this.lastDragPos)return;const i=new e.Vec2(t.offsetX,t.offsetY);this.pan(this.lastDragPos.minus(i)),this.lastDragPos=i,this.hoveredLabel&&this.props.onNodeHover(null)}),this.onDblClick=(t=>{if(this.hoveredLabel){const t=this.hoveredLabel.configSpaceBounds,i=new e.Rect(t.origin.minus(new e.Vec2(0,1)),t.size.withY(this.props.configSpaceViewportRect.height()));this.props.setConfigSpaceViewportRect(i)}}),this.onClick=(t=>{const i=new e.Vec2(t.offsetX,t.offsetY),o=this.mouseDownPos;this.mouseDownPos=null,o&&i.minus(o).length()>5||(this.hoveredLabel?(this.props.onNodeSelect(this.hoveredLabel.node),this.renderCanvas()):this.props.onNodeSelect(null))}),this.onWindowMouseUp=(e=>{this.lastDragPos=null,this.updateCursor(),window.removeEventListener("mouseup",this.onWindowMouseUp)}),this.onMouseMove=(t=>{if(this.updateCursor(),this.lastDragPos)return t.preventDefault(),void this.onMouseDrag(t);this.hoveredLabel=null;const i=new e.Vec2(t.offsetX,t.offsetY),o=this.logicalToPhysicalViewSpace().transformPosition(i),s=this.configSpaceToPhysicalViewSpace().inverseTransformPosition(o);if(!s)return;const n=(t,i=0)=>{const o=t.end-t.start,r=this.props.renderInverted?this.configSpaceSize().y-1-i:i,a=new e.Rect(new e.Vec2(t.start,r),new e.Vec2(o,1));if(s.xa.right())return null;a.contains(s)&&(this.hoveredLabel={configSpaceBounds:a,node:t.node});for(let e of t.children)n(e,i+1)};for(let e of this.props.flamechart.getLayers()[0]||[])n(e);this.hoveredLabel?this.props.onNodeHover({node:this.hoveredLabel.node,event:t}):this.props.onNodeHover(null),this.renderCanvas()}),this.onMouseLeave=(e=>{this.hoveredLabel=null,this.props.onNodeHover(null),this.renderCanvas()}),this.onWheel=(t=>{t.preventDefault(),this.frameHadWheelEvent=!0;const i=t.metaKey||t.ctrlKey;let o=t.deltaY,s=t.deltaX;if(t.deltaMode===t.DOM_DELTA_LINE&&(o*=this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT,s*=this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT),i&&"pan"!==this.interactionLock){let i=1+o/100;t.ctrlKey&&(i=1+o/40),i=(0,e.clamp)(i,.1,10),this.zoom(new e.Vec2(t.offsetX,t.offsetY),i)}else"zoom"!==this.interactionLock&&this.pan(new e.Vec2(s,o));this.renderCanvas()}),this.onWindowKeyPress=(t=>{if(!this.container)return;const{width:i,height:o}=this.container.getBoundingClientRect();"="===t.key||"+"===t.key?(this.zoom(new e.Vec2(i/2,o/2),.5),t.preventDefault()):"-"!==t.key&&"_"!==t.key||(this.zoom(new e.Vec2(i/2,o/2),2),t.preventDefault()),t.ctrlKey||t.shiftKey||t.metaKey||("0"===t.key?this.zoom(new e.Vec2(i/2,o/2),1e9):"ArrowRight"===t.key||"KeyD"===t.code?this.pan(new e.Vec2(100,0)):"ArrowLeft"===t.key||"KeyA"===t.code?this.pan(new e.Vec2(-100,0)):"ArrowUp"===t.key||"KeyW"===t.code?this.pan(new e.Vec2(0,-100)):"ArrowDown"===t.key||"KeyS"===t.code?this.pan(new e.Vec2(0,100)):"Escape"===t.key&&(this.props.onNodeSelect(null),this.renderCanvas()))})}setConfigSpaceViewportRect(e){this.props.setConfigSpaceViewportRect(e)}configSpaceSize(){return new e.Vec2(this.props.flamechart.getTotalWeight(),this.props.flamechart.getLayers().length)}physicalViewSize(){return new e.Vec2(this.overlayCanvas?this.overlayCanvas.width:0,this.overlayCanvas?this.overlayCanvas.height:0)}physicalBounds(){if(this.props.renderInverted){const t=this.physicalViewSize().y,i=(this.configSpaceSize().y+1)*this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT*window.devicePixelRatio;if(i{const f=t.end-t.start,w=this.props.renderInverted?this.configSpaceSize().y-1-d:d,u=new e.Rect(new e.Vec2(t.start,w),new e.Vec2(f,1));if(!(fthis.props.configSpaceViewportRect.right()||u.right()this.props.configSpaceViewportRect.bottom())return;if(u.hasIntersectionWith(this.props.configSpaceViewportRect)){let e=s.transformRect(u);if(e.left()<0&&(e=e.withOrigin(e.origin.withX(0)).withSize(e.size.withX(e.size.x+e.left()))),e.right()>a.x&&(e=e.withSize(e.size.withX(a.x-e.left()))),e.width()>h){const s=(0,i.trimTextMid)(o,t.node.frame.name,e.width()-2*l);o.fillText(s,e.left()+l,Math.round(e.bottom()-(r-n)/2))}}for(let e of t.children)p(e,d+1)}};for(let e of this.props.flamechart.getLayers()[0]||[])p(e);const d=2*window.devicePixelRatio;o.strokeStyle=t.Colors.PALE_DARK_BLUE,o.lineWidth=d;const f=(s.inverseTransformVector(new e.Vec2(1,0))||new e.Vec2(0,0)).x,w=(i,n=0)=>{if(!this.props.selectedNode)return;const r=i.end-i.start,a=this.props.renderInverted?this.configSpaceSize().y-1-n:n,h=new e.Rect(new e.Vec2(i.start,a),new e.Vec2(r,1));if(!(rthis.props.configSpaceViewportRect.right()||h.right()this.props.configSpaceViewportRect.bottom())){if(h.hasIntersectionWith(this.props.configSpaceViewportRect)){const e=s.transformRect(h);i.node.frame===this.props.selectedNode.frame&&(i.node===this.props.selectedNode?o.strokeStyle!==t.Colors.DARK_BLUE&&(o.stroke(),o.beginPath(),o.strokeStyle=t.Colors.DARK_BLUE):o.strokeStyle!==t.Colors.PALE_DARK_BLUE&&(o.stroke(),o.beginPath(),o.strokeStyle=t.Colors.PALE_DARK_BLUE),o.rect(Math.round(e.left()+1+d/2),Math.round(e.top()+1+d/2),Math.round(Math.max(0,e.width()-2-d)),Math.round(Math.max(0,e.height()-2-d))))}for(let e of i.children)w(e,n+1)}};o.beginPath();for(let e of this.props.flamechart.getLayers()[0]||[])w(e);o.stroke(),this.renderTimeIndicators()}renderTimeIndicators(){const o=this.overlayCtx;if(!o)return;const s=this.LOGICAL_VIEW_SPACE_FRAME_HEIGHT*window.devicePixelRatio,n=this.physicalViewSize(),r=this.configSpaceToPhysicalViewSpace(),a=(s-t.FontSize.LABEL*window.devicePixelRatio)/2,h=this.props.configSpaceViewportRect.left(),c=this.props.configSpaceViewportRect.right(),l=(this.configSpaceToPhysicalViewSpace().inverted()||new e.AffineTransform).times(this.logicalToPhysicalViewSpace()).transformVector(new e.Vec2(200,1)).x;let p=Math.pow(10,Math.floor(Math.log10(l)));l/p>5?p*=5:l/p>2&&(p*=2);{const l=this.props.renderInverted?n.y-s:0;o.fillStyle="rgba(255, 255, 255, 0.8)",o.fillRect(0,l,n.x,s),o.fillStyle=t.Colors.DARK_GRAY,o.textBaseline="top";for(let t=Math.ceil(h/p)*p;t{this.props.flamechartRenderer.render({physicalSpaceDstRect:this.physicalBounds(),configSpaceSrcRect:this.props.configSpaceViewportRect,renderOutlines:!0})}))}pan(t){this.interactionLock="pan";const i=this.logicalToPhysicalViewSpace().transformVector(t),o=this.configSpaceToPhysicalViewSpace().inverseTransformVector(i);this.hoveredLabel&&this.props.onNodeHover(null),o&&this.props.transformViewport(e.AffineTransform.withTranslation(o))}zoom(t,i){this.interactionLock="zoom";const o=this.logicalToPhysicalViewSpace().transformPosition(t),s=this.configSpaceToPhysicalViewSpace().inverseTransformPosition(o);if(!s)return;const n=e.AffineTransform.withTranslation(s.times(-1)).scaledBy(new e.Vec2(i,1)).translatedBy(s);this.props.transformViewport(n)}updateCursor(){this.lastDragPos?(document.body.style.cursor="grabbing",document.body.style.cursor="-webkit-grabbing"):document.body.style.cursor="default"}shouldComponentUpdate(){return!1}componentWillReceiveProps(e){this.props.flamechart!==e.flamechart?(this.hoveredLabel=null,this.renderCanvas()):this.props.selectedNode!==e.selectedNode?this.renderCanvas():this.props.configSpaceViewportRect!==e.configSpaceViewportRect&&this.renderCanvas()}componentDidMount(){this.props.canvasContext.addBeforeFrameHandler(this.onBeforeFrame),window.addEventListener("resize",this.onWindowResize),window.addEventListener("keydown",this.onWindowKeyPress)}componentWillUnmount(){this.props.canvasContext.removeBeforeFrameHandler(this.onBeforeFrame),window.removeEventListener("resize",this.onWindowResize),window.removeEventListener("keydown",this.onWindowKeyPress)}render(){return(0,s.h)("div",{className:(0,n.css)(o.style.panZoomView,t.commonStyle.vbox),onMouseDown:this.onMouseDown,onMouseMove:this.onMouseMove,onMouseLeave:this.onMouseLeave,onClick:this.onClick,onDblClick:this.onDblClick,onWheel:this.onWheel,ref:this.containerRef},(0,s.h)("canvas",{width:1,height:1,ref:this.overlayCanvasRef,className:(0,n.css)(o.style.fill)}))}}exports.FlamechartPanZoomView=r; +},{"../lib/math":97,"./style":78,"../lib/text-utils":160,"./flamechart-style":159,"preact":24,"aphrodite":76}],143:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Hovertip=void 0;var e=require("./style"),o=require("aphrodite"),t=require("preact");class i extends t.Component{render(){const{containerSize:i,offset:r}=this.props,n=i.x,p=i.y,d={};return r.x+7+e.Sizes.TOOLTIP_WIDTH_MAX{const t=a.Sizes.DETAIL_VIEW_HEIGHT/a.Sizes.FRAME_HEIGHT,i=this.configSpaceSize(),o=this.props.flamechart.getClampedViewportWidth(e.size.x),s=e.size.withX(o),c=r.Vec2.clamp(e.origin,new r.Vec2(0,-1),r.Vec2.max(r.Vec2.zero,i.minus(s).plus(new r.Vec2(0,t+1))));this.props.setConfigSpaceViewportRect(new r.Rect(c,e.size.withX(o)))}),this.setLogicalSpaceViewportSize=(e=>{this.props.setLogicalSpaceViewportSize(e)}),this.transformViewport=(e=>{const t=e.transformRect(this.props.configSpaceViewportRect);this.setConfigSpaceViewportRect(t)}),this.onNodeHover=(e=>{this.props.setNodeHover(e)}),this.onNodeClick=(e=>{this.props.setSelectedNode(e)}),this.container=null,this.containerRef=(e=>{this.container=e||null})}configSpaceSize(){return new r.Vec2(this.props.flamechart.getTotalWeight(),this.props.flamechart.getLayers().length)}formatValue(e){const t=100*e/this.props.flamechart.getTotalWeight(),r=(0,i.formatPercent)(t);return`${this.props.flamechart.formatValue(e)} (${r})`}renderTooltip(){if(!this.container)return null;const{hover:i}=this.props;if(!i)return null;const{width:o,height:a,left:c,top:p}=this.container.getBoundingClientRect(),h=new r.Vec2(i.event.clientX-c,i.event.clientY-p);return(0,e.h)(n.Hovertip,{containerSize:new r.Vec2(o,a),offset:h},(0,e.h)("span",{className:(0,t.css)(s.style.hoverCount)},this.formatValue(i.node.getTotalWeight()))," ",i.node.frame.name)}render(){return(0,e.h)("div",{className:(0,t.css)(s.style.fill,a.commonStyle.vbox),ref:this.containerRef},(0,e.h)(o.FlamechartMinimapView,{configSpaceViewportRect:this.props.configSpaceViewportRect,transformViewport:this.transformViewport,flamechart:this.props.flamechart,flamechartRenderer:this.props.flamechartRenderer,canvasContext:this.props.canvasContext,setConfigSpaceViewportRect:this.setConfigSpaceViewportRect}),(0,e.h)(p.FlamechartPanZoomView,{canvasContext:this.props.canvasContext,flamechart:this.props.flamechart,flamechartRenderer:this.props.flamechartRenderer,renderInverted:!1,onNodeHover:this.onNodeHover,onNodeSelect:this.onNodeClick,selectedNode:this.props.selectedNode,transformViewport:this.transformViewport,configSpaceViewportRect:this.props.configSpaceViewportRect,setConfigSpaceViewportRect:this.setConfigSpaceViewportRect,logicalSpaceViewportSize:this.props.logicalSpaceViewportSize,setLogicalSpaceViewportBounds:this.setLogicalSpaceViewportSize}),this.renderTooltip(),this.props.selectedNode&&(0,e.h)(c.FlamechartDetailView,{flamechart:this.props.flamechart,getCSSColorForFrame:this.props.getCSSColorForFrame,selectedNode:this.props.selectedNode}))}}exports.FlamechartView=l; +},{"preact":24,"aphrodite":76,"../lib/math":97,"../lib/utils":60,"./flamechart-minimap-view":157,"./flamechart-style":159,"./style":78,"./flamechart-detail-view":158,"./flamechart-pan-zoom-view":142,"./hovertip":143,"../lib/typed-redux":36}],70:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LeftHeavyFlamechartView=exports.getLeftHeavyFlamechart=exports.ChronoFlamechartView=exports.createMemoizedFlamechartRenderer=exports.getChronoViewFlamechart=void 0,exports.createFlamechartSetters=n;var e=require("../store/flamechart-view-state"),t=require("../lib/flamechart"),r=require("../gl/flamechart-renderer"),a=require("../lib/typed-redux"),o=require("../lib/utils"),l=require("./flamechart-view"),c=require("../store/getters"),i=require("../store/actions");function n(e,t,r){function a(a,o){return l=>{const c=Object.assign({},o(l),{id:t});e(a({profileIndex:r,args:c}))}}const{setHoveredNode:o,setLogicalSpaceViewportSize:l,setConfigSpaceViewportRect:c,setSelectedNode:n}=i.actions.flamechart;return{setNodeHover:a(o,e=>({hover:e})),setLogicalSpaceViewportSize:a(l,e=>({logicalSpaceViewportSize:e})),setConfigSpaceViewportRect:a(c,e=>({configSpaceViewportRect:e})),setSelectedNode:a(n,e=>({selectedNode:e}))}}const m=exports.getChronoViewFlamechart=(0,o.memoizeByShallowEquality)(({profile:e,getColorBucketForFrame:r})=>new t.Flamechart({getTotalWeight:e.getTotalWeight.bind(e),forEachCall:e.forEachCall.bind(e),formatValue:e.formatValue.bind(e),getColorBucketForFrame:r})),s=exports.createMemoizedFlamechartRenderer=(e=>(0,o.memoizeByShallowEquality)(({canvasContext:t,flamechart:a})=>new r.FlamechartRenderer(t.gl,(0,c.getRowAtlas)(t),a,t.rectangleBatchRenderer,t.flamechartColorPassRenderer,e))),h=s(),F=exports.ChronoFlamechartView=(0,a.createContainer)(l.FlamechartView,(t,r,a)=>{const{activeProfileState:o,glCanvas:l}=a,{index:i,profile:s,chronoViewState:F}=o,C=(0,c.getCanvasContext)(l),f=(0,c.getFrameToColorBucket)(s),g=(0,c.createGetColorBucketForFrame)(f),d=(0,c.createGetCSSColorForFrame)(f),u=m({profile:s,getColorBucketForFrame:g}),p=h({canvasContext:C,flamechart:u});return Object.assign({renderInverted:!1,flamechart:u,flamechartRenderer:p,canvasContext:C,getCSSColorForFrame:d},n(r,e.FlamechartID.CHRONO,i),F)}),C=exports.getLeftHeavyFlamechart=(0,o.memoizeByShallowEquality)(({profile:e,getColorBucketForFrame:r})=>new t.Flamechart({getTotalWeight:e.getTotalNonIdleWeight.bind(e),forEachCall:e.forEachCallGrouped.bind(e),formatValue:e.formatValue.bind(e),getColorBucketForFrame:r})),f=s(),g=exports.LeftHeavyFlamechartView=(0,a.createContainer)(l.FlamechartView,(t,r,a)=>{const{activeProfileState:o,glCanvas:l}=a,{index:i,profile:m,leftHeavyViewState:s}=o,h=(0,c.getCanvasContext)(l),F=(0,c.getFrameToColorBucket)(m),g=(0,c.createGetColorBucketForFrame)(F),d=(0,c.createGetCSSColorForFrame)(F),u=C({profile:m,getColorBucketForFrame:g}),p=f({canvasContext:h,flamechart:u});return Object.assign({renderInverted:!1,flamechart:u,flamechartRenderer:p,canvasContext:h,getCSSColorForFrame:d},n(r,e.FlamechartID.LEFT_HEAVY,i),s)}); +},{"../store/flamechart-view-state":95,"../lib/flamechart":114,"../gl/flamechart-renderer":115,"../lib/typed-redux":36,"../lib/utils":60,"./flamechart-view":108,"../store/getters":38,"../store/actions":40}],134:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.style=exports.FlamechartWrapper=void 0;var e=require("aphrodite"),t=require("preact"),r=require("./style"),o=require("../lib/math"),i=require("./flamechart-pan-zoom-view"),s=require("../lib/utils"),a=require("./hovertip"),n=require("../lib/typed-redux");class p extends n.StatelessComponent{constructor(){super(...arguments),this.setConfigSpaceViewportRect=(e=>{this.props.setConfigSpaceViewportRect(this.clampViewportToFlamegraph(e))}),this.setLogicalSpaceViewportSize=(e=>{this.props.setLogicalSpaceViewportSize(e)}),this.transformViewport=(e=>{this.setConfigSpaceViewportRect(e.transformRect(this.props.configSpaceViewportRect))}),this.container=null,this.containerRef=(e=>{this.container=e||null}),this.setNodeHover=(e=>{this.props.setNodeHover(e)})}clampViewportToFlamegraph(e){const{flamechart:t,renderInverted:r}=this.props,i=new o.Vec2(t.getTotalWeight(),t.getLayers().length),s=this.props.flamechart.getClampedViewportWidth(e.size.x),a=e.size.withX(s),n=o.Vec2.clamp(e.origin,new o.Vec2(0,r?0:-1),o.Vec2.max(o.Vec2.zero,i.minus(a).plus(new o.Vec2(0,1))));return new o.Rect(n,e.size.withX(s))}formatValue(e){const t=100*e/this.props.flamechart.getTotalWeight(),r=(0,s.formatPercent)(t);return`${this.props.flamechart.formatValue(e)} (${r})`}renderTooltip(){if(!this.container)return null;const{hover:r}=this.props;if(!r)return null;const{width:i,height:s,left:n,top:p}=this.container.getBoundingClientRect(),l=new o.Vec2(r.event.clientX-n,r.event.clientY-p);return(0,t.h)(a.Hovertip,{containerSize:new o.Vec2(i,s),offset:l},(0,t.h)("span",{className:(0,e.css)(c.hoverCount)},this.formatValue(r.node.getTotalWeight()))," ",r.node.frame.name)}render(){return(0,t.h)("div",{className:(0,e.css)(r.commonStyle.fillY,r.commonStyle.fillX,r.commonStyle.vbox),ref:this.containerRef},(0,t.h)(i.FlamechartPanZoomView,{selectedNode:null,onNodeHover:this.setNodeHover,onNodeSelect:s.noop,configSpaceViewportRect:this.props.configSpaceViewportRect,setConfigSpaceViewportRect:this.setConfigSpaceViewportRect,transformViewport:this.transformViewport,flamechart:this.props.flamechart,flamechartRenderer:this.props.flamechartRenderer,canvasContext:this.props.canvasContext,renderInverted:this.props.renderInverted,logicalSpaceViewportSize:this.props.logicalSpaceViewportSize,setLogicalSpaceViewportBounds:this.setLogicalSpaceViewportSize}),this.renderTooltip())}}exports.FlamechartWrapper=p;const c=exports.style=e.StyleSheet.create({hoverCount:{color:r.Colors.GREEN}}); +},{"aphrodite":76,"preact":24,"./style":78,"../lib/math":97,"./flamechart-pan-zoom-view":142,"../lib/utils":60,"./hovertip":143,"../lib/typed-redux":36}],112:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.InvertedCallerFlamegraphView=void 0;var e=require("../lib/utils"),r=require("../lib/flamechart"),t=require("./flamechart-view-container"),a=require("../lib/typed-redux"),l=require("../store/getters"),o=require("../store/flamechart-view-state"),i=require("./flamechart-wrapper");const n=(0,e.memoizeByShallowEquality)(({profile:e,frame:r,flattenRecursion:t})=>{let a=e.getInvertedProfileForCallersOf(r);return t?a.getProfileWithRecursionFlattened():a}),c=(0,e.memoizeByShallowEquality)(({invertedCallerProfile:e,getColorBucketForFrame:t})=>new r.Flamechart({getTotalWeight:e.getTotalNonIdleWeight.bind(e),forEachCall:e.forEachCallGrouped.bind(e),formatValue:e.formatValue.bind(e),getColorBucketForFrame:t})),s=(0,t.createMemoizedFlamechartRenderer)({inverted:!0}),m=exports.InvertedCallerFlamegraphView=(0,a.createContainer)(i.FlamechartWrapper,(e,r,a)=>{const{activeProfileState:i}=a;let{profile:m,sandwichViewState:f,index:d}=i,{flattenRecursion:u,glCanvas:C}=e;if(!m)throw new Error("profile missing");if(!C)throw new Error("glCanvas missing");const{callerCallee:h}=f;if(!h)throw new Error("callerCallee missing");const{selectedFrame:F}=h;m=u?(0,l.getProfileWithRecursionFlattened)(m):m;const g=(0,l.getFrameToColorBucket)(m),v=(0,l.createGetColorBucketForFrame)(g),p=(0,l.createGetCSSColorForFrame)(g),w=(0,l.getCanvasContext)(C),S=c({invertedCallerProfile:n({profile:m,frame:F,flattenRecursion:u}),getColorBucketForFrame:v}),E=s({canvasContext:w,flamechart:S});return Object.assign({renderInverted:!0,flamechart:S,flamechartRenderer:E,canvasContext:w,getCSSColorForFrame:p},(0,t.createFlamechartSetters)(r,o.FlamechartID.SANDWICH_INVERTED_CALLERS,d),{setSelectedNode:()=>{}},h.invertedCallerFlamegraph)}); +},{"../lib/utils":60,"../lib/flamechart":114,"./flamechart-view-container":70,"../lib/typed-redux":36,"../store/getters":38,"../store/flamechart-view-state":95,"./flamechart-wrapper":134}],113:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CalleeFlamegraphView=void 0;var e=require("../lib/utils"),r=require("../lib/flamechart"),t=require("./flamechart-view-container"),a=require("../lib/typed-redux"),l=require("../store/getters"),o=require("../store/flamechart-view-state"),i=require("./flamechart-wrapper");const c=(0,e.memoizeByShallowEquality)(({profile:e,frame:r,flattenRecursion:t})=>{let a=e.getProfileForCalleesOf(r);return t?a.getProfileWithRecursionFlattened():a}),n=(0,e.memoizeByShallowEquality)(({calleeProfile:e,getColorBucketForFrame:t})=>new r.Flamechart({getTotalWeight:e.getTotalNonIdleWeight.bind(e),forEachCall:e.forEachCallGrouped.bind(e),formatValue:e.formatValue.bind(e),getColorBucketForFrame:t})),s=(0,t.createMemoizedFlamechartRenderer)(),m=exports.CalleeFlamegraphView=(0,a.createContainer)(i.FlamechartWrapper,(e,r,a)=>{const{activeProfileState:i}=a,{index:m,profile:f,sandwichViewState:u}=i,{flattenRecursion:h,glCanvas:C}=e;if(!f)throw new Error("profile missing");if(!C)throw new Error("glCanvas missing");const{callerCallee:F}=u;if(!F)throw new Error("callerCallee missing");const{selectedFrame:g}=F,d=(0,l.getFrameToColorBucket)(f),p=(0,l.createGetColorBucketForFrame)(d),w=(0,l.createGetCSSColorForFrame)(d),v=(0,l.getCanvasContext)(C),S=n({calleeProfile:c({profile:f,frame:g,flattenRecursion:h}),getColorBucketForFrame:p}),q=s({canvasContext:v,flamechart:S});return Object.assign({renderInverted:!1,flamechart:S,flamechartRenderer:q,canvasContext:v,getCSSColorForFrame:w},(0,t.createFlamechartSetters)(r,o.FlamechartID.SANDWICH_CALLEES,m),{setSelectedNode:()=>{}},F.calleeFlamegraph)}); +},{"../lib/utils":60,"../lib/flamechart":114,"./flamechart-view-container":70,"../lib/typed-redux":36,"../store/getters":38,"../store/flamechart-view-state":95,"./flamechart-wrapper":134}],68:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.SandwichViewContainer=void 0;var e=require("aphrodite"),t=require("./profile-table-view"),a=require("preact"),l=require("./style"),r=require("../store/actions"),s=require("../lib/typed-redux"),i=require("./inverted-caller-flamegraph-view"),o=require("./callee-flamegraph-view");class n extends s.StatelessComponent{constructor(){super(...arguments),this.setSelectedFrame=(e=>{this.props.setSelectedFrame(e)}),this.onWindowKeyPress=(e=>{"Escape"===e.key&&this.setSelectedFrame(null)})}componentDidMount(){window.addEventListener("keydown",this.onWindowKeyPress)}componentWillUnmount(){window.removeEventListener("keydown",this.onWindowKeyPress)}render(){const{selectedFrame:r}=this.props;let s=null;return r&&(s=(0,a.h)("div",{className:(0,e.css)(l.commonStyle.fillY,c.callersAndCallees,l.commonStyle.vbox)},(0,a.h)("div",{className:(0,e.css)(l.commonStyle.hbox,c.panZoomViewWraper)},(0,a.h)("div",{className:(0,e.css)(c.flamechartLabelParent)},(0,a.h)("div",{className:(0,e.css)(c.flamechartLabel)},"Callers")),(0,a.h)(i.InvertedCallerFlamegraphView,{glCanvas:this.props.glCanvas,activeProfileState:this.props.activeProfileState})),(0,a.h)("div",{className:(0,e.css)(c.divider)}),(0,a.h)("div",{className:(0,e.css)(l.commonStyle.hbox,c.panZoomViewWraper)},(0,a.h)("div",{className:(0,e.css)(c.flamechartLabelParent,c.flamechartLabelParentBottom)},(0,a.h)("div",{className:(0,e.css)(c.flamechartLabel,c.flamechartLabelBottom)},"Callees")),(0,a.h)(o.CalleeFlamegraphView,{glCanvas:this.props.glCanvas,activeProfileState:this.props.activeProfileState})))),(0,a.h)("div",{className:(0,e.css)(l.commonStyle.hbox,l.commonStyle.fillY)},(0,a.h)("div",{className:(0,e.css)(c.tableView)},(0,a.h)(t.ProfileTableViewContainer,{activeProfileState:this.props.activeProfileState})),s)}}const c=e.StyleSheet.create({tableView:{flex:1},panZoomViewWraper:{flex:1},flamechartLabelParent:{display:"flex",flexDirection:"column",justifyContent:"flex-end",alignItems:"flex-start",fontSize:l.FontSize.TITLE,width:1.2*l.FontSize.TITLE,borderRight:`1px solid ${l.Colors.LIGHT_GRAY}`},flamechartLabelParentBottom:{justifyContent:"flex-start"},flamechartLabel:{transform:"rotate(-90deg)",transformOrigin:"50% 50% 0",width:1.2*l.FontSize.TITLE,flexShrink:1},flamechartLabelBottom:{transform:"rotate(-90deg)",display:"flex",justifyContent:"flex-end"},callersAndCallees:{flex:1,borderLeft:`${l.Sizes.SEPARATOR_HEIGHT}px solid ${l.Colors.LIGHT_GRAY}`},divider:{height:2,background:l.Colors.LIGHT_GRAY}}),d=exports.SandwichViewContainer=(0,s.createContainer)(n,(e,t,a)=>{const{activeProfileState:l,glCanvas:s}=a,{sandwichViewState:i,index:o}=l,{callerCallee:n}=i;return{activeProfileState:l,glCanvas:s,setSelectedFrame:e=>{t(r.actions.sandwichView.setSelectedFrame({profileIndex:o,args:e}))},selectedFrame:n?n.selectedFrame:null,profileIndex:o}}); +},{"aphrodite":76,"./profile-table-view":53,"preact":24,"./style":78,"../store/actions":40,"../lib/typed-redux":36,"./inverted-caller-flamegraph-view":112,"./callee-flamegraph-view":113}],110:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ByteFormatter=exports.TimeFormatter=exports.RawValueFormatter=void 0;var t=require("./utils");class e{constructor(){this.unit="none"}format(t){return t.toLocaleString()}}exports.RawValueFormatter=e;class r{constructor(t){this.unit=t,this.multiplier="nanoseconds"===t?1e-9:"microseconds"===t?1e-6:"milliseconds"===t?.001:1}formatUnsigned(e){const r=e*this.multiplier;if(r/60>=1){const e=Math.floor(r/60),o=Math.floor(r-60*e).toString();return`${e}:${(0,t.zeroPad)(o,2)}`}return r/1>=1?`${r.toFixed(2)}s`:r/.001>=1?`${(r/.001).toFixed(2)}ms`:r/1e-6>=1?`${(r/1e-6).toFixed(2)}ยตs`:`${(r/1e-9).toFixed(2)}ns`}format(t){return`${t<0?"-":""}${this.formatUnsigned(Math.abs(t))}`}}exports.TimeFormatter=r;class o{constructor(){this.unit="bytes"}format(t){return t<1024?`${t.toFixed(0)} B`:(t/=1024)<1024?`${t.toFixed(2)} KB`:(t/=1024)<1024?`${t.toFixed(2)} MB`:`${(t/=1024).toFixed(2)} GB`}}exports.ByteFormatter=o; +},{"./utils":60}],131:[function(require,module,exports) { +var t=null;function r(){return t||(t=e()),t}function e(){try{throw new Error}catch(r){var t=(""+r.stack).match(/(https?|file|ftp):\/\/[^)\n]+/g);if(t)return n(t[0])}return"/"}function n(t){return(""+t).replace(/^((?:https?|file|ftp):\/\/.+)\/[^\/]+$/,"$1")+"/"}exports.getBundleURL=r,exports.getBaseURL=n; +},{}],74:[function(require,module,exports) { +var r=require("./bundle-url").getBundleURL;function e(r){Array.isArray(r)||(r=[r]);var e=r[r.length-1];try{return Promise.resolve(require(e))}catch(n){if("MODULE_NOT_FOUND"===n.code)return new u(function(n,i){t(r.slice(0,-1)).then(function(){return require(e)}).then(n,i)});throw n}}function t(r){return Promise.all(r.map(s))}var n={};function i(r,e){n[r]=e}module.exports=exports=e,exports.load=t,exports.register=i;var o={};function s(e){var t;if(Array.isArray(e)&&(t=e[1],e=e[0]),o[e])return o[e];var i=(e.substring(e.lastIndexOf(".")+1,e.length)||e).toLowerCase(),s=n[i];return s?o[e]=s(r()+e).then(function(r){return r&&module.bundle.register(t,r),r}):void 0}function u(r){this.executor=r,this.promise=null}u.prototype.then=function(r,e){return null===this.promise&&(this.promise=new Promise(this.executor)),this.promise.then(r,e)},u.prototype.catch=function(r){return null===this.promise&&(this.promise=new Promise(this.executor)),this.promise.catch(r)}; +},{"./bundle-url":131}],109:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CallTreeProfileBuilder=exports.StackListProfileBuilder=exports.Profile=exports.CallTreeNode=exports.Frame=exports.HasWeights=void 0;var e=require("./utils"),t=require("./value-formatters"),s=function(e,t,s,r){return new(s||(s=Promise))(function(a,i){function l(e){try{h(r.next(e))}catch(e){i(e)}}function o(e){try{h(r.throw(e))}catch(e){i(e)}}function h(e){e.done?a(e.value):new s(function(t){t(e.value)}).then(l,o)}h((r=r.apply(e,t||[])).next())})};const r=require("_bundle_loader")(require.resolve("./demangle-cpp"));r.then(()=>{});class a{constructor(){this.selfWeight=0,this.totalWeight=0}getSelfWeight(){return this.selfWeight}getTotalWeight(){return this.totalWeight}addToTotalWeight(e){this.totalWeight+=e}addToSelfWeight(e){this.selfWeight+=e}overwriteWeightWith(e){this.selfWeight=e.selfWeight,this.totalWeight=e.totalWeight}}exports.HasWeights=a;class i extends a{constructor(e){super(),this.key=e.key,this.name=e.name,this.file=e.file,this.line=e.line,this.col=e.col}static getOrInsert(e,t){return e.getOrInsert(new i(t))}}exports.Frame=i,i.root=new i({key:"(speedscope root)",name:"(speedscope root)"});class l extends a{constructor(e,t){super(),this.frame=e,this.parent=t,this.children=[],this.frozen=!1}isRoot(){return this.frame===i.root}isFrozen(){return this.frozen}freeze(){this.frozen=!0}}exports.CallTreeNode=l;class o{constructor(s=0){this.name="",this.frames=new e.KeyedSet,this.appendOrderCalltreeRoot=new l(i.root,null),this.groupedCalltreeRoot=new l(i.root,null),this.samples=[],this.weights=[],this.valueFormatter=new t.RawValueFormatter,this.totalNonIdleWeight=null,this.totalWeight=s}getAppendOrderCalltreeRoot(){return this.appendOrderCalltreeRoot}getGroupedCalltreeRoot(){return this.groupedCalltreeRoot}formatValue(e){return this.valueFormatter.format(e)}setValueFormatter(e){this.valueFormatter=e}getWeightUnit(){return this.valueFormatter.unit}getName(){return this.name}setName(e){this.name=e}getTotalWeight(){return this.totalWeight}getTotalNonIdleWeight(){return null===this.totalNonIdleWeight&&(this.totalNonIdleWeight=this.groupedCalltreeRoot.children.reduce((e,t)=>e+t.getTotalWeight(),0)),this.totalNonIdleWeight}forEachCallGrouped(e,t){!function s(r,a){r.frame!==i.root&&e(r,a);let l=0;const o=[...r.children];o.sort((e,t)=>e.getTotalWeight()>t.getTotalWeight()?-1:1),o.forEach(function(e){s(e,a+l),l+=e.getTotalWeight()}),r.frame!==i.root&&t(r,a+r.getTotalWeight())}(this.groupedCalltreeRoot,0)}forEachCall(t,s){let r=[],a=0,l=0;for(let o of this.samples){let h=null;for(h=o;h&&h.frame!=i.root&&-1===r.indexOf(h);h=h.parent);for(;r.length>0&&(0,e.lastOf)(r)!=h;){s(r.pop(),a)}const n=[];for(let e=o;e&&e.frame!=i.root&&e!=h;e=e.parent)n.push(e);n.reverse();for(let e of n)t(e,a);r=r.concat(n),a+=this.weights[l++]}for(let e=r.length-1;e>=0;e--)s(r[e],a)}forEachFrame(e){this.frames.forEach(e)}forEachSample(e){for(let t=0;t{r.frames.getOrInsert(e).overwriteWeightWith(e)}),r}getInvertedProfileForCallersOf(e){const t=i.getOrInsert(this.frames,e),s=new h,r=[];!function e(s){if(s.frame===t)r.push(s);else for(let t of s.children)e(t)}(this.appendOrderCalltreeRoot);for(let e of r){const t=[];for(let s=e;null!=s&&s.frame!==i.root;s=s.parent)t.push(s.frame);s.appendSampleWithWeight(t,e.getTotalWeight())}const a=s.build();return a.name=this.name,a.valueFormatter=this.valueFormatter,a}getProfileForCalleesOf(e){const t=i.getOrInsert(this.frames,e),s=new h;!function e(r){if(r.frame===t)!function(e){const t=[];!function e(r){t.push(r.frame),s.appendSampleWithWeight(t,r.getSelfWeight());for(let t of r.children)e(t);t.pop()}(e)}(r);else for(let t of r.children)e(t)}(this.appendOrderCalltreeRoot);const r=s.build();return r.name=this.name,r.valueFormatter=this.valueFormatter,r}demangle(){return s(this,void 0,void 0,function*(){let e=null;for(let t of this.frames)t.name.startsWith("__Z")&&(e||(e=(yield r).demangleCpp),t.name=e(t.name))})}remapNames(e){for(let t of this.frames)t.name=e(t.name)}}exports.Profile=o;class h extends o{constructor(){super(...arguments),this.pendingSample=null}_appendSample(t,s,r){if(isNaN(s))throw new Error("invalid weight");let a=r?this.appendOrderCalltreeRoot:this.groupedCalltreeRoot,o=new Set;for(let h of t){const t=i.getOrInsert(this.frames,h),n=r?(0,e.lastOf)(a.children):a.children.find(e=>e.frame===t);if(n&&!n.isFrozen()&&n.frame==t)a=n;else{const e=a;a=new l(t,a),e.children.push(a)}a.addToTotalWeight(s),o.add(a.frame)}if(a.addToSelfWeight(s),r)for(let e of a.children)e.freeze();if(r){a.frame.addToSelfWeight(s);for(let e of o)e.addToTotalWeight(s);a===(0,e.lastOf)(this.samples)?this.weights[this.weights.length-1]+=s:(this.samples.push(a),this.weights.push(s))}}appendSampleWithWeight(e,t){if(0!==t){if(t<0)throw new Error("Samples must have positive weights");this._appendSample(e,t,!0),this._appendSample(e,t,!1)}}appendSampleWithTimestamp(e,t){if(this.pendingSample){if(t0?this.appendSampleWithWeight(this.pendingSample.stack,this.pendingSample.centralTimestamp-this.pendingSample.startTimestamp):(this.appendSampleWithWeight(this.pendingSample.stack,1),this.setValueFormatter(new t.RawValueFormatter))),this.totalWeight=Math.max(this.totalWeight,this.weights.reduce((e,t)=>e+t,0)),this}}exports.StackListProfileBuilder=h;class n extends o{constructor(){super(...arguments),this.appendOrderStack=[this.appendOrderCalltreeRoot],this.groupedOrderStack=[this.groupedCalltreeRoot],this.framesInStack=new Map,this.stack=[],this.lastValue=0}addWeightsToFrames(t){const s=t-this.lastValue;for(let e of this.framesInStack.keys())e.addToTotalWeight(s);const r=(0,e.lastOf)(this.stack);r&&r.addToSelfWeight(s)}addWeightsToNodes(t,s){const r=t-this.lastValue;for(let e of s)e.addToTotalWeight(r);const a=(0,e.lastOf)(s);a&&a.addToSelfWeight(r)}_enterFrame(t,s,r){let a=r?this.appendOrderStack:this.groupedOrderStack;this.addWeightsToNodes(s,a);let i=(0,e.lastOf)(a);if(i){if(r){const e=s-this.lastValue;if(e>0)this.samples.push(i),this.weights.push(s-this.lastValue);else if(e<0)throw new Error(`Samples must be provided in increasing order of cumulative value. Last sample was ${this.lastValue}, this sample was ${s}`)}const o=r?(0,e.lastOf)(i.children):i.children.find(e=>e.frame===t);let h;o&&!o.isFrozen()&&o.frame==t?h=o:(h=new l(t,i),i.children.push(h)),a.push(h)}}enterFrame(e,t){const s=i.getOrInsert(this.frames,e);this.addWeightsToFrames(t),this._enterFrame(s,t,!0),this._enterFrame(s,t,!1),this.stack.push(s);const r=this.framesInStack.get(s)||0;this.framesInStack.set(s,r+1),this.lastValue=t}_leaveFrame(e,t,s){let r=s?this.appendOrderStack:this.groupedOrderStack;if(this.addWeightsToNodes(t,r),s){const s=this.appendOrderStack.pop();if(null==s)throw new Error(`Trying to leave ${e.key} when stack is empty`);if(null==this.lastValue)throw new Error(`Trying to leave a ${e.key} before any have been entered`);s.freeze();const r=t-this.lastValue;if(r>0)this.samples.push(s),this.weights.push(t-this.lastValue);else if(r<0)throw new Error(`Samples must be provided in increasing order of cumulative value. Last sample was ${this.lastValue}, this sample was ${t}`)}else this.groupedOrderStack.pop()}leaveFrame(e,t){const s=i.getOrInsert(this.frames,e);this.addWeightsToFrames(t),this._leaveFrame(s,t,!0),this._leaveFrame(s,t,!1),this.stack.pop();const r=this.framesInStack.get(s);null!=r&&(1===r?this.framesInStack.delete(s):this.framesInStack.set(s,r-1),this.lastValue=t,this.totalWeight=Math.max(this.totalWeight,this.lastValue))}build(){if(this.appendOrderStack.length>1||this.groupedOrderStack.length>1)throw new Error("Tried to complete profile construction with a non-empty stack");return this}}exports.CallTreeProfileBuilder=n; +},{"./utils":60,"./value-formatters":110,"_bundle_loader":74,"./demangle-cpp":[["demangle-cpp.6caf93ee.js",135],"demangle-cpp.6caf93ee.map",135]}],111:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=exports.FileFormat=void 0;!function(e){let t,o;!function(e){e.EVENTED="evented",e.SAMPLED="sampled"}(t=e.ProfileType||(e.ProfileType={})),function(e){e.OPEN_FRAME="O",e.CLOSE_FRAME="C"}(o=e.EventType||(e.EventType={}))}(e||(exports.FileFormat=e={})); +},{}],19:[function(require,module,exports) { +module.exports={name:"speedscope",version:"1.5.2",description:"",repository:"jlfwong/speedscope",main:"index.js",bin:{speedscope:"./bin/cli.js"},scripts:{deploy:"./scripts/deploy.sh",prepack:"./scripts/build-release.sh",prettier:"prettier --write 'src/**/*.ts' 'src/**/*.tsx'",lint:"eslint 'src/**/*.ts' 'src/**/*.tsx'",jest:"./scripts/test-setup.sh && jest --runInBand",coverage:"npm run jest -- --coverage && coveralls < coverage/lcov.info",test:"tsc --noEmit && npm run lint && npm run coverage",serve:"parcel assets/index.html --open --no-autoinstall"},files:["bin/cli.js","dist/release/**","!*.map"],browserslist:["last 2 Chrome versions","last 2 Firefox versions"],author:"",license:"MIT",devDependencies:{"@types/jest":"22.2.3","@types/jszip":"3.1.4","@types/node":"10.1.4","@types/pako":"1.0.0",aphrodite:"2.1.0",coveralls:"3.0.1",eslint:"4.19.1","eslint-plugin-prettier":"2.6.0",jest:"23.0.1",jsverify:"0.8.3",jszip:"3.1.5",pako:"1.0.6","parcel-bundler":"1.9.2",preact:"8.2.7","preact-redux":"jlfwong/preact-redux#a56dcc4",prettier:"1.12.0",protobufjs:"6.8.8",quicktype:"15.0.45",redux:"^4.0.0","ts-jest":"22.4.6",typescript:"2.8.1","typescript-eslint-parser":"17.0.1","uglify-es":"3.2.2"},jest:{transform:{"^.+\\.tsx?$":"ts-jest"},testRegex:"\\.test\\.tsx?$",collectCoverageFrom:["**/*.{ts,tsx}","!**/*.d.{ts,tsx}"],moduleFileExtensions:["ts","tsx","js","jsx","json"]},dependencies:{opn:"5.3.0"}}; +},{}],82:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.exportProfileGroup=r,exports.importSpeedscopeProfiles=s,exports.saveToFile=l;var e=require("./profile"),t=require("./value-formatters"),n=require("./file-format-spec");function r(e){const t=[],n=new Map;function r(e){let r=n.get(e);if(null==r){const o={name:e.name};null!=e.file&&(o.file=e.file),null!=e.line&&(o.line=e.line),null!=e.col&&(o.col=e.col),r=t.length,n.set(e,r),t.push(o)}return r}const a={exporter:`speedscope@${require("../../package.json").version}`,name:e.name,activeProfileIndex:e.indexToView,$schema:"https://www.speedscope.app/file-format-schema.json",shared:{frames:t},profiles:[]};for(let t of e.profiles)a.profiles.push(o(t,r));return a}function o(e,t){const r={type:n.FileFormat.ProfileType.EVENTED,name:e.getName(),unit:e.getWeightUnit(),startValue:0,endValue:e.getTotalWeight(),events:[]};return e.forEachCall((e,o)=>{r.events.push({type:n.FileFormat.EventType.OPEN_FRAME,frame:t(e.frame),at:o})},(e,o)=>{r.events.push({type:n.FileFormat.EventType.CLOSE_FRAME,frame:t(e.frame),at:o})}),r}function a(r,o){function a(e){const{name:n,unit:o}=r;switch(o){case"nanoseconds":case"microseconds":case"milliseconds":case"seconds":e.setValueFormatter(new t.TimeFormatter(o));break;case"bytes":e.setValueFormatter(new t.ByteFormatter);break;case"none":e.setValueFormatter(new t.RawValueFormatter)}e.setName(n)}switch(r.type){case n.FileFormat.ProfileType.EVENTED:return function(t){const{startValue:r,endValue:s,events:l}=t,i=new e.CallTreeProfileBuilder(s-r);a(i);const c=o.map((e,t)=>Object.assign({key:t},e));for(let e of l)switch(e.type){case n.FileFormat.EventType.OPEN_FRAME:i.enterFrame(c[e.frame],e.at-r);break;case n.FileFormat.EventType.CLOSE_FRAME:i.leaveFrame(c[e.frame],e.at-r)}return i.build()}(r);case n.FileFormat.ProfileType.SAMPLED:return function(t){const{startValue:n,endValue:r,samples:s,weights:l}=t,i=new e.StackListProfileBuilder(r-n);a(i);const c=o.map((e,t)=>Object.assign({key:t},e));if(s.length!==l.length)throw new Error(`Expected samples.length (${s.length}) to equal weights.length (${l.length})`);for(let e=0;ec[e]),n)}return i.build()}(r)}}function s(e){return{name:e.name||e.profiles[0].name||"profile",indexToView:e.activeProfileIndex||0,profiles:e.profiles.map(t=>a(t,e.shared.frames))}}function l(e){const t=r(e),n=new Blob([JSON.stringify(t)],{type:"text/json"}),o=`${(t.name?t.name.split(".")[0]:"profile").replace(/\W+/g,"_")}.speedscope.json`;console.log("Saving",o);const a=document.createElement("a");a.download=o,a.href=window.URL.createObjectURL(n),a.dataset.downloadurl=["text/json",a.download,a.href].join(":"),document.body.appendChild(a),a.click(),document.body.removeChild(a)} +},{"./profile":109,"./value-formatters":110,"./file-format-spec":111,"../../package.json":19}],72:[function(require,module,exports) { +module.exports="perf-vertx-stacks-01-collapsed-all.1841aedb.txt"; +},{}],34:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Application=exports.GLCanvas=exports.Toolbar=void 0;var e=require("preact"),t=require("aphrodite"),o=require("./style"),i=require("../lib/emscripten"),s=require("./sandwich-view"),r=require("../lib/file-format"),n=require("../store"),a=require("../lib/typed-redux"),l=require("./flamechart-view-container"),c=require("../gl/graphics"),d=function(e,t,o,i){return new(o||(o=Promise))(function(s,r){function n(e){try{l(i.next(e))}catch(e){r(e)}}function a(e){try{l(i.throw(e))}catch(e){r(e)}}function l(e){e.done?s(e.value):new o(function(t){t(e.value)}).then(n,a)}l((i=i.apply(e,t||[])).next())})};const p=require("_bundle_loader")(require.resolve("../import"));function h(e,t){return d(this,void 0,void 0,function*(){return(yield p).importProfileGroupFromText(e,t)})}function f(e,t){return d(this,void 0,void 0,function*(){return(yield p).importProfileGroupFromBase64(e,t)})}function m(e,t){return d(this,void 0,void 0,function*(){return(yield p).importProfilesFromArrayBuffer(e,t)})}function u(e){return d(this,void 0,void 0,function*(){return(yield p).importProfilesFromFile(e)})}function v(e){return d(this,void 0,void 0,function*(){return(yield p).importFromFileSystemDirectoryEntry(e)})}p.then(()=>{});const g=require("../../sample/profiles/stackcollapse/perf-vertx-stacks-01-collapsed-all.txt");class w extends a.StatelessComponent{constructor(){super(...arguments),this.setTimeOrder=(()=>{this.props.setViewMode(n.ViewMode.CHRONO_FLAME_CHART)}),this.setLeftHeavyOrder=(()=>{this.props.setViewMode(n.ViewMode.LEFT_HEAVY_FLAME_GRAPH)}),this.setSandwichView=(()=>{this.props.setViewMode(n.ViewMode.SANDWICH_VIEW)})}renderLeftContent(){return this.props.activeProfileState?(0,e.h)("div",{className:(0,t.css)(y.toolbarLeft)},(0,e.h)("div",{className:(0,t.css)(y.toolbarTab,this.props.viewMode===n.ViewMode.CHRONO_FLAME_CHART&&y.toolbarTabActive),onClick:this.setTimeOrder},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"๐Ÿ•ฐ"),"Time Order"),(0,e.h)("div",{className:(0,t.css)(y.toolbarTab,this.props.viewMode===n.ViewMode.LEFT_HEAVY_FLAME_GRAPH&&y.toolbarTabActive),onClick:this.setLeftHeavyOrder},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"โฌ…๏ธ"),"Left Heavy"),(0,e.h)("div",{className:(0,t.css)(y.toolbarTab,this.props.viewMode===n.ViewMode.SANDWICH_VIEW&&y.toolbarTabActive),onClick:this.setSandwichView},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"๐Ÿฅช"),"Sandwich")):null}renderCenterContent(){const{activeProfileState:o,profileGroup:i}=this.props;if(o&&i){const{index:r}=o;if(1===i.profiles.length)return o.profile.getName();{function s(o,i,s){return(0,e.h)("button",{disabled:i,onClick:s,className:(0,t.css)(y.emoji,y.toolbarProfileNavButton,i&&y.toolbarProfileNavButtonDisabled)},o)}const n=s("โฌ…๏ธ",0===r,()=>this.props.setProfileIndexToView(r-1)),a=s("โžก๏ธ",r>=i.profiles.length-1,()=>this.props.setProfileIndexToView(r+1));return(0,e.h)("div",{className:(0,t.css)(y.toolbarCenter)},n,o.profile.getName()," ",(0,e.h)("span",{className:(0,t.css)(y.toolbarProfileIndex)},"(",o.index+1,"/",i.profiles.length,")"),a)}}return"๐Ÿ”ฌspeedscope"}renderRightContent(){const o=(0,e.h)("div",{className:(0,t.css)(y.toolbarTab),onClick:this.props.browseForFile},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"โคต๏ธ"),"Import"),i=(0,e.h)("div",{className:(0,t.css)(y.toolbarTab)},(0,e.h)("a",{href:"https://github.com/jlfwong/speedscope#usage",className:(0,t.css)(y.noLinkStyle),target:"_blank"},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"โ“"),"Help"));return(0,e.h)("div",{className:(0,t.css)(y.toolbarRight)},this.props.activeProfileState&&(0,e.h)("div",{className:(0,t.css)(y.toolbarTab),onClick:this.props.saveFile},(0,e.h)("span",{className:(0,t.css)(y.emoji)},"โคด๏ธ"),"Export"),o,i)}render(){return(0,e.h)("div",{className:(0,t.css)(y.toolbar)},this.renderLeftContent(),this.renderCenterContent(),this.renderRightContent())}}exports.Toolbar=w;class b extends e.Component{constructor(){super(...arguments),this.canvas=null,this.ref=(e=>{e instanceof HTMLCanvasElement?this.canvas=e:this.canvas=null,this.props.setGLCanvas(this.canvas)}),this.container=null,this.containerRef=(e=>{e instanceof HTMLElement?this.container=e:this.container=null}),this.maybeResize=(()=>{if(!this.container)return;if(!this.props.canvasContext)return;let{width:e,height:t}=this.container.getBoundingClientRect();const o=e,i=t,s=e*window.devicePixelRatio,r=t*window.devicePixelRatio;this.props.canvasContext.gl.resize(s,r,o,i),this.props.canvasContext.gl.clear(new c.Graphics.Color(1,1,1,1))}),this.onWindowResize=(()=>{this.props.canvasContext&&this.props.canvasContext.requestFrame()})}componentWillReceiveProps(e){this.props.canvasContext!==e.canvasContext&&(this.props.canvasContext&&this.props.canvasContext.removeBeforeFrameHandler(this.maybeResize),e.canvasContext&&(e.canvasContext.addBeforeFrameHandler(this.maybeResize),e.canvasContext.requestFrame()))}componentDidMount(){window.addEventListener("resize",this.onWindowResize)}componentWillUnmount(){this.props.canvasContext&&this.props.canvasContext.removeBeforeFrameHandler(this.maybeResize),window.removeEventListener("resize",this.onWindowResize)}render(){return(0,e.h)("div",{ref:this.containerRef,className:(0,t.css)(y.glCanvasView)},(0,e.h)("canvas",{ref:this.ref,width:1,height:1}))}}exports.GLCanvas=b;class C extends a.StatelessComponent{constructor(){super(...arguments),this.loadExample=(()=>{this.loadProfile(()=>d(this,void 0,void 0,function*(){return yield h("perf-vertx-stacks-01-collapsed-all.txt",yield fetch(g).then(e=>e.text()))}))}),this.onDrop=(e=>{this.props.setDragActive(!1),e.preventDefault();const t=e.dataTransfer.items[0];if("webkitGetAsEntry"in t){const e=t.webkitGetAsEntry();if(e.isDirectory&&e.name.endsWith(".trace"))return console.log("Importing as Instruments.app .trace file"),void this.loadProfile(()=>d(this,void 0,void 0,function*(){return yield v(e)}))}let o=e.dataTransfer.files.item(0);o&&this.loadFromFile(o)}),this.onDragOver=(e=>{this.props.setDragActive(!0),e.preventDefault()}),this.onDragLeave=(e=>{this.props.setDragActive(!1),e.preventDefault()}),this.onWindowKeyPress=(e=>d(this,void 0,void 0,function*(){if("1"===e.key)this.props.setViewMode(n.ViewMode.CHRONO_FLAME_CHART);else if("2"===e.key)this.props.setViewMode(n.ViewMode.LEFT_HEAVY_FLAME_GRAPH);else if("3"===e.key)this.props.setViewMode(n.ViewMode.SANDWICH_VIEW);else if("r"===e.key){const{flattenRecursion:e}=this.props;this.props.setFlattenRecursion(!e)}else if("n"===e.key){const{activeProfileState:e}=this.props;e&&this.props.setProfileIndexToView(e.index+1)}else if("p"===e.key){const{activeProfileState:e}=this.props;e&&this.props.setProfileIndexToView(e.index-1)}})),this.saveFile=(()=>{if(this.props.profileGroup){const{name:e,indexToView:t,profiles:o}=this.props.profileGroup,i={name:e,indexToView:t,profiles:o.map(e=>e.profile)};(0,r.saveToFile)(i)}}),this.browseForFile=(()=>{const e=document.createElement("input");e.type="file",e.addEventListener("change",this.onFileSelect),e.click()}),this.onWindowKeyDown=(e=>d(this,void 0,void 0,function*(){"s"===e.key&&(e.ctrlKey||e.metaKey)?(e.preventDefault(),this.saveFile()):"o"===e.key&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),this.browseForFile())})),this.onDocumentPaste=(e=>{e.preventDefault(),e.stopPropagation();const t=e.clipboardData.getData("text");this.loadProfile(()=>d(this,void 0,void 0,function*(){return yield h("From Clipboard",t)}))}),this.onFileSelect=(e=>{const t=e.target.files.item(0);t&&this.loadFromFile(t)})}loadProfile(e){return d(this,void 0,void 0,function*(){if(this.props.setLoading(!0),yield new Promise(e=>setTimeout(e,0)),!this.props.glCanvas)return;console.time("import");let t=null;try{t=yield e()}catch(e){return console.log("Failed to load format",e),void this.props.setError(!0)}if(null==t)return alert("Unrecognized format! See documentation about supported formats."),void this.props.setLoading(!1);if(0===t.profiles.length)return alert("Successfully imported profile, but it's empty!"),void this.props.setLoading(!1);this.props.hashParams.title&&(t=Object.assign({name:this.props.hashParams.title},t)),document.title=`${t.name} - speedscope`;for(let e of t.profiles)yield e.demangle();for(let e of t.profiles){const t=this.props.hashParams.title||e.getName();e.setName(t)}console.timeEnd("import"),this.props.setProfileGroup(t),this.props.setLoading(!1)})}loadFromFile(e){this.loadProfile(()=>d(this,void 0,void 0,function*(){const t=yield u(e);if(t){for(let o of t.profiles)o.getName()||o.setName(e.name);return t}if(this.props.profileGroup&&this.props.activeProfileState){const t=new FileReader,o=new Promise(e=>{t.addEventListener("loadend",()=>{if("string"!=typeof t.result)throw new Error("Expected reader.result to be a string");e(t.result)})});t.readAsText(e);const s=yield o,r=(0,i.importEmscriptenSymbolMap)(s);if(r){const{profile:e,index:t}=this.props.activeProfileState;return console.log("Importing as emscripten symbol map"),e.remapNames(e=>r.get(e)||e),{name:this.props.profileGroup.name||"profile",indexToView:t,profiles:[e]}}}return null}))}componentDidMount(){window.addEventListener("keydown",this.onWindowKeyDown),window.addEventListener("keypress",this.onWindowKeyPress),document.addEventListener("paste",this.onDocumentPaste),this.maybeLoadHashParamProfile()}componentWillUnmount(){window.removeEventListener("keydown",this.onWindowKeyDown),window.removeEventListener("keypress",this.onWindowKeyPress),document.removeEventListener("paste",this.onDocumentPaste)}maybeLoadHashParamProfile(){return d(this,void 0,void 0,function*(){if(this.props.hashParams.profileURL){if(!n.canUseXHR)return void alert(`Cannot load a profile URL when loading from "${window.location.protocol}" URL protocol`);this.loadProfile(()=>d(this,void 0,void 0,function*(){const e=yield fetch(this.props.hashParams.profileURL);let t=new URL(this.props.hashParams.profileURL).pathname;return t.includes("/")&&(t=t.slice(t.lastIndexOf("/")+1)),yield m(t,yield e.arrayBuffer())}))}else if(this.props.hashParams.localProfilePath){window.speedscope={loadFileFromBase64:(e,t)=>{this.loadProfile(()=>f(e,t))}};const e=document.createElement("script");e.src=`file:///${this.props.hashParams.localProfilePath}`,document.head.appendChild(e)}})}renderLanding(){return(0,e.h)("div",{className:(0,t.css)(y.landingContainer)},(0,e.h)("div",{className:(0,t.css)(y.landingMessage)},(0,e.h)("p",{className:(0,t.css)(y.landingP)},"๐Ÿ‘‹ Hi there! Welcome to ๐Ÿ”ฌspeedscope, an interactive"," ",(0,e.h)("a",{className:(0,t.css)(y.link),href:"http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html"},"flamegraph")," ","visualizer. Use it to help you make your software faster."),n.canUseXHR?(0,e.h)("p",{className:(0,t.css)(y.landingP)},"Drag and drop a profile file onto this window to get started, click the big blue button below to browse for a profile to explore, or"," ",(0,e.h)("a",{tabIndex:0,className:(0,t.css)(y.link),onClick:this.loadExample},"click here")," ","to load an example profile."):(0,e.h)("p",{className:(0,t.css)(y.landingP)},"Drag and drop a profile file onto this window to get started, or click the big blue button below to browse for a profile to explore."),(0,e.h)("div",{className:(0,t.css)(y.browseButtonContainer)},(0,e.h)("input",{type:"file",name:"file",id:"file",onChange:this.onFileSelect,className:(0,t.css)(y.hide)}),(0,e.h)("label",{for:"file",className:(0,t.css)(y.browseButton),tabIndex:0},"Browse")),(0,e.h)("p",{className:(0,t.css)(y.landingP)},"See the"," ",(0,e.h)("a",{className:(0,t.css)(y.link),href:"https://github.com/jlfwong/speedscope#usage",target:"_blank"},"documentation")," ","for information about supported file formats, keyboard shortcuts, and how to navigate around the profile."),(0,e.h)("p",{className:(0,t.css)(y.landingP)},"speedscope is open source. Please"," ",(0,e.h)("a",{className:(0,t.css)(y.link),target:"_blank",href:"https://github.com/jlfwong/speedscope/issues"},"report any issues on GitHub"),".")))}renderError(){return(0,e.h)("div",{className:(0,t.css)(y.error)},(0,e.h)("div",null,"๐Ÿ˜ฟ Something went wrong."),(0,e.h)("div",null,"Check the JS console for more details."))}renderLoadingBar(){return(0,e.h)("div",{className:(0,t.css)(y.loading)})}renderContent(){const{viewMode:t,activeProfileState:o,error:i,loading:r,glCanvas:a}=this.props;if(i)return this.renderError();if(r)return this.renderLoadingBar();if(!o||!a)return this.renderLanding();switch(t){case n.ViewMode.CHRONO_FLAME_CHART:return(0,e.h)(l.ChronoFlamechartView,{activeProfileState:o,glCanvas:a});case n.ViewMode.LEFT_HEAVY_FLAME_GRAPH:return(0,e.h)(l.LeftHeavyFlamechartView,{activeProfileState:o,glCanvas:a});case n.ViewMode.SANDWICH_VIEW:return(0,e.h)(s.SandwichViewContainer,{activeProfileState:o,glCanvas:a})}}render(){return(0,e.h)("div",{onDrop:this.onDrop,onDragOver:this.onDragOver,onDragLeave:this.onDragLeave,className:(0,t.css)(y.root,this.props.dragActive&&y.dragTargetRoot)},(0,e.h)(b,{setGLCanvas:this.props.setGLCanvas,canvasContext:this.props.canvasContext}),(0,e.h)(w,Object.assign({saveFile:this.saveFile,browseForFile:this.browseForFile},this.props)),(0,e.h)("div",{className:(0,t.css)(y.contentContainer)},this.renderContent()),this.props.dragActive&&(0,e.h)("div",{className:(0,t.css)(y.dragTarget)}))}}exports.Application=C;const y=t.StyleSheet.create({glCanvasView:{position:"absolute",width:"100vw",height:"100vh",zIndex:-1,pointerEvents:"none"},error:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%"},loading:{height:3,marginBottom:-3,background:o.Colors.DARK_BLUE,transformOrigin:"0% 50%",animationName:[{from:{transform:"scaleX(0)"},to:{transform:"scaleX(1)"}}],animationTimingFunction:"cubic-bezier(0, 1, 0, 1)",animationDuration:"30s"},root:{width:"100vw",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",position:"relative",fontFamily:o.FontFamily.MONOSPACE,lineHeight:"20px"},dragTargetRoot:{cursor:"copy"},dragTarget:{boxSizing:"border-box",position:"absolute",top:0,left:0,width:"100%",height:"100%",border:`5px dashed ${o.Colors.DARK_BLUE}`,pointerEvents:"none"},contentContainer:{position:"relative",display:"flex",overflow:"hidden",flexDirection:"column",flex:1},landingContainer:{display:"flex",alignItems:"center",justifyContent:"center",flex:1},landingMessage:{maxWidth:600},landingP:{marginBottom:16},hide:{display:"none"},browseButtonContainer:{display:"flex",alignItems:"center",justifyContent:"center"},browseButton:{marginBottom:16,height:72,flex:1,maxWidth:256,textAlign:"center",fontSize:o.FontSize.BIG_BUTTON,lineHeight:"72px",background:o.Colors.DARK_BLUE,color:o.Colors.WHITE,transition:`all ${o.Duration.HOVER_CHANGE} ease-in`,":hover":{background:o.Colors.BRIGHT_BLUE}},link:{color:o.Colors.BRIGHT_BLUE,cursor:"pointer",textDecoration:"none"},toolbar:{height:o.Sizes.TOOLBAR_HEIGHT,flexShrink:0,background:o.Colors.BLACK,color:o.Colors.WHITE,textAlign:"center",fontFamily:o.FontFamily.MONOSPACE,fontSize:o.FontSize.TITLE,lineHeight:`${o.Sizes.TOOLBAR_TAB_HEIGHT}px`,userSelect:"none"},toolbarLeft:{position:"absolute",height:o.Sizes.TOOLBAR_HEIGHT,overflow:"hidden",top:0,left:0,marginRight:2,textAlign:"left"},toolbarCenter:{paddingTop:1,height:o.Sizes.TOOLBAR_HEIGHT},toolbarRight:{height:o.Sizes.TOOLBAR_HEIGHT,overflow:"hidden",position:"absolute",top:0,right:0,marginRight:2,textAlign:"right"},toolbarProfileIndex:{color:o.Colors.LIGHT_GRAY},toolbarProfileNavButton:{opacity:.8,fontSize:o.FontSize.TITLE,lineHeight:`${o.Sizes.TOOLBAR_TAB_HEIGHT}px`,":hover":{opacity:1},background:"none",border:"none",padding:0,marginLeft:"0.3em",marginRight:"0.3em",transition:`all ${o.Duration.HOVER_CHANGE} ease-in`},toolbarProfileNavButtonDisabled:{opacity:.5,":hover":{opacity:.5}},toolbarTab:{background:o.Colors.DARK_GRAY,marginTop:o.Sizes.SEPARATOR_HEIGHT,height:o.Sizes.TOOLBAR_TAB_HEIGHT,lineHeight:`${o.Sizes.TOOLBAR_TAB_HEIGHT}px`,paddingLeft:2,paddingRight:8,display:"inline-block",marginLeft:2,transition:`all ${o.Duration.HOVER_CHANGE} ease-in`,":hover":{background:o.Colors.GRAY}},toolbarTabActive:{background:o.Colors.BRIGHT_BLUE,":hover":{background:o.Colors.BRIGHT_BLUE}},noLinkStyle:{textDecoration:"none",color:"inherit"},emoji:{display:"inline-block",verticalAlign:"middle",paddingTop:"0px",marginRight:"0.3em"}}); +},{"preact":24,"aphrodite":76,"./style":78,"../lib/emscripten":80,"./sandwich-view":68,"../lib/file-format":82,"../store":29,"../lib/typed-redux":36,"./flamechart-view-container":70,"../gl/graphics":42,"_bundle_loader":74,"../import":[["import.0a51feeb.js",101],"import.0a51feeb.map",101],"../../sample/profiles/stackcollapse/perf-vertx-stacks-01-collapsed-all.txt":72}],21:[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ApplicationContainer=void 0;var e=require("../lib/typed-redux"),t=require("./application"),i=require("../store/getters"),o=require("../store/actions"),n=require("../gl/graphics");const r=exports.ApplicationContainer=(0,e.createContainer)(t.Application,(t,r)=>{const{flattenRecursion:s,profileGroup:a}=t;let l=null;if(a&&a.profiles.length>a.indexToView){const e=a.indexToView,t=a.profiles[e];l=Object.assign({},a.profiles[a.indexToView],{profile:(0,i.getProfileToView)({profile:t.profile,flattenRecursion:s}),index:a.indexToView})}function c(t){return(0,e.bindActionCreator)(r,t)}const p={setGLCanvas:c(o.actions.setGLCanvas),setLoading:c(o.actions.setLoading),setError:c(o.actions.setError),setProfileGroup:c(o.actions.setProfileGroup),setDragActive:c(o.actions.setDragActive),setViewMode:c(o.actions.setViewMode),setFlattenRecursion:c(o.actions.setFlattenRecursion),setProfileIndexToView:c(o.actions.setProfileIndexToView)};return Object.assign({activeProfileState:l,dispatch:r,canvasContext:t.glCanvas?(0,i.getCanvasContext)(t.glCanvas):null,resizeCanvas:(e,o,r,s)=>{if(t.glCanvas){const a=(0,i.getCanvasContext)(t.glCanvas).gl;a.resize(e,o,r,s),a.clear(new n.Graphics.Color(1,1,1,1))}}},p,t)}); +},{"../lib/typed-redux":36,"./application":34,"../store/getters":38,"../store/actions":40,"../gl/graphics":42}],13:[function(require,module,exports) { +"use strict";var e=require("preact"),o=require("./store"),t=require("preact-redux"),r=require("./views/application-container");console.log(`speedscope v${require("../package.json").version}`),module.hot&&(module.hot.dispose(()=>{(0,e.render)((0,e.h)("div",null),document.body,document.body.lastElementChild||void 0)}),module.hot.accept());const i=window.store,d=(0,o.createApplicationStore)(i?i.getState():{});window.store=d,(0,e.render)((0,e.h)(t.Provider,{store:d},(0,e.h)(r.ApplicationContainer,null)),document.body,document.body.lastElementChild||void 0); +},{"preact":24,"./store":29,"preact-redux":26,"./views/application-container":21,"../package.json":19}],201:[function(require,module,exports) { +module.exports=function(n){return new Promise(function(e,o){var r=document.createElement("script");r.async=!0,r.type="text/javascript",r.charset="utf-8",r.src=n,r.onerror=function(n){r.onerror=r.onload=null,o(n)},r.onload=function(){r.onerror=r.onload=null,e()},document.getElementsByTagName("head")[0].appendChild(r)})}; +},{}],0:[function(require,module,exports) { +var b=require(74);b.register("js",require(201)); +},{}]},{},[0,13], null) //# sourceMappingURL=speedscope.fc6e6896.map \ No newline at end of file diff --git a/src/assert.hpp b/src/assert.hpp index 05b5c78..f55e9cc 100644 --- a/src/assert.hpp +++ b/src/assert.hpp @@ -1,54 +1,57 @@ -/** - Usage of the create_error_macros: -*/ -#define __create_error(keyword, ...) \ - create_error( \ - __FUNCTION__, __FILE__, __LINE__, \ - Memory::get_keyword(keyword), \ - __VA_ARGS__) - -#define create_out_of_memory_error(...) \ - __create_error("out-of-memory", __VA_ARGS__) - -#define create_generic_error(...) \ - __create_error("generic", __VA_ARGS__) - -#define create_not_yet_implemented_error() \ - __create_error("not-yet-implemented", "This feature has not yet been implemented.") - -#define create_parsing_error(...) \ - __create_error("parsing-error", __VA_ARGS__) - -#define create_symbol_undefined_error(...) \ - __create_error("symbol-undefined", __VA_ARGS__) - -#define create_type_missmatch_error(expected, actual) \ - __create_error("type-missmatch", \ - "Type missmatch: expected %s, got %s", \ - expected, actual) - -#ifdef _DEBUG - -#define assert_type(_node, _type) \ - do { \ - if (Memory::get_type(_node) != _type) { \ - create_type_missmatch_error( \ - Lisp_Object_Type_to_string(_type), \ - Lisp_Object_Type_to_string(Memory::get_type(_node))); \ - } \ - } while(0) - -#define assert(condition) \ - do { \ - if (!(condition)) { \ - create_generic_error("Assertion-error."); \ - } \ - } while(0) - -#else -# define assert_arguments_length(expected, actual) do {} while (0) -# define assert_arguments_length_less_equal(expected, actual) do {} while (0) -# define assert_arguments_length_greater_equal(expected, actual) do {} while (0) -# define assert_type(_node, _type) do {} while (0) -# define assert(condition) do {} while (0) -#endif +/** + Usage of the create_error_macros: +*/ +#define __create_error(keyword, ...) \ + create_error( \ + __FUNCTION__, __FILE__, __LINE__, \ + Memory::get_keyword(keyword), \ + __VA_ARGS__) + +#define create_out_of_memory_error(...) \ + __create_error("out-of-memory", __VA_ARGS__) + +#define create_generic_error(...) \ + __create_error("generic", __VA_ARGS__) + +#define create_not_yet_implemented_error() \ + __create_error("not-yet-implemented", "This feature has not yet been implemented.") + +#define create_parsing_error(...) \ + __create_error("parsing-error", __VA_ARGS__) + +#define create_symbol_undefined_error(...) \ + __create_error("symbol-undefined", __VA_ARGS__) + +#define create_type_missmatch_error(expected, actual, exp) \ + __create_error("type-missmatch", \ + "Type missmatch: expected %s, got %s in %s", \ + expected, actual, exp) + +#ifdef _DEBUG + +#define assert_type(_node, _type) \ + do { \ + if (Memory::get_type(_node) != _type) { \ + char* t = lisp_object_to_string(_node); \ + defer { free(t); }; \ + create_type_missmatch_error( \ + Lisp_Object_Type_to_string(_type), \ + Lisp_Object_Type_to_string(Memory::get_type(_node)), \ + t); \ + } \ + } while(0) + +#define assert(condition) \ + do { \ + if (!(condition)) { \ + create_generic_error("Assertion-error."); \ + } \ + } while(0) + +#else +# define assert_arguments_length(expected, actual) do {} while (0) +# define assert_arguments_length_less_equal(expected, actual) do {} while (0) +# define assert_arguments_length_greater_equal(expected, actual) do {} while (0) +# define assert_type(_node, _type) do {} while (0) +# define assert(condition) do {} while (0) +#endif diff --git a/src/built_ins.cpp b/src/built_ins.cpp index df9f4ba..3e90afa 100644 --- a/src/built_ins.cpp +++ b/src/built_ins.cpp @@ -1,1155 +1,1214 @@ -namespace Slime { - proc lisp_object_equal(Lisp_Object* n1, Lisp_Object* n2) -> bool { - if (n1 == n2) - return true; - if (Memory::get_type(n1) != Memory::get_type(n2)) - return false; - - switch (Memory::get_type(n1)) { - - case Lisp_Object_Type::T: - case Lisp_Object_Type::Nil: - case Lisp_Object_Type::Symbol: - case Lisp_Object_Type::Keyword: - case Lisp_Object_Type::Function: - // TODO(Felix): should a pointer - // object compare the pointer? - case Lisp_Object_Type::Pointer: - case Lisp_Object_Type::Continuation: return false; - case Lisp_Object_Type::Number: return n1->value.number == n2->value.number; - case Lisp_Object_Type::String: return string_equal(n1->value.string, n2->value.string); - case Lisp_Object_Type::Pair: { - return lisp_object_equal(n1->value.pair.first, n2->value.pair.first) && - lisp_object_equal(n1->value.pair.rest, n2->value.pair.rest); - } break; - case Lisp_Object_Type::HashMap: - case Lisp_Object_Type::Vector: - create_not_yet_implemented_error(); - } - - // we should never reach here - return false; - } - - proc add_to_load_path(const char* path) -> void { - using Globals::load_path; - - load_path.append((void*)path); - } - - proc built_in_load(String* file_name) -> Lisp_Object* { - profile_with_comment(&file_name->data); - char* file_content; - char fullpath[4096]; - sprintf(fullpath, "%s", Memory::get_c_str(file_name)); - file_content = read_entire_file(Memory::get_c_str(file_name)); - - if (!file_content) { - for (auto it: Globals::load_path) { - fullpath[0] = '\0'; - sprintf(fullpath, "%s%s", (char*)it, Memory::get_c_str(file_name)); - file_content = read_entire_file(fullpath); - if (file_content) - break; - } - if (!file_content) { - printf("Load path:\n"); - for (auto it : Globals::load_path) { - printf(" - %s\n", (char*) it); - } - create_generic_error("The file to load '%s' was not found in the load path.", - Memory::get_c_str(file_name)); - return nullptr; - } - - } - - - Lisp_Object* result = Memory::nil; - Array_List* program; - try program = Parser::parse_program(Memory::create_string(fullpath), file_content); - +namespace Slime { + proc lisp_object_equal(Lisp_Object* n1, Lisp_Object* n2) -> bool { + if (n1 == n2) + return true; + if (Memory::get_type(n1) != Memory::get_type(n2)) + return false; + + switch (Memory::get_type(n1)) { + + case Lisp_Object_Type::T: + case Lisp_Object_Type::Nil: + case Lisp_Object_Type::Symbol: + case Lisp_Object_Type::Keyword: + case Lisp_Object_Type::Function: + // TODO(Felix): should a pointer + // object compare the pointer? + case Lisp_Object_Type::Pointer: + case Lisp_Object_Type::Continuation: return false; + case Lisp_Object_Type::Number: return n1->value.number == n2->value.number; + case Lisp_Object_Type::String: return string_equal(n1->value.string, n2->value.string); + case Lisp_Object_Type::Pair: { + return lisp_object_equal(n1->value.pair.first, n2->value.pair.first) && + lisp_object_equal(n1->value.pair.rest, n2->value.pair.rest); + } break; + case Lisp_Object_Type::HashMap: { + auto n1_keys = n1->value.hashMap->get_all_keys(); + auto n2_keys = n2->value.hashMap->get_all_keys(); + defer { + n1_keys.dealloc(); + n2_keys.dealloc(); + }; + + if (n1_keys.next_index != n2_keys.next_index) + return false; + + n1_keys.sort(); + n2_keys.sort(); + + for (int i = 0; i < n1_keys.next_index; ++i) { + if (!lisp_object_equal(n1_keys[i], n2_keys[i])) + return false; + if (!lisp_object_equal(n1->value.hashMap->get_object(n1_keys[i]), + n2->value.hashMap->get_object(n2_keys[i]))) + return false; + } + return true; + + } + case Lisp_Object_Type::Vector: { + if (n1->value.vector.length != n2->value.vector.length ) + return false; + for (int i = 0; i < n1->value.vector.length; ++i) { + if (!lisp_object_equal(n1->value.vector.data+i, n2->value.vector.data+i)) + return false; + } + return true; + } break; + default: create_not_yet_implemented_error(); + } + + // we should never reach here + return false; + } + + proc add_to_load_path(const char* path) -> void { + using Globals::load_path; + + load_path.append((void*)path); + } + + proc built_in_load(String* file_name) -> Lisp_Object* { + profile_with_comment(&file_name->data); + char* file_content; + char fullpath[4096]; + sprintf(fullpath, "%s", Memory::get_c_str(file_name)); + file_content = read_entire_file(Memory::get_c_str(file_name)); + + if (!file_content) { + for (auto it: Globals::load_path) { + fullpath[0] = '\0'; + sprintf(fullpath, "%s%s", (char*)it, Memory::get_c_str(file_name)); + file_content = read_entire_file(fullpath); + if (file_content) + break; + } + if (!file_content) { + printf("Load path:\n"); + for (auto it : Globals::load_path) { + printf(" - %s\n", (char*) it); + } + create_generic_error("The file to load '%s' was not found in the load path.", + Memory::get_c_str(file_name)); + return nullptr; + } + + } + + + Lisp_Object* result = Memory::nil; + Array_List* program; + try program = Parser::parse_program(Memory::create_string(fullpath), file_content); + // NOTE(Felix): deferred so even if the eval failes, it will // run defer { - program->dealloc(); - free(program); - free(file_content); + program->dealloc(); + free(program); + free(file_content); }; for (auto expr : *program) { try result = eval_expr(expr); } - - return result; - } - - proc built_in_import(String* file_name) -> Lisp_Object* { - profile_this(); - Environment* new_env; - - new_env = Memory::file_to_env_map.get_object(Memory::get_c_str(file_name)); - - if (!new_env) { - // create new empty environment - try new_env = Memory::create_child_environment(get_root_environment()); - // TODO(Felix): check absoulute paths in the map, not just - // relative ones - Memory::file_to_env_map.set_object(Memory::get_c_str(file_name), new_env); - push_environment(new_env); - defer { - pop_environment(); - }; - - Lisp_Object* res; - try res = built_in_load(file_name); - } - - get_current_environment()->parents.append(new_env); - - return Memory::nil; - } - - proc load_built_ins_into_environment() -> void* { - profile_this(); - String* file_name_built_ins = Memory::create_string(__FILE__); - - // define_macro((apply fun args), "TODO") { - // profile_with_name("(apply)"); - // }; - define_macro((eval expr), - "Takes one argument, and evaluates it two times.") - { - profile_with_name("(eval)"); - using namespace Globals::Current_Execution; - cs.data[cs.next_index-1] = pcs[--pcs.next_index]->value.pair.first; - (nass.end()-1)->append(NasAction::Eval); - (nass.end()-1)->append(NasAction::Eval); - - }; - define_macro((begin . rest), - "Takes any number of forms. Evaluates them in order, " - "and returns the last result.") - { - profile_with_name("(begin)"); - using namespace Globals::Current_Execution; - --cs.next_index; - --ams.next_index; - Lisp_Object* args = pcs[--pcs.next_index]; - int length = list_length(args); - cs.reserve(length); - for_lisp_list(args) { - cs.data[cs.next_index - 1 + (length - it_index)] = it; - (nass.end()-1)->append(NasAction::Eval); - (nass.end()-1)->append(NasAction::Pop); - } - - --(nass.end()-1)->next_index; - cs.next_index += length; - }; - define_macro((if test then_part else_part), - "Takes 3 arguments. If the first arguments evaluates to a truthy " - "value, the if expression evaluates the second argument, else " - "it will evaluete the third one and return them respectively.") - { - profile_with_name("(if)"); - using namespace Globals::Current_Execution; - /* | | | | - | | -> | | - | | | | - | .... | | ...... | */ - --ams.next_index; - Lisp_Object* args = pcs.data[--pcs.next_index]; - Lisp_Object* test = args->value.pair.first; - args = args->value.pair.rest; - try_void assert_type(args, Lisp_Object_Type::Pair); - Lisp_Object* consequence = args->value.pair.first; - args = args->value.pair.rest; - try_void assert_type(args, Lisp_Object_Type::Pair); - Lisp_Object* alternative = args->value.pair.first; - args = args->value.pair.rest; - try_void assert_type(args, Lisp_Object_Type::Nil); - --cs.next_index; - cs.append(alternative); - cs.append(consequence); - cs.append(test); - - (nass.end()-1)->append(NasAction::Eval); - (nass.end()-1)->append(NasAction::If); - (nass.end()-1)->append(NasAction::Eval); - - }; - define_macro((define definee . args), "") { - // NOTE(Felix): define has to be a macro, because we need - // to evaluate the value for definee in case it is a - // simple variable (not a function). So ebcause we don't - // want to recursivly evaluate the value, we use a macro - // and a NasAction. - profile_with_name("(define)"); - using namespace Globals::Current_Execution; - --cs.next_index; - --ams.next_index; - Lisp_Object* form = pcs.data[--pcs.next_index]; - Lisp_Object* definee = form->value.pair.first; - form = form->value.pair.rest; - try_void assert_type(form, Lisp_Object_Type::Pair); - Lisp_Object* thing = form->value.pair.first; - Lisp_Object* thing_cons = form; - form = form->value.pair.rest; - Lisp_Object_Type type = Memory::get_type(definee); - switch (type) { - case Lisp_Object_Type::Symbol: { - // BUG(Felix): Defining with doc string crashes - if (form != Memory::nil) { - Lisp_Object* doc = thing; - try_void assert_type(doc, Lisp_Object_Type::String); - try_void assert_type(form, Lisp_Object_Type::Pair); - form = form->value.pair.rest; - thing = form->value.pair.first; - try_void assert(form->value.pair.rest == Memory::nil); - // TODO docs - } - cs.append(definee); - cs.append(thing); - (nass.end()-1)->append(NasAction::Define_Var); - (nass.end()-1)->append(NasAction::Eval); - } break; - case Lisp_Object_Type::Pair: { - fflush(stdout); - try_void assert_type(definee->value.pair.first, Lisp_Object_Type::Symbol); - Lisp_Object* func; - try_void func = Memory::create_lisp_object_function(Lisp_Function_Type::Lambda); - func->value.function->parent_environment = get_current_environment(); - create_arguments_from_lambda_list_and_inject(definee->value.pair.rest, func); - func->value.function->body.lisp_body = maybe_wrap_body_in_begin(thing_cons); - define_symbol(definee->value.pair.first, func); - cs.append(Memory::t); - } break; - default: { - create_generic_error("you can only define symbols"); - return; - } - } - }; - define((helper), "") { - profile_with_name("(helper)"); - return Memory::create_lisp_object(101.0); - }; - define((test (:k (helper))), "") { - profile_with_name("(test)"); - fetch(k); - return k; - }; - define((= . args), - "Takes 0 or more arguments and returns =t= if all arguments are equal " - "and =()= otherwise.") - { - profile_with_name("(=)"); - fetch(args); - - if (args == Memory::nil) - return Memory::t; - - Lisp_Object* first = args->value.pair.first; - - for_lisp_list (args) { - if (!lisp_object_equal(it, first)) - return Memory::nil; - } - - return Memory::t; - }; - define((> . args), "TODO") { - profile_with_name("(>)"); - fetch(args); - double last_number = strtod("Inf", NULL); - - for_lisp_list (args) { - try assert_type(it, Lisp_Object_Type::Number); - if (it->value.number >= last_number) - return Memory::nil; - last_number = it->value.number; - } - - return Memory::t; - }; - define((>= . args), "TODO") - { - profile_with_name("(>=)"); - fetch(args); - double last_number = strtod("Inf", NULL); - - for_lisp_list (args) { - try assert_type(it, Lisp_Object_Type::Number); - if (it->value.number > last_number) - return Memory::nil; - last_number = it->value.number; - } - - return Memory::t; - }; - define((< . args), "TODO") - { - profile_with_name("(<)"); - fetch(args); - double last_number = strtod("-Inf", NULL); - - for_lisp_list (args) { - try assert_type(it, Lisp_Object_Type::Number); - if (it->value.number <= last_number) - return Memory::nil; - last_number = it->value.number; - } - - return Memory::t; - }; - define((<= . args), "TODO") - { - profile_with_name("(<=)"); - fetch(args); - double last_number = strtod("-Inf", NULL); - - for_lisp_list (args) { - try assert_type(it, Lisp_Object_Type::Number); - if (it->value.number < last_number) - return Memory::nil; - last_number = it->value.number; - } - - return Memory::t; - }; - define((+ . args), "TODO") - { - profile_with_name("(+)"); - fetch(args); - double sum = 0; - - for_lisp_list (args) { - try assert_type(it, Lisp_Object_Type::Number); - sum += it->value.number; - } - - return Memory::create_lisp_object(sum); - }; - define((- . args), "TODO") - { - profile_with_name("(-)"); - fetch(args); - if (args == Memory::nil) - return Memory::create_lisp_object(0.0); - - - try assert_type(args->value.pair.first, Lisp_Object_Type::Number); - double difference = args->value.pair.first->value.number; - - if (args->value.pair.rest == Memory::nil) { - return Memory::create_lisp_object(-difference); - } - - for_lisp_list (args->value.pair.rest) { - try assert_type(it, Lisp_Object_Type::Number); - difference -= it->value.number; - } - - return Memory::create_lisp_object(difference); - }; - define((* . args), "TODO") - { - profile_with_name("(*)"); - fetch(args); - if (args == Memory::nil) { - return Memory::create_lisp_object(1); - } - - double product = 1; - - for_lisp_list (args) { - try assert_type(it, Lisp_Object_Type::Number); - product *= it->value.number; - } - - return Memory::create_lisp_object(product); - }; - define((/ . args), "TODO") - { - profile_with_name("(/)"); - fetch(args); - - if (args == Memory::nil) { - return Memory::create_lisp_object(1); - } - - try assert_type(args->value.pair.first, Lisp_Object_Type::Number); - - double quotient = args->value.pair.first->value.number; - - for_lisp_list (args->value.pair.rest) { - try assert_type(it, Lisp_Object_Type::Number); - quotient /= it->value.number; - } - - return Memory::create_lisp_object(quotient); - }; - define((** a b), "TODO") { - profile_with_name("(**)"); - fetch(a, b); - try assert_type(a, Lisp_Object_Type::Number); - try assert_type(b, Lisp_Object_Type::Number); - return Memory::create_lisp_object(pow(a->value.number, - b->value.number)); - }; - define((% a b), "TODO") { - profile_with_name("(%)"); - fetch(a, b); - try assert_type(a, Lisp_Object_Type::Number); - try assert_type(b, Lisp_Object_Type::Number); - return Memory::create_lisp_object((int)a->value.number % - (int)b->value.number); - }; - define((get-random-between a b), "TODO") { - profile_with_name("(get-random-between)"); - fetch(a, b); - try assert_type(a, Lisp_Object_Type::Number); - try assert_type(b, Lisp_Object_Type::Number); - - double fa = a->value.number; - double fb = b->value.number; - double x = (double)rand()/(double)(RAND_MAX); - x *= (fb - fa); - x += fa; - - return Memory::create_lisp_object(x); - }; - define_special((bound? var), "TODO") { - profile_with_name("(bound?)"); - fetch(var); - try assert_type(var, Lisp_Object_Type::Symbol); - - Lisp_Object* res; - in_caller_env { - res = try_lookup_symbol(var, get_current_environment()); - } - if (res) - return Memory::t; - return Memory::nil; - }; + + return result; + } + + proc built_in_import(String* file_name) -> Lisp_Object* { + profile_this(); + Environment* new_env; + + new_env = Memory::file_to_env_map.get_object(Memory::get_c_str(file_name)); + + if (!new_env) { + // create new empty environment + try new_env = Memory::create_child_environment(get_root_environment()); + // TODO(Felix): check absoulute paths in the map, not just + // relative ones + Memory::file_to_env_map.set_object(Memory::get_c_str(file_name), new_env); + push_environment(new_env); + defer { + pop_environment(); + }; + + Lisp_Object* res; + try res = built_in_load(file_name); + } + + get_current_environment()->parents.append(new_env); + + return Memory::nil; + } + + proc load_built_ins_into_environment() -> void* { + profile_this(); + String* file_name_built_ins = Memory::create_string(__FILE__); + + // define_macro((apply fun args), "TODO") { + // profile_with_name("(apply)"); + // }; + define_macro((eval expr), + "Takes one argument, and evaluates it two times.") + { + profile_with_name("(eval)"); + using namespace Globals::Current_Execution; + cs.data[cs.next_index-1] = pcs[--pcs.next_index]->value.pair.first; + (nass.end()-1)->append(NasAction::Eval); + (nass.end()-1)->append(NasAction::Eval); + + }; + define_macro((begin . rest), + "Takes any number of forms. Evaluates them in order, " + "and returns the last result.") + { + profile_with_name("(begin)"); + using namespace Globals::Current_Execution; + --cs.next_index; + --ams.next_index; + Lisp_Object* args = pcs[--pcs.next_index]; + int length = list_length(args); + cs.reserve(length); + for_lisp_list(args) { + cs.data[cs.next_index - 1 + (length - it_index)] = it; + (nass.end()-1)->append(NasAction::Eval); + (nass.end()-1)->append(NasAction::Pop); + } + + --(nass.end()-1)->next_index; + cs.next_index += length; + }; + define_macro((if test then_part else_part), + "Takes 3 arguments. If the first arguments evaluates to a truthy " + "value, the if expression evaluates the second argument, else " + "it will evaluete the third one and return them respectively.") + { + profile_with_name("(if)"); + using namespace Globals::Current_Execution; + /* | | | | + | | -> | | + | | | | + | .... | | ...... | */ + --ams.next_index; + Lisp_Object* args = pcs.data[--pcs.next_index]; + Lisp_Object* test = args->value.pair.first; + args = args->value.pair.rest; + try_void assert_type(args, Lisp_Object_Type::Pair); + Lisp_Object* consequence = args->value.pair.first; + args = args->value.pair.rest; + try_void assert_type(args, Lisp_Object_Type::Pair); + Lisp_Object* alternative = args->value.pair.first; + args = args->value.pair.rest; + try_void assert_type(args, Lisp_Object_Type::Nil); + --cs.next_index; + cs.append(alternative); + cs.append(consequence); + cs.append(test); + + (nass.end()-1)->append(NasAction::Eval); + (nass.end()-1)->append(NasAction::If); + (nass.end()-1)->append(NasAction::Eval); + + }; + define_macro((define definee . args), "") { + // NOTE(Felix): define has to be a macro, because we need + // to evaluate the value for definee in case it is a + // simple variable (not a function). So ebcause we don't + // want to recursivly evaluate the value, we use a macro + // and a NasAction. + profile_with_name("(define)"); + using namespace Globals::Current_Execution; + --cs.next_index; + --ams.next_index; + Lisp_Object* form = pcs.data[--pcs.next_index]; + Lisp_Object* definee = form->value.pair.first; + form = form->value.pair.rest; + try_void assert_type(form, Lisp_Object_Type::Pair); + Lisp_Object* thing = form->value.pair.first; + Lisp_Object* thing_cons = form; + form = form->value.pair.rest; + Lisp_Object_Type type = Memory::get_type(definee); + switch (type) { + case Lisp_Object_Type::Symbol: { + // BUG(Felix): Defining with doc string crashes + if (form != Memory::nil) { + Lisp_Object* doc = thing; + try_void assert_type(doc, Lisp_Object_Type::String); + try_void assert_type(form, Lisp_Object_Type::Pair); + form = form->value.pair.rest; + thing = form->value.pair.first; + try_void assert(form->value.pair.rest == Memory::nil); + // TODO docs + } + cs.append(definee); + cs.append(thing); + (nass.end()-1)->append(NasAction::Define_Var); + (nass.end()-1)->append(NasAction::Eval); + } break; + case Lisp_Object_Type::Pair: { + fflush(stdout); + try_void assert_type(definee->value.pair.first, Lisp_Object_Type::Symbol); + Lisp_Object* func; + try_void func = Memory::create_lisp_object_function(Lisp_Function_Type::Lambda); + func->value.function->parent_environment = get_current_environment(); + create_arguments_from_lambda_list_and_inject(definee->value.pair.rest, func); + func->value.function->body.lisp_body = maybe_wrap_body_in_begin(thing_cons); + define_symbol(definee->value.pair.first, func); + cs.append(Memory::t); + } break; + default: { + create_generic_error("you can only define symbols"); + return; + } + } + }; + define((helper), "") { + profile_with_name("(helper)"); + return Memory::create_lisp_object(101.0); + }; + define((enable-debug-log), "") { + profile_with_name("(enable-debug-log)"); + Globals::debug_log = true; + return Memory::t; + }; + define((disable-debug-log), "") { + profile_with_name("(disable-debug-log)"); + Globals::debug_log = false; + return Memory::t; + }; + define_special((with-debug-log . rest), "") { + profile_with_name("(enable-debug-log)"); + fetch(rest); + Lisp_Object* result; + Globals::debug_log = true; + in_caller_env { + for_lisp_list(rest) { + // TODO(Felix): hooky would be really nice to + // have. Then this would be a macro and we would + // reset the debug log + try result = eval_expr(it); + } + } + Globals::debug_log = false; + return result; + }; + define((test (:k (helper))), "") { + profile_with_name("(test)"); + fetch(k); + return k; + }; + define((= . args), + "Takes 0 or more arguments and returns =t= if all arguments are equal " + "and =()= otherwise.") + { + profile_with_name("(=)"); + fetch(args); + + if (args == Memory::nil) + return Memory::t; + + Lisp_Object* first = args->value.pair.first; + + for_lisp_list (args) { + if (!lisp_object_equal(it, first)) + return Memory::nil; + } + + return Memory::t; + }; + define((> . args), "TODO") { + profile_with_name("(>)"); + fetch(args); + double last_number = strtod("Inf", NULL); + + for_lisp_list (args) { + try assert_type(it, Lisp_Object_Type::Number); + if (it->value.number >= last_number) + return Memory::nil; + last_number = it->value.number; + } + + return Memory::t; + }; + define((>= . args), "TODO") + { + profile_with_name("(>=)"); + fetch(args); + double last_number = strtod("Inf", NULL); + + for_lisp_list (args) { + try assert_type(it, Lisp_Object_Type::Number); + if (it->value.number > last_number) + return Memory::nil; + last_number = it->value.number; + } + + return Memory::t; + }; + define((< . args), "TODO") + { + profile_with_name("(<)"); + fetch(args); + double last_number = strtod("-Inf", NULL); + + for_lisp_list (args) { + try assert_type(it, Lisp_Object_Type::Number); + if (it->value.number <= last_number) + return Memory::nil; + last_number = it->value.number; + } + + return Memory::t; + }; + define((<= . args), "TODO") + { + profile_with_name("(<=)"); + fetch(args); + double last_number = strtod("-Inf", NULL); + + for_lisp_list (args) { + try assert_type(it, Lisp_Object_Type::Number); + if (it->value.number < last_number) + return Memory::nil; + last_number = it->value.number; + } + + return Memory::t; + }; + define((+ . args), "TODO") + { + profile_with_name("(+)"); + fetch(args); + double sum = 0; + + for_lisp_list (args) { + try assert_type(it, Lisp_Object_Type::Number); + sum += it->value.number; + } + + return Memory::create_lisp_object(sum); + }; + define((- . args), "TODO") + { + profile_with_name("(-)"); + fetch(args); + if (args == Memory::nil) + return Memory::create_lisp_object(0.0); + + + try assert_type(args->value.pair.first, Lisp_Object_Type::Number); + double difference = args->value.pair.first->value.number; + + if (args->value.pair.rest == Memory::nil) { + return Memory::create_lisp_object(-difference); + } + + for_lisp_list (args->value.pair.rest) { + try assert_type(it, Lisp_Object_Type::Number); + difference -= it->value.number; + } + + return Memory::create_lisp_object(difference); + }; + define((* . args), "TODO") + { + profile_with_name("(*)"); + fetch(args); + if (args == Memory::nil) { + return Memory::create_lisp_object(1); + } + + double product = 1; + + for_lisp_list (args) { + try assert_type(it, Lisp_Object_Type::Number); + product *= it->value.number; + } + + return Memory::create_lisp_object(product); + }; + define((/ . args), "TODO") + { + profile_with_name("(/)"); + fetch(args); + + if (args == Memory::nil) { + return Memory::create_lisp_object(1); + } + + try assert_type(args->value.pair.first, Lisp_Object_Type::Number); + + double quotient = args->value.pair.first->value.number; + + for_lisp_list (args->value.pair.rest) { + try assert_type(it, Lisp_Object_Type::Number); + quotient /= it->value.number; + } + + return Memory::create_lisp_object(quotient); + }; + define((** a b), "TODO") { + profile_with_name("(**)"); + fetch(a, b); + try assert_type(a, Lisp_Object_Type::Number); + try assert_type(b, Lisp_Object_Type::Number); + return Memory::create_lisp_object(pow(a->value.number, + b->value.number)); + }; + define((% a b), "TODO") { + profile_with_name("(%)"); + fetch(a, b); + try assert_type(a, Lisp_Object_Type::Number); + try assert_type(b, Lisp_Object_Type::Number); + return Memory::create_lisp_object((int)a->value.number % + (int)b->value.number); + }; + define((get-random-between a b), "TODO") { + profile_with_name("(get-random-between)"); + fetch(a, b); + try assert_type(a, Lisp_Object_Type::Number); + try assert_type(b, Lisp_Object_Type::Number); + + double fa = a->value.number; + double fb = b->value.number; + double x = (double)rand()/(double)(RAND_MAX); + x *= (fb - fa); + x += fa; + + return Memory::create_lisp_object(x); + }; + define_special((bound? var), "TODO") { + profile_with_name("(bound?)"); + fetch(var); + try assert_type(var, Lisp_Object_Type::Symbol); + + Lisp_Object* res; + in_caller_env { + res = try_lookup_symbol(var, get_current_environment()); + } + if (res) + return Memory::t; + return Memory::nil; + }; define_special((assert test), "TODO") { - profile_with_name("(assert)"); - fetch(test); - + profile_with_name("(assert)"); + fetch(test); + in_caller_env { - if (is_truthy(nrc_eval(test))) - return Memory::t; + Lisp_Object* res; + try res = eval_expr(test); + if (is_truthy(res)) + return Memory::t; } - + char* string = lisp_object_to_string(test, true); create_generic_error("Userland assertion. (%s)", string); free(string); - return nullptr; - }; - define_special((define-syntax form (:doc "") . body), "TODO") { - profile_with_name("(define-syntax)"); - fetch(form, doc, body); - - try assert_type(doc, Lisp_Object_Type::String); - // if no doc string, we dont have to store it - if (Memory::get_c_str(doc)[0] == '\0') { - doc = nullptr; - } - - if (Memory::get_type(form) != Lisp_Object_Type::Pair) { - create_parsing_error("You can only create function macros."); - return nullptr; - } - - Lisp_Object* symbol = form->value.pair.first; - Lisp_Object* lambdalist = form->value.pair.rest; - - // creating new lisp object and setting type - Lisp_Object* func; - try func = Memory::create_lisp_object_function(Lisp_Function_Type::Macro); - if (doc) func->docstring = doc->value.string; - - in_caller_env { - // setting parent env - func->value.function->parent_environment = get_current_environment(); - create_arguments_from_lambda_list_and_inject(lambdalist, func); - func->value.function->body.lisp_body = maybe_wrap_body_in_begin(body); - define_symbol(symbol, func); - } - return Memory::nil; - }; - define((mutate target source), "TODO") { - profile_with_name("(mutate)"); - fetch(target, source); - - if (target == Memory::nil || - target == Memory::t || - Memory::get_type(target) == Lisp_Object_Type::Keyword || - Memory::get_type(target) == Lisp_Object_Type::Symbol) - { - create_generic_error("You cannot mutate to nil, t, keywords or symbols because they have to be unique"); - } - - if (source == Memory::nil || - source == Memory::t || - Memory::get_type(source) == Lisp_Object_Type::Keyword || - Memory::get_type(source) == Lisp_Object_Type::Symbol) - { - create_generic_error("You cannot mutate nil, t, keywords or symbols"); - } - - *target = *source; - return target; - }; - define((vector-length v), "TODO") { - profile_with_name("(vector-length)"); - fetch(v); - try assert_type(v, Lisp_Object_Type::Vector); - return Memory::create_lisp_object((double)v->value.vector.length); - }; - define((vector-ref vec idx), "TODO") { - profile_with_name("(vector-ref)"); - fetch(vec, idx); - - try assert_type(vec, Lisp_Object_Type::Vector); - try assert_type(idx, Lisp_Object_Type::Number); - - int int_idx = ((int)idx->value.number); - - try assert(int_idx >= 0); - try assert(int_idx < vec->value.vector.length); - - return vec->value.vector.data+int_idx; - }; - define((vector-set! vec idx val), "TODO") { - profile_with_name("(vector-set!)"); - fetch(vec, idx, val); - - try assert_type(vec, Lisp_Object_Type::Vector); - try assert_type(idx, Lisp_Object_Type::Number); - - int int_idx = ((int)idx->value.number); - - try assert(int_idx >= 0); - try assert(int_idx < vec->value.vector.length); - - vec->value.vector.data[int_idx] = *val; - - return val; - }; - define_special((set! sym val), "TODO") { - profile_with_name("(set!)"); - fetch(sym, val); - - try assert_type(sym, Lisp_Object_Type::Symbol); - Environment* target_env; - in_caller_env { - val = eval_expr(val); - target_env = find_binding_environment(sym, get_current_environment()); - if (!target_env) - target_env = get_root_environment(); - } - - - push_environment(target_env); - define_symbol(sym, val); - pop_environment(); - - return val; - }; - define((set-car! target source), "TODO") { - profile_with_name("(set-car!)"); - fetch(target, source); - - try assert_type(target, Lisp_Object_Type::Pair); - - *target->value.pair.first = *source; - return source; - }; - define((set-cdr! target source), "TODO") { - profile_with_name("(set-cdr!)"); - fetch(target, source); - - try assert_type(target, Lisp_Object_Type::Pair); - - *target->value.pair.rest = *source; - return source; - }; - define_special((quote datum), "TODO") { - profile_with_name("(quote)"); - fetch(datum); - return datum; - }; - define_special((quasiquote expr), "TODO") { - profile_with_name("(quasiquote)"); - fetch(expr); - Lisp_Object* quasiquote_sym = Memory::get_symbol("quasiquote"); - Lisp_Object* unquote_sym = Memory::get_symbol("unquote"); - Lisp_Object* unquote_splicing_sym = Memory::get_symbol("unquote-splicing"); - // NOTE(Felix): first we have to initialize the variable - // with a garbage lambda, so that we can then overwrite it - // a recursive lambda - const auto unquoteSomeExpressions = [&] (const auto & self, Lisp_Object* expr) -> Lisp_Object* { - // if it is an atom, return it - if (Memory::get_type(expr) != Lisp_Object_Type::Pair) - return Memory::copy_lisp_object(expr); - - // it is a pair! - Lisp_Object* originalPair = expr->value.pair.first; - - // if we find quasiquote, uhu - if (originalPair == quasiquote_sym) - return expr; - - if (originalPair == unquote_sym || originalPair == unquote_splicing_sym) - { - // eval replace the stuff - - Lisp_Object* ret; - in_caller_env { - try ret = eval_expr(expr->value.pair.rest->value.pair.first); - } - - return ret; - } - - // it is a list but not starting with the symbol - // unquote, so search in there for stuff to unquote. - // While copying the list - - //NOTE(Felix): Of fucking course we have to copy the - // list. The quasiquote will be part of the body of a - // funciton, we can't just modify it because otherwise - // we modify the body of the function and would bake - // in the result... - Lisp_Object* newPair = Memory::nil; - Lisp_Object* newPairHead = newPair; - Lisp_Object* head = expr; - - while (Memory::get_type(head) == Lisp_Object_Type::Pair) { - // if it is ,@ we have to actually do more work - // and inline the result - if (Memory::get_type(head->value.pair.first) == Lisp_Object_Type::Pair && - head->value.pair.first->value.pair.first == unquote_splicing_sym) - { - Lisp_Object* spliced = self(self, head->value.pair.first); - - if (spliced == Memory::nil) { - head = head->value.pair.rest; - continue; - } - - try assert_type(spliced, Lisp_Object_Type::Pair); - if (newPair == Memory::nil) { - try newPair = Memory::create_lisp_object_pair(Memory::nil, Memory::nil); - newPairHead = newPair; - } else { - try newPairHead->value.pair.rest = Memory::create_lisp_object_pair(Memory::nil, Memory::nil); - newPairHead = newPairHead->value.pair.rest; - newPairHead->value.pair.first = spliced->value.pair.first; - newPairHead->value.pair.rest = spliced->value.pair.rest; - - // now skip to the end - while (newPairHead->value.pair.rest != Memory::nil) { - newPairHead = newPairHead->value.pair.rest; - } - } - - } else { - if (newPair == Memory::nil) { - try newPair = Memory::create_lisp_object_pair(Memory::nil, Memory::nil); - newPairHead = newPair; - } else { - try newPairHead->value.pair.rest = Memory::create_lisp_object_pair(Memory::nil, Memory::nil); - newPairHead = newPairHead->value.pair.rest; - } - newPairHead->value.pair.first = self(self, head->value.pair.first); - } - - // if (Memory::get_type(head->value.pair.rest) != Lisp_Object_Type::Pair) { - // break; - // } - - head = head->value.pair.rest; - - } - newPairHead->value.pair.rest = Memory::nil; - - return newPair; - }; - - expr = unquoteSomeExpressions(unquoteSomeExpressions, expr); - return expr; - }; - define_special((and . args), "TODO") { - profile_with_name("(and)"); - fetch(args); - bool result = true; - in_caller_env { - for_lisp_list (args) { - try result &= is_truthy(it); - if (!result) - return Memory::nil; - } - } - return Memory::t; - }; - define_special((or . args), "TODO") { - profile_with_name("(or)"); - fetch(args); - bool result = false; - in_caller_env { - for_lisp_list (args) { - try result |= is_truthy(it); - if (result) - return Memory::t; - } - } - return Memory::nil; - }; - define_special((not test), "TODO") { - profile_with_name("(not)"); - fetch(test); - bool truthy; - in_caller_env { - try truthy = is_truthy(test); - } - return (truthy) ? Memory::nil : Memory::t; - }; - // // // defun("while", "TODO", __LINE__, cLambda { - // // // try arguments_length = list_length(arguments); - // // // try assert(arguments_length >= 2); - - // // // Lisp_Object* condition_part = arguments->value.pair.first; - // // // Lisp_Object* condition; - // // // Lisp_Object* then_part = arguments->value.pair.rest; - // // // Lisp_Object* wrapped_then_part; - - // // // try wrapped_then_part = Memory::create_lisp_object_pair( - // // // Memory::get_symbol("begin"), - // // // then_part); - - // // // Lisp_Object* result = Memory::nil; - - // // // while (true) { - // // // try condition = eval_expr(condition_part); - - // // // if (condition == Memory::nil) - // // // break; - - // // // try result = eval_expr(wrapped_then_part); - // // // } - // // // return result; - - // // // }); - define_special((lambda args . body), "TODO") { - profile_with_name("(lambda)"); - fetch(args, body); - - // creating new lisp object and setting type - Lisp_Object* func; - try func = Memory::create_lisp_object_function(Lisp_Function_Type::Lambda); - - in_caller_env { - func->value.function->parent_environment = get_current_environment(); - } - - try create_arguments_from_lambda_list_and_inject(args, func); - func->value.function->body.lisp_body = maybe_wrap_body_in_begin(body); - return func; - }; - define((list . args), "TODO") { - profile_with_name("(list)"); - fetch(args); - return args; - }; - define((hash-map . args), "TODO") { - profile_with_name("(hash-map)"); - fetch(args); - Lisp_Object* ret; - try ret = Memory::create_lisp_object_hash_map(); - for_lisp_list (args) { - try assert_type(head->value.pair.rest, Lisp_Object_Type::Pair); - head = head->value.pair.rest; - ret->value.hashMap->set_object(it, head->value.pair.first); - } - - return ret; - }; - define((hash-map-get hm key), "TODO") { - profile_with_name("(hash-map-get)"); - fetch(hm, key); - try assert_type(hm, Lisp_Object_Type::HashMap); - - Lisp_Object* ret = (Lisp_Object*)hm->value.hashMap->get_object(key); - if (!ret) - create_symbol_undefined_error("The key was not set in the hashmap"); - - return ret; - }; - define((hash-map-set! hm key value), "TODO") { - profile_with_name("(hash-map-set!)"); - fetch(hm, key, value); - try assert_type(hm, Lisp_Object_Type::HashMap); - hm->value.hashMap->set_object(key, value); - return Memory::nil; - }; - define((hash-map-delete! hm key), "TODO") { - profile_with_name("(hash-map-delete!)"); - fetch(hm, key); - try assert_type(hm, Lisp_Object_Type::HashMap); - hm->value.hashMap->delete_object(key); - return Memory::nil; - }; - define((vector . args), "TODO") { - profile_with_name("(vector)"); - fetch(args); - Lisp_Object* ret; - int length = list_length(args); - try ret = Memory::create_lisp_object_vector(length, args); - return ret; - }; - define((pair car cdr), "TODO") { - profile_with_name("(pair)"); - fetch(car, cdr); - - Lisp_Object* ret; - try ret = Memory::create_lisp_object_pair(car, cdr); - return ret; - }; - define((first seq), "TODO") { - profile_with_name("(first)"); - fetch(seq); - if (seq == Memory::nil) - return Memory::nil; - try assert_type(seq, Lisp_Object_Type::Pair); - return seq->value.pair.first; - }; - define((rest seq), "TODO") { - profile_with_name("(rest)"); - fetch(seq); - if (seq == Memory::nil) - return Memory::nil; - try assert_type(seq, Lisp_Object_Type::Pair); - return seq->value.pair.rest; - }; - define((set-type! node new_type), "TODO") { - profile_with_name("(set-type!)"); - fetch(node, new_type); - try assert_type(new_type, Lisp_Object_Type::Keyword); - node->userType = new_type; - return node; - }; - define((delete-type! n), "TODO") { - profile_with_name("(delete-type!)"); - fetch(n); - n->userType = nullptr; - return Memory::t; - }; - define((type n), "TODO") { - profile_with_name("(type)"); - fetch(n); - - if (n->userType) { - return n->userType; - } - - Lisp_Object_Type type = Memory::get_type(n); - - switch (type) { - case Lisp_Object_Type::Continuation: return Memory::get_keyword("continuation"); - case Lisp_Object_Type::Function: { - Function* fun = n->value.function; - if (fun->is_c) { - switch (fun->type.c_function_type) { - case C_Function_Type::cMacro: return Memory::get_keyword("cMacro"); - case C_Function_Type::cFunction: return Memory::get_keyword("cFunction"); - case C_Function_Type::cSpecial: return Memory::get_keyword("cSpecial"); - default: return Memory::get_keyword("c??"); - } - } else { - switch (fun->type.lisp_function_type) { - case Lisp_Function_Type::Lambda: return Memory::get_keyword("lambda"); - case Lisp_Function_Type::Macro: return Memory::get_keyword("macro"); - default: return Memory::get_keyword("??"); - } - } - } - case Lisp_Object_Type::HashMap: return Memory::get_keyword("hashmap"); - case Lisp_Object_Type::Keyword: return Memory::get_keyword("keyword"); - case Lisp_Object_Type::Nil: return Memory::get_keyword("nil"); - case Lisp_Object_Type::Number: return Memory::get_keyword("number"); - case Lisp_Object_Type::Pair: return Memory::get_keyword("pair"); - case Lisp_Object_Type::Pointer: return Memory::get_keyword("pointer"); - case Lisp_Object_Type::String: return Memory::get_keyword("string"); - case Lisp_Object_Type::Symbol: return Memory::get_keyword("symbol"); - case Lisp_Object_Type::T: return Memory::get_keyword("t"); - case Lisp_Object_Type::Vector: return Memory::get_keyword("vector"); - } - return Memory::get_keyword("unknown"); - }; - // define((mem-reset), "TODO") { - // profile_with_name("(mem-reset)"); - // Memory::reset(); - // return Memory::nil; - // }; - define_special((info n), "TODO") - { - // NOTE(Felix): we need to define_special because the docstring is - // attached to the symbol. Because some object are singletons - // (symbols, keyowrds, nil, t) we dont want to store docs on the - // object. Otherwise (define k :doc "hallo" :keyword) would modify - // // the global keyword - profile_with_name("(info)"); - fetch(n); - print(n); - - Lisp_Object* type; - Lisp_Object* val; - in_caller_env { - try type = eval_expr(Memory::create_list(Memory::get_symbol("type"), n)); - try val = eval_expr(n); - } - - printf(" is of type "); - print(type); - printf(" (internal: %s)", Lisp_Object_Type_to_string(Memory::get_type(val))); - printf("\nand is printed as: "); - print(val); - printf("\n\ndocs: \n %s\n", - (val->docstring) - ? Memory::get_c_str(val->docstring) - : "No docs avaliable"); - - if (Memory::get_type(val) == Lisp_Object_Type::Function) - { - Arguments* args = &val->value.function->args; - - - printf("Arguments:\n==========\n"); - printf("Postitional: {"); - if (args->positional.symbols.next_index != 0) { - printf("%s", - Memory::get_c_str(args->positional.symbols.data[0]->value.symbol)); - for (int i = 1; i < args->positional.symbols.next_index; ++i) { - printf(", %s", - Memory::get_c_str(args->positional.symbols.data[i]->value.symbol)); - } - } - printf("}\n"); - printf("Keyword: {"); - if (args->keyword.values.next_index != 0) { - printf("%s", - Memory::get_c_str(args->keyword.keywords.data[0]->value.symbol)); - if (args->keyword.values.data[0]) { - printf(" ("); - print(args->keyword.values.data[0], true); - printf(")"); - } - for (int i = 1; i < args->keyword.values.next_index; ++i) { - printf(", %s", - Memory::get_c_str(args->keyword.keywords.data[i]->value.symbol)); - if (args->keyword.values.data[i]) { - printf(" ("); - print(args->keyword.values.data[i], true); - printf(")"); - } - } - } - printf("}\n"); - printf("Rest: {"); - if (args->rest) - printf("%s", - Memory::get_c_str(args->rest->value.symbol)); - printf("}\n"); - - } - return Memory::nil; - }; - define((show n), "TODO") { - profile_with_name("(show)"); - fetch(n); - try assert_type(n, Lisp_Object_Type::Function); - try assert(n->value.function->is_c); - puts("body:\n"); - print(n->value.function->body.lisp_body); - puts("\n"); - printf("parent_env: %lld\n", - (long long)n->value.function->parent_environment); - - return Memory::nil; - }; - define((addr-of var), "TODO") { - profile_with_name("(addr-of-var)"); - fetch(var); - return Memory::create_lisp_object( - (float)((u64)&(var))); - }; - define((generate-docs file_name), "TODO") { - profile_with_name("(generate-docs)"); - fetch(file_name); - try assert_type(file_name, Lisp_Object_Type::String); - in_caller_env { - try generate_docs(file_name->value.string); - } - return Memory::t; - }; - define((print (:sep " ") (:end "\n") . things), "TODO") { - profile_with_name("(print)"); - fetch(sep, end, things); - - if (things != Memory::nil) { - print(things->value.pair.first); - - for_lisp_list(things->value.pair.rest) { - print(sep); - print(it); - } - } - - print(end); - return Memory::nil; - }; - define((read (:prompt ">")), "TODO") { - profile_with_name("(read)"); - fetch(prompt); - print(prompt); - - // TODO(Felix): make read_line return a String* - char* line = read_line(); - defer { - free(line); - }; - String* strLine = Memory::create_string(line); - return Memory::create_lisp_object(strLine); - }; - define((exit (:code 0)), "TODO") { - profile_with_name("(exit)"); - fetch(code); - try assert_type(code, Lisp_Object_Type::Number); - Slime::Memory::free_everything(); - exit((int)code->value.number); - }; - define((break), "TODO") { - profile_with_name("(break)"); - in_caller_env { - print_environment(get_current_environment()); - } - return Memory::nil; - }; - define((memstat), "TODO") { - profile_with_name("(memstat)"); - Memory::print_status(); - return Memory::nil; - }; - define_special((mytry try_part catch_part), "TODO") { - profile_with_name("(mytry)"); - fetch(try_part, catch_part); - - Lisp_Object* result; - - in_caller_env { - ignore_logging { - dont_break_on_errors { - result = eval_expr(try_part); - if (Globals::error) { - delete_error(); - try result = eval_expr(catch_part); - } - } - } - } - return result; - }; - define((load file), "TODO") { - profile_with_name("(load)"); - fetch(file); - try assert_type(file, Lisp_Object_Type::String); - - Lisp_Object* result; - in_caller_env { - try result = built_in_load(file->value.string); - } - return result; - }; - define((import f), "TODO") { - profile_with_name("(import)"); - fetch(f); - try assert_type(f, Lisp_Object_Type::String); - - Lisp_Object *result; - in_caller_env { - try result = built_in_import(f->value.string); - } - - return Memory::t; - }; - define((copy obj), "TODO") { - profile_with_name("(copy)"); - fetch(obj); - // TODO(Felix): if we are copying string nodes, then - // shouldn't the string itself also get copied?? - return Memory::copy_lisp_object(obj); - }; - define((error type message), "TODO") { - profile_with_name("(error)"); - fetch(type, message); - // TODO(Felix): make the error function useful - try assert_type(type, Lisp_Object_Type::Keyword); - try assert_type(message, Lisp_Object_Type::String); - - using Globals::error; - error = new(Error); - error->type = type; - error->message = message->value.string; - - create_generic_error("Userlanderror"); - return nullptr; - }; - define((symbol->keyword sym), "TODO") { - profile_with_name("(symbol->keyword)"); - fetch(sym); - try assert_type(sym, Lisp_Object_Type::Symbol); - return Memory::get_keyword(sym->value.symbol); - }; - define((string->symbol str), "TODO") { - profile_with_name("(string->symbol)"); - fetch(str); - // TODO(Felix): do some sanity checks on the string. For - // example, numbers are not valid symbols. - - try assert_type(str, Lisp_Object_Type::String); - return Memory::get_symbol(Memory::duplicate_string(str->value.string)); - }; - define((symbol->string sym), "TODO") { - profile_with_name("(symbol->string)"); - fetch(sym); - - try assert_type(sym, Lisp_Object_Type::Symbol); - return Memory::create_lisp_object( - Memory::duplicate_string(sym->value.symbol)); - }; - define((concat-strings . strings), "TODO") { - profile_with_name("(concat-strings)"); - fetch(strings); - - int resulting_string_len = 0; - for_lisp_list (strings) { - try assert_type(it, Lisp_Object_Type::String); - resulting_string_len += it->value.string->length; - } - - String* resulting_string = Memory::create_string("", resulting_string_len); - int index_in_string = 0; - - for_lisp_list (strings) { - strcpy((&resulting_string->data)+index_in_string, - Memory::get_c_str(it->value.string)); - index_in_string += it->value.string->length; - } - - return Memory::create_lisp_object(resulting_string); - }; - return nullptr; - } -} + return nullptr; + }; + define_special((define-syntax form (:doc "") . body), "TODO") { + profile_with_name("(define-syntax)"); + fetch(form, doc, body); + + try assert_type(doc, Lisp_Object_Type::String); + // if no doc string, we dont have to store it + if (Memory::get_c_str(doc)[0] == '\0') { + doc = nullptr; + } + + if (Memory::get_type(form) != Lisp_Object_Type::Pair) { + create_parsing_error("You can only create function macros."); + return nullptr; + } + + Lisp_Object* symbol = form->value.pair.first; + Lisp_Object* lambdalist = form->value.pair.rest; + + // creating new lisp object and setting type + Lisp_Object* func; + try func = Memory::create_lisp_object_function(Lisp_Function_Type::Macro); + if (doc) func->docstring = doc->value.string; + + in_caller_env { + // setting parent env + func->value.function->parent_environment = get_current_environment(); + create_arguments_from_lambda_list_and_inject(lambdalist, func); + func->value.function->body.lisp_body = maybe_wrap_body_in_begin(body); + define_symbol(symbol, func); + } + return Memory::nil; + }; + define((mutate target source), "TODO") { + profile_with_name("(mutate)"); + fetch(target, source); + + if (target == Memory::nil || + target == Memory::t || + Memory::get_type(target) == Lisp_Object_Type::Keyword || + Memory::get_type(target) == Lisp_Object_Type::Symbol) + { + create_generic_error("You cannot mutate to nil, t, keywords or symbols because they have to be unique"); + } + + if (source == Memory::nil || + source == Memory::t || + Memory::get_type(source) == Lisp_Object_Type::Keyword || + Memory::get_type(source) == Lisp_Object_Type::Symbol) + { + create_generic_error("You cannot mutate nil, t, keywords or symbols"); + } + + *target = *source; + return target; + }; + define((vector-length v), "TODO") { + profile_with_name("(vector-length)"); + fetch(v); + try assert_type(v, Lisp_Object_Type::Vector); + return Memory::create_lisp_object((double)v->value.vector.length); + }; + define((vector-ref vec idx), "TODO") { + profile_with_name("(vector-ref)"); + fetch(vec, idx); + + try assert_type(vec, Lisp_Object_Type::Vector); + try assert_type(idx, Lisp_Object_Type::Number); + + int int_idx = ((int)idx->value.number); + + try assert(int_idx >= 0); + try assert(int_idx < vec->value.vector.length); + + return vec->value.vector.data+int_idx; + }; + define((vector-set! vec idx val), "TODO") { + profile_with_name("(vector-set!)"); + fetch(vec, idx, val); + + try assert_type(vec, Lisp_Object_Type::Vector); + try assert_type(idx, Lisp_Object_Type::Number); + + int int_idx = ((int)idx->value.number); + + try assert(int_idx >= 0); + try assert(int_idx < vec->value.vector.length); + + vec->value.vector.data[int_idx] = *val; + + return val; + }; + define_special((set! sym val), "TODO") { + profile_with_name("(set!)"); + fetch(sym, val); + + try assert_type(sym, Lisp_Object_Type::Symbol); + Environment* target_env; + in_caller_env { + val = eval_expr(val); + target_env = find_binding_environment(sym, get_current_environment()); + if (!target_env) + target_env = get_root_environment(); + } + + + push_environment(target_env); + define_symbol(sym, val); + pop_environment(); + + return val; + }; + define((set-car! target source), "TODO") { + profile_with_name("(set-car!)"); + fetch(target, source); + + try assert_type(target, Lisp_Object_Type::Pair); + + *target->value.pair.first = *source; + return source; + }; + define((set-cdr! target source), "TODO") { + profile_with_name("(set-cdr!)"); + fetch(target, source); + + try assert_type(target, Lisp_Object_Type::Pair); + + *target->value.pair.rest = *source; + return source; + }; + define_special((quote datum), "TODO") { + profile_with_name("(quote)"); + fetch(datum); + return datum; + }; + define_special((quasiquote expr), "TODO") { + profile_with_name("(quasiquote)"); + fetch(expr); + Lisp_Object* quasiquote_sym = Memory::get_symbol("quasiquote"); + Lisp_Object* unquote_sym = Memory::get_symbol("unquote"); + Lisp_Object* unquote_splicing_sym = Memory::get_symbol("unquote-splicing"); + // NOTE(Felix): first we have to initialize the variable + // with a garbage lambda, so that we can then overwrite it + // a recursive lambda + const auto unquoteSomeExpressions = [&] (const auto & self, Lisp_Object* expr) -> Lisp_Object* { + // if it is an atom, return it + if (Memory::get_type(expr) != Lisp_Object_Type::Pair) + return Memory::copy_lisp_object(expr); + + // it is a pair! + Lisp_Object* originalPair = expr->value.pair.first; + + // if we find quasiquote, uhu + if (originalPair == quasiquote_sym) + return expr; + + if (originalPair == unquote_sym || originalPair == unquote_splicing_sym) + { + // eval replace the stuff + + Lisp_Object* ret; + in_caller_env { + try ret = eval_expr(expr->value.pair.rest->value.pair.first); + } + + return ret; + } + + // it is a list but not starting with the symbol + // unquote, so search in there for stuff to unquote. + // While copying the list + + //NOTE(Felix): Of fucking course we have to copy the + // list. The quasiquote will be part of the body of a + // funciton, we can't just modify it because otherwise + // we modify the body of the function and would bake + // in the result... + Lisp_Object* newPair = Memory::nil; + Lisp_Object* newPairHead = newPair; + Lisp_Object* head = expr; + + while (Memory::get_type(head) == Lisp_Object_Type::Pair) { + // if it is ,@ we have to actually do more work + // and inline the result + if (Memory::get_type(head->value.pair.first) == Lisp_Object_Type::Pair && + head->value.pair.first->value.pair.first == unquote_splicing_sym) + { + Lisp_Object* spliced = self(self, head->value.pair.first); + + if (spliced == Memory::nil) { + head = head->value.pair.rest; + continue; + } + + try assert_type(spliced, Lisp_Object_Type::Pair); + if (newPair == Memory::nil) { + try newPair = Memory::create_lisp_object_pair(Memory::nil, Memory::nil); + newPairHead = newPair; + } else { + try newPairHead->value.pair.rest = Memory::create_lisp_object_pair(Memory::nil, Memory::nil); + newPairHead = newPairHead->value.pair.rest; + newPairHead->value.pair.first = spliced->value.pair.first; + newPairHead->value.pair.rest = spliced->value.pair.rest; + + // now skip to the end + while (newPairHead->value.pair.rest != Memory::nil) { + newPairHead = newPairHead->value.pair.rest; + } + } + + } else { + if (newPair == Memory::nil) { + try newPair = Memory::create_lisp_object_pair(Memory::nil, Memory::nil); + newPairHead = newPair; + } else { + try newPairHead->value.pair.rest = Memory::create_lisp_object_pair(Memory::nil, Memory::nil); + newPairHead = newPairHead->value.pair.rest; + } + newPairHead->value.pair.first = self(self, head->value.pair.first); + } + + // if (Memory::get_type(head->value.pair.rest) != Lisp_Object_Type::Pair) { + // break; + // } + + head = head->value.pair.rest; + + } + newPairHead->value.pair.rest = Memory::nil; + + return newPair; + }; + + expr = unquoteSomeExpressions(unquoteSomeExpressions, expr); + return expr; + }; + define_special((and . args), "TODO") { + profile_with_name("(and)"); + fetch(args); + bool result = true; + in_caller_env { + for_lisp_list (args) { + try result &= is_truthy(it); + if (!result) + return Memory::nil; + } + } + return Memory::t; + }; + define_special((or . args), "TODO") { + profile_with_name("(or)"); + fetch(args); + bool result = false; + in_caller_env { + for_lisp_list (args) { + try result |= is_truthy(it); + if (result) + return Memory::t; + } + } + return Memory::nil; + }; + define_special((not test), "TODO") { + profile_with_name("(not)"); + fetch(test); + bool truthy; + in_caller_env { + try truthy = is_truthy(test); + } + return (truthy) ? Memory::nil : Memory::t; + }; + // // // defun("while", "TODO", __LINE__, cLambda { + // // // try arguments_length = list_length(arguments); + // // // try assert(arguments_length >= 2); + + // // // Lisp_Object* condition_part = arguments->value.pair.first; + // // // Lisp_Object* condition; + // // // Lisp_Object* then_part = arguments->value.pair.rest; + // // // Lisp_Object* wrapped_then_part; + + // // // try wrapped_then_part = Memory::create_lisp_object_pair( + // // // Memory::get_symbol("begin"), + // // // then_part); + + // // // Lisp_Object* result = Memory::nil; + + // // // while (true) { + // // // try condition = eval_expr(condition_part); + + // // // if (condition == Memory::nil) + // // // break; + + // // // try result = eval_expr(wrapped_then_part); + // // // } + // // // return result; + + // // // }); + define_special((lambda args . body), "TODO") { + profile_with_name("(lambda)"); + fetch(args, body); + + // creating new lisp object and setting type + Lisp_Object* func; + try func = Memory::create_lisp_object_function(Lisp_Function_Type::Lambda); + + in_caller_env { + func->value.function->parent_environment = get_current_environment(); + } + + try create_arguments_from_lambda_list_and_inject(args, func); + func->value.function->body.lisp_body = maybe_wrap_body_in_begin(body); + return func; + }; + define((list . args), "TODO") { + profile_with_name("(list)"); + fetch(args); + return args; + }; + define((hash-map . args), "TODO") { + profile_with_name("(hash-map)"); + fetch(args); + Lisp_Object* ret; + try ret = Memory::create_lisp_object_hash_map(); + for_lisp_list (args) { + try assert_type(head->value.pair.rest, Lisp_Object_Type::Pair); + head = head->value.pair.rest; + ret->value.hashMap->set_object(it, head->value.pair.first); + } + + return ret; + }; + define((hash-map-get hm key), "TODO") { + profile_with_name("(hash-map-get)"); + fetch(hm, key); + try assert_type(hm, Lisp_Object_Type::HashMap); + + Lisp_Object* ret = (Lisp_Object*)hm->value.hashMap->get_object(key); + if (!ret) + create_symbol_undefined_error("The key was not set in the hashmap"); + + return ret; + }; + define((hash-map-set! hm key value), "TODO") { + profile_with_name("(hash-map-set!)"); + fetch(hm, key, value); + try assert_type(hm, Lisp_Object_Type::HashMap); + hm->value.hashMap->set_object(key, value); + return Memory::nil; + }; + define((hash-map-delete! hm key), "TODO") { + profile_with_name("(hash-map-delete!)"); + fetch(hm, key); + try assert_type(hm, Lisp_Object_Type::HashMap); + hm->value.hashMap->delete_object(key); + return Memory::nil; + }; + define((vector . args), "TODO") { + profile_with_name("(vector)"); + fetch(args); + Lisp_Object* ret; + int length = list_length(args); + try ret = Memory::create_lisp_object_vector(length, args); + return ret; + }; + define((pair car cdr), "TODO") { + profile_with_name("(pair)"); + fetch(car, cdr); + + Lisp_Object* ret; + try ret = Memory::create_lisp_object_pair(car, cdr); + return ret; + }; + define((first seq), "TODO") { + profile_with_name("(first)"); + fetch(seq); + if (seq == Memory::nil) + return Memory::nil; + try assert_type(seq, Lisp_Object_Type::Pair); + return seq->value.pair.first; + }; + define((rest seq), "TODO") { + profile_with_name("(rest)"); + fetch(seq); + if (seq == Memory::nil) + return Memory::nil; + try assert_type(seq, Lisp_Object_Type::Pair); + return seq->value.pair.rest; + }; + define((set-type! node new_type), "TODO") { + profile_with_name("(set-type!)"); + fetch(node, new_type); + try assert_type(new_type, Lisp_Object_Type::Keyword); + node->userType = new_type; + return node; + }; + define((delete-type! n), "TODO") { + profile_with_name("(delete-type!)"); + fetch(n); + n->userType = nullptr; + return Memory::t; + }; + define((type n), "TODO") { + profile_with_name("(type)"); + fetch(n); + + if (n->userType) { + return n->userType; + } + + Lisp_Object_Type type = Memory::get_type(n); + + switch (type) { + case Lisp_Object_Type::Continuation: return Memory::get_keyword("continuation"); + case Lisp_Object_Type::Function: { + Function* fun = n->value.function; + if (fun->is_c) { + switch (fun->type.c_function_type) { + case C_Function_Type::cMacro: return Memory::get_keyword("cMacro"); + case C_Function_Type::cFunction: return Memory::get_keyword("cFunction"); + case C_Function_Type::cSpecial: return Memory::get_keyword("cSpecial"); + default: return Memory::get_keyword("c??"); + } + } else { + switch (fun->type.lisp_function_type) { + case Lisp_Function_Type::Lambda: return Memory::get_keyword("lambda"); + case Lisp_Function_Type::Macro: return Memory::get_keyword("macro"); + default: return Memory::get_keyword("??"); + } + } + } + case Lisp_Object_Type::HashMap: return Memory::get_keyword("hashmap"); + case Lisp_Object_Type::Keyword: return Memory::get_keyword("keyword"); + case Lisp_Object_Type::Nil: return Memory::get_keyword("nil"); + case Lisp_Object_Type::Number: return Memory::get_keyword("number"); + case Lisp_Object_Type::Pair: return Memory::get_keyword("pair"); + case Lisp_Object_Type::Pointer: return Memory::get_keyword("pointer"); + case Lisp_Object_Type::String: return Memory::get_keyword("string"); + case Lisp_Object_Type::Symbol: return Memory::get_keyword("symbol"); + case Lisp_Object_Type::T: return Memory::get_keyword("t"); + case Lisp_Object_Type::Vector: return Memory::get_keyword("vector"); + } + return Memory::get_keyword("unknown"); + }; + // define((mem-reset), "TODO") { + // profile_with_name("(mem-reset)"); + // Memory::reset(); + // return Memory::nil; + // }; + define_special((info n), "TODO") + { + // NOTE(Felix): we need to define_special because the docstring is + // attached to the symbol. Because some object are singletons + // (symbols, keyowrds, nil, t) we dont want to store docs on the + // object. Otherwise (define k :doc "hallo" :keyword) would modify + // // the global keyword + profile_with_name("(info)"); + fetch(n); + print(n); + + Lisp_Object* type; + Lisp_Object* val; + in_caller_env { + try type = eval_expr(Memory::create_list(Memory::get_symbol("type"), n)); + try val = eval_expr(n); + } + + printf(" is of type "); + print(type); + printf(" (internal: %s)", Lisp_Object_Type_to_string(Memory::get_type(val))); + printf("\nand is printed as: "); + print(val); + printf("\n\ndocs: \n %s\n", + (val->docstring) + ? Memory::get_c_str(val->docstring) + : "No docs avaliable"); + + if (Memory::get_type(val) == Lisp_Object_Type::Function) + { + Arguments* args = &val->value.function->args; + + + printf("Arguments:\n==========\n"); + printf("Postitional: {"); + if (args->positional.symbols.next_index != 0) { + printf("%s", + Memory::get_c_str(args->positional.symbols.data[0]->value.symbol)); + for (int i = 1; i < args->positional.symbols.next_index; ++i) { + printf(", %s", + Memory::get_c_str(args->positional.symbols.data[i]->value.symbol)); + } + } + printf("}\n"); + printf("Keyword: {"); + if (args->keyword.values.next_index != 0) { + printf("%s", + Memory::get_c_str(args->keyword.keywords.data[0]->value.symbol)); + if (args->keyword.values.data[0]) { + printf(" ("); + print(args->keyword.values.data[0], true); + printf(")"); + } + for (int i = 1; i < args->keyword.values.next_index; ++i) { + printf(", %s", + Memory::get_c_str(args->keyword.keywords.data[i]->value.symbol)); + if (args->keyword.values.data[i]) { + printf(" ("); + print(args->keyword.values.data[i], true); + printf(")"); + } + } + } + printf("}\n"); + printf("Rest: {"); + if (args->rest) + printf("%s", + Memory::get_c_str(args->rest->value.symbol)); + printf("}\n"); + + } + return Memory::nil; + }; + define((show n), "TODO") { + profile_with_name("(show)"); + fetch(n); + try assert_type(n, Lisp_Object_Type::Function); + try assert(!n->value.function->is_c); + puts("body:\n"); + print(n->value.function->body.lisp_body); + puts("\n"); + printf("parent_env: %lld\n", + (long long)n->value.function->parent_environment); + + return Memory::nil; + }; + define((addr-of var), "TODO") { + profile_with_name("(addr-of-var)"); + fetch(var); + return Memory::create_lisp_object( + (float)((u64)&(var))); + }; + define((generate-docs file_name), "TODO") { + profile_with_name("(generate-docs)"); + fetch(file_name); + try assert_type(file_name, Lisp_Object_Type::String); + in_caller_env { + try generate_docs(file_name->value.string); + } + return Memory::t; + }; + define((print (:sep " ") (:end "\n") . things), "TODO") { + profile_with_name("(print)"); + fetch(sep, end, things); + + if (things != Memory::nil) { + print(things->value.pair.first); + + for_lisp_list(things->value.pair.rest) { + print(sep); + print(it); + } + } + + print(end); + return Memory::nil; + }; + define((read (:prompt ">")), "TODO") { + profile_with_name("(read)"); + fetch(prompt); + print(prompt); + + // TODO(Felix): make read_line return a String* + char* line = read_line(); + defer { + free(line); + }; + String* strLine = Memory::create_string(line); + return Memory::create_lisp_object(strLine); + }; + define((exit (:code 0)), "TODO") { + profile_with_name("(exit)"); + fetch(code); + try assert_type(code, Lisp_Object_Type::Number); + Slime::Memory::free_everything(); + exit((int)code->value.number); + }; + define((break), "TODO") { + profile_with_name("(break)"); + in_caller_env { + print_environment(get_current_environment()); + } + return Memory::nil; + }; + define((memstat), "TODO") { + profile_with_name("(memstat)"); + Memory::print_status(); + return Memory::nil; + }; + define_special((mytry try_part catch_part), "TODO") { + profile_with_name("(mytry)"); + fetch(try_part, catch_part); + + Lisp_Object* result; + + in_caller_env { + ignore_logging { + dont_break_on_errors { + result = eval_expr(try_part); + if (Globals::error) { + delete_error(); + try result = eval_expr(catch_part); + } + } + } + } + return result; + }; + define((load file), "TODO") { + profile_with_name("(load)"); + fetch(file); + try assert_type(file, Lisp_Object_Type::String); + + Lisp_Object* result; + in_caller_env { + try result = built_in_load(file->value.string); + } + return result; + }; + define((import f), "TODO") { + profile_with_name("(import)"); + fetch(f); + try assert_type(f, Lisp_Object_Type::String); + + Lisp_Object *result; + in_caller_env { + try result = built_in_import(f->value.string); + } + + return Memory::t; + }; + define((copy obj), "TODO") { + profile_with_name("(copy)"); + fetch(obj); + // TODO(Felix): if we are copying string nodes, then + // shouldn't the string itself also get copied?? + return Memory::copy_lisp_object(obj); + }; + define((error type message), "TODO") { + profile_with_name("(error)"); + fetch(type, message); + // TODO(Felix): make the error function useful + try assert_type(type, Lisp_Object_Type::Keyword); + try assert_type(message, Lisp_Object_Type::String); + + using Globals::error; + error = new(Error); + error->type = type; + error->message = message->value.string; + + create_generic_error("Userlanderror"); + return nullptr; + }; + define((symbol->keyword sym), "TODO") { + profile_with_name("(symbol->keyword)"); + fetch(sym); + try assert_type(sym, Lisp_Object_Type::Symbol); + return Memory::get_keyword(sym->value.symbol); + }; + define((string->symbol str), "TODO") { + profile_with_name("(string->symbol)"); + fetch(str); + // TODO(Felix): do some sanity checks on the string. For + // example, numbers are not valid symbols. + + try assert_type(str, Lisp_Object_Type::String); + return Memory::get_symbol(Memory::duplicate_string(str->value.string)); + }; + define((symbol->string sym), "TODO") { + profile_with_name("(symbol->string)"); + fetch(sym); + + try assert_type(sym, Lisp_Object_Type::Symbol); + return Memory::create_lisp_object( + Memory::duplicate_string(sym->value.symbol)); + }; + define((concat-strings . strings), "TODO") { + profile_with_name("(concat-strings)"); + fetch(strings); + + int resulting_string_len = 0; + for_lisp_list (strings) { + try assert_type(it, Lisp_Object_Type::String); + resulting_string_len += it->value.string->length; + } + + String* resulting_string = Memory::create_string("", resulting_string_len); + int index_in_string = 0; + + for_lisp_list (strings) { + strcpy((&resulting_string->data)+index_in_string, + Memory::get_c_str(it->value.string)); + index_in_string += it->value.string->length; + } + + return Memory::create_lisp_object(resulting_string); + }; + return nullptr; + } +} diff --git a/src/define_macros.hpp b/src/define_macros.hpp index 30b5b65..5683dde 100644 --- a/src/define_macros.hpp +++ b/src/define_macros.hpp @@ -1,156 +1,156 @@ -#define concat_( a, b) a##b -#define label(prefix, lnum) concat_(prefix,lnum) - -#define log_location() \ - do { \ - if (Globals::log_level == Log_Level::Debug) { \ - printf("in"); \ - int spacing = 30-((int)strlen(__FILE__) + (int)log10(__LINE__));\ - if (spacing < 1) spacing = 1; \ - for (int i = 0; i < spacing;++i) \ - printf(" "); \ - printf("%s (%d) ", __FILE__, __LINE__); \ - printf("-> %s\n",__FUNCTION__); \ - } \ - } while(0) - -#define if_error_log_location_and_return(val) \ - do { \ - if (Globals::error) { \ - log_location(); \ - return val; \ - } \ - } while(0) - -#ifdef _DEBUG -#define try_or_else_return(val) \ - if (1) \ - goto label(body,__LINE__); \ - else \ - while (1) \ - if (1) { \ - if (Globals::error) { \ - log_location(); \ - return val; \ - } \ - break; \ - } \ - else label(body,__LINE__): - ; -#else -#define try_or_else_return(val) -#endif - -#define try_struct try_or_else_return({}) -#define try_void try_or_else_return() -#define try try_or_else_return(0) - -#define dont_break_on_errors fluid_let(Globals::breaking_on_errors, false) -#define ignore_logging fluid_let(Globals::log_level, Log_Level::None) - -#define fetch1(var) \ - Lisp_Object* var##_symbol = Memory::get_symbol(#var); \ - Lisp_Object* var = lookup_symbol(var##_symbol, get_current_environment()); \ - if_error_log_location_and_return(nullptr) - -#define fetch2(var1, var2) fetch1(var1); fetch1(var2) -#define fetch3(var1, var2, var3) fetch2(var1, var2); fetch1(var3) -#define fetch4(var1, var2, var3, var4) fetch3(var1, var2, var3); fetch1(var4) -#define fetch5(var1, var2, var3, var4, var5) fetch4(var1, var2, var3, var4); fetch1(var5) -#define fetch6(var1, var2, var3, var4, var5, var6) fetch5(var1, var2, var3, var4, var5); fetch1(var6) -#define fetch7(var1, var2, var3, var4, var5, var6, var7) fetch6(var1, var2, var3, var4, var5, var6); fetch1(var7) -#define fetch8(var1, var2, var3, var4, var5, var6, var7, var8) fetch7(var1, var2, var3, var4, var5, var6, var7); fetch1(var8) -#define fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9) fetch8(var1, var2, var3, var4, var5, var6, var7, var8); fetch1(var9) -#define fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10) fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9); fetch1(var10) -#define fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11) fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10); fetch1(var11) -#define fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11); fetch1(var12) -#define fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13) fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12); fetch1(var13) -#define fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14) fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13); fetch1(var14) -#define fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15) fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14); fetch1(var15) -#define fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16) fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15); fetch1(var16) -#define fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17) fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16); fetch1(var17) -#define fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18) fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17); fetch1(var18) -#define fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19) fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18); fetch1(var19) -#define fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20) fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19); fetch1(var20) -#define fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21) fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20); fetch1(var21) -#define fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22) fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21); fetch1(var22) -#define fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23) fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22); fetch1(var23) -#define fetch24(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23, var24) fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23); fetch1(var24) - -#define GET_MACRO( \ - _1, _2, _3, _4, _5, _6, \ - _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, \ - _19, _20, _21, _22, _23, _24, \ - NAME, ...) NAME -#ifdef _MSC_VER -#define EXPAND( x ) x -#define fetch(...) EXPAND( \ - GET_MACRO( \ - __VA_ARGS__, \ - fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ - fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ - fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ - fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ - )(__VA_ARGS__)) -#else -#define fetch(...) \ - GET_MACRO( \ - __VA_ARGS__, \ - fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ - fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ - fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ - fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ - )(__VA_ARGS__) -#endif - -// NOTE(Felix): we have to copy the string because we need it to be -// mutable for the parser to work, because the parser relys on being -// able to temporaily put in markers in the code and also it will fill -// out the source code location -#define _define_helper(def, docs, type, ending) \ - Parser::parser_file = file_name_built_ins; \ - Parser::parser_line = __LINE__; \ - Parser::parser_col = 0; \ - auto label(params,__LINE__) = Parser::parse_single_expression( \ - Memory::get_c_str(Memory::create_string(#def))); \ - if_error_log_location_and_return(nullptr); \ - assert_type(label(params,__LINE__), Lisp_Object_Type::Pair); \ - assert_type(label(params,__LINE__)->value.pair.first, Lisp_Object_Type::Symbol); \ - auto label(sym,__LINE__) = label(params,__LINE__)->value.pair.first; \ - auto label(sfun,__LINE__) = Memory::create_lisp_object_cfunction(type); \ - create_arguments_from_lambda_list_and_inject(label(params,__LINE__)->value.pair.rest, label(sfun,__LINE__)); \ - if_error_log_location_and_return(nullptr); \ - label(sfun,__LINE__)->docstring = Memory::create_string(docs); \ - label(sfun,__LINE__)->value.function->parent_environment = get_current_environment(); \ - define_symbol(label(sym,__LINE__), label(sfun,__LINE__)); \ - label(sfun,__LINE__)->value.function->body. ending - -#define define(def, docs) _define_helper(def, docs, Slime::C_Function_Type::cFunction, c_body = []() -> Lisp_Object*) -#define define_special(def, docs) _define_helper(def, docs, Slime::C_Function_Type::cSpecial, c_body = []() -> Lisp_Object*) -#define define_macro(def, docs) _define_helper(def, docs, Slime::C_Function_Type::cMacro, c_macro_body = []() -> void) - -#define in_caller_env fluid_let( \ - Globals::Current_Execution::envi_stack.next_index, \ - Globals::Current_Execution::envi_stack.next_index-1) - - -/* - * iterate over lisp vectors - */ -#define for_lisp_vector(v) \ - if (!v); else \ - if (int it_index = 0); else \ - for (auto it = v->value.vector.data; \ - it_index < v->value.vector.length; \ - it=v->value.vector.data+(++it_index)) - -/* - * iterate over lisp lists - */ -#define for_lisp_list(l) \ - if (!l); else \ - if (int it_index = 0); else \ - for (Lisp_Object* head = l, *it; \ - Memory::get_type(head) == Lisp_Object_Type::Pair && (it = head->value.pair.first); \ - head = head->value.pair.rest, ++it_index) +#define concat_( a, b) a##b +#define label(prefix, lnum) concat_(prefix,lnum) + +#define log_location() \ + do { \ + if (Globals::log_level == Log_Level::Debug) { \ + printf("in"); \ + int spacing = 30-((int)strlen(__FILE__) + (int)log10(__LINE__));\ + if (spacing < 1) spacing = 1; \ + for (int i = 0; i < spacing;++i) \ + printf(" "); \ + printf("%s (%d) ", __FILE__, __LINE__); \ + printf("-> %s\n",__FUNCTION__); \ + } \ + } while(0) + +#define if_error_log_location_and_return(val) \ + do { \ + if (Globals::error) { \ + log_location(); \ + return val; \ + } \ + } while(0) + +#ifdef _DEBUG +#define try_or_else_return(val) \ + if (1) \ + goto label(body,__LINE__); \ + else \ + while (1) \ + if (1) { \ + if (Globals::error) { \ + log_location(); \ + return val; \ + } \ + break; \ + } \ + else label(body,__LINE__): + ; +#else +#define try_or_else_return(val) +#endif + +#define try_struct try_or_else_return({}) +#define try_void try_or_else_return() +#define try try_or_else_return(0) + +#define dont_break_on_errors fluid_let(Globals::breaking_on_errors, false) +#define ignore_logging fluid_let(Globals::log_level, Log_Level::None) + +#define fetch1(var) \ + Lisp_Object* var##_symbol = Memory::get_symbol(#var); \ + Lisp_Object* var = lookup_symbol(var##_symbol, get_current_environment()); \ + if_error_log_location_and_return(nullptr) + +#define fetch2(var1, var2) fetch1(var1); fetch1(var2) +#define fetch3(var1, var2, var3) fetch2(var1, var2); fetch1(var3) +#define fetch4(var1, var2, var3, var4) fetch3(var1, var2, var3); fetch1(var4) +#define fetch5(var1, var2, var3, var4, var5) fetch4(var1, var2, var3, var4); fetch1(var5) +#define fetch6(var1, var2, var3, var4, var5, var6) fetch5(var1, var2, var3, var4, var5); fetch1(var6) +#define fetch7(var1, var2, var3, var4, var5, var6, var7) fetch6(var1, var2, var3, var4, var5, var6); fetch1(var7) +#define fetch8(var1, var2, var3, var4, var5, var6, var7, var8) fetch7(var1, var2, var3, var4, var5, var6, var7); fetch1(var8) +#define fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9) fetch8(var1, var2, var3, var4, var5, var6, var7, var8); fetch1(var9) +#define fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10) fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9); fetch1(var10) +#define fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11) fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10); fetch1(var11) +#define fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11); fetch1(var12) +#define fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13) fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12); fetch1(var13) +#define fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14) fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13); fetch1(var14) +#define fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15) fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14); fetch1(var15) +#define fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16) fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15); fetch1(var16) +#define fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17) fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16); fetch1(var17) +#define fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18) fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17); fetch1(var18) +#define fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19) fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18); fetch1(var19) +#define fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20) fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19); fetch1(var20) +#define fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21) fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20); fetch1(var21) +#define fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22) fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21); fetch1(var22) +#define fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23) fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22); fetch1(var23) +#define fetch24(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23, var24) fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23); fetch1(var24) + +#define GET_MACRO( \ + _1, _2, _3, _4, _5, _6, \ + _7, _8, _9, _10, _11, _12, \ + _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, \ + NAME, ...) NAME +#ifdef _MSC_VER +#define EXPAND( x ) x +#define fetch(...) EXPAND( \ + GET_MACRO( \ + __VA_ARGS__, \ + fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ + fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ + fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ + fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ + )(__VA_ARGS__)) +#else +#define fetch(...) \ + GET_MACRO( \ + __VA_ARGS__, \ + fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ + fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ + fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ + fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ + )(__VA_ARGS__) +#endif + +// NOTE(Felix): we have to copy the string because we need it to be +// mutable for the parser to work, because the parser relys on being +// able to temporaily put in markers in the code and also it will fill +// out the source code location +#define _define_helper(def, docs, type, ending) \ + Parser::parser_file = file_name_built_ins; \ + Parser::parser_line = __LINE__; \ + Parser::parser_col = 0; \ + auto label(params,__LINE__) = Parser::parse_single_expression( \ + Memory::get_c_str(Memory::create_string(#def))); \ + if_error_log_location_and_return(nullptr); \ + assert_type(label(params,__LINE__), Lisp_Object_Type::Pair); \ + assert_type(label(params,__LINE__)->value.pair.first, Lisp_Object_Type::Symbol); \ + auto label(sym,__LINE__) = label(params,__LINE__)->value.pair.first; \ + auto label(sfun,__LINE__) = Memory::create_lisp_object_cfunction(type); \ + create_arguments_from_lambda_list_and_inject(label(params,__LINE__)->value.pair.rest, label(sfun,__LINE__)); \ + if_error_log_location_and_return(nullptr); \ + label(sfun,__LINE__)->docstring = Memory::create_string(docs); \ + label(sfun,__LINE__)->value.function->parent_environment = get_current_environment(); \ + define_symbol(label(sym,__LINE__), label(sfun,__LINE__)); \ + label(sfun,__LINE__)->value.function->body. ending + +#define define(def, docs) _define_helper(def, docs, Slime::C_Function_Type::cFunction, c_body = []() -> Lisp_Object*) +#define define_special(def, docs) _define_helper(def, docs, Slime::C_Function_Type::cSpecial, c_body = []() -> Lisp_Object*) +#define define_macro(def, docs) _define_helper(def, docs, Slime::C_Function_Type::cMacro, c_macro_body = []() -> void) + +#define in_caller_env fluid_let( \ + Globals::Current_Execution::envi_stack.next_index, \ + Globals::Current_Execution::envi_stack.next_index-1) + + +/* + * iterate over lisp vectors + */ +#define for_lisp_vector(v) \ + if (!v); else \ + if (int it_index = 0); else \ + for (auto it = v->value.vector.data; \ + it_index < v->value.vector.length; \ + it=v->value.vector.data+(++it_index)) + +/* + * iterate over lisp lists + */ +#define for_lisp_list(l) \ + if (!l); else \ + if (int it_index = 0); else \ + for (Lisp_Object* head = l, *it; \ + Memory::get_type(head) == Lisp_Object_Type::Pair && (it = head->value.pair.first); \ + head = head->value.pair.rest, ++it_index) diff --git a/src/defines.cpp b/src/defines.cpp index 0e20eaf..9d09ce9 100644 --- a/src/defines.cpp +++ b/src/defines.cpp @@ -1,23 +1,23 @@ -#define proc auto - -#ifdef _DEBUG -# define if_debug if constexpr (true) -#else -# define if_debug if constexpr (false) -#endif - -#ifdef _MSC_VER -# define debug_break() if_debug __debugbreak() -# define if_windows if constexpr (true) -# define if_linux if constexpr (false) -#else -# define debug_break() if_debug raise(SIGTRAP) -# define if_windows if constexpr (false) -# define if_linux if constexpr (true) -#endif - -#define console_normal "\x1B[0m" -#define console_red "\x1B[31m" -#define console_green "\x1B[32m" -#define console_cyan "\x1B[36m" - +#define proc auto + +#ifdef _DEBUG +# define if_debug if constexpr (true) +#else +# define if_debug if constexpr (false) +#endif + +#ifdef _MSC_VER +# define debug_break() if_debug __debugbreak() +# define if_windows if constexpr (true) +# define if_linux if constexpr (false) +#else +# define debug_break() if_debug raise(SIGTRAP) +# define if_windows if constexpr (false) +# define if_linux if constexpr (true) +#endif + +#define console_normal "\x1B[0m" +#define console_red "\x1B[31m" +#define console_green "\x1B[32m" +#define console_cyan "\x1B[36m" + diff --git a/src/docgeneration.cpp b/src/docgeneration.cpp index cdc3f3a..433a5d0 100644 --- a/src/docgeneration.cpp +++ b/src/docgeneration.cpp @@ -1,142 +1,142 @@ -namespace Slime { - proc generate_docs(String* path) -> void { - FILE *f = fopen(Memory::get_c_str(path), "w"); - if (!f) { - create_generic_error("The file for writing the documentation (%s) " - "could not be opened for writing.", Memory::get_c_str(path)); - return; - } - defer { - fclose(f); - }; - - Array_List visited; - - const auto print_this_env = [&](const auto& rec, Environment* env, char* prefix) -> void { - bool we_already_printed = false; - // TODO(Felix): Make a generic array_list_contains function - for(auto it : visited) { - if (it == env) { - we_already_printed = true; - break; - } - } - if (!we_already_printed) { - // printf("Working on env::::"); - // print_environment(env); - // printf("\n--------------------------------\n"); - visited.append(env); - - push_environment(env); - defer { - pop_environment(); - }; - - for_hash_map(env->hm) { - try_void fprintf(f, - "#+latex: \\hrule\n" - "#+html:
\n" - "* =%s%s= \n" - " :PROPERTIES:\n" - " :UNNUMBERED: t\n" - " :END:" - ,prefix, Memory::get_c_str(((Lisp_Object*)key)->value.symbol)); - /* - * sourcecodeLocation - */ - if (value->sourceCodeLocation) { - try_void fprintf(f, "\n - defined in :: =%s:%d:%d=", - Memory::get_c_str(value->sourceCodeLocation->file), - value->sourceCodeLocation->line, - value->sourceCodeLocation->column); - } - /* - * type - */ - Lisp_Object_Type type = Memory::get_type(value); - Lisp_Object* LOtype; - Lisp_Object* type_expr = Memory::create_list(Memory::get_symbol("type"), value); - try_void LOtype = eval_expr(type_expr); - - fprintf(f, "\n - type :: ="); - print(LOtype, true, f); - fprintf(f, "="); - - - /* - * if printable value -> print it - */ - switch (type) { - case(Lisp_Object_Type::Nil): - case(Lisp_Object_Type::T): - case(Lisp_Object_Type::Number): - case(Lisp_Object_Type::String): - case(Lisp_Object_Type::Pair): - case(Lisp_Object_Type::Symbol): - case(Lisp_Object_Type::Keyword): { - fprintf(f, "\n - value :: ="); - print(value, true, f); - fprintf(f, "="); - } break; - default: break; - } - /* - * if function then print arguments - */ - if (type == Lisp_Object_Type::Function) - { - Arguments* args = &value->value.function->args; - fprintf(f, "\n - arguments :: "); - // if no args at all - if (args->positional.symbols.next_index == 0 && - args->keyword.values.next_index == 0 && - !args->rest) - { - fprintf(f, "none."); - } else { - if (args->positional.symbols.next_index != 0) { - fprintf(f, "\n - postitional :: "); - fprintf(f, "=%s=", Memory::get_c_str(args->positional.symbols.data[0]->value.symbol)); - for (int i = 1; i < args->positional.symbols.next_index; ++i) { - fprintf(f, ", =%s=", Memory::get_c_str(args->positional.symbols.data[i]->value.symbol)); - } - } - if (args->keyword.values.next_index != 0) { - fprintf(f, "\n - keyword :: "); - fprintf(f, "=%s=", Memory::get_c_str(args->keyword.keywords.data[0]->value.symbol)); - if (args->keyword.values.data[0]) { - fprintf(f, " =("); - print(args->keyword.values.data[0], true, f); - fprintf(f, ")="); - } - for (int i = 1; i < args->keyword.values.next_index; ++i) { - fprintf(f, ", =%s=", Memory::get_c_str(args->keyword.keywords.data[i]->value.symbol)); - if (args->keyword.values.data[i]) { - fprintf(f, " =("); - print(args->keyword.values.data[i], true, f); - fprintf(f, ")="); - } - } - } - if (args->rest) { - fprintf(f, "\n - rest :: =%s=", Memory::get_c_str(args->rest->value.symbol)); - } - } - } - fprintf(f, "\n - docu :: "); - if (value->docstring) - fprintf(f, "\n #+BEGIN:\n%s\n #+END:\n", - Memory::get_c_str(value->docstring)); - else - fprintf(f, "none\n"); - } - } - - for (int i = 0; i < env->parents.next_index; ++i) { - try_void rec(rec, env->parents.data[i], prefix); - } - }; - - print_this_env(print_this_env, get_current_environment(), (char*)""); - } -} +namespace Slime { + proc generate_docs(String* path) -> void { + FILE *f = fopen(Memory::get_c_str(path), "w"); + if (!f) { + create_generic_error("The file for writing the documentation (%s) " + "could not be opened for writing.", Memory::get_c_str(path)); + return; + } + defer { + fclose(f); + }; + + Array_List visited; + + const auto print_this_env = [&](const auto& rec, Environment* env, char* prefix) -> void { + bool we_already_printed = false; + // TODO(Felix): Make a generic array_list_contains function + for(auto it : visited) { + if (it == env) { + we_already_printed = true; + break; + } + } + if (!we_already_printed) { + // printf("Working on env::::"); + // print_environment(env); + // printf("\n--------------------------------\n"); + visited.append(env); + + push_environment(env); + defer { + pop_environment(); + }; + + for_hash_map(env->hm) { + try_void fprintf(f, + "#+latex: \\hrule\n" + "#+html:
\n" + "* =%s%s= \n" + " :PROPERTIES:\n" + " :UNNUMBERED: t\n" + " :END:" + ,prefix, Memory::get_c_str(((Lisp_Object*)key)->value.symbol)); + /* + * sourcecodeLocation + */ + if (value->sourceCodeLocation) { + try_void fprintf(f, "\n - defined in :: =%s:%d:%d=", + Memory::get_c_str(value->sourceCodeLocation->file), + value->sourceCodeLocation->line, + value->sourceCodeLocation->column); + } + /* + * type + */ + Lisp_Object_Type type = Memory::get_type(value); + Lisp_Object* LOtype; + Lisp_Object* type_expr = Memory::create_list(Memory::get_symbol("type"), value); + try_void LOtype = eval_expr(type_expr); + + fprintf(f, "\n - type :: ="); + print(LOtype, true, f); + fprintf(f, "="); + + + /* + * if printable value -> print it + */ + switch (type) { + case(Lisp_Object_Type::Nil): + case(Lisp_Object_Type::T): + case(Lisp_Object_Type::Number): + case(Lisp_Object_Type::String): + case(Lisp_Object_Type::Pair): + case(Lisp_Object_Type::Symbol): + case(Lisp_Object_Type::Keyword): { + fprintf(f, "\n - value :: ="); + print(value, true, f); + fprintf(f, "="); + } break; + default: break; + } + /* + * if function then print arguments + */ + if (type == Lisp_Object_Type::Function) + { + Arguments* args = &value->value.function->args; + fprintf(f, "\n - arguments :: "); + // if no args at all + if (args->positional.symbols.next_index == 0 && + args->keyword.values.next_index == 0 && + !args->rest) + { + fprintf(f, "none."); + } else { + if (args->positional.symbols.next_index != 0) { + fprintf(f, "\n - postitional :: "); + fprintf(f, "=%s=", Memory::get_c_str(args->positional.symbols.data[0]->value.symbol)); + for (int i = 1; i < args->positional.symbols.next_index; ++i) { + fprintf(f, ", =%s=", Memory::get_c_str(args->positional.symbols.data[i]->value.symbol)); + } + } + if (args->keyword.values.next_index != 0) { + fprintf(f, "\n - keyword :: "); + fprintf(f, "=%s=", Memory::get_c_str(args->keyword.keywords.data[0]->value.symbol)); + if (args->keyword.values.data[0]) { + fprintf(f, " =("); + print(args->keyword.values.data[0], true, f); + fprintf(f, ")="); + } + for (int i = 1; i < args->keyword.values.next_index; ++i) { + fprintf(f, ", =%s=", Memory::get_c_str(args->keyword.keywords.data[i]->value.symbol)); + if (args->keyword.values.data[i]) { + fprintf(f, " =("); + print(args->keyword.values.data[i], true, f); + fprintf(f, ")="); + } + } + } + if (args->rest) { + fprintf(f, "\n - rest :: =%s=", Memory::get_c_str(args->rest->value.symbol)); + } + } + } + fprintf(f, "\n - docu :: "); + if (value->docstring) + fprintf(f, "\n #+BEGIN:\n%s\n #+END:\n", + Memory::get_c_str(value->docstring)); + else + fprintf(f, "none\n"); + } + } + + for (int i = 0; i < env->parents.next_index; ++i) { + try_void rec(rec, env->parents.data[i], prefix); + } + }; + + print_this_env(print_this_env, get_current_environment(), (char*)""); + } +} diff --git a/src/env.cpp b/src/env.cpp index ba990ed..0db503f 100644 --- a/src/env.cpp +++ b/src/env.cpp @@ -1,125 +1,125 @@ -namespace Slime { - proc define_symbol(Lisp_Object* symbol, Lisp_Object* value) -> void { - profile_with_comment(&symbol->value.symbol->data); - Environment* env = get_current_environment(); - env->hm.set_object((void*)symbol, value); - } - - inline proc lookup_symbol_in_this_envt(Lisp_Object* sym, Environment* env) -> Lisp_Object* { - return (Lisp_Object*)env->hm.get_object((void*)sym); - } - - proc environment_binds_symbol(Lisp_Object* sym, Environment* env) -> bool { - return lookup_symbol_in_this_envt(sym, env) != nullptr; - } - - proc find_binding_environment(Lisp_Object* sym, Environment* env) -> Environment* { - if (environment_binds_symbol(sym, env)) - return env; - for (auto it : env->parents) { - if (Environment* ret = find_binding_environment(sym, it)) - return ret; - } - return nullptr; - } - - proc try_lookup_symbol(Lisp_Object* node, Environment* env) -> Lisp_Object* { - // first check current environment - - Lisp_Object* result; - result = lookup_symbol_in_this_envt(node, env); - if (result) - return result; - - for (int i = 0; i < env->parents.next_index; ++i) { - result = try_lookup_symbol(node, env->parents.data[i]); - - if (result) - return result; - } - - auto nil_sym = Memory::get_symbol("nil"); - auto t_sym = Memory::get_symbol("t"); - - if (node == nil_sym) { - return Memory::nil; - } - if (node == t_sym) { - return Memory::t; - } - - return nullptr; - } - - inline proc push_environment(Environment* env) -> void { - using namespace Globals::Current_Execution; - envi_stack.append(env); - } - - inline proc pop_environment() -> void { - using namespace Globals::Current_Execution; - --envi_stack.next_index; - } - - inline proc get_root_environment() -> Environment* { - using namespace Globals::Current_Execution; - return envi_stack.data[0]; - } - - inline proc get_current_environment() -> Environment* { - using namespace Globals::Current_Execution; - return envi_stack.data[envi_stack.next_index-1]; - } - - proc lookup_symbol(Lisp_Object* node, Environment* env) -> Lisp_Object* { - profile_with_comment(&node->value.symbol->data); - // print(node); - assert_type(node, Lisp_Object_Type::Symbol); - - Lisp_Object* result = try_lookup_symbol(node, env); - - if (result) - return result; - - String* identifier = node->value.symbol; - print_environment(env); - printf("\n"); - create_symbol_undefined_error("The symbol '%s' is not defined.", &identifier->data); - return nullptr; - } - - - proc print_environment_indent(Environment* env, int indent) -> void { - proc print_indent = [](int indent) { - for (int i = 0; i < indent; ++i) { - printf(" "); - } - }; - - if(env == get_root_environment()) { - print_indent(indent); - printf("[built-ins]-Environment (%lld)\n", (long long)env); - return; - } - - for_hash_map (env->hm) { - print_indent(indent); - printf("-> %s :: ", &(((Lisp_Object*)key)->value.symbol->data)); - print((Lisp_Object*)value); - printf(" (0x%016llx)", (unsigned long long)value); - puts(""); - } - for (int i = 0; i < env->parents.next_index; ++i) { - print_indent(indent); - printf("parent (0x%016llx)", (long long)env->parents.data[i]); - puts(":"); - print_environment_indent(env->parents.data[i], indent+4); - } - } - - proc print_environment(Environment* env) -> void { - printf("\n=== Environment === (0x%016llx)\n", (long long)env); - print_environment_indent(env, 0); - } - -} +namespace Slime { + proc define_symbol(Lisp_Object* symbol, Lisp_Object* value) -> void { + profile_with_comment(&symbol->value.symbol->data); + Environment* env = get_current_environment(); + env->hm.set_object((void*)symbol, value); + } + + inline proc lookup_symbol_in_this_envt(Lisp_Object* sym, Environment* env) -> Lisp_Object* { + return (Lisp_Object*)env->hm.get_object((void*)sym); + } + + proc environment_binds_symbol(Lisp_Object* sym, Environment* env) -> bool { + return lookup_symbol_in_this_envt(sym, env) != nullptr; + } + + proc find_binding_environment(Lisp_Object* sym, Environment* env) -> Environment* { + if (environment_binds_symbol(sym, env)) + return env; + for (auto it : env->parents) { + if (Environment* ret = find_binding_environment(sym, it)) + return ret; + } + return nullptr; + } + + proc try_lookup_symbol(Lisp_Object* node, Environment* env) -> Lisp_Object* { + // first check current environment + + Lisp_Object* result; + result = lookup_symbol_in_this_envt(node, env); + if (result) + return result; + + for (int i = 0; i < env->parents.next_index; ++i) { + result = try_lookup_symbol(node, env->parents.data[i]); + + if (result) + return result; + } + + auto nil_sym = Memory::get_symbol("nil"); + auto t_sym = Memory::get_symbol("t"); + + if (node == nil_sym) { + return Memory::nil; + } + if (node == t_sym) { + return Memory::t; + } + + return nullptr; + } + + inline proc push_environment(Environment* env) -> void { + using namespace Globals::Current_Execution; + envi_stack.append(env); + } + + inline proc pop_environment() -> void { + using namespace Globals::Current_Execution; + --envi_stack.next_index; + } + + inline proc get_root_environment() -> Environment* { + using namespace Globals::Current_Execution; + return envi_stack.data[0]; + } + + inline proc get_current_environment() -> Environment* { + using namespace Globals::Current_Execution; + return envi_stack.data[envi_stack.next_index-1]; + } + + proc lookup_symbol(Lisp_Object* node, Environment* env) -> Lisp_Object* { + profile_with_comment(&node->value.symbol->data); + // print(node); + assert_type(node, Lisp_Object_Type::Symbol); + + Lisp_Object* result = try_lookup_symbol(node, env); + + if (result) + return result; + + String* identifier = node->value.symbol; + print_environment(env); + printf("\n"); + create_symbol_undefined_error("The symbol '%s' is not defined.", &identifier->data); + return nullptr; + } + + + proc print_environment_indent(Environment* env, int indent) -> void { + proc print_indent = [](int indent) { + for (int i = 0; i < indent; ++i) { + printf(" "); + } + }; + + if(env == get_root_environment()) { + print_indent(indent); + printf("[built-ins]-Environment (%lld)\n", (long long)env); + return; + } + + for_hash_map (env->hm) { + print_indent(indent); + printf("-> %s :: ", &(((Lisp_Object*)key)->value.symbol->data)); + print((Lisp_Object*)value); + printf(" (0x%016llx)", (unsigned long long)value); + puts(""); + } + for (int i = 0; i < env->parents.next_index; ++i) { + print_indent(indent); + printf("parent (0x%016llx)", (long long)env->parents.data[i]); + puts(":"); + print_environment_indent(env->parents.data[i], indent+4); + } + } + + proc print_environment(Environment* env) -> void { + printf("\n=== Environment === (0x%016llx)\n", (long long)env); + print_environment_indent(env, 0); + } + +} diff --git a/src/error.cpp b/src/error.cpp index da73efa..02537eb 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -1,57 +1,57 @@ -namespace Slime { - - proc delete_error() -> void { - using Globals::error; - - free(error); - error = nullptr; - } - - proc create_error(const char* c_func_name,const char* c_file_name, int c_file_line, Lisp_Object* type, String* message) -> void { - delete_error(); - if (Globals::breaking_on_errors) { - debug_break(); - } - - using Globals::error; - error = (Error*)malloc(sizeof(Error)) ; - error->type = type; - error->message = message; - - log_error(); - if (Globals::log_level > Log_Level::None) { - // c error location - printf("in"); - int spacing = 30-((int)strlen(c_file_name) + (int)log10(c_file_line)); - if (spacing < 1) spacing = 1; - for (int i = 0; i < spacing; ++i) - printf(" "); - printf("%s (%d) ", c_file_name, c_file_line); - printf("-> %s\n", c_func_name); - } - - // visualize_lisp_machine(); - } - - proc create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, const char* format, ...) -> void { - using Globals::error; - - int length = 200; - String* formatted_string = Memory::create_string("", length); - if (error) { - error = new(Error); - error->type = type; - } - int written_length; - va_list args; - char* out_msg; - va_start(args, format); - written_length = vasprintf(&out_msg, format, args); - va_end(args); - - formatted_string->length = written_length; - strcpy(&formatted_string->data, out_msg); - free(out_msg); - create_error(c_func_name, c_file_name, c_file_line, type, formatted_string); - } -} +namespace Slime { + + proc delete_error() -> void { + using Globals::error; + + free(error); + error = nullptr; + } + + proc create_error(const char* c_func_name,const char* c_file_name, int c_file_line, Lisp_Object* type, String* message) -> void { + delete_error(); + if (Globals::breaking_on_errors) { + debug_break(); + } + + using Globals::error; + error = (Error*)malloc(sizeof(Error)) ; + error->type = type; + error->message = message; + + log_error(); + if (Globals::log_level > Log_Level::None) { + // c error location + printf("in"); + int spacing = 30-((int)strlen(c_file_name) + (int)log10(c_file_line)); + if (spacing < 1) spacing = 1; + for (int i = 0; i < spacing; ++i) + printf(" "); + printf("%s (%d) ", c_file_name, c_file_line); + printf("-> %s\n", c_func_name); + } + + // visualize_lisp_machine(); + } + + proc create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, const char* format, ...) -> void { + using Globals::error; + + int length = 200; + String* formatted_string = Memory::create_string("", length); + if (error) { + error = new(Error); + error->type = type; + } + int written_length; + va_list args; + char* out_msg; + va_start(args, format); + written_length = vasprintf(&out_msg, format, args); + va_end(args); + + formatted_string->length = written_length; + strcpy(&formatted_string->data, out_msg); + free(out_msg); + create_error(c_func_name, c_file_name, c_file_line, type, formatted_string); + } +} diff --git a/src/eval.cpp b/src/eval.cpp index ede473a..b80b1e1 100644 --- a/src/eval.cpp +++ b/src/eval.cpp @@ -1,618 +1,619 @@ -namespace Slime { - - proc create_extended_environment_for_function_application_nrc( - // TODO(Felix): pass cs as value as soon as we got rid of - // destructors, to prevent destroying it on scope exit - Array_List* cs, - Lisp_Object* function, - int arg_start, - int arg_count) -> Environment* - { - profile_this(); - - bool is_c_function = function->value.function->is_c; - Environment* new_env = Memory::create_child_environment(function->value.function->parent_environment); - Arguments* arg_spec = &function->value.function->args; - - // NOTE(Felix): Step 1. - // - setting the parent environment - // - setting the arg_spec - // - potentially evaluating the arguments - - // NOTE(Felix): Even though we will return the environment at the - // end, for defining symbols here for the parameters, it has to be - // on the envi stack. - push_environment(new_env); - defer { - pop_environment(); - }; - - // NOTE(Felix): Step 2. - // Reading the argument spec and fill in the environment - // for the function call - - Lisp_Object* sym, *val; // used as temp storage to use `try` - Array_List read_in_keywords; - read_in_keywords.alloc(); +namespace Slime { + + proc create_extended_environment_for_function_application_nrc( + // TODO(Felix): pass cs as value as soon as we got rid of + // destructors, to prevent destroying it on scope exit + Array_List* cs, + Lisp_Object* function, + int arg_start, + int arg_end) -> Environment* + { + profile_this(); + + int arg_pos = arg_start; + bool is_c_function = function->value.function->is_c; + Environment* new_env = Memory::create_child_environment(function->value.function->parent_environment); + Arguments* arg_spec = &function->value.function->args; + + // NOTE(Felix): Step 1. + // - setting the parent environment + // - setting the arg_spec + // - potentially evaluating the arguments + + // NOTE(Felix): Even though we will return the environment at the + // end, for defining symbols here for the parameters, it has to be + // on the envi stack. + push_environment(new_env); + defer { + pop_environment(); + }; + + // NOTE(Felix): Step 2. + // Reading the argument spec and fill in the environment + // for the function call + + Lisp_Object* sym, *val; // used as temp storage to use `try` + Array_List read_in_keywords; + read_in_keywords.alloc(); defer { read_in_keywords.dealloc(); }; - int obligatory_keywords_count = 0; - int read_obligatory_keywords_count = 0; - - Lisp_Object* next_arg = cs->data[arg_start]; - - proc read_positional_args = [&] { - for (int i = 0; i < arg_spec->positional.symbols.next_index; ++i) { - if (arg_count == 0) { - create_parsing_error("Wrong number of arguments."); - return; - } - // NOTE(Felix): We have to copy all the arguments, - // otherwise we change the program code. - // XXX(Felix): T C functions we pass by reference. - // TODO(Felix): Why did we decide this?? - sym = arg_spec->positional.symbols.data[i]; - if (is_c_function) { - define_symbol(sym, next_arg); - } else { - define_symbol( - sym, - Memory::copy_lisp_object_except_pairs(next_arg)); - } - next_arg = cs->data[++arg_start]; - --arg_count; - } - }; - - proc read_keyword_args = [&] { - // debug_break(); - // keyword arguments: use all given ones and keep track of the - // added ones (array list), if end of parameters in encountered or - // something that is not a keyword is encountered or a keyword - // that is not recognized is encoutered, jump out of the loop. - - if (arg_count == 0) { - return; - } - - // find out how many keyword args we /have/ to read - for (int i = 0; i < arg_spec->keyword.values.next_index; ++i) { - if (arg_spec->keyword.values.data[i] == nullptr) - ++obligatory_keywords_count; - else - break; - } - - while (Memory::get_type(next_arg) == Lisp_Object_Type::Keyword) { - // check if this one is even an accepted keyword - bool accepted = false; - for (int i = 0; i < arg_spec->keyword.keywords.next_index; ++i) { - if (next_arg == arg_spec->keyword.keywords.data[i]) - { - accepted = true; - break; - } - } - if (!accepted) { - // NOTE(Felix): if we are actually done with all the - // necessary keywords then we have to count the rest - // as :rest here, instead od always creating an error - // (special case with default variables) - if (read_obligatory_keywords_count == obligatory_keywords_count) - return; - create_generic_error( - "The function does not take the keyword argument ':%s'\n" - "and not all required keyword arguments have been read\n" - "in to potentially count it as the rest argument.", - &(next_arg->value.symbol->data)); - return; - } - - // check if it was already read in - for (int i = 0; i < read_in_keywords.next_index; ++i) { - if (next_arg == read_in_keywords.data[i]) - { - // NOTE(Felix): if we are actually done with all the - // necessary keywords then we have to count the rest - // as :rest here, instead od always creating an error - // (special case with default variables) - if (read_obligatory_keywords_count == obligatory_keywords_count) - return; - create_generic_error( - "The function already read the keyword argument ':%s'", - &(next_arg->value.symbol->data)); - return; - } - } - - // okay so we found a keyword that has to be read in and was - // not already read in, is there a next element to actually - // set it to? - if (arg_count == 0) { - create_generic_error( - "Attempting to set the keyword argument ':%s', but no value was supplied.", - &(next_arg->value.symbol->data)); - return; - } - - // if not set it and then add it to the array list - Lisp_Object* key = next_arg; - try_void sym = Memory::get_symbol(key->value.symbol); - next_arg = cs->data[++arg_start]; - --arg_count; - - // NOTE(Felix): It seems we do not need to evaluate the argument here... - if (is_c_function) { - try_void define_symbol(sym, next_arg); - } else { - try_void define_symbol(sym, - Memory::copy_lisp_object_except_pairs(next_arg)); - } - - read_in_keywords.append(key); - ++read_obligatory_keywords_count; - - // overstep both for next one - next_arg = cs->data[++arg_start]; - --arg_count; - - if (arg_count == 0) { - break; - } - } - }; - - proc check_keyword_args = [&]() -> void { - // check if all necessary keywords have been read in - for (int i = 0; i < arg_spec->keyword.values.next_index; ++i) { - auto defined_keyword = arg_spec->keyword.keywords.data[i]; - bool was_set = false; - for (int j = 0; j < read_in_keywords.next_index; ++j) { - if (read_in_keywords.data[j] == defined_keyword) { - was_set = true; - break; - } - } - if (arg_spec->keyword.values.data[i] == nullptr) { - // if this one does not have a default value - if (!was_set) { - create_generic_error( - "There was no value supplied for the required " - "keyword argument ':%s'.", - &defined_keyword->value.symbol->data); - return; - } - } else { - // this one does have a default value, lets see if we have - // to use it or if the user supplied his own - if (!was_set) { - try_void sym = Memory::get_symbol(defined_keyword->value.symbol); - if (is_c_function) { - try_void val = arg_spec->keyword.values.data[i]; - } else { - try_void val = Memory::copy_lisp_object_except_pairs(arg_spec->keyword.values.data[i]); - } - define_symbol(sym, val); - } - } - } - }; - - proc read_rest_arg = [&]() -> void { - if (arg_count == 0) { - if (arg_spec->rest) { - define_symbol(arg_spec->rest, Memory::nil); - } - } else { - if (arg_spec->rest) { - - Lisp_Object* list; - try_void list = Memory::create_list(next_arg); - Lisp_Object* head = list; - next_arg = cs->data[++arg_start]; - --arg_count; - while (arg_count > 0) { - try_void head->value.pair.rest = Memory::create_list(next_arg); - head = head->value.pair.rest; - next_arg = cs->data[++arg_start]; - --arg_count; - } - define_symbol(arg_spec->rest, list); - } else { - // rest was not declared but additional arguments were found - create_generic_error( - "A rest argument was not declared " - "but the function was called with additional arguments."); - return; - } - } - }; - - try read_positional_args(); - try read_keyword_args(); - try check_keyword_args(); - try read_rest_arg(); - - return new_env; - } - - - proc apply_arguments_to_function(Lisp_Object* arguments, Lisp_Object* function, bool should_evaluate_args) -> Lisp_Object* { - // profile_this(); - // Environment* new_env; - // Lisp_Object* result; - - // try new_env = create_extended_environment_for_function_application(arguments, function, should_evaluate_args); - // push_environment(new_env); - // defer { - // pop_environment(); - // }; - - - // if (Memory::get_type(function) == Lisp_Object_Type::CFunction) - // // if c function: - // try result = function->value.cFunction->body(); - // else - // // if lisp function - // try result = eval_expr(function->value.function->body); - - // return result; - return nullptr; - } - - proc create_arguments_from_lambda_list_and_inject(Lisp_Object* arguments, Lisp_Object* function) -> void { - /* NOTE This parses the argument specification of funcitons - * into their Function struct. It does this by allocating new - * positional_arguments, keyword_arguments and rest_argument - * and filling it in - */ - Arguments* result = &function->value.function->args;; - - // first init the fields - result->rest = nullptr; - - // okay let's try to read some positional arguments - while (Memory::get_type(arguments) == Lisp_Object_Type::Pair) { - // if we encounter a keyword or a list (for keywords with - // defualt args), the positionals are done - if (Memory::get_type(arguments->value.pair.first) == Lisp_Object_Type::Keyword || - Memory::get_type(arguments->value.pair.first) == Lisp_Object_Type::Pair) { - break; - } - - // if we encounter something that is neither a symbol nor a - // keyword arg, it's an error - if (Memory::get_type(arguments->value.pair.first) != Lisp_Object_Type::Symbol) { - create_parsing_error("Only symbols and keywords " - "(with or without default args) " - "can be parsed here, but found '%s'", - Lisp_Object_Type_to_string(Memory::get_type(arguments->value.pair.first))); - return; - } - - // okay we found an actual symbol - result->positional.symbols.append(arguments->value.pair.first); - - arguments = arguments->value.pair.rest; - } - - // if we reach here, we are on a keyword or a pair wher a keyword - // should be in first - while (Memory::get_type(arguments) == Lisp_Object_Type::Pair) { - if (Memory::get_type(arguments->value.pair.first) == Lisp_Object_Type::Keyword) { - // if we are on a actual keyword (with no default arg) - auto keyword = arguments->value.pair.first; - result->keyword.keywords.append(keyword); - result->keyword.values.append(nullptr); - } else if (Memory::get_type(arguments->value.pair.first) == Lisp_Object_Type::Pair) { - // if we are on a keyword with a default value - - auto keyword = arguments->value.pair.first->value.pair.first; - if (Memory::get_type(keyword) != Lisp_Object_Type::Keyword) { - create_parsing_error("Default args must be keywords"); - } - if (Memory::get_type(arguments->value.pair.first->value.pair.rest) - != Lisp_Object_Type::Pair) - { - create_parsing_error("Default args must be a list of 2."); - } - auto value = arguments->value.pair.first->value.pair.rest->value.pair.first; - try_void value = eval_expr(value); - if (arguments->value.pair.first->value.pair.rest->value.pair.rest != Memory::nil) { - create_parsing_error("Default args must be a list of 2."); - } - - result->keyword.keywords.append(keyword); - result->keyword.values.append(value); - } - arguments = arguments->value.pair.rest; - } - - // Now we are also done with keyword arguments, lets check for - // if there is a rest argument - if (Memory::get_type(arguments) != Lisp_Object_Type::Pair) { - if (arguments == Memory::nil) - return; - if (Memory::get_type(arguments) == Lisp_Object_Type::Symbol) - result->rest = arguments; - else - create_parsing_error("The rest argument must be a symbol."); - } - } - - - proc list_length(Lisp_Object* node) -> int { - if (node == Memory::nil) - return 0; - - assert_type(node, Lisp_Object_Type::Pair); - - int len = 0; - - while (Memory::get_type(node) == Lisp_Object_Type::Pair) { - ++len; - node = node->value.pair.rest; - if (node == Memory::nil) - return len; - } - - create_parsing_error("Can't calculate length of ill formed list."); - return 0; - } - - proc copy_scl(Source_Code_Location*) -> Source_Code_Location* { - // TODO(Felix): - return nullptr; - } - - proc pause() { - printf("\n-----------------------\n" - "Press ENTER to continue\n"); - getchar(); - } - - inline proc maybe_wrap_body_in_begin(Lisp_Object* body) -> Lisp_Object* { - Lisp_Object* begin_symbol = Memory::get_symbol("begin"); - if (body->value.pair.rest == Memory::nil) - return body->value.pair.first; - else - return Memory::create_lisp_object_pair(begin_symbol, body); - } - - proc nrc_eval(Lisp_Object* expr) -> Lisp_Object* { - using namespace Globals::Current_Execution; - - nass.reserve(1); - Array_List* nas = nass.data+(nass.next_index++); - nas->alloc(); - defer { - --nass.next_index; - nas->dealloc(); - }; - - proc debug_step = [&] { - return; - // printf("%d\n", cs.next_index); - printf("cs:\n "); - for (auto lo : cs) { - print(lo, true); - printf("\n "); - } - printf("\npcs:\n "); - for (auto lo : pcs) { - print(lo, true); - printf("\n "); - } - printf("\nnnas:\n "); - for (auto nas: nass) { - printf("nas:\n "); - for (auto na : nas) { - printf(" - %s\n ", [&] - { - switch(na) { - case NasAction::Pop_Environment: return "Pop_Environment"; - case NasAction::Define_Var: return "Define_Var"; - case NasAction::Eval: return "Eval"; - case NasAction::Step: return "Step"; - case NasAction::TM: return "TM"; - case NasAction::Pop: return "Pop"; - case NasAction::If: return "If"; - } - return "??"; - }()); - } - } - printf("\nams:\n "); - for (auto am : ams) { - printf("%d\n ", am); - } - // pause(); - }; - - proc push_pc_on_cs = [&] { - for_lisp_list (pcs.data[pcs.next_index-1]) { - cs.append(it); - } - pcs.data[pcs.next_index-1] = Memory::nil; - }; - - cs.append(expr); - nas->append(NasAction::Eval); - - NasAction current_action; - Lisp_Object* pc; - - while (nas->next_index > 0) { - debug_step(); - - current_action = nas->data[--nas->next_index]; - switch (current_action) { - case NasAction::Pop: { - --cs.next_index; - } break; - case NasAction::Pop_Environment: { - pop_environment(); - } break; - case NasAction::Eval: { - pc = cs.data[cs.next_index-1]; - Lisp_Object_Type type = Memory::get_type(pc); - switch (type) { - case Lisp_Object_Type::Symbol: { - cs.data[cs.next_index-1] = lookup_symbol(pc, get_current_environment()); - } break; - case Lisp_Object_Type::Pair: { - cs.data[cs.next_index-1] = pc->value.pair.first; - ams.append(cs.next_index-1); - pcs.append(pc->value.pair.rest); - nas->append(NasAction::TM); - nas->append(NasAction::Eval); - } break; - default: { - // NOTE(Felix): others are self evaluating - // so do nothing - } - } - } break; - case NasAction::TM: { - pc = cs.data[cs.next_index-1]; - - Lisp_Object_Type type = Memory::get_type(pc); - switch (type) { - case Lisp_Object_Type::Function: { - if(pc->value.function->is_c) { - if (pc->value.function->type.c_function_type == C_Function_Type::cMacro) { - try pc->value.function->body.c_macro_body(); - } else if(pc->value.function->type.c_function_type == C_Function_Type::cSpecial) - { - // TODO(Felix): Why not call the function - // right away, and instead push step, so - // that step calls it? - push_pc_on_cs(); - nas->append(NasAction::Step); - } else { - nas->append(NasAction::Step); - } - } else { - if (pc->value.function->type.lisp_function_type == - Lisp_Function_Type::Macro) - { - push_pc_on_cs(); - nas->append(NasAction::Eval); - nas->append(NasAction::Step); - } else { - nas->append(NasAction::Step); - } - } - } break; - default: { - create_generic_error("The first element of the pair was not a function but: %s", - Lisp_Object_Type_to_string(type)); - return nullptr; - } - } - - } break; - case NasAction::Step: { - if (pcs.data[pcs.next_index-1] == Memory::nil) { - --pcs.next_index; - int am = ams.data[--ams.next_index]; - Lisp_Object* function = cs.data[am]; - assert_type(function, Lisp_Object_Type::Function); - Environment* extended_env = - create_extended_environment_for_function_application_nrc( - &cs, function, am+1, cs.next_index-am-1); - cs.next_index = am; - push_environment(extended_env); - if (function->value.function->is_c) { - if (function->value.function->type.c_function_type == C_Function_Type::cMacro) - try function->value.function->body.c_macro_body(); - else - try cs.append(function->value.function->body.c_body()); - pop_environment(); - } else { - nas->append(NasAction::Pop_Environment); - nas->append(NasAction::Eval); - cs.append(function->value.function->body.lisp_body); - } - } else { - cs.append(pcs.data[pcs.next_index-1]->value.pair.first); - pcs.data[pcs.next_index-1] = pcs.data[pcs.next_index-1]->value.pair.rest; - nas->append(NasAction::Step); - nas->append(NasAction::Eval); - } - } break; - case NasAction::If: { - /* | | - | | - | | - | .... | */ - cs.next_index -= 2; - // NOTE(Felix): for false it is sufficent to pop 2 for - // true we have to copy the then part to the new top - // of the stack - if (cs.data[cs.next_index+1] != Memory::nil) { - cs.data[cs.next_index-1] = cs.data[cs.next_index]; - } - } break; - case NasAction::Define_Var: { - /* | | - | | - | .... | */ - cs.next_index -= 1; - try assert_type(cs.data[cs.next_index-1], Lisp_Object_Type::Symbol); - try define_symbol(cs.data[cs.next_index-1], cs.data[cs.next_index]); - cs.data[cs.next_index-1] = Memory::t; - } - } - - } - // debug_step(); - - return cs.data[--cs.next_index]; - } - - proc eval_expr(Lisp_Object* node) -> Lisp_Object* { - return nrc_eval(node); - } - - proc is_truthy(Lisp_Object* expression) -> bool { - Lisp_Object* result; - try result = eval_expr(expression); - - return result != Memory::nil; - } - - proc interprete_file (char* file_name) -> Lisp_Object* { - try Memory::init(4096 * 256); - - Lisp_Object* result; - - try result = built_in_load(Memory::create_string(file_name)); - - return result; - } - - proc interprete_stdin() -> void { - try_void Memory::init(4096 * 256* 100); - - printf("Welcome to the lispy interpreter.\n"); - - char* line; - - Lisp_Object* parsed, * evaluated; - while (true) { - delete_error(); - fputs("> ", stdout); - line = read_expression(); - try_void parsed = Parser::parse_single_expression(line); - free(line); - try_void evaluated = nrc_eval(parsed); - // try_void evaluated = eval_expr(parsed); - if (evaluated != Memory::nil) { - print(evaluated); - fputs("\n", stdout); - } - } - } -} + int obligatory_keywords_count = 0; + int read_obligatory_keywords_count = 0; + + Lisp_Object* next_arg = cs->data[arg_pos]; + + proc read_positional_args = [&] { + for (int i = 0; i < arg_spec->positional.symbols.next_index; ++i) { + sym = arg_spec->positional.symbols.data[i]; + if (arg_pos == arg_end) { + create_parsing_error( + "Not enough positional args supplied. Needed: %d suppied, %d.\n" + "Next missing arg is '%s'", + arg_spec->positional.symbols.next_index, arg_end-arg_pos, + &sym->value.symbol->data); + return; + } + // NOTE(Felix): We have to copy all the arguments, + // otherwise we change the program code. + // XXX(Felix): T C functions we pass by reference. + // TODO(Felix): Why did we decide this?? + if (is_c_function) { + define_symbol(sym, next_arg); + } else { + define_symbol( + sym, + Memory::copy_lisp_object_except_pairs(next_arg)); + } + next_arg = cs->data[++arg_pos]; + } + }; + + proc read_keyword_args = [&] { + // debug_break(); + // keyword arguments: use all given ones and keep track of the + // added ones (array list), if end of parameters in encountered or + // something that is not a keyword is encountered or a keyword + // that is not recognized is encoutered, jump out of the loop. + + if (arg_pos == arg_end) { + return; + } + + // find out how many keyword args we /have/ to read + for (int i = 0; i < arg_spec->keyword.values.next_index; ++i) { + if (arg_spec->keyword.values.data[i] == nullptr) + ++obligatory_keywords_count; + else + break; + } + + while (Memory::get_type(next_arg) == Lisp_Object_Type::Keyword) { + // check if this one is even an accepted keyword + bool accepted = false; + for (int i = 0; i < arg_spec->keyword.keywords.next_index; ++i) { + if (next_arg == arg_spec->keyword.keywords.data[i]) + { + accepted = true; + break; + } + } + if (!accepted) { + // NOTE(Felix): if we are actually done with all the + // necessary keywords then we have to count the rest + // as :rest here, instead od always creating an error + // (special case with default variables) + if (read_obligatory_keywords_count == obligatory_keywords_count) + return; + create_generic_error( + "The function does not take the keyword argument ':%s'\n" + "and not all required keyword arguments have been read\n" + "in to potentially count it as the rest argument.", + &(next_arg->value.symbol->data)); + return; + } + + // check if it was already read in + for (int i = 0; i < read_in_keywords.next_index; ++i) { + if (next_arg == read_in_keywords.data[i]) + { + // NOTE(Felix): if we are actually done with all the + // necessary keywords then we have to count the rest + // as :rest here, instead od always creating an error + // (special case with default variables) + if (read_obligatory_keywords_count == obligatory_keywords_count) + return; + create_generic_error( + "The function already read the keyword argument ':%s'", + &(next_arg->value.symbol->data)); + return; + } + } + + // okay so we found a keyword that has to be read in and was + // not already read in, is there a next element to actually + // set it to? + if (arg_pos == arg_end) { + create_generic_error( + "Attempting to set the keyword argument ':%s', but no value was supplied.", + &(next_arg->value.symbol->data)); + return; + } + + // if not set it and then add it to the array list + Lisp_Object* key = next_arg; + try_void sym = Memory::get_symbol(key->value.symbol); + next_arg = cs->data[++arg_pos]; + + // NOTE(Felix): It seems we do not need to evaluate the argument here... + if (is_c_function) { + try_void define_symbol(sym, next_arg); + } else { + try_void define_symbol(sym, + Memory::copy_lisp_object_except_pairs(next_arg)); + } + + read_in_keywords.append(key); + ++read_obligatory_keywords_count; + + // overstep both for next one + next_arg = cs->data[++arg_pos]; + + if (arg_pos == arg_end) { + break; + } + } + }; + + proc check_keyword_args = [&]() -> void { + // check if all necessary keywords have been read in + for (int i = 0; i < arg_spec->keyword.values.next_index; ++i) { + auto defined_keyword = arg_spec->keyword.keywords.data[i]; + bool was_set = false; + for (int j = 0; j < read_in_keywords.next_index; ++j) { + if (read_in_keywords.data[j] == defined_keyword) { + was_set = true; + break; + } + } + if (arg_spec->keyword.values.data[i] == nullptr) { + // if this one does not have a default value + if (!was_set) { + create_generic_error( + "There was no value supplied for the required " + "keyword argument ':%s'.", + &defined_keyword->value.symbol->data); + return; + } + } else { + // this one does have a default value, lets see if we have + // to use it or if the user supplied his own + if (!was_set) { + try_void sym = Memory::get_symbol(defined_keyword->value.symbol); + if (is_c_function) { + try_void val = arg_spec->keyword.values.data[i]; + } else { + try_void val = Memory::copy_lisp_object_except_pairs(arg_spec->keyword.values.data[i]); + } + define_symbol(sym, val); + } + } + } + }; + + proc read_rest_arg = [&]() -> void { + if (arg_pos == arg_end) { + if (arg_spec->rest) { + define_symbol(arg_spec->rest, Memory::nil); + } + } else { + if (arg_spec->rest) { + + Lisp_Object* list; + try_void list = Memory::create_list(next_arg); + Lisp_Object* head = list; + for (++arg_pos;arg_pos < arg_end; ++arg_pos) { + next_arg = cs->data[arg_pos]; + try_void head->value.pair.rest = Memory::create_list(next_arg); + head = head->value.pair.rest; + } + define_symbol(arg_spec->rest, list); + } else { + // rest was not declared but additional arguments were found + create_generic_error( + "A rest argument was not declared " + "but the function was called with additional arguments."); + return; + } + } + }; + + try read_positional_args(); + try read_keyword_args(); + try check_keyword_args(); + try read_rest_arg(); + + return new_env; + } + + + proc apply_arguments_to_function(Lisp_Object* arguments, Lisp_Object* function, bool should_evaluate_args) -> Lisp_Object* { + // profile_this(); + // Environment* new_env; + // Lisp_Object* result; + + // try new_env = create_extended_environment_for_function_application(arguments, function, should_evaluate_args); + // push_environment(new_env); + // defer { + // pop_environment(); + // }; + + + // if (Memory::get_type(function) == Lisp_Object_Type::CFunction) + // // if c function: + // try result = function->value.cFunction->body(); + // else + // // if lisp function + // try result = eval_expr(function->value.function->body); + + // return result; + return nullptr; + } + + proc create_arguments_from_lambda_list_and_inject(Lisp_Object* arguments, Lisp_Object* function) -> void { + /* NOTE This parses the argument specification of funcitons + * into their Function struct. It does this by allocating new + * positional_arguments, keyword_arguments and rest_argument + * and filling it in + */ + Arguments* result = &function->value.function->args;; + + // first init the fields + result->rest = nullptr; + + // okay let's try to read some positional arguments + while (Memory::get_type(arguments) == Lisp_Object_Type::Pair) { + // if we encounter a keyword or a list (for keywords with + // defualt args), the positionals are done + if (Memory::get_type(arguments->value.pair.first) == Lisp_Object_Type::Keyword || + Memory::get_type(arguments->value.pair.first) == Lisp_Object_Type::Pair) { + break; + } + + // if we encounter something that is neither a symbol nor a + // keyword arg, it's an error + if (Memory::get_type(arguments->value.pair.first) != Lisp_Object_Type::Symbol) { + create_parsing_error("Only symbols and keywords " + "(with or without default args) " + "can be parsed here, but found '%s'", + Lisp_Object_Type_to_string(Memory::get_type(arguments->value.pair.first))); + return; + } + + // okay we found an actual symbol + result->positional.symbols.append(arguments->value.pair.first); + + arguments = arguments->value.pair.rest; + } + + // if we reach here, we are on a keyword or a pair wher a keyword + // should be in first + while (Memory::get_type(arguments) == Lisp_Object_Type::Pair) { + if (Memory::get_type(arguments->value.pair.first) == Lisp_Object_Type::Keyword) { + // if we are on a actual keyword (with no default arg) + auto keyword = arguments->value.pair.first; + result->keyword.keywords.append(keyword); + result->keyword.values.append(nullptr); + } else if (Memory::get_type(arguments->value.pair.first) == Lisp_Object_Type::Pair) { + // if we are on a keyword with a default value + + auto keyword = arguments->value.pair.first->value.pair.first; + if (Memory::get_type(keyword) != Lisp_Object_Type::Keyword) { + create_parsing_error("Default args must be keywords"); + } + if (Memory::get_type(arguments->value.pair.first->value.pair.rest) + != Lisp_Object_Type::Pair) + { + create_parsing_error("Default args must be a list of 2."); + } + auto value = arguments->value.pair.first->value.pair.rest->value.pair.first; + try_void value = eval_expr(value); + if (arguments->value.pair.first->value.pair.rest->value.pair.rest != Memory::nil) { + create_parsing_error("Default args must be a list of 2."); + } + + result->keyword.keywords.append(keyword); + result->keyword.values.append(value); + } + arguments = arguments->value.pair.rest; + } + + // Now we are also done with keyword arguments, lets check for + // if there is a rest argument + if (Memory::get_type(arguments) != Lisp_Object_Type::Pair) { + if (arguments == Memory::nil) + return; + if (Memory::get_type(arguments) == Lisp_Object_Type::Symbol) + result->rest = arguments; + else + create_parsing_error("The rest argument must be a symbol."); + } + } + + + proc list_length(Lisp_Object* node) -> int { + if (node == Memory::nil) + return 0; + + try assert_type(node, Lisp_Object_Type::Pair); + + int len = 0; + + while (Memory::get_type(node) == Lisp_Object_Type::Pair) { + ++len; + node = node->value.pair.rest; + if (node == Memory::nil) + return len; + } + + create_parsing_error("Can't calculate length of ill formed list."); + return 0; + } + + proc copy_scl(Source_Code_Location*) -> Source_Code_Location* { + // TODO(Felix): + return nullptr; + } + + proc pause() { + printf("\n-----------------------\n" + "Press ENTER to continue\n"); + getchar(); + } + + inline proc maybe_wrap_body_in_begin(Lisp_Object* body) -> Lisp_Object* { + Lisp_Object* begin_symbol = Memory::get_symbol("begin"); + if (body->value.pair.rest == Memory::nil) + return body->value.pair.first; + else + return Memory::create_lisp_object_pair(begin_symbol, body); + } + + proc eval_expr(Lisp_Object* expr) -> Lisp_Object* { + using namespace Globals::Current_Execution; + + nass.reserve(1); + Array_List* nas = nass.data+(nass.next_index++); + nas->alloc(); + defer { + --nass.next_index; + nas->dealloc(); + }; + + proc debug_step = [&] { + if (!Globals::debug_log) + return; + printf("\n-------------------\ncs:\n "); + for (int i = 0; i < cs.next_index; ++i) { + char* t = lisp_object_to_string(cs.data[i], true); + printf(" %d: %s\n ", i, t); + defer { free(t); }; + } + printf("\npcs:\n "); + for (auto lo : pcs) { + print(lo, true); + printf("\n "); + } + printf("\nnnas:\n "); + for (auto nas: nass) { + printf("nas:\n "); + for (auto na : nas) { + printf(" - %s\n ", [&] + { + switch(na) { + case NasAction::Pop_Environment: return "Pop_Environment"; + case NasAction::Define_Var: return "Define_Var"; + case NasAction::Eval: return "Eval"; + case NasAction::Step: return "Step"; + case NasAction::TM: return "TM"; + case NasAction::Pop: return "Pop"; + case NasAction::If: return "If"; + } + return "??"; + }()); + } + } + printf("\nams:\n "); + for (auto am : ams) { + printf("%d\n ", am); + } + // pause(); + }; + + proc push_pc_on_cs = [&] { + for_lisp_list (pcs.data[pcs.next_index-1]) { + cs.append(it); + } + pcs.data[pcs.next_index-1] = Memory::nil; + }; + + cs.append(expr); + nas->append(NasAction::Eval); + + NasAction current_action; + Lisp_Object* pc; + + while (nas->next_index > 0) { + debug_step(); + + current_action = nas->data[--nas->next_index]; + switch (current_action) { + case NasAction::Pop: { + --cs.next_index; + } break; + case NasAction::Pop_Environment: { + pop_environment(); + } break; + case NasAction::Eval: { + pc = cs.data[cs.next_index-1]; + Lisp_Object_Type type = Memory::get_type(pc); + switch (type) { + case Lisp_Object_Type::Symbol: { + cs.data[cs.next_index-1] = lookup_symbol(pc, get_current_environment()); + } break; + case Lisp_Object_Type::Pair: { + cs.data[cs.next_index-1] = pc->value.pair.first; + ams.append(cs.next_index-1); + pcs.append(pc->value.pair.rest); + nas->append(NasAction::TM); + nas->append(NasAction::Eval); + } break; + default: { + // NOTE(Felix): others are self evaluating + // so do nothing + } + } + } break; + case NasAction::TM: { + pc = cs.data[cs.next_index-1]; + + Lisp_Object_Type type = Memory::get_type(pc); + switch (type) { + case Lisp_Object_Type::Function: { + if(pc->value.function->is_c) { + if (pc->value.function->type.c_function_type == C_Function_Type::cMacro) { + try pc->value.function->body.c_macro_body(); + } else if(pc->value.function->type.c_function_type == C_Function_Type::cSpecial) + { + // TODO(Felix): Why not call the function + // right away, and instead push step, so + // that step calls it? + push_pc_on_cs(); + nas->append(NasAction::Step); + } else { + nas->append(NasAction::Step); + } + } else { + if (pc->value.function->type.lisp_function_type == + Lisp_Function_Type::Macro) + { + push_pc_on_cs(); + nas->append(NasAction::Eval); + nas->append(NasAction::Step); + } else { + nas->append(NasAction::Step); + } + } + } break; + default: { + char* t = lisp_object_to_string(pc); + defer { + free(t); + }; + create_generic_error("The first element of the pair was not a function but: %s in %s", + Lisp_Object_Type_to_string(type), t); + return nullptr; + } + } + + } break; + case NasAction::Step: { + if (pcs.data[pcs.next_index-1] == Memory::nil) { + --pcs.next_index; + int am = ams.data[--ams.next_index]; + Lisp_Object* function = cs.data[am]; + try assert_type(function, Lisp_Object_Type::Function); + + Environment* extended_env; + try extended_env = create_extended_environment_for_function_application_nrc( + &cs, function, am+1, cs.next_index); + cs.next_index = am; + push_environment(extended_env); + if (function->value.function->is_c) { + if (function->value.function->type.c_function_type == C_Function_Type::cMacro) + try function->value.function->body.c_macro_body(); + else + try cs.append(function->value.function->body.c_body()); + pop_environment(); + } else { + nas->append(NasAction::Pop_Environment); + nas->append(NasAction::Eval); + cs.append(function->value.function->body.lisp_body); + } + } else { + cs.append(pcs.data[pcs.next_index-1]->value.pair.first); + pcs.data[pcs.next_index-1] = pcs.data[pcs.next_index-1]->value.pair.rest; + nas->append(NasAction::Step); + nas->append(NasAction::Eval); + } + } break; + case NasAction::If: { + /* | | + | | + | | + | .... | */ + cs.next_index -= 2; + // NOTE(Felix): for false it is sufficent to pop 2 for + // true we have to copy the then part to the new top + // of the stack + if (cs.data[cs.next_index+1] != Memory::nil) { + cs.data[cs.next_index-1] = cs.data[cs.next_index]; + } + } break; + case NasAction::Define_Var: { + /* | | + | | + | .... | */ + cs.next_index -= 1; + try assert_type(cs.data[cs.next_index-1], Lisp_Object_Type::Symbol); + try define_symbol(cs.data[cs.next_index-1], cs.data[cs.next_index]); + cs.data[cs.next_index-1] = Memory::t; + } + } + + } + // debug_step(); + + return cs.data[--cs.next_index]; + } + + proc is_truthy(Lisp_Object* expression) -> bool { + Lisp_Object* result; + try result = eval_expr(expression); + + return result != Memory::nil; + } + + proc interprete_file (char* file_name) -> Lisp_Object* { + try Memory::init(4096 * 256); + + Lisp_Object* result; + + try result = built_in_load(Memory::create_string(file_name)); + + return result; + } + + proc interprete_stdin() -> void { + try_void Memory::init(4096 * 256* 100); + + printf("Welcome to the lispy interpreter.\n"); + + char* line; + + Lisp_Object* parsed, * evaluated; + while (true) { + delete_error(); + fputs("> ", stdout); + line = read_expression(); + try_void parsed = Parser::parse_single_expression(line); + free(line); + try_void evaluated = eval_expr(parsed); + // try_void evaluated = eval_expr(parsed); + if (evaluated && evaluated != Memory::nil) { + print(evaluated); + } + fputs("\n", stdout); + } + } +} diff --git a/src/forward_decls.cpp b/src/forward_decls.cpp index 790639b..82434c2 100644 --- a/src/forward_decls.cpp +++ b/src/forward_decls.cpp @@ -1,86 +1,87 @@ -namespace Slime { - void add_to_load_path(const char*); - bool lisp_object_equal(Lisp_Object*,Lisp_Object*); - Lisp_Object* built_in_load(String*); - Lisp_Object* built_in_import(String*); - void delete_error(); - void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, const char* format, ...); - void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, String* message); - void create_error(Lisp_Object* type, const char* message, const char* c_file_name, int c_file_line); - Lisp_Object* eval_arguments(Lisp_Object*); - Lisp_Object* eval_expr(Lisp_Object*); - bool is_truthy (Lisp_Object*); - int list_length(Lisp_Object*); - void* load_built_ins_into_environment(); - void create_arguments_from_lambda_list_and_inject(Lisp_Object* formal_arguments, Lisp_Object* function); - - Lisp_Object* lookup_symbol(Lisp_Object* symbol, Environment*); - void define_symbol(Lisp_Object* symbol, Lisp_Object* value); - char* lisp_object_to_string(Lisp_Object* node, bool print_repr); - void print(Lisp_Object* node, bool print_repr = false, FILE* file = stdout); - void print_environment(Environment*); - - bool run_all_tests(); - - inline Environment* get_root_environment(); - inline Environment* get_current_environment(); - inline void push_environment(Environment*); - inline void pop_environment(); - - const char* Lisp_Object_Type_to_string(Lisp_Object_Type type); - - void visualize_lisp_machine(); - void generate_docs(String* path); - void log_error(); - - namespace Memory { - Environment* create_built_ins_environment(); - Lisp_Object* create_lisp_object_cfunction(bool is_special); - inline Lisp_Object_Type get_type(Lisp_Object* node); - void init(int); - char* get_c_str(String*); - void free_everything(); - String* create_string(const char*); - Lisp_Object* get_symbol(String* identifier); - Lisp_Object* get_symbol(const char*); - Lisp_Object* get_keyword(String* identifier); - Lisp_Object* get_keyword(const char*); - Lisp_Object* create_lisp_object(double); - Lisp_Object* create_lisp_object(const char*); - Lisp_Object* create_lisp_object_vector(Lisp_Object*); - Lisp_Object* create_lisp_object_vector(Lisp_Object*, Lisp_Object*); - Lisp_Object* create_lisp_object_vector(Lisp_Object*, Lisp_Object*, Lisp_Object*); - Lisp_Object* create_lisp_object_vector(int, Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); - inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); - } - - namespace Parser { - // extern Environment* environment_for_macros; - - extern String* standard_in; - extern String* parser_file; - extern int parser_line; - extern int parser_col; - - Lisp_Object* parse_expression(char* text, int* index_in_text); - Lisp_Object* parse_single_expression(char* text); - Lisp_Object* parse_single_expression(wchar_t* text); - } - - namespace Globals { - extern char* bin_path; - extern Log_Level log_level; - extern Array_List load_path; - namespace Current_Execution { - extern Array_List call_stack; - extern Array_List envi_stack; - } - extern Error* error; - extern bool breaking_on_errors; - } -} +namespace Slime { + void add_to_load_path(const char*); + bool lisp_object_equal(Lisp_Object*,Lisp_Object*); + Lisp_Object* built_in_load(String*); + Lisp_Object* built_in_import(String*); + void delete_error(); + void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, const char* format, ...); + void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, String* message); + void create_error(Lisp_Object* type, const char* message, const char* c_file_name, int c_file_line); + Lisp_Object* eval_arguments(Lisp_Object*); + Lisp_Object* eval_expr(Lisp_Object*); + bool is_truthy (Lisp_Object*); + int list_length(Lisp_Object*); + void* load_built_ins_into_environment(); + void create_arguments_from_lambda_list_and_inject(Lisp_Object* formal_arguments, Lisp_Object* function); + + Lisp_Object* lookup_symbol(Lisp_Object* symbol, Environment*); + void define_symbol(Lisp_Object* symbol, Lisp_Object* value); + char* lisp_object_to_string(Lisp_Object* node, bool print_repr = true); + void print(Lisp_Object* node, bool print_repr = false, FILE* file = stdout); + void print_environment(Environment*); + + bool run_all_tests(); + + inline Environment* get_root_environment(); + inline Environment* get_current_environment(); + inline void push_environment(Environment*); + inline void pop_environment(); + + const char* Lisp_Object_Type_to_string(Lisp_Object_Type type); + + void visualize_lisp_machine(); + void generate_docs(String* path); + void log_error(); + + namespace Memory { + Environment* create_built_ins_environment(); + Lisp_Object* create_lisp_object_cfunction(bool is_special); + inline Lisp_Object_Type get_type(Lisp_Object* node); + void init(int); + char* get_c_str(String*); + void free_everything(); + String* create_string(const char*); + Lisp_Object* get_symbol(String* identifier); + Lisp_Object* get_symbol(const char*); + Lisp_Object* get_keyword(String* identifier); + Lisp_Object* get_keyword(const char*); + Lisp_Object* create_lisp_object(double); + Lisp_Object* create_lisp_object(const char*); + Lisp_Object* create_lisp_object_vector(Lisp_Object*); + Lisp_Object* create_lisp_object_vector(Lisp_Object*, Lisp_Object*); + Lisp_Object* create_lisp_object_vector(Lisp_Object*, Lisp_Object*, Lisp_Object*); + Lisp_Object* create_lisp_object_vector(int, Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); + inline Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*); + } + + namespace Parser { + // extern Environment* environment_for_macros; + + extern String* standard_in; + extern String* parser_file; + extern int parser_line; + extern int parser_col; + + Lisp_Object* parse_expression(char* text, int* index_in_text); + Lisp_Object* parse_single_expression(char* text); + Lisp_Object* parse_single_expression(wchar_t* text); + } + + namespace Globals { + extern bool debug_log; + extern char* bin_path; + extern Log_Level log_level; + extern Array_List load_path; + namespace Current_Execution { + extern Array_List call_stack; + extern Array_List envi_stack; + } + extern Error* error; + extern bool breaking_on_errors; + } +} diff --git a/src/globals.cpp b/src/globals.cpp index ad83607..a986614 100644 --- a/src/globals.cpp +++ b/src/globals.cpp @@ -1,21 +1,21 @@ -namespace Slime::Globals { - char* bin_path = nullptr; - Log_Level log_level = Log_Level::Debug; - - Array_List load_path; - namespace Current_Execution { - Array_List cs; - Array_List pcs; - Array_List ams; - Array_List> nass; - // Array_List call_stack; - Array_List envi_stack; - } - - Error* error = nullptr; -#ifdef _DONT_BREAK_ON_ERRORS - bool breaking_on_errors = false; -#else - bool breaking_on_errors = true; -#endif -} +namespace Slime::Globals { + char* bin_path = nullptr; + Log_Level log_level = Log_Level::Debug; + bool debug_log = false; + Array_List load_path; + namespace Current_Execution { + Array_List cs; + Array_List pcs; + Array_List ams; + Array_List> nass; + // Array_List call_stack; + Array_List envi_stack; + } + + Error* error = nullptr; +#ifdef _DONT_BREAK_ON_ERRORS + bool breaking_on_errors = false; +#else + bool breaking_on_errors = true; +#endif +} diff --git a/src/io.cpp b/src/io.cpp index bcdd3bb..289a664 100644 --- a/src/io.cpp +++ b/src/io.cpp @@ -1,307 +1,307 @@ -namespace Slime { - proc string_equal(const char input[], const char check[]) -> bool { - if (input == check) return true; - - for(int i = 0; input[i] == check[i]; i++) { - if (input[i] == '\0') - return true; - } - - return false; - } - - proc string_equal(String* str, const char check[]) -> bool { - return string_equal(Memory::get_c_str(str), check); - } - - proc string_equal(const char check[], String* str) -> bool { - return string_equal(Memory::get_c_str(str), check); - } - - proc string_equal(String* str1, String* str2) -> bool { - if (str1 == str2) - return true; - - return string_equal(Memory::get_c_str(str1), Memory::get_c_str(str2)); - } - - proc get_nibble(char c) -> char { - if (c >= 'A' && c <= 'F') - return (c - 'A') + 10; - else if (c >= 'a' && c <= 'f') - return (c - 'a') + 10; - return (c - '0'); - } - - proc escape_string(char* in) -> char* { - // TODO(Felix): add more escape sequences - int i = 0, count = 0; - while (in[i] != '\0') { - switch (in[i]) { - case '\\': - case '\n': - case '\t': - ++count; - default: break; - } - ++i; - } - - char* ret = (char*)malloc((i+count+1)*sizeof(char)); - - // copy in - i = 0; - int j = 0; - while (in[i] != '\0') { - switch (in[i]) { - case '\\': ret[j++] = '\\'; ret[j++] = '\\'; break; - case '\n': ret[j++] = '\\'; ret[j++] = 'n'; break; - case '\t': ret[j++] = '\\'; ret[j++] = 't'; break; - default: ret[j++] = in[i]; - } - ++i; - } - ret[j++] = '\0'; - return ret; - } - - proc unescape_string(char* in) -> int { - if (!in) return 0; - - char *out = in, *p = in; - const char *int_err = nullptr; - - while (*p && !int_err) { - if (*p != '\\') { - /* normal case */ - *out++ = *p++; - } else { - /* escape sequence */ - switch (*++p) { - case '0': *out++ = '\a'; ++p; break; - case 'a': *out++ = '\a'; ++p; break; - case 'b': *out++ = '\b'; ++p; break; - case 'f': *out++ = '\f'; ++p; break; - case 'n': *out++ = '\n'; ++p; break; - case 'r': *out++ = '\r'; ++p; break; - case 't': *out++ = '\t'; ++p; break; - case 'v': *out++ = '\v'; ++p; break; - case '"': - case '\'': - case '\\': - *out++ = *p++; - case '?': - break; - case 'x': - case 'X': - if (!isxdigit(p[1]) || !isxdigit(p[2])) { - create_parsing_error( - "The string '%s' at %s:%d:%d could not be unescaped. " - "(Invalid character on hexadecimal escape at char %d)", - in, Parser::parser_file, Parser::parser_line, Parser::parser_col, - (p+1)-in); - } else { - *out++ = (char)(get_nibble(p[1]) * 0x10 + get_nibble(p[2])); - p += 3; - } - break; - default: - create_parsing_error( - "The string '%s' at %s:%d:%d could not be unescaped. " - "(Unexpected '\\' with no escape sequence at char %d)", - in, Parser::parser_file, Parser::parser_line, Parser::parser_col, - (p+1)-in); - } - } - } - - /* Set the end of string. */ - *out = '\0'; - return (int)(out - in); - } - - proc read_entire_file(char* filename) -> char* { - profile_with_comment(filename); - char *fileContent = nullptr; - FILE *fp = fopen(filename, "r"); - if (fp) { - /* Go to the end of the file. */ - if (fseek(fp, 0L, SEEK_END) == 0) { - /* Get the size of the file. */ - long bufsize = ftell(fp) + 1; - if (bufsize == 0) { - fputs("Empty file", stderr); - goto closeFile; - } - - /* Go back to the start of the file. */ - if (fseek(fp, 0L, SEEK_SET) != 0) { - fputs("Error reading file", stderr); - goto closeFile; - } - - /* Allocate our buffer to that size. */ - fileContent = (char*)calloc(bufsize, sizeof(char)); - - /* Read the entire file into memory. */ - size_t newLen = fread(fileContent, sizeof(char), bufsize, fp); - - fileContent[newLen] = '\0'; - if (ferror(fp) != 0) { - fputs("Error reading file", stderr); - } - } - closeFile: - fclose(fp); - } - - return fileContent; - /* Don't forget to call free() later! */ - } - - proc read_expression() -> char* { - char* line = (char*)malloc(100); - - if(line == nullptr) - return nullptr; - - char* linep = line; - size_t lenmax = 100, len = lenmax; - int c; - - int nesting = 0; - - while (true) { - c = fgetc(stdin); - if(c == EOF) - break; - - if(--len == 0) { - len = lenmax; - char * linen = (char*)realloc(linep, lenmax *= 2); - - if(linen == nullptr) { - free(linep); - return nullptr; - } - line = linen + (line - linep); - linep = linen; - } - - *line = (char)c; - if(*line == '(') - ++nesting; - else if(*line == ')') - --nesting; - else if(*line == '\n') - if (nesting == 0) - break; - line++; - } - (*line)--; // we dont want the \n actually - *line = '\0'; - - return linep; - } - - proc read_line() -> char* { - char* line = (char*)malloc(100), * linep = line; - size_t lenmax = 100, len = lenmax; - int c; - - int nesting = 0; - - if(line == nullptr) - return nullptr; - - for(;;) { - c = fgetc(stdin); - if(c == EOF) - break; - - if(--len == 0) { - len = lenmax; - char* linen = (char*)realloc(linep, lenmax *= 2); - - if(linen == nullptr) { - free(linep); - return nullptr; - } - line = linen + (line - linep); - linep = linen; - } - - *line = (char)c; - if(*line == '(') - ++nesting; - else if(*line == ')') - --nesting; - else if(*line == '\n') - if (nesting == 0) - break; - line++; - } - (*line)--; // we dont want the \n actually - *line = '\0'; - - return linep; - } - - proc log_message(Log_Level type, const char* message) -> void { - if (type > Globals::log_level) - return; - - const char* prefix; - switch (type) { - case Log_Level::Critical: prefix = "CRITICAL"; break; - case Log_Level::Warning: prefix = "WARNING"; break; - case Log_Level::Info: prefix = "INFO"; break; - case Log_Level::Debug: prefix = "DEBUG"; break; - default: return; - } - printf("%s: %s\n",prefix, message); - } - - char* wchar_to_char(const wchar_t* pwchar) { - // get the number of characters in the string. - int currentCharIndex = 0; - char currentChar = (char)pwchar[currentCharIndex]; - - while (currentChar != '\0') - { - currentCharIndex++; - currentChar = (char)pwchar[currentCharIndex]; - } - - const int charCount = currentCharIndex + 1; - - // allocate a new block of memory size char (1 byte) instead of wide char (2 bytes) - char* filePathC = (char*)malloc(sizeof(char) * charCount); - - for (int i = 0; i < charCount; i++) - { - // convert to char (1 byte) - char character = (char)pwchar[i]; - - *filePathC = character; - - filePathC += sizeof(char); - - } - filePathC += '\0'; - - filePathC -= (sizeof(char) * charCount); - - return filePathC; - } - - const wchar_t* char_to_wchar(const char* c) { - const size_t cSize = strlen(c)+1; - wchar_t* wc = new wchar_t[cSize]; - mbstowcs (wc, c, cSize); - - return wc; - } +namespace Slime { + proc string_equal(const char input[], const char check[]) -> bool { + if (input == check) return true; + + for(int i = 0; input[i] == check[i]; i++) { + if (input[i] == '\0') + return true; + } + + return false; + } + + proc string_equal(String* str, const char check[]) -> bool { + return string_equal(Memory::get_c_str(str), check); + } + + proc string_equal(const char check[], String* str) -> bool { + return string_equal(Memory::get_c_str(str), check); + } + + proc string_equal(String* str1, String* str2) -> bool { + if (str1 == str2) + return true; + + return string_equal(Memory::get_c_str(str1), Memory::get_c_str(str2)); + } + + proc get_nibble(char c) -> char { + if (c >= 'A' && c <= 'F') + return (c - 'A') + 10; + else if (c >= 'a' && c <= 'f') + return (c - 'a') + 10; + return (c - '0'); + } + + proc escape_string(char* in) -> char* { + // TODO(Felix): add more escape sequences + int i = 0, count = 0; + while (in[i] != '\0') { + switch (in[i]) { + case '\\': + case '\n': + case '\t': + ++count; + default: break; + } + ++i; + } + + char* ret = (char*)malloc((i+count+1)*sizeof(char)); + + // copy in + i = 0; + int j = 0; + while (in[i] != '\0') { + switch (in[i]) { + case '\\': ret[j++] = '\\'; ret[j++] = '\\'; break; + case '\n': ret[j++] = '\\'; ret[j++] = 'n'; break; + case '\t': ret[j++] = '\\'; ret[j++] = 't'; break; + default: ret[j++] = in[i]; + } + ++i; + } + ret[j++] = '\0'; + return ret; + } + + proc unescape_string(char* in) -> int { + if (!in) return 0; + + char *out = in, *p = in; + const char *int_err = nullptr; + + while (*p && !int_err) { + if (*p != '\\') { + /* normal case */ + *out++ = *p++; + } else { + /* escape sequence */ + switch (*++p) { + case '0': *out++ = '\a'; ++p; break; + case 'a': *out++ = '\a'; ++p; break; + case 'b': *out++ = '\b'; ++p; break; + case 'f': *out++ = '\f'; ++p; break; + case 'n': *out++ = '\n'; ++p; break; + case 'r': *out++ = '\r'; ++p; break; + case 't': *out++ = '\t'; ++p; break; + case 'v': *out++ = '\v'; ++p; break; + case '"': + case '\'': + case '\\': + *out++ = *p++; + case '?': + break; + case 'x': + case 'X': + if (!isxdigit(p[1]) || !isxdigit(p[2])) { + create_parsing_error( + "The string '%s' at %s:%d:%d could not be unescaped. " + "(Invalid character on hexadecimal escape at char %d)", + in, Parser::parser_file, Parser::parser_line, Parser::parser_col, + (p+1)-in); + } else { + *out++ = (char)(get_nibble(p[1]) * 0x10 + get_nibble(p[2])); + p += 3; + } + break; + default: + create_parsing_error( + "The string '%s' at %s:%d:%d could not be unescaped. " + "(Unexpected '\\' with no escape sequence at char %d)", + in, Parser::parser_file, Parser::parser_line, Parser::parser_col, + (p+1)-in); + } + } + } + + /* Set the end of string. */ + *out = '\0'; + return (int)(out - in); + } + + proc read_entire_file(char* filename) -> char* { + profile_with_comment(filename); + char *fileContent = nullptr; + FILE *fp = fopen(filename, "r"); + if (fp) { + /* Go to the end of the file. */ + if (fseek(fp, 0L, SEEK_END) == 0) { + /* Get the size of the file. */ + long bufsize = ftell(fp) + 1; + if (bufsize == 0) { + fputs("Empty file", stderr); + goto closeFile; + } + + /* Go back to the start of the file. */ + if (fseek(fp, 0L, SEEK_SET) != 0) { + fputs("Error reading file", stderr); + goto closeFile; + } + + /* Allocate our buffer to that size. */ + fileContent = (char*)calloc(bufsize, sizeof(char)); + + /* Read the entire file into memory. */ + size_t newLen = fread(fileContent, sizeof(char), bufsize, fp); + + fileContent[newLen] = '\0'; + if (ferror(fp) != 0) { + fputs("Error reading file", stderr); + } + } + closeFile: + fclose(fp); + } + + return fileContent; + /* Don't forget to call free() later! */ + } + + proc read_expression() -> char* { + char* line = (char*)malloc(100); + + if(line == nullptr) + return nullptr; + + char* linep = line; + size_t lenmax = 100, len = lenmax; + int c; + + int nesting = 0; + + while (true) { + c = fgetc(stdin); + if(c == EOF) + break; + + if(--len == 0) { + len = lenmax; + char * linen = (char*)realloc(linep, lenmax *= 2); + + if(linen == nullptr) { + free(linep); + return nullptr; + } + line = linen + (line - linep); + linep = linen; + } + + *line = (char)c; + if(*line == '(') + ++nesting; + else if(*line == ')') + --nesting; + else if(*line == '\n') + if (nesting == 0) + break; + line++; + } + (*line)--; // we dont want the \n actually + *line = '\0'; + + return linep; + } + + proc read_line() -> char* { + char* line = (char*)malloc(100), * linep = line; + size_t lenmax = 100, len = lenmax; + int c; + + int nesting = 0; + + if(line == nullptr) + return nullptr; + + for(;;) { + c = fgetc(stdin); + if(c == EOF) + break; + + if(--len == 0) { + len = lenmax; + char* linen = (char*)realloc(linep, lenmax *= 2); + + if(linen == nullptr) { + free(linep); + return nullptr; + } + line = linen + (line - linep); + linep = linen; + } + + *line = (char)c; + if(*line == '(') + ++nesting; + else if(*line == ')') + --nesting; + else if(*line == '\n') + if (nesting == 0) + break; + line++; + } + (*line)--; // we dont want the \n actually + *line = '\0'; + + return linep; + } + + proc log_message(Log_Level type, const char* message) -> void { + if (type > Globals::log_level) + return; + + const char* prefix; + switch (type) { + case Log_Level::Critical: prefix = "CRITICAL"; break; + case Log_Level::Warning: prefix = "WARNING"; break; + case Log_Level::Info: prefix = "INFO"; break; + case Log_Level::Debug: prefix = "DEBUG"; break; + default: return; + } + printf("%s: %s\n",prefix, message); + } + + char* wchar_to_char(const wchar_t* pwchar) { + // get the number of characters in the string. + int currentCharIndex = 0; + char currentChar = (char)pwchar[currentCharIndex]; + + while (currentChar != '\0') + { + currentCharIndex++; + currentChar = (char)pwchar[currentCharIndex]; + } + + const int charCount = currentCharIndex + 1; + + // allocate a new block of memory size char (1 byte) instead of wide char (2 bytes) + char* filePathC = (char*)malloc(sizeof(char) * charCount); + + for (int i = 0; i < charCount; i++) + { + // convert to char (1 byte) + char character = (char)pwchar[i]; + + *filePathC = character; + + filePathC += sizeof(char); + + } + filePathC += '\0'; + + filePathC -= (sizeof(char) * charCount); + + return filePathC; + } + + const wchar_t* char_to_wchar(const char* c) { + const size_t cSize = strlen(c)+1; + wchar_t* wc = new wchar_t[cSize]; + mbstowcs (wc, c, cSize); + + return wc; + } proc string_buider_to_string(Array_List string_builder) -> char* { int len = 1; @@ -328,15 +328,15 @@ namespace Slime { string_builder.dealloc(); }; - switch (Memory::get_type(node)) { + switch (Memory::get_type(node)) { case (Lisp_Object_Type::Nil): return strdup("()"); case (Lisp_Object_Type::T): return strdup("t"); case (Lisp_Object_Type::Continuation): return strdup("[continuation]"); case (Lisp_Object_Type::Pointer): return strdup("[pointer]"); - case (Lisp_Object_Type::Number): { - if (abs(node->value.number - (int)node->value.number) < 0.000001f) + case (Lisp_Object_Type::Number): { + if (abs(node->value.number - (int)node->value.number) < 0.000001f) asprintf(&temp, "%d", (int)node->value.number); - else + else asprintf(&temp, "%f", node->value.number); return temp; } @@ -348,8 +348,8 @@ namespace Slime { asprintf(&temp, "%s", Memory::get_c_str(node->value.symbol)); return temp; } - case (Lisp_Object_Type::HashMap): { - for_hash_map (*(node->value.hashMap)) { + case (Lisp_Object_Type::HashMap): { + for_hash_map (*(node->value.hashMap)) { char* k = lisp_object_to_string(key, true); char* v = lisp_object_to_string((Lisp_Object*)value, true); asprintf(&temp, " %s -> %s\n", k, v); @@ -364,27 +364,22 @@ namespace Slime { free(str); } return temp; - } - case (Lisp_Object_Type::String): { - asprintf(&temp, "%s", Memory::get_c_str(node->value.symbol)); - if (print_repr) { - char* escaped = escape_string(Memory::get_c_str(node->value.string)); - string_builder.append(strdup("\"")); - string_builder.append(escaped); - string_builder.append(strdup("\"")); - free(escaped); - temp = string_buider_to_string(string_builder); - // TODO free + } + case (Lisp_Object_Type::String): { + if (print_repr) { + char* escaped = escape_string(Memory::get_c_str(node->value.string)); + asprintf(&temp, "\"%s\"", escaped); + free(escaped); return temp; } else return strdup(Memory::get_c_str(node->value.string)); - } break; - case (Lisp_Object_Type::Vector): { + } break; + case (Lisp_Object_Type::Vector): { string_builder.append(strdup("[")); - if (node->value.vector.length > 0) + if (node->value.vector.length > 0) string_builder.append(lisp_object_to_string(node->value.vector.data, print_repr)); - for (int i = 1; i < node->value.vector.length; ++i) { + for (int i = 1; i < node->value.vector.length; ++i) { string_builder.append(strdup(" ")); string_builder.append(lisp_object_to_string(node->value.vector.data+i, print_repr)); } @@ -392,140 +387,146 @@ namespace Slime { temp = string_buider_to_string(string_builder); for (auto str : string_builder) { free(str); - } + } return temp; - } break; - case (Lisp_Object_Type::Function): { - if (node->userType) { + } break; + case (Lisp_Object_Type::Function): { + if (node->userType) { asprintf(&temp, "[%s]", Memory::get_c_str(node->userType->value.symbol)); return temp; - } - if (node->value.function->is_c) { - switch (node->value.function->type.c_function_type) { - case C_Function_Type::cFunction: return strdup("[c-function]"); - case C_Function_Type::cSpecial: return strdup("[c-special]"); - case C_Function_Type::cMacro: return strdup("[c-macro]"); + } + if (node->value.function->is_c) { + // NOTE(Felix): try to find the symbol it is bound to + // in global env + Lisp_Object* name = (Lisp_Object*)(get_root_environment()->hm.search_key_to_object(node)); + switch (node->value.function->type.c_function_type) { + case C_Function_Type::cFunction: asprintf(&temp, "[c-function %s]",&((Lisp_Object*)name)->value.symbol->data); break; + case C_Function_Type::cSpecial: asprintf(&temp, "[c-special %s]", &((Lisp_Object*)name)->value.symbol->data); break; + case C_Function_Type::cMacro: asprintf(&temp, "[c-macro %s]", &((Lisp_Object*)name)->value.symbol->data); break; default: return strdup("[c-??]"); - } - } else { - switch (node->value.function->type.lisp_function_type) { + } + return temp; + } else { + switch (node->value.function->type.lisp_function_type) { case Lisp_Function_Type::Lambda: return strdup("[lambda]"); case Lisp_Function_Type::Macro: return strdup("[macro]"); default: return strdup("[??]"); - } - } - } break; - case (Lisp_Object_Type::Pair): { + } + } + } break; + case (Lisp_Object_Type::Pair): { // TODO - Lisp_Object* head = node; - + Lisp_Object* head = node; + defer { for (auto str : string_builder) { free(str); } }; - // first check if it is a quotation form, in that case we want - // to print it prettier - if (Memory::get_type(head->value.pair.first) == Lisp_Object_Type::Symbol) { - String* identifier = head->value.pair.first->value.symbol; - - - auto symbol = head->value.pair.first; - auto quote_sym = Memory::get_symbol("quote"); - auto unquote_sym = Memory::get_symbol("unquote"); - auto quasiquote_sym = Memory::get_symbol("quasiquote"); - auto unquote_splicing_sym = Memory::get_symbol("unquote-splicing"); - if (symbol == quote_sym || symbol == unquote_sym || symbol == unquote_splicing_sym) - { - if (symbol == quote_sym) + // first check if it is a quotation form, in that case we want + // to print it prettier + if (Memory::get_type(head->value.pair.first) == Lisp_Object_Type::Symbol) { + String* identifier = head->value.pair.first->value.symbol; + + + auto symbol = head->value.pair.first; + auto quote_sym = Memory::get_symbol("quote"); + auto unquote_sym = Memory::get_symbol("unquote"); + auto quasiquote_sym = Memory::get_symbol("quasiquote"); + auto unquote_splicing_sym = Memory::get_symbol("unquote-splicing"); + if (symbol == quote_sym || symbol == unquote_sym || symbol == unquote_splicing_sym) + { + if (symbol == quote_sym) string_builder.append(strdup("\'")); - else if (symbol == unquote_sym) + else if (symbol == unquote_sym) string_builder.append(strdup(",")); - else if (symbol == unquote_splicing_sym) + else if (symbol == unquote_splicing_sym) string_builder.append(strdup(",@")); - - assert_type(head->value.pair.rest, Lisp_Object_Type::Pair); - assert(head->value.pair.rest->value.pair.rest == Memory::nil); - + + assert_type(head->value.pair.rest, Lisp_Object_Type::Pair); + assert(head->value.pair.rest->value.pair.rest == Memory::nil); + string_builder.append(lisp_object_to_string(head->value.pair.rest->value.pair.first, print_repr)); - temp = string_buider_to_string(string_builder); return string_buider_to_string(string_builder); } else if (symbol == quasiquote_sym) { string_builder.append(strdup("`")); - assert_type(head->value.pair.rest, Lisp_Object_Type::Pair); + assert_type(head->value.pair.rest, Lisp_Object_Type::Pair); string_builder.append(lisp_object_to_string(head->value.pair.rest->value.pair.first, print_repr)); return string_buider_to_string(string_builder); - } - } - + } + } + string_builder.append(strdup("(")); - - // NOTE(Felix): We could do a while true here, however in case - // we want to print a broken list (for logging the error) we - // should do more checks. - while (head) { + + // NOTE(Felix): We could do a while true here, however in case + // we want to print a broken list (for logging the error) we + // should do more checks. + while (head) { string_builder.append(lisp_object_to_string(head->value.pair.first, print_repr)); - head = head->value.pair.rest; + head = head->value.pair.rest; if (!head) break; if (Memory::get_type(head) != Lisp_Object_Type::Pair) break; string_builder.append(strdup(" ")); - } - + } + if (head && Memory::get_type(head) != Lisp_Object_Type::Nil) { string_builder.append(strdup(" . ")); string_builder.append(lisp_object_to_string(head, print_repr)); - } - + } + string_builder.append(strdup(")")); return string_buider_to_string(string_builder); } - } - } - + } + } + proc print(Lisp_Object* node, bool print_repr, FILE* file) -> void { - char* string = lisp_object_to_string(node, print_repr); + char* string = nullptr; + defer { + free(string); + }; + string = lisp_object_to_string(node, print_repr); fputs(string, file); - free(string); } - proc print_single_call(Lisp_Object* obj) -> void { - printf(console_cyan); - print(obj, true); - printf(console_normal); - printf("\n at "); - if (obj->sourceCodeLocation) { - printf("%s (line %d, position %d)", - Memory::get_c_str( - obj->sourceCodeLocation->file), - obj->sourceCodeLocation->line, - obj->sourceCodeLocation->column); - } else { - fputs("no source code location avaliable", stdout); - } - } - - proc print_call_stack() -> void { - printf("call stack cannot be printed."); - // using Globals::Current_Execution::call_stack; - - // printf("callstack [%d] (most recent call last):\n", call_stack.next_index); - // for (int i = 0; i < call_stack.next_index; ++i) { - // printf("%2d -> ", i); - // print_single_call(call_stack.data[i]); - // printf("\n"); - // } - } - - proc log_error() -> void { + proc print_single_call(Lisp_Object* obj) -> void { + printf(console_cyan); + print(obj, true); + printf(console_normal); + printf("\n at "); + if (obj->sourceCodeLocation) { + printf("%s (line %d, position %d)", + Memory::get_c_str( + obj->sourceCodeLocation->file), + obj->sourceCodeLocation->line, + obj->sourceCodeLocation->column); + } else { + fputs("no source code location avaliable", stdout); + } + } + + proc print_call_stack() -> void { + printf("call stack cannot be printed."); + // using Globals::Current_Execution::call_stack; + + // printf("callstack [%d] (most recent call last):\n", call_stack.next_index); + // for (int i = 0; i < call_stack.next_index; ++i) { + // printf("%2d -> ", i); + // print_single_call(call_stack.data[i]); + // printf("\n"); + // } + } + + proc log_error() -> void { fputs("\n", stdout); - fputs(console_red, stdout); - fputs(Memory::get_c_str(Globals::error->message), stdout); - puts(console_normal); - - fputs(" in: ", stdout); - print_call_stack(); - puts(console_normal); - } -} + fputs(console_red, stdout); + fputs(Memory::get_c_str(Globals::error->message), stdout); + puts(console_normal); + + fputs(" in: ", stdout); + print_call_stack(); + puts(console_normal); + } +} diff --git a/src/libslime.cpp b/src/libslime.cpp index 2e42a5d..2ff3315 100644 --- a/src/libslime.cpp +++ b/src/libslime.cpp @@ -1,120 +1,120 @@ -#define _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_DEPRECATE - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -# include -# include -#else -# include -# include -#endif - -/* - Forward declare the hash functions for the hashmap (needed at least - for clang++) -*/ -namespace Slime {struct Lisp_Object;} -bool hm_objects_match(char* a, char* b); -bool hm_objects_match(void* a, void* b); -bool hm_objects_match(Slime::Lisp_Object* a, Slime::Lisp_Object* b); -unsigned int hm_hash(char* str); -unsigned int hm_hash(void* ptr); -unsigned int hm_hash(Slime::Lisp_Object* obj); -#include "ftb/hashmap.hpp" -#include "ftb/types.hpp" -#include "ftb/arraylist.hpp" -#include "ftb/bucket_allocator.hpp" -#include "ftb/macros.hpp" -#include "ftb/profiler.hpp" - -# include "defines.cpp" -# include "assert.hpp" -# include "define_macros.hpp" -# include "platform.cpp" -# include "structs.cpp" -# include "forward_decls.cpp" - - -bool hm_objects_match(char* a, char* b) { - return strcmp(a, b) == 0; -} - -bool hm_objects_match(void* a, void* b) { - return a == b; -} - -bool hm_objects_match(Slime::Lisp_Object* a, Slime::Lisp_Object* b) { - return Slime::lisp_object_equal(a, b); -} - -unsigned int hm_hash(char* str) { - unsigned int value = str[0] << 7; - int i = 0; - while (str[i]) { - value = (10000003 * value) ^ str[i++]; - } - return value ^ i; -} - -unsigned int hm_hash(void* ptr) { - return ((unsigned long long)ptr * 2654435761) % 4294967296; -} - -unsigned int hm_hash(Slime::Lisp_Object* obj) { - using namespace Slime; - switch (Memory::get_type(obj)) { - // hash from adress: if two objects of these types have - // different addresses, they are different - case Lisp_Object_Type::Function: - case Lisp_Object_Type::Symbol: - case Lisp_Object_Type::Keyword: - case Lisp_Object_Type::Continuation: - case Lisp_Object_Type::Nil: - case Lisp_Object_Type::T: - return hm_hash((void*) obj); - // hash from contents: even if objects are themselved - // different, they cauld be equivalent: - case Lisp_Object_Type::Pointer: return hm_hash((void*) obj->value.pointer); - case Lisp_Object_Type::Number: return hm_hash((void*) (unsigned long long)obj->value.number); // HACK(Felix): yes - case Lisp_Object_Type::String: return hm_hash((char*) &obj->value.string->data); - case Lisp_Object_Type::Pair: { - u32 hash = 1; - for_lisp_list (obj) { - hash <<= 1; - hash += hm_hash(it); - } - return hash; - } break; - case Lisp_Object_Type::Vector: - case Lisp_Object_Type::HashMap: - default: - create_not_yet_implemented_error(); - return 0; - } -} - -# include "globals.cpp" -# include "memory.cpp" -# include "gc.cpp" -# include "lisp_object.cpp" -# include "error.cpp" -# include "io.cpp" -# include "env.cpp" -# include "parse.cpp" -# include "eval.cpp" -# include "visualization.cpp" -# include "docgeneration.cpp" -# include "built_ins.cpp" -# include "testing.cpp" -// # include "undefines.cpp" +#define _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_DEPRECATE + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +# include +# include +#else +# include +# include +#endif + +/* + Forward declare the hash functions for the hashmap (needed at least + for clang++) +*/ +namespace Slime {struct Lisp_Object;} +bool hm_objects_match(char* a, char* b); +bool hm_objects_match(void* a, void* b); +bool hm_objects_match(Slime::Lisp_Object* a, Slime::Lisp_Object* b); +unsigned int hm_hash(char* str); +unsigned int hm_hash(void* ptr); +unsigned int hm_hash(Slime::Lisp_Object* obj); +#include "ftb/hashmap.hpp" +#include "ftb/types.hpp" +#include "ftb/arraylist.hpp" +#include "ftb/bucket_allocator.hpp" +#include "ftb/macros.hpp" +#include "ftb/profiler.hpp" + +# include "defines.cpp" +# include "assert.hpp" +# include "define_macros.hpp" +# include "platform.cpp" +# include "structs.cpp" +# include "forward_decls.cpp" + + +bool hm_objects_match(char* a, char* b) { + return strcmp(a, b) == 0; +} + +bool hm_objects_match(void* a, void* b) { + return a == b; +} + +bool hm_objects_match(Slime::Lisp_Object* a, Slime::Lisp_Object* b) { + return Slime::lisp_object_equal(a, b); +} + +unsigned int hm_hash(char* str) { + unsigned int value = str[0] << 7; + int i = 0; + while (str[i]) { + value = (10000003 * value) ^ str[i++]; + } + return value ^ i; +} + +unsigned int hm_hash(void* ptr) { + return ((unsigned long long)ptr * 2654435761) % 4294967296; +} + +unsigned int hm_hash(Slime::Lisp_Object* obj) { + using namespace Slime; + switch (Memory::get_type(obj)) { + // hash from adress: if two objects of these types have + // different addresses, they are different + case Lisp_Object_Type::Function: + case Lisp_Object_Type::Symbol: + case Lisp_Object_Type::Keyword: + case Lisp_Object_Type::Continuation: + case Lisp_Object_Type::Nil: + case Lisp_Object_Type::T: + return hm_hash((void*) obj); + // hash from contents: even if objects are themselved + // different, they cauld be equivalent: + case Lisp_Object_Type::Pointer: return hm_hash((void*) obj->value.pointer); + case Lisp_Object_Type::Number: return hm_hash((void*) (unsigned long long)obj->value.number); // HACK(Felix): yes + case Lisp_Object_Type::String: return hm_hash((char*) &obj->value.string->data); + case Lisp_Object_Type::Pair: { + u32 hash = 1; + for_lisp_list (obj) { + hash <<= 1; + hash += hm_hash(it); + } + return hash; + } break; + case Lisp_Object_Type::Vector: + case Lisp_Object_Type::HashMap: + default: + create_not_yet_implemented_error(); + return 0; + } +} + +# include "globals.cpp" +# include "memory.cpp" +# include "gc.cpp" +# include "lisp_object.cpp" +# include "error.cpp" +# include "io.cpp" +# include "env.cpp" +# include "parse.cpp" +# include "eval.cpp" +# include "visualization.cpp" +# include "docgeneration.cpp" +# include "built_ins.cpp" +# include "testing.cpp" +// # include "undefines.cpp" diff --git a/src/lisp_object.cpp b/src/lisp_object.cpp index be795b8..7347f71 100644 --- a/src/lisp_object.cpp +++ b/src/lisp_object.cpp @@ -1,48 +1,45 @@ -namespace Slime { - proc create_source_code_location(String* file, int line, int col) -> Source_Code_Location* { - if (!file) - return nullptr; - - Source_Code_Location* ret = (Source_Code_Location*)malloc(sizeof(Source_Code_Location)); - ret->file = file; - ret->line = line; - ret->column = col; - return ret; - } - - proc Lisp_Object_Type_to_string(Lisp_Object_Type type) -> const char* { - switch (type) { - case(Lisp_Object_Type::Nil): return "nil"; - case(Lisp_Object_Type::T): return "t"; - case(Lisp_Object_Type::Number): return "number"; - case(Lisp_Object_Type::String): return "string"; - case(Lisp_Object_Type::Symbol): return "symbol"; - case(Lisp_Object_Type::Keyword): return "keyword"; - case(Lisp_Object_Type::Function): return "function"; - case(Lisp_Object_Type::Continuation): return "continuation"; - case(Lisp_Object_Type::Pair): return "pair"; - case(Lisp_Object_Type::Vector): return "vector"; - case(Lisp_Object_Type::Pointer): return "pointer"; - case(Lisp_Object_Type::HashMap): return "hashmap"; - } - return "unknown"; - } - - Lisp_Object::~Lisp_Object() { - free(sourceCodeLocation); - sourceCodeLocation = 0; - - switch (Memory::get_type(this)) { - case Lisp_Object_Type::HashMap: { - delete this->value.hashMap; - } break; - case Lisp_Object_Type::Function:{ - this->value.function->args.positional.symbols.dealloc(); - this->value.function->args.keyword.keywords.dealloc(); - this->value.function->args.keyword.values.dealloc(); - free(this->value.function); - } break; - default: break; - } - } -} +namespace Slime { + proc create_source_code_location(String* file, int line, int col) -> Source_Code_Location* { + if (!file) + return nullptr; + + Source_Code_Location* ret = (Source_Code_Location*)malloc(sizeof(Source_Code_Location)); + ret->file = file; + ret->line = line; + ret->column = col; + return ret; + } + + proc Lisp_Object_Type_to_string(Lisp_Object_Type type) -> const char* { + switch (type) { + case(Lisp_Object_Type::Nil): return "nil"; + case(Lisp_Object_Type::T): return "t"; + case(Lisp_Object_Type::Number): return "number"; + case(Lisp_Object_Type::String): return "string"; + case(Lisp_Object_Type::Symbol): return "symbol"; + case(Lisp_Object_Type::Keyword): return "keyword"; + case(Lisp_Object_Type::Function): return "function"; + case(Lisp_Object_Type::Continuation): return "continuation"; + case(Lisp_Object_Type::Pair): return "pair"; + case(Lisp_Object_Type::Vector): return "vector"; + case(Lisp_Object_Type::Pointer): return "pointer"; + case(Lisp_Object_Type::HashMap): return "hashmap"; + } + return "unknown"; + } + + Lisp_Object::~Lisp_Object() { + free(sourceCodeLocation); + sourceCodeLocation = 0; + + switch (Memory::get_type(this)) { + case Lisp_Object_Type::Function:{ + this->value.function->args.positional.symbols.dealloc(); + this->value.function->args.keyword.keywords.dealloc(); + this->value.function->args.keyword.values.dealloc(); + free(this->value.function); + } break; + default: break; + } + } +} diff --git a/src/main.cpp b/src/main.cpp index 07cf82a..6d0eeb0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,33 +1,33 @@ -#include "libslime.cpp" - -int main(int argc, char* argv[]) { - -#ifdef _MSC_VER - // enable colored terminal output for windows - HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); - DWORD dwMode = 0; - GetConsoleMode(hOut, &dwMode); - dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; - SetConsoleMode(hOut, dwMode); -#endif - - if (argc > 1) { - if (Slime::string_equal(argv[1], "--run-tests")) { - int res = Slime::run_all_tests(); - return res ? 0 : 1; - } else if (Slime::string_equal(argv[1], "--generate-docs")) { - Slime::Memory::init(4096 * 256* 100); - if (Slime::Globals::error) return 1; - Slime::built_in_load(Slime::Memory::create_string("generate-docs.slime")); - Slime::Memory::free_everything(); - } else { - Slime::interprete_file(argv[1]); - } - } else { - Slime::interprete_stdin(); - return 0; - } - - if (Slime::Globals::error) return 1; - -} +#include "libslime.cpp" + +int main(int argc, char* argv[]) { + +#ifdef _MSC_VER + // enable colored terminal output for windows + HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD dwMode = 0; + GetConsoleMode(hOut, &dwMode); + dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(hOut, dwMode); +#endif + + if (argc > 1) { + if (Slime::string_equal(argv[1], "--run-tests")) { + int res = Slime::run_all_tests(); + return res ? 0 : 1; + } else if (Slime::string_equal(argv[1], "--generate-docs")) { + Slime::Memory::init(4096 * 256* 100); + if (Slime::Globals::error) return 1; + Slime::built_in_load(Slime::Memory::create_string("generate-docs.slime")); + Slime::Memory::free_everything(); + } else { + Slime::interprete_file(argv[1]); + } + } else { + Slime::interprete_stdin(); + return 0; + } + + if (Slime::Globals::error) return 1; + +} diff --git a/src/memory.cpp b/src/memory.cpp index 82fb5ac..ec8c203 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -1,544 +1,566 @@ -namespace Slime::Memory { - - // ------------------ - // global symbol / keyword table - // ------------------ - Hash_Map global_symbol_table; - Hash_Map global_keyword_table; - - - Hash_Map file_to_env_map; - // ------------------ - // lisp_objects - // ------------------ - Bucket_Allocator object_memory(1024, 8); - - // ------------------ - // environments - // ------------------ - Bucket_Allocator environment_memory(1024, 8); - - // ------------------ - // strings - // ------------------ - int string_memory_size; // = 4096 * 1024; // == 98304kb == 96mb - // free_spots_in_string_memory is an arraylist of pointers into - // the string_memory, where dead String objects live (which give - // information about their size) - Array_List free_spots_in_string_memory; - String* string_memory; - String* next_free_spot_in_string_memory; - - // ------------------ - // immutables - // ------------------ - Lisp_Object* nil = nullptr; - Lisp_Object* t = nullptr; - Lisp_Object* _if = nullptr; - Lisp_Object* _define = nullptr; - Lisp_Object* _begin = nullptr; - - - - proc print_status() { - // printf("Memory Status:\n" - // " - %f%% of the object_memory is used\n" - // " - %d of %d total Lisp_Objects are in use\n" - // " - %d holes in used memory (fragmentation)\n", - // (1.0*next_index_in_object_memory - free_spots_in_object_memory.next_index)/object_memory_size, - // next_index_in_object_memory - free_spots_in_object_memory.next_index, object_memory_size, - // free_spots_in_object_memory.next_index); - - // printf("Memory Status:\n" - // " - %f%% of the string_memory is used\n" - // " - %d holes in used memory (fragmentation)\n", - // (1.0*(size_t)next_free_spot_in_string_memory - (size_t)string_memory)/string_memory_size, - // free_spots_in_string_memory.next_index); - } - - inline proc get_c_str(String* str) -> char* { - return &str->data; - } - - inline proc get_c_str(Lisp_Object* str) -> char* { - assert_type(str, Lisp_Object_Type::String); - return get_c_str(str->value.string); - } - - inline proc get_type(Lisp_Object* node) -> Lisp_Object_Type { - // the type is in the bits 0 to 5 (including) - return (Lisp_Object_Type) ((u64)node->flags & (u64)0b11111); - } - - - inline proc set_type(Lisp_Object* node, Lisp_Object_Type type) { - // the type is in the bits 0 to 5 (including) - u64 bitmask = (u64)-1; - bitmask -= 0b11111; - bitmask += (u64) type; - node->flags = (u64)(node->flags) | bitmask; - } - - proc hash(String* str) -> u64 { - // TODO(Felix): When parsing symbols or keywords, compute the - // hash while reading them in. - u64 value = str->data << 7; - for (int i = 1; i < str->length; ++i) { - char c = ((char*)&str->data)[i]; - value = (1000003 * value) ^ c; - } - value ^= str->length; - - return value; - - } - - proc create_string(const char* str, int len) -> String* { - // TODO(Felix): check the holes first, not just always append - // at the end - - String* ret = next_free_spot_in_string_memory; - ret->length = len; - strcpy(&ret->data, str); - - // now update the next_free_spot_in_string_memory pointer: - // overstrep the counter and the first char (thik of it as if - // we were overstepping the last ('\0') char) and then we only - // need to overstep 'len' more chars - next_free_spot_in_string_memory += 1; - - // overstep the other chars - next_free_spot_in_string_memory = ((String*)((char*)next_free_spot_in_string_memory)+len); - return ret; - } - - proc delete_string(String* str) { - free_spots_in_string_memory.append((void*)str); - } - - proc duplicate_string(String* str) -> String* { - return create_string(get_c_str(str), str->length); - } - - proc create_string (const char* str) -> String* { - return create_string(str, (int)strlen(str)); - } - - proc create_lisp_object() -> Lisp_Object* { - Lisp_Object* object = object_memory.allocate(); - object->flags = 0; - object->sourceCodeLocation = nullptr; - object->userType = nullptr; - object->docstring = nullptr; - return object; - } - - proc free_everything() -> void { - free(string_memory); - object_memory.for_each([](Lisp_Object* lo){ - lo->~Lisp_Object(); - }); - environment_memory.for_each([](Environment* env){ - env->parents.dealloc(); - env->~Environment(); - }); - // free the exe dir: - free(Globals::load_path.data[0]); - Globals::load_path.dealloc(); - // Globals::Current_Execution::call_stack.dealloc(); - Globals::Current_Execution::envi_stack.dealloc(); - Globals::Current_Execution::cs.dealloc(); - Globals::Current_Execution::ams.dealloc(); - Globals::Current_Execution::pcs.dealloc(); +namespace Slime::Memory { + + // ------------------ + // global symbol / keyword table + // ------------------ + Hash_Map global_symbol_table; + Hash_Map global_keyword_table; + + + Hash_Map file_to_env_map; + // ------------------ + // lisp_objects + // ------------------ + Bucket_Allocator object_memory(1024, 8); + + // ------------------ + // environments + // ------------------ + Bucket_Allocator environment_memory(1024, 8); + + // NOTE(Felix): we are doing hashmaps separately so we don't have + // to malloc them every time, and if two lisp objects have the + // same hashmap, it will not cause double free problems when + // freeing all at the end. It also plays nice with garbage + // collection + // ------------------ + // Hashmaps + // ------------------ + Bucket_Allocator> hashmap_memory(256, 8); + + // ------------------ + // strings + // ------------------ + int string_memory_size; // = 4096 * 1024; // == 98304kb == 96mb + // free_spots_in_string_memory is an arraylist of pointers into + // the string_memory, where dead String objects live (which give + // information about their size) + Array_List free_spots_in_string_memory; + String* string_memory; + String* next_free_spot_in_string_memory; + + // ------------------ + // immutables + // ------------------ + Lisp_Object* nil = nullptr; + Lisp_Object* t = nullptr; + Lisp_Object* _if = nullptr; + Lisp_Object* _define = nullptr; + Lisp_Object* _begin = nullptr; + + + + proc print_status() { + // printf("Memory Status:\n" + // " - %f%% of the object_memory is used\n" + // " - %d of %d total Lisp_Objects are in use\n" + // " - %d holes in used memory (fragmentation)\n", + // (1.0*next_index_in_object_memory - free_spots_in_object_memory.next_index)/object_memory_size, + // next_index_in_object_memory - free_spots_in_object_memory.next_index, object_memory_size, + // free_spots_in_object_memory.next_index); + + // printf("Memory Status:\n" + // " - %f%% of the string_memory is used\n" + // " - %d holes in used memory (fragmentation)\n", + // (1.0*(size_t)next_free_spot_in_string_memory - (size_t)string_memory)/string_memory_size, + // free_spots_in_string_memory.next_index); + } + + inline proc get_c_str(String* str) -> char* { + return &str->data; + } + + inline proc get_c_str(Lisp_Object* str) -> char* { + assert_type(str, Lisp_Object_Type::String); + return get_c_str(str->value.string); + } + + inline proc get_type(Lisp_Object* node) -> Lisp_Object_Type { + // the type is in the bits 0 to 5 (including) + return (Lisp_Object_Type) ((u64)node->flags & (u64)0b11111); + } + + + inline proc set_type(Lisp_Object* node, Lisp_Object_Type type) { + // the type is in the bits 0 to 5 (including) + u64 bitmask = (u64)-1; + bitmask -= 0b11111; + bitmask += (u64) type; + node->flags = (u64)(node->flags) | bitmask; + } + + proc hash(String* str) -> u64 { + // TODO(Felix): When parsing symbols or keywords, compute the + // hash while reading them in. + u64 value = str->data << 7; + for (int i = 1; i < str->length; ++i) { + char c = ((char*)&str->data)[i]; + value = (1000003 * value) ^ c; + } + value ^= str->length; + + return value; + + } + + proc create_string(const char* str, int len) -> String* { + // TODO(Felix): check the holes first, not just always append + // at the end + + String* ret = next_free_spot_in_string_memory; + ret->length = len; + strcpy(&ret->data, str); + + // now update the next_free_spot_in_string_memory pointer: + // overstrep the counter and the first char (thik of it as if + // we were overstepping the last ('\0') char) and then we only + // need to overstep 'len' more chars + next_free_spot_in_string_memory += 1; + + // overstep the other chars + next_free_spot_in_string_memory = ((String*)((char*)next_free_spot_in_string_memory)+len); + return ret; + } + + proc delete_string(String* str) { + free_spots_in_string_memory.append((void*)str); + } + + proc duplicate_string(String* str) -> String* { + return create_string(get_c_str(str), str->length); + } + + proc create_string (const char* str) -> String* { + return create_string(str, (int)strlen(str)); + } + + proc create_lisp_object() -> Lisp_Object* { + Lisp_Object* object = object_memory.allocate(); + object->flags = 0; + object->sourceCodeLocation = nullptr; + object->userType = nullptr; + object->docstring = nullptr; + return object; + } + + proc free_everything() -> void { + free(string_memory); + object_memory.for_each([](Lisp_Object* lo){ + lo->~Lisp_Object(); + }); + environment_memory.for_each([](Environment* env){ + env->parents.dealloc(); + env->hm.dealloc(); + }); + hashmap_memory.for_each([](Hash_Map* hm){ + hm->dealloc(); + }); + // free the exe dir: + free(Globals::load_path.data[0]); + Globals::load_path.dealloc(); + Globals::Current_Execution::envi_stack.dealloc(); + Globals::Current_Execution::cs.dealloc(); + Globals::Current_Execution::ams.dealloc(); + Globals::Current_Execution::pcs.dealloc(); Globals::Current_Execution::nass.dealloc(); - } - - - proc create_child_environment(Environment* parent) -> Environment* { - - Environment* env = environment_memory.allocate(); - - // inject a new array list; - env->parents.alloc(); - if (parent) - env->parents.append(parent); - - new(&env->hm) Hash_Map; - - return env; - } - - proc create_empty_environment() -> Environment* { - Environment* ret; - try ret = create_child_environment(nullptr); - return ret; - } - - proc init(int sms) -> void { - profile_this(); - char* exe_path = get_exe_dir(); - // don't free exe path because it will be used until end of time - Globals::load_path.alloc(); - // Globals::Current_Execution::call_stack.alloc(); - Globals::Current_Execution::envi_stack.alloc(); - Globals::Current_Execution::cs.alloc(); - Globals::Current_Execution::nass.alloc(); - Globals::Current_Execution::pcs.alloc(); - Globals::Current_Execution::ams.alloc(); - - add_to_load_path(exe_path); - add_to_load_path("../bin/"); - - string_memory_size = sms; - string_memory = (String*)malloc(string_memory_size * sizeof(char)); - - next_free_spot_in_string_memory = string_memory; - - // init nil - try_void nil = create_lisp_object(); - set_type(nil, Lisp_Object_Type::Nil); - - // init t - try_void t = create_lisp_object(); - set_type(t, Lisp_Object_Type::T); - - try_void Parser::standard_in = create_string("stdin"); - - Globals::Current_Execution::envi_stack.next_index = 0; - Environment* env; - try_void env = create_built_ins_environment(); - push_environment(env); - - Environment* user_env; - try_void user_env = Memory::create_child_environment(env); - push_environment(user_env); - - /* try_void _if = lookup_symbol(get_symbol("if"), env); - try_void _define = lookup_symbol(get_symbol("define"), env); - try_void _begin = lookup_symbol(get_symbol("begin"), env);*/ - } - - proc reset() -> void { - profile_this(); - - free_spots_in_string_memory.next_index = 0; - - global_symbol_table.~Hash_Map(); - global_keyword_table.~Hash_Map(); - file_to_env_map.~Hash_Map(); - - new(&global_symbol_table) Hash_Map; - new(&global_keyword_table) Hash_Map; - new(&file_to_env_map) Hash_Map; - - try_void Parser::standard_in = create_string("stdin"); - - object_memory.for_each([](Lisp_Object* lo){ - lo->~Lisp_Object(); - }); - environment_memory.for_each([](Environment* env){ - env->~Environment(); - }); - - object_memory.~Bucket_Allocator(); - environment_memory.~Bucket_Allocator(); - - new(&object_memory) Bucket_Allocator(1024, 8); - new(&environment_memory) Bucket_Allocator(1024, 8); - - next_free_spot_in_string_memory = string_memory; - - - // init nil - try_void nil = create_lisp_object(); - set_type(nil, Lisp_Object_Type::Nil); - - // init t - try_void t = create_lisp_object(); - set_type(t, Lisp_Object_Type::T); - - Globals::Current_Execution::envi_stack.next_index = 0; - Environment* env; - try_void env = create_built_ins_environment(); - push_environment(env); - - Environment* user_env; - try_void user_env = Memory::create_child_environment(env); - push_environment(user_env); - - try_void _if = lookup_symbol(get_symbol("if"), env); - try_void _define = lookup_symbol(get_symbol("define"), env); - try_void _begin = lookup_symbol(get_symbol("begin"), env); - } - - proc create_lisp_object(void* ptr) -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Pointer); - node->value.pointer = ptr; - return node; - } - - proc create_lisp_object_hash_map() -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::HashMap); - node->value.hashMap = new Hash_Map; - return node; - } - - proc create_lisp_object(double number) -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Number); - node->value.number = number; - return node; - } - - proc create_lisp_object(String* str) -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::String); - node->value.string = str; - return node; - } - - proc create_lisp_object(const char* str) -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::String); - node->value.string = create_string(str); - return node; - } - - proc allocate_vector(int size) -> Lisp_Object* { - Lisp_Object* ret = object_memory.allocate(size); - if (!ret) { - create_out_of_memory_error("The vector is too big to fit in a memory bucket."); - return nullptr; - } - return ret; - } - - proc create_lisp_object_vector(int length, Lisp_Object* element_list) -> Lisp_Object* { - try assert_type(element_list, Lisp_Object_Type::Pair); - - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Vector); - - node->value.vector.length = length; - try node->value.vector.data = allocate_vector(length); - - Lisp_Object* head = element_list; - - int i = 0; - while (head != Memory::nil) { - node->value.vector.data[i] = *head->value.pair.first; - head = head->value.pair.rest; - ++i; - } - - return node; - } - - proc create_lisp_object_vector(Lisp_Object* e1) -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Vector); - - node->value.vector.length = 1; - try node->value.vector.data = allocate_vector(1); - - node->value.vector.data[0] = *e1; - - return node; - } - - proc create_lisp_object_vector(Lisp_Object* e1, Lisp_Object* e2) -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Vector); - - node->value.vector.length = 2; - try node->value.vector.data = allocate_vector(2); - - node->value.vector.data[0] = *e1; - node->value.vector.data[1] = *e2; - - return node; - } - - proc create_lisp_object_vector(Lisp_Object* e1, Lisp_Object* e2, Lisp_Object* e3) -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Vector); - - node->value.vector.length = 3; - try node->value.vector.data = allocate_vector(3); - - node->value.vector.data[0] = *e1; - node->value.vector.data[1] = *e2; - node->value.vector.data[2] = *e3; - - return node; - } - - - - proc get_symbol(String* identifier) -> Lisp_Object* { - Lisp_Object* node = global_symbol_table.get_object(get_c_str(identifier)); - if (node) - return (Lisp_Object*)node; - - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Symbol); - node->value.symbol = identifier; - global_symbol_table.set_object(get_c_str(identifier), node); - return node; - } - - proc get_symbol(const char* identifier) -> Lisp_Object* { - if (auto ret = global_symbol_table.get_object((char*)identifier)) - return (Lisp_Object*)ret; - else { - String* str; - try str = Memory::create_string(identifier); - return get_symbol(str); - } - } - - proc get_keyword(String* keyword) -> Lisp_Object* { - Lisp_Object* node = global_keyword_table.get_object(get_c_str(keyword)); - if (node) - return (Lisp_Object*)node; - - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Keyword); - node->value.symbol = keyword; - global_keyword_table.set_object(get_c_str(keyword), node); - return node; - } - - - proc get_keyword(const char* keyword) -> Lisp_Object* { - if (auto ret = global_keyword_table.get_object((char*)keyword)) - return (Lisp_Object*)ret; - else { - String* str; - try str = Memory::create_string(keyword); - return get_keyword(str); - } - } - - proc create_lisp_object_cfunction(C_Function_Type type) -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Function); - node->value.function = (Function*)malloc(sizeof(Function)); - node->value.function->type.c_function_type = type; - node->value.function->args.keyword.keywords.alloc(); - node->value.function->args.keyword.values.alloc(); - node->value.function->args.positional.symbols.alloc(); - node->value.function->is_c = true; - return node; - } - - proc create_lisp_object_function(Lisp_Function_Type ft) -> Lisp_Object* { - Lisp_Object* func; - try func = Memory::create_lisp_object(); - Memory::set_type(func, Lisp_Object_Type::Function); - func->value.function = (Function*)malloc(sizeof(Function)); - func->value.function->args.keyword.keywords.alloc(); - func->value.function->args.keyword.values.alloc(); - func->value.function->args.positional.symbols.alloc(); - func->value.function->type.lisp_function_type = ft; - func->value.function->is_c = false; - return func; - } - - proc create_lisp_object_pair(Lisp_Object* first, Lisp_Object* rest) -> Lisp_Object* { - Lisp_Object* node; - try node = create_lisp_object(); - set_type(node, Lisp_Object_Type::Pair); - // node->value.pair = new(Pair); - node->value.pair.first = first; - node->value.pair.rest = rest; - return node; - } - - proc copy_lisp_object(Lisp_Object* n) -> Lisp_Object* { - // TODO(Felix): If argument is a list (pair), do a FULL copy, - - // we don't copy singleton objects - if (n == Memory::nil || n == Memory::t || - Memory::get_type(n) == Lisp_Object_Type::Symbol || - Memory::get_type(n) == Lisp_Object_Type::Keyword || - Memory::get_type(n) == Lisp_Object_Type::Function) - { - return n; - } - - Lisp_Object* target; - try target = create_lisp_object(); - *target = *n; - - return target; - } - - proc copy_lisp_object_except_pairs(Lisp_Object* n) -> Lisp_Object* { - if (get_type(n) == Lisp_Object_Type::Pair) - return n; - return copy_lisp_object(n); - } - - proc create_built_ins_environment() -> Environment* { - Environment* ret; - try ret = create_empty_environment(); - push_environment(ret); - defer { - pop_environment(); - }; - - try load_built_ins_into_environment(); - try built_in_load(Memory::create_string("pre.slime")); - return ret; - } - - - inline proc create_list(Lisp_Object* o1) -> Lisp_Object* { - Lisp_Object* ret; - try ret = create_lisp_object_pair(o1, nil); - return ret; - } - - inline proc create_list(Lisp_Object* o1, Lisp_Object* o2) -> Lisp_Object* { - Lisp_Object* ret; - try ret = create_lisp_object_pair(o1, create_list(o2)); - return ret; - } - - inline proc create_list(Lisp_Object* o1, Lisp_Object* o2, Lisp_Object* o3) -> Lisp_Object* { - Lisp_Object* ret; - try ret = create_lisp_object_pair(o1, create_list(o2, o3)); - return ret; - } - - inline proc create_list(Lisp_Object* o1, Lisp_Object* o2, Lisp_Object* o3, Lisp_Object* o4) -> Lisp_Object* { - Lisp_Object* ret; - try ret = create_lisp_object_pair(o1, create_list(o2, o3, o4)); - return ret; - } - - inline proc create_list(Lisp_Object* o1, Lisp_Object* o2, Lisp_Object* o3, Lisp_Object* o4, Lisp_Object* o5) -> Lisp_Object* { - Lisp_Object* ret; - try ret = create_lisp_object_pair(o1, create_list(o2, o3, o4, o5)); - return ret; - } - - inline proc create_list(Lisp_Object* o1, Lisp_Object* o2, Lisp_Object* o3, Lisp_Object* o4, Lisp_Object* o5, Lisp_Object* o6) -> Lisp_Object* { - Lisp_Object* ret; - try ret = create_lisp_object_pair(o1, create_list(o2, o3, o4, o5, o6)); - return ret; - } -} + + global_symbol_table.dealloc(); + global_keyword_table.dealloc(); + file_to_env_map.dealloc(); + } + + + proc create_child_environment(Environment* parent) -> Environment* { + + Environment* env = environment_memory.allocate(); + + // inject a new array list; + env->parents.alloc(); + env->hm.alloc(); + if (parent) + env->parents.append(parent); + + new(&env->hm) Hash_Map; + + return env; + } + + proc create_empty_environment() -> Environment* { + Environment* ret; + try ret = create_child_environment(nullptr); + return ret; + } + + proc init(int sms) -> void { + profile_this(); + char* exe_path = get_exe_dir(); + // don't free exe path because it will be used until end of time + Globals::load_path.alloc(); + + global_symbol_table.alloc(); + global_keyword_table.alloc(); + file_to_env_map.alloc(); + + Globals::Current_Execution::envi_stack.alloc(); + Globals::Current_Execution::cs.alloc(); + Globals::Current_Execution::nass.alloc(); + Globals::Current_Execution::pcs.alloc(); + Globals::Current_Execution::ams.alloc(); + + add_to_load_path(exe_path); + add_to_load_path("../bin/"); + + string_memory_size = sms; + string_memory = (String*)malloc(string_memory_size * sizeof(char)); + + next_free_spot_in_string_memory = string_memory; + + // init nil + try_void nil = create_lisp_object(); + set_type(nil, Lisp_Object_Type::Nil); + + // init t + try_void t = create_lisp_object(); + set_type(t, Lisp_Object_Type::T); + + try_void Parser::standard_in = create_string("stdin"); + + Globals::Current_Execution::envi_stack.next_index = 0; + Environment* env; + try_void env = create_built_ins_environment(); + push_environment(env); + + Environment* user_env; + try_void user_env = Memory::create_child_environment(env); + push_environment(user_env); + + /* try_void _if = lookup_symbol(get_symbol("if"), env); + try_void _define = lookup_symbol(get_symbol("define"), env); + try_void _begin = lookup_symbol(get_symbol("begin"), env);*/ + } + + proc reset() -> void { + profile_this(); + + free_spots_in_string_memory.next_index = 0; + + global_symbol_table.dealloc(); + global_keyword_table.dealloc(); + file_to_env_map.dealloc(); + + global_symbol_table.alloc(); + global_keyword_table.alloc(); + file_to_env_map.alloc(); + + try_void Parser::standard_in = create_string("stdin"); + + object_memory.for_each([](Lisp_Object* lo){ + lo->~Lisp_Object(); + }); + environment_memory.for_each([](Environment* env){ + env->~Environment(); + }); + + object_memory.~Bucket_Allocator(); + environment_memory.~Bucket_Allocator(); + + new(&object_memory) Bucket_Allocator(1024, 8); + new(&environment_memory) Bucket_Allocator(1024, 8); + + next_free_spot_in_string_memory = string_memory; + + + // init nil + try_void nil = create_lisp_object(); + set_type(nil, Lisp_Object_Type::Nil); + + // init t + try_void t = create_lisp_object(); + set_type(t, Lisp_Object_Type::T); + + Globals::Current_Execution::envi_stack.next_index = 0; + Environment* env; + try_void env = create_built_ins_environment(); + push_environment(env); + + Environment* user_env; + try_void user_env = Memory::create_child_environment(env); + push_environment(user_env); + + try_void _if = lookup_symbol(get_symbol("if"), env); + try_void _define = lookup_symbol(get_symbol("define"), env); + try_void _begin = lookup_symbol(get_symbol("begin"), env); + } + + proc create_lisp_object(void* ptr) -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Pointer); + node->value.pointer = ptr; + return node; + } + + proc create_lisp_object_hash_map() -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::HashMap); + node->value.hashMap = hashmap_memory.allocate(); + node->value.hashMap->alloc(); + return node; + } + + proc create_lisp_object(double number) -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Number); + node->value.number = number; + return node; + } + + proc create_lisp_object(String* str) -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::String); + node->value.string = str; + return node; + } + + proc create_lisp_object(const char* str) -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::String); + node->value.string = create_string(str); + return node; + } + + proc allocate_vector(int size) -> Lisp_Object* { + Lisp_Object* ret = object_memory.allocate(size); + if (!ret) { + create_out_of_memory_error("The vector is too big to fit in a memory bucket."); + return nullptr; + } + return ret; + } + + proc create_lisp_object_vector(int length, Lisp_Object* element_list) -> Lisp_Object* { + try assert_type(element_list, Lisp_Object_Type::Pair); + + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Vector); + + node->value.vector.length = length; + try node->value.vector.data = allocate_vector(length); + + Lisp_Object* head = element_list; + + int i = 0; + while (head != Memory::nil) { + node->value.vector.data[i] = *head->value.pair.first; + head = head->value.pair.rest; + ++i; + } + + return node; + } + + proc create_lisp_object_vector(Lisp_Object* e1) -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Vector); + + node->value.vector.length = 1; + try node->value.vector.data = allocate_vector(1); + + node->value.vector.data[0] = *e1; + + return node; + } + + proc create_lisp_object_vector(Lisp_Object* e1, Lisp_Object* e2) -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Vector); + + node->value.vector.length = 2; + try node->value.vector.data = allocate_vector(2); + + node->value.vector.data[0] = *e1; + node->value.vector.data[1] = *e2; + + return node; + } + + proc create_lisp_object_vector(Lisp_Object* e1, Lisp_Object* e2, Lisp_Object* e3) -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Vector); + + node->value.vector.length = 3; + try node->value.vector.data = allocate_vector(3); + + node->value.vector.data[0] = *e1; + node->value.vector.data[1] = *e2; + node->value.vector.data[2] = *e3; + + return node; + } + + + + proc get_symbol(String* identifier) -> Lisp_Object* { + Lisp_Object* node = global_symbol_table.get_object(get_c_str(identifier)); + if (node) + return (Lisp_Object*)node; + + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Symbol); + node->value.symbol = identifier; + global_symbol_table.set_object(get_c_str(identifier), node); + return node; + } + + proc get_symbol(const char* identifier) -> Lisp_Object* { + if (auto ret = global_symbol_table.get_object((char*)identifier)) + return (Lisp_Object*)ret; + else { + String* str; + try str = Memory::create_string(identifier); + return get_symbol(str); + } + } + + proc get_keyword(String* keyword) -> Lisp_Object* { + Lisp_Object* node = global_keyword_table.get_object(get_c_str(keyword)); + if (node) + return (Lisp_Object*)node; + + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Keyword); + node->value.symbol = keyword; + global_keyword_table.set_object(get_c_str(keyword), node); + return node; + } + + + proc get_keyword(const char* keyword) -> Lisp_Object* { + if (auto ret = global_keyword_table.get_object((char*)keyword)) + return (Lisp_Object*)ret; + else { + String* str; + try str = Memory::create_string(keyword); + return get_keyword(str); + } + } + + proc create_lisp_object_cfunction(C_Function_Type type) -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Function); + node->value.function = (Function*)malloc(sizeof(Function)); + node->value.function->type.c_function_type = type; + node->value.function->args.keyword.keywords.alloc(); + node->value.function->args.keyword.values.alloc(); + node->value.function->args.positional.symbols.alloc(); + node->value.function->is_c = true; + return node; + } + + proc create_lisp_object_function(Lisp_Function_Type ft) -> Lisp_Object* { + Lisp_Object* func; + try func = Memory::create_lisp_object(); + Memory::set_type(func, Lisp_Object_Type::Function); + func->value.function = (Function*)malloc(sizeof(Function)); + func->value.function->args.keyword.keywords.alloc(); + func->value.function->args.keyword.values.alloc(); + func->value.function->args.positional.symbols.alloc(); + func->value.function->type.lisp_function_type = ft; + func->value.function->is_c = false; + return func; + } + + proc create_lisp_object_pair(Lisp_Object* first, Lisp_Object* rest) -> Lisp_Object* { + Lisp_Object* node; + try node = create_lisp_object(); + set_type(node, Lisp_Object_Type::Pair); + // node->value.pair = new(Pair); + node->value.pair.first = first; + node->value.pair.rest = rest; + return node; + } + + proc copy_lisp_object(Lisp_Object* n) -> Lisp_Object* { + // TODO(Felix): If argument is a list (pair), do a FULL copy, + + // we don't copy singleton objects + if (n == Memory::nil || n == Memory::t || + Memory::get_type(n) == Lisp_Object_Type::Symbol || + Memory::get_type(n) == Lisp_Object_Type::Keyword || + Memory::get_type(n) == Lisp_Object_Type::Function) + { + return n; + } + + Lisp_Object* target; + try target = create_lisp_object(); + *target = *n; + + return target; + } + + proc copy_lisp_object_except_pairs(Lisp_Object* n) -> Lisp_Object* { + if (get_type(n) == Lisp_Object_Type::Pair) + return n; + return copy_lisp_object(n); + } + + proc create_built_ins_environment() -> Environment* { + Environment* ret; + try ret = create_empty_environment(); + push_environment(ret); + defer { + pop_environment(); + }; + + try load_built_ins_into_environment(); + try built_in_load(Memory::create_string("pre.slime")); + return ret; + } + + + inline proc create_list(Lisp_Object* o1) -> Lisp_Object* { + Lisp_Object* ret; + try ret = create_lisp_object_pair(o1, nil); + return ret; + } + + inline proc create_list(Lisp_Object* o1, Lisp_Object* o2) -> Lisp_Object* { + Lisp_Object* ret; + try ret = create_lisp_object_pair(o1, create_list(o2)); + return ret; + } + + inline proc create_list(Lisp_Object* o1, Lisp_Object* o2, Lisp_Object* o3) -> Lisp_Object* { + Lisp_Object* ret; + try ret = create_lisp_object_pair(o1, create_list(o2, o3)); + return ret; + } + + inline proc create_list(Lisp_Object* o1, Lisp_Object* o2, Lisp_Object* o3, Lisp_Object* o4) -> Lisp_Object* { + Lisp_Object* ret; + try ret = create_lisp_object_pair(o1, create_list(o2, o3, o4)); + return ret; + } + + inline proc create_list(Lisp_Object* o1, Lisp_Object* o2, Lisp_Object* o3, Lisp_Object* o4, Lisp_Object* o5) -> Lisp_Object* { + Lisp_Object* ret; + try ret = create_lisp_object_pair(o1, create_list(o2, o3, o4, o5)); + return ret; + } + + inline proc create_list(Lisp_Object* o1, Lisp_Object* o2, Lisp_Object* o3, Lisp_Object* o4, Lisp_Object* o5, Lisp_Object* o6) -> Lisp_Object* { + Lisp_Object* ret; + try ret = create_lisp_object_pair(o1, create_list(o2, o3, o4, o5, o6)); + return ret; + } +} diff --git a/src/parse.cpp b/src/parse.cpp index d0c1ddd..55c0fe0 100644 --- a/src/parse.cpp +++ b/src/parse.cpp @@ -1,399 +1,399 @@ -namespace Slime::Parser { - String* standard_in; - String* parser_file; - int parser_line; - int parser_col; - - proc eat_comment_line(char* text, int* index_in_text) -> void { - // safety check if we are actually starting a comment here - if (text[*index_in_text] != ';') - return; - - // eat the comment line - do { - ++(*index_in_text); - ++parser_col; - } while (text[(*index_in_text)] != '\n' && - text[(*index_in_text)] != '\r' && - text[(*index_in_text)] != '\0'); - } - - proc step_char(char* text, int* index_in_text, int steps = 1) { - for (int i = 0; i < steps; ++i) { - if (text[(*index_in_text)] == '\n') { - ++parser_line; - parser_col = 0; - } - ++parser_col; - ++(*index_in_text); - } - } - - proc eat_whitespace(char* text, int* index_in_text) -> void { - // skip whitespaces - while (text[(*index_in_text)] == ' ' || - text[(*index_in_text)] == '\t' || - text[(*index_in_text)] == '\n' || - text[(*index_in_text)] == '\r') - { - step_char(text, index_in_text); - } - } - - proc eat_until_code(char* text, int* index_in_text) -> void { - profile_this(); - int position_before; - do { - position_before = *index_in_text; - eat_comment_line(text, index_in_text); - eat_whitespace(text, index_in_text); - } while (position_before != *index_in_text); - } - - proc step_char_and_eat_until_code(char* text, int* index_in_text) { - step_char(text, index_in_text); - eat_until_code(text, index_in_text); - } - - proc parse_fancy_delimiter(char* text, int* index_in_text, char l_delimiter, char r_delimiter, Lisp_Object* first_elem) -> Lisp_Object* { - profile_this(); - if (text[*index_in_text] != l_delimiter) { - create_parsing_error("a fancy cannot be parsed here"); - return nullptr; - } - - Lisp_Object* ret; - Lisp_Object* head; - try ret = Memory::create_lisp_object_pair(first_elem, Memory::nil); - head = ret; - - step_char(text, index_in_text); - - eat_until_code(text, index_in_text); - while (text[*index_in_text] != r_delimiter) { - Lisp_Object* element; - try element = parse_expression(text, index_in_text); - try head->value.pair.rest = Memory::create_lisp_object_pair(element, Memory::nil); - head = head->value.pair.rest; - eat_until_code(text, index_in_text); - } - - step_char(text, index_in_text); - - return ret; - } - - proc get_atom_text_length(char* text, int* index_in_text) -> int { - int atom_length = 0; - while (text[*index_in_text+atom_length] != ' ' && - text[*index_in_text+atom_length] != ')' && - text[*index_in_text+atom_length] != '(' && - text[*index_in_text+atom_length] != '[' && - text[*index_in_text+atom_length] != ']' && - text[*index_in_text+atom_length] != '{' && - text[*index_in_text+atom_length] != '}' && - text[*index_in_text+atom_length] != '\0' && - text[*index_in_text+atom_length] != '\n' && - text[*index_in_text+atom_length] != '\r' && - text[*index_in_text+atom_length] != '\t') - { - ++atom_length; - } - return atom_length; - } - - proc parse_number(char* text, int* index_in_text) -> Lisp_Object* { - Lisp_Object* ret; - try ret = Memory::create_lisp_object(0.0); - - sscanf(text+*index_in_text, "%lf", &ret->value.number); - - int atom_length = get_atom_text_length(text, index_in_text); - step_char(text, index_in_text, atom_length); - - return ret; - } - - proc parse_symbol_or_keyword(char* text, int* index_in_text) -> Lisp_Object* { - bool keyword = false; - if (text[*index_in_text] == ':') { - keyword = true; - step_char(text, index_in_text); - } - - int atom_length = get_atom_text_length(text, index_in_text); - char orig = text[*index_in_text+atom_length]; - text[*index_in_text+atom_length] = '\0'; - - - String* str_keyword; - Lisp_Object* ret; - try str_keyword = Memory::create_string("", atom_length); - strcpy(&str_keyword->data, text+*index_in_text); - - if (keyword) { - try ret = Memory::get_keyword(str_keyword); - } else { - try ret = Memory::get_symbol(str_keyword); - } - - - text[*index_in_text+atom_length] = orig; - step_char(text, index_in_text, atom_length); - - return ret; - } - - proc parse_string(char* text, int* index_in_text) -> Lisp_Object* { - // the first character is the '"' - step_char(text, index_in_text); - - // now we are at the first letter, if this is the closing '"' then - // it's easy - if (text[*index_in_text] == '"') { - Lisp_Object* ret; - try ret = Memory::create_lisp_object(Memory::create_string("", 0)); - // inject_scl(ret); - - // plus one because we want to go after the quotes - step_char(text, index_in_text); - - return ret; - } - - // okay so the first letter was not actually closing the string... - int string_length = 0; - bool escaping = false; - while (escaping || text[*index_in_text+string_length] != '"') { - if (escaping) { - escaping = false; - } - else - if (text[*index_in_text+string_length] == '\\') - escaping = true; - - ++string_length; - } - - // we found the end of the string - text[*index_in_text+string_length] = '\0'; - - // NOTE(Felix): Tactic: Through unescaping the string will - // only get shorter, so we replace it inplace and later jump - // to the original end of the string. - int new_len; - try new_len = unescape_string(text+(*index_in_text)); - - String* string = Memory::create_string("", new_len); - - strcpy(&string->data, text+(*index_in_text)); - // printf("------ %s\n", &string->data); - - text[*index_in_text+string_length] = '"'; - - // plus one because we want to go after the quotes - step_char(text, index_in_text, string_length+1); - - Lisp_Object* ret; - try ret = Memory::create_lisp_object(string); - - // inject_scl(ret); - return ret; - } - - proc parse_atom(char* text, int* index_in_text) -> Lisp_Object* { - profile_this(); - Lisp_Object* ret; - // numbers - if ((text[*index_in_text] <= 57 && // if number - text[*index_in_text] >= 48) - || - ((text[*index_in_text] == '+' || // or if sign and then number - text[*index_in_text] == '-') - && - (text[*index_in_text +1] <= 57 && - text[*index_in_text +1] >= 48)) - || - ((text[*index_in_text] == '.') // or if . and then number - && - (text[*index_in_text +1] <= 57 && - text[*index_in_text +1] >= 48))) - { - try ret = parse_number(text, index_in_text); - } - - else if (text[*index_in_text] == '"') - try ret = parse_string(text, index_in_text); - else - try ret = parse_symbol_or_keyword(text, index_in_text); - - return ret; - } - - - - proc parse_list(char* text, int* index_in_text) -> Lisp_Object* { - profile_this(); - if (text[*index_in_text] != '(') { - create_parsing_error("a list cannot be parsed here"); - return nullptr; - } - step_char_and_eat_until_code(text, index_in_text); - - if (text[*index_in_text] == ')') { - step_char(text, index_in_text); - return Memory::nil; - } - - Lisp_Object* first_elem; - Lisp_Object* ret; - Lisp_Object* head; - - - try first_elem = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(first_elem, Memory::nil); - head = ret; - - eat_until_code(text, index_in_text); - while (text[*index_in_text] != ')') { - Lisp_Object* element; - - if (text[*index_in_text+0] == '.' && - text[*index_in_text+1] == ' ') - { - step_char(text, index_in_text, 2); - try element = parse_expression(text, index_in_text); - head->value.pair.rest = element; - - eat_until_code(text, index_in_text); - if (text[*index_in_text] != ')') { - create_parsing_error("expected the list to end after the dotted end."); - return nullptr; - } - step_char(text, index_in_text); - return ret; - } - - try element = parse_expression(text, index_in_text); - try head->value.pair.rest = Memory::create_lisp_object_pair(element, Memory::nil); - head = head->value.pair.rest; - eat_until_code(text, index_in_text); - } - step_char(text, index_in_text); - return ret; - } - - proc maybe_expand_short_form(char* text, int* index_in_text) -> Lisp_Object* { - profile_this(); - Lisp_Object* vector_sym = Memory::get_symbol("vector"); - Lisp_Object* hash_map_sym = Memory::get_symbol("hash-map"); - - Lisp_Object* quote_sym = Memory::get_symbol("quote"); - Lisp_Object* quasiquote_sym = Memory::get_symbol("quasiquote"); - Lisp_Object* unquote_sym = Memory::get_symbol("unquote"); - Lisp_Object* unquote_splicing_sym = Memory::get_symbol("unquote-splicing"); - - Lisp_Object* ret = nullptr; - Lisp_Object* expr; - - switch (text[*index_in_text]) { - case '\'': { - // quote - step_char_and_eat_until_code(text, index_in_text); - try expr = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(expr, Memory::nil); - try ret = Memory::create_lisp_object_pair(quote_sym, ret); - } break; - case '`': { - // quasiquote - step_char_and_eat_until_code(text, index_in_text); - try expr = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(expr, Memory::nil); - try ret = Memory::create_lisp_object_pair(quasiquote_sym, ret); - } break; - case ',': { - step_char_and_eat_until_code(text, index_in_text); - if (text[*index_in_text] == '@') { - // unquote-splicing - step_char_and_eat_until_code(text, index_in_text); - try expr = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(expr, Memory::nil); - try ret = Memory::create_lisp_object_pair(unquote_splicing_sym, ret); - } else { - // unquote - try expr = parse_expression(text, index_in_text); - try ret = Memory::create_lisp_object_pair(expr, Memory::nil); - try ret = Memory::create_lisp_object_pair(unquote_sym, ret); - } - } break; - case '[': { - // vector - try ret = parse_fancy_delimiter(text, index_in_text, '[', ']', vector_sym); - } break; - case '{': { - // hashmap - try ret = parse_fancy_delimiter(text, index_in_text, '{', '}', hash_map_sym); - } break; - default: break; - } - - return ret; - } - - proc parse_expression(char* text, int* index_in_text) -> Lisp_Object* { - profile_this(); - Lisp_Object* ret; - eat_until_code(text, index_in_text); - try ret = maybe_expand_short_form(text, index_in_text); - if (ret) - return ret; - - if (text[*index_in_text] == '(') { - try ret = parse_list(text, index_in_text); - } else { - try ret = parse_atom(text, index_in_text); - } - - return ret; - } - - proc parse_single_expression(wchar_t* text) -> Lisp_Object* { - char* res = wchar_to_char(text); - defer {free(res);}; - return parse_single_expression(res); - } - - proc parse_single_expression(char* text) -> Lisp_Object* { - parser_file = standard_in; - parser_line = 1; - parser_col = 1; - - int index_in_text = 0; - Lisp_Object* ret; - try ret = parse_expression(text, &index_in_text); - return ret; - } - - - proc parse_program(String* file_name, char* text) -> Array_List* { - profile_this(); - parser_file = file_name; - parser_line = 1; - parser_col = 0; - - Array_List* program = (Array_List*)malloc(sizeof(Array_List)); - program->alloc(); - - int index_in_text = 0; - Lisp_Object* parsed; - - eat_until_code(text, &index_in_text); - while (text[index_in_text] != '\0') { - try parsed = parse_expression(text, &index_in_text); - program->append(parsed); - eat_until_code(text, &index_in_text); - } - return program; - } - -} +namespace Slime::Parser { + String* standard_in; + String* parser_file; + int parser_line; + int parser_col; + + proc eat_comment_line(char* text, int* index_in_text) -> void { + // safety check if we are actually starting a comment here + if (text[*index_in_text] != ';') + return; + + // eat the comment line + do { + ++(*index_in_text); + ++parser_col; + } while (text[(*index_in_text)] != '\n' && + text[(*index_in_text)] != '\r' && + text[(*index_in_text)] != '\0'); + } + + proc step_char(char* text, int* index_in_text, int steps = 1) { + for (int i = 0; i < steps; ++i) { + if (text[(*index_in_text)] == '\n') { + ++parser_line; + parser_col = 0; + } + ++parser_col; + ++(*index_in_text); + } + } + + proc eat_whitespace(char* text, int* index_in_text) -> void { + // skip whitespaces + while (text[(*index_in_text)] == ' ' || + text[(*index_in_text)] == '\t' || + text[(*index_in_text)] == '\n' || + text[(*index_in_text)] == '\r') + { + step_char(text, index_in_text); + } + } + + proc eat_until_code(char* text, int* index_in_text) -> void { + profile_this(); + int position_before; + do { + position_before = *index_in_text; + eat_comment_line(text, index_in_text); + eat_whitespace(text, index_in_text); + } while (position_before != *index_in_text); + } + + proc step_char_and_eat_until_code(char* text, int* index_in_text) { + step_char(text, index_in_text); + eat_until_code(text, index_in_text); + } + + proc parse_fancy_delimiter(char* text, int* index_in_text, char l_delimiter, char r_delimiter, Lisp_Object* first_elem) -> Lisp_Object* { + profile_this(); + if (text[*index_in_text] != l_delimiter) { + create_parsing_error("a fancy cannot be parsed here"); + return nullptr; + } + + Lisp_Object* ret; + Lisp_Object* head; + try ret = Memory::create_lisp_object_pair(first_elem, Memory::nil); + head = ret; + + step_char(text, index_in_text); + + eat_until_code(text, index_in_text); + while (text[*index_in_text] != r_delimiter) { + Lisp_Object* element; + try element = parse_expression(text, index_in_text); + try head->value.pair.rest = Memory::create_lisp_object_pair(element, Memory::nil); + head = head->value.pair.rest; + eat_until_code(text, index_in_text); + } + + step_char(text, index_in_text); + + return ret; + } + + proc get_atom_text_length(char* text, int* index_in_text) -> int { + int atom_length = 0; + while (text[*index_in_text+atom_length] != ' ' && + text[*index_in_text+atom_length] != ')' && + text[*index_in_text+atom_length] != '(' && + text[*index_in_text+atom_length] != '[' && + text[*index_in_text+atom_length] != ']' && + text[*index_in_text+atom_length] != '{' && + text[*index_in_text+atom_length] != '}' && + text[*index_in_text+atom_length] != '\0' && + text[*index_in_text+atom_length] != '\n' && + text[*index_in_text+atom_length] != '\r' && + text[*index_in_text+atom_length] != '\t') + { + ++atom_length; + } + return atom_length; + } + + proc parse_number(char* text, int* index_in_text) -> Lisp_Object* { + Lisp_Object* ret; + try ret = Memory::create_lisp_object(0.0); + + sscanf(text+*index_in_text, "%lf", &ret->value.number); + + int atom_length = get_atom_text_length(text, index_in_text); + step_char(text, index_in_text, atom_length); + + return ret; + } + + proc parse_symbol_or_keyword(char* text, int* index_in_text) -> Lisp_Object* { + bool keyword = false; + if (text[*index_in_text] == ':') { + keyword = true; + step_char(text, index_in_text); + } + + int atom_length = get_atom_text_length(text, index_in_text); + char orig = text[*index_in_text+atom_length]; + text[*index_in_text+atom_length] = '\0'; + + + String* str_keyword; + Lisp_Object* ret; + try str_keyword = Memory::create_string("", atom_length); + strcpy(&str_keyword->data, text+*index_in_text); + + if (keyword) { + try ret = Memory::get_keyword(str_keyword); + } else { + try ret = Memory::get_symbol(str_keyword); + } + + + text[*index_in_text+atom_length] = orig; + step_char(text, index_in_text, atom_length); + + return ret; + } + + proc parse_string(char* text, int* index_in_text) -> Lisp_Object* { + // the first character is the '"' + step_char(text, index_in_text); + + // now we are at the first letter, if this is the closing '"' then + // it's easy + if (text[*index_in_text] == '"') { + Lisp_Object* ret; + try ret = Memory::create_lisp_object(Memory::create_string("", 0)); + // inject_scl(ret); + + // plus one because we want to go after the quotes + step_char(text, index_in_text); + + return ret; + } + + // okay so the first letter was not actually closing the string... + int string_length = 0; + bool escaping = false; + while (escaping || text[*index_in_text+string_length] != '"') { + if (escaping) { + escaping = false; + } + else + if (text[*index_in_text+string_length] == '\\') + escaping = true; + + ++string_length; + } + + // we found the end of the string + text[*index_in_text+string_length] = '\0'; + + // NOTE(Felix): Tactic: Through unescaping the string will + // only get shorter, so we replace it inplace and later jump + // to the original end of the string. + int new_len; + try new_len = unescape_string(text+(*index_in_text)); + + String* string = Memory::create_string("", new_len); + + strcpy(&string->data, text+(*index_in_text)); + // printf("------ %s\n", &string->data); + + text[*index_in_text+string_length] = '"'; + + // plus one because we want to go after the quotes + step_char(text, index_in_text, string_length+1); + + Lisp_Object* ret; + try ret = Memory::create_lisp_object(string); + + // inject_scl(ret); + return ret; + } + + proc parse_atom(char* text, int* index_in_text) -> Lisp_Object* { + profile_this(); + Lisp_Object* ret; + // numbers + if ((text[*index_in_text] <= 57 && // if number + text[*index_in_text] >= 48) + || + ((text[*index_in_text] == '+' || // or if sign and then number + text[*index_in_text] == '-') + && + (text[*index_in_text +1] <= 57 && + text[*index_in_text +1] >= 48)) + || + ((text[*index_in_text] == '.') // or if . and then number + && + (text[*index_in_text +1] <= 57 && + text[*index_in_text +1] >= 48))) + { + try ret = parse_number(text, index_in_text); + } + + else if (text[*index_in_text] == '"') + try ret = parse_string(text, index_in_text); + else + try ret = parse_symbol_or_keyword(text, index_in_text); + + return ret; + } + + + + proc parse_list(char* text, int* index_in_text) -> Lisp_Object* { + profile_this(); + if (text[*index_in_text] != '(') { + create_parsing_error("a list cannot be parsed here"); + return nullptr; + } + step_char_and_eat_until_code(text, index_in_text); + + if (text[*index_in_text] == ')') { + step_char(text, index_in_text); + return Memory::nil; + } + + Lisp_Object* first_elem; + Lisp_Object* ret; + Lisp_Object* head; + + + try first_elem = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(first_elem, Memory::nil); + head = ret; + + eat_until_code(text, index_in_text); + while (text[*index_in_text] != ')') { + Lisp_Object* element; + + if (text[*index_in_text+0] == '.' && + text[*index_in_text+1] == ' ') + { + step_char(text, index_in_text, 2); + try element = parse_expression(text, index_in_text); + head->value.pair.rest = element; + + eat_until_code(text, index_in_text); + if (text[*index_in_text] != ')') { + create_parsing_error("expected the list to end after the dotted end."); + return nullptr; + } + step_char(text, index_in_text); + return ret; + } + + try element = parse_expression(text, index_in_text); + try head->value.pair.rest = Memory::create_lisp_object_pair(element, Memory::nil); + head = head->value.pair.rest; + eat_until_code(text, index_in_text); + } + step_char(text, index_in_text); + return ret; + } + + proc maybe_expand_short_form(char* text, int* index_in_text) -> Lisp_Object* { + profile_this(); + Lisp_Object* vector_sym = Memory::get_symbol("vector"); + Lisp_Object* hash_map_sym = Memory::get_symbol("hash-map"); + + Lisp_Object* quote_sym = Memory::get_symbol("quote"); + Lisp_Object* quasiquote_sym = Memory::get_symbol("quasiquote"); + Lisp_Object* unquote_sym = Memory::get_symbol("unquote"); + Lisp_Object* unquote_splicing_sym = Memory::get_symbol("unquote-splicing"); + + Lisp_Object* ret = nullptr; + Lisp_Object* expr; + + switch (text[*index_in_text]) { + case '\'': { + // quote + step_char_and_eat_until_code(text, index_in_text); + try expr = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(expr, Memory::nil); + try ret = Memory::create_lisp_object_pair(quote_sym, ret); + } break; + case '`': { + // quasiquote + step_char_and_eat_until_code(text, index_in_text); + try expr = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(expr, Memory::nil); + try ret = Memory::create_lisp_object_pair(quasiquote_sym, ret); + } break; + case ',': { + step_char_and_eat_until_code(text, index_in_text); + if (text[*index_in_text] == '@') { + // unquote-splicing + step_char_and_eat_until_code(text, index_in_text); + try expr = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(expr, Memory::nil); + try ret = Memory::create_lisp_object_pair(unquote_splicing_sym, ret); + } else { + // unquote + try expr = parse_expression(text, index_in_text); + try ret = Memory::create_lisp_object_pair(expr, Memory::nil); + try ret = Memory::create_lisp_object_pair(unquote_sym, ret); + } + } break; + case '[': { + // vector + try ret = parse_fancy_delimiter(text, index_in_text, '[', ']', vector_sym); + } break; + case '{': { + // hashmap + try ret = parse_fancy_delimiter(text, index_in_text, '{', '}', hash_map_sym); + } break; + default: break; + } + + return ret; + } + + proc parse_expression(char* text, int* index_in_text) -> Lisp_Object* { + profile_this(); + Lisp_Object* ret; + eat_until_code(text, index_in_text); + try ret = maybe_expand_short_form(text, index_in_text); + if (ret) + return ret; + + if (text[*index_in_text] == '(') { + try ret = parse_list(text, index_in_text); + } else { + try ret = parse_atom(text, index_in_text); + } + + return ret; + } + + proc parse_single_expression(wchar_t* text) -> Lisp_Object* { + char* res = wchar_to_char(text); + defer {free(res);}; + return parse_single_expression(res); + } + + proc parse_single_expression(char* text) -> Lisp_Object* { + parser_file = standard_in; + parser_line = 1; + parser_col = 1; + + int index_in_text = 0; + Lisp_Object* ret; + try ret = parse_expression(text, &index_in_text); + return ret; + } + + + proc parse_program(String* file_name, char* text) -> Array_List* { + profile_this(); + parser_file = file_name; + parser_line = 1; + parser_col = 0; + + Array_List* program = (Array_List*)malloc(sizeof(Array_List)); + program->alloc(); + + int index_in_text = 0; + Lisp_Object* parsed; + + eat_until_code(text, &index_in_text); + while (text[index_in_text] != '\0') { + try parsed = parse_expression(text, &index_in_text); + program->append(parsed); + eat_until_code(text, &index_in_text); + } + return program; + } + +} diff --git a/src/platform.cpp b/src/platform.cpp index 61c620a..e251118 100644 --- a/src/platform.cpp +++ b/src/platform.cpp @@ -1,170 +1,170 @@ -namespace Slime { - - inline proc get_cwd() -> char* { - const int buf_size = 2048; - char* res = (char*)malloc(buf_size * sizeof(char)); - -#ifdef _MSC_VER - _getcwd(res, buf_size); -#else - getcwd(res, buf_size); -#endif - - return res; - } - - inline proc change_cwd(char* dir) -> void { -#ifdef _MSC_VER - _chdir(dir); -#else - chdir(dir); -#endif - } - - -#ifdef _MSC_VER - int vasprintf(char **strp, const char *fmt, va_list ap) { - // _vscprintf tells you how big the buffer needs to be - int len = _vscprintf(fmt, ap); - if (len == -1) { - return -1; - } - size_t size = (size_t)len + 1; - char *str = (char*)malloc(size); - if (!str) { - return -1; - } - // _vsprintf_s is the "secure" version of vsprintf - int r = vsprintf_s(str, len + 1, fmt, ap); - if (r == -1) { - free(str); - return -1; - } - *strp = str; - return r; - } - - int asprintf(char **strp, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - int r = vasprintf(strp, fmt, ap); - va_end(ap); - return r; - } -#endif - - proc get_exe_dir() -> char* { -#ifdef _MSC_VER - DWORD last_error; - DWORD result; - DWORD path_size = 1024; - char* path = (char*)malloc(1024); - - while (true) { - memset(path, 0, path_size); - result = GetModuleFileName(0, path, path_size - 1); - last_error = GetLastError(); - - if (0 == result) { - free(path); - path = 0; - break; - } - else if (result == path_size - 1) { - free(path); - /* May need to also check for ERROR_SUCCESS here if XP/2K */ - if (ERROR_INSUFFICIENT_BUFFER != last_error) { - path = 0; - break; - } - path_size = path_size * 2; - path = (char*)malloc(path_size); - } - else - break; - } - - if (!path) { - fprintf(stderr, "Failure: %ld\n", last_error); - return nullptr; - } - else { - // remove the exe name, so we are only left with the path - - int index_in_path = -1; - int last_backslash = -1; - - char c; - while ((c = path[++index_in_path]) != '\0') { - if (c == '\\') - last_backslash = index_in_path; - } - - // we are assuming there are some backslashes - path[last_backslash+1] = '\0'; - - return path; - } -#else - ssize_t size = 512, i, n; - char *path, *temp; - - while (1) { - size_t used; - - path = (char*)malloc(size); - if (!path) { - errno = ENOMEM; - return NULL; - } - - used = readlink("/proc/self/exe", path, size); - - if (used == -1) { - const int saved_errno = errno; - free(path); - errno = saved_errno; - return NULL; - } else - if (used < 1) { - free(path); - errno = EIO; - return NULL; - } - - if ((size_t)used >= size) { - free(path); - size = (size | 2047) + 2049; - continue; - } - - size = (size_t)used; - break; - } - - /* Find final slash. */ - n = 0; - for (i = 0; i < size; i++) - if (path[i] == '/') - n = i; - - /* Optimize allocated size, - ensuring there is room for - a final slash and a - string-terminating '\0', */ - temp = path; - path = (char*)realloc(temp, n + 2); - if (!path) { - free(temp); - errno = ENOMEM; - return NULL; - } - - /* and properly trim and terminate the path string. */ - path[n+0] = '/'; - path[n+1] = '\0'; - - return path; -#endif - } -} +namespace Slime { + + inline proc get_cwd() -> char* { + const int buf_size = 2048; + char* res = (char*)malloc(buf_size * sizeof(char)); + +#ifdef _MSC_VER + _getcwd(res, buf_size); +#else + getcwd(res, buf_size); +#endif + + return res; + } + + inline proc change_cwd(char* dir) -> void { +#ifdef _MSC_VER + _chdir(dir); +#else + chdir(dir); +#endif + } + + +#ifdef _MSC_VER + int vasprintf(char **strp, const char *fmt, va_list ap) { + // _vscprintf tells you how big the buffer needs to be + int len = _vscprintf(fmt, ap); + if (len == -1) { + return -1; + } + size_t size = (size_t)len + 1; + char *str = (char*)malloc(size); + if (!str) { + return -1; + } + // _vsprintf_s is the "secure" version of vsprintf + int r = vsprintf_s(str, len + 1, fmt, ap); + if (r == -1) { + free(str); + return -1; + } + *strp = str; + return r; + } + + int asprintf(char **strp, const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + int r = vasprintf(strp, fmt, ap); + va_end(ap); + return r; + } +#endif + + proc get_exe_dir() -> char* { +#ifdef _MSC_VER + DWORD last_error; + DWORD result; + DWORD path_size = 1024; + char* path = (char*)malloc(1024); + + while (true) { + memset(path, 0, path_size); + result = GetModuleFileName(0, path, path_size - 1); + last_error = GetLastError(); + + if (0 == result) { + free(path); + path = 0; + break; + } + else if (result == path_size - 1) { + free(path); + /* May need to also check for ERROR_SUCCESS here if XP/2K */ + if (ERROR_INSUFFICIENT_BUFFER != last_error) { + path = 0; + break; + } + path_size = path_size * 2; + path = (char*)malloc(path_size); + } + else + break; + } + + if (!path) { + fprintf(stderr, "Failure: %ld\n", last_error); + return nullptr; + } + else { + // remove the exe name, so we are only left with the path + + int index_in_path = -1; + int last_backslash = -1; + + char c; + while ((c = path[++index_in_path]) != '\0') { + if (c == '\\') + last_backslash = index_in_path; + } + + // we are assuming there are some backslashes + path[last_backslash+1] = '\0'; + + return path; + } +#else + ssize_t size = 512, i, n; + char *path, *temp; + + while (1) { + size_t used; + + path = (char*)malloc(size); + if (!path) { + errno = ENOMEM; + return NULL; + } + + used = readlink("/proc/self/exe", path, size); + + if (used == -1) { + const int saved_errno = errno; + free(path); + errno = saved_errno; + return NULL; + } else + if (used < 1) { + free(path); + errno = EIO; + return NULL; + } + + if ((size_t)used >= size) { + free(path); + size = (size | 2047) + 2049; + continue; + } + + size = (size_t)used; + break; + } + + /* Find final slash. */ + n = 0; + for (i = 0; i < size; i++) + if (path[i] == '/') + n = i; + + /* Optimize allocated size, + ensuring there is room for + a final slash and a + string-terminating '\0', */ + temp = path; + path = (char*)realloc(temp, n + 2); + if (!path) { + free(temp); + errno = ENOMEM; + return NULL; + } + + /* and properly trim and terminate the path string. */ + path[n+0] = '/'; + path[n+1] = '\0'; + + return path; +#endif + } +} diff --git a/src/structs.cpp b/src/structs.cpp index 51199a2..8707d7c 100644 --- a/src/structs.cpp +++ b/src/structs.cpp @@ -112,10 +112,6 @@ namespace Slime { struct Environment { Array_List parents; Hash_Map hm; - - ~Environment() { - hm.~Hash_Map(); - } }; struct Function { diff --git a/src/testing.cpp b/src/testing.cpp index f99761d..9cc997b 100644 --- a/src/testing.cpp +++ b/src/testing.cpp @@ -1,595 +1,595 @@ -namespace Slime { - -#define epsilon 2.2204460492503131E-16 - -#define testresult int -#define pass 1 -#define fail 0 - -#define print_assert_equal_fail(variable, value, type, format) \ - printf("\n%s:%d: Assertion failed\n\tfor '" #variable "'" \ - "\n\texpected: " format \ - "\n\tgot: " format "\n", \ - __FILE__, __LINE__, (type)value, (type)variable) - -#define print_assert_not_equal_fail(variable, value, type, format) \ - printf("\n%s:%d: Assertion failed\n\tfor '" #variable "'" \ - "\n\texpected not: " format \ - "\n\tgot anyways: " format "\n", \ - __FILE__, __LINE__, (type)value, (type)variable) - -#define assert_equal_int(variable, value) \ - if (variable != value) { \ - print_assert_equal_fail(variable, value, size_t, "%zd"); \ - return fail; \ - } - -#define assert_not_equal_int(variable, value) \ - if (variable == value) { \ - print_assert_not_equal_fail(variable, value, size_t, "%zd"); \ - return fail; \ - } - -#define assert_no_error() \ - if (Globals::error) { \ - print_assert_equal_fail(Globals::error, 0, size_t, "%zd"); \ - printf("\nExpected no error to occur," \ - " but an error occured anyways:\n"); \ - return fail; \ - } \ - -#define assert_error() \ - if (!Globals::error) { \ - print_assert_not_equal_fail(Globals::error, 0, size_t, "%zd"); \ - printf("\nExpected an error to occur," \ - " but no error occured:\n"); \ - return fail; \ - } \ - -#define assert_equal_double(variable, value) \ - if (fabs((double)variable - (double)value) > epsilon) { \ - print_assert_equal_fail(variable, value, double, "%f"); \ - return fail; \ - } - -#define assert_not_equal_double(variable, value) \ - if (fabs((double)variable - (double)value) <= epsilon) { \ - print_assert_not_equal_fail(variable, value, double, "%f"); \ - return fail; \ - } - -#define assert_equal_string(variable, value) \ - if (!string_equal(variable, value)) { \ - print_assert_equal_fail(&variable->data, value, char*, "%s"); \ - return fail; \ - } - -#define assert_equal_type(node, _type) \ - if (Memory::get_type(node) != _type) { \ - print_assert_equal_fail( \ - Lisp_Object_Type_to_string(Memory::get_type(node)), \ - Lisp_Object_Type_to_string(_type), char*, "%s"); \ - return fail; \ - } \ - -#define assert_null(variable) \ - assert_equal_int(variable, nullptr) - -#define assert_not_null(variable) \ - assert_not_equal_int(variable, nullptr) - -#define invoke_test(name) \ - fputs("" #name ":", stdout); \ - if (name() == pass) { \ - for(size_t i = strlen(#name); i < 70; ++i) \ - fputs((i%3==1)? "." : " ", stdout); \ - fputs(console_green "passed\n" console_normal, stdout); \ - } \ - else { \ - result = false; \ - for(int i = -1; i < 70; ++i) \ - fputs((i%3==1)? "." : " ", stdout); \ - fputs(console_red "failed\n" console_normal, stdout); \ - if(Globals::error) { \ - free(Globals::error); \ - Globals::error = nullptr; \ - } \ - } \ - -#define invoke_test_script(name) \ - fputs("" name ":", stdout); \ - if (test_file("tests/" name ".slime") == pass) { \ - for(size_t i = strlen(name); i < 70; ++i) \ - fputs((i%3==1)? "." : " ", stdout); \ - fputs(console_green "passed\n" console_normal, stdout); \ - } \ - else { \ - result = false; \ - for(int i = -1; i < 70; ++i) \ - fputs((i%3==1)? "." : " ", stdout); \ - fputs(console_red "failed\n" console_normal, stdout); \ - if(Globals::error) { \ - free(Globals::error); \ - Globals::error = nullptr; \ - } \ - } - - proc test_array_lists_adding_and_removing() -> testresult { - // test adding and removing - Array_List list; - list.alloc(); - defer { - list.dealloc(); - }; - list.append(1); - list.append(2); - list.append(3); - list.append(4); - - assert_equal_int(list.next_index, 4); - - list.remove_index(0); - - assert_equal_int(list.next_index, 3); - assert_equal_int(list[0], 4); - assert_equal_int(list[1], 2); - assert_equal_int(list[2], 3); - - list.remove_index(2); - - assert_equal_int(list.next_index, 2); - assert_equal_int(list[0], 4); - assert_equal_int(list[1], 2); - - return pass; - } - - proc test_array_lists_sorting() -> testresult { - // test adding and removing - Array_List list; - list.alloc(); - defer { - list.dealloc(); - }; - - list.append(1); - list.append(2); - list.append(3); - list.append(4); - - list.sort(); - - assert_equal_int(list.next_index, 4); - - assert_equal_int(list[0], 1); - assert_equal_int(list[1], 2); - assert_equal_int(list[2], 3); - assert_equal_int(list[3], 4); - - list.append(0); - list.append(5); - - assert_equal_int(list.next_index, 6); - - list.sort(); - - assert_equal_int(list[0], 0); - assert_equal_int(list[1], 1); - assert_equal_int(list[2], 2); - assert_equal_int(list[3], 3); - assert_equal_int(list[4], 4); - assert_equal_int(list[5], 5); - - return pass; - } - - proc test_array_lists_searching() -> testresult { - Array_List list; - list.alloc(); - defer { - list.dealloc(); - }; - - list.append(1); - list.append(2); - list.append(3); - list.append(4); - - int index = list.sorted_find(3); - assert_equal_int(index, 2); - - index = list.sorted_find(1); - assert_equal_int(index, 0); - - index = list.sorted_find(5); - assert_equal_int(index, -1); - - return pass; - } - - proc test_parse_atom() -> testresult { - int index_in_text = 0; - char string[] = - "123 -1.23e-2 " // numbers - "\"asd\" " // strings - ":key1 :key:2 " // keywords - "sym +"; // symbols - - // test numbers - Lisp_Object* result = Parser::parse_atom(string, &index_in_text); - - assert_equal_type(result, Lisp_Object_Type::Number); - assert_equal_double(result->value.number, 123); - - ++index_in_text; - - result = Parser::parse_atom(string, &index_in_text); - assert_equal_type(result, Lisp_Object_Type::Number); - assert_equal_double(result->value.number, -1.23e-2); - - // test strings - ++index_in_text; - - result = Parser::parse_atom(string, &index_in_text); - assert_equal_type(result, Lisp_Object_Type::String); - assert_equal_string(result->value.string, "asd"); - - // test keywords - ++index_in_text; - - result = Parser::parse_atom(string, &index_in_text); - assert_equal_type(result, Lisp_Object_Type::Keyword); - assert_equal_string(result->value.symbol, "key1"); - - ++index_in_text; - - result = Parser::parse_atom(string, &index_in_text); - assert_equal_type(result, Lisp_Object_Type::Keyword); - assert_equal_string(result->value.symbol, "key:2"); - - // test symbols - ++index_in_text; - - result = Parser::parse_atom(string, &index_in_text); - assert_equal_type(result, Lisp_Object_Type::Symbol); - assert_equal_string(result->value.symbol, "sym"); - - ++index_in_text; - - result = Parser::parse_atom(string, &index_in_text); - assert_equal_type(result, Lisp_Object_Type::Symbol); - assert_equal_string(result->value.symbol, "+"); - - return pass; - } - - proc test_parse_expression() -> testresult { - int index_in_text = 0; - char string[] = "(fun + 12)"; - - Lisp_Object* result = Parser::parse_expression(string, &index_in_text); - assert_no_error(); - - assert_equal_type(result, Lisp_Object_Type::Pair); - assert_equal_type(result->value.pair.first, Lisp_Object_Type::Symbol); - assert_equal_string(result->value.pair.first->value.symbol, "fun"); - - result = result->value.pair.rest; - - assert_equal_type(result, Lisp_Object_Type::Pair); - assert_equal_type(result->value.pair.first, Lisp_Object_Type::Symbol); - assert_equal_string(result->value.pair.first->value.symbol, "+"); - - result = result->value.pair.rest; - - assert_equal_type(result, Lisp_Object_Type::Pair); - assert_equal_type(result->value.pair.first, Lisp_Object_Type::Number); - assert_equal_double(result->value.pair.first->value.number, 12); - - result = result->value.pair.rest; - - assert_equal_type(result, Lisp_Object_Type::Nil); - - char string2[] = "(define fun (lambda (x) (+ 5 (* x x ))))"; - index_in_text = 0; - - result = Parser::parse_expression(string2, &index_in_text); - assert_no_error(); - - assert_equal_type(result, Lisp_Object_Type::Pair); - assert_equal_type(result->value.pair.first, Lisp_Object_Type::Symbol); - assert_equal_string(result->value.pair.first->value.symbol, "define"); - - result = result->value.pair.rest; - - assert_equal_type(result, Lisp_Object_Type::Pair); - assert_equal_type(result->value.pair.first, Lisp_Object_Type::Symbol); - assert_equal_string(result->value.pair.first->value.symbol, "fun"); - - result = result->value.pair.rest; - - assert_equal_type(result, Lisp_Object_Type::Pair); - assert_equal_type(result->value.pair.first, Lisp_Object_Type::Pair); - assert_equal_type(result->value.pair.first->value.pair.first, Lisp_Object_Type::Symbol); - assert_equal_string(result->value.pair.first->value.pair.first->value.symbol, "lambda"); - - result = result->value.pair.rest; - - return pass; - } - - proc test_built_in_add() -> testresult { - char exp_string[] = "(+ 10 4)"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string); - Lisp_Object* result; - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Number); - assert_equal_double(result->value.number, 14); - - return pass; - } - - proc test_built_in_substract() -> testresult { - char exp_string[] = "(- 10 4)"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string); - Lisp_Object* result; - - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Number); - assert_equal_double(result->value.number, 6); - - return pass; - } - - - proc test_built_in_multiply() -> testresult { - char exp_string[] = "(* 10 4)"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string); - Lisp_Object* result; - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Number); - assert_equal_double(result->value.number, 40); - - return pass; - } - - - proc test_built_in_divide() -> testresult { - char exp_string[] = "(/ 20 4)"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string); - Lisp_Object* result; - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Number); - assert_equal_double(result->value.number, 5); - - return pass; - } - - - proc test_built_in_if() -> testresult { - char exp_string1[] = "(if 1 4 5)"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string1); - Lisp_Object* result; - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Number); - assert_equal_double(result->value.number, 4); - - char exp_string2[] = "(if () 4 5)"; - expression = Parser::parse_single_expression(exp_string2); - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Number); - assert_equal_double(result->value.number, 5); - - return pass; - } - - proc test_built_in_and() -> testresult { - char exp_string1[] = "(and 1 \"asd\" 4)"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string1); - Lisp_Object* result; - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::T); - - // a false case - char exp_string2[] = "(and () \"asd\" 4)"; - expression = Parser::parse_single_expression(exp_string2); - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Nil); - - return pass; - } - - proc test_built_in_or() -> testresult { - char exp_string1[] = "(or \"asd\" nil)"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string1); - Lisp_Object* result; - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::T); - - // a false case - char exp_string2[] = "(or () ())"; - expression = Parser::parse_single_expression(exp_string2); - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Nil); - - return pass; - } - - - proc test_built_in_not() -> testresult { - char exp_string1[] = "(not ())"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string1); - Lisp_Object* result; - try result = eval_expr(expression); - - // a true case - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::T); - - // a false case - char exp_string2[] = "(not \"asd xD\")"; - expression = Parser::parse_single_expression(exp_string2); - try result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Nil); - - return pass; - } - - proc test_built_in_type() -> testresult { - // Environment* env; - // try env = get_root_environment(); - - // normal type testing - char exp_string1[] = "(begin (define a 10)(type a))"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string1); - Lisp_Object* result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Keyword); - assert_equal_string(result->value.symbol, "number"); - - // setting user type - char exp_string2[] = "(begin (set-type! a :my-type)(type a))"; - expression = Parser::parse_single_expression(exp_string2); - result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Keyword); - assert_equal_string(result->value.symbol, "my-type"); - - // // trying to set invalid user type - // char exp_string3[] = "(begin (set-type! a \"wrong tpye\")(type a))"; - // expression = Parser::parse_single_expression(exp_string3); - // assert_no_error(); - - // ignore_logging { - // dont_break_on_errors { - // result = eval_expr(expression); - // } - // } - - // assert_error(); - // delete_error(); - - // deleting user type - char exp_string4[] = "(begin (delete-type! a)(type a))"; - expression = Parser::parse_single_expression(exp_string4); - result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Keyword); - assert_equal_string(result->value.symbol, "number"); - - return pass; - } - - proc test_singular_t_and_nil() -> testresult { - // nil testing - char exp_string1[] = "()"; - char exp_string2[] = "nil"; - Lisp_Object* expression = Parser::parse_single_expression(exp_string1); - Lisp_Object* result = eval_expr(expression); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Nil); - assert_equal_int(expression, result); - - Lisp_Object* expression2 = Parser::parse_single_expression(exp_string2); - Lisp_Object* result2 = eval_expr(expression2); - - assert_no_error(); - assert_not_null(result); - assert_equal_type(result, Lisp_Object_Type::Nil); - assert_equal_int(result, result2); - assert_equal_int(expression, Memory::nil); - - // t testing - char exp_string3[] = "t"; - Lisp_Object* expression3 = Parser::parse_single_expression(exp_string3); - Lisp_Object* result3 = eval_expr(expression3); - - assert_no_error(); - assert_not_null(result3); - - return pass; - } - - proc test_singular_symbols() -> testresult { - auto cc_s_aa = Memory::get_symbol("aa"); - auto cc_s_aa2 = Memory::get_symbol("aa2"); - auto s_s_aa = Memory::get_symbol(Memory::create_string("aa")); - auto s_s_aa2 = Memory::get_symbol(Memory::create_string("aa2")); - - assert_equal_int(cc_s_aa, s_s_aa); - assert_equal_int(cc_s_aa2, s_s_aa2); - assert_not_equal_int(cc_s_aa, cc_s_aa2); - - return pass; - } - - proc test_file(const char* file) -> testresult { - profile_with_name(file); - // Memory::reset(); - // assert_no_error(); - - push_environment(Memory::create_child_environment(get_current_environment())); - built_in_load(Memory::create_string(file)); - assert_no_error(); - pop_environment(); - - return pass; - } - - proc run_all_tests() -> bool { - profile_this(); - - bool result = true; - - try Memory::init(409600); - defer { - if_debug { - Slime::Memory::free_everything(); - } - }; - +namespace Slime { + +#define epsilon 2.2204460492503131E-16 + +#define testresult int +#define pass 1 +#define fail 0 + +#define print_assert_equal_fail(variable, value, type, format) \ + printf("\n%s:%d: Assertion failed\n\tfor '" #variable "'" \ + "\n\texpected: " format \ + "\n\tgot: " format "\n", \ + __FILE__, __LINE__, (type)value, (type)variable) + +#define print_assert_not_equal_fail(variable, value, type, format) \ + printf("\n%s:%d: Assertion failed\n\tfor '" #variable "'" \ + "\n\texpected not: " format \ + "\n\tgot anyways: " format "\n", \ + __FILE__, __LINE__, (type)value, (type)variable) + +#define assert_equal_int(variable, value) \ + if (variable != value) { \ + print_assert_equal_fail(variable, value, size_t, "%zd"); \ + return fail; \ + } + +#define assert_not_equal_int(variable, value) \ + if (variable == value) { \ + print_assert_not_equal_fail(variable, value, size_t, "%zd"); \ + return fail; \ + } + +#define assert_no_error() \ + if (Globals::error) { \ + print_assert_equal_fail(Globals::error, 0, size_t, "%zd"); \ + printf("\nExpected no error to occur," \ + " but an error occured anyways:\n"); \ + return fail; \ + } \ + +#define assert_error() \ + if (!Globals::error) { \ + print_assert_not_equal_fail(Globals::error, 0, size_t, "%zd"); \ + printf("\nExpected an error to occur," \ + " but no error occured:\n"); \ + return fail; \ + } \ + +#define assert_equal_double(variable, value) \ + if (fabs((double)variable - (double)value) > epsilon) { \ + print_assert_equal_fail(variable, value, double, "%f"); \ + return fail; \ + } + +#define assert_not_equal_double(variable, value) \ + if (fabs((double)variable - (double)value) <= epsilon) { \ + print_assert_not_equal_fail(variable, value, double, "%f"); \ + return fail; \ + } + +#define assert_equal_string(variable, value) \ + if (!string_equal(variable, value)) { \ + print_assert_equal_fail(&variable->data, value, char*, "%s"); \ + return fail; \ + } + +#define assert_equal_type(node, _type) \ + if (Memory::get_type(node) != _type) { \ + print_assert_equal_fail( \ + Lisp_Object_Type_to_string(Memory::get_type(node)), \ + Lisp_Object_Type_to_string(_type), char*, "%s"); \ + return fail; \ + } \ + +#define assert_null(variable) \ + assert_equal_int(variable, nullptr) + +#define assert_not_null(variable) \ + assert_not_equal_int(variable, nullptr) + +#define invoke_test(name) \ + fputs("" #name ":", stdout); \ + if (name() == pass) { \ + for(size_t i = strlen(#name); i < 70; ++i) \ + fputs((i%3==1)? "." : " ", stdout); \ + fputs(console_green "passed\n" console_normal, stdout); \ + } \ + else { \ + result = false; \ + for(int i = -1; i < 70; ++i) \ + fputs((i%3==1)? "." : " ", stdout); \ + fputs(console_red "failed\n" console_normal, stdout); \ + if(Globals::error) { \ + free(Globals::error); \ + Globals::error = nullptr; \ + } \ + } \ + +#define invoke_test_script(name) \ + fputs("" name ":", stdout); \ + if (test_file("tests/" name ".slime") == pass) { \ + for(size_t i = strlen(name); i < 70; ++i) \ + fputs((i%3==1)? "." : " ", stdout); \ + fputs(console_green "passed\n" console_normal, stdout); \ + } \ + else { \ + result = false; \ + for(int i = -1; i < 70; ++i) \ + fputs((i%3==1)? "." : " ", stdout); \ + fputs(console_red "failed\n" console_normal, stdout); \ + if(Globals::error) { \ + free(Globals::error); \ + Globals::error = nullptr; \ + } \ + } + + proc test_array_lists_adding_and_removing() -> testresult { + // test adding and removing + Array_List list; + list.alloc(); + defer { + list.dealloc(); + }; + list.append(1); + list.append(2); + list.append(3); + list.append(4); + + assert_equal_int(list.next_index, 4); + + list.remove_index(0); + + assert_equal_int(list.next_index, 3); + assert_equal_int(list[0], 4); + assert_equal_int(list[1], 2); + assert_equal_int(list[2], 3); + + list.remove_index(2); + + assert_equal_int(list.next_index, 2); + assert_equal_int(list[0], 4); + assert_equal_int(list[1], 2); + + return pass; + } + + proc test_array_lists_sorting() -> testresult { + // test adding and removing + Array_List list; + list.alloc(); + defer { + list.dealloc(); + }; + + list.append(1); + list.append(2); + list.append(3); + list.append(4); + + list.sort(); + + assert_equal_int(list.next_index, 4); + + assert_equal_int(list[0], 1); + assert_equal_int(list[1], 2); + assert_equal_int(list[2], 3); + assert_equal_int(list[3], 4); + + list.append(0); + list.append(5); + + assert_equal_int(list.next_index, 6); + + list.sort(); + + assert_equal_int(list[0], 0); + assert_equal_int(list[1], 1); + assert_equal_int(list[2], 2); + assert_equal_int(list[3], 3); + assert_equal_int(list[4], 4); + assert_equal_int(list[5], 5); + + return pass; + } + + proc test_array_lists_searching() -> testresult { + Array_List list; + list.alloc(); + defer { + list.dealloc(); + }; + + list.append(1); + list.append(2); + list.append(3); + list.append(4); + + int index = list.sorted_find(3); + assert_equal_int(index, 2); + + index = list.sorted_find(1); + assert_equal_int(index, 0); + + index = list.sorted_find(5); + assert_equal_int(index, -1); + + return pass; + } + + proc test_parse_atom() -> testresult { + int index_in_text = 0; + char string[] = + "123 -1.23e-2 " // numbers + "\"asd\" " // strings + ":key1 :key:2 " // keywords + "sym +"; // symbols + + // test numbers + Lisp_Object* result = Parser::parse_atom(string, &index_in_text); + + assert_equal_type(result, Lisp_Object_Type::Number); + assert_equal_double(result->value.number, 123); + + ++index_in_text; + + result = Parser::parse_atom(string, &index_in_text); + assert_equal_type(result, Lisp_Object_Type::Number); + assert_equal_double(result->value.number, -1.23e-2); + + // test strings + ++index_in_text; + + result = Parser::parse_atom(string, &index_in_text); + assert_equal_type(result, Lisp_Object_Type::String); + assert_equal_string(result->value.string, "asd"); + + // test keywords + ++index_in_text; + + result = Parser::parse_atom(string, &index_in_text); + assert_equal_type(result, Lisp_Object_Type::Keyword); + assert_equal_string(result->value.symbol, "key1"); + + ++index_in_text; + + result = Parser::parse_atom(string, &index_in_text); + assert_equal_type(result, Lisp_Object_Type::Keyword); + assert_equal_string(result->value.symbol, "key:2"); + + // test symbols + ++index_in_text; + + result = Parser::parse_atom(string, &index_in_text); + assert_equal_type(result, Lisp_Object_Type::Symbol); + assert_equal_string(result->value.symbol, "sym"); + + ++index_in_text; + + result = Parser::parse_atom(string, &index_in_text); + assert_equal_type(result, Lisp_Object_Type::Symbol); + assert_equal_string(result->value.symbol, "+"); + + return pass; + } + + proc test_parse_expression() -> testresult { + int index_in_text = 0; + char string[] = "(fun + 12)"; + + Lisp_Object* result = Parser::parse_expression(string, &index_in_text); + assert_no_error(); + + assert_equal_type(result, Lisp_Object_Type::Pair); + assert_equal_type(result->value.pair.first, Lisp_Object_Type::Symbol); + assert_equal_string(result->value.pair.first->value.symbol, "fun"); + + result = result->value.pair.rest; + + assert_equal_type(result, Lisp_Object_Type::Pair); + assert_equal_type(result->value.pair.first, Lisp_Object_Type::Symbol); + assert_equal_string(result->value.pair.first->value.symbol, "+"); + + result = result->value.pair.rest; + + assert_equal_type(result, Lisp_Object_Type::Pair); + assert_equal_type(result->value.pair.first, Lisp_Object_Type::Number); + assert_equal_double(result->value.pair.first->value.number, 12); + + result = result->value.pair.rest; + + assert_equal_type(result, Lisp_Object_Type::Nil); + + char string2[] = "(define fun (lambda (x) (+ 5 (* x x ))))"; + index_in_text = 0; + + result = Parser::parse_expression(string2, &index_in_text); + assert_no_error(); + + assert_equal_type(result, Lisp_Object_Type::Pair); + assert_equal_type(result->value.pair.first, Lisp_Object_Type::Symbol); + assert_equal_string(result->value.pair.first->value.symbol, "define"); + + result = result->value.pair.rest; + + assert_equal_type(result, Lisp_Object_Type::Pair); + assert_equal_type(result->value.pair.first, Lisp_Object_Type::Symbol); + assert_equal_string(result->value.pair.first->value.symbol, "fun"); + + result = result->value.pair.rest; + + assert_equal_type(result, Lisp_Object_Type::Pair); + assert_equal_type(result->value.pair.first, Lisp_Object_Type::Pair); + assert_equal_type(result->value.pair.first->value.pair.first, Lisp_Object_Type::Symbol); + assert_equal_string(result->value.pair.first->value.pair.first->value.symbol, "lambda"); + + result = result->value.pair.rest; + + return pass; + } + + proc test_built_in_add() -> testresult { + char exp_string[] = "(+ 10 4)"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string); + Lisp_Object* result; + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Number); + assert_equal_double(result->value.number, 14); + + return pass; + } + + proc test_built_in_substract() -> testresult { + char exp_string[] = "(- 10 4)"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string); + Lisp_Object* result; + + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Number); + assert_equal_double(result->value.number, 6); + + return pass; + } + + + proc test_built_in_multiply() -> testresult { + char exp_string[] = "(* 10 4)"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string); + Lisp_Object* result; + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Number); + assert_equal_double(result->value.number, 40); + + return pass; + } + + + proc test_built_in_divide() -> testresult { + char exp_string[] = "(/ 20 4)"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string); + Lisp_Object* result; + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Number); + assert_equal_double(result->value.number, 5); + + return pass; + } + + + proc test_built_in_if() -> testresult { + char exp_string1[] = "(if 1 4 5)"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string1); + Lisp_Object* result; + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Number); + assert_equal_double(result->value.number, 4); + + char exp_string2[] = "(if () 4 5)"; + expression = Parser::parse_single_expression(exp_string2); + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Number); + assert_equal_double(result->value.number, 5); + + return pass; + } + + proc test_built_in_and() -> testresult { + char exp_string1[] = "(and 1 \"asd\" 4)"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string1); + Lisp_Object* result; + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::T); + + // a false case + char exp_string2[] = "(and () \"asd\" 4)"; + expression = Parser::parse_single_expression(exp_string2); + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Nil); + + return pass; + } + + proc test_built_in_or() -> testresult { + char exp_string1[] = "(or \"asd\" nil)"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string1); + Lisp_Object* result; + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::T); + + // a false case + char exp_string2[] = "(or () ())"; + expression = Parser::parse_single_expression(exp_string2); + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Nil); + + return pass; + } + + + proc test_built_in_not() -> testresult { + char exp_string1[] = "(not ())"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string1); + Lisp_Object* result; + try result = eval_expr(expression); + + // a true case + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::T); + + // a false case + char exp_string2[] = "(not \"asd xD\")"; + expression = Parser::parse_single_expression(exp_string2); + try result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Nil); + + return pass; + } + + proc test_built_in_type() -> testresult { + // Environment* env; + // try env = get_root_environment(); + + // normal type testing + char exp_string1[] = "(begin (define a 10)(type a))"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string1); + Lisp_Object* result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Keyword); + assert_equal_string(result->value.symbol, "number"); + + // setting user type + char exp_string2[] = "(begin (set-type! a :my-type)(type a))"; + expression = Parser::parse_single_expression(exp_string2); + result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Keyword); + assert_equal_string(result->value.symbol, "my-type"); + + // // trying to set invalid user type + // char exp_string3[] = "(begin (set-type! a \"wrong tpye\")(type a))"; + // expression = Parser::parse_single_expression(exp_string3); + // assert_no_error(); + + // ignore_logging { + // dont_break_on_errors { + // result = eval_expr(expression); + // } + // } + + // assert_error(); + // delete_error(); + + // deleting user type + char exp_string4[] = "(begin (delete-type! a)(type a))"; + expression = Parser::parse_single_expression(exp_string4); + result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Keyword); + assert_equal_string(result->value.symbol, "number"); + + return pass; + } + + proc test_singular_t_and_nil() -> testresult { + // nil testing + char exp_string1[] = "()"; + char exp_string2[] = "nil"; + Lisp_Object* expression = Parser::parse_single_expression(exp_string1); + Lisp_Object* result = eval_expr(expression); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Nil); + assert_equal_int(expression, result); + + Lisp_Object* expression2 = Parser::parse_single_expression(exp_string2); + Lisp_Object* result2 = eval_expr(expression2); + + assert_no_error(); + assert_not_null(result); + assert_equal_type(result, Lisp_Object_Type::Nil); + assert_equal_int(result, result2); + assert_equal_int(expression, Memory::nil); + + // t testing + char exp_string3[] = "t"; + Lisp_Object* expression3 = Parser::parse_single_expression(exp_string3); + Lisp_Object* result3 = eval_expr(expression3); + + assert_no_error(); + assert_not_null(result3); + + return pass; + } + + proc test_singular_symbols() -> testresult { + auto cc_s_aa = Memory::get_symbol("aa"); + auto cc_s_aa2 = Memory::get_symbol("aa2"); + auto s_s_aa = Memory::get_symbol(Memory::create_string("aa")); + auto s_s_aa2 = Memory::get_symbol(Memory::create_string("aa2")); + + assert_equal_int(cc_s_aa, s_s_aa); + assert_equal_int(cc_s_aa2, s_s_aa2); + assert_not_equal_int(cc_s_aa, cc_s_aa2); + + return pass; + } + + proc test_file(const char* file) -> testresult { + profile_with_name(file); + // Memory::reset(); + // assert_no_error(); + + push_environment(Memory::create_child_environment(get_current_environment())); + built_in_load(Memory::create_string(file)); + assert_no_error(); + pop_environment(); + + return pass; + } + + proc run_all_tests() -> bool { + profile_this(); + + bool result = true; + + try Memory::init(409600); + defer { + if_debug { + Slime::Memory::free_everything(); + } + }; + push_environment(Memory::create_child_environment( get_current_environment())); @@ -618,8 +618,8 @@ namespace Slime { invoke_test(test_singular_symbols); pop_environment(); - printf("\n-- Test Files --\n"); - + printf("\n-- Test Files --\n"); + invoke_test_script("evaluation_of_default_args"); invoke_test_script("case_and_cond"); invoke_test_script("lexical_scope"); @@ -628,32 +628,31 @@ namespace Slime { invoke_test_script("import_and_load"); invoke_test_script("macro_expand"); invoke_test_script("sicp"); - // invoke_test_script("modules"); - - + invoke_test_script("simple_built_ins"); + invoke_test_script("modules"); // invoke_test_script("class_macro"); - // invoke_test_script("automata"); - // invoke_test_script("alists"); - - return result; - } - -#undef epsilon -#undef testresult -#undef pass -#undef fail - -#undef print_assert_equal_fail -#undef print_assert_not_equal_fail -#undef assert_no_error -#undef assert_equal_int -#undef assert_not_equal_int -#undef assert_equal_double -#undef assert_not_equal_double -#undef assert_equal_string -#undef assert_equal_type -#undef assert_null -#undef assert_not_null -#undef invoke_test -#undef invoke_test_script -} + // invoke_test_script("automata"); + // invoke_test_script("alists"); + + return result; + } + +#undef epsilon +#undef testresult +#undef pass +#undef fail + +#undef print_assert_equal_fail +#undef print_assert_not_equal_fail +#undef assert_no_error +#undef assert_equal_int +#undef assert_not_equal_int +#undef assert_equal_double +#undef assert_not_equal_double +#undef assert_equal_string +#undef assert_equal_type +#undef assert_null +#undef assert_not_null +#undef invoke_test +#undef invoke_test_script +} diff --git a/src/visualization.cpp b/src/visualization.cpp index e3fe7ae..773b1f0 100644 --- a/src/visualization.cpp +++ b/src/visualization.cpp @@ -1,556 +1,556 @@ -namespace Slime { - proc visualize_lisp_machine() -> void { - - // // save the current working directory - // char* cwd = get_cwd(); - - // // get the direction of the exe - // char* exe_path = get_exe_dir(); - // // switch to the exe directory for loading pre.slime - // change_cwd(exe_path); - - // defer { - // // switch back to the users directory - // change_cwd(cwd); - // free(cwd); - // free(exe_path); - // }; - - // struct Drawn_Area { - // int x; - // int y; - // int width; - // int height; - // }; - - // log_message(Log_Level::Info, "Drawing visualization..."); - - // defer { - // log_message(Log_Level::Info, "Done drawing visualization!"); - // }; - - // const int padding = 40; - // const int margin = 20; - - // const char* draw_text_template = " \n %s%s%s\n \n"; - // const char* draw_integer_template = " \n %d\n \n"; - // const char* draw_float_template = " \n %012.6f\n \n"; - - - // FILE *f = fopen("visualization.svg", "w"); - // if (!f) { - // create_generic_error("The file for writing the visualization " - // "could not be opened for writing"); - // return; - // } - // defer { - // fclose(f); - // }; - - // int max_x = 0, - // max_y = 0, - // write_x = 0, - // write_y = 0; - - - // proc draw_margin = [&](int count = 1) -> Drawn_Area { - // write_x += margin * count; - // return { - // write_x - margin * count, - // write_y, - // margin * count, - // write_y - // }; - // }; - // proc draw_new_line = [&](int count = 1) { - // write_x = 0; - // write_y += 25 * count; - // }; - // proc draw_text = [&](const char* text, const char* color = "#000000", bool draw_quotes = false, int max_length = 200) -> Drawn_Area { - // // take care of escaping sensitive chars - // int text_length = 0; - // int extra_needed_chars = draw_quotes ? 10 : 0; - // char* new_text = nullptr; - // char char_at_max_length = 0; - - // char source; - // while ((source = text[text_length++]) != '\0') { - // switch (source) { - // case '\n': - // extra_needed_chars += 1; - // case '<': - // case '>': - // extra_needed_chars += 3; - // break; - // case '&': - // extra_needed_chars += 4; - // break; - // case '\'': - // case '"': - // extra_needed_chars += 5; - // } - // } - // // last char was \0 but we don't count it - // --text_length; - - // if (text_length > max_length) { - // char_at_max_length = ((char*)text)[max_length]; - // ((char*)text)[max_length] = '\0'; - // text_length = max_length; - // } - // defer { - // if (char_at_max_length) - // ((char*)text)[max_length] = char_at_max_length; - // }; - - // // if we need to replace some chars - // if (extra_needed_chars > 0) { - // new_text = (char*)malloc((text_length + extra_needed_chars) * sizeof(char)); - - // int index_in_text = 0, - // index_in_new_text = 0; - - // char source; - // while ((source = text[index_in_text++]) != '\0') { - // switch (source) { - // case '\n': new_text[index_in_new_text++] = '\\'; new_text[index_in_new_text++] = 'n'; break; - // case '<': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'l'; new_text[index_in_new_text++] = 't'; new_text[index_in_new_text++] = ';'; break; - // case '>': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'g'; new_text[index_in_new_text++] = 't'; new_text[index_in_new_text++] = ';'; break; - // case '&': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'a'; new_text[index_in_new_text++] = 'm'; new_text[index_in_new_text++] = 'p'; new_text[index_in_new_text++] = ';'; break; - // case '"': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'q'; new_text[index_in_new_text++] = 'u'; new_text[index_in_new_text++] = 'o'; new_text[index_in_new_text++] = 't'; new_text[index_in_new_text++] = ';'; break; - // case '\'': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'a'; new_text[index_in_new_text++] = 'p'; new_text[index_in_new_text++] = 'o'; new_text[index_in_new_text++] = 's'; new_text[index_in_new_text++] = ';'; break; - // default: new_text[index_in_new_text++] = source; - // } - // } - // new_text[index_in_new_text] = '\0'; - // } - - // int text_width = 12 * (text_length + (draw_quotes ? 2 : 0)); - // if (write_x + text_width > max_x) max_x = write_x + text_width; - // if (write_y + 12 > max_y) max_y = write_y + 12; - - // const char* quote = draw_quotes ? """ : ""; - // if (extra_needed_chars) { - // fprintf(f, draw_text_template, write_x, write_y+12, color, quote, new_text, quote); - // free(new_text); - // } else { - // fprintf(f, draw_text_template, write_x, write_y+12, color, quote, text, quote, color); - // } - - // // write_x += text_width; - - // return { - // write_x - text_width, - // write_y, - // text_width, - // 12 - // }; - // }; - // proc draw_integer = [&](int number) -> Drawn_Area { - // int text_width = 12 * ((int)log10(number)+1); - - // if (write_x + text_width > max_x) max_x = write_x + text_width; - // if (write_y > max_y) max_y = write_y; - - // fprintf(f, draw_integer_template, write_x, write_y+12, number); - - // return { - // write_x, - // write_y, - // text_width, - // 12 - // }; - // }; - // proc draw_float = [&](float number) -> Drawn_Area { - // int text_width = 12 * 12; - - // if (write_x + text_width > max_x) max_x = write_x + text_width; - // if (write_y > max_y) max_y = write_y; - - // fprintf(f, draw_float_template, write_x, write_y+12, number); - - // return { - // write_x, - // write_y, - // text_width, - // 12 - // }; - // }; - // std::function draw_pair; - // proc draw_lisp_object = [&](Lisp_Object* obj) -> Drawn_Area { - // switch (Memory::get_type(obj)) { - // case Lisp_Object_Type::T: return draw_text("t"); - // case Lisp_Object_Type::Nil: return draw_text("()"); - // case Lisp_Object_Type::Pair: return draw_pair(obj); - // case Lisp_Object_Type::Number: return draw_float((float)obj->value.number); - // case Lisp_Object_Type::Symbol: return draw_text(&obj->value.string->data); - // case Lisp_Object_Type::Keyword: { - // Drawn_Area colon = draw_text(":", "#c61b6e"); - // write_x += colon.width; - // Drawn_Area text = draw_text(&obj->value.symbol.identifier->data, "#c61b6e"); - // write_x -= colon.width; - // return { - // colon.x, - // colon.y, - // colon.width + text.width, - // colon.height - // }; - // } - // case Lisp_Object_Type::String: return draw_text(&obj->value.string->data, "#2aa198", true, 20); - // case Lisp_Object_Type::Function: return draw_text("Function", "#aa1100"); - // case Lisp_Object_Type::CFunction: return draw_text("CFunction", "#11aa00"); - // default: - // fprintf(stderr, "Do not know hot to visualize type %d\n", (int)Memory::get_type(obj)); - // return {0}; - // } - // }; - // draw_pair = [&](Lisp_Object* pair) -> Drawn_Area { - // Drawn_Area ret; - // Drawn_Area child; - - // ret.x = write_x; - // ret.y = write_y; - // ret.width = 100; - // ret.height = 100; - - // fprintf(f, - // " " - // " ", - // write_x, write_y, write_x+50, write_y, write_x+50, write_y+50); - - // // arrow to first - // fprintf(f, - // " ", - // write_x+25, write_y+25, write_x+25, write_y+100); - - // write_y += 110; - // child = draw_lisp_object(pair->value.pair.first); - // if (ret.width < child.width) - // ret.width = child.width; - // if (ret.height < child.height) - // ret.height = child.height; - - // write_y -= 110; - - // if (pair->value.pair.rest == Memory::nil) { - // fprintf(f, - // " ", - // write_x+50, write_y+50, write_x+100, write_y); - // } else { - // // arrow to rest - // int x_offset = 150; - // if (child.width+margin > x_offset) - // x_offset = child.width+margin; - - // fprintf(f, - // " ", - // write_x+75, write_y+25, write_x+75+x_offset, write_y+25); - - // write_x += x_offset; - // ret.width += 50; - - // child = draw_lisp_object(pair->value.pair.rest); - // ret.width += child.width; - // if (ret.height < 70 + child.height) - // ret.height = 70 + child.height; - - // write_x -= x_offset; - // } - - // fprintf(f, "\n"); - - // if (max_x < ret.x + ret.width) - // max_x = ret.x + ret.width; - // if (max_y < ret.y + ret.height) - // max_y = ret.y + ret.height; - - // return ret; - // }; - // proc draw_header = [&]() { - // proc draw_separator = [&]() { - // draw_margin(); - // draw_text("|"); - // draw_margin(); - // }; - - // time_t t = time(NULL); - // struct tm tm = *localtime(&t); - - // write_y = 12; - - // // ------------------- - // // Date - // // ------------------- - // char date[12]; - // snprintf(date, 12, "%02d.%02d.%d", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900); - - // write_x += draw_text("Date: ").width; - // write_x += draw_text(date).width; - - // draw_separator(); - - // // ------------------- - // // Time - // // ------------------- - // char time[12]; - // snprintf(time, 12, "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec); - - // write_x += draw_text("Time: ").width; - // write_x += draw_text(time).width; - - // draw_separator(); - - // // ------------------- - // // String Memory - // // ------------------- - // draw_new_line(); - - // int free_string_memory = (int)(Memory::next_free_spot_in_string_memory - Memory::string_memory); - // for (int i = 0; i < Memory::free_spots_in_string_memory.next_index; ++i) { - // free_string_memory += ((String*)(Memory::free_spots_in_string_memory.data[i]))->length; - // } - // int used_string_memory = Memory::string_memory_size - free_string_memory; - - // write_x += draw_text("String Memory:").width; - // draw_margin(); - // write_x += draw_text("[allocated chars] ").width; - // write_x += draw_integer(Memory::string_memory_size).width; - // draw_margin(); - // write_x += draw_text("[free] ").width; - // write_x += draw_integer(free_string_memory).width; - // draw_margin(); - // write_x += draw_text("[used] ").width; - // write_x += draw_integer(used_string_memory).width; - // draw_margin(); - // write_x += draw_text("[%free] ").width; - // write_x += draw_float(100.0f * free_string_memory / Memory::string_memory_size).width; - // draw_margin(); - // write_x += draw_text("[%used] ").width; - // write_x += draw_float(100.0f * used_string_memory / Memory::string_memory_size).width; - - // draw_separator(); - // draw_new_line(); - - // // ------------------- - // // Object Memory - // // ------------------- - - // int free_object_memory_cells = Memory::object_memory_size - (Memory::next_index_in_object_memory - Memory::free_spots_in_object_memory.next_index); - // int used_object_memory_cells = Memory::next_index_in_object_memory - Memory::free_spots_in_object_memory.next_index; - - // write_x += draw_text("Object Memory:").width; - // draw_margin(); - // write_x += draw_text("[#allocated] ").width; - // write_x += draw_integer(Memory::object_memory_size).width; - // draw_margin(); - // write_x += draw_text("[#free] ").width; - // write_x += draw_integer(free_object_memory_cells).width; - // draw_margin(); - // write_x += draw_text("[#used] ").width; - // write_x += draw_integer(used_object_memory_cells).width; - // draw_margin(); - // write_x += draw_text("[%free] ").width; - // write_x += draw_float(100.0f * free_object_memory_cells / Memory::object_memory_size).width; - // draw_margin(); - // write_x += draw_text("[%used] ").width; - // write_x += draw_float(100.0f * used_object_memory_cells / Memory::object_memory_size).width; - - // draw_separator(); - - // draw_new_line(3); - // }; - // proc draw_symbols_keywords_and_numbers = [&]() { - // Array_List symbols; - // Array_List keywords; - // Array_List numbers; - // Array_List strings; - // Array_List pairs; - // Array_List lists; - - // // loop over all used memory - // for (int i = 0; i < Memory::next_index_in_object_memory; ++i) { - // for (int j = 0; j < Memory::free_spots_in_object_memory.next_index; ++j) { - // if (i == Memory::free_spots_in_object_memory.data[j]) - // goto next; - // } - - // switch (Memory::get_type(Memory::object_memory+i)) { - // case Lisp_Object_Type::Symbol: symbols .append(Memory::object_memory+i); break; - // case Lisp_Object_Type::String: strings .append(Memory::object_memory+i); break; - // case Lisp_Object_Type::Keyword: keywords.append(Memory::object_memory+i); break; - // case Lisp_Object_Type::Number : numbers .append(Memory::object_memory+i); break; - // case Lisp_Object_Type::Pair : pairs .append(Memory::object_memory+i); break; - // default: break; - // } - - // next: ; - // } - - // // create the lists-list by filtering the pairs-list. - // Array_List pairs_to_filter; - - // // helper lambda: - // proc remove_doubles_from_lisp_object_array_list = [&](Array_List list) -> void { - // if (list.next_index == 0) - // return; - - // list.sort(); - // Array_List indices_to_filter; - - // size_t last = (size_t)list.data[0]; - // for (int i = 1; i < list.next_index; ++i) { - // if ((size_t)list.data[i] == last) - // indices_to_filter.append(i); - // else - // last = (size_t)list.data[i]; - // } - - // for (int i = indices_to_filter.next_index; i >= 0; --i) { - // list.remove_index(indices_to_filter.data[i]); - // } - - // // sort again as removing items destroys the order - // list.sort(); - // }; - - // // recursive lambda - // std::function filter_pair_and_children; - // filter_pair_and_children = [&](Lisp_Object* pair) { - // pairs_to_filter.append(pair); - - // if (Memory::get_type(pair->value.pair.first) == Lisp_Object_Type::Pair) - // filter_pair_and_children(pair->value.pair.first); - - // if (Memory::get_type(pair->value.pair.rest) == Lisp_Object_Type::Pair) - // filter_pair_and_children(pair->value.pair.rest); - // }; - // for (int i = 0; i < pairs.next_index; ++i) { - // if (Memory::get_type(pairs.data[i]->value.pair.first) == Lisp_Object_Type::Pair) - // filter_pair_and_children(pairs.data[i]->value.pair.first); - - // if (Memory::get_type(pairs.data[i]->value.pair.rest) == Lisp_Object_Type::Pair) - // filter_pair_and_children(pairs.data[i]->value.pair.rest); - - // } - - // remove_doubles_from_lisp_object_array_list(pairs_to_filter); - // // fprintf(stderr, "removing %d pairs\n", pairs_to_filter->next_index); - // // okay, so pairs_to_filter now only the pairs once each that - // // we want to filter from the pairs list - // for (int i = 0; i < pairs.next_index; ++i) { - // if (pairs_to_filter.sorted_find(pairs.data[i]) == -1) { - // lists.append(pairs.data[i]); - // } - // } - - // draw_text("Memory Contents:"); - // draw_new_line(); - // draw_new_line(); - - // int start_x = write_x, - // start_y = write_y; - - // write_x += draw_text("Symbols: ").width; - // draw_integer(symbols.next_index); - // draw_new_line(); - // write_x = start_x; - - // for (int i = 0; i < symbols.next_index; ++i) { - // draw_new_line(); - // write_x = start_x; - - // draw_text(&symbols.data[i]->value.symbol.identifier->data); - // } - - - // write_x = start_x + 300; - // write_y = start_y; - - // write_x += draw_text("Keywords: ").width; - // draw_integer(keywords.next_index); - // draw_new_line(); - // write_x = start_x + 300; - - // for (int i = 0; i < keywords.next_index; ++i) { - // draw_new_line(); - // write_x = start_x + 300; - - // draw_lisp_object(keywords.data[i]); - // } - - - - // write_x = start_x + 600; - // write_y = start_y; - - // write_x += draw_text("Numbers: ").width; - // draw_integer(numbers.next_index); - // draw_new_line(); - // write_x = start_x + 600; - - // for (int i = 0; i < numbers.next_index; ++i) { - // draw_new_line(); - // write_x = start_x + 600; - - // draw_float((float)(numbers.data[i]->value.number)); - // } - - // write_x = start_x + 900; - // write_y = start_y; - - // write_x += draw_text("Strings: ").width; - // draw_integer(strings.next_index); - // draw_new_line(); - // write_x = start_x + 900; - - // for (int i = 0; i < strings.next_index; ++i) { - // draw_new_line(); - // write_x = start_x + 900; - - // draw_text(&strings.data[i]->value.string->data, "#2aa198", true, 75); - // } - - - // write_x = start_x + 2000; - // write_y = start_y; - - // write_x += draw_text("Lists, Pairs: ").width; - // write_x += draw_integer(lists.next_index).width; - // draw_margin(); - // draw_integer(pairs.next_index); - // draw_new_line(); - // write_x = start_x + 2000; - - // for (int i = 0; i < lists.next_index; ++i) { - // draw_new_line(3); - // write_x = start_x + 2000; - - // write_y += draw_pair(lists.data[i]).height; - // } - // }; - - // fprintf(f, - // "\n" - // "\n\n", -padding, -padding, 0, 0); - - // draw_header(); - // draw_symbols_keywords_and_numbers(); - // draw_text("DoEun", "#00aaaa", true); - - // fprintf(f, "\n\n"); - - // // fill in the correct viewBox - // rewind(f); - - // fprintf(f, - // "\n" - // "", -padding, -padding, max_x + 2*padding, max_y + 2*padding); - - } -} +namespace Slime { + proc visualize_lisp_machine() -> void { + + // // save the current working directory + // char* cwd = get_cwd(); + + // // get the direction of the exe + // char* exe_path = get_exe_dir(); + // // switch to the exe directory for loading pre.slime + // change_cwd(exe_path); + + // defer { + // // switch back to the users directory + // change_cwd(cwd); + // free(cwd); + // free(exe_path); + // }; + + // struct Drawn_Area { + // int x; + // int y; + // int width; + // int height; + // }; + + // log_message(Log_Level::Info, "Drawing visualization..."); + + // defer { + // log_message(Log_Level::Info, "Done drawing visualization!"); + // }; + + // const int padding = 40; + // const int margin = 20; + + // const char* draw_text_template = " \n %s%s%s\n \n"; + // const char* draw_integer_template = " \n %d\n \n"; + // const char* draw_float_template = " \n %012.6f\n \n"; + + + // FILE *f = fopen("visualization.svg", "w"); + // if (!f) { + // create_generic_error("The file for writing the visualization " + // "could not be opened for writing"); + // return; + // } + // defer { + // fclose(f); + // }; + + // int max_x = 0, + // max_y = 0, + // write_x = 0, + // write_y = 0; + + + // proc draw_margin = [&](int count = 1) -> Drawn_Area { + // write_x += margin * count; + // return { + // write_x - margin * count, + // write_y, + // margin * count, + // write_y + // }; + // }; + // proc draw_new_line = [&](int count = 1) { + // write_x = 0; + // write_y += 25 * count; + // }; + // proc draw_text = [&](const char* text, const char* color = "#000000", bool draw_quotes = false, int max_length = 200) -> Drawn_Area { + // // take care of escaping sensitive chars + // int text_length = 0; + // int extra_needed_chars = draw_quotes ? 10 : 0; + // char* new_text = nullptr; + // char char_at_max_length = 0; + + // char source; + // while ((source = text[text_length++]) != '\0') { + // switch (source) { + // case '\n': + // extra_needed_chars += 1; + // case '<': + // case '>': + // extra_needed_chars += 3; + // break; + // case '&': + // extra_needed_chars += 4; + // break; + // case '\'': + // case '"': + // extra_needed_chars += 5; + // } + // } + // // last char was \0 but we don't count it + // --text_length; + + // if (text_length > max_length) { + // char_at_max_length = ((char*)text)[max_length]; + // ((char*)text)[max_length] = '\0'; + // text_length = max_length; + // } + // defer { + // if (char_at_max_length) + // ((char*)text)[max_length] = char_at_max_length; + // }; + + // // if we need to replace some chars + // if (extra_needed_chars > 0) { + // new_text = (char*)malloc((text_length + extra_needed_chars) * sizeof(char)); + + // int index_in_text = 0, + // index_in_new_text = 0; + + // char source; + // while ((source = text[index_in_text++]) != '\0') { + // switch (source) { + // case '\n': new_text[index_in_new_text++] = '\\'; new_text[index_in_new_text++] = 'n'; break; + // case '<': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'l'; new_text[index_in_new_text++] = 't'; new_text[index_in_new_text++] = ';'; break; + // case '>': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'g'; new_text[index_in_new_text++] = 't'; new_text[index_in_new_text++] = ';'; break; + // case '&': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'a'; new_text[index_in_new_text++] = 'm'; new_text[index_in_new_text++] = 'p'; new_text[index_in_new_text++] = ';'; break; + // case '"': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'q'; new_text[index_in_new_text++] = 'u'; new_text[index_in_new_text++] = 'o'; new_text[index_in_new_text++] = 't'; new_text[index_in_new_text++] = ';'; break; + // case '\'': new_text[index_in_new_text++] = '&'; new_text[index_in_new_text++] = 'a'; new_text[index_in_new_text++] = 'p'; new_text[index_in_new_text++] = 'o'; new_text[index_in_new_text++] = 's'; new_text[index_in_new_text++] = ';'; break; + // default: new_text[index_in_new_text++] = source; + // } + // } + // new_text[index_in_new_text] = '\0'; + // } + + // int text_width = 12 * (text_length + (draw_quotes ? 2 : 0)); + // if (write_x + text_width > max_x) max_x = write_x + text_width; + // if (write_y + 12 > max_y) max_y = write_y + 12; + + // const char* quote = draw_quotes ? """ : ""; + // if (extra_needed_chars) { + // fprintf(f, draw_text_template, write_x, write_y+12, color, quote, new_text, quote); + // free(new_text); + // } else { + // fprintf(f, draw_text_template, write_x, write_y+12, color, quote, text, quote, color); + // } + + // // write_x += text_width; + + // return { + // write_x - text_width, + // write_y, + // text_width, + // 12 + // }; + // }; + // proc draw_integer = [&](int number) -> Drawn_Area { + // int text_width = 12 * ((int)log10(number)+1); + + // if (write_x + text_width > max_x) max_x = write_x + text_width; + // if (write_y > max_y) max_y = write_y; + + // fprintf(f, draw_integer_template, write_x, write_y+12, number); + + // return { + // write_x, + // write_y, + // text_width, + // 12 + // }; + // }; + // proc draw_float = [&](float number) -> Drawn_Area { + // int text_width = 12 * 12; + + // if (write_x + text_width > max_x) max_x = write_x + text_width; + // if (write_y > max_y) max_y = write_y; + + // fprintf(f, draw_float_template, write_x, write_y+12, number); + + // return { + // write_x, + // write_y, + // text_width, + // 12 + // }; + // }; + // std::function draw_pair; + // proc draw_lisp_object = [&](Lisp_Object* obj) -> Drawn_Area { + // switch (Memory::get_type(obj)) { + // case Lisp_Object_Type::T: return draw_text("t"); + // case Lisp_Object_Type::Nil: return draw_text("()"); + // case Lisp_Object_Type::Pair: return draw_pair(obj); + // case Lisp_Object_Type::Number: return draw_float((float)obj->value.number); + // case Lisp_Object_Type::Symbol: return draw_text(&obj->value.string->data); + // case Lisp_Object_Type::Keyword: { + // Drawn_Area colon = draw_text(":", "#c61b6e"); + // write_x += colon.width; + // Drawn_Area text = draw_text(&obj->value.symbol.identifier->data, "#c61b6e"); + // write_x -= colon.width; + // return { + // colon.x, + // colon.y, + // colon.width + text.width, + // colon.height + // }; + // } + // case Lisp_Object_Type::String: return draw_text(&obj->value.string->data, "#2aa198", true, 20); + // case Lisp_Object_Type::Function: return draw_text("Function", "#aa1100"); + // case Lisp_Object_Type::CFunction: return draw_text("CFunction", "#11aa00"); + // default: + // fprintf(stderr, "Do not know hot to visualize type %d\n", (int)Memory::get_type(obj)); + // return {0}; + // } + // }; + // draw_pair = [&](Lisp_Object* pair) -> Drawn_Area { + // Drawn_Area ret; + // Drawn_Area child; + + // ret.x = write_x; + // ret.y = write_y; + // ret.width = 100; + // ret.height = 100; + + // fprintf(f, + // " " + // " ", + // write_x, write_y, write_x+50, write_y, write_x+50, write_y+50); + + // // arrow to first + // fprintf(f, + // " ", + // write_x+25, write_y+25, write_x+25, write_y+100); + + // write_y += 110; + // child = draw_lisp_object(pair->value.pair.first); + // if (ret.width < child.width) + // ret.width = child.width; + // if (ret.height < child.height) + // ret.height = child.height; + + // write_y -= 110; + + // if (pair->value.pair.rest == Memory::nil) { + // fprintf(f, + // " ", + // write_x+50, write_y+50, write_x+100, write_y); + // } else { + // // arrow to rest + // int x_offset = 150; + // if (child.width+margin > x_offset) + // x_offset = child.width+margin; + + // fprintf(f, + // " ", + // write_x+75, write_y+25, write_x+75+x_offset, write_y+25); + + // write_x += x_offset; + // ret.width += 50; + + // child = draw_lisp_object(pair->value.pair.rest); + // ret.width += child.width; + // if (ret.height < 70 + child.height) + // ret.height = 70 + child.height; + + // write_x -= x_offset; + // } + + // fprintf(f, "\n"); + + // if (max_x < ret.x + ret.width) + // max_x = ret.x + ret.width; + // if (max_y < ret.y + ret.height) + // max_y = ret.y + ret.height; + + // return ret; + // }; + // proc draw_header = [&]() { + // proc draw_separator = [&]() { + // draw_margin(); + // draw_text("|"); + // draw_margin(); + // }; + + // time_t t = time(NULL); + // struct tm tm = *localtime(&t); + + // write_y = 12; + + // // ------------------- + // // Date + // // ------------------- + // char date[12]; + // snprintf(date, 12, "%02d.%02d.%d", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900); + + // write_x += draw_text("Date: ").width; + // write_x += draw_text(date).width; + + // draw_separator(); + + // // ------------------- + // // Time + // // ------------------- + // char time[12]; + // snprintf(time, 12, "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec); + + // write_x += draw_text("Time: ").width; + // write_x += draw_text(time).width; + + // draw_separator(); + + // // ------------------- + // // String Memory + // // ------------------- + // draw_new_line(); + + // int free_string_memory = (int)(Memory::next_free_spot_in_string_memory - Memory::string_memory); + // for (int i = 0; i < Memory::free_spots_in_string_memory.next_index; ++i) { + // free_string_memory += ((String*)(Memory::free_spots_in_string_memory.data[i]))->length; + // } + // int used_string_memory = Memory::string_memory_size - free_string_memory; + + // write_x += draw_text("String Memory:").width; + // draw_margin(); + // write_x += draw_text("[allocated chars] ").width; + // write_x += draw_integer(Memory::string_memory_size).width; + // draw_margin(); + // write_x += draw_text("[free] ").width; + // write_x += draw_integer(free_string_memory).width; + // draw_margin(); + // write_x += draw_text("[used] ").width; + // write_x += draw_integer(used_string_memory).width; + // draw_margin(); + // write_x += draw_text("[%free] ").width; + // write_x += draw_float(100.0f * free_string_memory / Memory::string_memory_size).width; + // draw_margin(); + // write_x += draw_text("[%used] ").width; + // write_x += draw_float(100.0f * used_string_memory / Memory::string_memory_size).width; + + // draw_separator(); + // draw_new_line(); + + // // ------------------- + // // Object Memory + // // ------------------- + + // int free_object_memory_cells = Memory::object_memory_size - (Memory::next_index_in_object_memory - Memory::free_spots_in_object_memory.next_index); + // int used_object_memory_cells = Memory::next_index_in_object_memory - Memory::free_spots_in_object_memory.next_index; + + // write_x += draw_text("Object Memory:").width; + // draw_margin(); + // write_x += draw_text("[#allocated] ").width; + // write_x += draw_integer(Memory::object_memory_size).width; + // draw_margin(); + // write_x += draw_text("[#free] ").width; + // write_x += draw_integer(free_object_memory_cells).width; + // draw_margin(); + // write_x += draw_text("[#used] ").width; + // write_x += draw_integer(used_object_memory_cells).width; + // draw_margin(); + // write_x += draw_text("[%free] ").width; + // write_x += draw_float(100.0f * free_object_memory_cells / Memory::object_memory_size).width; + // draw_margin(); + // write_x += draw_text("[%used] ").width; + // write_x += draw_float(100.0f * used_object_memory_cells / Memory::object_memory_size).width; + + // draw_separator(); + + // draw_new_line(3); + // }; + // proc draw_symbols_keywords_and_numbers = [&]() { + // Array_List symbols; + // Array_List keywords; + // Array_List numbers; + // Array_List strings; + // Array_List pairs; + // Array_List lists; + + // // loop over all used memory + // for (int i = 0; i < Memory::next_index_in_object_memory; ++i) { + // for (int j = 0; j < Memory::free_spots_in_object_memory.next_index; ++j) { + // if (i == Memory::free_spots_in_object_memory.data[j]) + // goto next; + // } + + // switch (Memory::get_type(Memory::object_memory+i)) { + // case Lisp_Object_Type::Symbol: symbols .append(Memory::object_memory+i); break; + // case Lisp_Object_Type::String: strings .append(Memory::object_memory+i); break; + // case Lisp_Object_Type::Keyword: keywords.append(Memory::object_memory+i); break; + // case Lisp_Object_Type::Number : numbers .append(Memory::object_memory+i); break; + // case Lisp_Object_Type::Pair : pairs .append(Memory::object_memory+i); break; + // default: break; + // } + + // next: ; + // } + + // // create the lists-list by filtering the pairs-list. + // Array_List pairs_to_filter; + + // // helper lambda: + // proc remove_doubles_from_lisp_object_array_list = [&](Array_List list) -> void { + // if (list.next_index == 0) + // return; + + // list.sort(); + // Array_List indices_to_filter; + + // size_t last = (size_t)list.data[0]; + // for (int i = 1; i < list.next_index; ++i) { + // if ((size_t)list.data[i] == last) + // indices_to_filter.append(i); + // else + // last = (size_t)list.data[i]; + // } + + // for (int i = indices_to_filter.next_index; i >= 0; --i) { + // list.remove_index(indices_to_filter.data[i]); + // } + + // // sort again as removing items destroys the order + // list.sort(); + // }; + + // // recursive lambda + // std::function filter_pair_and_children; + // filter_pair_and_children = [&](Lisp_Object* pair) { + // pairs_to_filter.append(pair); + + // if (Memory::get_type(pair->value.pair.first) == Lisp_Object_Type::Pair) + // filter_pair_and_children(pair->value.pair.first); + + // if (Memory::get_type(pair->value.pair.rest) == Lisp_Object_Type::Pair) + // filter_pair_and_children(pair->value.pair.rest); + // }; + // for (int i = 0; i < pairs.next_index; ++i) { + // if (Memory::get_type(pairs.data[i]->value.pair.first) == Lisp_Object_Type::Pair) + // filter_pair_and_children(pairs.data[i]->value.pair.first); + + // if (Memory::get_type(pairs.data[i]->value.pair.rest) == Lisp_Object_Type::Pair) + // filter_pair_and_children(pairs.data[i]->value.pair.rest); + + // } + + // remove_doubles_from_lisp_object_array_list(pairs_to_filter); + // // fprintf(stderr, "removing %d pairs\n", pairs_to_filter->next_index); + // // okay, so pairs_to_filter now only the pairs once each that + // // we want to filter from the pairs list + // for (int i = 0; i < pairs.next_index; ++i) { + // if (pairs_to_filter.sorted_find(pairs.data[i]) == -1) { + // lists.append(pairs.data[i]); + // } + // } + + // draw_text("Memory Contents:"); + // draw_new_line(); + // draw_new_line(); + + // int start_x = write_x, + // start_y = write_y; + + // write_x += draw_text("Symbols: ").width; + // draw_integer(symbols.next_index); + // draw_new_line(); + // write_x = start_x; + + // for (int i = 0; i < symbols.next_index; ++i) { + // draw_new_line(); + // write_x = start_x; + + // draw_text(&symbols.data[i]->value.symbol.identifier->data); + // } + + + // write_x = start_x + 300; + // write_y = start_y; + + // write_x += draw_text("Keywords: ").width; + // draw_integer(keywords.next_index); + // draw_new_line(); + // write_x = start_x + 300; + + // for (int i = 0; i < keywords.next_index; ++i) { + // draw_new_line(); + // write_x = start_x + 300; + + // draw_lisp_object(keywords.data[i]); + // } + + + + // write_x = start_x + 600; + // write_y = start_y; + + // write_x += draw_text("Numbers: ").width; + // draw_integer(numbers.next_index); + // draw_new_line(); + // write_x = start_x + 600; + + // for (int i = 0; i < numbers.next_index; ++i) { + // draw_new_line(); + // write_x = start_x + 600; + + // draw_float((float)(numbers.data[i]->value.number)); + // } + + // write_x = start_x + 900; + // write_y = start_y; + + // write_x += draw_text("Strings: ").width; + // draw_integer(strings.next_index); + // draw_new_line(); + // write_x = start_x + 900; + + // for (int i = 0; i < strings.next_index; ++i) { + // draw_new_line(); + // write_x = start_x + 900; + + // draw_text(&strings.data[i]->value.string->data, "#2aa198", true, 75); + // } + + + // write_x = start_x + 2000; + // write_y = start_y; + + // write_x += draw_text("Lists, Pairs: ").width; + // write_x += draw_integer(lists.next_index).width; + // draw_margin(); + // draw_integer(pairs.next_index); + // draw_new_line(); + // write_x = start_x + 2000; + + // for (int i = 0; i < lists.next_index; ++i) { + // draw_new_line(3); + // write_x = start_x + 2000; + + // write_y += draw_pair(lists.data[i]).height; + // } + // }; + + // fprintf(f, + // "\n" + // "\n\n", -padding, -padding, 0, 0); + + // draw_header(); + // draw_symbols_keywords_and_numbers(); + // draw_text("DoEun", "#00aaaa", true); + + // fprintf(f, "\n\n"); + + // // fill in the correct viewBox + // rewind(f); + + // fprintf(f, + // "\n" + // "", -padding, -padding, max_x + 2*padding, max_y + 2*padding); + + } +} diff --git a/tests/fullslime/build.sh b/tests/fullslime/build.sh index 96a275f..26763fc 100644 --- a/tests/fullslime/build.sh +++ b/tests/fullslime/build.sh @@ -1,11 +1,11 @@ -echo "" -echo "----------------------" -echo " compiling libslime " -echo "----------------------" -echo "" - -clang++ --std=c++17 \ - main.cpp -o main \ - -I../../3rd/ \ - -I../../src/ \ - -I../../include/ \ +echo "" +echo "----------------------" +echo " compiling libslime " +echo "----------------------" +echo "" + +clang++ --std=c++17 \ + main.cpp -o main \ + -I../../3rd/ \ + -I../../src/ \ + -I../../include/ \ diff --git a/tests/fullslime/main.cpp b/tests/fullslime/main.cpp index 5181964..1a55e9f 100644 --- a/tests/fullslime/main.cpp +++ b/tests/fullslime/main.cpp @@ -1,6 +1,6 @@ -#include - -int main() { - int res = Slime::run_all_tests(); - return res ? 0 : 1; -} +#include + +int main() { + int res = Slime::run_all_tests(); + return res ? 0 : 1; +} diff --git a/tests/libslime/build.sh b/tests/libslime/build.sh index 4001860..ce05cdf 100644 --- a/tests/libslime/build.sh +++ b/tests/libslime/build.sh @@ -1,21 +1,21 @@ -echo "" -echo "----------------------" -echo " compiling libslime " -echo "----------------------" -echo "" - -clang++ --std=c++17 \ - ../../src/libslime.cpp -c -o libslime.o \ - -I../../3rd/ \ - -I../../src/ - -echo "" -echo "----------------------" -echo " compiling main " -echo "----------------------" -echo "" - -clang++ --std=c++17 \ - main.cpp -o main libslime.o \ - -I../../include/ \ - -I../../3rd/ +echo "" +echo "----------------------" +echo " compiling libslime " +echo "----------------------" +echo "" + +clang++ --std=c++17 \ + ../../src/libslime.cpp -c -o libslime.o \ + -I../../3rd/ \ + -I../../src/ + +echo "" +echo "----------------------" +echo " compiling main " +echo "----------------------" +echo "" + +clang++ --std=c++17 \ + main.cpp -o main libslime.o \ + -I../../include/ \ + -I../../3rd/ diff --git a/tests/libslime/main.cpp b/tests/libslime/main.cpp index d6beb78..5daed6a 100644 --- a/tests/libslime/main.cpp +++ b/tests/libslime/main.cpp @@ -1,6 +1,6 @@ -#include - -int main() { - int res = Slime::run_all_tests(); - return res ? 0 : 1; -} +#include + +int main() { + int res = Slime::run_all_tests(); + return res ? 0 : 1; +} diff --git a/todo.org b/todo.org index f3c1528..1164a2c 100644 --- a/todo.org +++ b/todo.org @@ -1,8 +1,18 @@ -* TODO rename slime to plisk +* TODO update header files +* TODO use better type names: u32, .. +* TODO write and/or as macros +* TODO docs as a external dict to make LO smaller +* TODO doc generation +* TODO function let +(let fac ([n 10]) + (if (zero? n) + 1 + (* n (fac (sub1 n))))) +3628800 +* TODO runHook NAS_Action +* TODO consisitent names (Lisp_Object_Type_to_string .. lisp_object_to_string) * TODO rename modifying functions to prefix '!' -* TODO go through sicp and use the examples as test files - -* TODO test macro expanding to macro +* TODO rename slime to plisk * TODO BUG 1: eval dot notation #+BEGIN_SRC lisp (eval `(+ . ,(list 1 2 3)))