From 038c68f618c4ee25ca56ea81ec0017674a147ce8 Mon Sep 17 00:00:00 2001 From: "DESKTOP-C9V2M01\\Zeeri" Date: Sat, 2 Apr 2022 10:29:35 -0700 Subject: [PATCH] Converted sample project into an almost working Svelte / Meteor project. Needs to fix the login/logout code, the camera code, and add Chromebook history when the QR Code is scanned. --- .idea/watcherTasks.xml | 25 + .meteor/packages | 14 +- .meteor/release | 2 +- .meteor/versions | 32 +- client/main.css | 239 +- client/main.css.map | 2 +- client/main.html | 4 +- client/main.sass | 20 +- client/simple-grid.css | 228 ++ client/simple-grid.css.map | 1 + client/simple-grid.sass | 185 ++ imports/api/data-collection.js | 52 + imports/api/users.js | 24 +- imports/startup/accounts-config.js | 8 +- imports/ui/App.css | 5 + imports/ui/App.css.map | 1 + imports/ui/App.sass | 2 + imports/ui/App.svelte | 258 +- imports/ui/ChromebookScan.svelte | 41 + imports/ui/Chromebooks.svelte | 34 + imports/ui/ProcessLaptops.svelte | 12 + imports/util/JsBarcode.min.js | 2 + imports/util/qrious.js | 2363 +++++++++++++++++ imports/util/qrious.js.map | 1 + imports/util/qrious.min.js | 6 + imports/util/qrious.min.js.map | 1 + package-lock.json | 463 +++- package.json | 23 +- public/favicon.png | Bin 0 -> 3127 bytes .../forbidden/HauntedHouseForeground.png | Bin 0 -> 147082 bytes public/images/forbidden/bat-body.png | Bin 0 -> 1410 bytes public/images/forbidden/bat-wing.png | Bin 0 -> 1502 bytes readme.md | 49 +- server/main.js | 1 + 34 files changed, 3997 insertions(+), 101 deletions(-) create mode 100644 .idea/watcherTasks.xml create mode 100644 client/simple-grid.css create mode 100644 client/simple-grid.css.map create mode 100644 client/simple-grid.sass create mode 100644 imports/api/data-collection.js create mode 100644 imports/ui/App.css create mode 100644 imports/ui/App.css.map create mode 100644 imports/ui/App.sass create mode 100644 imports/ui/ChromebookScan.svelte create mode 100644 imports/ui/Chromebooks.svelte create mode 100644 imports/ui/ProcessLaptops.svelte create mode 100644 imports/util/JsBarcode.min.js create mode 100644 imports/util/qrious.js create mode 100644 imports/util/qrious.js.map create mode 100644 imports/util/qrious.min.js create mode 100644 imports/util/qrious.min.js.map create mode 100644 public/favicon.png create mode 100644 public/images/forbidden/HauntedHouseForeground.png create mode 100644 public/images/forbidden/bat-body.png create mode 100644 public/images/forbidden/bat-wing.png diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml new file mode 100644 index 0000000..560ddd1 --- /dev/null +++ b/.idea/watcherTasks.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/.meteor/packages b/.meteor/packages index 8030272..059cf56 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -11,20 +11,22 @@ jquery # Wrapper package for npm-installed jquery reactive-var@1.0.11 # Reactive variable for tracker tracker@1.2.0 # Meteor's client-side reactive programming library -standard-minifier-css@1.7.4 # CSS minifier run for production mode +standard-minifier-css@1.8.0 # CSS minifier run for production mode standard-minifier-js@2.8.0 # JS minifier run for production mode es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers -ecmascript@0.16.1 # Enable ECMAScript2015+ syntax in app code -typescript@4.4.1 # Enable TypeScript syntax in .ts and .tsx modules +ecmascript@0.16.2 # Enable ECMAScript2015+ syntax in app code +typescript@4.5.4 # Enable TypeScript syntax in .ts and .tsx modules shell-server@0.5.0 # Server-side component of the `meteor shell` command svelte:compiler +#static-html@1.3.2 rdb:svelte-meteor-data -static-html@1.3.2 accounts-ui@1.4.2 -accounts-password@2.2.0 +accounts-password@2.3.0 svelte:blaze-integration meteortesting:mocha accounts-google@1.4.0 service-configuration@1.3.0 -google-config-ui +google-config-ui@1.0.3 # Adds the UI for logging in via Google +alanning:roles # Adds roles to the user +#zodern:melte diff --git a/.meteor/release b/.meteor/release index b1b0cce..0e71fe0 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.6.1 +METEOR@2.7 diff --git a/.meteor/versions b/.meteor/versions index 1aaaed5..34565d3 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,12 +1,13 @@ -accounts-base@2.2.1 +accounts-base@2.2.2 accounts-google@1.4.0 -accounts-oauth@1.4.0 -accounts-password@2.2.0 +accounts-oauth@1.4.1 +accounts-password@2.3.1 accounts-ui@1.4.2 -accounts-ui-unstyled@1.6.0 +accounts-ui-unstyled@1.7.0 +alanning:roles@3.4.0 allow-deny@1.1.1 autoupdate@1.8.0 -babel-compiler@7.8.1 +babel-compiler@7.9.0 babel-runtime@1.5.0 base64@1.0.12 binary-heap@1.0.11 @@ -24,17 +25,17 @@ ddp-rate-limiter@1.1.0 ddp-server@2.5.0 diff-sequence@1.1.1 dynamic-import@0.7.2 -ecmascript@0.16.1 +ecmascript@0.16.2 ecmascript-runtime@0.8.0 ecmascript-runtime-client@0.12.1 ecmascript-runtime-server@0.11.0 -ejson@1.1.1 -email@2.2.0 +ejson@1.1.2 +email@2.2.1 es5-shim@4.8.0 fetch@0.1.1 geojson-utils@1.0.10 google-config-ui@1.0.3 -google-oauth@1.4.1 +google-oauth@1.4.2 hot-code-push@1.0.4 html-tools@1.1.2 htmljs@1.1.1 @@ -52,19 +53,19 @@ meteortesting:browser-tests@1.3.5 meteortesting:mocha@2.0.3 meteortesting:mocha-core@8.1.2 minifier-css@1.6.0 -minifier-js@2.7.3 +minifier-js@2.7.4 minimongo@1.8.0 mobile-experience@1.1.0 mobile-status-bar@1.1.0 modern-browsers@0.1.7 modules@0.18.0 -modules-runtime@0.12.0 +modules-runtime@0.13.0 mongo@1.14.6 mongo-decimal@0.1.2 mongo-dev-server@1.1.0 mongo-id@1.0.8 npm-mongo@4.3.1 -oauth@2.1.1 +oauth@2.1.2 oauth2@1.3.1 observe-sequence@1.0.19 ordered-dict@1.1.0 @@ -72,7 +73,7 @@ promise@0.12.0 random@1.2.0 rate-limit@1.0.9 rdb:svelte-meteor-data@0.3.1 -react-fast-refresh@0.2.2 +react-fast-refresh@0.2.3 reactive-dict@1.3.0 reactive-var@1.0.11 reload@1.3.1 @@ -85,9 +86,8 @@ shell-server@0.5.0 socket-stream-client@0.4.0 spacebars@1.2.0 spacebars-compiler@1.3.0 -standard-minifier-css@1.7.4 +standard-minifier-css@1.8.1 standard-minifier-js@2.8.0 -static-html@1.3.2 svelte:blaze-integration@0.4.0 svelte:compiler@3.46.4 templating@1.4.1 @@ -95,7 +95,7 @@ templating-compiler@1.4.1 templating-runtime@1.5.0 templating-tools@1.2.1 tracker@1.2.0 -typescript@4.4.1 +typescript@4.5.4 underscore@1.0.10 url@1.3.2 webapp@1.13.1 diff --git a/client/main.css b/client/main.css index e166674..6d615bc 100644 --- a/client/main.css +++ b/client/main.css @@ -1,9 +1,8 @@ /* CSS declarations go here */ +@import url(https://fonts.googleapis.com/css?family=Lato:400,300,300italic,400italic,700,700italic); body { padding: 10px; font-family: sans-serif; - background-color: #315481; - background-image: linear-gradient(to bottom, #315481, #918e82 100%); background-attachment: fixed; position: absolute; top: 0; @@ -15,13 +14,6 @@ body { font-size: 14px; } -.container { - max-width: 600px; - margin: 0 auto; - min-height: 100%; - background: white; -} - header { background: #d2edf4; background-image: linear-gradient(to bottom, #d0edf5, #e1e5f0 100%); @@ -35,10 +27,8 @@ header { h1 { font-size: 1.5em; - margin: 0; - margin-bottom: 10px; + margin: 0 0 1rem 0; display: inline-block; - margin-right: 1em; } form { @@ -122,5 +112,230 @@ header .hide-completed { padding-bottom: 5px; } } +html, body { + height: 100%; + width: 100%; + margin: 0; + padding: 0; + left: 0; + top: 0; + font-size: 100%; +} + +/* ROOT FONT STYLES */ +* { + font-family: "Lato", Helvetica, sans-serif; + color: #333447; + line-height: 1.5; +} + +/* TYPOGRAPHY */ +h1 { + font-size: 2.5rem; +} + +h2 { + font-size: 2rem; +} + +h3 { + font-size: 1.375rem; +} + +h4 { + font-size: 1.125rem; +} + +h5 { + font-size: 1rem; +} + +h6 { + font-size: 0.875rem; +} + +p { + font-size: 1.125rem; + font-weight: 200; + line-height: 1.8; +} + +.font-light { + font-weight: 300; +} + +.font-regular { + font-weight: 400; +} + +.font-heavy { + font-weight: 700; +} + +/* POSITIONING */ +.left { + text-align: left; +} + +.right { + text-align: right; +} + +.center { + text-align: center; + margin-left: auto; + margin-right: auto; +} + +.justify { + text-align: justify; +} + +/* ==== GRID SYSTEM ==== */ +.container { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +.row { + position: relative; + width: 100%; +} +.row [class^=col] { + float: left; + margin: 0.5rem 2%; + min-height: 0.125rem; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 { + width: 96%; +} + +.col-1-sm { + width: 4.33%; +} + +.col-2-sm { + width: 12.66%; +} + +.col-3-sm { + width: 21%; +} + +.col-4-sm { + width: 29.33%; +} + +.col-5-sm { + width: 37.66%; +} + +.col-6-sm { + width: 46%; +} + +.col-7-sm { + width: 54.33%; +} + +.col-8-sm { + width: 62.66%; +} + +.col-9-sm { + width: 71%; +} + +.col-10-sm { + width: 79.33%; +} + +.col-11-sm { + width: 87.66%; +} + +.col-12-sm { + width: 96%; +} + +.row::after { + content: ""; + display: table; + clear: both; +} + +.hidden-sm { + display: none; +} + +@media only screen and (min-width: 33.75em) { + /* 540px */ + .container { + width: 80%; + } +} +@media only screen and (min-width: 45em) { + /* 720px */ + .col-1 { + width: 4.33%; + } + + .col-2 { + width: 12.66%; + } + + .col-3 { + width: 21%; + } + + .col-4 { + width: 29.33%; + } + + .col-5 { + width: 37.66%; + } + + .col-6 { + width: 46%; + } + + .col-7 { + width: 54.33%; + } + + .col-8 { + width: 62.66%; + } + + .col-9 { + width: 71%; + } + + .col-10 { + width: 79.33%; + } + + .col-11 { + width: 87.66%; + } + + .col-12 { + width: 96%; + } + + .hidden-sm { + display: block; + } +} +@media only screen and (min-width: 60em) { + /* 960px */ + .container { + width: 75%; + max-width: 60rem; + } +} /*# sourceMappingURL=main.css.map */ diff --git a/client/main.css.map b/client/main.css.map index ab87012..296748b 100644 --- a/client/main.css.map +++ b/client/main.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["main.sass"],"names":[],"mappings":"AAAA;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;IACC;;;EAED;IACC;IACA;;;EAED;IACC","file":"main.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["main.sass","simple-grid.sass"],"names":[],"mappings":"AAAA;ACAQ;ADCR;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAQD;EACC;EACA;EACA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;IACC;;;EAED;IACC;IACA;;;EAED;IACC;;;AChGF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;AAEA;EACC;EACA;EACA;;;AAED;AAEA;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;AAEA;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;AAEA;EACC;EACA;EACA;;;AAED;EACC;EACA;;AAEA;EACC;EACA;EACA;;;AAEF;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;AACC;EAEA;IACC;;;AAEF;AACC;EAEA;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;AAEF;AACC;EAEA;IACC;IACA","file":"main.css"} \ No newline at end of file diff --git a/client/main.html b/client/main.html index f6352db..f3418c5 100644 --- a/client/main.html +++ b/client/main.html @@ -1,8 +1,8 @@ - District Central + District Central -
+
diff --git a/client/main.sass b/client/main.sass index 04aa38e..223d9f8 100644 --- a/client/main.sass +++ b/client/main.sass @@ -2,8 +2,6 @@ body padding: 10px font-family: sans-serif - background-color: #315481 - background-image: linear-gradient(to bottom, #315481, #918e82 100%) background-attachment: fixed position: absolute top: 0 @@ -14,11 +12,11 @@ body margin: 0 font-size: 14px -.container - max-width: 600px - margin: 0 auto - min-height: 100% - background: white +//.container +// max-width: 600px +// margin: 0 auto +// min-height: 100% +// background: white header background: #d2edf4 @@ -31,10 +29,8 @@ header h1 font-size: 1.5em - margin: 0 - margin-bottom: 10px + margin: 0 0 1rem 0 display: inline-block - margin-right: 1em form margin-top: 10px @@ -100,4 +96,6 @@ header .hide-completed clear: both .new-task input - padding-bottom: 5px \ No newline at end of file + padding-bottom: 5px + +@import "./simple-grid.sass" diff --git a/client/simple-grid.css b/client/simple-grid.css new file mode 100644 index 0000000..996d97e --- /dev/null +++ b/client/simple-grid.css @@ -0,0 +1,228 @@ +@import url(https://fonts.googleapis.com/css?family=Lato:400,300,300italic,400italic,700,700italic); +html, body { + height: 100%; + width: 100%; + margin: 0; + padding: 0; + left: 0; + top: 0; + font-size: 100%; +} + +/* ROOT FONT STYLES */ +* { + font-family: "Lato", Helvetica, sans-serif; + color: #333447; + line-height: 1.5; +} + +/* TYPOGRAPHY */ +h1 { + font-size: 2.5rem; +} + +h2 { + font-size: 2rem; +} + +h3 { + font-size: 1.375rem; +} + +h4 { + font-size: 1.125rem; +} + +h5 { + font-size: 1rem; +} + +h6 { + font-size: 0.875rem; +} + +p { + font-size: 1.125rem; + font-weight: 200; + line-height: 1.8; +} + +.font-light { + font-weight: 300; +} + +.font-regular { + font-weight: 400; +} + +.font-heavy { + font-weight: 700; +} + +/* POSITIONING */ +.left { + text-align: left; +} + +.right { + text-align: right; +} + +.center { + text-align: center; + margin-left: auto; + margin-right: auto; +} + +.justify { + text-align: justify; +} + +/* ==== GRID SYSTEM ==== */ +.container { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +.row { + position: relative; + width: 100%; +} +.row [class^=col] { + float: left; + margin: 0.5rem 2%; + min-height: 0.125rem; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 { + width: 96%; +} + +.col-1-sm { + width: 4.33%; +} + +.col-2-sm { + width: 12.66%; +} + +.col-3-sm { + width: 21%; +} + +.col-4-sm { + width: 29.33%; +} + +.col-5-sm { + width: 37.66%; +} + +.col-6-sm { + width: 46%; +} + +.col-7-sm { + width: 54.33%; +} + +.col-8-sm { + width: 62.66%; +} + +.col-9-sm { + width: 71%; +} + +.col-10-sm { + width: 79.33%; +} + +.col-11-sm { + width: 87.66%; +} + +.col-12-sm { + width: 96%; +} + +.row::after { + content: ""; + display: table; + clear: both; +} + +.hidden-sm { + display: none; +} + +@media only screen and (min-width: 33.75em) { + /* 540px */ + .container { + width: 80%; + } +} +@media only screen and (min-width: 45em) { + /* 720px */ + .col-1 { + width: 4.33%; + } + + .col-2 { + width: 12.66%; + } + + .col-3 { + width: 21%; + } + + .col-4 { + width: 29.33%; + } + + .col-5 { + width: 37.66%; + } + + .col-6 { + width: 46%; + } + + .col-7 { + width: 54.33%; + } + + .col-8 { + width: 62.66%; + } + + .col-9 { + width: 71%; + } + + .col-10 { + width: 79.33%; + } + + .col-11 { + width: 87.66%; + } + + .col-12 { + width: 96%; + } + + .hidden-sm { + display: block; + } +} +@media only screen and (min-width: 60em) { + /* 960px */ + .container { + width: 75%; + max-width: 60rem; + } +} + +/*# sourceMappingURL=simple-grid.css.map */ diff --git a/client/simple-grid.css.map b/client/simple-grid.css.map new file mode 100644 index 0000000..958c4ea --- /dev/null +++ b/client/simple-grid.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["simple-grid.sass"],"names":[],"mappings":"AAAQ;AAER;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;AAEA;EACC;EACA;EACA;;;AAED;AAEA;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;AAEA;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;AAEA;EACC;EACA;EACA;;;AAED;EACC;EACA;;AAEA;EACC;EACA;EACA;;;AAEF;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;AACC;EAEA;IACC;;;AAEF;AACC;EAEA;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;EAED;IACC;;;AAEF;AACC;EAEA;IACC;IACA","file":"simple-grid.css"} \ No newline at end of file diff --git a/client/simple-grid.sass b/client/simple-grid.sass new file mode 100644 index 0000000..eba7b6a --- /dev/null +++ b/client/simple-grid.sass @@ -0,0 +1,185 @@ +@import url(https://fonts.googleapis.com/css?family=Lato:400,300,300italic,400italic,700,700italic) + +html, body + height: 100% + width: 100% + margin: 0 + padding: 0 + left: 0 + top: 0 + font-size: 100% + +/* ROOT FONT STYLES + +* + font-family: 'Lato', Helvetica, sans-serif + color: #333447 + line-height: 1.5 + +/* TYPOGRAPHY + +h1 + font-size: 2.5rem + +h2 + font-size: 2rem + +h3 + font-size: 1.375rem + +h4 + font-size: 1.125rem + +h5 + font-size: 1rem + +h6 + font-size: 0.875rem + +p + font-size: 1.125rem + font-weight: 200 + line-height: 1.8 + +.font-light + font-weight: 300 + +.font-regular + font-weight: 400 + +.font-heavy + font-weight: 700 + +/* POSITIONING + +.left + text-align: left + +.right + text-align: right + +.center + text-align: center + margin-left: auto + margin-right: auto + +.justify + text-align: justify + +/* ==== GRID SYSTEM ==== + +.container + width: 90% + margin-left: auto + margin-right: auto + +.row + position: relative + width: 100% + + [class^="col"] + float: left + margin: 0.5rem 2% + min-height: 0.125rem + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 + width: 96% + +.col-1-sm + width: 4.33% + +.col-2-sm + width: 12.66% + +.col-3-sm + width: 21% + +.col-4-sm + width: 29.33% + +.col-5-sm + width: 37.66% + +.col-6-sm + width: 46% + +.col-7-sm + width: 54.33% + +.col-8-sm + width: 62.66% + +.col-9-sm + width: 71% + +.col-10-sm + width: 79.33% + +.col-11-sm + width: 87.66% + +.col-12-sm + width: 96% + +.row::after + content: "" + display: table + clear: both + +.hidden-sm + display: none + +@media only screen and (min-width: 33.75em) + /* 540px + + .container + width: 80% + +@media only screen and (min-width: 45em) + /* 720px + + .col-1 + width: 4.33% + + .col-2 + width: 12.66% + + .col-3 + width: 21% + + .col-4 + width: 29.33% + + .col-5 + width: 37.66% + + .col-6 + width: 46% + + .col-7 + width: 54.33% + + .col-8 + width: 62.66% + + .col-9 + width: 71% + + .col-10 + width: 79.33% + + .col-11 + width: 87.66% + + .col-12 + width: 96% + + .hidden-sm + display: block + +@media only screen and (min-width: 60em) + /* 960px + + .container + width: 75% + max-width: 60rem diff --git a/imports/api/data-collection.js b/imports/api/data-collection.js new file mode 100644 index 0000000..cf5cc6b --- /dev/null +++ b/imports/api/data-collection.js @@ -0,0 +1,52 @@ +import { Meteor } from 'meteor/meteor'; +import { Mongo } from 'meteor/mongo'; +import { check } from 'meteor/check'; +import { MongoClient } from 'mongodb'; + +//export const Records = new Mongo.Collection('records'); +let client; +let database; +let dataCollection; + +if (Meteor.isServer) { + let uri = process.env.MONGO_URL2; + + client = new MongoClient(uri); + database = client.db("avusd-data-collection"); + dataCollection = database.collection("records"); + + // This code only runs on the server + Meteor.publish('chromebookData', function(deviceId) { + check(deviceId, String); + + return dataCollection.find({deviceId}); + }); +} + +Meteor.methods({ + // 'tasks.setChecked'(taskId, setChecked) { + // check(taskId, String); + // check(setChecked, Boolean); + // + // const task = Tasks.findOne(taskId); + // if (task.private && task.owner !== this.userId) { + // // If the task is private, make sure only the owner can check it off + // throw new Meteor.Error('not-authorized'); + // } + // + // Tasks.update(taskId, { $set: { checked: setChecked } }); + // }, + // 'tasks.setPrivate'(taskId, setToPrivate) { + // check(taskId, String); + // check(setToPrivate, Boolean); + // + // const task = Tasks.findOne(taskId); + // + // // Make sure only the task owner can make a task private + // if (task.owner !== this.userId) { + // throw new Meteor.Error('not-authorized'); + // } + // + // Tasks.update(taskId, { $set: { private: setToPrivate } }); + // }, +}); diff --git a/imports/api/users.js b/imports/api/users.js index 9b51985..2b96705 100644 --- a/imports/api/users.js +++ b/imports/api/users.js @@ -2,9 +2,21 @@ import { Meteor } from 'meteor/meteor'; if (Meteor.isServer) { - Meteor.methods({ - 'users.login'() { - console.log("Login Called."); - } - }); -} \ No newline at end of file + Meteor.publish(null, function() { + if(this.userId) { + return Meteor.roleAssignment.find({'user._id': this.userId}); + } + else { + this.ready(); + } + }) + + // Meteor.methods({ + // 'users.setupInitialRoles'() { + // Roles.createRole('admin'); + // Roles.createRole('laptop-management'); + // Roles.addRolesToParent('laptop-management', 'admin'); + // Roles.addUsersToRoles("zwbMiaSKHix4bWQ8d", 'admin', 'global'); + // } + // }); +} diff --git a/imports/startup/accounts-config.js b/imports/startup/accounts-config.js index 5afc879..35e7739 100644 --- a/imports/startup/accounts-config.js +++ b/imports/startup/accounts-config.js @@ -1,8 +1,10 @@ import { Accounts } from 'meteor/accounts-base' -Accounts.ui.config({ - passwordSignupFields: 'USERNAME_ONLY' -}); +if(Meteor.isCLient) { + Accounts.ui.config({ + passwordSignupFields: 'USERNAME_ONLY' + }); +} Accounts.config({ restrictCreationByEmailDomain: function(address) { diff --git a/imports/ui/App.css b/imports/ui/App.css new file mode 100644 index 0000000..e754987 --- /dev/null +++ b/imports/ui/App.css @@ -0,0 +1,5 @@ +nav { + font-size: 1.4rem; +} + +/*# sourceMappingURL=App.css.map */ diff --git a/imports/ui/App.css.map b/imports/ui/App.css.map new file mode 100644 index 0000000..ac07129 --- /dev/null +++ b/imports/ui/App.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["App.sass"],"names":[],"mappings":"AAAA;EACC","file":"App.css"} \ No newline at end of file diff --git a/imports/ui/App.sass b/imports/ui/App.sass new file mode 100644 index 0000000..3cdf5f6 --- /dev/null +++ b/imports/ui/App.sass @@ -0,0 +1,2 @@ +nav + font-size: 1.4rem diff --git a/imports/ui/App.svelte b/imports/ui/App.svelte index 30aee95..bd09a43 100644 --- a/imports/ui/App.svelte +++ b/imports/ui/App.svelte @@ -1,12 +1,159 @@ + + + -
-
- - - - - - - - - - - {#if !$currentUser} - - {:else} - - {/if} - - - - - - - - - - -
- -
+ +
+
+ + {#if !$currentUser} + + {:else} + + {/if} +
+
+
+{#if $currentUser} + {#if isAdmin} + + + + {:else} + + {/if} +{:else} +
+
+
+ + bat + +
+
+ + bat + +
+
+ + bat + +
+ haunted house +
+

ERROR 403

+
This area is forbidden. Turn back now!
+
+{/if} diff --git a/imports/ui/ChromebookScan.svelte b/imports/ui/ChromebookScan.svelte new file mode 100644 index 0000000..d58b14e --- /dev/null +++ b/imports/ui/ChromebookScan.svelte @@ -0,0 +1,41 @@ + + + + +
+
+ Hello World! +
+ +
+
+
+ +
+
+
+
+
diff --git a/imports/ui/Chromebooks.svelte b/imports/ui/Chromebooks.svelte new file mode 100644 index 0000000..0a67842 --- /dev/null +++ b/imports/ui/Chromebooks.svelte @@ -0,0 +1,34 @@ + + + + + + +
+ +
+
+ + + +TODO: Use student email to look up Chromebook history +TODO: Use chromebook ID (or picture of ID) to look up Chromebook history diff --git a/imports/ui/ProcessLaptops.svelte b/imports/ui/ProcessLaptops.svelte new file mode 100644 index 0000000..8891e86 --- /dev/null +++ b/imports/ui/ProcessLaptops.svelte @@ -0,0 +1,12 @@ + + +
+

Process Laptops

+
diff --git a/imports/util/JsBarcode.min.js b/imports/util/JsBarcode.min.js new file mode 100644 index 0000000..a5c0cbc --- /dev/null +++ b/imports/util/JsBarcode.min.js @@ -0,0 +1,2 @@ +/*! JsBarcode v3.11.5 | (c) Johan Lindell | MIT license */ +!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=15)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.default=function t(e,n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.data=e,this.text=n.text||e,this.options=n}},function(t,e,n){"use strict";var r;function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}Object.defineProperty(e,"__esModule",{value:!0});var i=e.SET_A=0,a=e.SET_B=1,u=e.SET_C=2,f=(e.SHIFT=98,e.START_A=103),c=e.START_B=104,s=e.START_C=105;e.MODULO=103,e.STOP=106,e.FNC1=207,e.SET_BY_CODE=(o(r={},f,i),o(r,c,a),o(r,s,u),r),e.SWAP={101:i,100:a,99:u},e.A_START_CHAR=String.fromCharCode(208),e.B_START_CHAR=String.fromCharCode(209),e.C_START_CHAR=String.fromCharCode(210),e.A_CHARS="[\0-_È-Ï]",e.B_CHARS="[ -È-Ï]",e.C_CHARS="(Ï*[0-9]{2}Ï*)",e.BARS=[11011001100,11001101100,11001100110,10010011e3,10010001100,10001001100,10011001e3,10011000100,10001100100,11001001e3,11001000100,11000100100,10110011100,10011011100,10011001110,10111001100,10011101100,10011100110,11001110010,11001011100,11001001110,11011100100,11001110100,11101101110,11101001100,11100101100,11100100110,11101100100,11100110100,11100110010,11011011e3,11011000110,11000110110,10100011e3,10001011e3,10001000110,10110001e3,10001101e3,10001100010,11010001e3,11000101e3,11000100010,10110111e3,10110001110,10001101110,10111011e3,10111000110,10001110110,11101110110,11010001110,11000101110,11011101e3,11011100010,11011101110,11101011e3,11101000110,11100010110,11101101e3,11101100010,11100011010,11101111010,11001000010,11110001010,1010011e4,10100001100,1001011e4,10010000110,10000101100,10000100110,1011001e4,10110000100,1001101e4,10011000010,10000110100,10000110010,11000010010,1100101e4,11110111010,11000010100,10001111010,10100111100,10010111100,10010011110,10111100100,10011110100,10011110010,11110100100,11110010100,11110010010,11011011110,11011110110,11110110110,10101111e3,10100011110,10001011110,10111101e3,10111100010,11110101e3,11110100010,10111011110,10111101110,11101011110,11110101110,11010000100,1101001e4,11010011100,1100011101011]},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.SIDE_BIN="101",e.MIDDLE_BIN="01010",e.BINARIES={L:["0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011"],G:["0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111"],R:["1110010","1100110","1101100","1000010","1011100","1001110","1010000","1000100","1001000","1110100"],O:["0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011"],E:["0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111"]},e.EAN2_STRUCTURE=["LL","LG","GL","GG"],e.EAN5_STRUCTURE=["GGLLL","GLGLL","GLLGL","GLLLG","LGGLL","LLGGL","LLLGG","LGLGL","LGLLG","LLGLG"],e.EAN13_STRUCTURE=["LLLLLL","LLGLGG","LLGGLG","LLGGGL","LGLLGG","LGGLLG","LGGGLL","LGLGLG","LGLGGL","LGGLGL"]},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(2);e.default=function(t,e,n){var o=t.split("").map((function(t,n){return r.BINARIES[e[n]]})).map((function(e,n){return e?e[t[n]]:""}));if(n){var i=t.length-1;o=o.map((function(t,e){return e=200){i=t.shift()-105;var a=u.SWAP[i];void 0!==a?o=e.next(t,n+1,a):(r!==u.SET_A&&r!==u.SET_B||i!==u.SHIFT||(t[0]=r===u.SET_A?t[0]>95?t[0]-96:t[0]:t[0]<32?t[0]+96:t[0]),o=e.next(t,n+1,r))}else i=e.correctIndex(t,r),o=e.next(t,n+1,r);var f=i*n;return{result:e.getBar(i)+o.result,checksum:f+o.checksum}}}]),e}(a.default);e.default=f},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mod10=function(t){for(var e=0,n=0;n10*n.width?10*n.width:n.fontSize,r.guardHeight=n.height+r.fontSize/2+n.textMargin,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:"encode",value:function(){return this.options.flat?this.encodeFlat():this.encodeGuarded()}},{key:"leftText",value:function(t,e){return this.text.substr(t,e)}},{key:"leftEncode",value:function(t,e){return(0,i.default)(t,e)}},{key:"rightText",value:function(t,e){return this.text.substr(t,e)}},{key:"rightEncode",value:function(t,e){return(0,i.default)(t,e)}},{key:"encodeGuarded",value:function(){var t={fontSize:this.fontSize},e={height:this.guardHeight};return[{data:o.SIDE_BIN,options:e},{data:this.leftEncode(),text:this.leftText(),options:t},{data:o.MIDDLE_BIN,options:e},{data:this.rightEncode(),text:this.rightText(),options:t},{data:o.SIDE_BIN,options:e}]}},{key:"encodeFlat",value:function(){return{data:[o.SIDE_BIN,this.leftEncode(),o.MIDDLE_BIN,this.rightEncode(),o.SIDE_BIN].join(""),text:this.text}}}]),e}(a(n(0)).default);e.default=u},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n10*n.width?r.fontSize=10*n.width:r.fontSize=n.fontSize,r.guardHeight=n.height+r.fontSize/2+n.textMargin,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:"valid",value:function(){return-1!==this.data.search(/^[0-9]{12}$/)&&this.data[11]==u(this.data)}},{key:"encode",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:"flatEncoding",value:function(){var t="";return t+="101",t+=(0,o.default)(this.data.substr(0,6),"LLLLLL"),t+="01010",t+=(0,o.default)(this.data.substr(6,6),"RRRRRR"),{data:t+="101",text:this.text}}},{key:"guardedEncoding",value:function(){var t=[];return this.displayValue&&t.push({data:"00000000",text:this.text.substr(0,1),options:{textAlign:"left",fontSize:this.fontSize}}),t.push({data:"101"+(0,o.default)(this.data[0],"L"),options:{height:this.guardHeight}}),t.push({data:(0,o.default)(this.data.substr(1,5),"LLLLL"),text:this.text.substr(1,5),options:{fontSize:this.fontSize}}),t.push({data:"01010",options:{height:this.guardHeight}}),t.push({data:(0,o.default)(this.data.substr(6,5),"RRRRR"),text:this.text.substr(6,5),options:{fontSize:this.fontSize}}),t.push({data:(0,o.default)(this.data[11],"R")+"101",options:{height:this.guardHeight}}),this.displayValue&&t.push({data:"00000000",text:this.text.substr(11,1),options:{textAlign:"right",fontSize:this.fontSize}}),t}}]),e}(i(n(0)).default);function u(t){var e,n=0;for(e=1;e<11;e+=2)n+=parseInt(t[e]);for(e=0;e<11;e+=2)n+=3*parseInt(t[e]);return(10-n%10)%10}e.default=a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n0?e.fontSize+e.textMargin:0)+e.marginTop+e.marginBottom}function u(t,e,n){if(n.displayValue&&ee&&(e=t[n].height);return e},e.getEncodingHeight=a,e.getBarcodePadding=u,e.calculateEncodingAttributes=function(t,e,n){for(var r=0;r=i(t);return e+String.fromCharCode(r?206:205)+u(t,r)}e.default=function(t){var e=void 0;if(a(t).length>=2)e=r.C_START_CHAR+f(t);else{var n=o(t)>i(t);e=(n?r.A_START_CHAR:r.B_START_CHAR)+u(t,n)}return e.replace(/[\xCD\xCE]([^])[\xCD\xCE]/,(function(t,e){return String.fromCharCode(203)+e}))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n10*n.width?r.fontSize=10*n.width:r.fontSize=n.fontSize,r.guardHeight=n.height+r.fontSize/2+n.textMargin,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:"valid",value:function(){return this.isValid}},{key:"encode",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:"flatEncoding",value:function(){var t="";return t+="101",t+=this.encodeMiddleDigits(),{data:t+="010101",text:this.text}}},{key:"guardedEncoding",value:function(){var t=[];return this.displayValue&&t.push({data:"00000000",text:this.text[0],options:{textAlign:"left",fontSize:this.fontSize}}),t.push({data:"101",options:{height:this.guardHeight}}),t.push({data:this.encodeMiddleDigits(),text:this.text.substring(1,7),options:{fontSize:this.fontSize}}),t.push({data:"010101",options:{height:this.guardHeight}}),this.displayValue&&t.push({data:"00000000",text:this.text[7],options:{textAlign:"right",fontSize:this.fontSize}}),t}},{key:"encodeMiddleDigits",value:function(){var t=this.upcA[0],e=this.upcA[this.upcA.length-1],n=s[parseInt(e)][parseInt(t)];return(0,o.default)(this.middleDigits,n)}}]),e}(i.default);function p(t,e){for(var n=parseInt(t[t.length-1]),r=c[n],o="",i=0,u=0;u=3&&this.number<=131070}}]),e}(((r=i)&&r.__esModule?r:{default:r}).default);e.pharmacode=a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.codabar=void 0;var r,o=function(){function t(t,e){for(var n=0;n0?(n=0,o.textAlign="left"):"right"==t.textAlign?(n=e.width-1,o.textAlign="right"):(n=e.width/2,o.textAlign="center"),o.fillText(e.text,n,r))}},{key:"moveCanvasDrawing",value:function(t){this.canvas.getContext("2d").translate(t.width,0)}},{key:"restoreCanvas",value:function(){this.canvas.getContext("2d").restore()}}]),t}();e.default=f},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n0&&(this.drawRect(a-e.width*i,r,e.width*i,e.height,t),i=0);i>0&&this.drawRect(a-e.width*(i-1),r,e.width*i,e.height,t)}},{key:"drawSVGText",value:function(t,e,n){var r,o,i=this.document.createElementNS(f,"text");e.displayValue&&(i.setAttribute("style","font:"+e.fontOptions+" "+e.fontSize+"px "+e.font),o="top"==e.textPosition?e.fontSize-e.textMargin:e.height+e.textMargin+e.fontSize,"left"==e.textAlign||n.barcodePadding>0?(r=0,i.setAttribute("text-anchor","start")):"right"==e.textAlign?(r=n.width-1,i.setAttribute("text-anchor","end")):(r=n.width/2,i.setAttribute("text-anchor","middle")),i.setAttribute("x",r),i.setAttribute("y",o),i.appendChild(this.document.createTextNode(n.text)),t.appendChild(i))}},{key:"setSvgAttributes",value:function(t,e){var n=this.svg;n.setAttribute("width",t+"px"),n.setAttribute("height",e+"px"),n.setAttribute("x","0px"),n.setAttribute("y","0px"),n.setAttribute("viewBox","0 0 "+t+" "+e),n.setAttribute("xmlns",f),n.setAttribute("version","1.1"),n.setAttribute("style","transform: translate(0,0)")}},{key:"createGroup",value:function(t,e,n){var r=this.document.createElementNS(f,"g");return r.setAttribute("transform","translate("+t+", "+e+")"),n.appendChild(r),r}},{key:"setGroupOptions",value:function(t,e){t.setAttribute("style","fill:"+e.lineColor+";")}},{key:"drawRect",value:function(t,e,n,r,o){var i=this.document.createElementNS(f,"rect");return i.setAttribute("x",t),i.setAttribute("y",e),i.setAttribute("width",n),i.setAttribute("height",r),o.appendChild(i),i}}]),t}();e.default=c},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.QRious = factory()); +}(this, (function () { 'use strict'; + + /* + * Copyright (C) 2017 Alasdair Mercer, !ninja + * + * 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. + */ + + /** + * A bare-bones constructor for surrogate prototype swapping. + * + * @private + * @constructor + */ + var Constructor = /* istanbul ignore next */ function() {}; + /** + * A reference to Object.prototype.hasOwnProperty. + * + * @private + * @type {Function} + */ + var hasOwnProperty = Object.prototype.hasOwnProperty; + /** + * A reference to Array.prototype.slice. + * + * @private + * @type {Function} + */ + var slice = Array.prototype.slice; + + /** + * Creates an object which inherits the given prototype. + * + * Optionally, the created object can be extended further with the specified properties. + * + * @param {Object} prototype - the prototype to be inherited by the created object + * @param {Object} [properties] - the optional properties to be extended by the created object + * @return {Object} The newly created object. + * @private + */ + function createObject(prototype, properties) { + var result; + /* istanbul ignore next */ + if (typeof Object.create === 'function') { + result = Object.create(prototype); + } else { + Constructor.prototype = prototype; + result = new Constructor(); + Constructor.prototype = null; + } + + if (properties) { + extendObject(true, result, properties); + } + + return result; + } + + /** + * Extends the constructor to which this method is associated with the prototype and/or + * statics provided. + * + * If name is provided, it will be used as the class name and can be accessed via a special + * class_ property on the child constructor, otherwise the class name of the super constructor will be used + * instead. The class name may also be used string representation for instances of the child constructor (via + * toString), but this is not applicable to the lite version of Nevis. + * + * If constructor is provided, it will be used as the constructor for the child, otherwise a simple + * constructor which only calls the super constructor will be used instead. + * + * The super constructor can be accessed via a special super_ property on the child constructor. + * + * @param {string} [name=this.class_] - the class name to be used for the child constructor + * @param {Function} [constructor] - the constructor for the child + * @param {Object} [prototype] - the prototype properties to be defined for the child + * @param {Object} [statics] - the static properties to be defined for the child + * @return {Function} The child constructor provided or the one created if none was given. + * @public + */ + function extend(name, constructor, prototype, statics) { + var superConstructor = this; + + if (typeof name !== 'string') { + statics = prototype; + prototype = constructor; + constructor = name; + name = null; + } + + if (typeof constructor !== 'function') { + statics = prototype; + prototype = constructor; + constructor = function() { + return superConstructor.apply(this, arguments); + }; + } + + extendObject(false, constructor, superConstructor, statics); + + constructor.prototype = createObject(superConstructor.prototype, prototype); + constructor.prototype.constructor = constructor; + + constructor.class_ = name || superConstructor.class_; + constructor.super_ = superConstructor; + + return constructor; + } + + /** + * Extends the specified target object with the properties in each of the sources provided. + * + * if any source is null it will be ignored. + * + * @param {boolean} own - true to only copy own properties from sources onto + * target; otherwise false + * @param {Object} target - the target object which should be extended + * @param {...Object} [sources] - the source objects whose properties are to be copied onto target + * @return {void} + * @private + */ + function extendObject(own, target, sources) { + sources = slice.call(arguments, 2); + + var property; + var source; + + for (var i = 0, length = sources.length; i < length; i++) { + source = sources[i]; + + for (property in source) { + if (!own || hasOwnProperty.call(source, property)) { + target[property] = source[property]; + } + } + } + } + + var extend_1 = extend; + + /** + * The base class from which all others should extend. + * + * @public + * @constructor + */ + function Nevis() {} + Nevis.class_ = 'Nevis'; + Nevis.super_ = Object; + + /** + * Extends the constructor to which this method is associated with the prototype and/or + * statics provided. + * + * If name is provided, it will be used as the class name and can be accessed via a special + * class_ property on the child constructor, otherwise the class name of the super constructor will be used + * instead. The class name may also be used string representation for instances of the child constructor (via + * toString), but this is not applicable to the lite version of Nevis. + * + * If constructor is provided, it will be used as the constructor for the child, otherwise a simple + * constructor which only calls the super constructor will be used instead. + * + * The super constructor can be accessed via a special super_ property on the child constructor. + * + * @param {string} [name=this.class_] - the class name to be used for the child constructor + * @param {Function} [constructor] - the constructor for the child + * @param {Object} [prototype] - the prototype properties to be defined for the child + * @param {Object} [statics] - the static properties to be defined for the child + * @return {Function} The child constructor provided or the one created if none was given. + * @public + * @static + * @memberof Nevis + */ + Nevis.extend = extend_1; + + var nevis = Nevis; + + var lite = nevis; + + /** + * Responsible for rendering a QR code {@link Frame} on a specific type of element. + * + * A renderer may be dependant on the rendering of another element, so the ordering of their execution is important. + * + * The rendering of a element can be deferred by disabling the renderer initially, however, any attempt get the element + * from the renderer will result in it being immediately enabled and the element being rendered. + * + * @param {QRious} qrious - the {@link QRious} instance to be used + * @param {*} element - the element onto which the QR code is to be rendered + * @param {boolean} [enabled] - true this {@link Renderer} is enabled; otherwise false. + * @public + * @class + * @extends Nevis + */ + var Renderer = lite.extend(function(qrious, element, enabled) { + /** + * The {@link QRious} instance. + * + * @protected + * @type {QRious} + * @memberof Renderer# + */ + this.qrious = qrious; + + /** + * The element onto which this {@link Renderer} is rendering the QR code. + * + * @protected + * @type {*} + * @memberof Renderer# + */ + this.element = element; + this.element.qrious = qrious; + + /** + * Whether this {@link Renderer} is enabled. + * + * @protected + * @type {boolean} + * @memberof Renderer# + */ + this.enabled = Boolean(enabled); + }, { + + /** + * Draws the specified QR code frame on the underlying element. + * + * Implementations of {@link Renderer} must override this method with their own specific logic. + * + * @param {Frame} frame - the {@link Frame} to be drawn + * @return {void} + * @protected + * @abstract + * @memberof Renderer# + */ + draw: function(frame) {}, + + /** + * Returns the element onto which this {@link Renderer} is rendering the QR code. + * + * If this method is called while this {@link Renderer} is disabled, it will be immediately enabled and rendered + * before the element is returned. + * + * @return {*} The element. + * @public + * @memberof Renderer# + */ + getElement: function() { + if (!this.enabled) { + this.enabled = true; + this.render(); + } + + return this.element; + }, + + /** + * Calculates the size (in pixel units) to represent an individual module within the QR code based on the + * frame provided. + * + * Any configured padding will be excluded from the returned size. + * + * The returned value will be at least one, even in cases where the size of the QR code does not fit its contents. + * This is done so that the inevitable clipping is handled more gracefully since this way at least something is + * displayed instead of just a blank space filled by the background color. + * + * @param {Frame} frame - the {@link Frame} from which the module size is to be derived + * @return {number} The pixel size for each module in the QR code which will be no less than one. + * @protected + * @memberof Renderer# + */ + getModuleSize: function(frame) { + var qrious = this.qrious; + var padding = qrious.padding || 0; + var pixels = Math.floor((qrious.size - (padding * 2)) / frame.width); + + return Math.max(1, pixels); + }, + + /** + * Calculates the offset/padding (in pixel units) to be inserted before the QR code based on the frame + * provided. + * + * The returned value will be zero if there is no available offset or if the size of the QR code does not fit its + * contents. It will never be a negative value. This is done so that the inevitable clipping appears more naturally + * and it is not clipped from all directions. + * + * @param {Frame} frame - the {@link Frame} from which the offset is to be derived + * @return {number} The pixel offset for the QR code which will be no less than zero. + * @protected + * @memberof Renderer# + */ + getOffset: function(frame) { + var qrious = this.qrious; + var padding = qrious.padding; + + if (padding != null) { + return padding; + } + + var moduleSize = this.getModuleSize(frame); + var offset = Math.floor((qrious.size - (moduleSize * frame.width)) / 2); + + return Math.max(0, offset); + }, + + /** + * Renders a QR code on the underlying element based on the frame provided. + * + * @param {Frame} frame - the {@link Frame} to be rendered + * @return {void} + * @public + * @memberof Renderer# + */ + render: function(frame) { + if (this.enabled) { + this.resize(); + this.reset(); + this.draw(frame); + } + }, + + /** + * Resets the underlying element, effectively clearing any previously rendered QR code. + * + * Implementations of {@link Renderer} must override this method with their own specific logic. + * + * @return {void} + * @protected + * @abstract + * @memberof Renderer# + */ + reset: function() {}, + + /** + * Ensures that the size of the underlying element matches that defined on the associated {@link QRious} instance. + * + * Implementations of {@link Renderer} must override this method with their own specific logic. + * + * @return {void} + * @protected + * @abstract + * @memberof Renderer# + */ + resize: function() {} + + }); + + var Renderer_1 = Renderer; + + /** + * An implementation of {@link Renderer} for working with canvas elements. + * + * @public + * @class + * @extends Renderer + */ + var CanvasRenderer = Renderer_1.extend({ + + /** + * @override + */ + draw: function(frame) { + var i, j; + var qrious = this.qrious; + var moduleSize = this.getModuleSize(frame); + var offset = this.getOffset(frame); + var context = this.element.getContext('2d'); + + context.fillStyle = qrious.foreground; + context.globalAlpha = qrious.foregroundAlpha; + + for (i = 0; i < frame.width; i++) { + for (j = 0; j < frame.width; j++) { + if (frame.buffer[(j * frame.width) + i]) { + context.fillRect((moduleSize * i) + offset, (moduleSize * j) + offset, moduleSize, moduleSize); + } + } + } + }, + + /** + * @override + */ + reset: function() { + var qrious = this.qrious; + var context = this.element.getContext('2d'); + var size = qrious.size; + + context.lineWidth = 1; + context.clearRect(0, 0, size, size); + context.fillStyle = qrious.background; + context.globalAlpha = qrious.backgroundAlpha; + context.fillRect(0, 0, size, size); + }, + + /** + * @override + */ + resize: function() { + var element = this.element; + + element.width = element.height = this.qrious.size; + } + + }); + + var CanvasRenderer_1 = CanvasRenderer; + + /* eslint no-multi-spaces: "off" */ + + + + /** + * Contains alignment pattern information. + * + * @public + * @class + * @extends Nevis + */ + var Alignment = lite.extend(null, { + + /** + * The alignment pattern block. + * + * @public + * @static + * @type {number[]} + * @memberof Alignment + */ + BLOCK: [ + 0, 11, 15, 19, 23, 27, 31, + 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24, + 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28 + ] + + }); + + var Alignment_1 = Alignment; + + /* eslint no-multi-spaces: "off" */ + + + + /** + * Contains error correction information. + * + * @public + * @class + * @extends Nevis + */ + var ErrorCorrection = lite.extend(null, { + + /** + * The error correction blocks. + * + * There are four elements per version. The first two indicate the number of blocks, then the data width, and finally + * the ECC width. + * + * @public + * @static + * @type {number[]} + * @memberof ErrorCorrection + */ + BLOCKS: [ + 1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17, + 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28, + 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22, + 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16, + 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22, + 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28, + 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26, + 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26, + 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24, + 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28, + 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24, + 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28, + 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22, + 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24, + 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24, + 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30, + 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28, + 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28, + 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26, + 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28, + 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30, + 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24, + 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30, + 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30, + 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30, + 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30, + 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30, + 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30, + 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30, + 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30, + 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30, + 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30, + 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30, + 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30, + 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30, + 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30, + 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30, + 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30, + 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30, + 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30 + ], + + /** + * The final format bits with mask (level << 3 | mask). + * + * @public + * @static + * @type {number[]} + * @memberof ErrorCorrection + */ + FINAL_FORMAT: [ + // L + 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976, + // M + 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, + // Q + 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed, + // H + 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b + ], + + /** + * A map of human-readable ECC levels. + * + * @public + * @static + * @type {Object.} + * @memberof ErrorCorrection + */ + LEVELS: { + L: 1, + M: 2, + Q: 3, + H: 4 + } + + }); + + var ErrorCorrection_1 = ErrorCorrection; + + /** + * Contains Galois field information. + * + * @public + * @class + * @extends Nevis + */ + var Galois = lite.extend(null, { + + /** + * The Galois field exponent table. + * + * @public + * @static + * @type {number[]} + * @memberof Galois + */ + EXPONENT: [ + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, + 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, + 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, + 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1, + 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, + 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, + 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce, + 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, + 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54, + 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, + 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, + 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41, + 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, + 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09, + 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16, + 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00 + ], + + /** + * The Galois field log table. + * + * @public + * @static + * @type {number[]} + * @memberof Galois + */ + LOG: [ + 0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b, + 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71, + 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45, + 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6, + 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88, + 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40, + 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d, + 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57, + 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18, + 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e, + 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61, + 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2, + 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6, + 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a, + 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7, + 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf + ] + + }); + + var Galois_1 = Galois; + + /** + * Contains version pattern information. + * + * @public + * @class + * @extends Nevis + */ + var Version = lite.extend(null, { + + /** + * The version pattern block. + * + * @public + * @static + * @type {number[]} + * @memberof Version + */ + BLOCK: [ + 0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d, 0x928, 0xb78, 0x45d, 0xa17, 0x532, + 0x9a6, 0x683, 0x8c9, 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75, 0x250, 0x9d5, + 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64, 0x541, 0xc69 + ] + + }); + + var Version_1 = Version; + + /** + * Generates information for a QR code frame based on a specific value to be encoded. + * + * @param {Frame~Options} options - the options to be used + * @public + * @class + * @extends Nevis + */ + var Frame = lite.extend(function(options) { + var dataBlock, eccBlock, index, neccBlock1, neccBlock2; + var valueLength = options.value.length; + + this._badness = []; + this._level = ErrorCorrection_1.LEVELS[options.level]; + this._polynomial = []; + this._value = options.value; + this._version = 0; + this._stringBuffer = []; + + while (this._version < 40) { + this._version++; + + index = ((this._level - 1) * 4) + ((this._version - 1) * 16); + + neccBlock1 = ErrorCorrection_1.BLOCKS[index++]; + neccBlock2 = ErrorCorrection_1.BLOCKS[index++]; + dataBlock = ErrorCorrection_1.BLOCKS[index++]; + eccBlock = ErrorCorrection_1.BLOCKS[index]; + + index = (dataBlock * (neccBlock1 + neccBlock2)) + neccBlock2 - 3 + (this._version <= 9); + + if (valueLength <= index) { + break; + } + } + + this._dataBlock = dataBlock; + this._eccBlock = eccBlock; + this._neccBlock1 = neccBlock1; + this._neccBlock2 = neccBlock2; + + /** + * The data width is based on version. + * + * @public + * @type {number} + * @memberof Frame# + */ + // FIXME: Ensure that it fits instead of being truncated. + var width = this.width = 17 + (4 * this._version); + + /** + * The image buffer. + * + * @public + * @type {number[]} + * @memberof Frame# + */ + this.buffer = Frame._createArray(width * width); + + this._ecc = Frame._createArray(dataBlock + ((dataBlock + eccBlock) * (neccBlock1 + neccBlock2)) + neccBlock2); + this._mask = Frame._createArray(((width * (width + 1)) + 1) / 2); + + this._insertFinders(); + this._insertAlignments(); + + // Insert single foreground cell. + this.buffer[8 + (width * (width - 8))] = 1; + + this._insertTimingGap(); + this._reverseMask(); + this._insertTimingRowAndColumn(); + this._insertVersion(); + this._syncMask(); + this._convertBitStream(valueLength); + this._calculatePolynomial(); + this._appendEccToData(); + this._interleaveBlocks(); + this._pack(); + this._finish(); + }, { + + _addAlignment: function(x, y) { + var i; + var buffer = this.buffer; + var width = this.width; + + buffer[x + (width * y)] = 1; + + for (i = -2; i < 2; i++) { + buffer[x + i + (width * (y - 2))] = 1; + buffer[x - 2 + (width * (y + i + 1))] = 1; + buffer[x + 2 + (width * (y + i))] = 1; + buffer[x + i + 1 + (width * (y + 2))] = 1; + } + + for (i = 0; i < 2; i++) { + this._setMask(x - 1, y + i); + this._setMask(x + 1, y - i); + this._setMask(x - i, y - 1); + this._setMask(x + i, y + 1); + } + }, + + _appendData: function(data, dataLength, ecc, eccLength) { + var bit, i, j; + var polynomial = this._polynomial; + var stringBuffer = this._stringBuffer; + + for (i = 0; i < eccLength; i++) { + stringBuffer[ecc + i] = 0; + } + + for (i = 0; i < dataLength; i++) { + bit = Galois_1.LOG[stringBuffer[data + i] ^ stringBuffer[ecc]]; + + if (bit !== 255) { + for (j = 1; j < eccLength; j++) { + stringBuffer[ecc + j - 1] = stringBuffer[ecc + j] ^ + Galois_1.EXPONENT[Frame._modN(bit + polynomial[eccLength - j])]; + } + } else { + for (j = ecc; j < ecc + eccLength; j++) { + stringBuffer[j] = stringBuffer[j + 1]; + } + } + + stringBuffer[ecc + eccLength - 1] = bit === 255 ? 0 : Galois_1.EXPONENT[Frame._modN(bit + polynomial[0])]; + } + }, + + _appendEccToData: function() { + var i; + var data = 0; + var dataBlock = this._dataBlock; + var ecc = this._calculateMaxLength(); + var eccBlock = this._eccBlock; + + for (i = 0; i < this._neccBlock1; i++) { + this._appendData(data, dataBlock, ecc, eccBlock); + + data += dataBlock; + ecc += eccBlock; + } + + for (i = 0; i < this._neccBlock2; i++) { + this._appendData(data, dataBlock + 1, ecc, eccBlock); + + data += dataBlock + 1; + ecc += eccBlock; + } + }, + + _applyMask: function(mask) { + var r3x, r3y, x, y; + var buffer = this.buffer; + var width = this.width; + + switch (mask) { + case 0: + for (y = 0; y < width; y++) { + for (x = 0; x < width; x++) { + if (!((x + y) & 1) && !this._isMasked(x, y)) { + buffer[x + (y * width)] ^= 1; + } + } + } + + break; + case 1: + for (y = 0; y < width; y++) { + for (x = 0; x < width; x++) { + if (!(y & 1) && !this._isMasked(x, y)) { + buffer[x + (y * width)] ^= 1; + } + } + } + + break; + case 2: + for (y = 0; y < width; y++) { + for (r3x = 0, x = 0; x < width; x++, r3x++) { + if (r3x === 3) { + r3x = 0; + } + + if (!r3x && !this._isMasked(x, y)) { + buffer[x + (y * width)] ^= 1; + } + } + } + + break; + case 3: + for (r3y = 0, y = 0; y < width; y++, r3y++) { + if (r3y === 3) { + r3y = 0; + } + + for (r3x = r3y, x = 0; x < width; x++, r3x++) { + if (r3x === 3) { + r3x = 0; + } + + if (!r3x && !this._isMasked(x, y)) { + buffer[x + (y * width)] ^= 1; + } + } + } + + break; + case 4: + for (y = 0; y < width; y++) { + for (r3x = 0, r3y = (y >> 1) & 1, x = 0; x < width; x++, r3x++) { + if (r3x === 3) { + r3x = 0; + r3y = !r3y; + } + + if (!r3y && !this._isMasked(x, y)) { + buffer[x + (y * width)] ^= 1; + } + } + } + + break; + case 5: + for (r3y = 0, y = 0; y < width; y++, r3y++) { + if (r3y === 3) { + r3y = 0; + } + + for (r3x = 0, x = 0; x < width; x++, r3x++) { + if (r3x === 3) { + r3x = 0; + } + + if (!((x & y & 1) + !(!r3x | !r3y)) && !this._isMasked(x, y)) { + buffer[x + (y * width)] ^= 1; + } + } + } + + break; + case 6: + for (r3y = 0, y = 0; y < width; y++, r3y++) { + if (r3y === 3) { + r3y = 0; + } + + for (r3x = 0, x = 0; x < width; x++, r3x++) { + if (r3x === 3) { + r3x = 0; + } + + if (!((x & y & 1) + (r3x && r3x === r3y) & 1) && !this._isMasked(x, y)) { + buffer[x + (y * width)] ^= 1; + } + } + } + + break; + case 7: + for (r3y = 0, y = 0; y < width; y++, r3y++) { + if (r3y === 3) { + r3y = 0; + } + + for (r3x = 0, x = 0; x < width; x++, r3x++) { + if (r3x === 3) { + r3x = 0; + } + + if (!((r3x && r3x === r3y) + (x + y & 1) & 1) && !this._isMasked(x, y)) { + buffer[x + (y * width)] ^= 1; + } + } + } + + break; + } + }, + + _calculateMaxLength: function() { + return (this._dataBlock * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2; + }, + + _calculatePolynomial: function() { + var i, j; + var eccBlock = this._eccBlock; + var polynomial = this._polynomial; + + polynomial[0] = 1; + + for (i = 0; i < eccBlock; i++) { + polynomial[i + 1] = 1; + + for (j = i; j > 0; j--) { + polynomial[j] = polynomial[j] ? polynomial[j - 1] ^ + Galois_1.EXPONENT[Frame._modN(Galois_1.LOG[polynomial[j]] + i)] : polynomial[j - 1]; + } + + polynomial[0] = Galois_1.EXPONENT[Frame._modN(Galois_1.LOG[polynomial[0]] + i)]; + } + + // Use logs for generator polynomial to save calculation step. + for (i = 0; i <= eccBlock; i++) { + polynomial[i] = Galois_1.LOG[polynomial[i]]; + } + }, + + _checkBadness: function() { + var b, b1, h, x, y; + var bad = 0; + var badness = this._badness; + var buffer = this.buffer; + var width = this.width; + + // Blocks of same colour. + for (y = 0; y < width - 1; y++) { + for (x = 0; x < width - 1; x++) { + // All foreground colour. + if ((buffer[x + (width * y)] && + buffer[x + 1 + (width * y)] && + buffer[x + (width * (y + 1))] && + buffer[x + 1 + (width * (y + 1))]) || + // All background colour. + !(buffer[x + (width * y)] || + buffer[x + 1 + (width * y)] || + buffer[x + (width * (y + 1))] || + buffer[x + 1 + (width * (y + 1))])) { + bad += Frame.N2; + } + } + } + + var bw = 0; + + // X runs. + for (y = 0; y < width; y++) { + h = 0; + + badness[0] = 0; + + for (b = 0, x = 0; x < width; x++) { + b1 = buffer[x + (width * y)]; + + if (b === b1) { + badness[h]++; + } else { + badness[++h] = 1; + } + + b = b1; + bw += b ? 1 : -1; + } + + bad += this._getBadness(h); + } + + if (bw < 0) { + bw = -bw; + } + + var count = 0; + var big = bw; + big += big << 2; + big <<= 1; + + while (big > width * width) { + big -= width * width; + count++; + } + + bad += count * Frame.N4; + + // Y runs. + for (x = 0; x < width; x++) { + h = 0; + + badness[0] = 0; + + for (b = 0, y = 0; y < width; y++) { + b1 = buffer[x + (width * y)]; + + if (b === b1) { + badness[h]++; + } else { + badness[++h] = 1; + } + + b = b1; + } + + bad += this._getBadness(h); + } + + return bad; + }, + + _convertBitStream: function(length) { + var bit, i; + var ecc = this._ecc; + var version = this._version; + + // Convert string to bit stream. 8-bit data to QR-coded 8-bit data (numeric, alphanumeric, or kanji not supported). + for (i = 0; i < length; i++) { + ecc[i] = this._value.charCodeAt(i); + } + + var stringBuffer = this._stringBuffer = ecc.slice(); + var maxLength = this._calculateMaxLength(); + + if (length >= maxLength - 2) { + length = maxLength - 2; + + if (version > 9) { + length--; + } + } + + // Shift and re-pack to insert length prefix. + var index = length; + + if (version > 9) { + stringBuffer[index + 2] = 0; + stringBuffer[index + 3] = 0; + + while (index--) { + bit = stringBuffer[index]; + + stringBuffer[index + 3] |= 255 & (bit << 4); + stringBuffer[index + 2] = bit >> 4; + } + + stringBuffer[2] |= 255 & (length << 4); + stringBuffer[1] = length >> 4; + stringBuffer[0] = 0x40 | (length >> 12); + } else { + stringBuffer[index + 1] = 0; + stringBuffer[index + 2] = 0; + + while (index--) { + bit = stringBuffer[index]; + + stringBuffer[index + 2] |= 255 & (bit << 4); + stringBuffer[index + 1] = bit >> 4; + } + + stringBuffer[1] |= 255 & (length << 4); + stringBuffer[0] = 0x40 | (length >> 4); + } + + // Fill to end with pad pattern. + index = length + 3 - (version < 10); + + while (index < maxLength) { + stringBuffer[index++] = 0xec; + stringBuffer[index++] = 0x11; + } + }, + + _getBadness: function(length) { + var i; + var badRuns = 0; + var badness = this._badness; + + for (i = 0; i <= length; i++) { + if (badness[i] >= 5) { + badRuns += Frame.N1 + badness[i] - 5; + } + } + + // FBFFFBF as in finder. + for (i = 3; i < length - 1; i += 2) { + if (badness[i - 2] === badness[i + 2] && + badness[i + 2] === badness[i - 1] && + badness[i - 1] === badness[i + 1] && + badness[i - 1] * 3 === badness[i] && + // Background around the foreground pattern? Not part of the specs. + (badness[i - 3] === 0 || i + 3 > length || + badness[i - 3] * 3 >= badness[i] * 4 || + badness[i + 3] * 3 >= badness[i] * 4)) { + badRuns += Frame.N3; + } + } + + return badRuns; + }, + + _finish: function() { + // Save pre-mask copy of frame. + this._stringBuffer = this.buffer.slice(); + + var currentMask, i; + var bit = 0; + var mask = 30000; + + /* + * Using for instead of while since in original Arduino code if an early mask was "good enough" it wouldn't try for + * a better one since they get more complex and take longer. + */ + for (i = 0; i < 8; i++) { + // Returns foreground-background imbalance. + this._applyMask(i); + + currentMask = this._checkBadness(); + + // Is current mask better than previous best? + if (currentMask < mask) { + mask = currentMask; + bit = i; + } + + // Don't increment "i" to a void redoing mask. + if (bit === 7) { + break; + } + + // Reset for next pass. + this.buffer = this._stringBuffer.slice(); + } + + // Redo best mask as none were "good enough" (i.e. last wasn't bit). + if (bit !== i) { + this._applyMask(bit); + } + + // Add in final mask/ECC level bytes. + mask = ErrorCorrection_1.FINAL_FORMAT[bit + (this._level - 1 << 3)]; + + var buffer = this.buffer; + var width = this.width; + + // Low byte. + for (i = 0; i < 8; i++, mask >>= 1) { + if (mask & 1) { + buffer[width - 1 - i + (width * 8)] = 1; + + if (i < 6) { + buffer[8 + (width * i)] = 1; + } else { + buffer[8 + (width * (i + 1))] = 1; + } + } + } + + // High byte. + for (i = 0; i < 7; i++, mask >>= 1) { + if (mask & 1) { + buffer[8 + (width * (width - 7 + i))] = 1; + + if (i) { + buffer[6 - i + (width * 8)] = 1; + } else { + buffer[7 + (width * 8)] = 1; + } + } + } + }, + + _interleaveBlocks: function() { + var i, j; + var dataBlock = this._dataBlock; + var ecc = this._ecc; + var eccBlock = this._eccBlock; + var k = 0; + var maxLength = this._calculateMaxLength(); + var neccBlock1 = this._neccBlock1; + var neccBlock2 = this._neccBlock2; + var stringBuffer = this._stringBuffer; + + for (i = 0; i < dataBlock; i++) { + for (j = 0; j < neccBlock1; j++) { + ecc[k++] = stringBuffer[i + (j * dataBlock)]; + } + + for (j = 0; j < neccBlock2; j++) { + ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))]; + } + } + + for (j = 0; j < neccBlock2; j++) { + ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))]; + } + + for (i = 0; i < eccBlock; i++) { + for (j = 0; j < neccBlock1 + neccBlock2; j++) { + ecc[k++] = stringBuffer[maxLength + i + (j * eccBlock)]; + } + } + + this._stringBuffer = ecc; + }, + + _insertAlignments: function() { + var i, x, y; + var version = this._version; + var width = this.width; + + if (version > 1) { + i = Alignment_1.BLOCK[version]; + y = width - 7; + + for (;;) { + x = width - 7; + + while (x > i - 3) { + this._addAlignment(x, y); + + if (x < i) { + break; + } + + x -= i; + } + + if (y <= i + 9) { + break; + } + + y -= i; + + this._addAlignment(6, y); + this._addAlignment(y, 6); + } + } + }, + + _insertFinders: function() { + var i, j, x, y; + var buffer = this.buffer; + var width = this.width; + + for (i = 0; i < 3; i++) { + j = 0; + y = 0; + + if (i === 1) { + j = width - 7; + } + if (i === 2) { + y = width - 7; + } + + buffer[y + 3 + (width * (j + 3))] = 1; + + for (x = 0; x < 6; x++) { + buffer[y + x + (width * j)] = 1; + buffer[y + (width * (j + x + 1))] = 1; + buffer[y + 6 + (width * (j + x))] = 1; + buffer[y + x + 1 + (width * (j + 6))] = 1; + } + + for (x = 1; x < 5; x++) { + this._setMask(y + x, j + 1); + this._setMask(y + 1, j + x + 1); + this._setMask(y + 5, j + x); + this._setMask(y + x + 1, j + 5); + } + + for (x = 2; x < 4; x++) { + buffer[y + x + (width * (j + 2))] = 1; + buffer[y + 2 + (width * (j + x + 1))] = 1; + buffer[y + 4 + (width * (j + x))] = 1; + buffer[y + x + 1 + (width * (j + 4))] = 1; + } + } + }, + + _insertTimingGap: function() { + var x, y; + var width = this.width; + + for (y = 0; y < 7; y++) { + this._setMask(7, y); + this._setMask(width - 8, y); + this._setMask(7, y + width - 7); + } + + for (x = 0; x < 8; x++) { + this._setMask(x, 7); + this._setMask(x + width - 8, 7); + this._setMask(x, width - 8); + } + }, + + _insertTimingRowAndColumn: function() { + var x; + var buffer = this.buffer; + var width = this.width; + + for (x = 0; x < width - 14; x++) { + if (x & 1) { + this._setMask(8 + x, 6); + this._setMask(6, 8 + x); + } else { + buffer[8 + x + (width * 6)] = 1; + buffer[6 + (width * (8 + x))] = 1; + } + } + }, + + _insertVersion: function() { + var i, j, x, y; + var buffer = this.buffer; + var version = this._version; + var width = this.width; + + if (version > 6) { + i = Version_1.BLOCK[version - 7]; + j = 17; + + for (x = 0; x < 6; x++) { + for (y = 0; y < 3; y++, j--) { + if (1 & (j > 11 ? version >> j - 12 : i >> j)) { + buffer[5 - x + (width * (2 - y + width - 11))] = 1; + buffer[2 - y + width - 11 + (width * (5 - x))] = 1; + } else { + this._setMask(5 - x, 2 - y + width - 11); + this._setMask(2 - y + width - 11, 5 - x); + } + } + } + } + }, + + _isMasked: function(x, y) { + var bit = Frame._getMaskBit(x, y); + + return this._mask[bit] === 1; + }, + + _pack: function() { + var bit, i, j; + var k = 1; + var v = 1; + var width = this.width; + var x = width - 1; + var y = width - 1; + + // Interleaved data and ECC codes. + var length = ((this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2; + + for (i = 0; i < length; i++) { + bit = this._stringBuffer[i]; + + for (j = 0; j < 8; j++, bit <<= 1) { + if (0x80 & bit) { + this.buffer[x + (width * y)] = 1; + } + + // Find next fill position. + do { + if (v) { + x--; + } else { + x++; + + if (k) { + if (y !== 0) { + y--; + } else { + x -= 2; + k = !k; + + if (x === 6) { + x--; + y = 9; + } + } + } else if (y !== width - 1) { + y++; + } else { + x -= 2; + k = !k; + + if (x === 6) { + x--; + y -= 8; + } + } + } + + v = !v; + } while (this._isMasked(x, y)); + } + } + }, + + _reverseMask: function() { + var x, y; + var width = this.width; + + for (x = 0; x < 9; x++) { + this._setMask(x, 8); + } + + for (x = 0; x < 8; x++) { + this._setMask(x + width - 8, 8); + this._setMask(8, x); + } + + for (y = 0; y < 7; y++) { + this._setMask(8, y + width - 7); + } + }, + + _setMask: function(x, y) { + var bit = Frame._getMaskBit(x, y); + + this._mask[bit] = 1; + }, + + _syncMask: function() { + var x, y; + var width = this.width; + + for (y = 0; y < width; y++) { + for (x = 0; x <= y; x++) { + if (this.buffer[x + (width * y)]) { + this._setMask(x, y); + } + } + } + } + + }, { + + _createArray: function(length) { + var i; + var array = []; + + for (i = 0; i < length; i++) { + array[i] = 0; + } + + return array; + }, + + _getMaskBit: function(x, y) { + var bit; + + if (x > y) { + bit = x; + x = y; + y = bit; + } + + bit = y; + bit += y * y; + bit >>= 1; + bit += x; + + return bit; + }, + + _modN: function(x) { + while (x >= 255) { + x -= 255; + x = (x >> 8) + (x & 255); + } + + return x; + }, + + // *Badness* coefficients. + N1: 3, + N2: 3, + N3: 40, + N4: 10 + + }); + + var Frame_1 = Frame; + + /** + * The options used by {@link Frame}. + * + * @typedef {Object} Frame~Options + * @property {string} level - The ECC level to be used. + * @property {string} value - The value to be encoded. + */ + + /** + * An implementation of {@link Renderer} for working with img elements. + * + * This depends on {@link CanvasRenderer} being executed first as this implementation simply applies the data URL from + * the rendered canvas element as the src for the img element being rendered. + * + * @public + * @class + * @extends Renderer + */ + var ImageRenderer = Renderer_1.extend({ + + /** + * @override + */ + draw: function() { + this.element.src = this.qrious.toDataURL(); + }, + + /** + * @override + */ + reset: function() { + this.element.src = ''; + }, + + /** + * @override + */ + resize: function() { + var element = this.element; + + element.width = element.height = this.qrious.size; + } + + }); + + var ImageRenderer_1 = ImageRenderer; + + /** + * Defines an available option while also configuring how values are applied to the target object. + * + * Optionally, a default value can be specified as well a value transformer for greater control over how the option + * value is applied. + * + * If no value transformer is specified, then any specified option will be applied directly. All values are maintained + * on the target object itself as a field using the option name prefixed with a single underscore. + * + * When an option is specified as modifiable, the {@link OptionManager} will be required to include a setter for the + * property that is defined on the target object that uses the option name. + * + * @param {string} name - the name to be used + * @param {boolean} [modifiable] - true if the property defined on target objects should include a setter; + * otherwise false + * @param {*} [defaultValue] - the default value to be used + * @param {Option~ValueTransformer} [valueTransformer] - the value transformer to be used + * @public + * @class + * @extends Nevis + */ + var Option = lite.extend(function(name, modifiable, defaultValue, valueTransformer) { + /** + * The name for this {@link Option}. + * + * @public + * @type {string} + * @memberof Option# + */ + this.name = name; + + /** + * Whether a setter should be included on the property defined on target objects for this {@link Option}. + * + * @public + * @type {boolean} + * @memberof Option# + */ + this.modifiable = Boolean(modifiable); + + /** + * The default value for this {@link Option}. + * + * @public + * @type {*} + * @memberof Option# + */ + this.defaultValue = defaultValue; + + this._valueTransformer = valueTransformer; + }, { + + /** + * Transforms the specified value so that it can be applied for this {@link Option}. + * + * If a value transformer has been specified for this {@link Option}, it will be called upon to transform + * value. Otherwise, value will be returned directly. + * + * @param {*} value - the value to be transformed + * @return {*} The transformed value or value if no value transformer is specified. + * @public + * @memberof Option# + */ + transform: function(value) { + var transformer = this._valueTransformer; + if (typeof transformer === 'function') { + return transformer(value, this); + } + + return value; + } + + }); + + var Option_1 = Option; + + /** + * Returns a transformed value for the specified value to be applied for the option provided. + * + * @callback Option~ValueTransformer + * @param {*} value - the value to be transformed + * @param {Option} option - the {@link Option} for which value is being transformed + * @return {*} The transform value. + */ + + /** + * Contains utility methods that are useful throughout the library. + * + * @public + * @class + * @extends Nevis + */ + var Utilities = lite.extend(null, { + + /** + * Returns the absolute value of a given number. + * + * This method is simply a convenient shorthand for Math.abs while ensuring that nulls are returned as + * null instead of zero. + * + * @param {number} value - the number whose absolute value is to be returned + * @return {number} The absolute value of value or null if value is + * null. + * @public + * @static + * @memberof Utilities + */ + abs: function(value) { + return value != null ? Math.abs(value) : null; + }, + + /** + * Returns whether the specified object has a property with the specified name as an own + * (not inherited) property. + * + * @param {Object} object - the object on which the property is to be checked + * @param {string} name - the name of the property to be checked + * @return {boolean} true if object has an own property with name. + * @public + * @static + * @memberof Utilities + */ + hasOwn: function(object, name) { + return Object.prototype.hasOwnProperty.call(object, name); + }, + + /** + * A non-operation method that does absolutely nothing. + * + * @return {void} + * @public + * @static + * @memberof Utilities + */ + noop: function() {}, + + /** + * Transforms the specified string to upper case while remaining null-safe. + * + * @param {string} string - the string to be transformed to upper case + * @return {string} string transformed to upper case if string is not null. + * @public + * @static + * @memberof Utilities + */ + toUpperCase: function(string) { + return string != null ? string.toUpperCase() : null; + } + + }); + + var Utilities_1 = Utilities; + + /** + * Manages multiple {@link Option} instances that are intended to be used by multiple implementations. + * + * Although the option definitions are shared between targets, the values are maintained on the targets themselves. + * + * @param {Option[]} options - the options to be used + * @public + * @class + * @extends Nevis + */ + var OptionManager = lite.extend(function(options) { + /** + * The available options for this {@link OptionManager}. + * + * @public + * @type {Object.} + * @memberof OptionManager# + */ + this.options = {}; + + options.forEach(function(option) { + this.options[option.name] = option; + }, this); + }, { + + /** + * Returns whether an option with the specified name is available. + * + * @param {string} name - the name of the {@link Option} whose existence is to be checked + * @return {boolean} true if an {@link Option} exists with name; otherwise + * false. + * @public + * @memberof OptionManager# + */ + exists: function(name) { + return this.options[name] != null; + }, + + /** + * Returns the value of the option with the specified name on the target object provided. + * + * @param {string} name - the name of the {@link Option} whose value on target is to be returned + * @param {Object} target - the object from which the value of the named {@link Option} is to be returned + * @return {*} The value of the {@link Option} with name on target. + * @public + * @memberof OptionManager# + */ + get: function(name, target) { + return OptionManager._get(this.options[name], target); + }, + + /** + * Returns a copy of all of the available options on the target object provided. + * + * @param {Object} target - the object from which the option name/value pairs are to be returned + * @return {Object.} A hash containing the name/value pairs of all options on target. + * @public + * @memberof OptionManager# + */ + getAll: function(target) { + var name; + var options = this.options; + var result = {}; + + for (name in options) { + if (Utilities_1.hasOwn(options, name)) { + result[name] = OptionManager._get(options[name], target); + } + } + + return result; + }, + + /** + * Initializes the available options for the target object provided and then applies the initial values + * within the speciifed options. + * + * This method will throw an error if any of the names within options does not match an available option. + * + * This involves setting the default values and defining properties for all of the available options on + * target before finally calling {@link OptionMananger#setAll} with options and + * target. Any options that are configured to be modifiable will have a setter included in their defined + * property that will allow its corresponding value to be modified. + * + * If a change handler is specified, it will be called whenever the value changes on target for a + * modifiable option, but only when done so via the defined property's setter. + * + * @param {Object.} options - the name/value pairs of the initial options to be set + * @param {Object} target - the object on which the options are to be initialized + * @param {Function} [changeHandler] - the function to be called whenever the value of an modifiable option changes on + * target + * @return {void} + * @throws {Error} If options contains an invalid option name. + * @public + * @memberof OptionManager# + */ + init: function(options, target, changeHandler) { + if (typeof changeHandler !== 'function') { + changeHandler = Utilities_1.noop; + } + + var name, option; + + for (name in this.options) { + if (Utilities_1.hasOwn(this.options, name)) { + option = this.options[name]; + + OptionManager._set(option, option.defaultValue, target); + OptionManager._createAccessor(option, target, changeHandler); + } + } + + this._setAll(options, target, true); + }, + + /** + * Sets the value of the option with the specified name on the target object provided to + * value. + * + * This method will throw an error if name does not match an available option or matches an option that + * cannot be modified. + * + * If value is null and the {@link Option} has a default value configured, then that default + * value will be used instead. If the {@link Option} also has a value transformer configured, it will be used to + * transform whichever value was determined to be used. + * + * This method returns whether the value of the underlying field on target was changed as a result. + * + * @param {string} name - the name of the {@link Option} whose value is to be set + * @param {*} value - the value to be set for the named {@link Option} on target + * @param {Object} target - the object on which value is to be set for the named {@link Option} + * @return {boolean} true if the underlying field on target was changed; otherwise + * false. + * @throws {Error} If name is invalid or is for an option that cannot be modified. + * @public + * @memberof OptionManager# + */ + set: function(name, value, target) { + return this._set(name, value, target); + }, + + /** + * Sets all of the specified options on the target object provided to their corresponding + * values. + * + * This method will throw an error if any of the names within options does not match an available option + * or matches an option that cannot be modified. + * + * If any value within options is null and the corresponding {@link Option} has a default + * value configured, then that default value will be used instead. If an {@link Option} also has a value transformer + * configured, it will be used to transform whichever value was determined to be used. + * + * This method returns whether the value for any of the underlying fields on target were changed as a + * result. + * + * @param {Object.} options - the name/value pairs of options to be set + * @param {Object} target - the object on which the options are to be set + * @return {boolean} true if any of the underlying fields on target were changed; otherwise + * false. + * @throws {Error} If options contains an invalid option name or an option that cannot be modiifed. + * @public + * @memberof OptionManager# + */ + setAll: function(options, target) { + return this._setAll(options, target); + }, + + _set: function(name, value, target, allowUnmodifiable) { + var option = this.options[name]; + if (!option) { + throw new Error('Invalid option: ' + name); + } + if (!option.modifiable && !allowUnmodifiable) { + throw new Error('Option cannot be modified: ' + name); + } + + return OptionManager._set(option, value, target); + }, + + _setAll: function(options, target, allowUnmodifiable) { + if (!options) { + return false; + } + + var name; + var changed = false; + + for (name in options) { + if (Utilities_1.hasOwn(options, name) && this._set(name, options[name], target, allowUnmodifiable)) { + changed = true; + } + } + + return changed; + } + + }, { + + _createAccessor: function(option, target, changeHandler) { + var descriptor = { + get: function() { + return OptionManager._get(option, target); + } + }; + + if (option.modifiable) { + descriptor.set = function(value) { + if (OptionManager._set(option, value, target)) { + changeHandler(value, option); + } + }; + } + + Object.defineProperty(target, option.name, descriptor); + }, + + _get: function(option, target) { + return target['_' + option.name]; + }, + + _set: function(option, value, target) { + var fieldName = '_' + option.name; + var oldValue = target[fieldName]; + var newValue = option.transform(value != null ? value : option.defaultValue); + + target[fieldName] = newValue; + + return newValue !== oldValue; + } + + }); + + var OptionManager_1 = OptionManager; + + /** + * Called whenever the value of a modifiable {@link Option} is changed on a target object via the defined property's + * setter. + * + * @callback OptionManager~ChangeHandler + * @param {*} value - the new value for option on the target object + * @param {Option} option - the modifable {@link Option} whose value has changed on the target object. + * @return {void} + */ + + /** + * A basic manager for {@link Service} implementations that are mapped to simple names. + * + * @public + * @class + * @extends Nevis + */ + var ServiceManager = lite.extend(function() { + this._services = {}; + }, { + + /** + * Returns the {@link Service} being managed with the specified name. + * + * @param {string} name - the name of the {@link Service} to be returned + * @return {Service} The {@link Service} is being managed with name. + * @throws {Error} If no {@link Service} is being managed with name. + * @public + * @memberof ServiceManager# + */ + getService: function(name) { + var service = this._services[name]; + if (!service) { + throw new Error('Service is not being managed with name: ' + name); + } + + return service; + }, + + /** + * Sets the {@link Service} implementation to be managed for the specified name to the + * service provided. + * + * @param {string} name - the name of the {@link Service} to be managed with name + * @param {Service} service - the {@link Service} implementation to be managed + * @return {void} + * @throws {Error} If a {@link Service} is already being managed with the same name. + * @public + * @memberof ServiceManager# + */ + setService: function(name, service) { + if (this._services[name]) { + throw new Error('Service is already managed with name: ' + name); + } + + if (service) { + this._services[name] = service; + } + } + + }); + + var ServiceManager_1 = ServiceManager; + + var optionManager = new OptionManager_1([ + new Option_1('background', true, 'white'), + new Option_1('backgroundAlpha', true, 1, Utilities_1.abs), + new Option_1('element'), + new Option_1('foreground', true, 'black'), + new Option_1('foregroundAlpha', true, 1, Utilities_1.abs), + new Option_1('level', true, 'L', Utilities_1.toUpperCase), + new Option_1('mime', true, 'image/png'), + new Option_1('padding', true, null, Utilities_1.abs), + new Option_1('size', true, 100, Utilities_1.abs), + new Option_1('value', true, '') + ]); + var serviceManager = new ServiceManager_1(); + + /** + * Enables configuration of a QR code generator which uses HTML5 canvas for rendering. + * + * @param {QRious~Options} [options] - the options to be used + * @throws {Error} If any options are invalid. + * @public + * @class + * @extends Nevis + */ + var QRious = lite.extend(function(options) { + optionManager.init(options, this, this.update.bind(this)); + + var element = optionManager.get('element', this); + var elementService = serviceManager.getService('element'); + var canvas = element && elementService.isCanvas(element) ? element : elementService.createCanvas(); + var image = element && elementService.isImage(element) ? element : elementService.createImage(); + + this._canvasRenderer = new CanvasRenderer_1(this, canvas, true); + this._imageRenderer = new ImageRenderer_1(this, image, image === element); + + this.update(); + }, { + + /** + * Returns all of the options configured for this {@link QRious}. + * + * Any changes made to the returned object will not be reflected in the options themselves or their corresponding + * underlying fields. + * + * @return {Object.} A copy of the applied options. + * @public + * @memberof QRious# + */ + get: function() { + return optionManager.getAll(this); + }, + + /** + * Sets all of the specified options and automatically updates this {@link QRious} if any of the + * underlying fields are changed as a result. + * + * This is the preferred method for updating multiple options at one time to avoid unnecessary updates between + * changes. + * + * @param {QRious~Options} options - the options to be set + * @return {void} + * @throws {Error} If any options are invalid or cannot be modified. + * @public + * @memberof QRious# + */ + set: function(options) { + if (optionManager.setAll(options, this)) { + this.update(); + } + }, + + /** + * Returns the image data URI for the generated QR code using the mime provided. + * + * @param {string} [mime] - the MIME type for the image + * @return {string} The image data URI for the QR code. + * @public + * @memberof QRious# + */ + toDataURL: function(mime) { + return this.canvas.toDataURL(mime || this.mime); + }, + + /** + * Updates this {@link QRious} by generating a new {@link Frame} and re-rendering the QR code. + * + * @return {void} + * @protected + * @memberof QRious# + */ + update: function() { + var frame = new Frame_1({ + level: this.level, + value: this.value + }); + + this._canvasRenderer.render(frame); + this._imageRenderer.render(frame); + } + + }, { + + /** + * Configures the service provided to be used by all {@link QRious} instances. + * + * @param {Service} service - the {@link Service} to be configured + * @return {void} + * @throws {Error} If a {@link Service} has already been configured with the same name. + * @public + * @static + * @memberof QRious + */ + use: function(service) { + serviceManager.setService(service.getName(), service); + } + + }); + + Object.defineProperties(QRious.prototype, { + + canvas: { + /** + * Returns the canvas element being used to render the QR code for this {@link QRious}. + * + * @return {*} The canvas element. + * @public + * @memberof QRious# + * @alias canvas + */ + get: function() { + return this._canvasRenderer.getElement(); + } + }, + + image: { + /** + * Returns the img element being used to render the QR code for this {@link QRious}. + * + * @return {*} The img element. + * @public + * @memberof QRious# + * @alias image + */ + get: function() { + return this._imageRenderer.getElement(); + } + } + + }); + + var QRious_1$2 = QRious; + + /** + * The options used by {@link QRious}. + * + * @typedef {Object} QRious~Options + * @property {string} [background="white"] - The background color to be applied to the QR code. + * @property {number} [backgroundAlpha=1] - The background alpha to be applied to the QR code. + * @property {*} [element] - The element to be used to render the QR code which may either be an canvas or + * img. The element(s) will be created if needed. + * @property {string} [foreground="black"] - The foreground color to be applied to the QR code. + * @property {number} [foregroundAlpha=1] - The foreground alpha to be applied to the QR code. + * @property {string} [level="L"] - The error correction level to be applied to the QR code. + * @property {string} [mime="image/png"] - The MIME type to be used to render the image for the QR code. + * @property {number} [padding] - The padding for the QR code in pixels. + * @property {number} [size=100] - The size of the QR code in pixels. + * @property {string} [value=""] - The value to be encoded within the QR code. + */ + + var index = QRious_1$2; + + /** + * Defines a service contract that must be met by all implementations. + * + * @public + * @class + * @extends Nevis + */ + var Service = lite.extend({ + + /** + * Returns the name of this {@link Service}. + * + * @return {string} The service name. + * @public + * @abstract + * @memberof Service# + */ + getName: function() {} + + }); + + var Service_1 = Service; + + /** + * A service for working with elements. + * + * @public + * @class + * @extends Service + */ + var ElementService = Service_1.extend({ + + /** + * Creates an instance of a canvas element. + * + * Implementations of {@link ElementService} must override this method with their own specific logic. + * + * @return {*} The newly created canvas element. + * @public + * @abstract + * @memberof ElementService# + */ + createCanvas: function() {}, + + /** + * Creates an instance of a image element. + * + * Implementations of {@link ElementService} must override this method with their own specific logic. + * + * @return {*} The newly created image element. + * @public + * @abstract + * @memberof ElementService# + */ + createImage: function() {}, + + /** + * @override + */ + getName: function() { + return 'element'; + }, + + /** + * Returns whether the specified element is a canvas. + * + * Implementations of {@link ElementService} must override this method with their own specific logic. + * + * @param {*} element - the element to be checked + * @return {boolean} true if element is a canvas; otherwise false. + * @public + * @abstract + * @memberof ElementService# + */ + isCanvas: function(element) {}, + + /** + * Returns whether the specified element is an image. + * + * Implementations of {@link ElementService} must override this method with their own specific logic. + * + * @param {*} element - the element to be checked + * @return {boolean} true if element is an image; otherwise false. + * @public + * @abstract + * @memberof ElementService# + */ + isImage: function(element) {} + + }); + + var ElementService_1 = ElementService; + + /** + * An implementation of {@link ElementService} intended for use within a browser environment. + * + * @public + * @class + * @extends ElementService + */ + var BrowserElementService = ElementService_1.extend({ + + /** + * @override + */ + createCanvas: function() { + return document.createElement('canvas'); + }, + + /** + * @override + */ + createImage: function() { + return document.createElement('img'); + }, + + /** + * @override + */ + isCanvas: function(element) { + return element instanceof HTMLCanvasElement; + }, + + /** + * @override + */ + isImage: function(element) { + return element instanceof HTMLImageElement; + } + + }); + + var BrowserElementService_1 = BrowserElementService; + + index.use(new BrowserElementService_1()); + + var QRious_1 = index; + + return QRious_1; + +}))); + +//# sourceMappingURL=qrious.js.map diff --git a/imports/util/qrious.js.map b/imports/util/qrious.js.map new file mode 100644 index 0000000..c1aaf2c --- /dev/null +++ b/imports/util/qrious.js.map @@ -0,0 +1 @@ +{"version":3,"file":"qrious.js","sources":["../node_modules/nevis/src/extend.js","../node_modules/nevis/src/nevis.js","../node_modules/nevis/lite.js","../node_modules/qrious-core/src/renderer/Renderer.js","../node_modules/qrious-core/src/renderer/CanvasRenderer.js","../node_modules/qrious-core/src/Alignment.js","../node_modules/qrious-core/src/ErrorCorrection.js","../node_modules/qrious-core/src/Galois.js","../node_modules/qrious-core/src/Version.js","../node_modules/qrious-core/src/Frame.js","../node_modules/qrious-core/src/renderer/ImageRenderer.js","../node_modules/qrious-core/src/option/Option.js","../node_modules/qrious-core/src/util/Utilities.js","../node_modules/qrious-core/src/option/OptionManager.js","../node_modules/qrious-core/src/service/ServiceManager.js","../node_modules/qrious-core/src/QRious.js","../node_modules/qrious-core/index.js","../node_modules/qrious-core/src/service/Service.js","../node_modules/qrious-core/src/service/element/ElementService.js","../src/service/element/BrowserElementService.js","../src/QRious.js"],"sourcesContent":["/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\n/**\n * A bare-bones constructor for surrogate prototype swapping.\n *\n * @private\n * @constructor\n */\nvar Constructor = /* istanbul ignore next */ function() {};\n/**\n * A reference to Object.prototype.hasOwnProperty.\n *\n * @private\n * @type {Function}\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * A reference to Array.prototype.slice.\n *\n * @private\n * @type {Function}\n */\nvar slice = Array.prototype.slice;\n\n/**\n * Creates an object which inherits the given prototype.\n *\n * Optionally, the created object can be extended further with the specified properties.\n *\n * @param {Object} prototype - the prototype to be inherited by the created object\n * @param {Object} [properties] - the optional properties to be extended by the created object\n * @return {Object} The newly created object.\n * @private\n */\nfunction createObject(prototype, properties) {\n var result;\n /* istanbul ignore next */\n if (typeof Object.create === 'function') {\n result = Object.create(prototype);\n } else {\n Constructor.prototype = prototype;\n result = new Constructor();\n Constructor.prototype = null;\n }\n\n if (properties) {\n extendObject(true, result, properties);\n }\n\n return result;\n}\n\n/**\n * Extends the constructor to which this method is associated with the prototype and/or\n * statics provided.\n *\n * If name is provided, it will be used as the class name and can be accessed via a special\n * class_ property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * toString), but this is not applicable to the lite version of Nevis.\n *\n * If constructor is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special super_ property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child constructor provided or the one created if none was given.\n * @public\n */\nfunction extend(name, constructor, prototype, statics) {\n var superConstructor = this;\n\n if (typeof name !== 'string') {\n statics = prototype;\n prototype = constructor;\n constructor = name;\n name = null;\n }\n\n if (typeof constructor !== 'function') {\n statics = prototype;\n prototype = constructor;\n constructor = function() {\n return superConstructor.apply(this, arguments);\n };\n }\n\n extendObject(false, constructor, superConstructor, statics);\n\n constructor.prototype = createObject(superConstructor.prototype, prototype);\n constructor.prototype.constructor = constructor;\n\n constructor.class_ = name || superConstructor.class_;\n constructor.super_ = superConstructor;\n\n return constructor;\n}\n\n/**\n * Extends the specified target object with the properties in each of the sources provided.\n *\n * if any source is null it will be ignored.\n *\n * @param {boolean} own - true to only copy own properties from sources onto\n * target; otherwise false\n * @param {Object} target - the target object which should be extended\n * @param {...Object} [sources] - the source objects whose properties are to be copied onto target\n * @return {void}\n * @private\n */\nfunction extendObject(own, target, sources) {\n sources = slice.call(arguments, 2);\n\n var property;\n var source;\n\n for (var i = 0, length = sources.length; i < length; i++) {\n source = sources[i];\n\n for (property in source) {\n if (!own || hasOwnProperty.call(source, property)) {\n target[property] = source[property];\n }\n }\n }\n}\n\nmodule.exports = extend;\n","/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\nvar extend = require('./extend');\n\n/**\n * The base class from which all others should extend.\n *\n * @public\n * @constructor\n */\nfunction Nevis() {}\nNevis.class_ = 'Nevis';\nNevis.super_ = Object;\n\n/**\n * Extends the constructor to which this method is associated with the prototype and/or\n * statics provided.\n *\n * If name is provided, it will be used as the class name and can be accessed via a special\n * class_ property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * toString), but this is not applicable to the lite version of Nevis.\n *\n * If constructor is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special super_ property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child constructor provided or the one created if none was given.\n * @public\n * @static\n * @memberof Nevis\n */\nNevis.extend = extend;\n\nmodule.exports = Nevis;\n","/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\nmodule.exports = require('./src/nevis');\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Responsible for rendering a QR code {@link Frame} on a specific type of element.\n *\n * A renderer may be dependant on the rendering of another element, so the ordering of their execution is important.\n *\n * The rendering of a element can be deferred by disabling the renderer initially, however, any attempt get the element\n * from the renderer will result in it being immediately enabled and the element being rendered.\n *\n * @param {QRious} qrious - the {@link QRious} instance to be used\n * @param {*} element - the element onto which the QR code is to be rendered\n * @param {boolean} [enabled] - true this {@link Renderer} is enabled; otherwise false.\n * @public\n * @class\n * @extends Nevis\n */\nvar Renderer = Nevis.extend(function(qrious, element, enabled) {\n /**\n * The {@link QRious} instance.\n *\n * @protected\n * @type {QRious}\n * @memberof Renderer#\n */\n this.qrious = qrious;\n\n /**\n * The element onto which this {@link Renderer} is rendering the QR code.\n *\n * @protected\n * @type {*}\n * @memberof Renderer#\n */\n this.element = element;\n this.element.qrious = qrious;\n\n /**\n * Whether this {@link Renderer} is enabled.\n *\n * @protected\n * @type {boolean}\n * @memberof Renderer#\n */\n this.enabled = Boolean(enabled);\n}, {\n\n /**\n * Draws the specified QR code frame on the underlying element.\n *\n * Implementations of {@link Renderer} must override this method with their own specific logic.\n *\n * @param {Frame} frame - the {@link Frame} to be drawn\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n draw: function(frame) {},\n\n /**\n * Returns the element onto which this {@link Renderer} is rendering the QR code.\n *\n * If this method is called while this {@link Renderer} is disabled, it will be immediately enabled and rendered\n * before the element is returned.\n *\n * @return {*} The element.\n * @public\n * @memberof Renderer#\n */\n getElement: function() {\n if (!this.enabled) {\n this.enabled = true;\n this.render();\n }\n\n return this.element;\n },\n\n /**\n * Calculates the size (in pixel units) to represent an individual module within the QR code based on the\n * frame provided.\n *\n * Any configured padding will be excluded from the returned size.\n *\n * The returned value will be at least one, even in cases where the size of the QR code does not fit its contents.\n * This is done so that the inevitable clipping is handled more gracefully since this way at least something is\n * displayed instead of just a blank space filled by the background color.\n *\n * @param {Frame} frame - the {@link Frame} from which the module size is to be derived\n * @return {number} The pixel size for each module in the QR code which will be no less than one.\n * @protected\n * @memberof Renderer#\n */\n getModuleSize: function(frame) {\n var qrious = this.qrious;\n var padding = qrious.padding || 0;\n var pixels = Math.floor((qrious.size - (padding * 2)) / frame.width);\n\n return Math.max(1, pixels);\n },\n\n /**\n * Calculates the offset/padding (in pixel units) to be inserted before the QR code based on the frame\n * provided.\n *\n * The returned value will be zero if there is no available offset or if the size of the QR code does not fit its\n * contents. It will never be a negative value. This is done so that the inevitable clipping appears more naturally\n * and it is not clipped from all directions.\n *\n * @param {Frame} frame - the {@link Frame} from which the offset is to be derived\n * @return {number} The pixel offset for the QR code which will be no less than zero.\n * @protected\n * @memberof Renderer#\n */\n getOffset: function(frame) {\n var qrious = this.qrious;\n var padding = qrious.padding;\n\n if (padding != null) {\n return padding;\n }\n\n var moduleSize = this.getModuleSize(frame);\n var offset = Math.floor((qrious.size - (moduleSize * frame.width)) / 2);\n\n return Math.max(0, offset);\n },\n\n /**\n * Renders a QR code on the underlying element based on the frame provided.\n *\n * @param {Frame} frame - the {@link Frame} to be rendered\n * @return {void}\n * @public\n * @memberof Renderer#\n */\n render: function(frame) {\n if (this.enabled) {\n this.resize();\n this.reset();\n this.draw(frame);\n }\n },\n\n /**\n * Resets the underlying element, effectively clearing any previously rendered QR code.\n *\n * Implementations of {@link Renderer} must override this method with their own specific logic.\n *\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n reset: function() {},\n\n /**\n * Ensures that the size of the underlying element matches that defined on the associated {@link QRious} instance.\n *\n * Implementations of {@link Renderer} must override this method with their own specific logic.\n *\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n resize: function() {}\n\n});\n\nmodule.exports = Renderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Renderer = require('./Renderer');\n\n/**\n * An implementation of {@link Renderer} for working with canvas elements.\n *\n * @public\n * @class\n * @extends Renderer\n */\nvar CanvasRenderer = Renderer.extend({\n\n /**\n * @override\n */\n draw: function(frame) {\n var i, j;\n var qrious = this.qrious;\n var moduleSize = this.getModuleSize(frame);\n var offset = this.getOffset(frame);\n var context = this.element.getContext('2d');\n\n context.fillStyle = qrious.foreground;\n context.globalAlpha = qrious.foregroundAlpha;\n\n for (i = 0; i < frame.width; i++) {\n for (j = 0; j < frame.width; j++) {\n if (frame.buffer[(j * frame.width) + i]) {\n context.fillRect((moduleSize * i) + offset, (moduleSize * j) + offset, moduleSize, moduleSize);\n }\n }\n }\n },\n\n /**\n * @override\n */\n reset: function() {\n var qrious = this.qrious;\n var context = this.element.getContext('2d');\n var size = qrious.size;\n\n context.lineWidth = 1;\n context.clearRect(0, 0, size, size);\n context.fillStyle = qrious.background;\n context.globalAlpha = qrious.backgroundAlpha;\n context.fillRect(0, 0, size, size);\n },\n\n /**\n * @override\n */\n resize: function() {\n var element = this.element;\n\n element.width = element.height = this.qrious.size;\n }\n\n});\n\nmodule.exports = CanvasRenderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\n/* eslint no-multi-spaces: \"off\" */\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains alignment pattern information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Alignment = Nevis.extend(null, {\n\n /**\n * The alignment pattern block.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Alignment\n */\n BLOCK: [\n 0, 11, 15, 19, 23, 27, 31,\n 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,\n 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28\n ]\n\n});\n\nmodule.exports = Alignment;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\n/* eslint no-multi-spaces: \"off\" */\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains error correction information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar ErrorCorrection = Nevis.extend(null, {\n\n /**\n * The error correction blocks.\n *\n * There are four elements per version. The first two indicate the number of blocks, then the data width, and finally\n * the ECC width.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof ErrorCorrection\n */\n BLOCKS: [\n 1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,\n 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,\n 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,\n 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,\n 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,\n 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,\n 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,\n 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,\n 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,\n 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,\n 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,\n 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,\n 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,\n 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,\n 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,\n 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,\n 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,\n 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,\n 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,\n 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,\n 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,\n 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,\n 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,\n 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,\n 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,\n 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,\n 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,\n 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,\n 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,\n 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,\n 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,\n 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,\n 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,\n 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,\n 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,\n 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,\n 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,\n 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,\n 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,\n 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30\n ],\n\n /**\n * The final format bits with mask (level << 3 | mask).\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof ErrorCorrection\n */\n FINAL_FORMAT: [\n // L\n 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,\n // M\n 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,\n // Q\n 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,\n // H\n 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b\n ],\n\n /**\n * A map of human-readable ECC levels.\n *\n * @public\n * @static\n * @type {Object.}\n * @memberof ErrorCorrection\n */\n LEVELS: {\n L: 1,\n M: 2,\n Q: 3,\n H: 4\n }\n\n});\n\nmodule.exports = ErrorCorrection;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains Galois field information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Galois = Nevis.extend(null, {\n\n /**\n * The Galois field exponent table.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Galois\n */\n EXPONENT: [\n 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,\n 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,\n 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,\n 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,\n 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,\n 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,\n 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,\n 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,\n 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,\n 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,\n 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,\n 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,\n 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,\n 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,\n 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,\n 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00\n ],\n\n /**\n * The Galois field log table.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Galois\n */\n LOG: [\n 0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,\n 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,\n 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,\n 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,\n 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,\n 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,\n 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,\n 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,\n 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,\n 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,\n 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,\n 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,\n 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,\n 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,\n 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,\n 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf\n ]\n\n});\n\nmodule.exports = Galois;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains version pattern information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Version = Nevis.extend(null, {\n\n /**\n * The version pattern block.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Version\n */\n BLOCK: [\n 0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d, 0x928, 0xb78, 0x45d, 0xa17, 0x532,\n 0x9a6, 0x683, 0x8c9, 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75, 0x250, 0x9d5,\n 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64, 0x541, 0xc69\n ]\n\n});\n\nmodule.exports = Version;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar Alignment = require('./Alignment');\nvar ErrorCorrection = require('./ErrorCorrection');\nvar Galois = require('./Galois');\nvar Version = require('./Version');\n\n/**\n * Generates information for a QR code frame based on a specific value to be encoded.\n *\n * @param {Frame~Options} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar Frame = Nevis.extend(function(options) {\n var dataBlock, eccBlock, index, neccBlock1, neccBlock2;\n var valueLength = options.value.length;\n\n this._badness = [];\n this._level = ErrorCorrection.LEVELS[options.level];\n this._polynomial = [];\n this._value = options.value;\n this._version = 0;\n this._stringBuffer = [];\n\n while (this._version < 40) {\n this._version++;\n\n index = ((this._level - 1) * 4) + ((this._version - 1) * 16);\n\n neccBlock1 = ErrorCorrection.BLOCKS[index++];\n neccBlock2 = ErrorCorrection.BLOCKS[index++];\n dataBlock = ErrorCorrection.BLOCKS[index++];\n eccBlock = ErrorCorrection.BLOCKS[index];\n\n index = (dataBlock * (neccBlock1 + neccBlock2)) + neccBlock2 - 3 + (this._version <= 9);\n\n if (valueLength <= index) {\n break;\n }\n }\n\n this._dataBlock = dataBlock;\n this._eccBlock = eccBlock;\n this._neccBlock1 = neccBlock1;\n this._neccBlock2 = neccBlock2;\n\n /**\n * The data width is based on version.\n *\n * @public\n * @type {number}\n * @memberof Frame#\n */\n // FIXME: Ensure that it fits instead of being truncated.\n var width = this.width = 17 + (4 * this._version);\n\n /**\n * The image buffer.\n *\n * @public\n * @type {number[]}\n * @memberof Frame#\n */\n this.buffer = Frame._createArray(width * width);\n\n this._ecc = Frame._createArray(dataBlock + ((dataBlock + eccBlock) * (neccBlock1 + neccBlock2)) + neccBlock2);\n this._mask = Frame._createArray(((width * (width + 1)) + 1) / 2);\n\n this._insertFinders();\n this._insertAlignments();\n\n // Insert single foreground cell.\n this.buffer[8 + (width * (width - 8))] = 1;\n\n this._insertTimingGap();\n this._reverseMask();\n this._insertTimingRowAndColumn();\n this._insertVersion();\n this._syncMask();\n this._convertBitStream(valueLength);\n this._calculatePolynomial();\n this._appendEccToData();\n this._interleaveBlocks();\n this._pack();\n this._finish();\n}, {\n\n _addAlignment: function(x, y) {\n var i;\n var buffer = this.buffer;\n var width = this.width;\n\n buffer[x + (width * y)] = 1;\n\n for (i = -2; i < 2; i++) {\n buffer[x + i + (width * (y - 2))] = 1;\n buffer[x - 2 + (width * (y + i + 1))] = 1;\n buffer[x + 2 + (width * (y + i))] = 1;\n buffer[x + i + 1 + (width * (y + 2))] = 1;\n }\n\n for (i = 0; i < 2; i++) {\n this._setMask(x - 1, y + i);\n this._setMask(x + 1, y - i);\n this._setMask(x - i, y - 1);\n this._setMask(x + i, y + 1);\n }\n },\n\n _appendData: function(data, dataLength, ecc, eccLength) {\n var bit, i, j;\n var polynomial = this._polynomial;\n var stringBuffer = this._stringBuffer;\n\n for (i = 0; i < eccLength; i++) {\n stringBuffer[ecc + i] = 0;\n }\n\n for (i = 0; i < dataLength; i++) {\n bit = Galois.LOG[stringBuffer[data + i] ^ stringBuffer[ecc]];\n\n if (bit !== 255) {\n for (j = 1; j < eccLength; j++) {\n stringBuffer[ecc + j - 1] = stringBuffer[ecc + j] ^\n Galois.EXPONENT[Frame._modN(bit + polynomial[eccLength - j])];\n }\n } else {\n for (j = ecc; j < ecc + eccLength; j++) {\n stringBuffer[j] = stringBuffer[j + 1];\n }\n }\n\n stringBuffer[ecc + eccLength - 1] = bit === 255 ? 0 : Galois.EXPONENT[Frame._modN(bit + polynomial[0])];\n }\n },\n\n _appendEccToData: function() {\n var i;\n var data = 0;\n var dataBlock = this._dataBlock;\n var ecc = this._calculateMaxLength();\n var eccBlock = this._eccBlock;\n\n for (i = 0; i < this._neccBlock1; i++) {\n this._appendData(data, dataBlock, ecc, eccBlock);\n\n data += dataBlock;\n ecc += eccBlock;\n }\n\n for (i = 0; i < this._neccBlock2; i++) {\n this._appendData(data, dataBlock + 1, ecc, eccBlock);\n\n data += dataBlock + 1;\n ecc += eccBlock;\n }\n },\n\n _applyMask: function(mask) {\n var r3x, r3y, x, y;\n var buffer = this.buffer;\n var width = this.width;\n\n switch (mask) {\n case 0:\n for (y = 0; y < width; y++) {\n for (x = 0; x < width; x++) {\n if (!((x + y) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 1:\n for (y = 0; y < width; y++) {\n for (x = 0; x < width; x++) {\n if (!(y & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 2:\n for (y = 0; y < width; y++) {\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!r3x && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 3:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = r3y, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!r3x && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 4:\n for (y = 0; y < width; y++) {\n for (r3x = 0, r3y = (y >> 1) & 1, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n r3y = !r3y;\n }\n\n if (!r3y && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 5:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((x & y & 1) + !(!r3x | !r3y)) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 6:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((x & y & 1) + (r3x && r3x === r3y) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 7:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((r3x && r3x === r3y) + (x + y & 1) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n }\n },\n\n _calculateMaxLength: function() {\n return (this._dataBlock * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n },\n\n _calculatePolynomial: function() {\n var i, j;\n var eccBlock = this._eccBlock;\n var polynomial = this._polynomial;\n\n polynomial[0] = 1;\n\n for (i = 0; i < eccBlock; i++) {\n polynomial[i + 1] = 1;\n\n for (j = i; j > 0; j--) {\n polynomial[j] = polynomial[j] ? polynomial[j - 1] ^\n Galois.EXPONENT[Frame._modN(Galois.LOG[polynomial[j]] + i)] : polynomial[j - 1];\n }\n\n polynomial[0] = Galois.EXPONENT[Frame._modN(Galois.LOG[polynomial[0]] + i)];\n }\n\n // Use logs for generator polynomial to save calculation step.\n for (i = 0; i <= eccBlock; i++) {\n polynomial[i] = Galois.LOG[polynomial[i]];\n }\n },\n\n _checkBadness: function() {\n var b, b1, h, x, y;\n var bad = 0;\n var badness = this._badness;\n var buffer = this.buffer;\n var width = this.width;\n\n // Blocks of same colour.\n for (y = 0; y < width - 1; y++) {\n for (x = 0; x < width - 1; x++) {\n // All foreground colour.\n if ((buffer[x + (width * y)] &&\n buffer[x + 1 + (width * y)] &&\n buffer[x + (width * (y + 1))] &&\n buffer[x + 1 + (width * (y + 1))]) ||\n // All background colour.\n !(buffer[x + (width * y)] ||\n buffer[x + 1 + (width * y)] ||\n buffer[x + (width * (y + 1))] ||\n buffer[x + 1 + (width * (y + 1))])) {\n bad += Frame.N2;\n }\n }\n }\n\n var bw = 0;\n\n // X runs.\n for (y = 0; y < width; y++) {\n h = 0;\n\n badness[0] = 0;\n\n for (b = 0, x = 0; x < width; x++) {\n b1 = buffer[x + (width * y)];\n\n if (b === b1) {\n badness[h]++;\n } else {\n badness[++h] = 1;\n }\n\n b = b1;\n bw += b ? 1 : -1;\n }\n\n bad += this._getBadness(h);\n }\n\n if (bw < 0) {\n bw = -bw;\n }\n\n var count = 0;\n var big = bw;\n big += big << 2;\n big <<= 1;\n\n while (big > width * width) {\n big -= width * width;\n count++;\n }\n\n bad += count * Frame.N4;\n\n // Y runs.\n for (x = 0; x < width; x++) {\n h = 0;\n\n badness[0] = 0;\n\n for (b = 0, y = 0; y < width; y++) {\n b1 = buffer[x + (width * y)];\n\n if (b === b1) {\n badness[h]++;\n } else {\n badness[++h] = 1;\n }\n\n b = b1;\n }\n\n bad += this._getBadness(h);\n }\n\n return bad;\n },\n\n _convertBitStream: function(length) {\n var bit, i;\n var ecc = this._ecc;\n var version = this._version;\n\n // Convert string to bit stream. 8-bit data to QR-coded 8-bit data (numeric, alphanumeric, or kanji not supported).\n for (i = 0; i < length; i++) {\n ecc[i] = this._value.charCodeAt(i);\n }\n\n var stringBuffer = this._stringBuffer = ecc.slice();\n var maxLength = this._calculateMaxLength();\n\n if (length >= maxLength - 2) {\n length = maxLength - 2;\n\n if (version > 9) {\n length--;\n }\n }\n\n // Shift and re-pack to insert length prefix.\n var index = length;\n\n if (version > 9) {\n stringBuffer[index + 2] = 0;\n stringBuffer[index + 3] = 0;\n\n while (index--) {\n bit = stringBuffer[index];\n\n stringBuffer[index + 3] |= 255 & (bit << 4);\n stringBuffer[index + 2] = bit >> 4;\n }\n\n stringBuffer[2] |= 255 & (length << 4);\n stringBuffer[1] = length >> 4;\n stringBuffer[0] = 0x40 | (length >> 12);\n } else {\n stringBuffer[index + 1] = 0;\n stringBuffer[index + 2] = 0;\n\n while (index--) {\n bit = stringBuffer[index];\n\n stringBuffer[index + 2] |= 255 & (bit << 4);\n stringBuffer[index + 1] = bit >> 4;\n }\n\n stringBuffer[1] |= 255 & (length << 4);\n stringBuffer[0] = 0x40 | (length >> 4);\n }\n\n // Fill to end with pad pattern.\n index = length + 3 - (version < 10);\n\n while (index < maxLength) {\n stringBuffer[index++] = 0xec;\n stringBuffer[index++] = 0x11;\n }\n },\n\n _getBadness: function(length) {\n var i;\n var badRuns = 0;\n var badness = this._badness;\n\n for (i = 0; i <= length; i++) {\n if (badness[i] >= 5) {\n badRuns += Frame.N1 + badness[i] - 5;\n }\n }\n\n // FBFFFBF as in finder.\n for (i = 3; i < length - 1; i += 2) {\n if (badness[i - 2] === badness[i + 2] &&\n badness[i + 2] === badness[i - 1] &&\n badness[i - 1] === badness[i + 1] &&\n badness[i - 1] * 3 === badness[i] &&\n // Background around the foreground pattern? Not part of the specs.\n (badness[i - 3] === 0 || i + 3 > length ||\n badness[i - 3] * 3 >= badness[i] * 4 ||\n badness[i + 3] * 3 >= badness[i] * 4)) {\n badRuns += Frame.N3;\n }\n }\n\n return badRuns;\n },\n\n _finish: function() {\n // Save pre-mask copy of frame.\n this._stringBuffer = this.buffer.slice();\n\n var currentMask, i;\n var bit = 0;\n var mask = 30000;\n\n /*\n * Using for instead of while since in original Arduino code if an early mask was \"good enough\" it wouldn't try for\n * a better one since they get more complex and take longer.\n */\n for (i = 0; i < 8; i++) {\n // Returns foreground-background imbalance.\n this._applyMask(i);\n\n currentMask = this._checkBadness();\n\n // Is current mask better than previous best?\n if (currentMask < mask) {\n mask = currentMask;\n bit = i;\n }\n\n // Don't increment \"i\" to a void redoing mask.\n if (bit === 7) {\n break;\n }\n\n // Reset for next pass.\n this.buffer = this._stringBuffer.slice();\n }\n\n // Redo best mask as none were \"good enough\" (i.e. last wasn't bit).\n if (bit !== i) {\n this._applyMask(bit);\n }\n\n // Add in final mask/ECC level bytes.\n mask = ErrorCorrection.FINAL_FORMAT[bit + (this._level - 1 << 3)];\n\n var buffer = this.buffer;\n var width = this.width;\n\n // Low byte.\n for (i = 0; i < 8; i++, mask >>= 1) {\n if (mask & 1) {\n buffer[width - 1 - i + (width * 8)] = 1;\n\n if (i < 6) {\n buffer[8 + (width * i)] = 1;\n } else {\n buffer[8 + (width * (i + 1))] = 1;\n }\n }\n }\n\n // High byte.\n for (i = 0; i < 7; i++, mask >>= 1) {\n if (mask & 1) {\n buffer[8 + (width * (width - 7 + i))] = 1;\n\n if (i) {\n buffer[6 - i + (width * 8)] = 1;\n } else {\n buffer[7 + (width * 8)] = 1;\n }\n }\n }\n },\n\n _interleaveBlocks: function() {\n var i, j;\n var dataBlock = this._dataBlock;\n var ecc = this._ecc;\n var eccBlock = this._eccBlock;\n var k = 0;\n var maxLength = this._calculateMaxLength();\n var neccBlock1 = this._neccBlock1;\n var neccBlock2 = this._neccBlock2;\n var stringBuffer = this._stringBuffer;\n\n for (i = 0; i < dataBlock; i++) {\n for (j = 0; j < neccBlock1; j++) {\n ecc[k++] = stringBuffer[i + (j * dataBlock)];\n }\n\n for (j = 0; j < neccBlock2; j++) {\n ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n }\n }\n\n for (j = 0; j < neccBlock2; j++) {\n ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n }\n\n for (i = 0; i < eccBlock; i++) {\n for (j = 0; j < neccBlock1 + neccBlock2; j++) {\n ecc[k++] = stringBuffer[maxLength + i + (j * eccBlock)];\n }\n }\n\n this._stringBuffer = ecc;\n },\n\n _insertAlignments: function() {\n var i, x, y;\n var version = this._version;\n var width = this.width;\n\n if (version > 1) {\n i = Alignment.BLOCK[version];\n y = width - 7;\n\n for (;;) {\n x = width - 7;\n\n while (x > i - 3) {\n this._addAlignment(x, y);\n\n if (x < i) {\n break;\n }\n\n x -= i;\n }\n\n if (y <= i + 9) {\n break;\n }\n\n y -= i;\n\n this._addAlignment(6, y);\n this._addAlignment(y, 6);\n }\n }\n },\n\n _insertFinders: function() {\n var i, j, x, y;\n var buffer = this.buffer;\n var width = this.width;\n\n for (i = 0; i < 3; i++) {\n j = 0;\n y = 0;\n\n if (i === 1) {\n j = width - 7;\n }\n if (i === 2) {\n y = width - 7;\n }\n\n buffer[y + 3 + (width * (j + 3))] = 1;\n\n for (x = 0; x < 6; x++) {\n buffer[y + x + (width * j)] = 1;\n buffer[y + (width * (j + x + 1))] = 1;\n buffer[y + 6 + (width * (j + x))] = 1;\n buffer[y + x + 1 + (width * (j + 6))] = 1;\n }\n\n for (x = 1; x < 5; x++) {\n this._setMask(y + x, j + 1);\n this._setMask(y + 1, j + x + 1);\n this._setMask(y + 5, j + x);\n this._setMask(y + x + 1, j + 5);\n }\n\n for (x = 2; x < 4; x++) {\n buffer[y + x + (width * (j + 2))] = 1;\n buffer[y + 2 + (width * (j + x + 1))] = 1;\n buffer[y + 4 + (width * (j + x))] = 1;\n buffer[y + x + 1 + (width * (j + 4))] = 1;\n }\n }\n },\n\n _insertTimingGap: function() {\n var x, y;\n var width = this.width;\n\n for (y = 0; y < 7; y++) {\n this._setMask(7, y);\n this._setMask(width - 8, y);\n this._setMask(7, y + width - 7);\n }\n\n for (x = 0; x < 8; x++) {\n this._setMask(x, 7);\n this._setMask(x + width - 8, 7);\n this._setMask(x, width - 8);\n }\n },\n\n _insertTimingRowAndColumn: function() {\n var x;\n var buffer = this.buffer;\n var width = this.width;\n\n for (x = 0; x < width - 14; x++) {\n if (x & 1) {\n this._setMask(8 + x, 6);\n this._setMask(6, 8 + x);\n } else {\n buffer[8 + x + (width * 6)] = 1;\n buffer[6 + (width * (8 + x))] = 1;\n }\n }\n },\n\n _insertVersion: function() {\n var i, j, x, y;\n var buffer = this.buffer;\n var version = this._version;\n var width = this.width;\n\n if (version > 6) {\n i = Version.BLOCK[version - 7];\n j = 17;\n\n for (x = 0; x < 6; x++) {\n for (y = 0; y < 3; y++, j--) {\n if (1 & (j > 11 ? version >> j - 12 : i >> j)) {\n buffer[5 - x + (width * (2 - y + width - 11))] = 1;\n buffer[2 - y + width - 11 + (width * (5 - x))] = 1;\n } else {\n this._setMask(5 - x, 2 - y + width - 11);\n this._setMask(2 - y + width - 11, 5 - x);\n }\n }\n }\n }\n },\n\n _isMasked: function(x, y) {\n var bit = Frame._getMaskBit(x, y);\n\n return this._mask[bit] === 1;\n },\n\n _pack: function() {\n var bit, i, j;\n var k = 1;\n var v = 1;\n var width = this.width;\n var x = width - 1;\n var y = width - 1;\n\n // Interleaved data and ECC codes.\n var length = ((this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n\n for (i = 0; i < length; i++) {\n bit = this._stringBuffer[i];\n\n for (j = 0; j < 8; j++, bit <<= 1) {\n if (0x80 & bit) {\n this.buffer[x + (width * y)] = 1;\n }\n\n // Find next fill position.\n do {\n if (v) {\n x--;\n } else {\n x++;\n\n if (k) {\n if (y !== 0) {\n y--;\n } else {\n x -= 2;\n k = !k;\n\n if (x === 6) {\n x--;\n y = 9;\n }\n }\n } else if (y !== width - 1) {\n y++;\n } else {\n x -= 2;\n k = !k;\n\n if (x === 6) {\n x--;\n y -= 8;\n }\n }\n }\n\n v = !v;\n } while (this._isMasked(x, y));\n }\n }\n },\n\n _reverseMask: function() {\n var x, y;\n var width = this.width;\n\n for (x = 0; x < 9; x++) {\n this._setMask(x, 8);\n }\n\n for (x = 0; x < 8; x++) {\n this._setMask(x + width - 8, 8);\n this._setMask(8, x);\n }\n\n for (y = 0; y < 7; y++) {\n this._setMask(8, y + width - 7);\n }\n },\n\n _setMask: function(x, y) {\n var bit = Frame._getMaskBit(x, y);\n\n this._mask[bit] = 1;\n },\n\n _syncMask: function() {\n var x, y;\n var width = this.width;\n\n for (y = 0; y < width; y++) {\n for (x = 0; x <= y; x++) {\n if (this.buffer[x + (width * y)]) {\n this._setMask(x, y);\n }\n }\n }\n }\n\n}, {\n\n _createArray: function(length) {\n var i;\n var array = [];\n\n for (i = 0; i < length; i++) {\n array[i] = 0;\n }\n\n return array;\n },\n\n _getMaskBit: function(x, y) {\n var bit;\n\n if (x > y) {\n bit = x;\n x = y;\n y = bit;\n }\n\n bit = y;\n bit += y * y;\n bit >>= 1;\n bit += x;\n\n return bit;\n },\n\n _modN: function(x) {\n while (x >= 255) {\n x -= 255;\n x = (x >> 8) + (x & 255);\n }\n\n return x;\n },\n\n // *Badness* coefficients.\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n\n});\n\nmodule.exports = Frame;\n\n/**\n * The options used by {@link Frame}.\n *\n * @typedef {Object} Frame~Options\n * @property {string} level - The ECC level to be used.\n * @property {string} value - The value to be encoded.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Renderer = require('./Renderer');\n\n/**\n * An implementation of {@link Renderer} for working with img elements.\n *\n * This depends on {@link CanvasRenderer} being executed first as this implementation simply applies the data URL from\n * the rendered canvas element as the src for the img element being rendered.\n *\n * @public\n * @class\n * @extends Renderer\n */\nvar ImageRenderer = Renderer.extend({\n\n /**\n * @override\n */\n draw: function() {\n this.element.src = this.qrious.toDataURL();\n },\n\n /**\n * @override\n */\n reset: function() {\n this.element.src = '';\n },\n\n /**\n * @override\n */\n resize: function() {\n var element = this.element;\n\n element.width = element.height = this.qrious.size;\n }\n\n});\n\nmodule.exports = ImageRenderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Defines an available option while also configuring how values are applied to the target object.\n *\n * Optionally, a default value can be specified as well a value transformer for greater control over how the option\n * value is applied.\n *\n * If no value transformer is specified, then any specified option will be applied directly. All values are maintained\n * on the target object itself as a field using the option name prefixed with a single underscore.\n *\n * When an option is specified as modifiable, the {@link OptionManager} will be required to include a setter for the\n * property that is defined on the target object that uses the option name.\n *\n * @param {string} name - the name to be used\n * @param {boolean} [modifiable] - true if the property defined on target objects should include a setter;\n * otherwise false\n * @param {*} [defaultValue] - the default value to be used\n * @param {Option~ValueTransformer} [valueTransformer] - the value transformer to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar Option = Nevis.extend(function(name, modifiable, defaultValue, valueTransformer) {\n /**\n * The name for this {@link Option}.\n *\n * @public\n * @type {string}\n * @memberof Option#\n */\n this.name = name;\n\n /**\n * Whether a setter should be included on the property defined on target objects for this {@link Option}.\n *\n * @public\n * @type {boolean}\n * @memberof Option#\n */\n this.modifiable = Boolean(modifiable);\n\n /**\n * The default value for this {@link Option}.\n *\n * @public\n * @type {*}\n * @memberof Option#\n */\n this.defaultValue = defaultValue;\n\n this._valueTransformer = valueTransformer;\n}, {\n\n /**\n * Transforms the specified value so that it can be applied for this {@link Option}.\n *\n * If a value transformer has been specified for this {@link Option}, it will be called upon to transform\n * value. Otherwise, value will be returned directly.\n *\n * @param {*} value - the value to be transformed\n * @return {*} The transformed value or value if no value transformer is specified.\n * @public\n * @memberof Option#\n */\n transform: function(value) {\n var transformer = this._valueTransformer;\n if (typeof transformer === 'function') {\n return transformer(value, this);\n }\n\n return value;\n }\n\n});\n\nmodule.exports = Option;\n\n/**\n * Returns a transformed value for the specified value to be applied for the option provided.\n *\n * @callback Option~ValueTransformer\n * @param {*} value - the value to be transformed\n * @param {Option} option - the {@link Option} for which value is being transformed\n * @return {*} The transform value.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains utility methods that are useful throughout the library.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Utilities = Nevis.extend(null, {\n\n /**\n * Returns the absolute value of a given number.\n *\n * This method is simply a convenient shorthand for Math.abs while ensuring that nulls are returned as\n * null instead of zero.\n *\n * @param {number} value - the number whose absolute value is to be returned\n * @return {number} The absolute value of value or null if value is\n * null.\n * @public\n * @static\n * @memberof Utilities\n */\n abs: function(value) {\n return value != null ? Math.abs(value) : null;\n },\n\n /**\n * Returns whether the specified object has a property with the specified name as an own\n * (not inherited) property.\n *\n * @param {Object} object - the object on which the property is to be checked\n * @param {string} name - the name of the property to be checked\n * @return {boolean} true if object has an own property with name.\n * @public\n * @static\n * @memberof Utilities\n */\n hasOwn: function(object, name) {\n return Object.prototype.hasOwnProperty.call(object, name);\n },\n\n /**\n * A non-operation method that does absolutely nothing.\n *\n * @return {void}\n * @public\n * @static\n * @memberof Utilities\n */\n noop: function() {},\n\n /**\n * Transforms the specified string to upper case while remaining null-safe.\n *\n * @param {string} string - the string to be transformed to upper case\n * @return {string} string transformed to upper case if string is not null.\n * @public\n * @static\n * @memberof Utilities\n */\n toUpperCase: function(string) {\n return string != null ? string.toUpperCase() : null;\n }\n\n});\n\nmodule.exports = Utilities;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar Utilities = require('../util/Utilities');\n\n/**\n * Manages multiple {@link Option} instances that are intended to be used by multiple implementations.\n *\n * Although the option definitions are shared between targets, the values are maintained on the targets themselves.\n *\n * @param {Option[]} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar OptionManager = Nevis.extend(function(options) {\n /**\n * The available options for this {@link OptionManager}.\n *\n * @public\n * @type {Object.}\n * @memberof OptionManager#\n */\n this.options = {};\n\n options.forEach(function(option) {\n this.options[option.name] = option;\n }, this);\n}, {\n\n /**\n * Returns whether an option with the specified name is available.\n *\n * @param {string} name - the name of the {@link Option} whose existence is to be checked\n * @return {boolean} true if an {@link Option} exists with name; otherwise\n * false.\n * @public\n * @memberof OptionManager#\n */\n exists: function(name) {\n return this.options[name] != null;\n },\n\n /**\n * Returns the value of the option with the specified name on the target object provided.\n *\n * @param {string} name - the name of the {@link Option} whose value on target is to be returned\n * @param {Object} target - the object from which the value of the named {@link Option} is to be returned\n * @return {*} The value of the {@link Option} with name on target.\n * @public\n * @memberof OptionManager#\n */\n get: function(name, target) {\n return OptionManager._get(this.options[name], target);\n },\n\n /**\n * Returns a copy of all of the available options on the target object provided.\n *\n * @param {Object} target - the object from which the option name/value pairs are to be returned\n * @return {Object.} A hash containing the name/value pairs of all options on target.\n * @public\n * @memberof OptionManager#\n */\n getAll: function(target) {\n var name;\n var options = this.options;\n var result = {};\n\n for (name in options) {\n if (Utilities.hasOwn(options, name)) {\n result[name] = OptionManager._get(options[name], target);\n }\n }\n\n return result;\n },\n\n /**\n * Initializes the available options for the target object provided and then applies the initial values\n * within the speciifed options.\n *\n * This method will throw an error if any of the names within options does not match an available option.\n *\n * This involves setting the default values and defining properties for all of the available options on\n * target before finally calling {@link OptionMananger#setAll} with options and\n * target. Any options that are configured to be modifiable will have a setter included in their defined\n * property that will allow its corresponding value to be modified.\n *\n * If a change handler is specified, it will be called whenever the value changes on target for a\n * modifiable option, but only when done so via the defined property's setter.\n *\n * @param {Object.} options - the name/value pairs of the initial options to be set\n * @param {Object} target - the object on which the options are to be initialized\n * @param {Function} [changeHandler] - the function to be called whenever the value of an modifiable option changes on\n * target\n * @return {void}\n * @throws {Error} If options contains an invalid option name.\n * @public\n * @memberof OptionManager#\n */\n init: function(options, target, changeHandler) {\n if (typeof changeHandler !== 'function') {\n changeHandler = Utilities.noop;\n }\n\n var name, option;\n\n for (name in this.options) {\n if (Utilities.hasOwn(this.options, name)) {\n option = this.options[name];\n\n OptionManager._set(option, option.defaultValue, target);\n OptionManager._createAccessor(option, target, changeHandler);\n }\n }\n\n this._setAll(options, target, true);\n },\n\n /**\n * Sets the value of the option with the specified name on the target object provided to\n * value.\n *\n * This method will throw an error if name does not match an available option or matches an option that\n * cannot be modified.\n *\n * If value is null and the {@link Option} has a default value configured, then that default\n * value will be used instead. If the {@link Option} also has a value transformer configured, it will be used to\n * transform whichever value was determined to be used.\n *\n * This method returns whether the value of the underlying field on target was changed as a result.\n *\n * @param {string} name - the name of the {@link Option} whose value is to be set\n * @param {*} value - the value to be set for the named {@link Option} on target\n * @param {Object} target - the object on which value is to be set for the named {@link Option}\n * @return {boolean} true if the underlying field on target was changed; otherwise\n * false.\n * @throws {Error} If name is invalid or is for an option that cannot be modified.\n * @public\n * @memberof OptionManager#\n */\n set: function(name, value, target) {\n return this._set(name, value, target);\n },\n\n /**\n * Sets all of the specified options on the target object provided to their corresponding\n * values.\n *\n * This method will throw an error if any of the names within options does not match an available option\n * or matches an option that cannot be modified.\n *\n * If any value within options is null and the corresponding {@link Option} has a default\n * value configured, then that default value will be used instead. If an {@link Option} also has a value transformer\n * configured, it will be used to transform whichever value was determined to be used.\n *\n * This method returns whether the value for any of the underlying fields on target were changed as a\n * result.\n *\n * @param {Object.} options - the name/value pairs of options to be set\n * @param {Object} target - the object on which the options are to be set\n * @return {boolean} true if any of the underlying fields on target were changed; otherwise\n * false.\n * @throws {Error} If options contains an invalid option name or an option that cannot be modiifed.\n * @public\n * @memberof OptionManager#\n */\n setAll: function(options, target) {\n return this._setAll(options, target);\n },\n\n _set: function(name, value, target, allowUnmodifiable) {\n var option = this.options[name];\n if (!option) {\n throw new Error('Invalid option: ' + name);\n }\n if (!option.modifiable && !allowUnmodifiable) {\n throw new Error('Option cannot be modified: ' + name);\n }\n\n return OptionManager._set(option, value, target);\n },\n\n _setAll: function(options, target, allowUnmodifiable) {\n if (!options) {\n return false;\n }\n\n var name;\n var changed = false;\n\n for (name in options) {\n if (Utilities.hasOwn(options, name) && this._set(name, options[name], target, allowUnmodifiable)) {\n changed = true;\n }\n }\n\n return changed;\n }\n\n}, {\n\n _createAccessor: function(option, target, changeHandler) {\n var descriptor = {\n get: function() {\n return OptionManager._get(option, target);\n }\n };\n\n if (option.modifiable) {\n descriptor.set = function(value) {\n if (OptionManager._set(option, value, target)) {\n changeHandler(value, option);\n }\n };\n }\n\n Object.defineProperty(target, option.name, descriptor);\n },\n\n _get: function(option, target) {\n return target['_' + option.name];\n },\n\n _set: function(option, value, target) {\n var fieldName = '_' + option.name;\n var oldValue = target[fieldName];\n var newValue = option.transform(value != null ? value : option.defaultValue);\n\n target[fieldName] = newValue;\n\n return newValue !== oldValue;\n }\n\n});\n\nmodule.exports = OptionManager;\n\n/**\n * Called whenever the value of a modifiable {@link Option} is changed on a target object via the defined property's\n * setter.\n *\n * @callback OptionManager~ChangeHandler\n * @param {*} value - the new value for option on the target object\n * @param {Option} option - the modifable {@link Option} whose value has changed on the target object.\n * @return {void}\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * A basic manager for {@link Service} implementations that are mapped to simple names.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar ServiceManager = Nevis.extend(function() {\n this._services = {};\n}, {\n\n /**\n * Returns the {@link Service} being managed with the specified name.\n *\n * @param {string} name - the name of the {@link Service} to be returned\n * @return {Service} The {@link Service} is being managed with name.\n * @throws {Error} If no {@link Service} is being managed with name.\n * @public\n * @memberof ServiceManager#\n */\n getService: function(name) {\n var service = this._services[name];\n if (!service) {\n throw new Error('Service is not being managed with name: ' + name);\n }\n\n return service;\n },\n\n /**\n * Sets the {@link Service} implementation to be managed for the specified name to the\n * service provided.\n *\n * @param {string} name - the name of the {@link Service} to be managed with name\n * @param {Service} service - the {@link Service} implementation to be managed\n * @return {void}\n * @throws {Error} If a {@link Service} is already being managed with the same name.\n * @public\n * @memberof ServiceManager#\n */\n setService: function(name, service) {\n if (this._services[name]) {\n throw new Error('Service is already managed with name: ' + name);\n }\n\n if (service) {\n this._services[name] = service;\n }\n }\n\n});\n\nmodule.exports = ServiceManager;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar CanvasRenderer = require('./renderer/CanvasRenderer');\nvar Frame = require('./Frame');\nvar ImageRenderer = require('./renderer/ImageRenderer');\nvar Option = require('./option/Option');\nvar OptionManager = require('./option/OptionManager');\nvar ServiceManager = require('./service/ServiceManager');\nvar Utilities = require('./util/Utilities');\n\nvar optionManager = new OptionManager([\n new Option('background', true, 'white'),\n new Option('backgroundAlpha', true, 1, Utilities.abs),\n new Option('element'),\n new Option('foreground', true, 'black'),\n new Option('foregroundAlpha', true, 1, Utilities.abs),\n new Option('level', true, 'L', Utilities.toUpperCase),\n new Option('mime', true, 'image/png'),\n new Option('padding', true, null, Utilities.abs),\n new Option('size', true, 100, Utilities.abs),\n new Option('value', true, '')\n]);\nvar serviceManager = new ServiceManager();\n\n/**\n * Enables configuration of a QR code generator which uses HTML5 canvas for rendering.\n *\n * @param {QRious~Options} [options] - the options to be used\n * @throws {Error} If any options are invalid.\n * @public\n * @class\n * @extends Nevis\n */\nvar QRious = Nevis.extend(function(options) {\n optionManager.init(options, this, this.update.bind(this));\n\n var element = optionManager.get('element', this);\n var elementService = serviceManager.getService('element');\n var canvas = element && elementService.isCanvas(element) ? element : elementService.createCanvas();\n var image = element && elementService.isImage(element) ? element : elementService.createImage();\n\n this._canvasRenderer = new CanvasRenderer(this, canvas, true);\n this._imageRenderer = new ImageRenderer(this, image, image === element);\n\n this.update();\n}, {\n\n /**\n * Returns all of the options configured for this {@link QRious}.\n *\n * Any changes made to the returned object will not be reflected in the options themselves or their corresponding\n * underlying fields.\n *\n * @return {Object.} A copy of the applied options.\n * @public\n * @memberof QRious#\n */\n get: function() {\n return optionManager.getAll(this);\n },\n\n /**\n * Sets all of the specified options and automatically updates this {@link QRious} if any of the\n * underlying fields are changed as a result.\n *\n * This is the preferred method for updating multiple options at one time to avoid unnecessary updates between\n * changes.\n *\n * @param {QRious~Options} options - the options to be set\n * @return {void}\n * @throws {Error} If any options are invalid or cannot be modified.\n * @public\n * @memberof QRious#\n */\n set: function(options) {\n if (optionManager.setAll(options, this)) {\n this.update();\n }\n },\n\n /**\n * Returns the image data URI for the generated QR code using the mime provided.\n *\n * @param {string} [mime] - the MIME type for the image\n * @return {string} The image data URI for the QR code.\n * @public\n * @memberof QRious#\n */\n toDataURL: function(mime) {\n return this.canvas.toDataURL(mime || this.mime);\n },\n\n /**\n * Updates this {@link QRious} by generating a new {@link Frame} and re-rendering the QR code.\n *\n * @return {void}\n * @protected\n * @memberof QRious#\n */\n update: function() {\n var frame = new Frame({\n level: this.level,\n value: this.value\n });\n\n this._canvasRenderer.render(frame);\n this._imageRenderer.render(frame);\n }\n\n}, {\n\n /**\n * Configures the service provided to be used by all {@link QRious} instances.\n *\n * @param {Service} service - the {@link Service} to be configured\n * @return {void}\n * @throws {Error} If a {@link Service} has already been configured with the same name.\n * @public\n * @static\n * @memberof QRious\n */\n use: function(service) {\n serviceManager.setService(service.getName(), service);\n }\n\n});\n\nObject.defineProperties(QRious.prototype, {\n\n canvas: {\n /**\n * Returns the canvas element being used to render the QR code for this {@link QRious}.\n *\n * @return {*} The canvas element.\n * @public\n * @memberof QRious#\n * @alias canvas\n */\n get: function() {\n return this._canvasRenderer.getElement();\n }\n },\n\n image: {\n /**\n * Returns the img element being used to render the QR code for this {@link QRious}.\n *\n * @return {*} The img element.\n * @public\n * @memberof QRious#\n * @alias image\n */\n get: function() {\n return this._imageRenderer.getElement();\n }\n }\n\n});\n\nmodule.exports = QRious;\n\n/**\n * The options used by {@link QRious}.\n *\n * @typedef {Object} QRious~Options\n * @property {string} [background=\"white\"] - The background color to be applied to the QR code.\n * @property {number} [backgroundAlpha=1] - The background alpha to be applied to the QR code.\n * @property {*} [element] - The element to be used to render the QR code which may either be an canvas or\n * img. The element(s) will be created if needed.\n * @property {string} [foreground=\"black\"] - The foreground color to be applied to the QR code.\n * @property {number} [foregroundAlpha=1] - The foreground alpha to be applied to the QR code.\n * @property {string} [level=\"L\"] - The error correction level to be applied to the QR code.\n * @property {string} [mime=\"image/png\"] - The MIME type to be used to render the image for the QR code.\n * @property {number} [padding] - The padding for the QR code in pixels.\n * @property {number} [size=100] - The size of the QR code in pixels.\n * @property {string} [value=\"\"] - The value to be encoded within the QR code.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nmodule.exports = require('./src/QRious');\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Defines a service contract that must be met by all implementations.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Service = Nevis.extend({\n\n /**\n * Returns the name of this {@link Service}.\n *\n * @return {string} The service name.\n * @public\n * @abstract\n * @memberof Service#\n */\n getName: function() {}\n\n});\n\nmodule.exports = Service;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Service = require('../Service');\n\n/**\n * A service for working with elements.\n *\n * @public\n * @class\n * @extends Service\n */\nvar ElementService = Service.extend({\n\n /**\n * Creates an instance of a canvas element.\n *\n * Implementations of {@link ElementService} must override this method with their own specific logic.\n *\n * @return {*} The newly created canvas element.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n createCanvas: function() {},\n\n /**\n * Creates an instance of a image element.\n *\n * Implementations of {@link ElementService} must override this method with their own specific logic.\n *\n * @return {*} The newly created image element.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n createImage: function() {},\n\n /**\n * @override\n */\n getName: function() {\n return 'element';\n },\n\n /**\n * Returns whether the specified element is a canvas.\n *\n * Implementations of {@link ElementService} must override this method with their own specific logic.\n *\n * @param {*} element - the element to be checked\n * @return {boolean} true if element is a canvas; otherwise false.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n isCanvas: function(element) {},\n\n /**\n * Returns whether the specified element is an image.\n *\n * Implementations of {@link ElementService} must override this method with their own specific logic.\n *\n * @param {*} element - the element to be checked\n * @return {boolean} true if element is an image; otherwise false.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n isImage: function(element) {}\n\n});\n\nmodule.exports = ElementService;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar ElementService = require('qrious-core/src/service/element/ElementService');\n\n/**\n * An implementation of {@link ElementService} intended for use within a browser environment.\n *\n * @public\n * @class\n * @extends ElementService\n */\nvar BrowserElementService = ElementService.extend({\n\n /**\n * @override\n */\n createCanvas: function() {\n return document.createElement('canvas');\n },\n\n /**\n * @override\n */\n createImage: function() {\n return document.createElement('img');\n },\n\n /**\n * @override\n */\n isCanvas: function(element) {\n return element instanceof HTMLCanvasElement;\n },\n\n /**\n * @override\n */\n isImage: function(element) {\n return element instanceof HTMLImageElement;\n }\n\n});\n\nmodule.exports = BrowserElementService;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar QRious = require('qrious-core');\n\nvar BrowserElementService = require('./service/element/BrowserElementService');\n\nQRious.use(new BrowserElementService());\n\nmodule.exports = QRious;\n"],"names":["extend","require$$0","Nevis","Renderer","ErrorCorrection","Galois","Alignment","Version","Utilities","OptionManager","Option","ServiceManager","CanvasRenderer","ImageRenderer","Frame","Service","ElementService","QRious","BrowserElementService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EAAA;;;;;;;;;;;;;;;;;;;;;;AAsBA;;;;;;AAQA,MAAI,WAAW,8BAA8B,WAAW,EAAE,CAAC;;;;;;;AAO3D,MAAI,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC;;;;;;;AAOrD,MAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;;;;;;;;;;;;AAYlC,EAAA,SAAS,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE;IAC3C,IAAI,MAAM,CAAC;;IAEX,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE;MACvC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KACnC,MAAM;MACL,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC;MAClC,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;MAC3B,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;KAC9B;;IAED,IAAI,UAAU,EAAE;MACd,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;KACxC;;IAED,OAAO,MAAM,CAAC;GACf;;;;;;;;;;;;;;;;;;;;;;;AAuBD,EAAA,SAAS,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE;IACrD,IAAI,gBAAgB,GAAG,IAAI,CAAC;;IAE5B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;MAC5B,OAAO,GAAG,SAAS,CAAC;MACpB,SAAS,GAAG,WAAW,CAAC;MACxB,WAAW,GAAG,IAAI,CAAC;MACnB,IAAI,GAAG,IAAI,CAAC;KACb;;IAED,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE;MACrC,OAAO,GAAG,SAAS,CAAC;MACpB,SAAS,GAAG,WAAW,CAAC;MACxB,WAAW,GAAG,WAAW;QACvB,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;OAChD,CAAC;KACH;;IAED,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;;IAE5D,WAAW,CAAC,SAAS,GAAG,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC5E,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;;IAEhD,WAAW,CAAC,MAAM,GAAG,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;IACrD,WAAW,CAAC,MAAM,GAAG,gBAAgB,CAAC;;IAEtC,OAAO,WAAW,CAAC;GACpB;;;;;;;;;;;;;;AAcD,EAAA,SAAS,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAC1C,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;;IAEnC,IAAI,QAAQ,CAAC;IACb,IAAI,MAAM,CAAC;;IAEX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;MACxD,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;;MAEpB,KAAK,QAAQ,IAAI,MAAM,EAAE;QACvB,IAAI,CAAC,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;UACjD,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;SACrC;OACF;KACF;GACF;;AAED,cAAc,GAAG,MAAM,CAAC;;;;;;;;ACzHxB,EAAA,SAAS,KAAK,GAAG,EAAE;AACnB,EAAA,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;AACvB,EAAA,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AAyBtB,EAAA,KAAK,CAAC,MAAM,GAAGA,QAAM,CAAC;;AAEtB,WAAc,GAAG,KAAK,CAAC;;ACrCvB,UAAc,GAAGC,KAAsB,CAAC;;;;;;;;;;;;;;;;;ACcxC,MAAI,QAAQ,GAAGC,IAAK,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;;;;;;;;IAQ7D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;;;;;;;;IASrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;;;;;;;;;IAS7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;GACjC,EAAE;;;;;;;;;;;;;IAaD,IAAI,EAAE,SAAS,KAAK,EAAE,EAAE;;;;;;;;;;;;IAYxB,UAAU,EAAE,WAAW;MACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,MAAM,EAAE,CAAC;OACf;;MAED,OAAO,IAAI,CAAC,OAAO,CAAC;KACrB;;;;;;;;;;;;;;;;;IAiBD,aAAa,EAAE,SAAS,KAAK,EAAE;MAC7B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;MACzB,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;MAClC,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;;MAErE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;KAC5B;;;;;;;;;;;;;;;IAeD,SAAS,EAAE,SAAS,KAAK,EAAE;MACzB,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;MACzB,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;;MAE7B,IAAI,OAAO,IAAI,IAAI,EAAE;QACnB,OAAO,OAAO,CAAC;OAChB;;MAED,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;MAC3C,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;;MAExE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;KAC5B;;;;;;;;;;IAUD,MAAM,EAAE,SAAS,KAAK,EAAE;MACtB,IAAI,IAAI,CAAC,OAAO,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;OAClB;KACF;;;;;;;;;;;;IAYD,KAAK,EAAE,WAAW,EAAE;;;;;;;;;;;;IAYpB,MAAM,EAAE,WAAW,EAAE;;GAEtB,CAAC,CAAC;;AAEH,gBAAc,GAAG,QAAQ,CAAC;;;;;;;;;AClK1B,MAAI,cAAc,GAAGC,UAAQ,CAAC,MAAM,CAAC;;;;;IAKnC,IAAI,EAAE,SAAS,KAAK,EAAE;MACpB,IAAI,CAAC,EAAE,CAAC,CAAC;MACT,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;MACzB,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;MAC3C,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;MACnC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;;MAE5C,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;MACtC,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;;MAE7C,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAChC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;UAChC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE;YACvC,OAAO,CAAC,QAAQ,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;WAChG;SACF;OACF;KACF;;;;;IAKD,KAAK,EAAE,WAAW;MAChB,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;MACzB,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;MAC5C,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;MAEvB,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;MACtB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;MACpC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;MACtC,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;MAC7C,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;KACpC;;;;;IAKD,MAAM,EAAE,WAAW;MACjB,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;MAE3B,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;KACnD;;GAEF,CAAC,CAAC;;AAEH,sBAAc,GAAG,cAAc,CAAC;;;;;;;;;;;;;AChDhC,MAAI,SAAS,GAAGD,IAAK,CAAC,MAAM,CAAC,IAAI,EAAE;;;;;;;;;;IAUjC,KAAK,EAAE;MACL,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;MAC1B,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;MAClE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;KACnE;;GAEF,CAAC,CAAC;;AAEH,iBAAc,GAAG,SAAS,CAAC;;;;;;;;;;;;;AClB3B,MAAI,eAAe,GAAGA,IAAK,CAAC,MAAM,CAAC,IAAI,EAAE;;;;;;;;;;;;;IAavC,MAAM,EAAE;MACN,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;MAC3E,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;KAC5E;;;;;;;;;;IAUD,YAAY,EAAE;;MAEZ,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;MAE9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;MAE9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;MAE9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;KAC/D;;;;;;;;;;IAUD,MAAM,EAAE;MACN,CAAC,EAAE,CAAC;MACJ,CAAC,EAAE,CAAC;MACJ,CAAC,EAAE,CAAC;MACJ,CAAC,EAAE,CAAC;KACL;;GAEF,CAAC,CAAC;;AAEH,uBAAc,GAAG,eAAe,CAAC;;;;;;;;;AC9FjC,MAAI,MAAM,GAAGA,IAAK,CAAC,MAAM,CAAC,IAAI,EAAE;;;;;;;;;;IAU9B,QAAQ,EAAE;MACR,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;KAC/F;;;;;;;;;;IAUD,GAAG,EAAE;MACH,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;MAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI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"} \ No newline at end of file diff --git a/imports/util/qrious.min.js b/imports/util/qrious.min.js new file mode 100644 index 0000000..a53d712 --- /dev/null +++ b/imports/util/qrious.min.js @@ -0,0 +1,6 @@ +/*! QRious v4.0.2 | (C) 2017 Alasdair Mercer | GPL v3 License +Based on jsqrencode | (C) 2010 tz@execpc.com | GPL v3 License +*/ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.QRious=e()}(this,function(){"use strict";function t(t,e){var n;return"function"==typeof Object.create?n=Object.create(t):(s.prototype=t,n=new s,s.prototype=null),e&&i(!0,n,e),n}function e(e,n,s,r){var o=this;return"string"!=typeof e&&(r=s,s=n,n=e,e=null),"function"!=typeof n&&(r=s,s=n,n=function(){return o.apply(this,arguments)}),i(!1,n,o,r),n.prototype=t(o.prototype,s),n.prototype.constructor=n,n.class_=e||o.class_,n.super_=o,n}function i(t,e,i){for(var n,s,a=0,h=(i=o.call(arguments,2)).length;a>1&1,n=0;n0;e--)n[e]=n[e]?n[e-1]^_.EXPONENT[v._modN(_.LOG[n[e]]+t)]:n[e-1];n[0]=_.EXPONENT[v._modN(_.LOG[n[0]]+t)]}for(t=0;t<=i;t++)n[t]=_.LOG[n[t]]},_checkBadness:function(){var t,e,i,n,s,r=0,o=this._badness,a=this.buffer,h=this.width;for(s=0;sh*h;)u-=h*h,c++;for(r+=c*v.N4,n=0;n=o-2&&(t=o-2,s>9&&t--);var a=t;if(s>9){for(r[a+2]=0,r[a+3]=0;a--;)e=r[a],r[a+3]|=255&e<<4,r[a+2]=e>>4;r[2]|=255&t<<4,r[1]=t>>4,r[0]=64|t>>12}else{for(r[a+1]=0,r[a+2]=0;a--;)e=r[a],r[a+2]|=255&e<<4,r[a+1]=e>>4;r[1]|=255&t<<4,r[0]=64|t>>4}for(a=t+3-(s<10);a=5&&(i+=v.N1+n[e]-5);for(e=3;et||3*n[e-3]>=4*n[e]||3*n[e+3]>=4*n[e])&&(i+=v.N3);return i},_finish:function(){this._stringBuffer=this.buffer.slice();var t,e,i=0,n=3e4;for(e=0;e<8&&(this._applyMask(e),(t=this._checkBadness())>=1)1&n&&(s[r-1-e+8*r]=1,e<6?s[8+r*e]=1:s[8+r*(e+1)]=1);for(e=0;e<7;e++,n>>=1)1&n&&(s[8+r*(r-7+e)]=1,e?s[6-e+8*r]=1:s[7+8*r]=1)},_interleaveBlocks:function(){var t,e,i=this._dataBlock,n=this._ecc,s=this._eccBlock,r=0,o=this._calculateMaxLength(),a=this._neccBlock1,h=this._neccBlock2,f=this._stringBuffer;for(t=0;t1)for(t=u.BLOCK[n],i=s-7;;){for(e=s-7;e>t-3&&(this._addAlignment(e,i),!(e6)for(t=d.BLOCK[r-7],e=17,i=0;i<6;i++)for(n=0;n<3;n++,e--)1&(e>11?r>>e-12:t>>e)?(s[5-i+o*(2-n+o-11)]=1,s[2-n+o-11+o*(5-i)]=1):(this._setMask(5-i,2-n+o-11),this._setMask(2-n+o-11,5-i))},_isMasked:function(t,e){var i=v._getMaskBit(t,e);return 1===this._mask[i]},_pack:function(){var t,e,i,n=1,s=1,r=this.width,o=r-1,a=r-1,h=(this._dataBlock+this._eccBlock)*(this._neccBlock1+this._neccBlock2)+this._neccBlock2;for(e=0;ee&&(i=t,t=e,e=i),i=e,i+=e*e,i>>=1,i+=t},_modN:function(t){for(;t>=255;)t=((t-=255)>>8)+(255&t);return t},N1:3,N2:3,N3:40,N4:10}),p=v,m=f.extend({draw:function(){this.element.src=this.qrious.toDataURL()},reset:function(){this.element.src=""},resize:function(){var t=this.element;t.width=t.height=this.qrious.size}}),g=h.extend(function(t,e,i,n){this.name=t,this.modifiable=Boolean(e),this.defaultValue=i,this._valueTransformer=n},{transform:function(t){var e=this._valueTransformer;return"function"==typeof e?e(t,this):t}}),k=h.extend(null,{abs:function(t){return null!=t?Math.abs(t):null},hasOwn:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},noop:function(){},toUpperCase:function(t){return null!=t?t.toUpperCase():null}}),w=h.extend(function(t){this.options={},t.forEach(function(t){this.options[t.name]=t},this)},{exists:function(t){return null!=this.options[t]},get:function(t,e){return w._get(this.options[t],e)},getAll:function(t){var e,i=this.options,n={};for(e in i)k.hasOwn(i,e)&&(n[e]=w._get(i[e],t));return n},init:function(t,e,i){"function"!=typeof i&&(i=k.noop);var n,s;for(n in this.options)k.hasOwn(this.options,n)&&(s=this.options[n],w._set(s,s.defaultValue,e),w._createAccessor(s,e,i));this._setAll(t,e,!0)},set:function(t,e,i){return this._set(t,e,i)},setAll:function(t,e){return this._setAll(t,e)},_set:function(t,e,i,n){var s=this.options[t];if(!s)throw new Error("Invalid option: "+t);if(!s.modifiable&&!n)throw new Error("Option cannot be modified: "+t);return w._set(s,e,i)},_setAll:function(t,e,i){if(!t)return!1;var n,s=!1;for(n in t)k.hasOwn(t,n)&&this._set(n,t[n],e,i)&&(s=!0);return s}},{_createAccessor:function(t,e,i){var n={get:function(){return w._get(t,e)}};t.modifiable&&(n.set=function(n){w._set(t,n,e)&&i(n,t)}),Object.defineProperty(e,t.name,n)},_get:function(t,e){return e["_"+t.name]},_set:function(t,e,i){var n="_"+t.name,s=i[n],r=t.transform(null!=e?e:t.defaultValue);return i[n]=r,r!==s}}),M=w,b=h.extend(function(){this._services={}},{getService:function(t){var e=this._services[t];if(!e)throw new Error("Service is not being managed with name: "+t);return e},setService:function(t,e){if(this._services[t])throw new Error("Service is already managed with name: "+t);e&&(this._services[t]=e)}}),B=new M([new g("background",!0,"white"),new g("backgroundAlpha",!0,1,k.abs),new g("element"),new g("foreground",!0,"black"),new g("foregroundAlpha",!0,1,k.abs),new g("level",!0,"L",k.toUpperCase),new g("mime",!0,"image/png"),new g("padding",!0,null,k.abs),new g("size",!0,100,k.abs),new g("value",!0,"")]),y=new b,O=h.extend(function(t){B.init(t,this,this.update.bind(this));var e=B.get("element",this),i=y.getService("element"),n=e&&i.isCanvas(e)?e:i.createCanvas(),s=e&&i.isImage(e)?e:i.createImage();this._canvasRenderer=new c(this,n,!0),this._imageRenderer=new m(this,s,s===e),this.update()},{get:function(){return B.getAll(this)},set:function(t){B.setAll(t,this)&&this.update()},toDataURL:function(t){return this.canvas.toDataURL(t||this.mime)},update:function(){var t=new p({level:this.level,value:this.value});this._canvasRenderer.render(t),this._imageRenderer.render(t)}},{use:function(t){y.setService(t.getName(),t)}});Object.defineProperties(O.prototype,{canvas:{get:function(){return this._canvasRenderer.getElement()}},image:{get:function(){return this._imageRenderer.getElement()}}});var A=O,L=h.extend({getName:function(){}}).extend({createCanvas:function(){},createImage:function(){},getName:function(){return"element"},isCanvas:function(t){},isImage:function(t){}}).extend({createCanvas:function(){return document.createElement("canvas")},createImage:function(){return document.createElement("img")},isCanvas:function(t){return t instanceof HTMLCanvasElement},isImage:function(t){return t instanceof HTMLImageElement}});return A.use(new L),A}); + +//# sourceMappingURL=qrious.min.js.map diff --git a/imports/util/qrious.min.js.map b/imports/util/qrious.min.js.map new file mode 100644 index 0000000..ff65e0b --- /dev/null +++ b/imports/util/qrious.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"qrious.min.js","sources":["../node_modules/nevis/src/extend.js","../node_modules/nevis/src/nevis.js","../node_modules/qrious-core/src/renderer/Renderer.js","../node_modules/qrious-core/src/renderer/CanvasRenderer.js","../node_modules/qrious-core/src/Alignment.js","../node_modules/qrious-core/src/ErrorCorrection.js","../node_modules/qrious-core/src/Galois.js","../node_modules/qrious-core/src/Version.js","../node_modules/qrious-core/src/Frame.js","../node_modules/qrious-core/src/renderer/ImageRenderer.js","../node_modules/qrious-core/src/option/Option.js","../node_modules/qrious-core/src/util/Utilities.js","../node_modules/qrious-core/src/option/OptionManager.js","../node_modules/qrious-core/src/service/ServiceManager.js","../node_modules/qrious-core/src/QRious.js","../node_modules/qrious-core/src/service/Service.js","../node_modules/qrious-core/src/service/element/ElementService.js","../src/service/element/BrowserElementService.js","../src/QRious.js"],"sourcesContent":["/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\n/**\n * A bare-bones constructor for surrogate prototype swapping.\n *\n * @private\n * @constructor\n */\nvar Constructor = /* istanbul ignore next */ function() {};\n/**\n * A reference to Object.prototype.hasOwnProperty.\n *\n * @private\n * @type {Function}\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * A reference to Array.prototype.slice.\n *\n * @private\n * @type {Function}\n */\nvar slice = Array.prototype.slice;\n\n/**\n * Creates an object which inherits the given prototype.\n *\n * Optionally, the created object can be extended further with the specified properties.\n *\n * @param {Object} prototype - the prototype to be inherited by the created object\n * @param {Object} [properties] - the optional properties to be extended by the created object\n * @return {Object} The newly created object.\n * @private\n */\nfunction createObject(prototype, properties) {\n var result;\n /* istanbul ignore next */\n if (typeof Object.create === 'function') {\n result = Object.create(prototype);\n } else {\n Constructor.prototype = prototype;\n result = new Constructor();\n Constructor.prototype = null;\n }\n\n if (properties) {\n extendObject(true, result, properties);\n }\n\n return result;\n}\n\n/**\n * Extends the constructor to which this method is associated with the prototype and/or\n * statics provided.\n *\n * If name is provided, it will be used as the class name and can be accessed via a special\n * class_ property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * toString), but this is not applicable to the lite version of Nevis.\n *\n * If constructor is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special super_ property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child constructor provided or the one created if none was given.\n * @public\n */\nfunction extend(name, constructor, prototype, statics) {\n var superConstructor = this;\n\n if (typeof name !== 'string') {\n statics = prototype;\n prototype = constructor;\n constructor = name;\n name = null;\n }\n\n if (typeof constructor !== 'function') {\n statics = prototype;\n prototype = constructor;\n constructor = function() {\n return superConstructor.apply(this, arguments);\n };\n }\n\n extendObject(false, constructor, superConstructor, statics);\n\n constructor.prototype = createObject(superConstructor.prototype, prototype);\n constructor.prototype.constructor = constructor;\n\n constructor.class_ = name || superConstructor.class_;\n constructor.super_ = superConstructor;\n\n return constructor;\n}\n\n/**\n * Extends the specified target object with the properties in each of the sources provided.\n *\n * if any source is null it will be ignored.\n *\n * @param {boolean} own - true to only copy own properties from sources onto\n * target; otherwise false\n * @param {Object} target - the target object which should be extended\n * @param {...Object} [sources] - the source objects whose properties are to be copied onto target\n * @return {void}\n * @private\n */\nfunction extendObject(own, target, sources) {\n sources = slice.call(arguments, 2);\n\n var property;\n var source;\n\n for (var i = 0, length = sources.length; i < length; i++) {\n source = sources[i];\n\n for (property in source) {\n if (!own || hasOwnProperty.call(source, property)) {\n target[property] = source[property];\n }\n }\n }\n}\n\nmodule.exports = extend;\n","/*\n * Copyright (C) 2017 Alasdair Mercer, !ninja\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n'use strict';\n\nvar extend = require('./extend');\n\n/**\n * The base class from which all others should extend.\n *\n * @public\n * @constructor\n */\nfunction Nevis() {}\nNevis.class_ = 'Nevis';\nNevis.super_ = Object;\n\n/**\n * Extends the constructor to which this method is associated with the prototype and/or\n * statics provided.\n *\n * If name is provided, it will be used as the class name and can be accessed via a special\n * class_ property on the child constructor, otherwise the class name of the super constructor will be used\n * instead. The class name may also be used string representation for instances of the child constructor (via\n * toString), but this is not applicable to the lite version of Nevis.\n *\n * If constructor is provided, it will be used as the constructor for the child, otherwise a simple\n * constructor which only calls the super constructor will be used instead.\n *\n * The super constructor can be accessed via a special super_ property on the child constructor.\n *\n * @param {string} [name=this.class_] - the class name to be used for the child constructor\n * @param {Function} [constructor] - the constructor for the child\n * @param {Object} [prototype] - the prototype properties to be defined for the child\n * @param {Object} [statics] - the static properties to be defined for the child\n * @return {Function} The child constructor provided or the one created if none was given.\n * @public\n * @static\n * @memberof Nevis\n */\nNevis.extend = extend;\n\nmodule.exports = Nevis;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Responsible for rendering a QR code {@link Frame} on a specific type of element.\n *\n * A renderer may be dependant on the rendering of another element, so the ordering of their execution is important.\n *\n * The rendering of a element can be deferred by disabling the renderer initially, however, any attempt get the element\n * from the renderer will result in it being immediately enabled and the element being rendered.\n *\n * @param {QRious} qrious - the {@link QRious} instance to be used\n * @param {*} element - the element onto which the QR code is to be rendered\n * @param {boolean} [enabled] - true this {@link Renderer} is enabled; otherwise false.\n * @public\n * @class\n * @extends Nevis\n */\nvar Renderer = Nevis.extend(function(qrious, element, enabled) {\n /**\n * The {@link QRious} instance.\n *\n * @protected\n * @type {QRious}\n * @memberof Renderer#\n */\n this.qrious = qrious;\n\n /**\n * The element onto which this {@link Renderer} is rendering the QR code.\n *\n * @protected\n * @type {*}\n * @memberof Renderer#\n */\n this.element = element;\n this.element.qrious = qrious;\n\n /**\n * Whether this {@link Renderer} is enabled.\n *\n * @protected\n * @type {boolean}\n * @memberof Renderer#\n */\n this.enabled = Boolean(enabled);\n}, {\n\n /**\n * Draws the specified QR code frame on the underlying element.\n *\n * Implementations of {@link Renderer} must override this method with their own specific logic.\n *\n * @param {Frame} frame - the {@link Frame} to be drawn\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n draw: function(frame) {},\n\n /**\n * Returns the element onto which this {@link Renderer} is rendering the QR code.\n *\n * If this method is called while this {@link Renderer} is disabled, it will be immediately enabled and rendered\n * before the element is returned.\n *\n * @return {*} The element.\n * @public\n * @memberof Renderer#\n */\n getElement: function() {\n if (!this.enabled) {\n this.enabled = true;\n this.render();\n }\n\n return this.element;\n },\n\n /**\n * Calculates the size (in pixel units) to represent an individual module within the QR code based on the\n * frame provided.\n *\n * Any configured padding will be excluded from the returned size.\n *\n * The returned value will be at least one, even in cases where the size of the QR code does not fit its contents.\n * This is done so that the inevitable clipping is handled more gracefully since this way at least something is\n * displayed instead of just a blank space filled by the background color.\n *\n * @param {Frame} frame - the {@link Frame} from which the module size is to be derived\n * @return {number} The pixel size for each module in the QR code which will be no less than one.\n * @protected\n * @memberof Renderer#\n */\n getModuleSize: function(frame) {\n var qrious = this.qrious;\n var padding = qrious.padding || 0;\n var pixels = Math.floor((qrious.size - (padding * 2)) / frame.width);\n\n return Math.max(1, pixels);\n },\n\n /**\n * Calculates the offset/padding (in pixel units) to be inserted before the QR code based on the frame\n * provided.\n *\n * The returned value will be zero if there is no available offset or if the size of the QR code does not fit its\n * contents. It will never be a negative value. This is done so that the inevitable clipping appears more naturally\n * and it is not clipped from all directions.\n *\n * @param {Frame} frame - the {@link Frame} from which the offset is to be derived\n * @return {number} The pixel offset for the QR code which will be no less than zero.\n * @protected\n * @memberof Renderer#\n */\n getOffset: function(frame) {\n var qrious = this.qrious;\n var padding = qrious.padding;\n\n if (padding != null) {\n return padding;\n }\n\n var moduleSize = this.getModuleSize(frame);\n var offset = Math.floor((qrious.size - (moduleSize * frame.width)) / 2);\n\n return Math.max(0, offset);\n },\n\n /**\n * Renders a QR code on the underlying element based on the frame provided.\n *\n * @param {Frame} frame - the {@link Frame} to be rendered\n * @return {void}\n * @public\n * @memberof Renderer#\n */\n render: function(frame) {\n if (this.enabled) {\n this.resize();\n this.reset();\n this.draw(frame);\n }\n },\n\n /**\n * Resets the underlying element, effectively clearing any previously rendered QR code.\n *\n * Implementations of {@link Renderer} must override this method with their own specific logic.\n *\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n reset: function() {},\n\n /**\n * Ensures that the size of the underlying element matches that defined on the associated {@link QRious} instance.\n *\n * Implementations of {@link Renderer} must override this method with their own specific logic.\n *\n * @return {void}\n * @protected\n * @abstract\n * @memberof Renderer#\n */\n resize: function() {}\n\n});\n\nmodule.exports = Renderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Renderer = require('./Renderer');\n\n/**\n * An implementation of {@link Renderer} for working with canvas elements.\n *\n * @public\n * @class\n * @extends Renderer\n */\nvar CanvasRenderer = Renderer.extend({\n\n /**\n * @override\n */\n draw: function(frame) {\n var i, j;\n var qrious = this.qrious;\n var moduleSize = this.getModuleSize(frame);\n var offset = this.getOffset(frame);\n var context = this.element.getContext('2d');\n\n context.fillStyle = qrious.foreground;\n context.globalAlpha = qrious.foregroundAlpha;\n\n for (i = 0; i < frame.width; i++) {\n for (j = 0; j < frame.width; j++) {\n if (frame.buffer[(j * frame.width) + i]) {\n context.fillRect((moduleSize * i) + offset, (moduleSize * j) + offset, moduleSize, moduleSize);\n }\n }\n }\n },\n\n /**\n * @override\n */\n reset: function() {\n var qrious = this.qrious;\n var context = this.element.getContext('2d');\n var size = qrious.size;\n\n context.lineWidth = 1;\n context.clearRect(0, 0, size, size);\n context.fillStyle = qrious.background;\n context.globalAlpha = qrious.backgroundAlpha;\n context.fillRect(0, 0, size, size);\n },\n\n /**\n * @override\n */\n resize: function() {\n var element = this.element;\n\n element.width = element.height = this.qrious.size;\n }\n\n});\n\nmodule.exports = CanvasRenderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\n/* eslint no-multi-spaces: \"off\" */\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains alignment pattern information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Alignment = Nevis.extend(null, {\n\n /**\n * The alignment pattern block.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Alignment\n */\n BLOCK: [\n 0, 11, 15, 19, 23, 27, 31,\n 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,\n 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28\n ]\n\n});\n\nmodule.exports = Alignment;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\n/* eslint no-multi-spaces: \"off\" */\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains error correction information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar ErrorCorrection = Nevis.extend(null, {\n\n /**\n * The error correction blocks.\n *\n * There are four elements per version. The first two indicate the number of blocks, then the data width, and finally\n * the ECC width.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof ErrorCorrection\n */\n BLOCKS: [\n 1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,\n 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,\n 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,\n 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,\n 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,\n 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,\n 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,\n 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,\n 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,\n 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,\n 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,\n 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,\n 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,\n 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,\n 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,\n 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,\n 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,\n 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,\n 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,\n 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,\n 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,\n 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,\n 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,\n 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,\n 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,\n 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,\n 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,\n 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,\n 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,\n 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,\n 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,\n 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,\n 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,\n 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,\n 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,\n 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,\n 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,\n 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,\n 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,\n 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30\n ],\n\n /**\n * The final format bits with mask (level << 3 | mask).\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof ErrorCorrection\n */\n FINAL_FORMAT: [\n // L\n 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,\n // M\n 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,\n // Q\n 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,\n // H\n 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b\n ],\n\n /**\n * A map of human-readable ECC levels.\n *\n * @public\n * @static\n * @type {Object.}\n * @memberof ErrorCorrection\n */\n LEVELS: {\n L: 1,\n M: 2,\n Q: 3,\n H: 4\n }\n\n});\n\nmodule.exports = ErrorCorrection;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains Galois field information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Galois = Nevis.extend(null, {\n\n /**\n * The Galois field exponent table.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Galois\n */\n EXPONENT: [\n 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,\n 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,\n 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,\n 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,\n 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,\n 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,\n 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,\n 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,\n 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,\n 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,\n 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,\n 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,\n 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,\n 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,\n 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,\n 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00\n ],\n\n /**\n * The Galois field log table.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Galois\n */\n LOG: [\n 0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,\n 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,\n 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,\n 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,\n 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,\n 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,\n 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,\n 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,\n 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,\n 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,\n 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,\n 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,\n 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,\n 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,\n 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,\n 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf\n ]\n\n});\n\nmodule.exports = Galois;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains version pattern information.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Version = Nevis.extend(null, {\n\n /**\n * The version pattern block.\n *\n * @public\n * @static\n * @type {number[]}\n * @memberof Version\n */\n BLOCK: [\n 0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d, 0x928, 0xb78, 0x45d, 0xa17, 0x532,\n 0x9a6, 0x683, 0x8c9, 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75, 0x250, 0x9d5,\n 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64, 0x541, 0xc69\n ]\n\n});\n\nmodule.exports = Version;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar Alignment = require('./Alignment');\nvar ErrorCorrection = require('./ErrorCorrection');\nvar Galois = require('./Galois');\nvar Version = require('./Version');\n\n/**\n * Generates information for a QR code frame based on a specific value to be encoded.\n *\n * @param {Frame~Options} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar Frame = Nevis.extend(function(options) {\n var dataBlock, eccBlock, index, neccBlock1, neccBlock2;\n var valueLength = options.value.length;\n\n this._badness = [];\n this._level = ErrorCorrection.LEVELS[options.level];\n this._polynomial = [];\n this._value = options.value;\n this._version = 0;\n this._stringBuffer = [];\n\n while (this._version < 40) {\n this._version++;\n\n index = ((this._level - 1) * 4) + ((this._version - 1) * 16);\n\n neccBlock1 = ErrorCorrection.BLOCKS[index++];\n neccBlock2 = ErrorCorrection.BLOCKS[index++];\n dataBlock = ErrorCorrection.BLOCKS[index++];\n eccBlock = ErrorCorrection.BLOCKS[index];\n\n index = (dataBlock * (neccBlock1 + neccBlock2)) + neccBlock2 - 3 + (this._version <= 9);\n\n if (valueLength <= index) {\n break;\n }\n }\n\n this._dataBlock = dataBlock;\n this._eccBlock = eccBlock;\n this._neccBlock1 = neccBlock1;\n this._neccBlock2 = neccBlock2;\n\n /**\n * The data width is based on version.\n *\n * @public\n * @type {number}\n * @memberof Frame#\n */\n // FIXME: Ensure that it fits instead of being truncated.\n var width = this.width = 17 + (4 * this._version);\n\n /**\n * The image buffer.\n *\n * @public\n * @type {number[]}\n * @memberof Frame#\n */\n this.buffer = Frame._createArray(width * width);\n\n this._ecc = Frame._createArray(dataBlock + ((dataBlock + eccBlock) * (neccBlock1 + neccBlock2)) + neccBlock2);\n this._mask = Frame._createArray(((width * (width + 1)) + 1) / 2);\n\n this._insertFinders();\n this._insertAlignments();\n\n // Insert single foreground cell.\n this.buffer[8 + (width * (width - 8))] = 1;\n\n this._insertTimingGap();\n this._reverseMask();\n this._insertTimingRowAndColumn();\n this._insertVersion();\n this._syncMask();\n this._convertBitStream(valueLength);\n this._calculatePolynomial();\n this._appendEccToData();\n this._interleaveBlocks();\n this._pack();\n this._finish();\n}, {\n\n _addAlignment: function(x, y) {\n var i;\n var buffer = this.buffer;\n var width = this.width;\n\n buffer[x + (width * y)] = 1;\n\n for (i = -2; i < 2; i++) {\n buffer[x + i + (width * (y - 2))] = 1;\n buffer[x - 2 + (width * (y + i + 1))] = 1;\n buffer[x + 2 + (width * (y + i))] = 1;\n buffer[x + i + 1 + (width * (y + 2))] = 1;\n }\n\n for (i = 0; i < 2; i++) {\n this._setMask(x - 1, y + i);\n this._setMask(x + 1, y - i);\n this._setMask(x - i, y - 1);\n this._setMask(x + i, y + 1);\n }\n },\n\n _appendData: function(data, dataLength, ecc, eccLength) {\n var bit, i, j;\n var polynomial = this._polynomial;\n var stringBuffer = this._stringBuffer;\n\n for (i = 0; i < eccLength; i++) {\n stringBuffer[ecc + i] = 0;\n }\n\n for (i = 0; i < dataLength; i++) {\n bit = Galois.LOG[stringBuffer[data + i] ^ stringBuffer[ecc]];\n\n if (bit !== 255) {\n for (j = 1; j < eccLength; j++) {\n stringBuffer[ecc + j - 1] = stringBuffer[ecc + j] ^\n Galois.EXPONENT[Frame._modN(bit + polynomial[eccLength - j])];\n }\n } else {\n for (j = ecc; j < ecc + eccLength; j++) {\n stringBuffer[j] = stringBuffer[j + 1];\n }\n }\n\n stringBuffer[ecc + eccLength - 1] = bit === 255 ? 0 : Galois.EXPONENT[Frame._modN(bit + polynomial[0])];\n }\n },\n\n _appendEccToData: function() {\n var i;\n var data = 0;\n var dataBlock = this._dataBlock;\n var ecc = this._calculateMaxLength();\n var eccBlock = this._eccBlock;\n\n for (i = 0; i < this._neccBlock1; i++) {\n this._appendData(data, dataBlock, ecc, eccBlock);\n\n data += dataBlock;\n ecc += eccBlock;\n }\n\n for (i = 0; i < this._neccBlock2; i++) {\n this._appendData(data, dataBlock + 1, ecc, eccBlock);\n\n data += dataBlock + 1;\n ecc += eccBlock;\n }\n },\n\n _applyMask: function(mask) {\n var r3x, r3y, x, y;\n var buffer = this.buffer;\n var width = this.width;\n\n switch (mask) {\n case 0:\n for (y = 0; y < width; y++) {\n for (x = 0; x < width; x++) {\n if (!((x + y) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 1:\n for (y = 0; y < width; y++) {\n for (x = 0; x < width; x++) {\n if (!(y & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 2:\n for (y = 0; y < width; y++) {\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!r3x && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 3:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = r3y, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!r3x && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 4:\n for (y = 0; y < width; y++) {\n for (r3x = 0, r3y = (y >> 1) & 1, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n r3y = !r3y;\n }\n\n if (!r3y && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 5:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((x & y & 1) + !(!r3x | !r3y)) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 6:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((x & y & 1) + (r3x && r3x === r3y) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n case 7:\n for (r3y = 0, y = 0; y < width; y++, r3y++) {\n if (r3y === 3) {\n r3y = 0;\n }\n\n for (r3x = 0, x = 0; x < width; x++, r3x++) {\n if (r3x === 3) {\n r3x = 0;\n }\n\n if (!((r3x && r3x === r3y) + (x + y & 1) & 1) && !this._isMasked(x, y)) {\n buffer[x + (y * width)] ^= 1;\n }\n }\n }\n\n break;\n }\n },\n\n _calculateMaxLength: function() {\n return (this._dataBlock * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n },\n\n _calculatePolynomial: function() {\n var i, j;\n var eccBlock = this._eccBlock;\n var polynomial = this._polynomial;\n\n polynomial[0] = 1;\n\n for (i = 0; i < eccBlock; i++) {\n polynomial[i + 1] = 1;\n\n for (j = i; j > 0; j--) {\n polynomial[j] = polynomial[j] ? polynomial[j - 1] ^\n Galois.EXPONENT[Frame._modN(Galois.LOG[polynomial[j]] + i)] : polynomial[j - 1];\n }\n\n polynomial[0] = Galois.EXPONENT[Frame._modN(Galois.LOG[polynomial[0]] + i)];\n }\n\n // Use logs for generator polynomial to save calculation step.\n for (i = 0; i <= eccBlock; i++) {\n polynomial[i] = Galois.LOG[polynomial[i]];\n }\n },\n\n _checkBadness: function() {\n var b, b1, h, x, y;\n var bad = 0;\n var badness = this._badness;\n var buffer = this.buffer;\n var width = this.width;\n\n // Blocks of same colour.\n for (y = 0; y < width - 1; y++) {\n for (x = 0; x < width - 1; x++) {\n // All foreground colour.\n if ((buffer[x + (width * y)] &&\n buffer[x + 1 + (width * y)] &&\n buffer[x + (width * (y + 1))] &&\n buffer[x + 1 + (width * (y + 1))]) ||\n // All background colour.\n !(buffer[x + (width * y)] ||\n buffer[x + 1 + (width * y)] ||\n buffer[x + (width * (y + 1))] ||\n buffer[x + 1 + (width * (y + 1))])) {\n bad += Frame.N2;\n }\n }\n }\n\n var bw = 0;\n\n // X runs.\n for (y = 0; y < width; y++) {\n h = 0;\n\n badness[0] = 0;\n\n for (b = 0, x = 0; x < width; x++) {\n b1 = buffer[x + (width * y)];\n\n if (b === b1) {\n badness[h]++;\n } else {\n badness[++h] = 1;\n }\n\n b = b1;\n bw += b ? 1 : -1;\n }\n\n bad += this._getBadness(h);\n }\n\n if (bw < 0) {\n bw = -bw;\n }\n\n var count = 0;\n var big = bw;\n big += big << 2;\n big <<= 1;\n\n while (big > width * width) {\n big -= width * width;\n count++;\n }\n\n bad += count * Frame.N4;\n\n // Y runs.\n for (x = 0; x < width; x++) {\n h = 0;\n\n badness[0] = 0;\n\n for (b = 0, y = 0; y < width; y++) {\n b1 = buffer[x + (width * y)];\n\n if (b === b1) {\n badness[h]++;\n } else {\n badness[++h] = 1;\n }\n\n b = b1;\n }\n\n bad += this._getBadness(h);\n }\n\n return bad;\n },\n\n _convertBitStream: function(length) {\n var bit, i;\n var ecc = this._ecc;\n var version = this._version;\n\n // Convert string to bit stream. 8-bit data to QR-coded 8-bit data (numeric, alphanumeric, or kanji not supported).\n for (i = 0; i < length; i++) {\n ecc[i] = this._value.charCodeAt(i);\n }\n\n var stringBuffer = this._stringBuffer = ecc.slice();\n var maxLength = this._calculateMaxLength();\n\n if (length >= maxLength - 2) {\n length = maxLength - 2;\n\n if (version > 9) {\n length--;\n }\n }\n\n // Shift and re-pack to insert length prefix.\n var index = length;\n\n if (version > 9) {\n stringBuffer[index + 2] = 0;\n stringBuffer[index + 3] = 0;\n\n while (index--) {\n bit = stringBuffer[index];\n\n stringBuffer[index + 3] |= 255 & (bit << 4);\n stringBuffer[index + 2] = bit >> 4;\n }\n\n stringBuffer[2] |= 255 & (length << 4);\n stringBuffer[1] = length >> 4;\n stringBuffer[0] = 0x40 | (length >> 12);\n } else {\n stringBuffer[index + 1] = 0;\n stringBuffer[index + 2] = 0;\n\n while (index--) {\n bit = stringBuffer[index];\n\n stringBuffer[index + 2] |= 255 & (bit << 4);\n stringBuffer[index + 1] = bit >> 4;\n }\n\n stringBuffer[1] |= 255 & (length << 4);\n stringBuffer[0] = 0x40 | (length >> 4);\n }\n\n // Fill to end with pad pattern.\n index = length + 3 - (version < 10);\n\n while (index < maxLength) {\n stringBuffer[index++] = 0xec;\n stringBuffer[index++] = 0x11;\n }\n },\n\n _getBadness: function(length) {\n var i;\n var badRuns = 0;\n var badness = this._badness;\n\n for (i = 0; i <= length; i++) {\n if (badness[i] >= 5) {\n badRuns += Frame.N1 + badness[i] - 5;\n }\n }\n\n // FBFFFBF as in finder.\n for (i = 3; i < length - 1; i += 2) {\n if (badness[i - 2] === badness[i + 2] &&\n badness[i + 2] === badness[i - 1] &&\n badness[i - 1] === badness[i + 1] &&\n badness[i - 1] * 3 === badness[i] &&\n // Background around the foreground pattern? Not part of the specs.\n (badness[i - 3] === 0 || i + 3 > length ||\n badness[i - 3] * 3 >= badness[i] * 4 ||\n badness[i + 3] * 3 >= badness[i] * 4)) {\n badRuns += Frame.N3;\n }\n }\n\n return badRuns;\n },\n\n _finish: function() {\n // Save pre-mask copy of frame.\n this._stringBuffer = this.buffer.slice();\n\n var currentMask, i;\n var bit = 0;\n var mask = 30000;\n\n /*\n * Using for instead of while since in original Arduino code if an early mask was \"good enough\" it wouldn't try for\n * a better one since they get more complex and take longer.\n */\n for (i = 0; i < 8; i++) {\n // Returns foreground-background imbalance.\n this._applyMask(i);\n\n currentMask = this._checkBadness();\n\n // Is current mask better than previous best?\n if (currentMask < mask) {\n mask = currentMask;\n bit = i;\n }\n\n // Don't increment \"i\" to a void redoing mask.\n if (bit === 7) {\n break;\n }\n\n // Reset for next pass.\n this.buffer = this._stringBuffer.slice();\n }\n\n // Redo best mask as none were \"good enough\" (i.e. last wasn't bit).\n if (bit !== i) {\n this._applyMask(bit);\n }\n\n // Add in final mask/ECC level bytes.\n mask = ErrorCorrection.FINAL_FORMAT[bit + (this._level - 1 << 3)];\n\n var buffer = this.buffer;\n var width = this.width;\n\n // Low byte.\n for (i = 0; i < 8; i++, mask >>= 1) {\n if (mask & 1) {\n buffer[width - 1 - i + (width * 8)] = 1;\n\n if (i < 6) {\n buffer[8 + (width * i)] = 1;\n } else {\n buffer[8 + (width * (i + 1))] = 1;\n }\n }\n }\n\n // High byte.\n for (i = 0; i < 7; i++, mask >>= 1) {\n if (mask & 1) {\n buffer[8 + (width * (width - 7 + i))] = 1;\n\n if (i) {\n buffer[6 - i + (width * 8)] = 1;\n } else {\n buffer[7 + (width * 8)] = 1;\n }\n }\n }\n },\n\n _interleaveBlocks: function() {\n var i, j;\n var dataBlock = this._dataBlock;\n var ecc = this._ecc;\n var eccBlock = this._eccBlock;\n var k = 0;\n var maxLength = this._calculateMaxLength();\n var neccBlock1 = this._neccBlock1;\n var neccBlock2 = this._neccBlock2;\n var stringBuffer = this._stringBuffer;\n\n for (i = 0; i < dataBlock; i++) {\n for (j = 0; j < neccBlock1; j++) {\n ecc[k++] = stringBuffer[i + (j * dataBlock)];\n }\n\n for (j = 0; j < neccBlock2; j++) {\n ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n }\n }\n\n for (j = 0; j < neccBlock2; j++) {\n ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n }\n\n for (i = 0; i < eccBlock; i++) {\n for (j = 0; j < neccBlock1 + neccBlock2; j++) {\n ecc[k++] = stringBuffer[maxLength + i + (j * eccBlock)];\n }\n }\n\n this._stringBuffer = ecc;\n },\n\n _insertAlignments: function() {\n var i, x, y;\n var version = this._version;\n var width = this.width;\n\n if (version > 1) {\n i = Alignment.BLOCK[version];\n y = width - 7;\n\n for (;;) {\n x = width - 7;\n\n while (x > i - 3) {\n this._addAlignment(x, y);\n\n if (x < i) {\n break;\n }\n\n x -= i;\n }\n\n if (y <= i + 9) {\n break;\n }\n\n y -= i;\n\n this._addAlignment(6, y);\n this._addAlignment(y, 6);\n }\n }\n },\n\n _insertFinders: function() {\n var i, j, x, y;\n var buffer = this.buffer;\n var width = this.width;\n\n for (i = 0; i < 3; i++) {\n j = 0;\n y = 0;\n\n if (i === 1) {\n j = width - 7;\n }\n if (i === 2) {\n y = width - 7;\n }\n\n buffer[y + 3 + (width * (j + 3))] = 1;\n\n for (x = 0; x < 6; x++) {\n buffer[y + x + (width * j)] = 1;\n buffer[y + (width * (j + x + 1))] = 1;\n buffer[y + 6 + (width * (j + x))] = 1;\n buffer[y + x + 1 + (width * (j + 6))] = 1;\n }\n\n for (x = 1; x < 5; x++) {\n this._setMask(y + x, j + 1);\n this._setMask(y + 1, j + x + 1);\n this._setMask(y + 5, j + x);\n this._setMask(y + x + 1, j + 5);\n }\n\n for (x = 2; x < 4; x++) {\n buffer[y + x + (width * (j + 2))] = 1;\n buffer[y + 2 + (width * (j + x + 1))] = 1;\n buffer[y + 4 + (width * (j + x))] = 1;\n buffer[y + x + 1 + (width * (j + 4))] = 1;\n }\n }\n },\n\n _insertTimingGap: function() {\n var x, y;\n var width = this.width;\n\n for (y = 0; y < 7; y++) {\n this._setMask(7, y);\n this._setMask(width - 8, y);\n this._setMask(7, y + width - 7);\n }\n\n for (x = 0; x < 8; x++) {\n this._setMask(x, 7);\n this._setMask(x + width - 8, 7);\n this._setMask(x, width - 8);\n }\n },\n\n _insertTimingRowAndColumn: function() {\n var x;\n var buffer = this.buffer;\n var width = this.width;\n\n for (x = 0; x < width - 14; x++) {\n if (x & 1) {\n this._setMask(8 + x, 6);\n this._setMask(6, 8 + x);\n } else {\n buffer[8 + x + (width * 6)] = 1;\n buffer[6 + (width * (8 + x))] = 1;\n }\n }\n },\n\n _insertVersion: function() {\n var i, j, x, y;\n var buffer = this.buffer;\n var version = this._version;\n var width = this.width;\n\n if (version > 6) {\n i = Version.BLOCK[version - 7];\n j = 17;\n\n for (x = 0; x < 6; x++) {\n for (y = 0; y < 3; y++, j--) {\n if (1 & (j > 11 ? version >> j - 12 : i >> j)) {\n buffer[5 - x + (width * (2 - y + width - 11))] = 1;\n buffer[2 - y + width - 11 + (width * (5 - x))] = 1;\n } else {\n this._setMask(5 - x, 2 - y + width - 11);\n this._setMask(2 - y + width - 11, 5 - x);\n }\n }\n }\n }\n },\n\n _isMasked: function(x, y) {\n var bit = Frame._getMaskBit(x, y);\n\n return this._mask[bit] === 1;\n },\n\n _pack: function() {\n var bit, i, j;\n var k = 1;\n var v = 1;\n var width = this.width;\n var x = width - 1;\n var y = width - 1;\n\n // Interleaved data and ECC codes.\n var length = ((this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n\n for (i = 0; i < length; i++) {\n bit = this._stringBuffer[i];\n\n for (j = 0; j < 8; j++, bit <<= 1) {\n if (0x80 & bit) {\n this.buffer[x + (width * y)] = 1;\n }\n\n // Find next fill position.\n do {\n if (v) {\n x--;\n } else {\n x++;\n\n if (k) {\n if (y !== 0) {\n y--;\n } else {\n x -= 2;\n k = !k;\n\n if (x === 6) {\n x--;\n y = 9;\n }\n }\n } else if (y !== width - 1) {\n y++;\n } else {\n x -= 2;\n k = !k;\n\n if (x === 6) {\n x--;\n y -= 8;\n }\n }\n }\n\n v = !v;\n } while (this._isMasked(x, y));\n }\n }\n },\n\n _reverseMask: function() {\n var x, y;\n var width = this.width;\n\n for (x = 0; x < 9; x++) {\n this._setMask(x, 8);\n }\n\n for (x = 0; x < 8; x++) {\n this._setMask(x + width - 8, 8);\n this._setMask(8, x);\n }\n\n for (y = 0; y < 7; y++) {\n this._setMask(8, y + width - 7);\n }\n },\n\n _setMask: function(x, y) {\n var bit = Frame._getMaskBit(x, y);\n\n this._mask[bit] = 1;\n },\n\n _syncMask: function() {\n var x, y;\n var width = this.width;\n\n for (y = 0; y < width; y++) {\n for (x = 0; x <= y; x++) {\n if (this.buffer[x + (width * y)]) {\n this._setMask(x, y);\n }\n }\n }\n }\n\n}, {\n\n _createArray: function(length) {\n var i;\n var array = [];\n\n for (i = 0; i < length; i++) {\n array[i] = 0;\n }\n\n return array;\n },\n\n _getMaskBit: function(x, y) {\n var bit;\n\n if (x > y) {\n bit = x;\n x = y;\n y = bit;\n }\n\n bit = y;\n bit += y * y;\n bit >>= 1;\n bit += x;\n\n return bit;\n },\n\n _modN: function(x) {\n while (x >= 255) {\n x -= 255;\n x = (x >> 8) + (x & 255);\n }\n\n return x;\n },\n\n // *Badness* coefficients.\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n\n});\n\nmodule.exports = Frame;\n\n/**\n * The options used by {@link Frame}.\n *\n * @typedef {Object} Frame~Options\n * @property {string} level - The ECC level to be used.\n * @property {string} value - The value to be encoded.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Renderer = require('./Renderer');\n\n/**\n * An implementation of {@link Renderer} for working with img elements.\n *\n * This depends on {@link CanvasRenderer} being executed first as this implementation simply applies the data URL from\n * the rendered canvas element as the src for the img element being rendered.\n *\n * @public\n * @class\n * @extends Renderer\n */\nvar ImageRenderer = Renderer.extend({\n\n /**\n * @override\n */\n draw: function() {\n this.element.src = this.qrious.toDataURL();\n },\n\n /**\n * @override\n */\n reset: function() {\n this.element.src = '';\n },\n\n /**\n * @override\n */\n resize: function() {\n var element = this.element;\n\n element.width = element.height = this.qrious.size;\n }\n\n});\n\nmodule.exports = ImageRenderer;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Defines an available option while also configuring how values are applied to the target object.\n *\n * Optionally, a default value can be specified as well a value transformer for greater control over how the option\n * value is applied.\n *\n * If no value transformer is specified, then any specified option will be applied directly. All values are maintained\n * on the target object itself as a field using the option name prefixed with a single underscore.\n *\n * When an option is specified as modifiable, the {@link OptionManager} will be required to include a setter for the\n * property that is defined on the target object that uses the option name.\n *\n * @param {string} name - the name to be used\n * @param {boolean} [modifiable] - true if the property defined on target objects should include a setter;\n * otherwise false\n * @param {*} [defaultValue] - the default value to be used\n * @param {Option~ValueTransformer} [valueTransformer] - the value transformer to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar Option = Nevis.extend(function(name, modifiable, defaultValue, valueTransformer) {\n /**\n * The name for this {@link Option}.\n *\n * @public\n * @type {string}\n * @memberof Option#\n */\n this.name = name;\n\n /**\n * Whether a setter should be included on the property defined on target objects for this {@link Option}.\n *\n * @public\n * @type {boolean}\n * @memberof Option#\n */\n this.modifiable = Boolean(modifiable);\n\n /**\n * The default value for this {@link Option}.\n *\n * @public\n * @type {*}\n * @memberof Option#\n */\n this.defaultValue = defaultValue;\n\n this._valueTransformer = valueTransformer;\n}, {\n\n /**\n * Transforms the specified value so that it can be applied for this {@link Option}.\n *\n * If a value transformer has been specified for this {@link Option}, it will be called upon to transform\n * value. Otherwise, value will be returned directly.\n *\n * @param {*} value - the value to be transformed\n * @return {*} The transformed value or value if no value transformer is specified.\n * @public\n * @memberof Option#\n */\n transform: function(value) {\n var transformer = this._valueTransformer;\n if (typeof transformer === 'function') {\n return transformer(value, this);\n }\n\n return value;\n }\n\n});\n\nmodule.exports = Option;\n\n/**\n * Returns a transformed value for the specified value to be applied for the option provided.\n *\n * @callback Option~ValueTransformer\n * @param {*} value - the value to be transformed\n * @param {Option} option - the {@link Option} for which value is being transformed\n * @return {*} The transform value.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Contains utility methods that are useful throughout the library.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Utilities = Nevis.extend(null, {\n\n /**\n * Returns the absolute value of a given number.\n *\n * This method is simply a convenient shorthand for Math.abs while ensuring that nulls are returned as\n * null instead of zero.\n *\n * @param {number} value - the number whose absolute value is to be returned\n * @return {number} The absolute value of value or null if value is\n * null.\n * @public\n * @static\n * @memberof Utilities\n */\n abs: function(value) {\n return value != null ? Math.abs(value) : null;\n },\n\n /**\n * Returns whether the specified object has a property with the specified name as an own\n * (not inherited) property.\n *\n * @param {Object} object - the object on which the property is to be checked\n * @param {string} name - the name of the property to be checked\n * @return {boolean} true if object has an own property with name.\n * @public\n * @static\n * @memberof Utilities\n */\n hasOwn: function(object, name) {\n return Object.prototype.hasOwnProperty.call(object, name);\n },\n\n /**\n * A non-operation method that does absolutely nothing.\n *\n * @return {void}\n * @public\n * @static\n * @memberof Utilities\n */\n noop: function() {},\n\n /**\n * Transforms the specified string to upper case while remaining null-safe.\n *\n * @param {string} string - the string to be transformed to upper case\n * @return {string} string transformed to upper case if string is not null.\n * @public\n * @static\n * @memberof Utilities\n */\n toUpperCase: function(string) {\n return string != null ? string.toUpperCase() : null;\n }\n\n});\n\nmodule.exports = Utilities;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar Utilities = require('../util/Utilities');\n\n/**\n * Manages multiple {@link Option} instances that are intended to be used by multiple implementations.\n *\n * Although the option definitions are shared between targets, the values are maintained on the targets themselves.\n *\n * @param {Option[]} options - the options to be used\n * @public\n * @class\n * @extends Nevis\n */\nvar OptionManager = Nevis.extend(function(options) {\n /**\n * The available options for this {@link OptionManager}.\n *\n * @public\n * @type {Object.}\n * @memberof OptionManager#\n */\n this.options = {};\n\n options.forEach(function(option) {\n this.options[option.name] = option;\n }, this);\n}, {\n\n /**\n * Returns whether an option with the specified name is available.\n *\n * @param {string} name - the name of the {@link Option} whose existence is to be checked\n * @return {boolean} true if an {@link Option} exists with name; otherwise\n * false.\n * @public\n * @memberof OptionManager#\n */\n exists: function(name) {\n return this.options[name] != null;\n },\n\n /**\n * Returns the value of the option with the specified name on the target object provided.\n *\n * @param {string} name - the name of the {@link Option} whose value on target is to be returned\n * @param {Object} target - the object from which the value of the named {@link Option} is to be returned\n * @return {*} The value of the {@link Option} with name on target.\n * @public\n * @memberof OptionManager#\n */\n get: function(name, target) {\n return OptionManager._get(this.options[name], target);\n },\n\n /**\n * Returns a copy of all of the available options on the target object provided.\n *\n * @param {Object} target - the object from which the option name/value pairs are to be returned\n * @return {Object.} A hash containing the name/value pairs of all options on target.\n * @public\n * @memberof OptionManager#\n */\n getAll: function(target) {\n var name;\n var options = this.options;\n var result = {};\n\n for (name in options) {\n if (Utilities.hasOwn(options, name)) {\n result[name] = OptionManager._get(options[name], target);\n }\n }\n\n return result;\n },\n\n /**\n * Initializes the available options for the target object provided and then applies the initial values\n * within the speciifed options.\n *\n * This method will throw an error if any of the names within options does not match an available option.\n *\n * This involves setting the default values and defining properties for all of the available options on\n * target before finally calling {@link OptionMananger#setAll} with options and\n * target. Any options that are configured to be modifiable will have a setter included in their defined\n * property that will allow its corresponding value to be modified.\n *\n * If a change handler is specified, it will be called whenever the value changes on target for a\n * modifiable option, but only when done so via the defined property's setter.\n *\n * @param {Object.} options - the name/value pairs of the initial options to be set\n * @param {Object} target - the object on which the options are to be initialized\n * @param {Function} [changeHandler] - the function to be called whenever the value of an modifiable option changes on\n * target\n * @return {void}\n * @throws {Error} If options contains an invalid option name.\n * @public\n * @memberof OptionManager#\n */\n init: function(options, target, changeHandler) {\n if (typeof changeHandler !== 'function') {\n changeHandler = Utilities.noop;\n }\n\n var name, option;\n\n for (name in this.options) {\n if (Utilities.hasOwn(this.options, name)) {\n option = this.options[name];\n\n OptionManager._set(option, option.defaultValue, target);\n OptionManager._createAccessor(option, target, changeHandler);\n }\n }\n\n this._setAll(options, target, true);\n },\n\n /**\n * Sets the value of the option with the specified name on the target object provided to\n * value.\n *\n * This method will throw an error if name does not match an available option or matches an option that\n * cannot be modified.\n *\n * If value is null and the {@link Option} has a default value configured, then that default\n * value will be used instead. If the {@link Option} also has a value transformer configured, it will be used to\n * transform whichever value was determined to be used.\n *\n * This method returns whether the value of the underlying field on target was changed as a result.\n *\n * @param {string} name - the name of the {@link Option} whose value is to be set\n * @param {*} value - the value to be set for the named {@link Option} on target\n * @param {Object} target - the object on which value is to be set for the named {@link Option}\n * @return {boolean} true if the underlying field on target was changed; otherwise\n * false.\n * @throws {Error} If name is invalid or is for an option that cannot be modified.\n * @public\n * @memberof OptionManager#\n */\n set: function(name, value, target) {\n return this._set(name, value, target);\n },\n\n /**\n * Sets all of the specified options on the target object provided to their corresponding\n * values.\n *\n * This method will throw an error if any of the names within options does not match an available option\n * or matches an option that cannot be modified.\n *\n * If any value within options is null and the corresponding {@link Option} has a default\n * value configured, then that default value will be used instead. If an {@link Option} also has a value transformer\n * configured, it will be used to transform whichever value was determined to be used.\n *\n * This method returns whether the value for any of the underlying fields on target were changed as a\n * result.\n *\n * @param {Object.} options - the name/value pairs of options to be set\n * @param {Object} target - the object on which the options are to be set\n * @return {boolean} true if any of the underlying fields on target were changed; otherwise\n * false.\n * @throws {Error} If options contains an invalid option name or an option that cannot be modiifed.\n * @public\n * @memberof OptionManager#\n */\n setAll: function(options, target) {\n return this._setAll(options, target);\n },\n\n _set: function(name, value, target, allowUnmodifiable) {\n var option = this.options[name];\n if (!option) {\n throw new Error('Invalid option: ' + name);\n }\n if (!option.modifiable && !allowUnmodifiable) {\n throw new Error('Option cannot be modified: ' + name);\n }\n\n return OptionManager._set(option, value, target);\n },\n\n _setAll: function(options, target, allowUnmodifiable) {\n if (!options) {\n return false;\n }\n\n var name;\n var changed = false;\n\n for (name in options) {\n if (Utilities.hasOwn(options, name) && this._set(name, options[name], target, allowUnmodifiable)) {\n changed = true;\n }\n }\n\n return changed;\n }\n\n}, {\n\n _createAccessor: function(option, target, changeHandler) {\n var descriptor = {\n get: function() {\n return OptionManager._get(option, target);\n }\n };\n\n if (option.modifiable) {\n descriptor.set = function(value) {\n if (OptionManager._set(option, value, target)) {\n changeHandler(value, option);\n }\n };\n }\n\n Object.defineProperty(target, option.name, descriptor);\n },\n\n _get: function(option, target) {\n return target['_' + option.name];\n },\n\n _set: function(option, value, target) {\n var fieldName = '_' + option.name;\n var oldValue = target[fieldName];\n var newValue = option.transform(value != null ? value : option.defaultValue);\n\n target[fieldName] = newValue;\n\n return newValue !== oldValue;\n }\n\n});\n\nmodule.exports = OptionManager;\n\n/**\n * Called whenever the value of a modifiable {@link Option} is changed on a target object via the defined property's\n * setter.\n *\n * @callback OptionManager~ChangeHandler\n * @param {*} value - the new value for option on the target object\n * @param {Option} option - the modifable {@link Option} whose value has changed on the target object.\n * @return {void}\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * A basic manager for {@link Service} implementations that are mapped to simple names.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar ServiceManager = Nevis.extend(function() {\n this._services = {};\n}, {\n\n /**\n * Returns the {@link Service} being managed with the specified name.\n *\n * @param {string} name - the name of the {@link Service} to be returned\n * @return {Service} The {@link Service} is being managed with name.\n * @throws {Error} If no {@link Service} is being managed with name.\n * @public\n * @memberof ServiceManager#\n */\n getService: function(name) {\n var service = this._services[name];\n if (!service) {\n throw new Error('Service is not being managed with name: ' + name);\n }\n\n return service;\n },\n\n /**\n * Sets the {@link Service} implementation to be managed for the specified name to the\n * service provided.\n *\n * @param {string} name - the name of the {@link Service} to be managed with name\n * @param {Service} service - the {@link Service} implementation to be managed\n * @return {void}\n * @throws {Error} If a {@link Service} is already being managed with the same name.\n * @public\n * @memberof ServiceManager#\n */\n setService: function(name, service) {\n if (this._services[name]) {\n throw new Error('Service is already managed with name: ' + name);\n }\n\n if (service) {\n this._services[name] = service;\n }\n }\n\n});\n\nmodule.exports = ServiceManager;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\nvar CanvasRenderer = require('./renderer/CanvasRenderer');\nvar Frame = require('./Frame');\nvar ImageRenderer = require('./renderer/ImageRenderer');\nvar Option = require('./option/Option');\nvar OptionManager = require('./option/OptionManager');\nvar ServiceManager = require('./service/ServiceManager');\nvar Utilities = require('./util/Utilities');\n\nvar optionManager = new OptionManager([\n new Option('background', true, 'white'),\n new Option('backgroundAlpha', true, 1, Utilities.abs),\n new Option('element'),\n new Option('foreground', true, 'black'),\n new Option('foregroundAlpha', true, 1, Utilities.abs),\n new Option('level', true, 'L', Utilities.toUpperCase),\n new Option('mime', true, 'image/png'),\n new Option('padding', true, null, Utilities.abs),\n new Option('size', true, 100, Utilities.abs),\n new Option('value', true, '')\n]);\nvar serviceManager = new ServiceManager();\n\n/**\n * Enables configuration of a QR code generator which uses HTML5 canvas for rendering.\n *\n * @param {QRious~Options} [options] - the options to be used\n * @throws {Error} If any options are invalid.\n * @public\n * @class\n * @extends Nevis\n */\nvar QRious = Nevis.extend(function(options) {\n optionManager.init(options, this, this.update.bind(this));\n\n var element = optionManager.get('element', this);\n var elementService = serviceManager.getService('element');\n var canvas = element && elementService.isCanvas(element) ? element : elementService.createCanvas();\n var image = element && elementService.isImage(element) ? element : elementService.createImage();\n\n this._canvasRenderer = new CanvasRenderer(this, canvas, true);\n this._imageRenderer = new ImageRenderer(this, image, image === element);\n\n this.update();\n}, {\n\n /**\n * Returns all of the options configured for this {@link QRious}.\n *\n * Any changes made to the returned object will not be reflected in the options themselves or their corresponding\n * underlying fields.\n *\n * @return {Object.} A copy of the applied options.\n * @public\n * @memberof QRious#\n */\n get: function() {\n return optionManager.getAll(this);\n },\n\n /**\n * Sets all of the specified options and automatically updates this {@link QRious} if any of the\n * underlying fields are changed as a result.\n *\n * This is the preferred method for updating multiple options at one time to avoid unnecessary updates between\n * changes.\n *\n * @param {QRious~Options} options - the options to be set\n * @return {void}\n * @throws {Error} If any options are invalid or cannot be modified.\n * @public\n * @memberof QRious#\n */\n set: function(options) {\n if (optionManager.setAll(options, this)) {\n this.update();\n }\n },\n\n /**\n * Returns the image data URI for the generated QR code using the mime provided.\n *\n * @param {string} [mime] - the MIME type for the image\n * @return {string} The image data URI for the QR code.\n * @public\n * @memberof QRious#\n */\n toDataURL: function(mime) {\n return this.canvas.toDataURL(mime || this.mime);\n },\n\n /**\n * Updates this {@link QRious} by generating a new {@link Frame} and re-rendering the QR code.\n *\n * @return {void}\n * @protected\n * @memberof QRious#\n */\n update: function() {\n var frame = new Frame({\n level: this.level,\n value: this.value\n });\n\n this._canvasRenderer.render(frame);\n this._imageRenderer.render(frame);\n }\n\n}, {\n\n /**\n * Configures the service provided to be used by all {@link QRious} instances.\n *\n * @param {Service} service - the {@link Service} to be configured\n * @return {void}\n * @throws {Error} If a {@link Service} has already been configured with the same name.\n * @public\n * @static\n * @memberof QRious\n */\n use: function(service) {\n serviceManager.setService(service.getName(), service);\n }\n\n});\n\nObject.defineProperties(QRious.prototype, {\n\n canvas: {\n /**\n * Returns the canvas element being used to render the QR code for this {@link QRious}.\n *\n * @return {*} The canvas element.\n * @public\n * @memberof QRious#\n * @alias canvas\n */\n get: function() {\n return this._canvasRenderer.getElement();\n }\n },\n\n image: {\n /**\n * Returns the img element being used to render the QR code for this {@link QRious}.\n *\n * @return {*} The img element.\n * @public\n * @memberof QRious#\n * @alias image\n */\n get: function() {\n return this._imageRenderer.getElement();\n }\n }\n\n});\n\nmodule.exports = QRious;\n\n/**\n * The options used by {@link QRious}.\n *\n * @typedef {Object} QRious~Options\n * @property {string} [background=\"white\"] - The background color to be applied to the QR code.\n * @property {number} [backgroundAlpha=1] - The background alpha to be applied to the QR code.\n * @property {*} [element] - The element to be used to render the QR code which may either be an canvas or\n * img. The element(s) will be created if needed.\n * @property {string} [foreground=\"black\"] - The foreground color to be applied to the QR code.\n * @property {number} [foregroundAlpha=1] - The foreground alpha to be applied to the QR code.\n * @property {string} [level=\"L\"] - The error correction level to be applied to the QR code.\n * @property {string} [mime=\"image/png\"] - The MIME type to be used to render the image for the QR code.\n * @property {number} [padding] - The padding for the QR code in pixels.\n * @property {number} [size=100] - The size of the QR code in pixels.\n * @property {string} [value=\"\"] - The value to be encoded within the QR code.\n */\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Nevis = require('nevis/lite');\n\n/**\n * Defines a service contract that must be met by all implementations.\n *\n * @public\n * @class\n * @extends Nevis\n */\nvar Service = Nevis.extend({\n\n /**\n * Returns the name of this {@link Service}.\n *\n * @return {string} The service name.\n * @public\n * @abstract\n * @memberof Service#\n */\n getName: function() {}\n\n});\n\nmodule.exports = Service;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar Service = require('../Service');\n\n/**\n * A service for working with elements.\n *\n * @public\n * @class\n * @extends Service\n */\nvar ElementService = Service.extend({\n\n /**\n * Creates an instance of a canvas element.\n *\n * Implementations of {@link ElementService} must override this method with their own specific logic.\n *\n * @return {*} The newly created canvas element.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n createCanvas: function() {},\n\n /**\n * Creates an instance of a image element.\n *\n * Implementations of {@link ElementService} must override this method with their own specific logic.\n *\n * @return {*} The newly created image element.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n createImage: function() {},\n\n /**\n * @override\n */\n getName: function() {\n return 'element';\n },\n\n /**\n * Returns whether the specified element is a canvas.\n *\n * Implementations of {@link ElementService} must override this method with their own specific logic.\n *\n * @param {*} element - the element to be checked\n * @return {boolean} true if element is a canvas; otherwise false.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n isCanvas: function(element) {},\n\n /**\n * Returns whether the specified element is an image.\n *\n * Implementations of {@link ElementService} must override this method with their own specific logic.\n *\n * @param {*} element - the element to be checked\n * @return {boolean} true if element is an image; otherwise false.\n * @public\n * @abstract\n * @memberof ElementService#\n */\n isImage: function(element) {}\n\n});\n\nmodule.exports = ElementService;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar ElementService = require('qrious-core/src/service/element/ElementService');\n\n/**\n * An implementation of {@link ElementService} intended for use within a browser environment.\n *\n * @public\n * @class\n * @extends ElementService\n */\nvar BrowserElementService = ElementService.extend({\n\n /**\n * @override\n */\n createCanvas: function() {\n return document.createElement('canvas');\n },\n\n /**\n * @override\n */\n createImage: function() {\n return document.createElement('img');\n },\n\n /**\n * @override\n */\n isCanvas: function(element) {\n return element instanceof HTMLCanvasElement;\n },\n\n /**\n * @override\n */\n isImage: function(element) {\n return element instanceof HTMLImageElement;\n }\n\n});\n\nmodule.exports = BrowserElementService;\n","/*\n * QRious\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n'use strict';\n\nvar QRious = require('qrious-core');\n\nvar BrowserElementService = require('./service/element/BrowserElementService');\n\nQRious.use(new BrowserElementService());\n\nmodule.exports = QRious;\n"],"names":["createObject","prototype","properties","result","Object","create","Constructor","extendObject","extend","name","constructor","statics","superConstructor","this","apply","arguments","class_","super_","own","target","sources","property","source","i","length","slice","call","hasOwnProperty","Nevis","Array","qrious","element","enabled","Boolean","draw","frame","getElement","render","getModuleSize","padding","pixels","Math","floor","size","width","max","getOffset","moduleSize","offset","resize","reset","Renderer","j","context","getContext","fillStyle","foreground","globalAlpha","foregroundAlpha","buffer","fillRect","lineWidth","clearRect","background","backgroundAlpha","height","BLOCK","BLOCKS","FINAL_FORMAT","LEVELS","L","M","Q","H","EXPONENT","LOG","Frame","options","dataBlock","eccBlock","index","neccBlock1","neccBlock2","valueLength","value","_badness","_level","ErrorCorrection","level","_polynomial","_value","_version","_stringBuffer","_dataBlock","_eccBlock","_neccBlock1","_neccBlock2","_createArray","_ecc","_mask","_insertFinders","_insertAlignments","_insertTimingGap","_reverseMask","_insertTimingRowAndColumn","_insertVersion","_syncMask","_convertBitStream","_calculatePolynomial","_appendEccToData","_interleaveBlocks","_pack","_finish","_addAlignment","x","y","_setMask","_appendData","data","dataLength","ecc","eccLength","bit","polynomial","stringBuffer","Galois","_modN","_calculateMaxLength","_applyMask","mask","r3x","r3y","_isMasked","_checkBadness","b","b1","h","bad","badness","N2","bw","_getBadness","count","big","N4","version","charCodeAt","maxLength","badRuns","N1","N3","currentMask","k","Alignment","Version","_getMaskBit","v","array","src","toDataURL","modifiable","defaultValue","valueTransformer","_valueTransformer","transform","transformer","abs","hasOwn","object","noop","toUpperCase","string","OptionManager","forEach","option","exists","get","_get","getAll","Utilities","init","changeHandler","_set","_createAccessor","_setAll","set","setAll","allowUnmodifiable","Error","changed","descriptor","defineProperty","fieldName","oldValue","newValue","_services","getService","service","setService","optionManager","Option","serviceManager","ServiceManager","QRious","update","bind","elementService","canvas","isCanvas","createCanvas","image","isImage","createImage","_canvasRenderer","CanvasRenderer","_imageRenderer","ImageRenderer","mime","use","getName","defineProperties","document","createElement","HTMLCanvasElement","HTMLImageElement","BrowserElementService"],"mappings":"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O,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,GAAK,GAAO,EAAI,EAAI,GAAK,GAAO,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,GAAK,GAAO,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,GAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,GAAI,IAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,EAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,GAAI,IAAK,GAAO,EAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,EAAI,GAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,EAAI,GAAI,IAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,GAAI,EAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GACzE,GAAI,EAAI,IAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,GAAO,GAAI,GAAI,GAAK,IAW3EC,cAEE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAExD,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAExD,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,KAAQ,MAAQ,MAExD,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,IAAQ,KAAQ,MAW1DC,QACEC,EAAG,EACHC,EAAG,EACHC,EAAG,EACHC,EAAG,OCzFM7C,EAAMpB,OAAO,MAUxBkE,UACE,EAAM,EAAM,EAAM,EAAM,GAAM,GAAM,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAC1F,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,EAAM,EAAM,GAAM,GAAM,GAAM,GAAM,IAC1F,IAAM,GAAM,GAAM,IAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAC1F,GAAM,IAAM,EAAM,GAAM,GAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC1F,GAAM,IAAM,GAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,GAAM,IAAM,IAC1F,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAC1F,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,GAAM,IAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAC1F,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAC1F,IAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,IAAM,GAAM,GAAM,GAC1F,IAAM,GAAM,IAAM,GAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAC1F,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC1F,IAAM,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAC1F,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,EAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAC1F,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,IAAM,EAC1F,GAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAC1F,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAW5FC,KACE,IAAM,EAAM,EAAM,GAAM,EAAM,GAAM,GAAM,IAAM,EAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAAM,GAC1F,EAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,EAAM,GAAM,IAC1F,EAAM,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAC1F,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,EAAM,IAAM,GAAM,IAAM,IAAM,IAC1F,EAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAC1F,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,GAAM,GAC1F,GAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,GAC1F,IAAM,GAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAC1F,EAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAC1F,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAC1F,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAC1F,IAAM,GAAM,IAAM,IAAM,GAAM,GAAM,GAAM,IAAM,IAAM,GAAM,GAAM,GAAM,GAAM,IAAM,GAAM,IAC1F,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAA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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3a928ae..21ca944 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,13 +8,17 @@ "dependencies": { "@babel/runtime": "^7.16.7", "connect-route": "^0.1.5", + "html5-qrcode": "^2.2.0", "jquery": "^3.6.0", "meteor-node-stubs": "^1.0.0", + "mongodb": "^4.4.1", "svelte": "^3.46.4", + "tinro": "^0.6.12", "ws": "^8.4.2" }, "devDependencies": { - "chai": "^4.2.0" + "chai": "^4.2.0", + "rollup-plugin-css-only": "^3.1.0" } }, "node_modules/@babel/runtime": { @@ -28,6 +32,38 @@ "node": ">=6.9.0" } }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.0.tgz", + "integrity": "sha512-2WUyJNRkyH5p487pGnn4tWAsxhEFKN/pT8CMgHshd5H+IXkOnKvKZwsz5ZWz+YCXkleZRAU5kwbfgF8CPfDRqA==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@types/node": { + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + }, + "node_modules/@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -37,6 +73,59 @@ "node": "*" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bson": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.2.tgz", + "integrity": "sha512-VeJKHShcu1b/ugl0QiujlVuBepab714X9nNyBdA1kfekuDGecxgpTA2Z6nYbagrWFeiIyzSWIOzju3lhj+RNyQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -83,6 +172,20 @@ "node": ">=0.12" } }, + "node_modules/denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -92,11 +195,46 @@ "node": "*" } }, + "node_modules/html5-qrcode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.2.0.tgz", + "integrity": "sha512-8fkxks2N0NEfHnhxmq7AQnDTvx3IWp0VD2h5yhHufDTflWhC1dXPy/Xvdl+tA9nOsPCRqirOOZpl/OQbTYhnSw==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, "node_modules/jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "node_modules/meteor-node-stubs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.0.0.tgz", @@ -781,6 +919,32 @@ "node": ">=0.4" } }, + "node_modules/mongodb": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.4.1.tgz", + "integrity": "sha512-IAD3nFtCR4s22vi5qjqkCBnuyDDrOW8WVSSmgHquOvGaP1iTD+XpC5tr8wAUbZ2EeZkaswwBKQFHDvl4qYcKqQ==", + "dependencies": { + "bson": "^4.6.1", + "denque": "^2.0.1", + "mongodb-connection-string-url": "^2.5.2", + "socks": "^2.6.2" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", + "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -790,11 +954,89 @@ "node": "*" } }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, + "node_modules/rollup-plugin-css-only": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-css-only/-/rollup-plugin-css-only-3.1.0.tgz", + "integrity": "sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "4" + }, + "engines": { + "node": ">=10.12.0" + }, + "peerDependencies": { + "rollup": "1 || 2" + } + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/svelte": { "version": "3.46.4", "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz", @@ -803,6 +1045,22 @@ "node": ">= 8" } }, + "node_modules/tinro": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/tinro/-/tinro-0.6.12.tgz", + "integrity": "sha512-YYLh0a21GXXpS66ilZbywfXcPTKQQ+bv3tihoqKqSFQP6/F11N7ZmtRbFWcyZXXPFRSzNxmPJBB8ZhP0GkoS0Q==" + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -812,6 +1070,26 @@ "node": ">=4" } }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/ws": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", @@ -842,12 +1120,63 @@ "regenerator-runtime": "^0.13.4" } }, + "@rollup/pluginutils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.0.tgz", + "integrity": "sha512-2WUyJNRkyH5p487pGnn4tWAsxhEFKN/pT8CMgHshd5H+IXkOnKvKZwsz5ZWz+YCXkleZRAU5kwbfgF8CPfDRqA==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "@types/node": { + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + }, + "@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bson": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.2.tgz", + "integrity": "sha512-VeJKHShcu1b/ugl0QiujlVuBepab714X9nNyBdA1kfekuDGecxgpTA2Z6nYbagrWFeiIyzSWIOzju3lhj+RNyQ==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -882,17 +1211,49 @@ "type-detect": "^4.0.0" } }, + "denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "html5-qrcode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.2.0.tgz", + "integrity": "sha512-8fkxks2N0NEfHnhxmq7AQnDTvx3IWp0VD2h5yhHufDTflWhC1dXPy/Xvdl+tA9nOsPCRqirOOZpl/OQbTYhnSw==" + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, "jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "meteor-node-stubs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.0.0.tgz", @@ -1454,28 +1815,128 @@ } } }, + "mongodb": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.4.1.tgz", + "integrity": "sha512-IAD3nFtCR4s22vi5qjqkCBnuyDDrOW8WVSSmgHquOvGaP1iTD+XpC5tr8wAUbZ2EeZkaswwBKQFHDvl4qYcKqQ==", + "requires": { + "bson": "^4.6.1", + "denque": "^2.0.1", + "mongodb-connection-string-url": "^2.5.2", + "saslprep": "^1.0.3", + "socks": "^2.6.2" + } + }, + "mongodb-connection-string-url": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", + "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, + "rollup-plugin-css-only": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-css-only/-/rollup-plugin-css-only-3.1.0.tgz", + "integrity": "sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "4" + } + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "svelte": { "version": "3.46.4", "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz", "integrity": "sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg==" }, + "tinro": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/tinro/-/tinro-0.6.12.tgz", + "integrity": "sha512-YYLh0a21GXXpS66ilZbywfXcPTKQQ+bv3tihoqKqSFQP6/F11N7ZmtRbFWcyZXXPFRSzNxmPJBB8ZhP0GkoS0Q==" + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, "ws": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", diff --git a/package.json b/package.json index fd2fd2e..5ec6b51 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,12 @@ "dependencies": { "@babel/runtime": "^7.16.7", "connect-route": "^0.1.5", + "html5-qrcode": "^2.2.0", "jquery": "^3.6.0", "meteor-node-stubs": "^1.0.0", + "mongodb": "^4.4.1", "svelte": "^3.46.4", + "tinro": "^0.6.12", "ws": "^8.4.2" }, "meteor": { @@ -21,9 +24,25 @@ "client": "client/main.js", "server": "server/main.js" }, - "testModule": "tests/main.js" + "testModule": "tests/main.js", + "nodeModules": { + "recompile": { + "svelte": [ + "legacy" + ] + } + } + }, + "svelte:compiler": { + "extensions": [ + "svelte", + "html" + ], + "hydratable": true, + "css": true }, "devDependencies": { - "chai": "^4.2.0" + "chai": "^4.2.0", + "rollup-plugin-css-only": "^3.1.0" } } diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7e6f5eb5a2f1f1c882d265cf479de25caa925645 GIT binary patch literal 3127 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
*LwA$P@57qKU+gL*zuP0 zCpI2mZXhvkl6yic5Wzb-NN*~3{-UyTl=0U}tiG`AeF8;^PV2+hCc1Z!4Guj7Kk}lh zh-6dqx`ApgnsKkTbMyJrb8zulC~KW;q-L)xmhTs9rAgqhmuqbq*Ym6DrgU!%PzV1Y z11IeCwH^fL=&>MWQuL06I>}LYpzEk88rSF9VG2}T^FhKt1YEI!wN)I(BuuLo#Rx(o zV;Ze=;O(2=;~z^j75>|NXY zNZs#S`E+kQ7K7cxqX&2I83h1sXVUCGRWhhVs_*I@1vaHbxcbu~^Q?$8hNHH>*@vWm z_SjW<0>r+a@l!1#pf5vM=5wW&W>O?nX@q?8s9+v~b$18N;R1o4>NkCW2XbLCNy3lD z?=`CN?f1VhmF8xBpBI8eI=dBFxDq!T=i`XVm5xON+2QKSKT&HeMv$=`1FSf-iDWW> zB>xV`=}Nh`j_(@N8T-Y4z*)vF=MnwwLQ!y+%HZsBedjl>_e2|ecyMl+j2y1KEp_UT zy0z}_iAOd=tA5IeJP8@tLmq<~I9J;aFf4;+05rekAE1d7*^`14JFKlDqy<*fr|D=v zE&Ojjf30(9w;C;`R5)#bTj%{4L_DA~ZOd;5Gm*CUWN=3e^NP9@zx zThJ}-?yhUDe7kceVlpToos-DJj2sHNDoA_m>gqyRznO_~*_&aX8|u6Rd{0Y=^~y{ z-)QgjrMVIxKg3OkqOPOM@q2&nC)`=Nd5P%wG}+^(g^89^e_Xp~|1MAzEQ=TA2fRvR zq++`S_OR!q!)#S=uURpk)2j4TrbTaJz$t76`)qLDY#`rjEKECFr55ps%)fJx1O*g< z=G?z+wm78shb3G$wtzT2hZyL)eT%^tkm{^&lFUaYH6o>d-H-P}-crbx8$G@+0B!od z!Lw0I|0(gJhp)KE0J7R0tAW9R%@!fm0x~E(;Ho_;h}}pVW@Hq)`;^TSLLSl2UWnpi zx5l_9_%k0m+Xl<76sqD+NxY*m6*l|DC+R?87H88mVi=2r-=JThbJ!kq5x7cZt#ko} z(^bDS>2cj3Y zZ8G_MzgVf^k8j~x)D zhc$yJqVDyHt&fNfzj}m8pDAlHol#k9a7^ICZCFc-y{+CTc&FF~$Ab(U{DWFt$&WRM zkbeg@Ci~SG;|W<|1dw7@)=T!0;~s#ZKLa6K;54`36FF?uokv$4=w}Pfg4$m znm=8=`JjUbn4I)S1FULa zhH#yRB@z;+3K;`AKlksg(NpxZl*Vx7$F{X3KO<7l2UUl2Qnhc6(kC)3L+VR)CZ7 zap@hAh6(pqd&W!?Ju20{JFm)Gg=Dsr1hsA)1OPMov19W;V|((??|%J&+1St;q|srd zUYs2T*~Tr`2X{Zaf0d~b?~YsWj!mRA?KSt~PHKKBY3i+fsJmtU{mv9}uxl2jPxMVE zhhZCeYFLm8{_=7-cIoO0+R4RbUhPAKw$o^MR6=fbl~Ce`p#vajmSaY0ulnp!t5G~P zkBiz}arHR2s;=y|qf{!5qc^9j3t%>*hE|SAx=wQt$J`wT15BREPWstPYD)wznpYo! z>5Z((Ws(^j%)d>!0D~Ganmv4G)_i(QR^<=F?LBl5 zB*WW7m;=WyTsuZed+J<;c7C!h5Y=_g%C8@O8MVU6g9hPiNeS*^KPpYDSofTfIB38z z&#>sln#4Anxx$g3XQ_oJuE0&ogPwqnRUqv})f)r{MlTeymbH(D@QKt^piSzMfquKjEgh#Cu7G_>~4mib~# zc_I%Mf=7J3Cs6F*`q|=*)MhNl-?Nk8VeI&((>#Ji2+=bm-|1}*)qX+9!#rk1IBjz0 zMYM7Xyrf;7#OQf|4Q+?Enws3^)sZTPS%PDe!#q4HA&-Gm7s{d_C9?@?7}sV6#?vI@ z8HT0R3t}QtmyGJBFJ?-K%X>OdNd|w2C2BM;6lG7UZE%@@WdEP_Q7Sf=MZGIUOtwmO zH8;eI^KO!>64@N~+6+=;^fpg<+BA_;KiQ~KrQ^tu&l_{r8v&H?a;b^W5!^qAsHvY7 z6UZvRqu;sD3N5efzuZ#SXEKTzO4nc1=T14eet2KAV28-5Q`&}6^t#Vj-(?*-aT?^M zmJ4@^M0Q?r3Y#2Ozg0y`{h%fY$Q343jS&NzB zzc?l}r{cAC_?&}EE{L*>ke6p6&B#m&t7_*@O%Ufx&oK~ZDy<# zd~1s@h1b>CEh&TjUplv{ULC$3`B){wc?^mv6t#$T6+j2;&&fE~8P(v$83#rww-&?+ zjSc-GUGJqRbuQtMpU!@oP4R+kA=xRG#wyCn!fqqs%b@awtaG$fF2}*a;f$gmOHg?w z4I6xNdd^-{SL59cFYwu?Wp_R8{c;y+>AX}eV}-iD(YJIu?~Fu?Dy$kPl0Y^1XHHTW zRdfzfP3OryptS3twFVH&5d`Yw?Cd{5qFTLj5KIs$u>onx!L|_B_iQT4H{6#GjvXUi zmAPylFq2!7R2bH@>V|H#3nT#G&q|#zt3tBJ0B@o}=oLP>wT|AqIQ|c|fi8pa*rJpH zE(0{@;Zjje$nalH<`Bh7nvVl&YU-?54{H0<-MO#royf3>`285kr=iz+A$QBm2f01Z z6G&;~@{i?me7dp4hvKdu4sDh1{M!tKg9XMZO;zRHeV`gnYsWAJIr_D>e(5*JDc?nf zaDxL3q$ijh^wUC0Bs3m(k9FN##9EJnECpLrg5Y5CYHwUlT@~(rU`o}V8LdkuR z?U_?YvQ46xH;n4iw@uT$m}q2cG?jGS*P8>r zAagbwx}AWzI)fu_E{zD)1{g4m}u*-fJYk0dwog^Q)^c>~-)iI=Ue0_d(#2 z*%?rflQq25+LCiHpIC_zX!uxwyfNmtgg-lnJL!dH=P?OAf|1_~O&ClQkV8tHXQ5QQ zdE&L2ML+{#iC`ZA5<-#yZHo>#wklk? zX2sI|wPB48WnU$$2q53*+4JgrZjGId$oaYm^YSR_aux$q@GG5Dw8@Qg6#;L`A4%^r7V*n~-cm2+pHj`BF?)OaB4c!&iZwrR?r@U5mZfSe0!$E3s0zJ>W0s3%Gm+hHX7N-uI#Y~2QnMrT(WtONB=}5L0&oB!9e`tCK z$2gy_Z@7(`q_J&Vjg7`?)L4zVabw$P>|{5#)7VMV*j8iP@AduN&-)+jTst%8oR0>E zauf$r?34(zUZR+b4{=Eiz=XIBVYAJ@Rvgj@&tkrCYD3q5|E8D){vY^~5 z-bZ@T)4vO&_j;q$I(2h`>#jiC6v} zz;b!$E~2O+Y$O{1o|*qSNOP~Vx&4F)d=!{ac}to{`mb?W)6O#y)1tK)TsFR zN?xh?S)&K;d&yf!a%vuj8>yG#zr@FXJFMGbr#T;N-CfI=Q59tuOqjV@?ukrP|KPI2 zDrIp5!+|6&Ex1sE)5Pr1aN*t(2hPc1;Ihl)yZvXJ#f4%7i+2zTP7oTH{zcO$7AILh zPPp)6n^7)lWZMVym99!T0i@&n{5%;(LR|AK9X*zbqfE!=a*P!Ez*`S6fKunL$IR_R z!hSEYIEdA%!=%ng?fL@4HWzIq11GRAck6PM%*oKM#L7R+CHV;Xcz>ygZmjdRHCO20 zrE%=8Z)$=nw<(W%_jz6?*6*hultG3IH1Qx%+aJk3wE-@N6Z{%sU|FW$j=H>TtghNb?1q7$c0oA$+1G9mu}MVZnZ ze$|Le8$DHQHeRlOobcm! zU>5{;&WdS2mwaSod2Y3>Dh{7{lgT}*wYEqe)7^CA5gz&s+b5aheEVc@%U7m!zS@B- z@u{Ku6J@XaIE_+N=70n+5Ema3yLs}DM>-Q=-wk>^c<0pF|B0BPeO~>!3N`{q-vUIsM$7FPvDquRmgUhTbTIfnG5s~3t|XVi(U-&KYe|D$yu;Wyt(s| zkBIWB+yRBs^AlX2^P~LY>MB>|_~<-!QDTTJNQv>;VL5!pN;pGtWB*Jnd!L2=wQ9E* zyL?GvETIP6d9Gwg>v9unOnU+g{nalk(ASj8UDPzN1V3pd&kO)1n$S#tkl|_55YQNL zj-q|(0bV-~uR}H9_{q8Cf>aWttHbaszppS>Qb$|gP9}?64lx8iIGOsRDzG?HK{bpE z524u6xpFwOCqT27kf0_oH>LW9=2Yd<4FQ$~Ae z-!daK($fTp2R4wzUr6G<*%LF|Z$V2q+C8>eoi<5X;h|&hWOW|6v`?g=(Hfu^EhZEF zJ9mx{`_`+ej3Ljk@eUP#zpL;JCmwLRPIkg8&@IY-&jow=C1#hJ7ql$C*(qq7ZvcU? ztLd!nalN8yP9Lh`N@MIKoR!@4Nz7TXXysyAC1W98PKA+1 zP1wMwm%MK8cZC84el?kEzys{}ATppE%4LW7riMs>4GH(oVM@S33?t_*Gx#0nW0SgS zOn6X7dW52;+o>so7P4#Pr_5@ITt4)Z95tKcXvK&P1_ko=lQ2nigkC(=;b`YG3KB|G z#N!_*Pyfkq(Z$)@{xey-?|tPsC(fn*D(BQ&;$9cJy{-w}%&hPW%|gn=-k@XAW|@rT z?i@R9197Qz^8kr=gD9SlY9%X&$ZjzZJB-@pM(@90C$I3v&17!7zm(pw^-yENB#=&^kae0d^GoNPza-6HF+00k zTuQ18=m7t-{k&x?V5J{TlmEF8&GUxb6Cm8D&AT=HmG$5~bjtWjHj_+NHn)?RQ$CKi z5jiQFXQC9P6=I{%B267yoqeLs_!EI($YMOIEMsmkMf7Nt%0E#*F}PNSI&)u_AF{ zCJ4UQQ5(HpT`zg1qgXrXzQ@X)2w}0&mj;U;xY`ay&TI~oKhC z`m}FtK8RV5rH(Bx=x>}~i={%Ml=(4K2K1S*%`nA{o1X66UggSJt9)5#0<1&#f`zr7 zYZt{ZR~*8Y-3gBn(r-(w=vkEelyH{ zrd0**($@H(4^GdmMq(keMc_HbE~shQ0<@j5IG`MBS-_;oH#sgyN5>*d6vZjI zgW74rop_1R5TyMJt!?+~H-AMCN891R9|0LUlV^Z7JyJL-cczekAnlLL9YKsqt;}uv zEv$kNS)P>Zav4jL7F~lwsTgvA4s&2nR~M6>aRVlmt5v0tfN7Huqu>n2Tq#s-3WkBW z(hn@IZ@Wbw*+28at^gqU30V~=K21n$AcHATE}VarIH$0t)0x|w2AClG_@b0IGh;;{ z^4S8!Ws2A7FJ~y`%*8scp6_SS9{ZK zMXk2cmLq1wg_T$JNkK0U$*04JU(y6Y$#SVaz*-3oPE!?qXRW(~ZMF$^ZHY_;uqcv5 zkLxEyG;SZg?$3`r*M|d)t^c`~PhzvVo;Cs$xm1}}eZY@-L1u(D%TUQY6Oo^?ElRRS z)AfqWEK2xs#wp`YN?SrT%zLvPT%}5_+q0q>Oyjqk)iSIb|i*F@xVg~>G zcJ+pI;t)~mpAm$K$Q6>KBFrE>dbmM)S|wzFKV1sYvw)1mP_A$8SC4}J0HHa1QnS}9P{}P9Av|1P7gDxoT^^W|s3F-|zXDWrQP`DYTzZQ&Yxx!| z6YKnk8?I)T4lHON=uF`_lVi?9MXwt4l4*;NN);Jps)W%qGZoV)Jb+f_TweP`J9lG9 zA-iq~S>j9pC=P-g+8s6lmzq30rxH2S2XzjqFseQY1|$m&o+q{r62iH-Ym0l!A;HU7 z`lq+?xx9m&EDZ+c9H?aRQ4hpmr!MTWG6Yf@vaD3*%E_bOe@{! zSn-=V>I<)wog9I@cQ`wAxeupCO#8~%{g06uPwSZ>xFd7)`LpUwr8EkqoQ&;Dg=0~x z7XeKyNVtNq4Un1wQ7(NFEK@qgIK~po1db4fBrNpDgDaPhLzuh8>`b^TTzE)8@9!tv z_47FN3_4cV-QoD@?faiJXavf{J^X;!ShougMUDCiT~%e-!)1m`Ud!-}>RX}w$|wD; zHmVn)5mE7Kk8;8G*kJ~ZFFB3zEp!KR^N;o_7~$G6czfr$KY@*i+>d~aQ%GB~%#oFZ zRj5N-qMa39Bx}81_9U0I)i7XZvrA7LN8LY9Gd`L$UY|$N0F8)6m;iCIo)OQ7FZ}^$ zztQ5rU>phJ>$`ICci@1ql>I`b#;9tARWX|A79Vb@FcJ?1rK3q zQhIm4>1^G4z%phF=4!IkVp{O6+A&D8+o0pmGg!|s8d0PNd0F<#cHOO(tJ6_g+F6b$ z#p!$x&Kn^qY}~nvrusKMDj%*Fy!-E+A!O%ERlXvxI>2q&k_`@vmasr4GFlKYGg;$O z87JzLr5F9l^4O=d)TKO*`YalW%4u%2R0_tz)SC0Kl+2k|%hZHddvPAxZ8H{}!F?NN zLPEJ-42a2-1m;rDv~n$O8@=f~U{EhUx|V^N%30Du2BfM)B0r-uu4*#K5J$Q?NzMuk z1xW4eaq<)`FvszeaJSYOZP|twB8mItQ#{v@lR$ARIbGN@?=dx@9 zjH8=|vKpGXkYth(7qqwJ;NO2!=|#bHK&VGoR?hA!h*&}7z=g8ywXg{`6dTYdEm~#9 zE%%j%1`$x+;KzRTVh12*QCV6Dxth-H4_;P!sapjVFPfiLiESo5-EnI3O+R?X+98FD zIjnO`P(&`h(*xS0Zcm9BfPBF7d|qO4Y5nKRxpiY{N-#YI0U`QMdT6hpyenni=T;0Y zrQC@jy)`G;9laKI)!F`hkj4i6?se0VK*uXO9v(r_jy`7w83PfL1f(33w`|=^n08SA zZj>tczse7PBx0igQM=fjf;KT5@-lvGEU0!6{lzpNm`&`~8~hz@-z8^voNWs1Vr=^d zHeyycv5NS2aGcN3KM6e9nHF?JMI>i3z3bk_@U!dQxb^tu`hq5;M3rp0`;v8D7S;8C zmpF_Pd)hqKgEcuEf9C#trvK~_@m1wpsP^XMe~|V^sqCyk1*??(E(UtZV?_>YP#cZ? za2A(r`k}RGpE#%8?(@Km!Ji-Wdfyk=7d7tJHznfazLQ8>oE*sX;;KNHm{OZ0_vjNL z*o~!g!Sql&>B9Fh7Qkg@ey*H99VxYqwRU?Ok2lUH43g9+D5)zcT4~UD=X2Yp!)AGA zq6t5`@+8OF4C9}p!$PcKj>Zftl;C!=qLZX)=$Sj#idfj1Kh13G6!A6+xBMBIc@m6J zOZL|aE8?#?sd(xe!#5YPw!iYhmIaYmKDupe-2WJB3BQzdk$b zw{+6#v5Na_p+q{$l<3)J+cT1RvdFS=Uhwqn|Z%%J{d{$;b)SZHxqODt==|2`If&Q-S;2} zTugsICj^l67-{UkeJ595Af;xeRgfLx>}d5Sd^_xV`ykwTQ)*Y|t|d_#Rkm?%QRn*; zIzkOHgMhhn^n_0nxy|yt+oKa$qL2G3+CVw|JUTqg6SRQgiP>(H#WVFY6K0nxC?$xd_lF$f>p$1 z_|?=i9&6!uiTmX?!fLF!w$$RLcNQ+1I2EL;I>#7|3r-wPz^Omiy7a`yk77OwwiiugD#@W5jG%AkZ z=H(LQ%CQ0@Ugxh@(5mzgOSHLts2dNs|M4Y(-)etkDrsrP7me-QvFUbs_k0&;=5~{D zEhzC8W(}38`E2R9WWg*pYqaqp&PGRw#m$Y3Hl)t6O>fh2xI{6?m}27PI=r9UOepJL4V5iWf1~U%v^;Geew{DydGFG;1 zn*RQ#e#|Ym8HM>~)9Z>jK=z>bE&tECkd?q(yjrc+N- zQX&ozdB4l;Ih&sBr1?(X7w}7XO1NBz&re{y5{NkPW&+H`n%vb$NSY>CwpODq^ z<$Uq*F%TwO?30p>&PPm~zW-fxG~iJjqj!NW^Q!=|+8kmL5_}vjCZ}=+R`%2WhxMkQ z^;pdIVX@jYy1@#GmkSshZzu;xMN58^b6PsB^2j1AJmTnD7I5`bZ&kg_ugqu)JzV^O z>AV)QR{@Y;_~64B8$ORb($1$(h5=nKsD2-5m53?rZ9A^#t0jxAm}9fEs0etl5teOo zS#=9cm~m1DIbkY#GyOe{4{J-XWy>yP{xnYQGJ;r8v47ZKJ=$#eIP5)+PdHDzD zsA-m2Yp|+Zfc=e}slaiM9dSRs$*%v~ZOj**SHwW$Gx7;|6+QN_bsM-vVVShh5U&Z@ z98jni$*b(mQRjeRha+OpsdCYGUP zvVGfq`<1BzIk0ddg}6e>Qbj}Cn`h|4*Rq}L#L$WJki`c!1t9?hpFVW_wB8U5d_DP!~2z%FQ zFwxqiphRM)tSfc=hn-YT!I*FA20=mg9gHeobKU<C8ailUK;P`ofZ~!DrMdEoD|*^D}m)5?#-w);3yt`jh+i& zLf)p^TFKDoA;8U`lZQy+naVirNh83wT^VlmWxy+FWN`!S-{c`kjMpUgSWn2+in5|2 z(b>i!8L12^(OONtu>i_tg9?o>VBObgDcMGL#yX4FRgY>QGvM|C9Jk?63U7u9pR_Xs zQTO|#VO$d4`1vQn83KZ-$Dc%tnKZJ|Ek{v9Wm3lz;<(~6ye@-g>84ki62+NAEJ2T( z?pe>Os>(Cfxw3(S@Xph_d7O4b1N(rCRhZFkc0 zePz=Hd48=$$3zf?tXO>)%Zf$8%Z;AXNacnqQ<7~p;*o=+COCtc1LO5I!5!^9mw;O(XNo1-^tYMJD^ex@9gx&<7X=h*sQ_*>FFqF9x)~ygHZ59=~IUg zr-Pi*`Q~wk`Omj?v6w26ioD98%Uae)b+61v-$mTdp{uIN9Q#eh9~Flmq_lXQJJ+%A z+`glD5=D&&gi&R?>Y=^0z&yiB&v@Di11r!mo)}a-`draqio~lPbUu0THF_(6&7oVU z5F_8Jd1O_|%m(pnR2c@GJx!964qr+Uw;RNg`^hQ&_mLOi<2YcE zF8rZ_9se!UgwEgakEfVHQwS2BtSGlrZRbz{g!lUi#4f~qxc6|!M+N8?hRr2fQAIHJ9&0toP@krlHu0`bzE zqt{m=NAx}y&}jp&FCej85coJ8$xHIs$>1wg%qx_43B}VcXnrAs>RB^ku5_!!Q$HW^b z_i1YD>v6mEFqQrxS!Ke<3QS(U=`eh2GN$uSf`I#xdOfG2xd!^x`liI#quRecyxfgJ z8LTr%cxCc&fDaGVGPz+8!_JN(ba|Mo-!)s2+|SnMUtaT}`%D(0zAT#Sfg(47<@&1@m1cEFK!eKCHj}Z+ z5iC!*V?o9djpTce{0wH%x;N{##&O5Hl9rm3Y6!re8HHCKv>3ck=;Mb&llUv`q=m7I z=?^bGm%d%u*Ta@taL&VbT|>3opM0>EuvD{PJdxY=>}OZM{o|`%0B~5dTLIR#|3}aZ zBQo;{ONJz_L+_S-Wc1H2*G;gO0=Y7~s=8tIo$Zl~lLe>tTo_bCk8P?CpnZSz5k9zD zRIaSVE(mO+sTV9$+zS_tu4GDOle=8?I1ZK3nfCt=6gw~1$o_?&%hTT&HN;o^@ft=W zQO5J?Wn~ZC4N-?^rgM9sxm4c2t^jMdH}I(5lDV z_@&{p*oj|q5MwXhbpC2>4!YVuFtcE%^iy=h$0yFGhya=*`t3&tAMB>)(Xv@E3q-!L zH$u||{@lsd1!?fB+lT zYiw;3^{PUOw?Dh*auM)@*nlFwzXaVfVxVM1apTafup<=aJSwKCxcAmB|MhQENhPmo zkC*8s{@33-c#i*TB&DLK0*nT!e3mz#>m8wH>cp}yC3S&fJ3tK-Tgxdhn+~Wg?_VGA zmy=YteUAe?n!`o238XR^Rh3_~vbp8qGy)77OZCjX`gdp14^9{MBg=xhe4du@FCN?T zO1}B*UM^B%^3oin6XgcK4X=A70UjSTgnK-t9H60!kl1NE4=R%9PBP{{JKT*Z1PfZ! z8|m8)0d-sZ{#sLlh4yBNz|1dmQdr5t6cwgRgsj0h?976dwn}Y*WQ+$hqwBaIniL!4 ztc`ko=^-)O*LSN8jL!|f zWitG#j91At(OgAAmK3-CkBP`ofb98Ili_2DSATvj{8U~yA@=2XYUfGsCM6yW+~JM~ z!)Y{)1;pE#p+UxJIfC@Rl?{VBmr#7xIyPMi2@{RHx5NKQs?O2LgOtaTTS&@7L^gvW zMiBaP>pSbLWnbGQ$PZkWB#ITGLc|RY%AZFBsukeT)K3ysG7IXi0a|9Z5n*sg3DPJq z7mXA{w;}TT}d_?X=u0DbGGXgewoYHaaGy*0s?cBq*-_$dzI7l%Rk@pJcL7F|Dq< zjz|5P2J{|d^onrR@pExX6d6V5tjNn*FrBp7aFR-&YVT91g364JWLJbI@hgm`5pr76kwSbEVK48Ko3v}kfzqPmv zqPWM{$uY10({>gYGo%1onlQTp&yStDNdP4d_jJ@-mtlVV$GM}+FwHn3+^}Tubm0jX zLG#(_bZ08|va~GW=^`1sI;_6n-_j+~ZHM)3pDJy3rM;uaf+D6h{h>AcKgcyOS4Gq` z9bYICG{1bO7>KU3*tb;)GoS3kg=MDlP6y}?dKmI)PIIxT@hqD_)%t`Z% zuLO#ih-7k|=9pdz=7Q(#;&^g>${_W(3Y178fQMV~vvZ?R22qxE;@-fL?eefh-%nn^ zyM&FP10Frjbfl!S7W0-93q^(h$0PtOyI^;3%kNu2P(jnf2Ckc^7KwW53%i#xqpcLB zwzaEc`l6CZRrZ}}87#6zP8sKHO~AnN@2f>)u2tOz&&{J!vzI{&#-yO+Dx*vq;zHuZ z{du6bum6Hdv5ol30RE9OC$}Z^%uW`@b`)=Fo;m4IroUV~9=xVPnz<5zYLMO>AIO@t z-_Ag!a53}e7g7VC8t`*Kl~QWec`A2Q{DumoqMUnK)$HlASa~bV;YEH1Xy+_7GPmn} zU;jSW715W8=K5;3hiQax*?s+xEBFOgsKa=8zY%>yI5%!2Ac#Rb+G4qooliM+h%pgz zikvuqFfeD6di(9RvNjsk{SH^ESE-w=;C4=a=YbY zhTk@n?$0*nUeL$THL)>O_sDj zw4I1})pqZCS9mA_jHVr+@=L*QEGf2g&1`=U`<@xS7Wt@t?gzW+a$E`lUWT3E;~4Up&cciOuNR*{Nkbt3{n7P&Xoi_9TM)}GTulF8 z?<^VJ6M)v7m#wnp`RhU`B{898c(at;$_9mYHPz@oxt^YlrkqWd^^&~a;hJ-SLW7#Q z`n$@tG0;FlqW*BG5AWrtu?CJ6Mh7ca+jo!KG^|Z2TJ_OeE!2+eRe4>=1U|&pKAni1BB*_hTf@B4#Qp?R0Nh{T3%arC+kC<zE( zk5A|UOhkZD)6+~Og7vQ-DyG;G`F|0To(1tFa469uqsHaEduKX4E|Dt`zvpvHwFvFj z$wL-66-AO{_crTMyZrl8o5jjgw`2BnFWz4^9J&eLU&Ai$l-C0QK@1Y9{?mWSiq%nE z*tG8wsvb8+8oy^n>8&EWi`25k+ihH@s{K>?Rb)^|07FqSSLKJ18JU((Stxb;lO^!k zg8WwBGn1+Bebk9&&N>|$#yY3Yo_vH>rQSih`yp@hMzP|JrCBz7gKBPQDsqN~oirGU z6`OZ!0?Yg8#=b}Arw$KZIHsgy6St?Emu^=9<~65g+w~a{+6EP=a|V|Wj_o@HdRKEF z0OBFNs8nvH`|n)^wp-qko=h~2Kpl2BHiX+Cna#3>&5Bxq!Fjcysdqnz2b5pR#PM|w zpLPva&o=n})8tE0tg?p-lYwSH(YA}&cvwVJw>U@#yV`!LVJ6Ls^-^O;?lmCYp>2C(m-NG-vfm6i8g~od z0Rrw0QS9=KMn5bi6}U7$tFJGkZ=Ip-I-@@LbD}9V3urQ6{i$J{8tBj#^rKQ1i@Cx= zP_vq_p+fME4JMcu&0IzD0zTheMKTw?wOD&pAWQyV+4>x5z!#k~_J`{Mo!5*knf$bN z&Fovc1ye?zjPl($&FPU8xQ;G<&_zm$F?+Vdc3#{Rf}9=lI%SLY^F7Rh#=IM`vGn6; zd`x3Uuu<#x(Bs^7|MK@XgvDy)a|Vu+b=GkCGlzXC?P_gJfyf4tvZW|^hHPo z){nKxR5{c->p3n1bQWNR3cUon*_(96`+Zs{hOEgi)%4kwreq4k_ zSdg+hZ=hx4Cpw)p_HSeE$O)~y`X!ULuHT88YtS~zWh{q?H-n*n_fP7}ukX*%ii71)g+2YP)&C&6N?DCl)feaBl z@jrdR7aSD^>`WSyM0u`#N8a!f#f5pz|Ga1;+zQ2NCXbC!Ns_08#~hN}V;4^yXhK}Q z`gbuQ^pa7#+f}o3?c_hLDU2f#mr{eBavL9BhnMPctxvT3`jvY-_RCI|9%=5FMug3Z ziSZzt#AYp%QUS#We}XcO6@nQ6>fN-XtrL&Yvkm zTj>ZyBCHIrg7g6T`njk+f$}299Y_Y;FziHRL|u5ajQ0naXMxr4$!IwYvqH2)!TuAL7{oCEJoShdIV#* zy}%6AB$Z5x$N`QbHSOUaPBl{D$s>D++d@glghpzaDwu<)q=72#qUxB5feXjQRXM)7 zq+nX*!0Iv2Z_Q&nAu=UlGDwEe7KBkcoZ}AXwi5X&9u?xuDHU;1GRtP9`olb*cW2#u zL_e%%pZ&^pPmTw}$3bdsz6`G4K0>#R1+t5)HjZ$xDbWvF&PD3XS+%Oy`H=Qgg#*wz z+jV0S8|Z}W23hhU)Svm;$(@BBYm)J(pf`^4r{}t4FIK=0BLy1_y8H^x-o~J!YAkz& zI3YqUz@S99$l{D_+mNjKDkoK7QHVx;^3`DwZx@Ow1kmMl;8OPCenzAz`HIO|>Lx=6gJc zJ-bD;vs@*!yu5_p-RH%L_zBT_i=U%y_F$izbc z(&EQjx+1&57-tFWzZb(+^8;*B)mXRFEvFj)9N4Ui- zH-_WEp!8t zj0yc@d~$vsjwJnu^?}aW-9cQjx836ym|au5XY{Ge!#^L8;zxPr2D6c4H-&u3WAvlL z2#(kZ+wA8|Vj~jxzyg8hRqs<@k)WWN;w}*5k3G_gHY32Of~_nng=yflF^#5iS!LDS zx2Q(o-u)S63vPwGI~hY9vxfy9GGLZVWJS#A#$AE}kac)C+4dNNMa#6jK$vas`6i(p z>zrCg@rq|8dhJt+1}GASpnjvRE2 zV$J1;5+W(=qp$poFFsuf;lcC_>h()dv zn=gV$-#^%Iw0{eM4JA->uJLcnvKtw3HB05Wc?`~pUixG=eMUtOn=W;wEeVCF#`V$4x7s$ZowsL}%0 zF4_ABvMksR6ZYb7?hE;+PePWu=`XC9w$G3JAR{hjE&}p4p4m1Hb!PF0>qz-0E>iw&II8&q zJM^*{6n3i-V75D|O`Ja6M6EmI);o>JXAyDO`Ik2^A>f?5Gdif6Rc;>i&NVXQwr>dwY$M@Q%| z*_rM{yxU{GNrY&HvAL-xM5G3(6qHAfy#Z-r3ilm1|EC3^O6rH->Fs19I?y*#wLm-OWIB2zxlNwyJxrjIJckeMnWT)wDVB^`zs7a zQn0ABl4_bVwvkP%#+R{*#f@bb_d9_O!;3};BZN!lDtn=nsj^Yq(VAekX~D?LDmVO638YM_YuDSLg!P|>=YJtowK z^3<7nM*B1pWE86)o9o0r4AOB!$VqBp$X2MSGt`O0nkN5moRX9Lefw7zImPMR_kyIN zs}W|xLuFHHHjGG_Kkm!C#>vxZ;JAId=Jxz$ ztRZRl=C?&~$wh}LC1BLVbNi5_k4%g=fAea*<%LQjyor;FG?_wLolt3)AUOc7B-p)Y zX~~l=uz`gb^-U=V7uov{Uqep=jdx-Y)`ClIfKY4RekV$^Y2Ck*vV=g5TKJMzF*z#5 zfiL!`#I`!+evQKkw63vsmLWxMPTJ<;U@Ov^;~J(Bv~w1ab>UzRo4tM+-i?iANxzE9$!J*7e?5-!gw02U=6%V8y68k@4P z1g-2tuSS)~n`Dq8g<66_-@Rd+f)F5(s;I0ItIdmBoRrHlL0b8W5Ub*&4VrSWsfVD} z=uBg6l+G-*WWT=oPv$)BSC=nz)|@`M=zao4ZnVElnQf}n{cDg=_WS;u`#Q7cjShja zcUh0=QZiZdTtGgg_xG-`)HgOqiMnGEVQDZpVXH~;6!frUz zpP_~uZJX;$4%_8m2!e;~*u6E4yAI8sC1&Y6{vk0;fc!}efd~uu*;Dcw0kzB&W>wGYtmzuaV1^7==HAR`N7-G%bckaY*?a9z4^{W~i zu~n(MtQ>o zEZ??hmx9fwlhyXO@l<`4)oi-9OYOka1^SvYz zi0@37i`bw};2LF|h0v}-pAsa8OY~7r5}$$Xk;s7$Jhq2n`ki7c=8~ay113o9@(ANC z7WeJ%sasU8RBwfZG<^8_8$1%y;qmiQG(QyD7%>XB?h zeCIWO;=CSMhy;pw+#R!lWDJ?KQ~Llwb;Jcjjv;ALfmr0@`O8%S{dqn{64n&? zZM~erw@NwH>B-}|+%dX1fhfeKp7p`kx@D;@D1zm1EX0r(l5gMX1#<>rlEw~Uat*td zv3C5-zYL<8Bb2%zatFJPR*U5y-#?S{b0G5Auk8|kAnxX?#X!Y2O#$F2$Mb(3nofJo z%XhqmTYyiX;Q8t2X8eW0+?GUt*mM2!cT$dNgwSdouRHX^qi<0mp&m-Fbw!6^g#h>m=_~C z61Px`aBLiIA82xge*>XnK(t%W@-jin9t%zs!1sxkzEElZTA8u>t~Z1DM?JG3!{KNc z>%R>M-gwyOaY+JWC(BWLJZs5cj98E!R+sl7Bsj)dZwp|dNZ6`(Sr8-^U>DPsNnVNv z5~UQ#)a1!=p&PK;x}Cqt<8*Le zb-bF4{Sq+5vp*8jD+P2=Dd`2z{juLwG&=4v+a)Um1x_eW`Uj193AriPpwgZ zuI<-5Kfd4QcA~~Vp!WY}-rb@fT-@aWeRt#UUB9DZJg$uiLG_sSUdLO{pcw65bsNOMl>fMt%_#L3E zjeb~Ax7DZ;Y^YBJ*O6trSmm4`4@Mzw$Nsq{rwVL8b{>Y>Nh1;X^3kU+0X(8Jx`#of zCObCv8;G8I)I;G&k2aCYBDb@E0xfT>paStGxa-L2HPGii7c4Ii`|lJCk}*(&1d?AE z%XD1rhL@MgiQr2qlo=xmbONyKLY-QfFkF(QDP68{i5Ee%-0@ZIJfGLIf9cK$Kkk~2ZwPUK@OY61PShrH6-@jRvOLwLUmz!iiAG_D{V&xP%QK*B!(vJHm^sF0TOt z{VXcyl&dA0+YK$RI>wcf{4kVtN+Mi8-xsIfpaH9TpZ`8o_q1rZ+G=ds7)?@RC&!`j zv$jv-mud(Kb1*d!Y~;!l;tyK;&F1EUMZ~gKv^rYmnx3A(#*BqnpzE6e1)Dk4{Qy2V zi@8)7`a0Yar>S=>@^pf!whT8{f$Qu2@tf7Fq(CA>EZ51s#nKkZv#s4uF_J%o{rL3C zpLH`x#t-HR?wQQf5^E56NVryQsQ-9ZOR0DF57nyN>ikQVUJ{HdbjNF*osBfE4^!~)Nc+tOUh9beRLr=bP0#G)clNOK9F>z_*gB)rA{VJ69di7ZV$tp4`SX2?T&<^69XWFe>nH6cB>3?H?OOd33|XYMI#Ep8)&} zknetN`!`0OF4rUSdQIr~zU8xafA!M`?dlV@-`iw90(i(0(ym7JwNJ=60gspnA1h+& z|KsYLqAU5LH)Gqjjn0j2+qP{x>9}L7W1Ah@?AW%APUimRKQj;WR4;ekwdz#W+27vh zLzL+O87+_VC(96U(aLX|dcgfraDNJE_Ce>>c8_e<*mCYo&bC;p%}$_{Z55)pb@JeU z5g~K8GOC5)2dh-TWKKmev8|GeW|6^eZPf_2(xNRR6Y*PBxZC^MO8Q7rzJ9*sTldUD z9JoS*X9NHZ5KdlVt3*gi^)d=zq*2_C1fl=P2xA%3t&!1k8UDRp!nYU&U`})v^fBox zc`Mr8+>HNKR%qZhyorp@PQXhl4bywfPU|1(f;ekz7{Xpd0yh63aBRi2+=+J2xJmFE z2uD}kqPGTI!BfggHRYf#fg8e9p%jwv181i}LiO;Q*VJZ`RH@4T`Ke2osuMA_BT^X- zc6LAERPkUI;ef_*q%VljgDg+qO)pe)&iW^ryU2gz=?W_AQ9w9@cxe;KD25v;bVbIa z*zKw82dHau&WcAFD7U0bue5G6hxn5-kz!n378FLTRf(#axCn*Eo!O$cs8Z3_8VF2(@80)UPZydfod%wTicItpS zbBp%lm>J=zn}Cy#oq0-YHI_Lj{@krOy8V5>Ho~IZ`qHw<)rOzNGzL=9`{BR~@AIWm z)I8&#*7_l@ zOt-==!AWOHWSJ~b#sA=^xlb{ZZZazVKF$hzH&*Fk+ntL>Devw!?(4!ADU=knm;hNc)5X8ot^;wi6}GL%5b_Pxa_$hxH(nl z=)>(+`3;hV!URc_&f~!EI8AxgOgK>KO*tlb;)H))r5_~T>l@ur7D-KVfv8kFn^Pyt z&voIpD|Kf&$ZkcWEZ73Q`IJ2T2FPA__uiQFB5@)W?I2~_+%=QkX|RL7(2%yBzN@X6 zVE8L3xQi~E?+ZK2UM4_QEHAX&F?=n~pV=HWHb>)#hPMt}Wh@SFs$ zmW$;Izl;2CwnL05zooxrcTdPsPo}LCTD3H6VY>n@)pxzx1^y|}%k(0uP7O<^N~+hx z1N(iuurv4-*kY*WPaVFTrg0kY(XU4b3ty7N0@~KSWQp#_S!Qbm zyy2v>L?)|;n5sZeyB+Tv-kO>&het1t#kg%LBa!kK#WU;!wpq%b1FZ9eS6GAx<$%-} zwnE&U#JQzOj$Wu7&iWfzQoN-+6u6Uxaoc1!<=VlIn<`>x-d6iE#MLnV&q%@Nu>x^> zdR2ST8AyY;3`%t-tWg9SWVC##Pkku&!xNCx6T-+BZ$#!&Ia&7=h@_@ecFo?)PVUjp z;{!_ZtcZ6qiH=iz<5?tbE5F-m!eU^X1EHRi6g(33fWr=hrYDC`5;Fwzu*G`(2M51p zdswhKnPHm_9B#70M{*jqj-u1|z%}-Oy>w8bFM|$?Ix}tnlSGlxPMSpd{JCBG<;4g4 zl@2Ym1g`3LwFXvp-pJT6Ml~ab(O1>=Cv*O|a0LpOqmTe_!jzMD?I8W4Vu$YLZf|XE zj9Dq8UWxOOKyfOZ+|Qy`GY6$4*a!0Ay6vEwg=}I-*Bs%kU& zK$40!XbB-z^g4SpbS0y@%vw{!Bl7y_5-7n9+PWCF_tFfy+ z0(DL_$P@$@$q!@V(iBr7?9Phjm4OSq%!>|;WaCpjye(Do%4fd+mJvs5mtxfSGCBqQ z6}#aAH`46g$j$hW{#Ge;tY&CL77o#_NZ5=Y74f8z&*&xB=e*L|jn3e%He#je$rnXR zNMC#Uh}g#C(BFx-wkBJnXZ&Z|WHT@xp-=Uj~G$;Qs~b66Gf@Hm8`@_ z4ZG}hmm~>}ivv=FD@E>29k#tA>jP3@gMgDb(LcmtN-V`42o;Zf`1FsP!w+eWvz$9T z{b+qUs0hu%KM2f6G~s8x+=S<_8{K<{!juHPuH?6FHhLWx@n^MQqRvY}RB+E>{| zdu+-a)1OGa?1A>=S6K$PzWnjUcAmlNA6w>jy>)2^x9RWYNl7hF&p#lryEk#YzqRjH zjvqudn`6@X5WT<{f^9Sj0sIF3Ggw6BkVChTmP&4sFAzoE?gNk;hn*lV6Sb5tyZEi+MUXI@(u&WJBvzAixx%o*P~KaA#N_DVW;mf#~( z7*cG|#0qt=s}qB)Gb$Ct5r$0W@1j-PMj;93QL3o6+RYiOsIJVv91_C%u8ydiSQfhq z@of`)ArqtbKt2PI@#|6&WQSMMML}M@qe%IGDU@PXDOg%q5-uhT{WbLyTJeju?6e-F z(ht~~sC`pu_j6B@$16$Yd+Ow$TU-Lqi(o-!WUN7XY}sfuEIn4az1DqKd`RH``e`L+ z;-{gLn&p*X)8c(+NuSDA%x(>IVveZPpO@`FKo!^&QJJY>*=8r6G2}s3fF7B^9OO;~ z%IO|T<%Q-kDBK#SrGoc;oDQvW$fXiohNu)&GMr$?W!$1x7Qs_Ye!<6_x#x1d{BSqPR$AJKHjx8hM}3^MiwCW ztQ;}SOO#|gg9yCvdIx=uPt%_dHi{j+aJ#Wu`q(F;gC)jT%fg!)^D6=~#DB%H)5Hx1 zb{}W;Gps#NGRQpjYAEZgw%@2-{!T(sv84h{6rZ^_aE+rp%?U0_u5Pv{Teb(|K9j6j zGBo-pOf2#$kxiTb=)lyzjKClNMUO4Lhu)8MPx}(KBk<)L$KEH;+o=415RWxys)A`c z`g4R=A(@Al(U(^OZOD8~$SGCJlzE91^3)r6n$ko_H zFGr0IHq&}clW0+lj3ba?Bi?Y*IvfpJOF|5!7?tw8Jk8XZ+1c5~$56hrur5k;Q3)q{ zq{t^TdBKFdp0qulf!{nZ?6Yvmq$)VkdmludH=KO}K>ms!v&-QjiDmNAm#v2i@#mH0 zoykOG>ws2=7Qw*;@5GvB@oEUI7GZ$g%Cji;KO0y5$G6M1_9SK+3}k+AJTwV-Bamyt zfU$-Ss2^1Nm2u4Ux8kjklnT?(9y6j-Bsg{12u@B`QP}9Uvucs7EE$0ZBDW#y!jq}e zGZgyd@^M-irkmZ)N(qzgf@yo@Av`+b_CB7A;j<-7Be26VM#K&Dz-(sS&H8wBj_|AJ zLVMJfZ1AF`QkNiS6@94ogGo{gkv#xFFIbNvSy~dM3^a4Cj&=EXxu3DK3v7w}>M;HWB9Se`Og`4YF1IP^*gh zC2hG&?brqWFvVpH)#>ZAYf0oSb?aZl^zQdEdE7XMWo4?q?z4>zyC~8CBa2ok#=m!G zqGxB!Vf_P59rL~j)p91kgcm=v-RmxiZXct;bi?EIZbPsz&Wa`D?j0IXIRir{u}8#; z*DyvzFv%4Qr*_?^=jzvRSgOzafVG&xgS1axF~6SA(hJ z1tFbZz*wlmwhKZRI@6qJWlk~bB<2!HCMOFfzC8QzaGoBEm>-L!oE))3+Ei??AeCLX zp|~R6U5i85**&uy(T+P`6NJ7(-nOp?y{sq-+rwo=a3pTSIchq!Qot@^J%xfnqw<&h z5oU!#qL}c?N^2`%qZPh#h|j@#W!?SXg^}ntlt0fqvSE`r7)^=LJ%%V6LrQeL?+W;N zzP2pA7;jo!0iJiXvjX@wfF|X>bjh)>z0czJ=yw_x7D@hO69jEMX^#@_*_+*>lxnQ) z`{@C362XnnpN^tQK{`d{in9l6)sK4EDjE1{y5-nI)d19%ijAuXr9U1mXK~pp@-fJ= zcyw$?sil^dyCYAw^$y+l9o`qqSGU&{uoecDb0YwhH@Tisi6vpMlb_*}#DG;OKO}nq z(ByZCx5xq2`SLoOs~8xY(gY$@67F>})-dlc^xY#LQY6 z#1~hwXT%lqSS6|?VDaTIqPcb#8kreHh{*8YO?(l4g+lZxvdSxw+oq)JKMtWBIRRZ zLaAmy;k+|?W32H8x2Ql#A)8&!WDkMX>orCeR;zIJAlji40iTS0RvR(+d+NmhcnVh? zxMKr>)$P|BdvgP#Skr)&QU)A`KrCLaZ*Yg;daxBfIV@mJML$eqbHfr|DaUeofB&3= zqrDa$YubH&#bj1y?KQtHu{0;nG3@<~X@xYIk5KK6S1X_jxKlt;D#$~m58FYy{nB3v zy1&rsF3wKYOQ`C~Uj^aO7Q98sDX>ZY3!$0MdfnE;umI&!a;%}2z5ENLlILhcY|8gD z0O7a&@T+psCY99Lepw~5=Gigf1Uw~;Su~1OdOm{nL7$ISlSiC?TxU4kjRk%%(q zrNxxdlrrg3Io4s*v~nLZ0#e`1hbPPmZfXu*vgbG`TK;PMPmS~#*~g^;)jT#e>~uLw znTueGx(pqxorg(;7t)BTmD>7$@nEZiFdgmA7g%Ns)>fLRh8~m0j450kIEC>fo0(aK zh{lS=?cJYRO;^y(kSz16EuopdnUhVe=yRS{nNo}*l&R(`m%|48QwEgJ)i|?3MD>yQ z?ck!VC>+Arqq0NX1}435OyVe52QhYW8tV{4#$j{5h*1m(^-W7uc=1{{FuK#L(?s28h*|BUPd9u z1dPC7`;R-1Cbhsb7;ktP|M?}7)o2UN4*iqXjFtMA61dk=tfb z)F_Y4U2eq0H3NyzAeOgqY9q3BSU9wC`Ko9J8b&R50#Ubq{EuEW4gRet+3g0kvx;e!l8*9+v7EUQa z9l+L~RCJT;mq005$9hA`9X&*2FfAcq>&LfDZAuK9AekXGl2I*XqH@|ZK(4iiaGTswW5RNeF|R~%xm;sK zzgi1Z$j8O-`WFoXZA`(;y3i**Qe#HZqYa+1}EP?}^8o{95J83zxw^1X5vUx8r4ftu{}RM0=!Rrj zwpLg^f#O75?<7pCj6sCTgZH>uMYQ!@vFUkHoXs(58sp{9s~{*q!`^_~kc0OlB6f2Z zE1X_|%3OQYUpl?gZPPZv*t(V;5SiC{dF@8N3f~Uc+r-Vt?7?Mv*O16I^qTI=C`)uw zdvGjXq;2Q-&jvh4Hz=#{MHU|~QR-aW7(&~Fc5DzW%k!ul4t@>B$F^s7B#Gdt& z?v_51>^cYo0*YVTcJ9Sh&ehKQ~uU4w4}Q~M(gtUve# zsc8dl(V!LP2&39^vdli2J@I-3KKxcl9CZ1guY0~ExfrT0?Y4m2E1;1rs?p+zyd9rv zO+oG3J7|<;EMnDg909sQZm(DHDi5A?j=&?kC<+237u> z5TIJ6R4UVFY773#J4ng(bGM4f?#bcdP*4#CGson~^{ti2a-lZxg*_!R&Wu4Ep^aKZ zZ2>#LqN`GAu@=z`T~*wAvIREo-i9|97vV;}W6SQ2_SWIKx}L(0o^_=kN-KWuPQIIS zYq}hkDm-^|)e`J7n__k_XAwCkuBW>KQ;lMzyIx4Lduerz- zOk}amOV{{|3lZIefxZktxco3`EB!l~8*c|$y=?Cq$;$e+Q1_2R&DBLudozruiYLkL zOK6q)764SbdnJLmDR-i|s5_SufIkmxFHHOIji<9Xy6Pl(dHXM(Ccds5{V#Mqzeha8 zF>huC?pRmb4c4(beg4691?(e^os3gM$wJX6@D3Pz{qGW5sx;PcCr=v|%=CU5&HNv< zo9J*UK}cSyT^PZ#Ar6mJDxB-a$;y<2>hzmvYB!x)clY;qGPQ{o00Ey<{#rJPd*=Z` z1p*;93tIAbG2cfDc%%4O*(_}|l&AG3=wj2ppI^yB5iVMA2RwFZKl%^cMOh_1$knm2 zwKaX}Ra4Ce5FyJ&FB4MeY1FNikx?%YTNQ6!e9*VBJRja(K-%j6}H9tkX9>eu1-h>Rx{A z49yE)0L!M4k#}jo+VE7`|4Y)YSA$~pAWW*Lz6>Vx@(MeXXM1e$g>&5^t&#y)ZE_~^ zO>@_;YfIq9zWfJ)Nw_r-X)~U~b?+83nkW8;GkC~!%Qp1s3Bx+u;suko7V_$T<@}tb z;@KU9^X{b7Meqiglv;Y2LYtvpee`+#slGULMueEqumH_I#; z`oZ`Jr;L#&Za9xioazda^OaJsP%K+rf;HECBR*9h*br?KcXA2WmO!&TjGIRGwmycR z13>yOSull2hhA`aIGX7z;~%=;_jN79?bUD<9T;H)_MYlx|NOh-@qR1~)9GdRK#flk z*j*BW)amLGM%BL65eNFKgOw|QqNzxgj9UaI+y_cl$Sg9^q=q5dAcV85T1d)o|O zI4XWZDCBb6cd)>!=bq&KpEBQ|Tcg1-9P19JWWP?vw&UU9Vf}@Okm_`_j=8=X@(|?0 z;o&QK8YV|IJyn+*eY3dJ8=u((KE?i3ekcCys(r@ek=ndI}Ut`f~-8`NTGh;-5n%et|s42DT<4X z+4%?Fg&UJWOvQLK-k=nQ3*O=Z@ zsoza&T%LD)DHG;i_YKs0z#%5r-81ZDg!EV`d*@bF;FgY;kyYF7$7z=0L6*$_Lyg)c ztr~iHU1IpUcJh@>bYBWZ3!O?dK*<@;(%JRLbtG}`KlFDJ1R<_nCc;Y1peik4k47W zb}++{ii1S%0ZCrDZA#N5wEDK-au`qfQ49en@C^?3N`?x-+XZ|4tt3K2cwHyiJw#O@ zW)HTjaB>by4X{AmArn!IG_aRX zz9jj8H6cA6lc;$W=~Z*|9a~%WR)RCL2ucNIT->v09uJVh_s8Q)d8reX`c_}U=C^B( z&p%~5!BP2nhw1>TljDN6x`Y`ac@R2($JxyWF#=WPqV{6NSXDRtz)SK3sQ{*3Y(YO^ zmlnFv`hnFx*_Z_z?XL7ClZw_TpwZpbqLkLhCKo5?VA2bv!JXOL}vj((p&rBisrKIqfUMyqd@NzHbCZUb}|{u;5B*dyQF;UsIKUgDQ=)^^F_ zi90UQyMc0|BUZc|{P+IObe4*{@;=LX3j}nXRIVQ=1v&iq2Vn{=JVd){Wi3vKu&kag z@qQeG5yV(Ah7;a{L{Lvd)?LzFaN!^{&Ng3%*ulr`D3KQjQ8Xa=^dQp7Y+uhABxel_ zadk@_SYBD~{V4GKAZB?pOX-ZHN;`vk{-f>U2Q1Y{>bqPl_=VCIY`q(FTg0}m zU z3m$$LvQ%Ipib%9R?QiEDSYgi|@gAUx$EM>`gzml$TRrMB-c*!PtnS6;7& zBK?cn%;T)%`e)QOB&Aq}K-(ANT<=#0S4DM=8ED(54?f4p8k>~VC?!yjc~5$3H4En> z0Za-u%H@yo6BYUGPi9nWqtYDf&aIUa;?^^US^%`e{>kA@LW5VW;;_9LX7OCi2S>(A z+>t@c1xjEuHbw0rxPS`nTw*`%PMrT{%%q&M*mNil(lKNm%}bgt@>}|dn~$HvwYjVg zUvVGN)l=Bhk3tqZ+Wgl+?y*N3TZBOnC#f3M4%qkOsPJoxAVS~pg|t8CmK^T)eMfK7 z(^_5+NBz|oqnmk^`=#4@t2^(RqD8H)dp2+h#4@s4QVtl$Upxb za`Yu#PR7@7G2RJ>DBw_-=QS(HNfJj#S3m2<_3IvTJ%cT18^?zm5G?vgmDSAnYE@Z^v8jS4_Wt?u zFq+T}i++>S`ElbDk{sg4hx;*B8ODVHg@fY2=@v%5K6=tJSzli-g#Q=hXN4&J5}j;> zNjW5IiVXbiSLVy^!r{HgA~OoQSEBZcEYC2t2c2H6hDF_h=`yv+=pd_B=9qP!K+Cak z6u)fHy$TacfVD^j|73KK5w}2j#-&mqcDU%&mY+yOqE)QqAAOt4h1tNq??8dr(W~?F?n9b!yM3y`w|b9bQ|Pn?#{Vuf z>Y;@-lzP1r=y(QzD)UQ!kZAk-XmjiL#nz-ZP%z90J~PAc`7QnW-v4l$>UbG)(&Ide zvf@umVR>9wRu{wM5(H~_h#tS#R%YzsQ<6=Fmec02sq?f}q1$F`Y+RCPz<_0JVWR`7N=iicrJ2P}D_KnK z0^Z3(*PcJuB&knnemMK9QTegydRIVL`BIzxCB9mNg*7l|27O8thoax5GNIy=tvK9> zhuD(Oia|{daFr_yCZM)biN8>*YY%@%PIFH|A{Xb99{aui)42i}D2fUY_oE_pa#n)I zx7X9U+9rEk*MG@BtH>PB>v5p4b%z}-4ErH&`T6YR6s{X!=*c@ogm8~m_A@=0Sqpi>Kivn7eJ+o9m&W*El=#0Oh9~gG(y(8-Rg5C2>W={dT%6%AIi~czz zeR`!0uJ}E{95W?~sbQ^|VA9ZscJriV^rdg7B*MgiVH{j}-gojKtR(I?C85{pmng3$ zNs279QQ0lJ`GlW5UZV1V;-G{yJ2TVQg1?d_g7uq6FHVFH#ftpPyMi=)BlM~mtt{CM zLI+Nx5qUmOezkhWX9?CA$`AuwCZ`q*_yLA%gA30}2V)@EPJ>BGb!kwdsIRNsnh=ap zD7eE9Ojn4%0orZYBjV3knNsNF=k;q?)6PtN2W}r#xxK!!KX<&3YUqYuwmx3aeVGTU z45J3>0voX7^EO=IlxiBpob=qT~y>wrKmx zgnvulM2H+VJB6vG!1ofR2sF&!ucj`i^!I;cPY$%$YLX;RFN`b}{Zs!nAO-VBp9zox zW}H#1_!o~v%9|D&2OC2ag^@;Gai}Sm_f1>Tkt z=Yq<7L25*KPU2Wcxm&vAaYD!>t&g5!G%71E3-{veLIShW#=S#j;qTHqn8A&Wsp;bx z*d<;UT(`czldnfh^y6drQk}bG((M9v@-4677Hr_ZD_eQ%CYOq-P6AJ{^|PO*zb21{ z5Qke^)mf#c#l9n2cQB4kohC{2 zUU$iq&G(aNm9@Y%S}YUR%V)rSer8wC07WpsNxo+Y%R^fW5(FBxc`PkkC22+jrlRIE z{;%7~8Jse66-d2T^u4`OMV$E9Ix6WzIe$|VdOp@> z9?^$%0bi^n? z-`RVI6%N@hpd5CJiglGA#(a_pqV*=Cz}M6XITsReESwe zBiCX%yn*omEa6jwMQJ?etlx^^E(l>8x6WV}7|>VyR8%8!ZR{o>J^QA84H(8Zd1nhF`T;iS^DoZmOickQR- z0(YzY`v(nMj80}b-yd~72f@@4uR9-ylCuM?PxyN)Uo0Tlb@lgAlgA~^nTOtwXt^NWoCjsBVT`_U zJ~(!lDyayPzvI)Q=Jp>Q^kQ#SaD6l)fO!IP=kwH3oDZU%EQcy%#2p8`HzW= zSw;?W!aC*`49ZZ%?deq7Ts z`x_8fYd0-G@}orw6)WVfEiDcA9J?&mxXRknFJdWM3}RYH&$$7}vwvoH0i-=i>6Bcn z(qn=koOS5Zt%{Oh`SySuhz*@Tu(XSO{tRim*mHS=txlLwDRe*X9)vu|7!ZViDWR(* z9K=j%Ae(-u1O$U`{mWc|osL*1nJN((`q9$ok8-+pi0I|D#y{PVnUs*URYx>vbys(8z|W z$TyU-EIEa%2KTH4&8z#9=?%ynELwKsl;s10|F1P7FFkfq<*Y%^8#&E zq>apA{r*(6iBsvIcmBgfc&XV)wA(x~UOFKfO8+-Ds*x{awaP zqnhCH|COmufR>8|kDS~GBtY40;S040WpO* zI7_(ScVw<{%TkLxQbZb@=Cur1_Jjw2fiE=oA7`PyJc>N77O$iOOj&FO^gdHI0b9yF z)tUs_V9GZ#ULd7mI)7D)Ov0pKs)XOTurv*yn$n@@I^4Z*sDf{o>Q}Ssgt5f~V8l)- z>MD6rl^vbmf2%xN3sVtBdQrw)`Hp{Hd}oO+r|h;(BJAevHIIb=*HAu*Ec1P2NW;tI zG~{=q-&vF8-gsf|?OUDP1=fpOKpI*Z4C_7yYMcaVrW{YBef_ndN!G+kOL})oV=dh4=T7aPKynH6e4Wn}~U8 zYN`*h60ihO!m3d6P9EnhgJAIazVfADwG#=5T^p)kY&vKCxYC(HYCv%tWiX>&pU%TP zqHg!9g=SDIQ!br~Jo1Uq$zg6}1kOhkPMS7_>ND1xBf_+NU88Cx?Ebc~d~Bhx(=J}7 zFZ4~HHbJCafJC5@Wb#4gQ7GF;tFmJIive-$g$#4ps7G60qVv~_f&VDDA_8sQCbggs zR%^`;Oz(3fXuFp_Zz88)IuObU)8%6M6E8U{P$~@W)gOFB0%JlO+CfN<16`EU3e)V| zTLw(r=UuLD(xkjn$IaKOpz3C!iHH+)UXJ-)9w*}Hm1r!LcQ~;KAs2oUIHqW0G&({-t%m#P*-b+j1-#{lOr5lu^H~ft)7o({U7! zs^-BkiIZEK$xj4qm3WA0l|=BU7*>}D(Wn9BLIJ<&f!UX&RPYqZlTvv}T|zahQk9hQ zsP@8lT1kT6Qes_AH@x((+ZX8P=+plJw$bl>9>34Q^<*q#0&%w$PaZlW9kpt%R3ysXhj)gxFN1u^J+CyX#BK-Vt5u%Du7dA=k?;t47JQXrS|{h5X$`;l zjlu@j09x0*uP3&j$)&UXE-EziltT?gSJYb6@RjnmI7dj}bti!YUOP>4Zw>0@Up^Gs31{xWe+S`*SIZ8t=(;yX$bGv=!WfAdr3us(n4q)evz z_s%SnoS$%g7LHz~N$t+#ZwytMtb7{9RE5)fckc1Jal_O%=_ogljO-Zn{mzZeSAP|K z+T9y)%jb85|7W+uadZB#6X@(ivQFsyn30{Vv@Jn4EjXB!)oCBqnhfV!fQ=RXGA2ub zIq9z5rJSpgzw}3^MyN$4+#P@A?0$n19it2$(%iIDC6y{muVz^e;zT8*k107dp8V?0 zD|moF%&dHsIp@!5yN9*4wR}sb&WWzBPRs@L@>d`gmigC(;RkO=VarIy#Uxdl`@;Eb zE;_jss=bubC?nqNQZ3NbVW_o@ETvpQdOrrLT=IgA#(7-~1*`5i6hrb~pdK-QqaDE?d}V8)bymn88F!*!mvwY-T7HktdU zs0YaG?GXxaIcI%$1G~3@zjnx7Kk`D_W^?|0yk9sPhVJdS_1F2C;1hg4X=^QVQ+s{S z^7}&(ZT3J4JWz9IWQ~_s-fX&|LABaBeFo8|%IrSfC(|a*9HUQKloQ~iTG@tf_i+5q zSC-Aus8k=by!OXV#$T#pU|pNqC&P6(>ag2R*%5bHJxHyKohoMk%`^uT?KZkIU1`ZU0gUjjw_&_DOi8kR0TKgK1M8sTYS`QK++&2PE!Lu`atxLwY_sL}l) zgmKa{ik;>O?7ZxUM*cA%VU2-Ek6ENVW(bKTl|4MH2{Z1by8wa2MncfX+6l}a9#3-_4i z!yJ~4>tm4Y%(SqhA@PlGu70jqDkki-h(NEL-E%D!z+Zs)@#(4d%b*YWAHGJU7fdUp z(O~Iu-Xe*0v{=3|RE4IXrkz?{R9XUAN29~mrDo36+5M>PW5&XEgfxPVqQ-9_2_ zPp^TFjx+Ag?>9|EUU{#Xp;Rf@9WV$_ zx79#Ls8TT@Ns8=$FlXs~q1GZDkjUljSE%y=QMRdj-P&5N zzn}nbN9M=rNTwHxcpjU1e?!rGfmnQuz`mw{0Odu%i+$(+bbx?CsyP}O7~*=<0{nn) zLAU;_8Dt8<4MORG(l1ahcZ1x?0G?ELpt`#>=koka!+mzf3WLXM^K)LEW9q@DnH_BY z+B^w>f%V2le2Amxb!2vh6QDx`%FclmhpG^Y zKsIP6TwgPtS_mA7Nl`ANh0GuRTxieu{oq_-rm{f?&l$3ZbO~3t0!|6JN562^T&&Wy zv;-HkBwjEV@%}pCGPg$irFVQxP{Y;D#?QfS-N06aorybCLAg{qm4|u7$6b7eX%+3%2=g7-ra#Yjz=Q{7Ag9 z?fB?DHbZ`N*j693>P}n%oKnHsQWOD}flB0DKJ5pk)jaO8f^hNJ;vfMjfu~U5#v~`H zDoPWsdJJ|fm7=o#gdXhi0OAAc94nGtgO-W@@?9@ZWD4^Cz;H{*8|U*+kWc1Fz+ikJ zJF?+>wyTq^gaKLF*ENdYKV*---p}5ZyI^+pvRP<`L?(_s(gf1m_bPdavW5(Zqitqjf*WQ6s8UyB1elJ)%F4IM-2zcWJ11fPRT z8%=Y7ydjUJo&0=vfHMzgdNI2KdZDM@ki==~Cw1~f#)`yJ~j zqcHAUuP!%|^PozR0fRbG#B7tz-$#JZ!;M+<5^5qiX;t1;DRQJn%Wr(wD@?DO%uWKT z;^uLXlSF#)yz3L?j1iasBvvObU_s?WK-FsvhH^I%*>#OPPbq~-(j(a4lupL*ey4?g z>fj>uXx$RJ5Xr-X=Ow^XQo>~9O+%eOZD+p6ysZZF_~ zEBgAz#yWfJ2k0o#{QpE=U=ZVit(irM6kytLP z%`dcBTdM=XrC+by!oLxjg!2Gt-Wj_mEW2)w8a@?3VeWpCSdgw4;mhhIc_${0_fk;^*&X9{|zx=e_#f7?x5@h#AK zA^C?qp3qf##OUVgqRD*gzJpIMx2yB~$)pE_vu;P{=^ero5Oc;;3Cr~)bzfR>=GKH(J`7oh115XL?Nrsu9zbO@M1Oy^gG1JE?5c?Llt zlppmgC#oqVGH^Z>Nx88mh2>NA$-+U{@Q`JIllJhJDs-xAO?i1GI#WensC#KuyTL)M z6HF)cjve8H)_D)fg&!J@J1(D)(yg0c?`AT3G{N5SW#uPfESp9-zJX(4vmr+@Ih{dD z`_0@xwTok=*r>dy%1|wYI2`~|Zm2lnopSeF+Ro^-%eJe9{>(@}lv8rz9zkQ$^a0+{ z=PI?#L&3YDIj))(yD#5v5=)+mBhJ2CbIZquckgHL@2Kpe8_oWL+!uEHKhh^NpEvx5 zsHpPx2iJf++f3D)h9L`b7N+AG-8MIRP11a9|K8tZ$-I@qqF1C=6|y784<8y`H%}^@ zHeo9J%?zl#%M;gUHE?P}4;3kgmen~7|BI`)V2iU0wgpLm;O_2j0fM_j1C6`81a}FL z;O_43?oM#m#@z|-Zqwhn=gu?F{Dj@T-`Z76YK@n}KE3ZcJ5ZnQAM#jV-(<8IP{s2f zNUKoU#%~)BY2#5K6Zg}Awa4+pn^Z^z_nh1+hXt;k;sT=?hWf)x#@LphsYr)P3%LVU z&W2$aP|T-q4*mO>IEsw%(nCg~g_;7R<8M(BCXt>*3OG5ghFb(+K>)z$Yo%-^x%jBc z+x^LRXX>h(2Z|nvR}zBPr>jMEDi9jmCm-_`H^|!GOVyvEp&E&qOz>V!1P5n z^f^b@l+Ehj*$F1+zQCev~>1_^dc>q#%yUKZc3b(%TU~sH63C(PD1eah1 zZ;WPUgf;!~mkZ|rY>#hZ+lK$=X5>cpBS9v+JMB`JlEq%48x2towy*+zvxkBHNV26F zW1Y=#GJsQpN@eeb{oG-@f3!!-zx{YP&$?pys=HKi>9Gx$mHY|@lpU_y+r_1VbdhgX z_#1;V%LV{NgJF9(AI6BZBalNR)$@a2CD=;z;dIPDsud*F=u+}Z{3hYu{RCAp<3%Nf zt-Jd@q01-Yob&_a;Vo4%ZwIBqwsh( zJBjh4prJis8B8`}oIJM1CtLBg_5F zqe69HBNGM&=D1K5rXZf53@trdp{BJMEbr*LklXk}pkcq>Rb0L0pT@`TUbAl#A9b(Q z@!gz!XsA+8TC&}2pk=~hf@U5Yb0~HKKq*mg?L;f?V+o^mY9YZ}mt2uF#A8cc7z*}Y z9?cimb$Zhs83Vt5v9a!>jV@IMqzjg`peND|!?qmx;;7RTvwr+Dvs0*cx1qM4)*he2 zV$^w=e2i0g#BYh4qzg|#$!Yy-KydN;^1q$2i3}c ztqPcV0}1P18Mt(4`}JNv3bUiz3UyYX_}=W2f_uRuBl)ATv%lb(_TYW$7=itJR^-Xe z>m!P_4sQZTW*E7#ji>&^_xuJce~rOP@!?dIxyS!$pd$N8HQp*4B~=%IT)qI0c3xT7 zeGu-E_Ac0CHe4cQT3YP+umB< zeYfhO9bi}aR{!p~{n;d>Z$I$6N8sCe^6NoDvDu^PB;MS?c>5S1_I9Nk4p?g{gJ3WF zK@b8eLsd~iMzpiE)^hT6#)_G>oKM{1;5{rHr(!`@6_gD|c%0jfKbsy?Iy2H$sOURL zCK;?yj-&3bBD`G)x4g8(0ax0ik${f*yZJ~x;Oz{0@sJke=P(6_^;vvHf z{woSi$7q2m)l`A26;i%UcF2X{)%>S_<8FnCT;b4@;R-$f{kN>ky*&8nfJ|lF;8b`v z|NVMxGSYkDfXK}F;6|j%Ml>p-5lunJ@j$CRbC*btP8}UGTzFw_bbr)agBG1vWfkY~ z&!{-({2cEWIwR%1q?Ws|k|!`AJ3~BIoDZ1h;}Qu`q6aXL6LQj|2dicRCo^QzE>4mF zNufuI^kYJZWh08C#{YB3_)G1aQ2+xFe8?myS{dX6x7m3tx2-+Li$lsb0BM{Btfw{w zLmI+knzVZPeQEl<=C}1VV_3$!6L{I>tLg94wC3W!RIJDALYF?aLrocA3nZcXU>7Nh zud>Z=BoeucNb{Y^@bX#;KULtrE&X2pdpIIpG4L}A6co(d4F6puLl~W=4T%iB*yLBq zBN%8jiMowiJNH*CMFQK=8=Ian6H1Nko`1Fe58%41v7XtTtDqeD$YLKTElt46cDc=6 z(w6zXt;=)GoP4a+^VM8O2(kz+4wE2*xGfySk9JNb#iND7!+fG1v~)V#wDC*-q`U@N z4cdntGd{Y<=XMB*hI5a*Dkg6xiT}VjBp;!HuwEHCn)EpwiuUM)r3A6AJ@bo`=zJIK zxW9iL^-A-6b`#J$&}?}J@J!xyjW}`?L0I8cJW%#$8z|Zb&&vp$kwi^kg$^(pp~m3M zpbT$6-pXh!>*)T@jebRG3#XquKC2=}fHb;}8XbnWFP-le7_j~5-Ajdzsur!&jY_=L zFLb_{J^7aaLkEis!uM##;M`x~qhzx7`ItG>#~iy_-iq%Gtj7?GT&-R~r2s`Z0x1+OptTh4dVTfhmIAYauw)?`c>+!Ox>DKh@R(<0RkCU+B%b+(<9R08^32#fAn z3DZYZnB6S%ncYe^n+fa?;~;!+`~qI9M6#XccT>8*-C$OO)oD)azdeehGW+y-6E#{- zb;43`lRTOMPx){&LeDG@8@MB2C2Bfp_=S1oVD7p|tnckR>vw8m>&OTldiU=GP~Sqa z;=#Z=jVb_p6VevJQE}lIuzmbYJ#}EI+xv(t%goQj#OS!XiDtT&$4Q;E+Et~I{NK;8 z#w0h={Sw`nenPUf4A*lDc3U*$5EzEd8N77qT)lDC^o4<1$TC1N|3)V)2v_Qqj~lO| z!SXaBPkG@5!#RCB-En?0yzZnS!YR|a=5qpoNxZsgpik`B9k3Ur&SU0RsN{eN_4Fh+ zo7`9uSfwD7v0#-s<3vZTz+*X&O*`TG8Cdik89fVIb1Yj6$%__3t|X2OQktK zigo|O$|JTke3P}!)qq8nNHy3!**y|>@$v&Vx-OIs7fMn-+y>9#y90PNbX!E0G9tXZ zGPaE$|3;oEuAWPhjW`N-Cz3wsd1-Y<{mWrOm<#r!vm&CkIidl9m^#=>z!6aO>2g9Zw!;*^%as zf4I20&JhKYy(@3U;ui(QV`Mn4+hK{C6%1cW+28~%x03cWzS1!^9ml?*!Bp^neN;!7uzMzMG7dzMPd zApU#Je2Btkk9wLAd~aji{}%MrAzyqhpufF-Iw5_$tSxcRHF~CYvG0vcani&sw7E~F z7bhJoHf2Qr{45V2P$aH_=@i`BV3;R1Zg5|!zTntkV9qf}=cWwfHX999)_Sn`Z|F~? z)Fel;YheTPF>!WW3?aHz6vO*9iu?0 zQ#$me7Tz8pOhFJKEO6MOaiO{&% z$^D4hoVuQ(V6a*0A8_bNA^?Sjm56O~K!#QQ6U7dqoA%C#SS?>Av>9_mAzuQ%n)Z!f z@7LfC<^o+iow15M2ImwWE?EmJ+UpMw!BUG-UVh4iylBf9Tq4@Ku<&LSUH64$r{EZJUS7P9!m!stf)25{5IlJgDj$ z1Tf?@??(|a0gy)i6;e={BF$Y;<51UT2*AI~OUPqy{25WP2|Fs4L)@`=?11S>vwWF9 zXG)IcbmnI{M7BXRl+CNDBgY%JOji$W&`-xjn5NDxE>%$IMc&QL{S+O#SGOc%{XQ8N zWon<-Fnl{}LNjikE^Ox`;H>e{A)@0SLKmlCcPi(ByL4%Vl@Fw6tU__p}Ugv^(JXvTj_F? zkM@dj59(Ti^$)8!RtaYNAA3?ts6^j7YWYqEY#hSa35eb$18^{+BY{vs!n(LXnS&#_ zbzU!A>bQT%v@K$x0`)Z?9Iv_h z8B%6vY>@1dBTAnA(5rw>$4>A0m*p`UYv-CPN-}_w$ikdiWaaz_@OvA8G8r%@hnZ_QY5|%f-%=CGNGLIGtpB=%{w)hJ z-}i8eNUCWR-1=^W4LZ`;5*Vh@0!KDLY&m>mJ}|AC6&^&fPfc%Jc&Q`v(@<{Bu%i*83B#QUBGp)B}T$}8#<3~c|&rRjlDVwF2vxFx%_!7{V4 zVK_9jn#uP|0Yn4j)o*UXwsC3uC*|{4{+Ngk33z;Uj$WFB$K|lQ42KmY{#6P_gGY zu9H@Tn(kg4pXW88hP1U6+McRYe^-h^$FiZOAU5ycyVibKd4dE#01ReU3uQ@It>z+j z{>=o98Q|_=GrwY)gK$J1$uRt>6@_%{B)8`+IZiiM*_N*2h|Nm&a*V@^tW3CfzbC8Cy? z!PU>4I11>&hfcX@^Qt#&$!^?71!A%axSE7t9Gt;*lv|&|scbwndXP{`r6HV?u3P>h zPEHVtimkP`+lDRdJ1`o$Mdy<_<5 z>M7dX5NV9FkBkn2%mXtNlNdQ!dBvfP4uqE=iFUAkv8uCKV>Ir5dslV1kRZf0knxhae2|YSpUyR1>xl z`XpBva;*SsImYZvZtfr~I&`8~w8_ey(_t8>fJnk(G@|*yvmdo-kRn$tt(y4v=x2T~ zs|{%J!I%aFn#)x?%)=00)2_s^Gu~YaSKTnuNz1;2pRzqe#oR}2avDki0S1o%tIMDF z36KKZ@Rs)h(>eV#&4d1Y5p!DN?fQL!vvXg9c40r7?F_b!^FF1lwVy^jX?bPray@>h z{xe)Y8{6)}OQ&Fahav>e4$29cMCR1g6i?Z+^7>}~!(UTr!x&Ruj=n^3ch3e=)0Uil z3VEKQ+$7sahb#o|0s-%#;OWP$rFUDbZrGy*uWrj38OV6_lA+vgjKLtm0W`Ns%37#{ zB|>xumY=IMwokf&lyYvcGNhOZP_J98e?Fu(?w`5x5_0(=X=HGz6T7P;=`3MyX2AwA^f0_;4ST|HfIPdS1nS?}14RY?zw{ zorpU%C^0i2Kw?;8&;Y^vXo3Rp+%?_nj5Adz$D_L26*%OwzGX&g z)~F9+U-YOSMvw#X6TuR#Z)kQ-3Cdc7aA~2ZFp$jpM>cOZyZi}tdZOr&p>ht6npOFc zvw8HPa1kjvvBQ>%Inpf$lRX6NBz{9k1f=+bHi1%4ak3MZT}2B z<|aB0w`oTs^Pe=|-wh>vU8MdC(yq9XpdE8c+?_|llr)TOlav4kT02TlgjR%Ii|y)$ z;E2u+O`Eec3*dkj>=Ld^XZ9oR2al%SJPR)l{scGYYPP`%SYGo|{$_L{#6p8JOIN*Mg({XM9b_-lmiWk_ z)6I|yDL7&64>AOvBDy^nCOp8GI%Sf#=(t)=VUpY0AVMaZ-&cs9I|PoInmC)L)j<<; z&hl4sNb6I)zm8tUN&}-pZ3w#y9GAIeuwR}PH)#cLvhSlEt_%$r>dn(9P=J>4AW+vG zgkX<&5x4jBXvAy!%;hEgaNI>WpUp*w3yB2Kr=S`dKDzSS0K>fAIVXA)4nl`)FlMt8JekGB45% zt=MC)Fj}i|ZVld1)9AKKB~1w&e9HIY1F`0^0+D{F?&J5i$z>3QP%^VAtq_$?M6NVe zQ$&e0dA^vxH*6_LRaS|pR;tX9$;^Lp7f(U_0%LF*a~hj-)xQZ=ixn9A_Zu77$}A+- zrMPT2{?o*c>H{g{&m-w~WRenT-|NA%<}dx96~kTnHD}Yw40Gp;tAI)5=RI*DvxoJ& z%!G8i^|1FMUB>*!Wi0;)X$gFIn>H_Ry>N}%G6904#KwMP?@f0RZUfalEb6Qu-;a@l z{{k)5@mjg@fpC2fTD2C^{@hgRWlRTp&io)kK8O&dv&vnj;z31^dfzXhW`gHE?f(*U?@h7bpESe~=P>0+Wvx!3$oO#0mmiTOhT8ZWto(ppW4>FNQP zob?+Onf3`{0&*MdYt9hK-Le84v@(BuKg;wnOU-aN5d6d?N=6!D))FrumX1|Ml|zTd z-x$?@uH!Yn{=apX)4zZ(J`hYo>#bV)F7gZ+{axdGz%NRF4|`$GWmg?7Sv$1`hD) zA)D9t&#fOkuGIxEP0E0^6ONsKzCgEGx9WrN0W|;FAA)MwVg2+(PHw=N!`M#3ZPfCS zR>`tfmXMn?U8YnD*ZA=1lPS{A8TnZ~U)*Hd{$uJb(|LV~;UL`hB!2o}=giweLl3-a z1Yt|?=3H&*I1IFFt5R2j@1Cbg*&PW$7nf-()yd*dsz6U7*!_EQZX~gu-M*Jt9?kd6 zlM*38xf+e8KM^qD>k=Cc5ZTs$$2BR48hv71y)areZT=$bk0Bj;nL;;GFRqRj#YN}Hm-df;T_8rTlEAD94?GjROoMYy0UxtR3vPZ z);$MYlT>>V=}p>iv={l%tUlKe@w6RMt*^-lmuY^jG0-=rEOWrHYgwBkqgy9NNyIMf zXE1fX$*x#fE5Os#){cK)kxsp#CIkW%cxb1hz7PF*3*-$c+i1ggZIj%;SSa&a@@;;_ zjUB~_n){FpQ(+H9nESp9QPzXe`z<}0w@#c3_0YLMI1D6-xKax&<&8>-7-Vfg@E;`r zD}!UKR@Rr|#n16O%l~=*R|(<1dEZL4BtW!e8Kp$s*_cy9aL8*E2EFqb`h6jDn*2eee8@ z9}4#F9IGH!jYIZL>5rrryBbH&%t{=`rl9_qMX;O6N(aT%@`3dal&EL$F*NvoUsX@+ zr3OSK$%!d7(mr@3Gsc|=6gZ@RBaf!d=e~DG)xG$=c3og7mRl-I7{-^f_^7YAXaBFH zyh~%VT=ZAY%gwKw0$g~~(wIEHtiV4^1ca>1_2dJ`KWifU_xCBe(cIuo6a&;kLCP|M zj%vvsK-?wvjB#{>Be^_?^FM#fmy#%5041P!n6Jb!IJ7RhI%0EmO%c#is0(|IT(z}h zy`M(4CDJ0N4G9$|1=cFwyF!p{zmzfwTB83GX~D$Pv>Fu03?~~ZRPSf%^7@eP|K!V9 z{3$H$y6U?%6#AFi4fRP3XWN3pdaWAw#$QNFB1e27Nh#rf%V-6P-E_4Znvjo3$J$f! zy%JdT>m4~K$_(>tL%b?#+e~6JYKs0pF0R|>2@0*n>PxOBy>z^xT&=$jaOx1{$p_>a zO%Kih^M>y{t^_anO8UF=A!G>3Hy3KjXelW}+)2Uf9(9#uN7!5kPHB}CtChZ#UBaSL1!cCQ!>%ir_dFJ+8WlHc+P7+28%4&+UEzsWNt8k1zwLWI-#_Zc2?^ zaWk%!Oxm{k)iipCO=UQO%dT&7g-3I30q*@PK#6YY)ypuya&uGvnqyHuOodJrGcw^J z+AYjt7h-q5p8(lJ*f58}G=^y3b}Px$2I&`E>J#jWjHdkNl*ML`^?vpmfPM<9;Ye_d zs>zAp6kZSY2VJ6%2pbJMDGg$7mPi=rkQA8lyRWia$|Rn4C^w6tr4h% zc&EhpMD7I~<@2^$#d;qC)h>B1ix9K!Ap~MJY>tg6(-X={YCVmvWY16QJ-Z=5AU?A{ z?S=GATqSH{7wyEEw+XO{A3TkI!`Xj?u!Vz9_)SoXMx)?FZ}^%j`+WT436>O?^4%pn zTb8)-XrJb=qKr8*6mWNUJEoC zr<+cfR+~3%MP4hy2#l}>%i`?!rl(CWU1Ycd#teF!m05rZG3g5s*wGCbxv!aOH2Y|NP>(LmzzjJ>IjyQ(aX+a3aay5$( z_CIMvzw+l(nRki#bSuR1{lqi7xc>il%6T;9QyU*)T{w9H^U!HFN+}OAQxjqe2LF3L z;f(7-6;=iP-NZE&mF8cID~+zZf9T0PXC?H;%vNnMWvRG*p5aYz9+5*htB?O!O0Tld z9DoxRfCoc|chA3SYYi`5o3&uM1q!8Q5g6OGEu{=$JXgYtke!>IG6jXTa?iz$I2}5N zGBq8+Cxb2LEFy*SuJYm?NT{_$9SBo=(*eoYtfUht43bK?YTq~dXR!WiqzrpG{CRuz zI!*gJ)zA0KVfV+UHw(!n*j;n)2;jO8*`D|G2?afCy<(Jv>T)885P!8WY`E?V&sehW zoe3c>WRSp6WY!wCZB>o$!Iq8-H^&G{6aBK;C;u;eR=Pdrx}|Ks^{@E zLeSRHIW|Pq#=tr7HhfC+r3zY8aktsfXVS+x|FJmy$57)H#i=2!r%+zR6B>S(^-Ohv z4h-f<_;Y@NCJTl18&d2i3wVp<0FIb*&KrBqq7nIn;rqEFCP6MnE7HmZ$}q2&GD7}O zd9V+{vjYCw=j8N9BNIf))G0_16gk@gcGWju#%O){zaEg)^6p8+x%l9_&ZhWz+EJTq z@Wi4*+J-I~Nh?lOI(`uElA?hiIEPtR)}rxX-!5=79-PNjhz@w}@}T3T?#wmntk>)fKg z-+R8YP~Bg`V(CodD{PUCv2kCpfu{2)K`H6|pEnmFq`w%oga9Tgf@rB@=tHKbGCIir z*MdhIBd|UkEy%Y9huVH4xc5VUN$%^W@&r8}>yabW^ewGq(M>kvpvN&KI-q zYD9Y76--O(w1_N7fcNz`GHNcFlxu54eUA0NebGD?S)?uJUN$V4|GcGKr_j3Yxi7R9 z`0|sZ&o%ME30`zt`hWg3vH$)wqtK-ns)pWD8UYv)%`etkUsbUPcZ&_c$5Y`HOoNlj z2S>35Q|wj9C{wCzr7puOAnGZqC8M0raXEW9Eq)A?rB*m|&lv&ICge5~#}8~CBiYL$ z55^)LfqHE54Q5pFS^0B!?-ffPTLfn+l5;PRH%p;T5?)02o<724 zGe_k&Ca1xo=Tml!8mCV2GVnUT1tw5lmRpsofUUV{W_MO%S=0)waYHyq$*=GnYi zet7S3kjN}XN%ISwL+VK)7_pMG3m~oHlwYtB#Rw0*KmkAw7qtfU1Jd5Ae?zjNG&3^y zDtCDUneqnFJ0N>rZSil@LB@&dhyckSYZV^2Jp4a9 z->}Up<5FoWS~NO|RUPTUJLV5CN{GW^VV&8XA2u62ErqmK+$(*aVnUv)Zh15#gD2=k z1$OB1IV+uA4=Xg_c_@ICs0K zl9?P%1T$>c_QhIC-(DM4`5u2$ck2n1y$NsYiEk zm*V~@=>$(m3Z)#{V_YqUP0xa!lVO;q;HlpG_z~LnF;mD!ayZ7Y_=vtuxuN!f2t{R7$^A=|z$a>3a@AjAAF(xF9DV zHk>tu`mxv4X>`NNPFSo|s7fyUyJ?a>Ru<#j8H}emjVf0Gg}^yCJqe^=I9_|9Z*rG0 z{{2_r{Uj3z!ZA1G#Z%Kuwmt1?Z=PO1>#TY;vtSRd@X$l#d`iu-t!gO`r>(@^{6u@H_m%&*Q6EqK zMw6b2=}C6TPIVFnvVMsu3bCK!|CGz4VFx47^Y-ya7bK(>JBoQZ z2oQKphu<3t#*&*t++l}Ty`NjX?w1n8UYg~dc&%Q2Q^#*EDLTB`k={4T*4)$eHE7KH zrzT1mH4c?!x^cd?mm&z-=RDn3qlKy9C*&H%mzhc~6R*uz_yQBi{eH&E#=idgF-3PN zDBkOxe8|U~LIZL8>l1FI@U; z;q%S6O4ck|+_f1Od9j7?GZIZRoKoLL;W|dk^Mo8EJeRRr5M_BzJ(KBLbhT=*H@=q$ z3f&r$ENLJ*qu;p7w?&lHWGB~!I^dJZGj!UU&rrNI?e;Od8=qlyy`-LPrcJEcjQXG&lUzw*_ysbRabjYE!|Hd zg|-P>8!AP{R)w#Iy&~K`XS>JF7VQVWh$PFKcKB(&jpAuud)TiZESt9qOWY;C73M{w ztsdD4dF=~=&PWZws@`b{gR8Whr5aR(9XRqg6e6qo$tG4&fRn3h#yegyf^<7qf1(O~ z&V)h~&(Du-aZ@J3%+SiAOpOWQA^xXO9SpSFPH}3k`+Nhuc-QXk$HV;nqa;^1bcLGK zyZpG|ie$^Sotsq+`HM-7V9N~sg>U^mO8xqy(^Ev&nT+r>G-&UEySs=%Xx+=D3kr`9 zD50l~i$<-!`fI^LuNPEXmpOi3T6+8z25C=SI$1$HzPqFBam|yPK%>If?dFKJi@73M zAFYyM5go%5KdD=s? z&R!8EHV>P^6~w&UE*6y_(FBC~hDE_>Nvd12Aa|6I_xZ75=zoMGXyGTVzcEp9*>x-T z@4nT`lX0$j1#gDGWH&IX59#!9`BcNwn|dwFVfSqL7(L3m>13wbd&T176j0P)oA_4H zw|bGSzfA}GxX7vc@wY2?~Dk&(*?vw+^1(uoV-Q2}}lE^kz46 z^+mk_41@wsMaEz2u|as=PyLlsi2z;Gy>?%HcN_((%FiUFEl=2zS;ziEo-R~X_7n-( zBLZQ{rJYW zr+F3req7M(EFD}s&%#5V#w@BfA>iaRdA)1CB_0@l3ZI{!5wYlGtXccG?s<56eCBCu z>GSAwE^^Lq+8s$qulIqZs#51L6a*d1qnTiW`t$VMdw6INpdVSkvvTgdylA$QWdfpS zq9C3PB}}^-+E1Rlk4M9z*T|D@-1#e2yCevEkk>)tRTrO~E9h{3>JY0t*HwU2{+(n_Iy?1!O0C`u{jR=s-9t(6ur9&rVmql; zK_3wRy(nW>`VfBW-gLk)iEQ4fFc#GL<99~wn(k7O`DPTft!H;dkEPtlAS=CvB#+_= zPNWpKa2|^)gBrdFhi*yQ=tuj`SXm*!^FkBY$V|OHw7Km zqR!?XyDEM~_Jo9!x4Zcn`|0mTM^$5*c#qi6^b7x{$R4>k7xsvQ{1DX_Ir$OTvPR|I zFpKR`Z_`p#;m!2!XvH~7qe17QBJ$Bu5_9?@We$)_I8ysuwj>$%vzdHEXN09^k#0WN z{YLz3dm1^nTs1jNDfv>vN9n1QeRgjYX_h{Tzjg{hB;vp4Z$mjNKrE$pKfm|RI;Y~# zf+k(N%p0oF7s-S2t7ELU4kkck@@DT?86u=Wm7lr?x!S2_dMW7vMkPGBg?l}O7yCYi zM3@;g4g!y1@!VZQU(hN95owc*gCrGc+@DS@s9&3r(fw265ekrRrT}rJLeI@D+jM>r zVhdqwkM8rA@4efBBlh+ef#^VqANLu2EQrT0<$IUQ<9vJ%#69a>x&;B$Cq74)`Wk+( z3GVYj$7OM-@&va0o&K>~U-|U0CWeQHd_IcO-t`}NpEM{;Bf0cU$RFq$_%+^0N6{xyeo3%(u9*wf z?++hp?k?EHnW{}t0O<}eR`XiI4DVVqx{()CGa8>7g7R@VIB?Mvgc8S3zUVBSt~%X5 zd2ML1#AlY)q(=o5K=oN2Nr$k~M8B9+HR!fpwxt!*$eV$J*h&T~ zESU2HrX3^foPvu@u6|EfJHm}S=N;|~IXw?dP4#toPJ4SNZ7U^`#aqeYgL!(7?Fuv+ zP5u1U=;ij^LARF9I+Fqy7psYnPeyF{*9mucS|*+DCh5!7`mAi!yyP2 zI<5}76*ZS#ZBIWrrz5^45dS^&Ez_d39`)!e#0israRqrx5Oi>c`$SVH!u$}sL`u@@ z+vu^TN#~3^f@z|iN4gbqx@};w9OrP=d@)-ymX*|38r2a6D&Zz!eBW4_$6XyYvgql- z8G}skKclUdU!`WFPnNkqc%&Nm$aO&N6p-C;RV$vGZIsG0%$YuGoA&i83|>A1Rjv4R zKWl8Mf9?o*| zcTPr*-W+xtxtETPz7W0I2WuZ~COj<29*5Tr`K6qiWOQ_R8u>9tlW#gIQj(_ zyQRCG#{&oB+LD>3xupfhy2HGfv0Nv&W8 zbon#u0J=pNd6E!Speg2`d*CG2@#Mn41LlY~A4MBN%CV%o+1c5eJ1?Ry--49n%ePh* z1|V92pt4>|1lvB%Y+{uV3_2{(hwRxS7tP_O+jksQ7AFsC<=N16yFSqRy6*Ivmshd( zA9D0`zrE9%@)(T^5~0Vm3XO%5YC!?zkoXhWea=UQ%){FY6Og@{SHL9E(Pc+V-Nh+i z;dfP+kiJ&?I+gG)+p~-E4isYUZkjctY!x()%PQN_qL7NX%iCKJsQo+BGtk>@ssWAf zl#}awgCKYAh`{Ut|3 z=@sqmY_r4b?z^}?Mc#M(UR7Kz0ePfkFFm&zJ*-~Caqj_nTfu;poQ4KvM?V8Lyt8lp zFWFrV^uT%J9Qs-spYR^<)%Fy6GuPL=28VQ5&vn$^y8v(<_P+d(^J%QlpPCdm5SNE< z82!**TTxp>rW4OEwsW?lOO&IDz22#lhDIMSPi|W?wb2ato^Fn*RnBh{w zOSo|&O8OZ&EiM0ztWt^9JbBH|}%qRbh#{pw5JcD_n+dTFVB~l%;o|{)U5ex*q!wznyx*>gsb&l2y|L(JN+61aiOQL_p|JIX3j8kph z^ATosi$E1eaQ&22Ha+=1t5o$NWIQS^FCX2-50&xIIsfDs0ZvJ+p~&oW#A5ByeRNl| zLzg_Agumw&|KcUuC0Y8Bs|=t~D_-g=9JjkiT=fP zG9AH8Kv$;$3mCu+95j1r;FI<8PF*?}D~ixtyF6-ir0Xk#T}I(*S$z=Of1fB0HPBug zlJe$b>H}Y}E(LeUJGAM00N2B_5>Kur6&eMazJVGl@QdL{U1<3y09)^Ng)TF+Jbs*K zF|s{@ic=Bj?U<$i=qmqtxI0IC&KC&Ubg9OW>$BXu3YDGl9IgOoa1@%v_+o&aoO{%ePjTth2xIHS+IJR~TO@}-Z^6D`n-vuGFX5UPf1 zm>LTQ==0Yz0XPKMi_95=3hGU??gtVS8oS&dju}p-y1Y+NKJTV&{AAaQ zdtQR3Nj^I=%CKHQ3L!%Fwu2>mjoQxc`)2ID5oESn1DY-VO3kOLmv75-cGKz2(qq3{ z6|Svaf1W;FVugsR!;x%JY z4uBToE?Z=>^CQK%C$FKY8*9aDkdOAw9rNdUB;uKBQ&!y&0hjU@2;iFT0`=XNVv@0O z?!T&BYs|2A&(#OWKC2QOwcCdHQ&n@d8;`2z7JalTW>3vlIN0wq1N4Oh4pg8|kT?gH zhK%C|A<^-!xn4$~gkJ8b%#Wn4usK!?s^^VPmK~R6)Zv3c*>j^Vjp}wBf_nxB_+5Pt zc0R7PhivvXx+X_O#h%xW&-Q}zHlN4p_Gh8bl)Y2)7CJ=c17oeChD|OqN^t?Mqy`_R z$URjkF*Fn;wCOU##Jv|nVzxgdqfzTQ2A=YUt>H+}Ot4U?xaL=XU zLid^-Xz%px+EGB&KvQe$U%G>~qa&Kdu1u32?|g)K7$is1iQc9o&u6d%VSZSlTXl3F zM27j;iO0LLkia(x$IpTs$jlk(^M9nJV?1n|NwI!mrQM#ZtLY7~TL>l3T68z2*ir|V zM^<>h$%J5&X%P>6B?L)5U5AvtqLmzBNur9>7)4n@GC#2D2T%Sk>MrZ9DQe_o5wtNM z9k#xm^!(Ct&-Mx{RdTp5qginGyMnyGMG;g5e@-ikTXo>R=i{x(zDx|pXyk;Gh~vSH zoL-SV+ph5R-(FO8`*a3}-TTs{qt`!l{jP+qr63hYUwm?X7CJ)Ag@AJ=J#H-V)>|h@ zdz~AsqsMa)E_c`{L5FvAewoAZdfKKgMXGLH{H5xH2#vpOs%{yaN^AE%uPgdtjNhJ- z3-qD&=+wY*_``E8TTN!h0n{(m@=}2RTXFQcDz5-@mUdgP1N=6mo}w%KbIM*jPmHz0 zFRUK3qU(xb@O}{S^^w8h)8TTdKYBqVTpWt4z(#W)n;6!*)Y{Ur5{)=$FmSe z$O%_FU0I#!>7!Be-J9!9$mhNn4LKJpUYP>y1wy_SJC|YzC4SFKepTv(H+=B7IjyU{ za^>jdbDUphhK$Ut<%$l1WpV~U<$sBPajZjvu>2&!jAVIM6y{Pzmq zx+`;benmYyOsO+6xB3S-q{~|@hr$xdT=)~+Ql z9Y$_?T0fs7xl8o9o6uwq9Mkil9e7J)RsFbu4{V+wYK3y`C5Cm4VGw;9i`zrd>YxbS z5kDM}X-iq}!{O8jTuFcv``+0~F!#;%*t=pisKxiD`Q>Bnf@`nmZV;@BY$5oL=^Y#A zg04i$#mcr?*UlZMe%xieU&i~U$a%oSAzExZO-KChZevp^PkU!vG2?InX#KVAgZf8o z;pu&$$~LKkzqo!S(iYl-T|%~7qvWd+T*UX|M9_SsY6nVRR}+$}y@}rYTtg0g=Xt^k zYm<3-a8pOmR-8k--m<++mxI&#EjAFP0*izFTtH%FGrH6~q$%8I1QydVI=BtaYX6wQ z!XcyGU>KbT8iHt|?rgn`?I?aXUNY6MBh^cfEHj#U(&6
kf3B%DLgu3~gT))#gU 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 literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index 8391d99..f0f5549 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,9 @@ -#Login -##Google +# Login + +## Google + This app is using the Google (oauth2) API to manage logins. To do that you have to have a service configuration in the database. Place the following in the XXX collection: + ``` { service: 'google', @@ -8,3 +11,45 @@ This app is using the Google (oauth2) API to manage logins. To do that you have secret: 'xxx' } ``` + +# Roles + +We are using the alanning:roles package to manage roles and attach them to users. Currently the project has no way to bootstrap the roles and assignment of an initial admin role. To work around this first log in with a user you want to be admin (so a user record exists), then get the _id of the user you created, and then use the following MongoDB queries to set things up: + +```json +use DistrictCentral +db.createCollection("roles") +db.roles.insertMany([ +{ + "_id": "laptop-management", + "children": [] +}, +{ + "_id": "admin", + "children": [ + { + "_id": "laptop-management" + } + ] +} +]) +db.createCollection('role-assignment') +db.role-assignment.insert({ + "role": { + "_id": "admin" + }, + "scope": "global", + "user": { + "_id": "zwbMiaSKHix4bWQ8d" + }, + "inheritedRoles": [ + { + "_id": "admin" + }, + { + "_id": "laptop-management" + } + ] +}) +``` + diff --git a/server/main.js b/server/main.js index 40c621a..4c6b910 100644 --- a/server/main.js +++ b/server/main.js @@ -1,5 +1,6 @@ import '../imports/api/'; import './google-oauth.js'; +import '/imports/startup/accounts-config.js'; import url from 'url'; //import './google-oauth.js';