From 090a1096902460c294e4b71da7f77c559bbd93ae Mon Sep 17 00:00:00 2001 From: Relintai Date: Sat, 5 Jun 2021 16:41:54 +0200 Subject: [PATCH] Initial commit. (from the data collector sample app) --- .clang-format | 128 +++++ .gitignore | 31 ++ HEADS | 1 + LICENSE | 19 + Readme.md | 80 +++ SConstruct | 505 +++++++++++++++++ app/ic_application.cpp | 151 ++++++ app/ic_application.h | 37 ++ build.config.example | 44 ++ build.sh | 1 + content/www/css/main.css | 130 +++++ content/www/index.html | 26 + content/www/js/chart.min.js | 13 + content/www/js/jquery.js | 2 + content/www/js/site.js | 59 ++ custom_modules/mqtt_server/SCsub | 13 + .../__pycache__/detect.cpython-39.pyc | Bin 0 -> 1369 bytes custom_modules/mqtt_server/detect.py | 46 ++ custom_modules/mqtt_server/libmqtt_server.a | Bin 0 -> 2281990 bytes custom_modules/mqtt_server/mqtt_broker/HEAD | 1 + .../mqtt_server/mqtt_broker/LICENSE.txt | 21 + .../mqtt_server/mqtt_broker/README.md | 93 ++++ .../mqtt_broker/src/base_session.cc | 115 ++++ .../mqtt_broker/src/base_session.h | 213 ++++++++ .../mqtt_server/mqtt_broker/src/broker.cc | 181 +++++++ .../mqtt_broker/src/broker_session.cc | 250 +++++++++ .../mqtt_broker/src/broker_session.h | 266 +++++++++ .../mqtt_server/mqtt_broker/src/client_id.cc | 26 + .../mqtt_server/mqtt_broker/src/client_id.h | 23 + .../mqtt_server/mqtt_broker/src/client_pub.cc | 362 +++++++++++++ .../mqtt_server/mqtt_broker/src/client_sub.cc | 369 +++++++++++++ .../mqtt_server/mqtt_broker/src/packet.cc | 509 ++++++++++++++++++ .../mqtt_server/mqtt_broker/src/packet.h | 503 +++++++++++++++++ .../mqtt_broker/src/packet_data.cc | 130 +++++ .../mqtt_server/mqtt_broker/src/packet_data.h | 171 ++++++ .../mqtt_broker/src/packet_manager.cc | 161 ++++++ .../mqtt_broker/src/packet_manager.h | 225 ++++++++ .../mqtt_broker/src/session_manager.cc | 57 ++ .../mqtt_broker/src/session_manager.h | 104 ++++ .../mqtt_server/mqtt_broker/src/topic.cc | 131 +++++ .../mqtt_server/mqtt_broker/src/topic.h | 141 +++++ custom_modules/mqtt_server/mqtt_server.cpp | 85 +++ custom_modules/mqtt_server/mqtt_server.h | 43 ++ main.cpp | 109 ++++ migrate.sh | 1 + publish_data.sh | 1 + publish_random_data.py | 17 + run.sh | 1 + 48 files changed, 5595 insertions(+) create mode 100644 .clang-format create mode 100644 .gitignore create mode 100644 HEADS create mode 100644 LICENSE create mode 100644 Readme.md create mode 100644 SConstruct create mode 100644 app/ic_application.cpp create mode 100644 app/ic_application.h create mode 100644 build.config.example create mode 100755 build.sh create mode 100644 content/www/css/main.css create mode 100644 content/www/index.html create mode 100644 content/www/js/chart.min.js create mode 100644 content/www/js/jquery.js create mode 100644 content/www/js/site.js create mode 100644 custom_modules/mqtt_server/SCsub create mode 100644 custom_modules/mqtt_server/__pycache__/detect.cpython-39.pyc create mode 100644 custom_modules/mqtt_server/detect.py create mode 100644 custom_modules/mqtt_server/libmqtt_server.a create mode 100644 custom_modules/mqtt_server/mqtt_broker/HEAD create mode 100644 custom_modules/mqtt_server/mqtt_broker/LICENSE.txt create mode 100644 custom_modules/mqtt_server/mqtt_broker/README.md create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/base_session.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/base_session.h create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/broker.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/broker_session.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/broker_session.h create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/client_id.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/client_id.h create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/client_pub.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/client_sub.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/packet.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/packet.h create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/packet_data.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/packet_data.h create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/packet_manager.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/packet_manager.h create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/session_manager.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/session_manager.h create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/topic.cc create mode 100644 custom_modules/mqtt_server/mqtt_broker/src/topic.h create mode 100644 custom_modules/mqtt_server/mqtt_server.cpp create mode 100644 custom_modules/mqtt_server/mqtt_server.h create mode 100644 main.cpp create mode 100755 migrate.sh create mode 100755 publish_data.sh create mode 100644 publish_random_data.py create mode 100755 run.sh diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..cb67d39 --- /dev/null +++ b/.clang-format @@ -0,0 +1,128 @@ +# Commented out parameters are those with the same value as base LLVM style +# We can uncomment them if we want to change their value, or enforce the +# chosen value in case the base style changes (last sync: Clang 6.0.1). +--- +### General config, applies to all languages ### +BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +# AlignConsecutiveAssignments: false +# AlignConsecutiveDeclarations: false +# AlignEscapedNewlines: Right +# AlignOperands: true +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: false +# AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: true +# AllowShortLoopsOnASingleLine: false +# AlwaysBreakAfterDefinitionReturnType: None +# AlwaysBreakAfterReturnType: None +# AlwaysBreakBeforeMultilineStrings: false +# AlwaysBreakTemplateDeclarations: false +# BinPackArguments: true +# BinPackParameters: true +# BraceWrapping: +# AfterClass: false +# AfterControlStatement: false +# AfterEnum: false +# AfterFunction: false +# AfterNamespace: false +# AfterObjCDeclaration: false +# AfterStruct: false +# AfterUnion: false +# AfterExternBlock: false +# BeforeCatch: false +# BeforeElse: false +# IndentBraces: false +# SplitEmptyFunction: true +# SplitEmptyRecord: true +# SplitEmptyNamespace: true +# BreakBeforeBinaryOperators: None +# BreakBeforeBraces: Attach +# BreakBeforeInheritanceComma: false +BreakBeforeTernaryOperators: false +# BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: AfterColon +# BreakStringLiterals: true +ColumnLimit: 0 +# CommentPragmas: '^ IWYU pragma:' +# CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 8 +ContinuationIndentWidth: 8 +Cpp11BracedListStyle: false +# DerivePointerAlignment: false +# DisableFormat: false +# ExperimentalAutoDetectBinPacking: false +# FixNamespaceComments: true +# ForEachMacros: +# - foreach +# - Q_FOREACH +# - BOOST_FOREACH +# IncludeBlocks: Preserve +IncludeCategories: + - Regex: '".*"' + Priority: 1 + - Regex: '^<.*\.h>' + Priority: 2 + - Regex: '^<.*' + Priority: 3 +# IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: true +# IndentPPDirectives: None +IndentWidth: 4 +# IndentWrappedFunctionNames: false +# JavaScriptQuotes: Leave +# JavaScriptWrapImports: true +# KeepEmptyLinesAtTheStartOfBlocks: true +# MacroBlockBegin: '' +# MacroBlockEnd: '' +# MaxEmptyLinesToKeep: 1 +# NamespaceIndentation: None +# PenaltyBreakAssignment: 2 +# PenaltyBreakBeforeFirstCallParameter: 19 +# PenaltyBreakComment: 300 +# PenaltyBreakFirstLessLess: 120 +# PenaltyBreakString: 1000 +# PenaltyExcessCharacter: 1000000 +# PenaltyReturnTypeOnItsOwnLine: 60 +# PointerAlignment: Right +# RawStringFormats: +# - Delimiter: pb +# Language: TextProto +# BasedOnStyle: google +# ReflowComments: true +# SortIncludes: true +# SortUsingDeclarations: true +# SpaceAfterCStyleCast: false +# SpaceAfterTemplateKeyword: true +# SpaceBeforeAssignmentOperators: true +# SpaceBeforeParens: ControlStatements +# SpaceInEmptyParentheses: false +# SpacesBeforeTrailingComments: 1 +# SpacesInAngles: false +# SpacesInContainerLiterals: true +# SpacesInCStyleCastParentheses: false +# SpacesInParentheses: false +# SpacesInSquareBrackets: false +TabWidth: 4 +UseTab: Always +--- +### C++ specific config ### +Language: Cpp +Standard: Cpp03 +--- +### ObjC specific config ### +Language: ObjC +Standard: Cpp03 +ObjCBlockIndentWidth: 4 +# ObjCSpaceAfterProperty: false +# ObjCSpaceBeforeProtocolList: true +--- +### Java specific config ### +Language: Java +# BreakAfterJavaFieldAnnotations: false +JavaImportGroups: ['org.godotengine', 'android', 'androidx', 'com.android', 'com.google', 'java', 'javax'] +... diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..689234b --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +engine +modules/* +logs/* + +*.d +*.o +*.meta +game/.import/** +game/.prop_tool_temp/** +.sconsign.dblite +.DS_Store + +export/** +release/** + +.vs/* +.kdev4/* +.vscode/* + +TestRWTextures + +_build/* +_binaries/* +game/android/build/* + +*.blend1 +.dir-locals.el + +build.config + +database.sqlite diff --git a/HEADS b/HEADS new file mode 100644 index 0000000..9288942 --- /dev/null +++ b/HEADS @@ -0,0 +1 @@ +{"engine": {"master": "a47cb57da73a27369df2575a432adbeb6f2dd790"}} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..190891a --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020 Péter Magyar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..51baa72 --- /dev/null +++ b/Readme.md @@ -0,0 +1,80 @@ +# Data collection test app for rcpp framework + +Simple data collector app written with rcpp framework for a university project. + +## Compilation + +Will only work on linux! Works on the rasberry pi. + +### Dependencies + +Arch/Manjaro: + +``` +pacman -S --needed scons pkgconf gcc yasm libevent +``` + +Debian/Raspian: + +``` +sudo apt-get install build-essential scons pkg-config libudev-dev yasm libevent libevent-dev +``` + +Optionally if you install MariaDB/MySQL and/or PostgreSQL the compile system should pick it up. Make sure to get a version +whoch contains the development headers (A bunch of .h files). + +### Initial setup + +clone this repo, then call `scons`, it will clone rcpp cms into a new engine directory. Run this every time you update the project. +You don't have to run it before / between builds. + +``` +# git clone https://github.com/Relintai/rcpp_sample_simple_data_collector_app.git rcpp_sample_simple_data_collector_app +# cd school_industrial_comm_2021 +# scons +``` + +Now you can build the project like: `scons bl`. ([b]uild [l]inux) + +Adding -jX to the build command will run the build on that many threads. Like: `scons bl -j4`. + +``` +# scons bl -j4 +- or - +# ./build.sh +``` +Now you can run it. + +First run migrations, this will create the necessary database tables: + +``` +# ./engine/bin/server m +- or - +# ./migrate.sh +``` + +Now you can start the server: + +``` +# ./engine/bin/server +- or - +# ./run.sh +``` + +Make sure to run it from the project's directory, as it needs data files. + +Now just open http://127.0.0.1:8080 + +You can push floats to the "a/b" MQTT topics, and the new values will be save in the `database.sqlite` file, and will appear +in your browser. + +If you have mosqitto installed you can use the `publish_random_data.py` or `publish_data.sh` scripts to automatically +push things into the proper MQTT topic. + +## Structure + +The main Application implementation is `app/ic_application.h`. + +The `main.cpp` contains the initialization code for the framework. + +The `content/www` folder is the wwwroot. diff --git a/SConstruct b/SConstruct new file mode 100644 index 0000000..a8ccf84 --- /dev/null +++ b/SConstruct @@ -0,0 +1,505 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +EnsureSConsVersion(0, 98, 1) + +import sys +import os +import subprocess +import json +import shutil +import traceback + + +folders = [ + 'app', +] + +module_folders = [ + '../modules', + '../custom_modules', +] + +main_file = 'main.cpp' + +repository_index = 0 +module_clone_path = '/modules/' +clone_command = 'git clone {0} {1}' + +visual_studio_call_vcvarsall = False +visual_studio_vcvarsall_path = 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat' +visual_studio_arch = 'amd64' + +exports = { + 'global': [], + 'linux': [], + 'windows': [], + 'android': [], + 'javascript': [], +} + +engine_repository = [ ['https://github.com/Relintai/rcpp_framework.git', 'git@github.com:Relintai/rcpp_framework.git'], 'engine', '' ] + +module_repositories = [ +] + +addon_repositories = [ +] + +third_party_addon_repositories = [ +] + +target_commits = {} + +engine_branch = 'master' + +def onerror(func, path, exc_info): + """ + https://stackoverflow.com/questions/2656322/shutil-rmtree-fails-on-windows-with-access-is-denied + + Because Windows. + + Error handler for ``shutil.rmtree``. + + If the error is due to an access error (read only file) + it attempts to add write permission and then retries. + + If the error is for another reason it re-raises the error. + + Usage : ``shutil.rmtree(path, onerror=onerror)`` + """ + import stat + if not os.access(path, os.W_OK): + # Is the error an access error ? + os.chmod(path, stat.S_IWUSR) + func(path) + else: + raise + +def load_target_commits_array(): + global target_commits + + if os.path.isfile('./HEADS'): + with open('./HEADS', 'r') as infile: + target_commits = json.load(infile) + else: + target_commits = {} + +def save_target_commits_array(): + with open('./HEADS', 'w') as outfile: + json.dump(target_commits, outfile) + +def update_repository(data, clone_path, branch = 'master'): + cwd = os.getcwd() + + full_path = cwd + clone_path + data[1] + '/' + + if not os.path.isdir(full_path): + os.chdir(cwd + clone_path) + + subprocess.call(clone_command.format(data[0][repository_index], data[1]), shell=True) + + os.chdir(full_path) + + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git checkout -B ' + branch + ' origin/' + branch, shell=True) + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git pull origin ' + branch, shell=True) + + process = subprocess.Popen('git rev-parse HEAD', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + output = process.communicate()[0].decode().strip() + + if data[1] not in target_commits: + target_commits[data[1]] = {} + + target_commits[data[1]][branch] = output + + os.chdir(cwd) + +def setup_repository(data, clone_path, branch = 'master'): + cwd = os.getcwd() + + full_path = cwd + clone_path + data[1] + '/' + + if not os.path.isdir(full_path): + os.chdir(cwd + clone_path) + + subprocess.call(clone_command.format(data[0][repository_index], data[1]), shell=True) + + os.chdir(full_path) + + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git checkout -B ' + branch + ' origin/' + branch, shell=True) + subprocess.call('git pull origin ' + branch, shell=True) + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + + if data[1] in target_commits: + target = target_commits[data[1]][branch] + + subprocess.call('git checkout -B ' + branch + ' ' + target, shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + + os.chdir(cwd) + +def copy_repository(data, target_folder, clone_path): + copytree(os.path.abspath(clone_path + data[1] + '/' + data[2]), os.path.abspath(target_folder + data[1])) + +def copytree(src, dst): + for item in os.listdir(src): + sp = os.path.join(src, item) + dp = os.path.join(dst, item) + + if os.path.isdir(sp): + if os.path.isdir(dp): + shutil.rmtree(dp, onerror=onerror) + + shutil.copytree(sp, dp) + else: + if not os.path.isdir(dst): + os.makedirs(dst) + + shutil.copy2(sp, dp) + +def update_engine(): + update_repository(engine_repository, '/', engine_branch) + +def update_modules(): + for rep in module_repositories: + update_repository(rep, module_clone_path) + copy_repository(rep, './engine/modules/', '.' + module_clone_path) + +def update_addons(): + for rep in addon_repositories: + update_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def update_addons_third_party_addons(): + for rep in third_party_addon_repositories: + update_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def update_all(): + update_engine() + update_modules() + update_addons() + update_addons_third_party_addons() + + save_target_commits_array() + + +def setup_engine(): + setup_repository(engine_repository, '/', engine_branch) + +def setup_modules(): + for rep in module_repositories: + setup_repository(rep, module_clone_path) + copy_repository(rep, './engine/modules/', '.' + module_clone_path) + +def setup_addons(): + for rep in addon_repositories: + setup_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def setup_addons_third_party_addons(): + for rep in third_party_addon_repositories: + setup_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def setup_all(): + setup_engine() + setup_modules() + setup_addons() + setup_addons_third_party_addons() + +def format_path(path): + if 'win' in sys.platform: + path = path.replace('/', '\\') + path = path.replace('~', '%userprofile%') + + return path + +def get_exports_for(platform): + export_command = 'export ' + command_separator = ';' + + if 'win' in sys.platform: + command_separator = '&' + export_command = 'set ' + + command = '' + + for p in exports[platform]: + command += export_command + p + command_separator + + return command + + +def parse_config(): + global visual_studio_vcvarsall_path + global visual_studio_arch + global visual_studio_call_vcvarsall + global exports + + if not os.path.isfile('build.config'): + return + + with open('build.config', 'r') as f: + + for line in f: + ls = line.strip() + if ls == '' or ls.startswith('#'): + continue + + words = line.split() + + if (len(words) < 2): + print('This build.config line is malformed, and got ignored: ' + ls) + continue + + if words[0] == 'visual_studio_vcvarsall_path': + visual_studio_vcvarsall_path = format_path(ls[29:]) + elif words[0] == 'visual_studio_arch': + visual_studio_arch = format_path(ls[19:]) + elif words[0] == 'visual_studio_call_vcvarsall': + visual_studio_call_vcvarsall = words[1].lower() in [ 'true', '1', 't', 'y', 'yes' ] + elif words[0] == 'export': + if (len(words) < 3) or not words[1] in exports: + print('This build.config line is malformed, and got ignored: ' + ls) + continue + + export_path = format_path(ls[8 + len(words[1]):]) + + exports[words[1]].append(export_path) + +parse_config() + +env = Environment() + +if len(sys.argv) > 1: + + arg = sys.argv[1] + + arg_split = arg.split('_') + arg = arg_split[0] + arg_split = arg_split[1:] + + if arg[0] == 'b': + build_string = get_exports_for('global') + 'scons ' + + build_string += 'target=' + if 'r' in arg: + build_string += 'release' + elif 'd' in arg: + build_string += 'debug' + else: + build_string += 'release_debug' + build_string += ' ' + + if 'm' in arg: + build_string += 'use_mingw=yes' + else: + if 'win' in sys.platform and visual_studio_call_vcvarsall: + build_string = 'call "{0}" {1}&'.format(visual_studio_vcvarsall_path, visual_studio_arch) + build_string + + if 'o' in arg: + build_string += 'use_llvm=yes' + + if 'v' in arg: + build_string += 'vsproj=yes' + + build_string += 'folders="' + + for f in folders: + build_string += '../' + f + build_string += ';' + + build_string += '" ' + + build_string += 'module_folders="' + + for f in module_folders: + build_string += f + build_string += ';' + + build_string += '" ' + + build_string += 'main_file="../' + main_file + '" ' + + for i in range(2, len(sys.argv)): + build_string += ' ' + sys.argv[i] + ' ' + + cwd = os.getcwd() + full_path = cwd + '/engine/' + + if not os.path.isdir(full_path): + print('engine directory doesnt exists.') + exit() + + os.chdir(full_path) + + if 'l' in arg: + build_string += 'platform=x11' + + build_string = get_exports_for('linux') + build_string + + print('Running command: ' + build_string) + + subprocess.call(build_string, shell=True) + elif 'w' in arg: + build_string += 'platform=windows' + + build_string = get_exports_for('windows') + build_string + + print('Running command: ' + build_string) + + subprocess.call(build_string, shell=True) + elif 'a' in arg: + build_string += 'platform=android' + + build_string = get_exports_for('android') + build_string + + print('Running command: ' + build_string + ' android_arch=armv7') + subprocess.call(build_string + ' android_arch=armv7', shell=True) + print('Running command: ' + build_string + ' android_arch=arm64v8') + subprocess.call(build_string + ' android_arch=arm64v8', shell=True) + print('Running command: ' + build_string + ' android_arch=x86') + subprocess.call(build_string + ' android_arch=x86', shell=True) + + os.chdir(full_path + 'platform/android/java/') + + print('Running command: ' + get_exports_for('global') + get_exports_for('android') + './gradlew generateGodotTemplates') + subprocess.call(get_exports_for('global') + get_exports_for('android') + './gradlew generateGodotTemplates', shell=True) + elif 'j' in arg: + build_string += 'platform=javascript' + + build_string = get_exports_for('javascript') + build_string + + print('Running command: ' + build_string) + subprocess.call(build_string, shell=True) + + else: + print('No platform specified') + exit() + + exit() + elif arg[0] == 'p': + if arg == 'p': + #print("Applies a patch. Append c for the compilation database patch. For example: pc") + print("Applies a patch. No Patches right now.") + exit() + + cwd = os.getcwd() + full_path = cwd + '/engine/' + + if not os.path.isdir(full_path): + print('engine directory doesnt exists.') + exit() + + os.chdir(full_path) + + #apply the patch to just the working directory, without creating a commit + + #if 'c' in arg: + # subprocess.call('git apply --index ../patches/compilation_db.patch', shell=True) + + #unstage all files + subprocess.call('git reset', shell=True) + + exit() + +opts = Variables(args=ARGUMENTS) + +opts.Add('a', 'What to do', '') +opts.Add(EnumVariable('action', 'What to do', 'setup', ('setup', 'update'))) +opts.Add('t', 'Action target', '') +opts.Add(EnumVariable('target', 'Action target', 'all', ('all', 'engine', 'modules', 'all_addons', 'addons', 'third_party_addons'))) +opts.Add(EnumVariable('repository_type', 'Type of repositories to clone from first', 'http', ('http', 'ssh'))) + +opts.Update(env) +Help(opts.GenerateHelpText(env)) + +load_target_commits_array() + +rt = env['repository_type'] + +if rt == 'ssh': + repository_index = 1 + +action = env['action'] +target = env['target'] + +if env['a']: + action = env['a'] + +if env['t']: + target = env['t'] + +if not os.path.isdir('./modules'): + os.mkdir('./modules') + +if 'm' in action: + godot_branch = 'master' + +if 'setup' in action or action[0] == 's': + if target == 'all': + setup_all() + elif target == 'engine': + setup_engine() + elif target == 'modules': + setup_modules() + elif target == 'all_addons': + setup_addons() + setup_addons_third_party_addons() + elif target == 'addons': + setup_addons() + elif target == 'third_party_addons': + setup_addons_third_party_addons() +elif 'update' in action or action[0] == 'u': + if target == 'all': + update_all() + elif target == 'engine': + update_engine() + save_target_commits_array() + elif target == 'modules': + update_modules() + save_target_commits_array() + elif target == 'all_addons': + update_addons() + update_addons_third_party_addons() + save_target_commits_array() + elif target == 'addons': + update_addons() + save_target_commits_array() + elif target == 'third_party_addons': + update_addons_third_party_addons() + save_target_commits_array() + diff --git a/app/ic_application.cpp b/app/ic_application.cpp new file mode 100644 index 0000000..74c9a43 --- /dev/null +++ b/app/ic_application.cpp @@ -0,0 +1,151 @@ +#include "ic_application.h" + +#include +#include + +#include + +#include "core/database/database_manager.h" +#include "core/file_cache.h" +#include "core/http/handler_instance.h" +#include "core/html/html_builder.h" +#include "core/database/query_result.h" +#include "core/http/request.h" +#include "core/utils.h" + +void ICApplication::index(Object *instance, Request *request) { + if (FileCache::get_singleton()->wwwroot_has_file("/index.html")) { + std::string fp = FileCache::get_singleton()->wwwroot + "/index.html"; + + request->send_file(fp); + + return; + } + + request->send_error(404); +} + +void ICApplication::get_sensor_data(Object *instance, Request *request) { + std::string sql = "SELECT * FROM sensor_data;"; + + QueryResult *res = DatabaseManager::get_singleton()->ddb->query(sql); + + std::string json; + + json += "["; + + bool first = true; + while (res->next_row()) { + if (first) { + first = false; + } else { + json += ","; + } + + json += "{"; + + json += "\"id\":" + std::string(res->get_cell(0)) + ","; + json += "\"client_id\":\"" + std::string(res->get_cell(1)) + "\","; + json += "\"measurement\":" + std::string(res->get_cell(2)); + + json += "}"; + } + + json += "]"; + + request->response->setContentType("application/json"); + request->response->setBody(json); + request->send(); +} + +void ICApplication::app_docs_page(Object *instance, Request *request) { + request->response->setBody(app_docs); + request->send(); +} + +void ICApplication::engine_docs_page(Object *instance, Request *request) { + request->response->setBody(engine_docs); + request->send(); +} + +void ICApplication::setup_routes() { + WebApplication::setup_routes(); + + index_func = HandlerInstance(index); + + main_route_map["sensor_data"] = HandlerInstance(get_sensor_data); + main_route_map["app_docs"] = HandlerInstance(app_docs_page); + main_route_map["engine_docs"] = HandlerInstance(engine_docs_page); +} + +void ICApplication::setup_middleware() { + WebApplication::setup_middleware(); + + //middlewares.push_back(ICApplication::session_middleware_func); +} + +void ICApplication::migrate() { + std::string sql = "CREATE TABLE sensor_data(" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "client_id TEXT NOT NULL," + "measurement REAL);"; + + DatabaseManager::get_singleton()->ddb->query_run(sql); +} + +void ICApplication::mqtt_sensor_callback(const std::string &client_id, const std::vector &data) { + if (client_id != "1") { + return; + } + + if (data.size() == 0) { + return; + } + + std::string d; + d.reserve(data.size()); + + for (int i = 0; i < data.size(); ++i) { + d += data[i]; + } + + //IMPORTANT: SQL INJECTION WILL WORK ON THIS, IF YOU DON"T FILTER THE CLINET IDS!!!! No prepared statement support yet! :( + std::string sql = "INSERT INTO sensor_data (client_id, measurement)" + "VALUES ('" + + client_id + "'," + d + ");"; + + DatabaseManager::get_singleton()->ddb->query_run(sql); +} + +void ICApplication::load_md(const std::string &file_name, std::string *str) { + FILE *f = fopen(file_name.c_str(), "r"); + + if (!f) { + printf("ICApplication::load_md: Error opening file!\n"); + return; + } + + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); /* same as rewind(f); */ + + str->resize(fsize); + + fread(&(*str)[0], 1, fsize, f); + fclose(f); + + Utils::markdown_to_html(str); +} + +ICApplication::ICApplication() : + WebApplication() { + + load_md("./engine/Readme.md", &engine_docs); + load_md("./Readme.md", &app_docs); +} + +ICApplication::~ICApplication() { +} + +std::string ICApplication::engine_docs; +std::string ICApplication::app_docs; \ No newline at end of file diff --git a/app/ic_application.h b/app/ic_application.h new file mode 100644 index 0000000..14de151 --- /dev/null +++ b/app/ic_application.h @@ -0,0 +1,37 @@ +#ifndef IC_APPLICATION_H +#define IC_APPLICATION_H + +#include + +#include "core/http/web_application.h" +#include "core/object.h" + +#include "modules/message_page/message_page.h" +#include "modules/list_page/list_page.h" +#include "modules/paged_article/paged_article.h" + +class ICApplication : public WebApplication { +public: + static void index(Object *instance, Request *request); + static void get_sensor_data(Object *instance, Request *request); + + static void app_docs_page(Object *instance, Request *request); + static void engine_docs_page(Object *instance, Request *request); + + virtual void setup_routes(); + virtual void setup_middleware(); + + virtual void migrate(); + + void mqtt_sensor_callback(const std::string &client_id, const std::vector &data); + + void load_md(const std::string &file_name, std::string *str); + + ICApplication(); + ~ICApplication(); + + static std::string engine_docs; + static std::string app_docs; +}; + +#endif \ No newline at end of file diff --git a/build.config.example b/build.config.example new file mode 100644 index 0000000..317567f --- /dev/null +++ b/build.config.example @@ -0,0 +1,44 @@ +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +# Rename this file to build.config to use it + +# Lines starting with # are comments. (Only works at the start of the line!) + +# Note: +# ~ will be converted to %userprofile% on windows +# / will be converted to \ on windows +# so you don't have to worry about it + +# Visual studio related setup: +visual_studio_call_vcvarsall True +visual_studio_vcvarsall_path C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Auxiliary/Build/vcvarsall.bat +visual_studio_arch amd64 + +# export related setup +# available export targets: global, linux, windows, android, javascript + +export global SCONS_CACHE=~/.scons_cache +export global SCONS_CACHE_LIMIT=5000 + +export android ANDROID_NDK_ROOT=~/SDKs/Android/NDK/android-ndk-r20b +export android ANDROID_NDK_HOME=~/SDKs/Android/NDK/android-ndk-r20b +export android ANDROID_HOME=~/SDKs/Android/SDK + diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..8830c0c --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +scons bl -j4 \ No newline at end of file diff --git a/content/www/css/main.css b/content/www/css/main.css new file mode 100644 index 0000000..09fe427 --- /dev/null +++ b/content/www/css/main.css @@ -0,0 +1,130 @@ +body { + padding: 0; + margin: 0; + background-color: rgb(255, 255, 255); +} + +a:visited { + color: blue; +} + +header { + color: white; + margin: 0; + padding: 0.8em 0.8em 0.8em 0.8em; + font-size: 24; + background-color: rgb(26, 29, 31); +} + +.header_link a { + color: rgb(129, 186, 240); + font-size: 18; +} + +.header_link { + font-size: 18; + margin: 0em 1em; +} + +.menu_active { + background-color: rgb(89, 21, 13); +} + +ul.menu { + background-color: rgb(46, 45, 45); + padding: 1em 1em 1em 1em; + margin: 0; +} + +ul.menu li { + display: inline; + color: white; + padding: 0em 0.3em; +} + +ul.menu li a { + color: white; + text-align: center; + padding: 1em 1em; + text-decoration: none; +} + +ul.menu li a:hover { + background-color: rgb(60, 60, 60); +} + +.content { + background-color: rgb(255, 255, 255); + margin: 1em 6em; + background-color: rgb(240, 240, 240); +} + +.inner_content { + padding: 1em 1em 0em 1em; + background-color: rgb(240, 240, 240); +} + +.list_entry { + margin: 0.5em 0em; + padding: 0.5em 0.5em; + border: 1px solid rgb(100, 100, 100); + border-radius: 3px; + background-color: rgb(255, 255, 255); +} + +footer { + border-top: 1px solid rgb(107, 107, 107); + text-align: center; + font-size: 12; + margin-top: 2em; + padding-top: 1em; + padding-bottom: 1em; + background-color: rgb(36, 40, 48); + color: white; +} + +footer a { + color: rgb(129, 186, 240); +} + +footer a:visited { + color: rgb(129, 186, 240); +} + +ul.pagination { + padding: 1em 1em 1em 1em; + margin: 0; + text-align: center; +} + +ul.pagination li { + display: inline; + border: 1px solid black; + padding: 0.2em 0em; + margin: 0em 0.2em 0em 0.2em; +} + +ul.pagination li a { + color: black; + text-align: center; + text-decoration: none; + padding: 0.2em 0.4em; +} + +ul.pagination li.disabled { + color: rgb(138, 138, 138); + text-align: center; + text-decoration: none; + padding: 0.2em 0.4em; +} + +ul.pagination li a:hover { + background-color: rgb(60, 60, 60); + color: white; +} + +.chart { + margin-left: auto; + margin-right: auto; + width: 800px; +} \ No newline at end of file diff --git a/content/www/index.html b/content/www/index.html new file mode 100644 index 0000000..5ecea16 --- /dev/null +++ b/content/www/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + +
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/content/www/js/chart.min.js b/content/www/js/chart.min.js new file mode 100644 index 0000000..6f839dd --- /dev/null +++ b/content/www/js/chart.min.js @@ -0,0 +1,13 @@ +/*! + * Chart.js v3.2.1 + * https://www.chartjs.org + * (c) 2021 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";const t="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function e(e,i,n){const o=n||(t=>Array.prototype.slice.call(t));let s=!1,a=[];return function(...n){a=o(n),s||(s=!0,t.call(window,(()=>{s=!1,e.apply(i,a)})))}}function i(t,e){let i;return function(){return e?(clearTimeout(i),i=setTimeout(t,e)):t(),e}}const n=t=>"start"===t?"left":"end"===t?"right":"center",o=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,s=(t,e,i)=>"right"===t?i:"center"===t?(e+i)/2:e;var a=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,n){const o=e.listeners[n],s=e.duration;o.forEach((n=>n({chart:t,initial:e.initial,numSteps:s,currentStep:Math.min(i-e.start,s)})))}_refresh(){const e=this;e._request||(e._running=!0,e._request=t.call(window,(()=>{e._update(),e._request=null,e._running&&e._refresh()})))}_update(t=Date.now()){const e=this;let i=0;e._charts.forEach(((n,o)=>{if(!n.running||!n.items.length)return;const s=n.items;let a,r=s.length-1,l=!1;for(;r>=0;--r)a=s[r],a._active?(a._total>n.duration&&(n.duration=a._total),a.tick(t),l=!0):(s[r]=s[s.length-1],s.pop());l&&(o.draw(),e._notify(o,n,t,"progress")),s.length||(n.running=!1,e._notify(o,n,t,"complete"),n.initial=!1),i+=s.length})),e._lastDate=t,0===i&&(e._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let n=i.length-1;for(;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}; +/*! + * @kurkle/color v0.1.9 + * https://github.com/kurkle/color#readme + * (c) 2020 Jukka Kurkela + * Released under the MIT License + */const r={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},l="0123456789ABCDEF",c=t=>l[15&t],h=t=>l[(240&t)>>4]+l[15&t],d=t=>(240&t)>>4==(15&t);function u(t){var e=function(t){return d(t.r)&&d(t.g)&&d(t.b)&&d(t.a)}(t)?c:h;return t?"#"+e(t.r)+e(t.g)+e(t.b)+(t.a<255?e(t.a):""):t}function f(t){return t+.5|0}const g=(t,e,i)=>Math.max(Math.min(t,i),e);function p(t){return g(f(2.55*t),0,255)}function m(t){return g(f(255*t),0,255)}function x(t){return g(f(t/2.55)/100,0,1)}function b(t){return g(f(100*t),0,100)}const _=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const y=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function v(t,e,i){const n=e*Math.min(i,1-i),o=(e,o=(e+t/30)%12)=>i-n*Math.max(Math.min(o-3,9-o,1),-1);return[o(0),o(8),o(4)]}function w(t,e,i){const n=(n,o=(n+t/60)%6)=>i-i*e*Math.max(Math.min(o,4-o,1),0);return[n(5),n(3),n(1)]}function M(t,e,i){const n=v(t,1,.5);let o;for(e+i>1&&(o=1/(e+i),e*=o,i*=o),o=0;o<3;o++)n[o]*=1-e-i,n[o]+=e;return n}function k(t){const e=t.r/255,i=t.g/255,n=t.b/255,o=Math.max(e,i,n),s=Math.min(e,i,n),a=(o+s)/2;let r,l,c;return o!==s&&(c=o-s,l=a>.5?c/(2-o-s):c/(o+s),r=o===e?(i-n)/c+(i>16&255,s>>8&255,255&s]}return t}(),T.transparent=[0,0,0,0]);const e=T[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}function L(t,e,i){if(t){let n=k(t);n[e]=Math.max(0,Math.min(n[e]+n[e]*i,0===e?360:1)),n=P(n),t.r=n[0],t.g=n[1],t.b=n[2]}}function E(t,e){return t?Object.assign(e||{},t):t}function I(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=m(t[3]))):(e=E(t,{r:0,g:0,b:0,a:1})).a=m(e.a),e}function z(t){return"r"===t.charAt(0)?function(t){const e=_.exec(t);let i,n,o,s=255;if(e){if(e[7]!==i){const t=+e[7];s=255&(e[8]?p(t):255*t)}return i=+e[1],n=+e[3],o=+e[5],i=255&(e[2]?p(i):i),n=255&(e[4]?p(n):n),o=255&(e[6]?p(o):o),{r:i,g:n,b:o,a:s}}}(t):C(t)}class F{constructor(t){if(t instanceof F)return t;const e=typeof t;let i;var n,o,s;"object"===e?i=I(t):"string"===e&&(s=(n=t).length,"#"===n[0]&&(4===s||5===s?o={r:255&17*r[n[1]],g:255&17*r[n[2]],b:255&17*r[n[3]],a:5===s?17*r[n[4]]:255}:7!==s&&9!==s||(o={r:r[n[1]]<<4|r[n[2]],g:r[n[3]]<<4|r[n[4]],b:r[n[5]]<<4|r[n[6]],a:9===s?r[n[7]]<<4|r[n[8]]:255})),i=o||R(t)||z(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=E(this._rgb);return t&&(t.a=x(t.a)),t}set rgb(t){this._rgb=I(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${x(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):this._rgb;var t}hexString(){return this._valid?u(this._rgb):this._rgb}hslString(){return this._valid?function(t){if(!t)return;const e=k(t),i=e[0],n=b(e[1]),o=b(e[2]);return t.a<255?`hsla(${i}, ${n}%, ${o}%, ${x(t.a)})`:`hsl(${i}, ${n}%, ${o}%)`}(this._rgb):this._rgb}mix(t,e){const i=this;if(t){const n=i.rgb,o=t.rgb;let s;const a=e===s?.5:e,r=2*a-1,l=n.a-o.a,c=((r*l==-1?r:(r+l)/(1+r*l))+1)/2;s=1-c,n.r=255&c*n.r+s*o.r+.5,n.g=255&c*n.g+s*o.g+.5,n.b=255&c*n.b+s*o.b+.5,n.a=a*n.a+(1-a)*o.a,i.rgb=n}return i}clone(){return new F(this.rgb)}alpha(t){return this._rgb.a=m(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=f(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return L(this._rgb,2,t),this}darken(t){return L(this._rgb,2,-t),this}saturate(t){return L(this._rgb,1,t),this}desaturate(t){return L(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=k(t);i[0]=D(i[0]+e),i=P(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function V(t){return new F(t)}const B=t=>t instanceof CanvasGradient||t instanceof CanvasPattern;function W(t){return B(t)?t:V(t)}function H(t){return B(t)?t:V(t).saturate(.5).darken(.1).hexString()}function N(){}const j=function(){let t=0;return function(){return t++}}();function $(t){return null==t}function Y(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)}function U(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}const X=t=>("number"==typeof t||t instanceof Number)&&isFinite(+t);function q(t,e){return X(t)?t:e}function K(t,e){return void 0===t?e:t}const G=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:t/e,Z=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function Q(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function J(t,e,i,n){let o,s,a;if(Y(t))if(s=t.length,n)for(o=s-1;o>=0;o--)e.call(i,t[o],o);else for(o=0;oi;)t=t[e.substr(i,n-i)],i=n+1,n=rt(e,i);return t}function ct(t){return t.charAt(0).toUpperCase()+t.slice(1)}const ht=t=>void 0!==t,dt=t=>"function"==typeof t,ut=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0},ft=Object.create(null),gt=Object.create(null);function pt(t,e){if(!e)return t;const i=e.split(".");for(let e=0,n=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>H(e.backgroundColor),this.hoverBorderColor=(t,e)=>H(e.borderColor),this.hoverColor=(t,e)=>H(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.describe(t)}set(t,e){return mt(this,t,e)}get(t){return pt(this,t)}describe(t,e){return mt(gt,t,e)}override(t,e){return mt(ft,t,e)}route(t,e,i,n){const o=pt(this,t),s=pt(this,i),a="_"+e;Object.defineProperties(o,{[a]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[a],e=s[n];return U(t)?Object.assign({},e,t):K(t,e)},set(t){this[a]=t}}})}}({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});const bt=Math.PI,_t=2*bt,yt=_t+bt,vt=Number.POSITIVE_INFINITY,wt=bt/180,Mt=bt/2,kt=bt/4,St=2*bt/3,Pt=Math.log10,Dt=Math.sign;function Ct(t){const e=Math.pow(10,Math.floor(Pt(t))),i=t/e;return(i<=1?1:i<=2?2:i<=5?5:10)*e}function Ot(t){const e=[],i=Math.sqrt(t);let n;for(n=1;nt-e)).pop(),e}function At(t){return!isNaN(parseFloat(t))&&isFinite(t)}function Tt(t,e,i){return Math.abs(t-e)=t}function Lt(t,e,i){let n,o,s;for(n=0,o=t.length;nr&&ln&&(n=s),n}function Ut(t,e,i,n){let o=(n=n||{}).data=n.data||{},s=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(o=n.data={},s=n.garbageCollect=[],n.font=e),t.save(),t.font=e;let a=0;const r=i.length;let l,c,h,d,u;for(l=0;li.length){for(l=0;l0&&t.stroke()}}function Gt(t,e,i){return i=i||.5,t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==s.strokeColor;let l,c;for(t.save(),s.translation&&t.translate(s.translation[0],s.translation[1]),$(s.rotation)||t.rotate(s.rotation),t.font=o.string,s.color&&(t.fillStyle=s.color),s.textAlign&&(t.textAlign=s.textAlign),s.textBaseline&&(t.textBaseline=s.textBaseline),l=0;lt[i]1;)n=s+o>>1,i(n)?s=n:o=n;return{lo:s,hi:o}}const oe=(t,e,i)=>ne(t,i,(n=>t[n][e]ne(t,i,(n=>t[n][e]>=i));function ae(t,e,i){let n=0,o=t.length;for(;nn&&t[o-1]>i;)o--;return n>0||o{const i="_onData"+ct(e),n=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const o=n.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),o}})})))}function ce(t,e){const i=t._chartjs;if(!i)return;const n=i.listeners,o=n.indexOf(e);-1!==o&&n.splice(o,1),n.length>0||(re.forEach((e=>{delete t[e]})),delete t._chartjs)}function he(t){const e=new Set;let i,n;for(i=0,n=t.length;i{o.push(t)})),o}function de(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function ue(t,e,i){let n;return"string"==typeof t?(n=parseInt(t,10),-1!==t.indexOf("%")&&(n=n/100*e.parentNode[i])):n=t,n}const fe=t=>window.getComputedStyle(t,null);function ge(t,e){return fe(t).getPropertyValue(e)}const pe=["top","right","bottom","left"];function me(t,e,i){const n={};i=i?"-"+i:"";for(let o=0;o<4;o++){const s=pe[o];n[s]=parseFloat(t[e+"-"+s+i])||0}return n.width=n.left+n.right,n.height=n.top+n.bottom,n}function xe(t,e){const{canvas:i,currentDevicePixelRatio:n}=e,o=fe(i),s="border-box"===o.boxSizing,a=me(o,"padding"),r=me(o,"border","width"),{x:l,y:c,box:h}=function(t,e){const i=t.native||t,n=i.touches,o=n&&n.length?n[0]:i,{offsetX:s,offsetY:a}=o;let r,l,c=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(s,a,i.target))r=s,l=a;else{const t=e.getBoundingClientRect();r=o.clientX-t.left,l=o.clientY-t.top,c=!0}return{x:r,y:l,box:c}}(t,i),d=a.left+(h&&r.left),u=a.top+(h&&r.top);let{width:f,height:g}=e;return s&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/n),y:Math.round((c-u)/g*i.height/n)}}const be=t=>Math.round(10*t)/10;function _e(t,e,i,n){const o=fe(t),s=me(o,"margin"),a=ue(o.maxWidth,t,"clientWidth")||vt,r=ue(o.maxHeight,t,"clientHeight")||vt,l=function(t,e,i){let n,o;if(void 0===e||void 0===i){const s=de(t);if(s){const t=s.getBoundingClientRect(),a=fe(s),r=me(a,"border","width"),l=me(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,n=ue(a.maxWidth,s,"clientWidth"),o=ue(a.maxHeight,s,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:n||vt,maxHeight:o||vt}}(t,e,i);let{width:c,height:h}=l;if("content-box"===o.boxSizing){const t=me(o,"border","width"),e=me(o,"padding");c-=e.width+t.width,h-=e.height+t.height}return c=Math.max(0,c-s.width),h=Math.max(0,n?Math.floor(c/n):h-s.height),c=be(Math.min(c,a,l.maxWidth)),h=be(Math.min(h,r,l.maxHeight)),c&&!h&&(h=be(c/2)),{width:c,height:h}}function ye(t,e,i){const n=t.currentDevicePixelRatio=e||1,{canvas:o,width:s,height:a}=t;o.height=a*n,o.width=s*n,t.ctx.setTransform(n,0,0,n,0,0),o.style&&(i||!o.style.height&&!o.style.width)&&(o.style.height=a+"px",o.style.width=s+"px")}const ve=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function we(t,e){const i=ge(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?+n[1]:void 0}function Me(t,e){return"native"in t?{x:t.x,y:t.y}:xe(t,e)}function ke(t,e,i,n){const{controller:o,data:s,_sorted:a}=t,r=o._cachedMeta.iScale;if(r&&e===r.axis&&a&&s.length){const t=r._reversePixels?se:oe;if(!n)return t(s,e,i);if(o._sharedOptions){const n=s[0],o="function"==typeof n.getRange&&n.getRange(e);if(o){const n=t(s,e,i-o),a=t(s,e,i+o);return{lo:n.lo,hi:a.hi}}}}return{lo:0,hi:s.length-1}}function Se(t,e,i,n,o){const s=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=s.length;t{t[r](o[a],n)&&s.push({element:t,datasetIndex:e,index:i}),t.inRange(o.x,o.y,n)&&(l=!0)})),i.intersect&&!l?[]:s}var Oe={modes:{index(t,e,i,n){const o=Me(e,t),s=i.axis||"x",a=i.intersect?Pe(t,o,s,n):De(t,o,s,!1,n),r=[];return a.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=a[0].index,i=t.data[e];i&&!i.skip&&r.push({element:i,datasetIndex:t.index,index:e})})),r):[]},dataset(t,e,i,n){const o=Me(e,t),s=i.axis||"xy";let a=i.intersect?Pe(t,o,s,n):De(t,o,s,!1,n);if(a.length>0){const e=a[0].datasetIndex,i=t.getDatasetMeta(e).data;a=[];for(let t=0;tPe(t,Me(e,t),i.axis||"xy",n),nearest:(t,e,i,n)=>De(t,Me(e,t),i.axis||"xy",i.intersect,n),x:(t,e,i,n)=>(i.axis="x",Ce(t,e,i,n)),y:(t,e,i,n)=>(i.axis="y",Ce(t,e,i,n))}};const Ae=new RegExp(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/),Te=new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);function Re(t,e){const i=(""+t).match(Ae);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}function Le(t,e){const i={},n=U(e),o=n?Object.keys(e):e,s=U(t)?n?i=>K(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of o)i[t]=+s(t)||0;return i}function Ee(t){return Le(t,{top:"y",right:"x",bottom:"y",left:"x"})}function Ie(t){return Le(t,["topLeft","topRight","bottomLeft","bottomRight"])}function ze(t){const e=Ee(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Fe(t,e){t=t||{},e=e||xt.font;let i=K(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let n=K(t.style,e.style);n&&!(""+n).match(Te)&&(console.warn('Invalid font style specified: "'+n+'"'),n="");const o={family:K(t.family,e.family),lineHeight:Re(K(t.lineHeight,e.lineHeight),i),size:i,style:n,weight:K(t.weight,e.weight),string:""};return o.string=$t(o),o}function Ve(t,e,i,n){let o,s,a,r=!0;for(o=0,s=t.length;ot.pos===e))}function Ne(t,e){return t.filter((t=>-1===We.indexOf(t.pos)&&t.box.axis===e))}function je(t,e){return t.sort(((t,i)=>{const n=e?i:t,o=e?t:i;return n.weight===o.weight?n.index-o.index:n.weight-o.weight}))}function $e(t,e,i,n){return Math.max(t[i],e[i])+Math.max(t[n],e[n])}function Ye(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function Ue(t,e,i){const n=i.box,o=t.maxPadding;U(i.pos)||(i.size&&(t[i.pos]-=i.size),i.size=i.horizontal?n.height:n.width,t[i.pos]+=i.size),n.getPadding&&Ye(o,n.getPadding());const s=Math.max(0,e.outerWidth-$e(o,t,"left","right")),a=Math.max(0,e.outerHeight-$e(o,t,"top","bottom")),r=s!==t.w,l=a!==t.h;return t.w=s,t.h=a,i.horizontal?{same:r,other:l}:{same:l,other:r}}function Xe(t,e){const i=e.maxPadding;function n(t){const n={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{n[t]=Math.max(e[t],i[t])})),n}return n(t?["left","right"]:["top","bottom"])}function qe(t,e,i){const n=[];let o,s,a,r,l,c;for(o=0,s=t.length,l=0;ot.box.fullSize)),!0),n=je(He(e,"left"),!0),o=je(He(e,"right")),s=je(He(e,"top"),!0),a=je(He(e,"bottom")),r=Ne(e,"x"),l=Ne(e,"y");return{fullSize:i,leftAndTop:n.concat(s),rightAndBottom:o.concat(l).concat(a).concat(r),chartArea:He(e,"chartArea"),vertical:n.concat(o).concat(l),horizontal:s.concat(a).concat(r)}}(t.boxes),l=r.vertical,c=r.horizontal;J(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const h=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:o,availableWidth:s,availableHeight:a,vBoxMaxWidth:s/2/h,hBoxMaxHeight:a/2}),u=Object.assign({},o);Ye(u,ze(n));const f=Object.assign({maxPadding:u,w:s,h:a,x:o.left,y:o.top},o);!function(t,e){let i,n,o;for(i=0,n=t.length;i{const i=e.box;Object.assign(i,t.chartArea),i.update(f.w,f.h)}))}};class Ze{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,n){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):i)}}isAttached(t){return!0}}class Qe extends Ze{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}}const Je={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ti=t=>null===t||""===t;const ei=!!ve&&{passive:!0};function ii(t,e,i){t.canvas.removeEventListener(e,i,ei)}function ni(t,e,i){const n=t.canvas,o=n&&de(n)||n,s=new MutationObserver((t=>{const e=de(o);t.forEach((t=>{for(let n=0;n{t.forEach((t=>{for(let e=0;e{i.currentDevicePixelRatio!==t&&e()})))}function li(t,i,n){const o=t.canvas,s=o&&de(o);if(!s)return;const a=e(((t,e)=>{const i=s.clientWidth;n(t,e),i{const e=t[0],i=e.contentRect.width,n=e.contentRect.height;0===i&&0===n||a(i,n)}));return r.observe(s),function(t,e){si.size||window.addEventListener("resize",ri),si.set(t,e)}(t,a),r}function ci(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){si.delete(t),si.size||window.removeEventListener("resize",ri)}(t)}function hi(t,i,n){const o=t.canvas,s=e((e=>{null!==t.ctx&&n(function(t,e){const i=Je[t.type]||t.type,{x:n,y:o}=xe(t,e);return{type:i,chart:e,native:t,x:void 0!==n?n:null,y:void 0!==o?o:null}}(e,t))}),t,(t=>{const e=t[0];return[e,e.offsetX,e.offsetY]}));return function(t,e,i){t.addEventListener(e,i,ei)}(o,i,s),s}class di extends Ze{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,n=t.getAttribute("height"),o=t.getAttribute("width");if(t.$chartjs={initial:{height:n,width:o,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",ti(o)){const e=we(t,"width");void 0!==e&&(t.width=e)}if(ti(n))if(""===t.style.height)t.height=t.width/(e||2);else{const e=we(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e.$chartjs)return!1;const i=e.$chartjs.initial;["height","width"].forEach((t=>{const n=i[t];$(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e.$chartjs,!0}addEventListener(t,e,i){this.removeEventListener(t,e);const n=t.$proxies||(t.$proxies={}),o={attach:ni,detach:oi,resize:li}[e]||hi;n[e]=o(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),n=i[e];if(!n)return;({attach:ci,detach:ci,resize:ci}[e]||ii)(t,e,n),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,n){return _e(t,e,i,n)}isAttached(t){const e=de(t);return!(!e||!de(e))}}var ui=Object.freeze({__proto__:null,BasePlatform:Ze,BasicPlatform:Qe,DomPlatform:di});const fi=t=>0===t||1===t,gi=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*_t/i),pi=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*_t/i)+1,mi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*Mt),easeOutSine:t=>Math.sin(t*Mt),easeInOutSine:t=>-.5*(Math.cos(bt*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>fi(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>fi(t)?t:gi(t,.075,.3),easeOutElastic:t=>fi(t)?t:pi(t,.075,.3),easeInOutElastic(t){const e=.1125;return fi(t)?t:t<.5?.5*gi(2*t,e,.45):.5+.5*pi(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-mi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*mi.easeInBounce(2*t):.5*mi.easeOutBounce(2*t-1)+.5},xi="transparent",bi={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const n=W(t||xi),o=n.valid&&W(e||xi);return o&&o.valid?o.mix(n,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class _i{constructor(t,e,i,n){const o=e[i];n=Ve([t.to,n,o,t.from]);const s=Ve([t.from,o,n]);this._active=!0,this._fn=t.fn||bi[t.type||typeof s],this._easing=mi[t.easing]||mi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=s,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,i){const n=this;if(n._active){n._notify(!1);const o=n._target[n._prop],s=i-n._start,a=n._duration-s;n._start=i,n._duration=Math.floor(Math.max(a,t.duration)),n._total+=s,n._loop=!!t.loop,n._to=Ve([t.to,e,o,t.from]),n._from=Ve([t.from,o,e])}}cancel(){const t=this;t._active&&(t.tick(Date.now()),t._active=!1,t._notify(!1))}tick(t){const e=this,i=t-e._start,n=e._duration,o=e._prop,s=e._from,a=e._loop,r=e._to;let l;if(e._active=s!==r&&(a||i1?2-l:l,l=e._easing(Math.min(1,Math.max(0,l))),e._target[o]=e._fn(s,r,l))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),xt.set("animations",{colors:{type:"color",properties:["color","borderColor","backgroundColor"]},numbers:{type:"number",properties:["x","y","borderWidth","radius","tension"]}}),xt.describe("animations",{_fallback:"animation"}),xt.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}});class vi{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!U(t))return;const e=this._properties;Object.getOwnPropertyNames(t).forEach((i=>{const n=t[i];if(!U(n))return;const o={};for(const t of yi)o[t]=n[t];(Y(n.properties)&&n.properties||[i]).forEach((t=>{t!==i&&e.has(t)||e.set(t,o)}))}))}_animateOptions(t,e){const i=e.options,n=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!n)return[];const o=this._createAnimations(n,i);return i.$shared&&function(t,e){const i=[],n=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),o}_createAnimations(t,e){const i=this._properties,n=[],o=t.$animations||(t.$animations={}),s=Object.keys(e),a=Date.now();let r;for(r=s.length-1;r>=0;--r){const l=s[r];if("$"===l.charAt(0))continue;if("options"===l){n.push(...this._animateOptions(t,e));continue}const c=e[l];let h=o[l];const d=i.get(l);if(h){if(d&&h.active()){h.update(d,c,a);continue}h.cancel()}d&&d.duration?(o[l]=h=new _i(d,t,l,c),n.push(h)):t[l]=c}return n}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(a.add(this._chart,i),!0):void 0}}function wi(t,e){const i=t&&t.options||{},n=i.reverse,o=void 0===i.min?e:0,s=void 0===i.max?e:0;return{start:n?s:o,end:n?o:s}}function Mi(t,e){const i=[],n=t._getSortedDatasetMetas(e);let o,s;for(o=0,s=n.length;o0||!i&&e<0)return n.index}return null}function Ci(t,e){const{chart:i,_cachedMeta:n}=t,o=i._stacks||(i._stacks={}),{iScale:s,vScale:a,index:r}=n,l=s.axis,c=a.axis,h=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(s,a,n),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Ai(t,e){e=e||t._parsed;for(const i of e){const e=i._stacks;if(!e||void 0===e[t.vScale.id]||void 0===e[t.vScale.id][t.index])return;delete e[t.vScale.id][t.index]}}const Ti=t=>"reset"===t||"none"===t,Ri=(t,e)=>e?t:Object.assign({},t);class Li{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.$context=void 0,this.initialize()}initialize(){const t=this,e=t._cachedMeta;t.configure(),t.linkScales(),e._stacked=Si(e.vScale,e),t.addElements()}updateIndex(t){this.index=t}linkScales(){const t=this,e=t.chart,i=t._cachedMeta,n=t.getDataset(),o=(t,e,i,n)=>"x"===t?e:"r"===t?n:i,s=i.xAxisID=K(n.xAxisID,Oi(e,"x")),a=i.yAxisID=K(n.yAxisID,Oi(e,"y")),r=i.rAxisID=K(n.rAxisID,Oi(e,"r")),l=i.indexAxis,c=i.iAxisID=o(l,s,a,r),h=i.vAxisID=o(l,a,s,r);i.xScale=t.getScaleForId(s),i.yScale=t.getScaleForId(a),i.rScale=t.getScaleForId(r),i.iScale=t.getScaleForId(c),i.vScale=t.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&ce(this._data,this),t._stacked&&Ai(t)}_dataCheck(){const t=this,e=t.getDataset(),i=e.data||(e.data=[]);U(i)?t._data=function(t){const e=Object.keys(t),i=new Array(e.length);let n,o,s;for(n=0,o=e.length;n0&&n._parsed[t-1];if(!1===i._parsing)n._parsed=o,n._sorted=!0,h=o;else{h=Y(o[t])?i.parseArrayData(n,o,t,e):U(o[t])?i.parseObjectData(n,o,t,e):i.parsePrimitiveData(n,o,t,e);const s=()=>null===c[r]||u&&c[r]p||d=0;--u)if(!m()){i.updateRangeFromParsed(c,t,g,l);break}return c}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let n,o,s;for(n=0,o=e.length;n=0&&tn.getContext(i,o)),d);return g.$shared&&(g.$shared=l,s[a]=Object.freeze(Ri(g,l))),g}_resolveAnimations(t,e,i){const n=this,o=n.chart,s=n._cachedDataOpts,a="animation-"+e,r=s[a];if(r)return r;let l;if(!1!==o.options.animation){const o=n.chart.config,s=o.datasetAnimationScopeKeys(n._type,e),a=o.getOptionScopes(n.getDataset(),s);l=o.createResolver(a,n.getContext(t,i,e))}const c=new vi(o,l&&l.animations);return l&&l._cacheable&&(s[a]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Ti(t)||this.chart._animationsDisabled}updateElement(t,e,i,n){Ti(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}updateSharedOptions(t,e,i){t&&!Ti(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,n){t.active=n;const o=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this,i=e._cachedMeta.data.length,n=e._data.length;n>i?e._insertElements(i,n-i,t):n{for(t.length+=e,r=t.length-1;r>=a;r--)t[r]=t[r-e]};for(l(s),r=t;r{o[t]=n[t]&&n[t].active()?n[t]._to:i[t]})),o}}Ei.defaults={},Ei.defaultRoutes=void 0;const Ii=new Map;function zi(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let n=Ii.get(i);return n||(n=new Intl.NumberFormat(t,e),Ii.set(i,n)),n}(e,i).format(t)}const Fi={values:t=>Y(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const n=this.chart.options.locale;let o,s=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(o="scientific"),s=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=Pt(Math.abs(s)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:o,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),zi(t,n,l)},logarithmic(t,e,i){if(0===t)return"0";const n=t/Math.pow(10,Math.floor(Pt(t)));return 1===n||2===n||5===n?Fi.numeric.call(this,t,e,i):""}};var Vi={formatters:Fi};function Bi(t,e){const i=t.options.ticks,n=i.maxTicksLimit||function(t){const e=t.options.offset,i=t._tickSize(),n=t._length/i+(e?0:1),o=t._maxLength/i;return Math.floor(Math.min(n,o))}(t),o=i.major.enabled?function(t){const e=[];let i,n;for(i=0,n=t.length;in)return function(t,e,i,n){let o,s=0,a=i[0];for(n=Math.ceil(n),o=0;oo)return e}return Math.max(o,1)}(o,e,n);if(s>0){let t,i;const n=s>1?Math.round((r-a)/(s-1)):null;for(Wi(e,l,c,$(n)?0:a-n,a),t=0,i=s-1;te.lineWidth,tickColor:(t,e)=>e.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Vi.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),xt.route("scale.ticks","color","","color"),xt.route("scale.grid","color","","borderColor"),xt.route("scale.grid","borderColor","","borderColor"),xt.route("scale.title","color","","color"),xt.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t}),xt.describe("scales",{_fallback:"scale"});const Hi=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i;function Ni(t,e){const i=[],n=t.length/e,o=t.length;let s=0;for(;sa+r)))return c}function $i(t){return t.drawTicks?t.tickLength:0}function Yi(t,e){if(!t.display)return 0;const i=Fe(t.font,e),n=ze(t.padding);return(Y(t.text)?t.text.length:1)*i.lineHeight+n.height}function Ui(t,e,i){let o=n(t);return(i&&"right"!==e||!i&&"right"===e)&&(o=(t=>"left"===t?"right":"right"===t?"left":t)(o)),o}class Xi extends Ei{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){const e=this;e.options=t.setContext(e.getContext()),e.axis=t.axis,e._userMin=e.parse(t.min),e._userMax=e.parse(t.max),e._suggestedMin=e.parse(t.suggestedMin),e._suggestedMax=e.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:n}=this;return t=q(t,Number.POSITIVE_INFINITY),e=q(e,Number.NEGATIVE_INFINITY),i=q(i,Number.POSITIVE_INFINITY),n=q(n,Number.NEGATIVE_INFINITY),{min:q(t,i),max:q(e,n),minDefined:X(t),maxDefined:X(e)}}getMinMax(t){const e=this;let i,{min:n,max:o,minDefined:s,maxDefined:a}=e.getUserBounds();if(s&&a)return{min:n,max:o};const r=e.getMatchingVisibleMetas();for(let l=0,c=r.length;l=s||n<=1||!t.isHorizontal())return void(t.labelRotation=o);const h=t._getLabelSizes(),d=h.widest.width,u=h.highest.height,f=Nt(t.chart.width-d,0,t.maxWidth);a=e.offset?t.maxWidth/n:f/(n-1),d+6>a&&(a=f/(n-(e.offset?.5:1)),r=t.maxHeight-$i(e.grid)-i.padding-Yi(e.title,t.chart.options.font),l=Math.sqrt(d*d+u*u),c=It(Math.min(Math.asin(Math.min((h.highest.height+6)/a,1)),Math.asin(Math.min(r/l,1))-Math.asin(u/l))),c=Math.max(o,Math.min(s,c))),t.labelRotation=c}afterCalculateLabelRotation(){Q(this.options.afterCalculateLabelRotation,[this])}beforeFit(){Q(this.options.beforeFit,[this])}fit(){const t=this,e={width:0,height:0},{chart:i,options:{ticks:n,title:o,grid:s}}=t,a=t._isVisible(),r=t.isHorizontal();if(a){const a=Yi(o,i.options.font);if(r?(e.width=t.maxWidth,e.height=$i(s)+a):(e.height=t.maxHeight,e.width=$i(s)+a),n.display&&t.ticks.length){const{first:i,last:o,widest:s,highest:a}=t._getLabelSizes(),l=2*n.padding,c=Et(t.labelRotation),h=Math.cos(c),d=Math.sin(c);if(r){const i=n.mirror?0:d*s.width+h*a.height;e.height=Math.min(t.maxHeight,e.height+i+l)}else{const i=n.mirror?0:h*s.width+d*a.height;e.width=Math.min(t.maxWidth,e.width+i+l)}t._calculatePadding(i,o,d,h)}}t._handleMargins(),r?(t.width=t._length=i.width-t._margins.left-t._margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=i.height-t._margins.top-t._margins.bottom)}_calculatePadding(t,e,i,n){const o=this,{ticks:{align:s,padding:a},position:r}=o.options,l=0!==o.labelRotation,c="top"!==r&&"x"===o.axis;if(o.isHorizontal()){const r=o.getPixelForTick(0)-o.left,h=o.right-o.getPixelForTick(o.ticks.length-1);let d=0,u=0;l?c?(d=n*t.width,u=i*e.height):(d=i*t.height,u=n*e.width):"start"===s?u=e.width:"end"===s?d=t.width:(d=t.width/2,u=e.width/2),o.paddingLeft=Math.max((d-r+a)*o.width/(o.width-r),0),o.paddingRight=Math.max((u-h+a)*o.width/(o.width-h),0)}else{let i=e.height/2,n=t.height/2;"start"===s?(i=0,n=t.height):"end"===s&&(i=e.height,n=0),o.paddingTop=i+a,o.paddingBottom=n+a}}_handleMargins(){const t=this;t._margins&&(t._margins.left=Math.max(t.paddingLeft,t._margins.left),t._margins.top=Math.max(t.paddingTop,t._margins.top),t._margins.right=Math.max(t.paddingRight,t._margins.right),t._margins.bottom=Math.max(t.paddingBottom,t._margins.bottom))}afterFit(){Q(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){const e=this;e.beforeTickToLabelConversion(),e.generateTickLabels(t),e.afterTickToLabelConversion()}_getLabelSizes(){const t=this;let e=t._labelSizes;if(!e){const i=t.options.ticks.sampleSize;let n=t.ticks;i{const i=t.gc,n=i.length/2;let o;if(n>e){for(o=0;o({width:o[t]||0,height:s[t]||0});return{first:v(0),last:v(e-1),widest:v(_),highest:v(y),widths:o,heights:s}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){const e=this;e._reversePixels&&(t=1-t);const i=e._startPixel+t*e._length;return jt(e._alignToPixels?Xt(e.chart,i,0):i)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this,i=e.ticks||[];if(t>=0&&tr*o?r/n:l/o:l*o0}_computeGridLineItems(t){const e=this,i=e.axis,n=e.chart,o=e.options,{grid:s,position:a}=o,r=s.offset,l=e.isHorizontal(),c=e.ticks.length+(r?1:0),h=$i(s),d=[],u=s.setContext(e.getContext()),f=u.drawBorder?u.borderWidth:0,g=f/2,p=function(t){return Xt(n,t,f)};let m,x,b,_,y,v,w,M,k,S,P,D;if("top"===a)m=p(e.bottom),v=e.bottom-h,M=m-g,S=p(t.top)+g,D=t.bottom;else if("bottom"===a)m=p(e.top),S=t.top,D=p(t.bottom)-g,v=m+g,M=e.top+h;else if("left"===a)m=p(e.right),y=e.right-h,w=m-g,k=p(t.left)+g,P=t.right;else if("right"===a)m=p(e.left),k=t.left,P=p(t.right)-g,y=m+g,w=e.left+h;else if("x"===i){if("center"===a)m=p((t.top+t.bottom)/2+.5);else if(U(a)){const t=Object.keys(a)[0],i=a[t];m=p(e.chart.scales[t].getPixelForValue(i))}S=t.top,D=t.bottom,v=m+g,M=v+h}else if("y"===i){if("center"===a)m=p((t.left+t.right)/2);else if(U(a)){const t=Object.keys(a)[0],i=a[t];m=p(e.chart.scales[t].getPixelForValue(i))}y=m-g,w=y-h,k=t.left,P=t.right}for(x=0;xe.value===t));if(n>=0){return i.setContext(e.getContext(n)).lineWidth}return 0}drawGrid(t){const e=this,i=e.options.grid,n=e.ctx,o=e._gridLineItems||(e._gridLineItems=e._computeGridLineItems(t));let s,a;const r=(t,e,i)=>{i.width&&i.color&&(n.save(),n.lineWidth=i.width,n.strokeStyle=i.color,n.setLineDash(i.borderDash||[]),n.lineDashOffset=i.borderDashOffset,n.beginPath(),n.moveTo(t.x,t.y),n.lineTo(e.x,e.y),n.stroke(),n.restore())};if(i.display)for(s=0,a=o.length;st[0])){ht(n)||(n=an("_fallback",t));const s={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:n,_getTarget:o,override:o=>qi([o,...t],e,i,n)};return new Proxy(s,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,n)=>Ji(i,n,(()=>function(t,e,i,n){let o;for(const s of e)if(o=an(Zi(s,t),i),ht(o))return Qi(t,o)?on(i,n,t,o):o}(n,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>rn(t).includes(e),ownKeys:t=>rn(t),set:(t,e,i)=>((t._storage||(t._storage=o()))[e]=i,delete t[e],delete t._keys,!0)})}function Ki(t,e,i,n){const o={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Gi(t,n),setContext:e=>Ki(t,e,i,n),override:o=>Ki(t.override(o),e,i,n)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>Ji(t,e,(()=>function(t,e,i){const{_proxy:n,_context:o,_subProxy:s,_descriptors:a}=t;let r=n[e];dt(r)&&a.isScriptable(e)&&(r=function(t,e,i,n){const{_proxy:o,_context:s,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+[...r].join("->")+"->"+t);r.add(t),e=e(s,a||n),r.delete(t),U(e)&&(e=on(o._scopes,o,t,e));return e}(e,r,t,i));Y(r)&&r.length&&(r=function(t,e,i,n){const{_proxy:o,_context:s,_subProxy:a,_descriptors:r}=i;if(ht(s.index)&&n(t))e=e[s.index%e.length];else if(U(e[0])){const i=e,n=o._scopes.filter((t=>t!==i));e=[];for(const l of i){const i=on(n,o,t,l);e.push(Ki(i,s,a&&a[t],r))}}return e}(e,r,t,a.isIndexable));Qi(e,r)&&(r=Ki(r,o,s&&s[e],a));return r}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,n)=>(t[i]=n,delete e[i],!0)})}function Gi(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:n=e.indexable,_allKeys:o=e.allKeys}=t;return{allKeys:o,scriptable:i,indexable:n,isScriptable:dt(i)?i:()=>i,isIndexable:dt(n)?n:()=>n}}const Zi=(t,e)=>t?t+ct(e):e,Qi=(t,e)=>U(e)&&"adapters"!==t;function Ji(t,e,i){let n=t[e];return ht(n)||(n=i(),ht(n)&&(t[e]=n)),n}function tn(t,e,i){return dt(t)?t(e,i):t}const en=(t,e)=>!0===t?e:"string"==typeof t?lt(e,t):void 0;function nn(t,e,i,n){for(const o of e){const e=en(i,o);if(e){t.add(e);const o=tn(e._fallback,i,e);if(ht(o)&&o!==i&&o!==n)return o}else if(!1===e&&ht(n)&&i!==n)return null}return!1}function on(t,e,i,n){const o=e._rootScopes,s=tn(e._fallback,i,n),a=[...t,...o],r=new Set;r.add(n);let l=sn(r,a,i,s||i);return null!==l&&((!ht(s)||s===i||(l=sn(r,a,s,l),null!==l))&&qi([...r],[""],o,s,(()=>{const t=e._getTarget();return i in t||(t[i]={}),t[i]})))}function sn(t,e,i,n){for(;i;)i=nn(t,e,i,n);return i}function an(t,e){for(const i of e){if(!i)continue;const e=i[t];if(ht(e))return e}}function rn(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return[...e]}(t._scopes)),e}const ln=Number.EPSILON||1e-14,cn=(t,e)=>e!t.skip))),"monotone"===e.cubicInterpolationMode)dn(t);else{let i=n?t[t.length-1]:t[0];for(o=0,s=t.length;o0?e.y:t.y}}function mn(t,e,i,n){const o={x:t.cp2x,y:t.cp2y},s={x:e.cp1x,y:e.cp1y},a=gn(t,o,i),r=gn(o,s,i),l=gn(s,e,i),c=gn(a,r,i),h=gn(r,l,i);return gn(c,h,i)}function xn(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function bn(t,e){let i,n;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,n=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=n)}function _n(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function yn(t){return"angle"===t?{between:Ht,compare:Bt,normalize:Wt}:{between:(t,e,i)=>t>=Math.min(e,i)&&t<=Math.max(i,e),compare:(t,e)=>t-e,normalize:t=>t}}function vn({start:t,end:e,count:i,loop:n,style:o}){return{start:t%i,end:e%i,loop:n&&(e-t+1)%i==0,style:o}}function wn(t,e,i){if(!i)return[t];const{property:n,start:o,end:s}=i,a=e.length,{compare:r,between:l,normalize:c}=yn(n),{start:h,end:d,loop:u,style:f}=function(t,e,i){const{property:n,start:o,end:s}=i,{between:a,normalize:r}=yn(n),l=e.length;let c,h,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,c=0,h=l;cb||l(o,x,p)&&0!==r(o,x),v=()=>!b||0===r(s,p)||l(s,x,p);for(let t=h,i=h;t<=d;++t)m=e[t%a],m.skip||(p=c(m[n]),b=l(p,o,s),null===_&&y()&&(_=0===r(p,o)?t:i),null!==_&&v()&&(g.push(vn({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,x=p);return null!==_&&g.push(vn({start:_,end:d,loop:u,count:a,style:f})),g}function Mn(t,e){const i=[],n=t.segments;for(let o=0;oo&&t[s%e].skip;)s--;return s%=e,{start:o,end:s}}(i,o,s,n);if(!0===n)return Sn([{start:a,end:r,loop:s}],i,e);return Sn(function(t,e,i,n){const o=t.length,s=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%o];i.skip||i.stop?l.skip||(n=!1,s.push({start:e%o,end:(a-1)%o,loop:n}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&s.push({start:e%o,end:r%o,loop:n}),s}(i,a,r{const n=i.split("."),o=n.pop(),s=[t].concat(n).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");xt.route(s,o,l,r)}))}(e,t.defaultRoutes);t.descriptors&&xt.describe(e,t.descriptors)}(t,a,n),e.override&&xt.override(t.id,t.overrides)),a}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,n=this.scope;i in e&&delete e[i],n&&i in xt[n]&&(delete xt[n][i],this.override&&delete ft[i])}}var An=new class{constructor(){this.controllers=new On(Li,"datasets",!0),this.elements=new On(Ei,"elements"),this.plugins=new On(Object,"plugins"),this.scales=new On(Xi,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){const n=this;[...e].forEach((e=>{const o=i||n._getRegistryForType(e);i||o.isForType(e)||o===n.plugins&&e.id?n._exec(t,o,e):J(e,(e=>{const o=i||n._getRegistryForType(e);n._exec(t,o,e)}))}))}_exec(t,e,i){const n=ct(t);Q(i["before"+n],[],i),e[t](i),Q(i["after"+n],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(n(e,i),t,"stop"),this._notify(n(i,e),t,"start")}}function Rn(t,e){return e||!1!==t?!0===t?{}:t:null}function Ln(t,e,i,n){const o=t.pluginScopeKeys(e),s=t.getOptionScopes(i,o);return t.createResolver(s,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function En(t,e){const i=xt.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function In(t,e){return"x"===t||"y"===t?t:e.axis||("top"===(i=e.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.charAt(0).toLowerCase();var i}function zn(t){const e=t.options||(t.options={});e.plugins=K(e.plugins,{}),e.scales=function(t,e){const i=ft[t.type]||{scales:{}},n=e.scales||{},o=En(t.type,e),s=Object.create(null),a=Object.create(null);return Object.keys(n).forEach((t=>{const e=n[t],r=In(t,e),l=function(t,e){return t===e?"_index_":"_value_"}(r,o),c=i.scales||{};s[r]=s[r]||t,a[t]=st(Object.create(null),[{axis:r},e,c[r],c[l]])})),t.data.datasets.forEach((i=>{const o=i.type||t.type,r=i.indexAxis||En(o,e),l=(ft[o]||{}).scales||{};Object.keys(l).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,r),o=i[e+"AxisID"]||s[e]||e;a[o]=a[o]||Object.create(null),st(a[o],[{axis:e},n[o],l[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];st(e,[xt.scales[e.type],xt.scale])})),a}(t,e)}function Fn(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const Vn=new Map,Bn=new Set;function Wn(t,e){let i=Vn.get(t);return i||(i=e(),Vn.set(t,i),Bn.add(i)),i}const Hn=(t,e,i)=>{const n=lt(e,i);void 0!==n&&t.add(n)};class Nn{constructor(t){this._config=function(t){return(t=t||{}).data=Fn(t.data),zn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Fn(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),zn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Wn(t,(()=>[["datasets."+t,""]]))}datasetAnimationScopeKeys(t,e){return Wn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,"transitions."+e],["datasets."+t,""]]))}datasetElementScopeKeys(t,e){return Wn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,"datasets."+t,"elements."+e,""]]))}pluginScopeKeys(t){const e=t.id;return Wn(`${this.type}-plugin-${e}`,(()=>[["plugins."+e,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let n=i.get(t);return n&&!e||(n=new Map,i.set(t,n)),n}getOptionScopes(t,e,i){const{options:n,type:o}=this,s=this._cachedScopes(t,i),a=s.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>Hn(r,t,e)))),e.forEach((t=>Hn(r,n,t))),e.forEach((t=>Hn(r,ft[o]||{},t))),e.forEach((t=>Hn(r,xt,t))),e.forEach((t=>Hn(r,gt,t)))}));const l=[...r];return Bn.has(e)&&s.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,ft[e]||{},xt.datasets[e]||{},{type:e},xt,gt]}resolveNamedOptions(t,e,i,n=[""]){const o={$shared:!0},{resolver:s,subPrefixes:a}=jn(this._resolverCache,t,n);let r=s;if(function(t,e){const{isScriptable:i,isIndexable:n}=Gi(t);for(const o of e)if(i(o)&&dt(t[o])||n(o)&&Y(t[o]))return!0;return!1}(s,e)){o.$shared=!1;r=Ki(s,i=dt(i)?i():i,this.createResolver(t,i,a))}for(const t of e)o[t]=r[t];return o}createResolver(t,e,i=[""],n){const{resolver:o}=jn(this._resolverCache,t,i);return U(e)?Ki(o,e,void 0,n):o}}function jn(t,e,i){let n=t.get(e);n||(n=new Map,t.set(e,n));const o=i.join();let s=n.get(o);if(!s){s={resolver:qi(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},n.set(o,s)}return s}const $n=["top","bottom","left","right","chartArea"];function Yn(t,e){return"top"===t||"bottom"===t||-1===$n.indexOf(t)&&"x"===e}function Un(t,e){return function(i,n){return i[t]===n[t]?i[e]-n[e]:i[t]-n[t]}}function Xn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),Q(i&&i.onComplete,[t],e)}function qn(t){const e=t.chart,i=e.options.animation;Q(i&&i.onProgress,[t],e)}function Kn(){return"undefined"!=typeof window&&"undefined"!=typeof document}function Gn(t){return Kn()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Zn={},Qn=t=>{const e=Gn(t);return Object.values(Zn).filter((t=>t.canvas===e)).pop()};class Jn{constructor(t,e){const n=this;this.config=e=new Nn(e);const o=Gn(t),s=Qn(o);if(s)throw new Error("Canvas is already in use. Chart with ID '"+s.id+"' must be destroyed before the canvas can be reused.");const r=e.createResolver(e.chartOptionScopes(),n.getContext());this.platform=n._initializePlatform(o,e);const l=n.platform.acquireContext(o,r.aspectRatio),c=l&&l.canvas,h=c&&c.height,d=c&&c.width;this.id=j(),this.ctx=l,this.canvas=c,this.width=d,this.height=h,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._sortedMetasets=[],this.scales={},this.scale=void 0,this._plugins=new Tn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=i((()=>this.update("resize")),r.resizeDelay||0),Zn[n.id]=n,l&&c?(a.listen(n,"complete",Xn),a.listen(n,"progress",qn),n._initialize(),n.attached&&n.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return $(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){const t=this;return t.notifyPlugins("beforeInit"),t.options.responsive?t.resize():ye(t,t.options.devicePixelRatio),t.bindEvents(),t.notifyPlugins("afterInit"),t}_initializePlatform(t,e){return e.platform?new e.platform:!Kn()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?new Qe:new di}clear(){return qt(this.canvas,this.ctx),this}stop(){return a.stop(this),this}resize(t,e){a.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this,n=i.options,o=i.canvas,s=n.maintainAspectRatio&&i.aspectRatio,a=i.platform.getMaximumSize(o,t,e,s),r=i.currentDevicePixelRatio,l=n.devicePixelRatio||i.platform.getDevicePixelRatio();i.width===a.width&&i.height===a.height&&r===l||(i.width=a.width,i.height=a.height,i._aspectRatio=i.aspectRatio,ye(i,l,!0),i.notifyPlugins("resize",{size:a}),Q(n.onResize,[i,a],i),i.attached&&i._doResize()&&i.render())}ensureScalesHaveIDs(){J(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this,e=t.options,i=e.scales,n=t.scales,o=Object.keys(n).reduce(((t,e)=>(t[e]=!1,t)),{});let s=[];i&&(s=s.concat(Object.keys(i).map((t=>{const e=i[t],n=In(t,e),o="r"===n,s="x"===n;return{options:e,dposition:o?"chartArea":s?"bottom":"left",dtype:o?"radialLinear":s?"category":"linear"}})))),J(s,(i=>{const s=i.options,a=s.id,r=In(a,s),l=K(s.type,i.dtype);void 0!==s.position&&Yn(s.position,r)===Yn(i.dposition)||(s.position=i.dposition),o[a]=!0;let c=null;if(a in n&&n[a].type===l)c=n[a];else{c=new(An.getScale(l))({id:a,type:l,ctx:t.ctx,chart:t}),n[c.id]=c}c.init(s,e)})),J(o,((t,e)=>{t||delete n[e]})),J(n,(e=>{Ge.configure(t,e,e.options),Ge.addBox(t,e)}))}_updateMetasetIndex(t,e){const i=this._metasets,n=t.index;n!==e&&(i[n]=i[e],i[e]=t,t.index=e)}_updateMetasets(){const t=this,e=t._metasets,i=t.data.datasets.length,n=e.length;if(n>i){for(let e=i;ei.length&&delete t._stacks,e.forEach(((e,n)=>{0===i.filter((t=>t===e._dataset)).length&&t._destroyDatasetMeta(n)}))}buildOrUpdateControllers(){const t=this,e=[],i=t.data.datasets;let n,o;for(t._removeUnreferencedMetasets(),n=0,o=i.length;n{t.getDatasetMeta(i).controller.reset()}),t)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this,i=e.config;i.update(),e._options=i.createResolver(i.chartOptionScopes(),e.getContext()),J(e.scales,(t=>{Ge.removeBox(e,t)}));const n=e._animationsDisabled=!e.options.animation;e.ensureScalesHaveIDs(),e.buildOrUpdateScales();const o=new Set(Object.keys(e._listeners)),s=new Set(e.options.events);if(ut(o,s)||(e.unbindEvents(),e.bindEvents()),e._plugins.invalidate(),!1===e.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const a=e.buildOrUpdateControllers();e.notifyPlugins("beforeElementsUpdate");let r=0;for(let t=0,i=e.data.datasets.length;t{t.reset()})),e._updateDatasets(t),e.notifyPlugins("afterUpdate",{mode:t}),e._layers.sort(Un("z","_idx")),e._lastEvent&&e._eventHandler(e._lastEvent,!0),e.render()}_updateLayout(t){const e=this;if(!1===e.notifyPlugins("beforeLayout",{cancelable:!0}))return;Ge.update(e,e.width,e.height,t);const i=e.chartArea,n=i.width<=0||i.height<=0;e._layers=[],J(e.boxes,(t=>{n&&"chartArea"===t.position||(t.configure&&t.configure(),e._layers.push(...t._layers()))}),e),e._layers.forEach(((t,e)=>{t._idx=e})),e.notifyPlugins("afterLayout")}_updateDatasets(t){const e=this,i="function"==typeof t;if(!1!==e.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let n=0,o=e.data.datasets.length;n=0;--i)t._drawDataset(e[i]);t.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this,i=e.ctx,n=t._clip,o=e.chartArea,s={meta:t,index:t.index,cancelable:!0};!1!==e.notifyPlugins("beforeDatasetDraw",s)&&(Zt(i,{left:!1===n.left?0:o.left-n.left,right:!1===n.right?e.width:o.right+n.right,top:!1===n.top?0:o.top-n.top,bottom:!1===n.bottom?e.height:o.bottom+n.bottom}),t.controller.draw(),Qt(i),s.cancelable=!1,e.notifyPlugins("afterDatasetDraw",s))}getElementsAtEventForMode(t,e,i,n){const o=Oe.modes[e];return"function"==typeof o?o(this,t,i,n):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let n=i.filter((t=>t&&t._dataset===e)).pop();return n||(n=i[t]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1}),n}getContext(){return this.$context||(this.$context={chart:this,type:"chart"})}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateDatasetVisibility(t,e){const i=this,n=e?"show":"hide",o=i.getDatasetMeta(t),s=o.controller._resolveAnimations(void 0,n);i.setDatasetVisibility(t,e),s.update(o,{visible:e}),i.update((e=>e.datasetIndex===t?n:void 0))}hide(t){this._updateDatasetVisibility(t,!1)}show(t){this._updateDatasetVisibility(t,!0)}_destroyDatasetMeta(t){const e=this,i=e._metasets&&e._metasets[t];i&&i.controller&&(i.controller._destroy(),delete e._metasets[t])}destroy(){const t=this,{canvas:e,ctx:i}=t;let n,o;for(t.stop(),a.remove(t),n=0,o=t.data.datasets.length;n{i.addEventListener(t,n,o),e[n]=o},o=(n,o)=>{e[n]&&(i.removeEventListener(t,n,o),delete e[n])};let s=function(e,i,n){e.offsetX=i,e.offsetY=n,t._eventHandler(e)};if(J(t.options.events,(t=>n(t,s))),t.options.responsive){let e;s=(e,i)=>{t.canvas&&t.resize(e,i)};const a=()=>{o("attach",a),t.attached=!0,t.resize(),n("resize",s),n("detach",e)};e=()=>{t.attached=!1,o("resize",s),n("attach",a)},i.isAttached(t.canvas)?a():e()}else t.attached=!0}unbindEvents(){const t=this,e=t._listeners;e&&(t._listeners={},J(e,((e,i)=>{t.platform.removeEventListener(t,i,e)})))}updateHoverStyle(t,e,i){const n=i?"set":"remove";let o,s,a,r;for("dataset"===e&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+n+"DatasetHoverStyle"]()),a=0,r=t.length;a{const n=e.getDatasetMeta(t);if(!n)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:n.data[i],index:i}}));!tt(n,i)&&(e._active=n,e._updateHoverStyles(n,i))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}_updateHoverStyles(t,e,i){const n=this,o=n.options.hover,s=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),a=s(e,t),r=i?t:s(t,e);a.length&&n.updateHoverStyle(a,o.mode,!1),r.length&&o.mode&&n.updateHoverStyle(r,o.mode,!0)}_eventHandler(t,e){const i=this,n={event:t,replay:e,cancelable:!0},o=e=>(e.options.events||this.options.events).includes(t.type);if(!1===i.notifyPlugins("beforeEvent",n,o))return;const s=i._handleEvent(t,e);return n.cancelable=!1,i.notifyPlugins("afterEvent",n,o),(s||n.changed)&&i.render(),i}_handleEvent(t,e){const i=this,{_active:n=[],options:o}=i,s=o.hover,a=e;let r=[],l=!1,c=null;return"mouseout"!==t.type&&(r=i.getElementsAtEventForMode(t,s.mode,s,a),c="click"===t.type?i._lastEvent:t),i._lastEvent=null,Gt(t,i.chartArea,i._minPadding)&&(Q(o.onHover,[t,r,i],i),"mouseup"!==t.type&&"click"!==t.type&&"contextmenu"!==t.type||Q(o.onClick,[t,r,i],i)),l=!tt(r,n),(l||e)&&(i._active=r,i._updateHoverStyles(r,n,e)),i._lastEvent=c,l}}const to=()=>J(Jn.instances,(t=>t._plugins.invalidate())),eo=!0;function io(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}Object.defineProperties(Jn,{defaults:{enumerable:eo,value:xt},instances:{enumerable:eo,value:Zn},overrides:{enumerable:eo,value:ft},registry:{enumerable:eo,value:An},version:{enumerable:eo,value:"3.2.1"},getChart:{enumerable:eo,value:Qn},register:{enumerable:eo,value:(...t)=>{An.add(...t),to()}},unregister:{enumerable:eo,value:(...t)=>{An.remove(...t),to()}}});class no{constructor(t){this.options=t||{}}formats(){return io()}parse(t,e){return io()}format(t,e){return io()}add(t,e,i){return io()}diff(t,e,i){return io()}startOf(t,e,i){return io()}endOf(t,e){return io()}}no.override=function(t){Object.assign(no.prototype,t)};var oo={_date:no};function so(t){const e=function(t){if(!t._cache.$bar){const e=t.getMatchingVisibleMetas("bar");let i=[];for(let n=0,o=e.length;nt-e)))}return t._cache.$bar}(t);let i,n,o,s,a=t._length;const r=()=>{32767!==o&&-32768!==o&&(ht(s)&&(a=Math.min(a,Math.abs(o-s)||a)),s=o)};for(i=0,n=e.length;iMath.abs(r)&&(l=r,c=a),e[i.axis]=c,e._custom={barStart:l,barEnd:c,start:o,end:s,min:a,max:r}}(t,e,i,n):e[i.axis]=i.parse(t,n),e}function ro(t,e,i,n){const o=t.iScale,s=t.vScale,a=o.getLabels(),r=o===s,l=[];let c,h,d,u;for(c=i,h=i+n;c0?(p+=t,h-=t):h<0&&(p-=t,h+=t)}return{size:h,base:p,head:c,center:c+h/2}}_calculateBarIndexPixels(t,e){const i=this,n=e.scale,o=i.options,s=o.skipNull,a=K(o.maxBarThickness,1/0);let r,l;if(e.grouped){const n=s?i._getStackCount(t):e.stackCount,c="flex"===o.barThickness?function(t,e,i,n){const o=e.pixels,s=o[t];let a=t>0?o[t-1]:null,r=t=0;--n)i=Math.max(i,t[n].size()/2,e[n]._custom);return i>0&&i}getLabelAndValue(t){const e=this._cachedMeta,{xScale:i,yScale:n}=e,o=this.getParsed(t),s=i.getLabelForValue(o.x),a=n.getLabelForValue(o.y),r=o._custom;return{label:e.label,value:"("+s+", "+a+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,n){const o=this,s="reset"===n,{xScale:a,yScale:r}=o._cachedMeta,l=o.resolveDataElementOptions(e,n),c=o.getSharedOptions(l),h=o.includeOptions(n,c);for(let l=e;l""}}}};class uo extends Li{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,n=this._cachedMeta;let o,s;for(o=t,s=t+e;oHt(t,r,l)?1:Math.max(e,e*i,n,n*i),g=(t,e,n)=>Ht(t,r,l)?-1:Math.min(e,e*i,n,n*i),p=f(0,c,d),m=f(Mt,h,u),x=g(bt,c,d),b=g(bt+Mt,h,u);n=(p-x)/2,o=(m-b)/2,s=-(p+x)/2,a=-(m+b)/2}return{ratioX:n,ratioY:o,offsetX:s,offsetY:a}}(d,h,l),m=(n.width-a)/u,x=(n.height-a)/f,b=Math.max(Math.min(m,x)/2,0),_=Z(e.options.radius,b),y=(_-Math.max(_*l,0))/e._getVisibleDatasetWeightTotal();e.offsetX=g*_,e.offsetY=p*_,o.total=e.calculateTotal(),e.outerRadius=_-y*e._getRingWeightOffset(e.index),e.innerRadius=Math.max(e.outerRadius-y*c,0),e.updateElements(s,0,s.length,t)}_circumference(t,e){const i=this,n=i.options,o=i._cachedMeta,s=i._getCircumference();return e&&n.animation.animateRotate||!this.chart.getDataVisibility(t)||null===o._parsed[t]?0:i.calculateCircumference(o._parsed[t]*s/_t)}updateElements(t,e,i,n){const o=this,s="reset"===n,a=o.chart,r=a.chartArea,l=a.options.animation,c=(r.left+r.right)/2,h=(r.top+r.bottom)/2,d=s&&l.animateScale,u=d?0:o.innerRadius,f=d?0:o.outerRadius,g=o.resolveDataElementOptions(e,n),p=o.getSharedOptions(g),m=o.includeOptions(n,p);let x,b=o._getRotation();for(x=0;x0&&!isNaN(t)?_t*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,n=i.data.labels||[],o=zi(e._parsed[t],i.options.locale);return{label:n[t]||"",value:o}}getMaxBorderWidth(t){const e=this;let i=0;const n=e.chart;let o,s,a,r,l;if(!t)for(o=0,s=n.data.datasets.length;o{const n=t.getDatasetMeta(0).controller.getStyle(i);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,hidden:!t.getDataVisibility(i),index:i}})):[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label(t){let e=t.label;const i=": "+t.formattedValue;return Y(e)?(e=e.slice(),e[0]+=i):e+=i,e}}}}};class fo extends Li{initialize(){this.enableOptionSharing=!0,super.initialize()}update(t){const e=this,i=e._cachedMeta,{dataset:n,data:o=[],_dataset:s}=i,a=e.chart._animationsDisabled;let{start:r,count:l}=function(t,e,i){const n=e.length;let o=0,s=n;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:c,max:h,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(o=Nt(Math.min(oe(r,a.axis,c).lo,i?n:oe(e,l,a.getPixelForValue(c)).lo),0,n-1)),s=u?Nt(Math.max(oe(r,a.axis,h).hi+1,i?0:oe(e,l,a.getPixelForValue(h)).hi+1),o,n)-o:n-o}return{start:o,count:s}}(i,o,a);e._drawStart=r,e._drawCount=l,function(t){const{xScale:e,yScale:i,_scaleRanges:n}=t,o={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!n)return t._scaleRanges=o,!0;const s=n.xmin!==e.min||n.xmax!==e.max||n.ymin!==i.min||n.ymax!==i.max;return Object.assign(n,o),s}(i)&&(r=0,l=o.length),n._decimated=!!s._decimated,n.points=o;const c=e.resolveDatasetElementOptions(t);e.options.showLine||(c.borderWidth=0),c.segment=e.options.segment,e.updateElement(n,void 0,{animated:!a,options:c},t),e.updateElements(o,r,l,t)}updateElements(t,e,i,n){const o=this,s="reset"===n,{xScale:a,yScale:r,_stacked:l}=o._cachedMeta,c=o.resolveDataElementOptions(e,n),h=o.getSharedOptions(c),d=o.includeOptions(n,h),u=o.options.spanGaps,f=At(u)?u:Number.POSITIVE_INFINITY,g=o.chart._animationsDisabled||s||"none"===n;let p=e>0&&o.getParsed(e-1);for(let c=e;c0&&i.x-p.x>f,u.parsed=i,d&&(u.options=h||o.resolveDataElementOptions(c,n)),g||o.updateElement(e,c,u,n),p=i}o.updateSharedOptions(h,n,c)}getMaxOverflow(){const t=this,e=t._cachedMeta,i=e.dataset,n=i.options&&i.options.borderWidth||0,o=e.data||[];if(!o.length)return n;const s=o[0].size(t.resolveDataElementOptions(0)),a=o[o.length-1].size(t.resolveDataElementOptions(o.length-1));return Math.max(n,s,a)/2}draw(){this._cachedMeta.dataset.updateControlPoints(this.chart.chartArea),super.draw()}}fo.id="line",fo.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1},fo.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};class go extends Li{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}_updateRadius(){const t=this,e=t.chart,i=e.chartArea,n=e.options,o=Math.min(i.right-i.left,i.bottom-i.top),s=Math.max(o/2,0),a=(s-Math.max(n.cutoutPercentage?s/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();t.outerRadius=s-a*t.index,t.innerRadius=t.outerRadius-a}updateElements(t,e,i,n){const o=this,s="reset"===n,a=o.chart,r=o.getDataset(),l=a.options.animation,c=o._cachedMeta.rScale,h=c.xCenter,d=c.yCenter,u=c.getIndexAngle(0)-.5*bt;let f,g=u;const p=360/o.countVisibleElements();for(f=0;f{!isNaN(t.data[n])&&this.chart.getDataVisibility(n)&&i++})),i}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?Et(this.resolveDataElementOptions(t,e).angle||i):0}}go.id="polarArea",go.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0},go.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(((e,i)=>{const n=t.getDatasetMeta(0).controller.getStyle(i);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,hidden:!t.getDataVisibility(i),index:i}})):[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label:t=>t.chart.data.labels[t.dataIndex]+": "+t.formattedValue}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};class po extends uo{}po.id="pie",po.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};class mo extends Li{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}update(t){const e=this,i=e._cachedMeta,n=i.dataset,o=i.data||[],s=i.iScale.getLabels();if(n.points=o,"resize"!==t){const i=e.resolveDatasetElementOptions(t);e.options.showLine||(i.borderWidth=0);const a={_loop:!0,_fullLoop:s.length===o.length,options:i};e.updateElement(n,void 0,a,t)}e.updateElements(o,0,o.length,t)}updateElements(t,e,i,n){const o=this,s=o.getDataset(),a=o._cachedMeta.rScale,r="reset"===n;for(let l=e;l"",label:t=>"("+t.label+", "+t.formattedValue+")"}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var bo=Object.freeze({__proto__:null,BarController:co,BubbleController:ho,DoughnutController:uo,LineController:fo,PolarAreaController:go,PieController:po,RadarController:mo,ScatterController:xo});function _o(t,e){const{startAngle:i,endAngle:n,pixelMargin:o,x:s,y:a,outerRadius:r,innerRadius:l}=e;let c=o/r;t.beginPath(),t.arc(s,a,r,i-c,n+c),l>o?(c=o/l,t.arc(s,a,l,n+c,i-c,!0)):t.arc(s,a,o,n+Mt,i-Mt),t.closePath(),t.clip()}function yo(t,e,i,n){const o=Le(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const s=(i-e)/2,a=Math.min(s,n*e/2),r=t=>{const e=(i-Math.min(s,t))*n/2;return Nt(t,0,Math.min(s,e))};return{outerStart:r(o.outerStart),outerEnd:r(o.outerEnd),innerStart:Nt(o.innerStart,0,a),innerEnd:Nt(o.innerEnd,0,a)}}function vo(t,e,i,n){return{x:i+t*Math.cos(e),y:n+t*Math.sin(e)}}function wo(t,e){const{x:i,y:n,startAngle:o,endAngle:s,pixelMargin:a}=e,r=Math.max(e.outerRadius-a,0),l=e.innerRadius+a,{outerStart:c,outerEnd:h,innerStart:d,innerEnd:u}=yo(e,l,r,s-o),f=r-c,g=r-h,p=o+c/f,m=s-h/g,x=l+d,b=l+u,_=o+d/x,y=s-u/b;if(t.beginPath(),t.arc(i,n,r,p,m),h>0){const e=vo(g,m,i,n);t.arc(e.x,e.y,h,m,s+Mt)}const v=vo(b,s,i,n);if(t.lineTo(v.x,v.y),u>0){const e=vo(b,y,i,n);t.arc(e.x,e.y,u,s+Mt,y+Math.PI)}if(t.arc(i,n,l,s-u/l,o+d/l,!0),d>0){const e=vo(x,_,i,n);t.arc(e.x,e.y,d,_+Math.PI,o-Mt)}const w=vo(f,o,i,n);if(t.lineTo(w.x,w.y),c>0){const e=vo(f,p,i,n);t.arc(e.x,e.y,c,o-Mt,p)}t.closePath()}function Mo(t,e){const{options:i}=e,n="inner"===i.borderAlign;i.borderWidth&&(n?(t.lineWidth=2*i.borderWidth,t.lineJoin="round"):(t.lineWidth=i.borderWidth,t.lineJoin="bevel"),e.fullCircles&&function(t,e,i){const{x:n,y:o,startAngle:s,endAngle:a,pixelMargin:r}=e,l=Math.max(e.outerRadius-r,0),c=e.innerRadius+r;let h;for(i&&(e.endAngle=e.startAngle+_t,_o(t,e),e.endAngle=a,e.endAngle===e.startAngle&&(e.endAngle+=_t,e.fullCircles--)),t.beginPath(),t.arc(n,o,c,s+_t,s,!0),h=0;h=_t||Ht(o,a,r))&&(s>=l&&s<=c)}getCenterPoint(t){const{x:e,y:i,startAngle:n,endAngle:o,innerRadius:s,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),r=(n+o)/2,l=(s+a)/2;return{x:e+Math.cos(r)*l,y:i+Math.sin(r)*l}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const e=this,i=e.options,n=i.offset||0;if(e.pixelMargin="inner"===i.borderAlign?.33:0,e.fullCircles=Math.floor(e.circumference/_t),!(0===e.circumference||e.innerRadius<0||e.outerRadius<0)){if(t.save(),n&&e.circumference<_t){const i=(e.startAngle+e.endAngle)/2;t.translate(Math.cos(i)*n,Math.sin(i)*n)}t.fillStyle=i.backgroundColor,t.strokeStyle=i.borderColor,function(t,e){if(e.fullCircles){e.endAngle=e.startAngle+_t,wo(t,e);for(let i=0;ir&&s>r;return{count:n,start:l,loop:e.loop,ilen:c(a+(c?r-t:t))%s,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=o[b(0)],t.moveTo(d.x,d.y)),h=0;h<=r;++h){if(d=o[b(h)],d.skip)continue;const e=d.x,i=d.y,n=0|e;n===u?(ig&&(g=i),m=(x*m+e)/++x):(_(),t.lineTo(e,i),u=n,x=0,f=g=i),p=i}_()}function Ao(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?Oo:Co}ko.id="arc",ko.defaults={borderAlign:"center",borderColor:"#fff",borderRadius:0,borderWidth:2,offset:0,angle:void 0},ko.defaultRoutes={backgroundColor:"backgroundColor"};const To="function"==typeof Path2D;function Ro(t,e,i,n){To&&1===e.segments.length?function(t,e,i,n){let o=e._path;o||(o=e._path=new Path2D,e.path(o,i,n)&&o.closePath()),So(t,e.options),t.stroke(o)}(t,e,i,n):function(t,e,i,n){const{segments:o,options:s}=e,a=Ao(e);for(const r of o)So(t,s,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+n-1})&&t.closePath(),t.stroke()}(t,e,i,n)}class Lo extends Ei{constructor(t){super(),this.animated=!0,this.options=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,t&&Object.assign(this,t)}updateControlPoints(t){const e=this,i=e.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!e._pointsUpdated){const n=i.spanGaps?e._loop:e._fullLoop;fn(e._points,i,t,n),e._pointsUpdated=!0}}set points(t){const e=this;e._points=t,delete e._segments,delete e._path,e._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=kn(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this,n=i.options,o=t[e],s=i.points,a=Mn(i,{property:e,start:o,end:o});if(!a.length)return;const r=[],l=function(t){return t.stepped?pn:t.tension||"monotone"===t.cubicInterpolationMode?mn:gn}(n);let c,h;for(c=0,h=a.length;c"borderDash"!==t&&"fill"!==t};class Io extends Ei{constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const n=this.options,{x:o,y:s}=this.getProps(["x","y"],i);return Math.pow(t-o,2)+Math.pow(e-s,2)t.x):Vo(e,"bottom","top",t.base=a.left&&e<=a.right)&&(s||i>=a.top&&i<=a.bottom)}function jo(t,e){t.rect(e.x,e.y,e.w,e.h)}Io.id="point",Io.defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0},Io.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};class $o extends Ei{constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,t&&Object.assign(this,t)}draw(t){const e=this.options,{inner:i,outer:n}=Ho(this),o=(s=n.radius).topLeft||s.topRight||s.bottomLeft||s.bottomRight?ie:jo;var s;t.save(),n.w===i.w&&n.h===i.h||(t.beginPath(),o(t,n),t.clip(),o(t,i),t.fillStyle=e.borderColor,t.fill("evenodd")),t.beginPath(),o(t,i),t.fillStyle=e.backgroundColor,t.fill(),t.restore()}inRange(t,e,i){return No(this,t,e,i)}inXRange(t,e){return No(this,t,null,e)}inYRange(t,e){return No(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:n,horizontal:o}=this.getProps(["x","y","base","horizontal"],t);return{x:o?(e+n)/2:e,y:o?i:(i+n)/2}}getRange(t){return"x"===t?this.width/2:this.height/2}}$o.id="bar",$o.defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,enableBorderRadius:!0,pointStyle:void 0},$o.defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};var Yo=Object.freeze({__proto__:null,ArcElement:ko,LineElement:Lo,PointElement:Io,BarElement:$o});function Uo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{value:e})}}function Xo(t){t.data.datasets.forEach((t=>{Uo(t)}))}var qo={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Xo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:s,indexAxis:a}=e,r=t.getDatasetMeta(o),l=s||e.data;if("y"===Ve([a,t.options.indexAxis]))return;if("line"!==r.type)return;const c=t.scales[r.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let h,{start:d,count:u}=function(t,e){const i=e.length;let n,o=0;const{iScale:s}=t,{min:a,max:r,minDefined:l,maxDefined:c}=s.getUserBounds();return l&&(o=Nt(oe(e,s.axis,a).lo,0,i-1)),n=c?Nt(oe(e,s.axis,r).hi+1,o,i)-o:i-o,{start:o,count:n}}(r,l);if(u<=4*n)Uo(e);else{switch($(s)&&(e._data=l,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":h=function(t,e,i,n,o){const s=o.samples||n;if(s>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(s-2);let l=0;const c=e+i-1;let h,d,u,f,g,p=e;for(a[l++]=t[p],h=0;hu&&(u=f,d=t[n],g=n);a[l++]=d,p=g}return a[l++]=t[c],a}(l,d,u,n,i);break;case"min-max":h=function(t,e,i,n){let o,s,a,r,l,c,h,d,u,f,g=0,p=0;const m=[],x=e+i-1,b=t[e].x,_=t[x].x-b;for(o=e;of&&(f=r,h=o),g=(p*g+s.x)/++p;else{const i=o-1;if(!$(c)&&!$(h)){const e=Math.min(c,h),n=Math.max(c,h);e!==d&&e!==i&&m.push({...t[e],x:g}),n!==d&&n!==i&&m.push({...t[n],x:g})}o>0&&i!==d&&m.push(t[i]),m.push(s),l=e,p=0,u=f=r,c=h=d=o}}return m}(l,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=h}}))},destroy(t){Xo(t)}};function Ko(t,e,i){const n=function(t){const e=t.options,i=e.fill;let n=K(i&&i.target,i);return void 0===n&&(n=!!e.backgroundColor),!1!==n&&null!==n&&(!0===n?"origin":n)}(t);if(U(n))return!isNaN(n.value)&&n;let o=parseFloat(n);return X(o)&&Math.floor(o)===o?("-"!==n[0]&&"+"!==n[0]||(o=e+o),!(o===e||o<0||o>=i)&&o):["origin","start","end","stack"].indexOf(n)>=0&&n}class Go{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:n,y:o,radius:s}=this;return e=e||{start:0,end:_t},t.arc(n,o,s,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:n}=this,o=t.angle;return{x:e+Math.cos(o)*n,y:i+Math.sin(o)*n,angle:o}}}function Zo(t){return(t.scale||{}).getPointPositionForValue?function(t){const{scale:e,fill:i}=t,n=e.options,o=e.getLabels().length,s=[],a=n.reverse?e.max:e.min,r=n.reverse?e.min:e.max;let l,c,h;if(h="start"===i?a:"end"===i?r:U(i)?i.value:e.getBaseValue(),n.grid.circular)return c=e.getPointPositionForValue(0,a),new Go({x:c.x,y:c.y,radius:e.getDistanceFromCenterForValue(h)});for(l=0;l"line"===t.type&&!t.hidden;function ts(t,e,i){const n=[];for(let o=0;o=n&&o<=c){r=o===n,l=o===c;break}}return{first:r,last:l,point:n}}function is(t,e){let i=[],n=!1;return Y(t)?(n=!0,i=t):i=function(t,e){const{x:i=null,y:n=null}=t||{},o=e.points,s=[];return e.segments.forEach((t=>{const e=o[t.start],a=o[t.end];null!==n?(s.push({x:e.x,y:n}),s.push({x:a.x,y:n})):null!==i&&(s.push({x:i,y:e.y}),s.push({x:i,y:a.y}))})),s}(t,e),i.length?new Lo({points:i,options:{tension:0},_loop:n,_fullLoop:n}):null}function ns(t,e,i){let n=t[e].fill;const o=[e];let s;if(!i)return n;for(;!1!==n&&-1===o.indexOf(n);){if(!X(n))return n;if(s=t[n],!s)return!1;if(s.visible)return n;o.push(n),n=s.fill}return!1}function os(t,e,i){t.beginPath(),e.path(t),t.lineTo(e.last().x,i),t.lineTo(e.first().x,i),t.closePath(),t.clip()}function ss(t,e,i,n){if(n)return;let o=e[t],s=i[t];return"angle"===t&&(o=Wt(o),s=Wt(s)),{property:t,start:o,end:s}}function as(t,e,i,n){return t&&e?n(t[i],e[i]):t?t[i]:e?e[i]:0}function rs(t,e,i){const{top:n,bottom:o}=e.chart.chartArea,{property:s,start:a,end:r}=i||{};"x"===s&&(t.beginPath(),t.rect(a,n,r-a,o-n),t.clip())}function ls(t,e,i,n){const o=e.interpolate(i,n);o&&t.lineTo(o.x,o.y)}function cs(t,e){const{line:i,target:n,property:o,color:s,scale:a}=e,r=function(t,e,i){const n=t.segments,o=t.points,s=e.points,a=[];for(const t of n){const n=ss(i,o[t.start],o[t.end],t.loop);if(!e.segments){a.push({source:t,target:n,start:o[t.start],end:o[t.end]});continue}const r=Mn(e,n);for(const e of r){const r=ss(i,s[e.start],s[e.end],e.loop),l=wn(t,o,r);for(const t of l)a.push({source:t,target:e,start:{[i]:as(n,r,"start",Math.max)},end:{[i]:as(n,r,"end",Math.min)}})}}return a}(i,n,o);for(const{source:e,target:l,start:c,end:h}of r){const{style:{backgroundColor:r=s}={}}=e;t.save(),t.fillStyle=r,rs(t,a,ss(o,c,h)),t.beginPath();const d=!!i.pathSegment(t,e);d?t.closePath():ls(t,n,h,o);const u=!!n.pathSegment(t,l,{move:d,reverse:!0}),f=d&&u;f||ls(t,n,c,o),t.closePath(),t.fill(f?"evenodd":"nonzero"),t.restore()}}function hs(t,e,i){const n=function(t){const{chart:e,fill:i,line:n}=t;if(X(i))return function(t,e){const i=t.getDatasetMeta(e);return i&&t.isDatasetVisible(e)?i.dataset:null}(e,i);if("stack"===i)return Qo(t);const o=Zo(t);return o instanceof Go?o:is(o,n)}(e),{line:o,scale:s,axis:a}=e,r=o.options,l=r.fill,c=r.backgroundColor,{above:h=c,below:d=c}=l||{};n&&o.points.length&&(Zt(t,i),function(t,e){const{line:i,target:n,above:o,below:s,area:a,scale:r}=e,l=i._loop?"angle":e.axis;t.save(),"x"===l&&s!==o&&(os(t,n,a.top),cs(t,{line:i,target:n,color:o,scale:r,property:l}),t.restore(),t.save(),os(t,n,a.bottom)),cs(t,{line:i,target:n,color:s,scale:r,property:l}),t.restore()}(t,{line:o,target:n,above:h,below:d,area:i,scale:s,axis:a}),Qt(t))}var ds={id:"filler",afterDatasetsUpdate(t,e,i){const n=(t.data.datasets||[]).length,o=[];let s,a,r,l;for(a=0;a=0;--e){const i=o[e].$filler;i&&(i.line.updateControlPoints(s),n&&hs(t.ctx,i,s))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const n=t.getSortedVisibleDatasetMetas();for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;i&&hs(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const n=e.meta.$filler;n&&!1!==n.fill&&"beforeDatasetDraw"===i.drawTime&&hs(t.ctx,n,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const us=(t,e)=>{let{boxHeight:i=e,boxWidth:n=e}=t;return t.usePointStyle&&(i=Math.min(i,e),n=Math.min(n,e)),{boxWidth:n,boxHeight:i,itemHeight:Math.max(e,i)}};class fs extends Ei{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){const n=this;n.maxWidth=t,n.maxHeight=e,n._margins=i,n.setDimensions(),n.buildLabels(),n.fit()}setDimensions(){const t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height)}buildLabels(){const t=this,e=t.options.labels||{};let i=Q(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter((i=>e.filter(i,t.chart.data)))),e.sort&&(i=i.sort(((i,n)=>e.sort(i,n,t.chart.data)))),t.options.reverse&&i.reverse(),t.legendItems=i}fit(){const t=this,{options:e,ctx:i}=t;if(!e.display)return void(t.width=t.height=0);const n=e.labels,o=Fe(n.font),s=o.size,a=t._computeTitleHeight(),{boxWidth:r,itemHeight:l}=us(n,s);let c,h;i.font=o.string,t.isHorizontal()?(c=t.maxWidth,h=t._fitRows(a,s,r,l)+10):(h=t.maxHeight,c=t._fitCols(a,s,r,l)+10),t.width=Math.min(c,e.maxWidth||t.maxWidth),t.height=Math.min(h,e.maxHeight||t.maxHeight)}_fitRows(t,e,i,n){const o=this,{ctx:s,maxWidth:a,options:{labels:{padding:r}}}=o,l=o.legendHitBoxes=[],c=o.lineWidths=[0],h=n+r;let d=t;s.textAlign="left",s.textBaseline="middle";let u=-1,f=-h;return o.legendItems.forEach(((t,o)=>{const g=i+e/2+s.measureText(t.text).width;(0===o||c[c.length-1]+g+2*r>a)&&(d+=h,c[c.length-(o>0?0:1)]=0,f+=h,u++),l[o]={left:0,top:f,row:u,width:g,height:n},c[c.length-1]+=g+r})),d}_fitCols(t,e,i,n){const o=this,{ctx:s,maxHeight:a,options:{labels:{padding:r}}}=o,l=o.legendHitBoxes=[],c=o.columnSizes=[],h=a-t;let d=r,u=0,f=0,g=0,p=0,m=0;return o.legendItems.forEach(((t,o)=>{const a=i+e/2+s.measureText(t.text).width;o>0&&f+e+2*r>h&&(d+=u+r,c.push({width:u,height:f}),g+=u+r,m++,p=0,u=f=0),u=Math.max(u,a),f+=e+r,l[o]={left:g,top:p,col:m,width:a,height:n},p+=n+r})),d+=u,c.push({width:u,height:f}),d}adjustHitBoxes(){const t=this;if(!t.options.display)return;const e=t._computeTitleHeight(),{legendHitBoxes:i,options:{align:n,labels:{padding:s}}}=t;if(this.isHorizontal()){let a=0,r=o(n,t.left+s,t.right-t.lineWidths[a]);for(const l of i)a!==l.row&&(a=l.row,r=o(n,t.left+s,t.right-t.lineWidths[a])),l.top+=t.top+e+s,l.left=r,r+=l.width+s}else{let a=0,r=o(n,t.top+e+s,t.bottom-t.columnSizes[a].height);for(const l of i)l.col!==a&&(a=l.col,r=o(n,t.top+e+s,t.bottom-t.columnSizes[a].height)),l.top=r,l.left+=t.left+s,r+=l.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){const t=this;if(t.options.display){const e=t.ctx;Zt(e,t),t._draw(),Qt(e)}}_draw(){const t=this,{options:e,columnSizes:i,lineWidths:n,ctx:a}=t,{align:r,labels:l}=e,c=xt.color,h=xn(e.rtl,t.left,t.width),d=Fe(l.font),{color:u,padding:f}=l,g=d.size,p=g/2;let m;t.drawTitle(),a.textAlign=h.textAlign("left"),a.textBaseline="middle",a.lineWidth=.5,a.font=d.string;const{boxWidth:x,boxHeight:b,itemHeight:_}=us(l,g),y=t.isHorizontal(),v=this._computeTitleHeight();m=y?{x:o(r,t.left+f,t.right-n[0]),y:t.top+f+v,line:0}:{x:t.left+f,y:o(r,t.top+v+f,t.bottom-i[0].height),line:0},bn(t.ctx,e.textDirection);const w=_+f;t.legendItems.forEach(((e,M)=>{a.strokeStyle=e.fontColor||u,a.fillStyle=e.fontColor||u;const k=a.measureText(e.text).width,S=h.textAlign(e.textAlign||(e.textAlign=l.textAlign)),P=x+g/2+k;let D=m.x,C=m.y;h.setWidth(t.width),y?M>0&&D+P+f>t.right&&(C=m.y+=w,m.line++,D=m.x=o(r,t.left+f,t.right-n[m.line])):M>0&&C+w>t.bottom&&(D=m.x=D+i[m.line].width+f,m.line++,C=m.y=o(r,t.top+v+f,t.bottom-i[m.line].height));!function(t,e,i){if(isNaN(x)||x<=0||isNaN(b)||b<0)return;a.save();const n=K(i.lineWidth,1);if(a.fillStyle=K(i.fillStyle,c),a.lineCap=K(i.lineCap,"butt"),a.lineDashOffset=K(i.lineDashOffset,0),a.lineJoin=K(i.lineJoin,"miter"),a.lineWidth=n,a.strokeStyle=K(i.strokeStyle,c),a.setLineDash(K(i.lineDash,[])),l.usePointStyle){const o={radius:x*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},s=h.xPlus(t,x/2);Kt(a,o,s,e+p)}else{const o=e+Math.max((g-b)/2,0),s=h.leftForLtr(t,x),r=Ie(i.borderRadius);a.beginPath(),Object.values(r).some((t=>0!==t))?ie(a,{x:s,y:o,w:x,h:b,radius:r}):a.rect(s,o,x,b),a.fill(),0!==n&&a.stroke()}a.restore()}(h.x(D),C,e),D=s(S,D+x+p,t.right),function(t,e,i){ee(a,i.text,t,e+_/2,d,{strikethrough:i.hidden,textAlign:i.textAlign})}(h.x(D),C,e),y?m.x+=P+f:m.y+=w})),_n(t.ctx,e.textDirection)}drawTitle(){const t=this,e=t.options,i=e.title,s=Fe(i.font),a=ze(i.padding);if(!i.display)return;const r=xn(e.rtl,t.left,t.width),l=t.ctx,c=i.position,h=s.size/2,d=a.top+h;let u,f=t.left,g=t.width;if(this.isHorizontal())g=Math.max(...t.lineWidths),u=t.top+d,f=o(e.align,f,t.right-g);else{const i=t.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);u=d+o(e.align,t.top,t.bottom-i-e.labels.padding-t._computeTitleHeight())}const p=o(c,f,f+g);l.textAlign=r.textAlign(n(c)),l.textBaseline="middle",l.strokeStyle=i.color,l.fillStyle=i.color,l.font=s.string,ee(l,i.text,p,u,s)}_computeTitleHeight(){const t=this.options.title,e=Fe(t.font),i=ze(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){const i=this;let n,o,s;if(t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom)for(s=i.legendHitBoxes,n=0;n=o.left&&t<=o.left+o.width&&e>=o.top&&e<=o.top+o.height)return i.legendItems[n];return null}handleEvent(t){const e=this,i=e.options;if(!function(t,e){if("mousemove"===t&&(e.onHover||e.onLeave))return!0;if(e.onClick&&("click"===t||"mouseup"===t))return!0;return!1}(t.type,i))return;const n=e._getLegendItemAt(t.x,t.y);if("mousemove"===t.type){const a=e._hoveredItem,r=(s=n,null!==(o=a)&&null!==s&&o.datasetIndex===s.datasetIndex&&o.index===s.index);a&&!r&&Q(i.onLeave,[t,a,e],e),e._hoveredItem=n,n&&!r&&Q(i.onHover,[t,n,e],e)}else n&&Q(i.onClick,[t,n,e],e);var o,s}}var gs={id:"legend",_element:fs,start(t,e,i){const n=t.legend=new fs({ctx:t.ctx,options:i,chart:t});Ge.configure(t,n,i),Ge.addBox(t,n)},stop(t){Ge.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const n=t.legend;Ge.configure(t,n,i),n.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const n=e.datasetIndex,o=i.chart;o.isDatasetVisible(n)?(o.hide(n),e.hidden=!0):(o.show(n),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:n,textAlign:o,color:s}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const a=t.controller.getStyle(i?0:void 0),r=ze(a.borderWidth);return{text:e[t.index].label,fillStyle:a.backgroundColor,fontColor:s,hidden:!t.visible,lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:(r.width+r.height)/4,strokeStyle:a.borderColor,pointStyle:n||a.pointStyle,rotation:a.rotation,textAlign:o||a.textAlign,borderRadius:0,datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class ps extends Ei{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this,n=i.options;if(i.left=0,i.top=0,!n.display)return void(i.width=i.height=i.right=i.bottom=0);i.width=i.right=t,i.height=i.bottom=e;const o=Y(n.text)?n.text.length:1;i._padding=ze(n.padding);const s=o*Fe(n.font).lineHeight+i._padding.height;i.isHorizontal()?i.height=s:i.width=s}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:n,right:s,options:a}=this,r=a.align;let l,c,h,d=0;return this.isHorizontal()?(c=o(r,i,s),h=e+t,l=s-i):("left"===a.position?(c=i+t,h=o(r,n,e),d=-.5*bt):(c=s-t,h=o(r,e,n),d=.5*bt),l=n-e),{titleX:c,titleY:h,maxWidth:l,rotation:d}}draw(){const t=this,e=t.ctx,i=t.options;if(!i.display)return;const o=Fe(i.font),s=o.lineHeight/2+t._padding.top,{titleX:a,titleY:r,maxWidth:l,rotation:c}=t._drawArgs(s);ee(e,i.text,0,0,o,{color:i.color,maxWidth:l,rotation:c,textAlign:n(i.align),textBaseline:"middle",translation:[a,r]})}}var ms={id:"title",_element:ps,start(t,e,i){!function(t,e){const i=new ps({ctx:t.ctx,options:e,chart:t});Ge.configure(t,i,e),Ge.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;Ge.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const n=t.titleBlock;Ge.configure(t,n,i),n.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const xs={average(t){if(!t.length)return!1;let e,i,n=0,o=0,s=0;for(e=0,i=t.length;e-1?t.split("\n"):t}function ys(t,e){const{element:i,datasetIndex:n,index:o}=e,s=t.getDatasetMeta(n).controller,{label:a,value:r}=s.getLabelAndValue(o);return{chart:t,label:a,parsed:s.getParsed(o),raw:t.data.datasets[n].data[o],formattedValue:r,dataset:s.getDataset(),dataIndex:o,datasetIndex:n,element:i}}function vs(t,e){const i=t._chart.ctx,{body:n,footer:o,title:s}=t,{boxWidth:a,boxHeight:r}=e,l=Fe(e.bodyFont),c=Fe(e.titleFont),h=Fe(e.footerFont),d=s.length,u=o.length,f=n.length,g=ze(e.padding);let p=g.height,m=0,x=n.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(p+=d*c.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){p+=f*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-f)*l.lineHeight+(x-1)*e.bodySpacing}u&&(p+=e.footerMarginTop+u*h.lineHeight+(u-1)*e.footerSpacing);let b=0;const _=function(t){m=Math.max(m,i.measureText(t).width+b)};return i.save(),i.font=c.string,J(t.title,_),i.font=l.string,J(t.beforeBody.concat(t.afterBody),_),b=e.displayColors?a+2:0,J(n,(t=>{J(t.before,_),J(t.lines,_),J(t.after,_)})),b=0,i.font=h.string,J(t.footer,_),i.restore(),m+=g.width,{width:m,height:p}}function ws(t,e,i,n){const{x:o,width:s}=i,{width:a,chartArea:{left:r,right:l}}=t;let c="center";return"center"===n?c=o<=(r+l)/2?"left":"right":o<=s/2?c="left":o>=a-s/2&&(c="right"),function(t,e,i,n){const{x:o,width:s}=n,a=i.caretSize+i.caretPadding;return"left"===t&&o+s+a>e.width||"right"===t&&o-s-a<0||void 0}(c,t,e,i)&&(c="center"),c}function Ms(t,e,i){const n=e.yAlign||function(t,e){const{y:i,height:n}=e;return it.height-n/2?"bottom":"center"}(t,i);return{xAlign:e.xAlign||ws(t,e,i,n),yAlign:n}}function ks(t,e,i,n){const{caretSize:o,caretPadding:s,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,c=o+s,h=a+s;let d=function(t,e){let{x:i,width:n}=t;return"right"===e?i-=n:"center"===e&&(i-=n/2),i}(e,r);const u=function(t,e,i){let{y:n,height:o}=t;return"top"===e?n+=i:n-="bottom"===e?o+i:o/2,n}(e,l,c);return"center"===l?"left"===r?d+=c:"right"===r&&(d-=c):"left"===r?d-=h:"right"===r&&(d+=h),{x:Nt(d,0,n.width-e.width),y:Nt(u,0,n.height-e.height)}}function Ss(t,e,i){const n=ze(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-n.right:t.x+n.left}function Ps(t){return bs([],_s(t))}function Ds(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}class Cs extends Ei{constructor(t){super(),this.opacity=0,this._active=[],this._chart=t._chart,this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this,e=t._cachedAnimations;if(e)return e;const i=t._chart,n=t.options.setContext(t.getContext()),o=n.enabled&&i.options.animation&&n.animations,s=new vi(t._chart,o);return o._cacheable&&(t._cachedAnimations=Object.freeze(s)),s}getContext(){const t=this;return t.$context||(t.$context=(e=t._chart.getContext(),i=t,n=t._tooltipItems,Object.assign(Object.create(e),{tooltip:i,tooltipItems:n,type:"tooltip"})));var e,i,n}getTitle(t,e){const i=this,{callbacks:n}=e,o=n.beforeTitle.apply(i,[t]),s=n.title.apply(i,[t]),a=n.afterTitle.apply(i,[t]);let r=[];return r=bs(r,_s(o)),r=bs(r,_s(s)),r=bs(r,_s(a)),r}getBeforeBody(t,e){return Ps(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){const i=this,{callbacks:n}=e,o=[];return J(t,(t=>{const e={before:[],lines:[],after:[]},s=Ds(n,t);bs(e.before,_s(s.beforeLabel.call(i,t))),bs(e.lines,s.label.call(i,t)),bs(e.after,_s(s.afterLabel.call(i,t))),o.push(e)})),o}getAfterBody(t,e){return Ps(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){const i=this,{callbacks:n}=e,o=n.beforeFooter.apply(i,[t]),s=n.footer.apply(i,[t]),a=n.afterFooter.apply(i,[t]);let r=[];return r=bs(r,_s(o)),r=bs(r,_s(s)),r=bs(r,_s(a)),r}_createItems(t){const e=this,i=e._active,n=e._chart.data,o=[],s=[],a=[];let r,l,c=[];for(r=0,l=i.length;rt.filter(e,i,o,n)))),t.itemSort&&(c=c.sort(((e,i)=>t.itemSort(e,i,n)))),J(c,(i=>{const n=Ds(t.callbacks,i);o.push(n.labelColor.call(e,i)),s.push(n.labelPointStyle.call(e,i)),a.push(n.labelTextColor.call(e,i))})),e.labelColors=o,e.labelPointStyles=s,e.labelTextColors=a,e.dataPoints=c,c}update(t,e){const i=this,n=i.options.setContext(i.getContext()),o=i._active;let s,a=[];if(o.length){const t=xs[n.position].call(i,o,i._eventPosition);a=i._createItems(n),i.title=i.getTitle(a,n),i.beforeBody=i.getBeforeBody(a,n),i.body=i.getBody(a,n),i.afterBody=i.getAfterBody(a,n),i.footer=i.getFooter(a,n);const e=i._size=vs(i,n),r=Object.assign({},t,e),l=Ms(i._chart,n,r),c=ks(n,r,l,i._chart);i.xAlign=l.xAlign,i.yAlign=l.yAlign,s={opacity:1,x:c.x,y:c.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==i.opacity&&(s={opacity:0});i._tooltipItems=a,i.$context=void 0,s&&i._resolveAnimations().update(i,s),t&&n.external&&n.external.call(i,{chart:i._chart,tooltip:i,replay:e})}drawCaret(t,e,i,n){const o=this.getCaretPosition(t,i,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,i){const{xAlign:n,yAlign:o}=this,{cornerRadius:s,caretSize:a}=i,{x:r,y:l}=t,{width:c,height:h}=e;let d,u,f,g,p,m;return"center"===o?(p=l+h/2,"left"===n?(d=r,u=d-a,g=p+a,m=p-a):(d=r+c,u=d+a,g=p-a,m=p+a),f=d):(u="left"===n?r+s+a:"right"===n?r+c-s-a:this.caretX,"top"===o?(g=l,p=g-a,d=u-a,f=u+a):(g=l+h,p=g+a,d=u+a,f=u-a),m=g),{x1:d,x2:u,x3:f,y1:g,y2:p,y3:m}}drawTitle(t,e,i){const n=this,o=n.title,s=o.length;let a,r,l;if(s){const c=xn(i.rtl,n.x,n.width);for(t.x=Ss(n,i.titleAlign,i),e.textAlign=c.textAlign(i.titleAlign),e.textBaseline="middle",a=Fe(i.titleFont),r=i.titleSpacing,e.fillStyle=i.titleColor,e.font=a.string,l=0;l0!==t))?(t.beginPath(),t.fillStyle=o.multiKeyBackground,ie(t,{x:e,y:g,w:c,h:l,radius:s}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),ie(t,{x:i,y:g+1,w:c-2,h:l-2,radius:s}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(e,g,c,l),t.strokeRect(e,g,c,l),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,c-2,l-2))}t.fillStyle=s.labelTextColors[i]}drawBody(t,e,i){const n=this,{body:o}=n,{bodySpacing:s,bodyAlign:a,displayColors:r,boxHeight:l,boxWidth:c}=i,h=Fe(i.bodyFont);let d=h.lineHeight,u=0;const f=xn(i.rtl,n.x,n.width),g=function(i){e.fillText(i,f.x(t.x+u),t.y+d/2),t.y+=d+s},p=f.textAlign(a);let m,x,b,_,y,v,w;for(e.textAlign=a,e.textBaseline="middle",e.font=h.string,t.x=Ss(n,p,i),e.fillStyle=i.bodyColor,J(n.beforeBody,g),u=r&&"right"!==p?"center"===a?c/2+1:c+2:0,_=0,v=o.length;_0&&e.stroke()}_updateAnimationTarget(t){const e=this,i=e._chart,n=e.$animations,o=n&&n.x,s=n&&n.y;if(o||s){const n=xs[t.position].call(e,e._active,e._eventPosition);if(!n)return;const a=e._size=vs(e,t),r=Object.assign({},n,e._size),l=Ms(i,t,r),c=ks(t,r,l,i);o._to===c.x&&s._to===c.y||(e.xAlign=l.xAlign,e.yAlign=l.yAlign,e.width=a.width,e.height=a.height,e.caretX=n.x,e.caretY=n.y,e._resolveAnimations().update(e,c))}}draw(t){const e=this,i=e.options.setContext(e.getContext());let n=e.opacity;if(!n)return;e._updateAnimationTarget(i);const o={width:e.width,height:e.height},s={x:e.x,y:e.y};n=Math.abs(n)<.001?0:n;const a=ze(i.padding),r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;i.enabled&&r&&(t.save(),t.globalAlpha=n,e.drawBackground(s,t,o,i),bn(t,i.textDirection),s.y+=a.top,e.drawTitle(s,t,i),e.drawBody(s,t,i),e.drawFooter(s,t,i),_n(t,i.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this,n=i._active,o=t.map((({datasetIndex:t,index:e})=>{const n=i._chart.getDatasetMeta(t);if(!n)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:n.data[e],index:e}})),s=!tt(n,o),a=i._positionChanged(o,e);(s||a)&&(i._active=o,i._eventPosition=e,i.update(!0))}handleEvent(t,e){const i=this,n=i.options,o=i._active||[];let s=!1,a=[];"mouseout"!==t.type&&(a=i._chart.getElementsAtEventForMode(t,n.mode,n,e),n.reverse&&a.reverse());const r=i._positionChanged(a,t);return s=e||!tt(a,o)||r,s&&(i._active=a,(n.enabled||n.external)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0,e))),s}_positionChanged(t,e){const{caretX:i,caretY:n,options:o}=this,s=xs[o.position].call(this,t,e);return!1!==s&&(i!==s.x||n!==s.y)}}Cs.positioners=xs;var Os={id:"tooltip",_element:Cs,positioners:xs,afterInit(t,e,i){i&&(t.tooltip=new Cs({_chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip,i={tooltip:e};!1!==t.notifyPlugins("beforeTooltipDraw",i)&&(e&&e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i))},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:N,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,n=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(n>0&&e.dataIndex"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},As=Object.freeze({__proto__:null,Decimation:qo,Filler:ds,Legend:gs,Title:ms,Tooltip:Os});function Ts(t,e,i){const n=t.indexOf(e);if(-1===n)return((t,e,i)=>"string"==typeof e?t.push(e)-1:isNaN(e)?null:i)(t,e,i);return n!==t.lastIndexOf(e)?i:n}class Rs extends Xi{constructor(t){super(t),this._startValue=void 0,this._valueRange=0}parse(t,e){if($(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:Nt(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:Ts(i,t,K(e,t)),i.length-1)}determineDataLimits(){const t=this,{minDefined:e,maxDefined:i}=t.getUserBounds();let{min:n,max:o}=t.getMinMax(!0);"ticks"===t.options.bounds&&(e||(n=0),i||(o=t.getLabels().length-1)),t.min=n,t.max=o}buildTicks(){const t=this,e=t.min,i=t.max,n=t.options.offset,o=[];let s=t.getLabels();s=0===e&&i===s.length-1?s:s.slice(e,i+1),t._valueRange=Math.max(s.length-(n?0:1),1),t._startValue=t.min-(n?.5:0);for(let t=e;t<=i;t++)o.push({value:t});return o}getLabelForValue(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){const e=this;return Math.round(e._startValue+e.getDecimalForPixel(t)*e._valueRange)}getBasePixel(){return this.bottom}}Rs.id="category",Rs.defaults={ticks:{callback:Rs.prototype.getLabelForValue}};class Ls extends Xi{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return $(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const t=this,{beginAtZero:e,stacked:i}=t.options,{minDefined:n,maxDefined:o}=t.getUserBounds();let{min:s,max:a}=t;const r=t=>s=n?s:t,l=t=>a=o?a:t;if(e||i){const t=Dt(s),e=Dt(a);t<0&&e<0?l(0):t>0&&e>0&&r(0)}s===a&&(l(a+1),e||r(s-1)),t.min=s,t.max=a}getTickLimit(){const t=this,e=t.options.ticks;let i,{maxTicksLimit:n,stepSize:o}=e;return o?i=Math.ceil(t.max/o)-Math.floor(t.min/o)+1:(i=t.computeTickLimit(),n=n||11),n&&(i=Math.min(n,i)),i}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this,e=t.options,i=e.ticks;let n=t.getTickLimit();n=Math.max(2,n);const o=function(t,e){const i=[],{step:n,min:o,max:s,precision:a,count:r,maxTicks:l,maxDigits:c,horizontal:h}=t,d=n||1,u=l-1,{min:f,max:g}=e,p=!$(o),m=!$(s),x=!$(r),b=(g-f)/c;let _,y,v,w,M=Ct((g-f)/u/d)*d;if(M<1e-14&&!p&&!m)return[{value:f},{value:g}];w=Math.ceil(g/M)-Math.floor(f/M),w>u&&(M=Ct(w*M/u/d)*d),$(a)||(_=Math.pow(10,a),M=Math.ceil(M*_)/_),y=Math.floor(f/M)*M,v=Math.ceil(g/M)*M,p&&m&&n&&Rt((s-o)/n,M/1e3)?(w=Math.min((s-o)/M,l),M=(s-o)/w,y=o,v=s):x?(y=p?o:y,v=m?s:v,w=r-1,M=(v-y)/w):(w=(v-y)/M,w=Tt(w,Math.round(w),M/1e3)?Math.round(w):Math.ceil(w)),_=Math.pow(10,$(a)?zt(M):a),y=Math.round(y*_)/_,v=Math.round(v*_)/_;let k=0;for(p&&(i.push({value:o}),y<=o&&k++,Tt(Math.round((y+k*M)*_)/_,o,b*(h?(""+o).length:1))&&k++);k0?i:null;this._zero=!0}determineDataLimits(){const t=this,{min:e,max:i}=t.getMinMax(!0);t.min=X(e)?Math.max(0,e):null,t.max=X(i)?Math.max(0,i):null,t.options.beginAtZero&&(t._zero=!0),t.handleTickRangeOptions()}handleTickRangeOptions(){const t=this,{minDefined:e,maxDefined:i}=t.getUserBounds();let n=t.min,o=t.max;const s=t=>n=e?n:t,a=t=>o=i?o:t,r=(t,e)=>Math.pow(10,Math.floor(Pt(t))+e);n===o&&(n<=0?(s(1),a(10)):(s(r(n,-1)),a(r(o,1)))),n<=0&&s(r(o,-1)),o<=0&&a(r(n,1)),t._zero&&t.min!==t._suggestedMin&&n===r(t.min,0)&&s(r(n,-1)),t.min=n,t.max=o}buildTicks(){const t=this,e=t.options,i=function(t,e){const i=Math.floor(Pt(e.max)),n=Math.ceil(e.max/Math.pow(10,i)),o=[];let s=q(t.min,Math.pow(10,Math.floor(Pt(e.min)))),a=Math.floor(Pt(s)),r=Math.floor(s/Math.pow(10,a)),l=a<0?Math.pow(10,Math.abs(a)):1;do{o.push({value:s,major:Is(s)}),++r,10===r&&(r=1,++a,l=a>=0?1:l),s=Math.round(r*Math.pow(10,a)*l)/l}while(ao?{start:e-i,end:e}:{start:e,end:e+i}}function Bs(t){return 0===t||180===t?"center":t<180?"left":"right"}function Ws(t,e,i){90===t||270===t?i.y-=e.h/2:(t>270||t<90)&&(i.y-=e.h)}function Hs(t,e,i,n){const{ctx:o}=t;if(i)o.arc(t.xCenter,t.yCenter,e,0,_t);else{let i=t.getPointPosition(0,e);o.moveTo(i.x,i.y);for(let s=1;s{const n=Q(e.options.pointLabels.callback,[t,i],e);return n||0===n?n:""}))}fit(){const t=this,e=t.options;e.display&&e.pointLabels.display?function(t){const e={l:0,r:t.width,t:0,b:t.height-t.paddingTop},i={};let n,o,s;const a=[],r=[],l=t.getLabels().length;for(n=0;ne.r&&(e.r=p.end,i.r=f),m.starte.b&&(e.b=m.end,i.b=f)}var c,h,d;t._setReductions(t.drawingArea,e,i),t._pointLabelItems=[];const u=t.options,f=Fs(u),g=t.getDistanceFromCenterForValue(u.ticks.reverse?t.min:t.max);for(n=0;n=0;o--){const e=n.setContext(t.getContext(o)),s=Fe(e.font),{x:a,y:r,textAlign:l,left:c,top:h,right:d,bottom:u}=t._pointLabelItems[o],{backdropColor:f}=e;if(!$(f)){const t=ze(e.backdropPadding);i.fillStyle=f,i.fillRect(c-t.left,h-t.top,d-c+t.width,u-h+t.height)}ee(i,t._pointLabels[o],a,r+s.lineHeight/2,s,{color:e.color,textAlign:l,textBaseline:"middle"})}}(t,s),o.display&&t.ticks.forEach(((e,i)=>{if(0!==i){r=t.getDistanceFromCenterForValue(e.value);const n=o.setContext(t.getContext(i-1));!function(t,e,i,n){const o=t.ctx,s=e.circular,{color:a,lineWidth:r}=e;!s&&!n||!a||!r||i<0||(o.save(),o.strokeStyle=a,o.lineWidth=r,o.setLineDash(e.borderDash),o.lineDashOffset=e.borderDashOffset,o.beginPath(),Hs(t,i,s,n),o.closePath(),o.stroke(),o.restore())}(t,n,r,s)}})),n.display){for(e.save(),a=t.getLabels().length-1;a>=0;a--){const o=n.setContext(t.getContext(a)),{color:s,lineWidth:c}=o;c&&s&&(e.lineWidth=c,e.strokeStyle=s,e.setLineDash(o.borderDash),e.lineDashOffset=o.borderDashOffset,r=t.getDistanceFromCenterForValue(i.ticks.reverse?t.min:t.max),l=t.getPointPosition(a,r),e.beginPath(),e.moveTo(t.xCenter,t.yCenter),e.lineTo(l.x,l.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){const t=this,e=t.ctx,i=t.options,n=i.ticks;if(!n.display)return;const o=t.getIndexAngle(0);let s,a;e.save(),e.translate(t.xCenter,t.yCenter),e.rotate(o),e.textAlign="center",e.textBaseline="middle",t.ticks.forEach(((o,r)=>{if(0===r&&!i.reverse)return;const l=n.setContext(t.getContext(r)),c=Fe(l.font);if(s=t.getDistanceFromCenterForValue(t.ticks[r].value),l.showLabelBackdrop){a=e.measureText(o.label).width,e.fillStyle=l.backdropColor;const t=ze(l.backdropPadding);e.fillRect(-a/2-t.left,-s-c.size/2-t.top,a+t.width,c.size+t.height)}ee(e,o.label,0,-s,c,{color:l.color})})),e.restore()}drawTitle(){}}js.id="radialLinear",js.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Vi.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5}},js.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"},js.descriptors={angleLines:{_fallback:"grid"}};const $s={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Ys=Object.keys($s);function Us(t,e){return t-e}function Xs(t,e){if($(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:s}=t._parseOpts;let a=e;return"function"==typeof n&&(a=n(a)),X(a)||(a="string"==typeof n?i.parse(a,n):i.parse(a)),null===a?null:(o&&(a="week"!==o||!At(s)&&!0!==s?i.startOf(a,o):i.startOf(a,"isoWeek",s)),+a)}function qs(t,e,i,n){const o=Ys.length;for(let s=Ys.indexOf(t);s=e?i[n]:i[o]]=!0}}else t[e]=!0}function Gs(t,e,i){const n=[],o={},s=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,n,o,i):n}class Zs extends Xi{constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e){const i=t.time||(t.time={}),n=this._adapter=new oo._date(t.adapters.date);st(i.displayFormats,n.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Xs(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this,e=t.options,i=t._adapter,n=e.time.unit||"day";let{min:o,max:s,minDefined:a,maxDefined:r}=t.getUserBounds();function l(t){a||isNaN(t.min)||(o=Math.min(o,t.min)),r||isNaN(t.max)||(s=Math.max(s,t.max))}a&&r||(l(t._getLabelBounds()),"ticks"===e.bounds&&"labels"===e.ticks.source||l(t.getMinMax(!1))),o=X(o)&&!isNaN(o)?o:+i.startOf(Date.now(),n),s=X(s)&&!isNaN(s)?s:+i.endOf(Date.now(),n)+1,t.min=Math.min(o,s-1),t.max=Math.max(o+1,s)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this,e=t.options,i=e.time,n=e.ticks,o="labels"===n.source?t.getLabelTimestamps():t._generate();"ticks"===e.bounds&&o.length&&(t.min=t._userMin||o[0],t.max=t._userMax||o[o.length-1]);const s=t.min,a=ae(o,s,t.max);return t._unit=i.unit||(n.autoSkip?qs(i.minUnit,t.min,t.max,t._getLabelCapacity(s)):function(t,e,i,n,o){for(let s=Ys.length-1;s>=Ys.indexOf(i);s--){const i=Ys[s];if($s[i].common&&t._adapter.diff(o,n,i)>=e-1)return i}return Ys[i?Ys.indexOf(i):0]}(t,a.length,i.minUnit,t.min,t.max)),t._majorUnit=n.major.enabled&&"year"!==t._unit?function(t){for(let e=Ys.indexOf(t)+1,i=Ys.length;e1e5*r)throw new Error(i+" and "+n+" are too far apart with stepSize of "+r+" "+a);const g="data"===o.ticks.source&&t.getDataTimestamps();for(d=f,u=0;dt-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}_tickFormatFunction(t,e,i,n){const o=this,s=o.options,a=s.time.displayFormats,r=o._unit,l=o._majorUnit,c=r&&a[r],h=l&&a[l],d=i[e],u=l&&h&&d&&d.major,f=o._adapter.format(t,n||(u?h:c)),g=s.ticks.callback;return g?Q(g,[f,e,i],o):f}generateTickLabels(t){let e,i,n;for(e=0,i=t.length;e0?r:1}getDataTimestamps(){const t=this;let e,i,n=t._cache.data||[];if(n.length)return n;const o=t.getMatchingVisibleMetas();if(t._normalized&&o.length)return t._cache.data=o[0].controller.getAllParsedValues(t);for(e=0,i=o.length;ee&&a0&&!$(e)?e/i._maxIndex:i.getDecimalForValue(t);return i.getPixelForDecimal((n.start+o)*n.factor)}getDecimalForValue(t){return Qs(this._table,t)/this._maxIndex}getValueForPixel(t){const e=this,i=e._offsets,n=e.getDecimalForPixel(t)/i.factor-i.end;return Qs(e._table,n*this._maxIndex,!0)}}Js.id="timeseries",Js.defaults=Zs.defaults;var ta=Object.freeze({__proto__:null,CategoryScale:Rs,LinearScale:Es,LogarithmicScale:zs,RadialLinearScale:js,TimeScale:Zs,TimeSeriesScale:Js});return Jn.register(bo,ta,Yo,As),Jn.helpers={...Cn},Jn._adapters=oo,Jn.Animation=_i,Jn.Animations=vi,Jn.animator=a,Jn.controllers=An.controllers.items,Jn.DatasetController=Li,Jn.Element=Ei,Jn.elements=Yo,Jn.Interaction=Oe,Jn.layouts=Ge,Jn.platforms=ui,Jn.Scale=Xi,Jn.Ticks=Vi,Object.assign(Jn,bo,ta,Yo,As,ui),Jn.Chart=Jn,"undefined"!=typeof window&&(window.Chart=Jn),Jn})); diff --git a/content/www/js/jquery.js b/content/www/js/jquery.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/content/www/js/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 { + dataset.data = data; + }); + + chart.update(); +} + +function queue_update() { + $.getJSON("sensor_data").done(refresh_chart); +} \ No newline at end of file diff --git a/custom_modules/mqtt_server/SCsub b/custom_modules/mqtt_server/SCsub new file mode 100644 index 0000000..59b379f --- /dev/null +++ b/custom_modules/mqtt_server/SCsub @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +Import("env_mod") +Import("env") + +env_mod.core_sources = [] + +env_mod.add_source_files(env_mod.core_sources, "*.cpp") +env_mod.add_source_files(env_mod.core_sources, "./mqtt_broker/src/*.cc") + +# Build it all as a library +lib = env_mod.add_library("mqtt_server", env_mod.core_sources) +env.Prepend(LIBS=[lib]) diff --git a/custom_modules/mqtt_server/__pycache__/detect.cpython-39.pyc b/custom_modules/mqtt_server/__pycache__/detect.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de035813daf5085bcef6e549cab82e41892421cb GIT binary patch literal 1369 zcma)6PjAyO6t|tEOWTcqo8ZDB69}n?Hrj;~nubOvA&si66^C9z8oMQ%n*`hKwyK=q z!h!Fw9e3jUyujzG)%!LmS0Gz}SOV z9)h5VVvc%qjeFSGq(>;B))&;Xs7)QvHZ9RL&<=HJ8FYzOXchDtU8ftMU5Y!XcIPK} zM6F26;=o|+!z*nN21#1oD5C}K0vV1n&H@=5 zMMD(^QOY?0QW1n%=CfoNC(Lj7jfOu;>6kO=k3K3DNG2vs_>?ICH?s4*9Lpe#R6JoN zos~`lVWE?|RqDNJ!R;#l!ps6!xjSSkNWu}*?N|hHt_RVSZUxdXy%Ec<9yZP#YPiiMQ)Pi6(wB=KNr~TY&Jm&n7HUfQ7m);PtwUIZGl| zXF{Yx7WaG8=gUn=s=PruPUyDx=54p@&AZ{9#+-Y4t zR?0~#b6eLrx8%9Z-HeB7kcv@W0#mUOoL&H-Y9ue8?d$|5+ur&jj<&CNt{jC)&>zQ~ z-hqb5haeE%!WC>|n^cI6UC=JEiMR_Z|L4pQbm<{o&&MTlp3D z0CuzIvL@hwheP>v>6(ZK+O@usi=pRB20jL3hA!ZiUIL$Hnu}zJsr5~>3yxB=Thk~1 z=0;>f0ZE{=vbU+59dw#U@0v$J`>5Gzwz@T(SN7ZOSIvXht!4)rQf-GqvVFtEy!0~5 zSV940v1C#>mMK$t&eySEHAvC?Nf53O@d&J1S-7A?RSSLF%v~1xu9*%AT~2dw124EX by_mP*#r&VKtIHvEVO?mmYq>T&o1mTF8Zj<_ literal 0 HcmV?d00001 diff --git a/custom_modules/mqtt_server/detect.py b/custom_modules/mqtt_server/detect.py new file mode 100644 index 0000000..210c397 --- /dev/null +++ b/custom_modules/mqtt_server/detect.py @@ -0,0 +1,46 @@ +import os +import platform +import sys + + +def is_active(): + return True + + +def get_name(): + return "mqtt_server" + + +def can_build(): + if os.name == "posix" or sys.platform == "darwin": + x11_error = os.system("pkg-config --version > /dev/null") + if x11_error: + return False + + libevent_err = os.system("pkg-config libevent --modversion --silence-errors > /dev/null ") + + if libevent_err: + print("libevent not found! MQTT server will not be available!") + return False + + print("libevent found! MQTT server will be available!") + + return True + + return False + + +def get_opts(): + return [] + +def get_flags(): + + return [] + + +def configure(env): + env.ParseConfig("pkg-config libevent --cflags --libs") + + env.Append(CPPDEFINES=["MQTT_SERVER_PRESENT"]) + + diff --git a/custom_modules/mqtt_server/libmqtt_server.a b/custom_modules/mqtt_server/libmqtt_server.a new file mode 100644 index 0000000000000000000000000000000000000000..36f84cbb075c6e3815d093036b2a5a59416bcc04 GIT binary patch literal 2281990 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%0D5>OMmD$=qQ4)&w5c__Wz%V^0x>*&gU>4yV9TE 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

y3X~1pJ|dj~f5F-oe{{4B?~3zb=61 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 literal 0 HcmV?d00001 diff --git a/custom_modules/mqtt_server/mqtt_broker/HEAD b/custom_modules/mqtt_server/mqtt_broker/HEAD new file mode 100644 index 0000000..3028a1b --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/HEAD @@ -0,0 +1 @@ +bea4d892540d329cf055a61339200b76001e191d \ No newline at end of file diff --git a/custom_modules/mqtt_server/mqtt_broker/LICENSE.txt b/custom_modules/mqtt_server/mqtt_broker/LICENSE.txt new file mode 100644 index 0000000..63b4b68 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) [year] [fullname] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/custom_modules/mqtt_server/mqtt_broker/README.md b/custom_modules/mqtt_server/mqtt_broker/README.md new file mode 100644 index 0000000..5562f6d --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/README.md @@ -0,0 +1,93 @@ +# MQTT broker and clients + +## About + +The [MQTT (MQ Telemetry Transport) publish/subscribe +protocol](htts://mqtt.org) is a simple lightweight messaging protocol +for distributed network connected devices. It provides low overhead, +reliable connectivity for resource constrained devices. + +This is an open source, asynchronous, C++ implementation of the broker +(server) and connecting clients. The implementation follows the 3.1.1 +OASIS standard available +[here](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html). + +## Installation + +### Requirements + +Asynchronous networking support requires the +[Libevent](http://libevent.org) networking library. Other than that +there are no other external run-time dependencies. + +* A C++11 conformant compiler. +* [Libevent](http://libevent.org) +* [CMake](Cmhttps://cmake.org/) + +Verified platforms. + +* Ubuntu Linux 16.04 (gcc 5.4.0) +* Mac OSX 10.11 (llvm 7.3.0) + +### Building + +1. Clone this repository. +```` + $ git clone https://github.com/inyotech/mqtt_broker.git + $ cd mqtt_broker +```` + +2. Install the google tests framework +``` + $ pushd test/lib + $ git clone https://github.com/google/googletest.git + $ popd +``` + +3. Create a build directory. +```` + $ mkdir build + $ cd build +```` + +4. Generate build files. +```` + $ cmake .. +```` + +5. Build +```` + $ make +```` + +## Example + +* Open a terminal and execute the broker. +```` + $ mqtt_broker +```` + +* In a second terminal execute a subscriber. +```` + $ mqtt_client_sub --topic 'a/b/c' +```` + +* Execute a publisher in a third terminal. +```` + $ mqtt_client_pub --topic 'a/b/c' --message 'published message' +```` + +## Documentation + +[Doxygen](http://www.stack.nl/~dimitri/doxygen/) documentation is +available [here](https://inyotech.github.io/mqtt_broker). + +## License + +This software is licensed under the MIT License. See the LICENSE.TXT file for details. + +## TODO + +* Client Will not implemented. +* Retained message publication not implemented. +* SSL support not implemented. diff --git a/custom_modules/mqtt_server/mqtt_broker/src/base_session.cc b/custom_modules/mqtt_server/mqtt_broker/src/base_session.cc new file mode 100644 index 0000000..7570a63 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/base_session.cc @@ -0,0 +1,115 @@ +/** + * @file base_session.cc + */ + +#include "base_session.h" + +#include + +void BaseSession::packet_received(std::unique_ptr packet) { + + switch (packet->type) { + case PacketType::Connect: + handle_connect(dynamic_cast(*packet)); + break; + case PacketType::Connack: + handle_connack(dynamic_cast(*packet)); + break; + case PacketType::Publish: + handle_publish(dynamic_cast(*packet)); + break; + case PacketType::Puback: + handle_puback(dynamic_cast(*packet)); + break; + case PacketType::Pubrec: + handle_pubrec(dynamic_cast(*packet)); + break; + case PacketType::Pubrel: + handle_pubrel(dynamic_cast(*packet)); + break; + case PacketType::Pubcomp: + handle_pubcomp(dynamic_cast(*packet)); + break; + case PacketType::Subscribe: + handle_subscribe(dynamic_cast(*packet)); + break; + case PacketType::Suback: + handle_suback(dynamic_cast(*packet)); + break; + case PacketType::Unsubscribe: + handle_unsubscribe(dynamic_cast(*packet)); + break; + case PacketType::Unsuback: + handle_unsuback(dynamic_cast(*packet)); + break; + case PacketType::Pingreq: + handle_pingreq(dynamic_cast(*packet)); + break; + case PacketType::Pingresp: + handle_pingresp(dynamic_cast(*packet)); + break; + case PacketType::Disconnect: + handle_disconnect(dynamic_cast(*packet)); + break; + } + +} + +void BaseSession::packet_manager_event(PacketManager::EventType event) { + packet_manager->close_connection(); +} + +void BaseSession::handle_connect(const ConnectPacket &) { + throw std::exception(); +} + +void BaseSession::handle_connack(const ConnackPacket &) { + throw std::exception(); +} + +void BaseSession::handle_publish(const PublishPacket &) { + throw std::exception(); +} + +void BaseSession::handle_puback(const PubackPacket &) { + throw std::exception(); +} + +void BaseSession::handle_pubrec(const PubrecPacket &) { + throw std::exception(); +} + +void BaseSession::handle_pubrel(const PubrelPacket &) { + throw std::exception(); +} + +void BaseSession::handle_pubcomp(const PubcompPacket &) { + throw std::exception(); +} + +void BaseSession::handle_subscribe(const SubscribePacket &) { + throw std::exception(); +} + +void BaseSession::handle_suback(const SubackPacket &) { + throw std::exception(); +} + +void BaseSession::handle_unsubscribe(const UnsubscribePacket &) { + throw std::exception(); +} + +void BaseSession::handle_unsuback(const UnsubackPacket &) { + throw std::exception(); +} + +void BaseSession::handle_pingreq(const PingreqPacket &) { + PingrespPacket pingresp_packet; + packet_manager->send_packet(pingresp_packet); +} + +void BaseSession::handle_pingresp(const PingrespPacket &) {} + +void BaseSession::handle_disconnect(const DisconnectPacket &) { + throw std::exception(); +} diff --git a/custom_modules/mqtt_server/mqtt_broker/src/base_session.h b/custom_modules/mqtt_server/mqtt_broker/src/base_session.h new file mode 100644 index 0000000..fa17d4a --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/base_session.h @@ -0,0 +1,213 @@ +/** + * @file base_session.h + * + * Base class for MQTT sessions. This class add facilities for persistence and resumption of session state. The MQTT + * standard requires that the client and server both maintain session state while connected. The server is also + * required to resume the state when a client re-connects with the same client id. + */ + +#pragma once + +#include "packet.h" +#include "packet_manager.h" + +#include + +#include + +/** + * Base session class + * + * Maintains session attributes and provides default handler methods for received control packets. Classes derived + * from BaseSession will override control packet handlers as required. + * + * Each BaseSession composes a PacketManager instance that can be moved between BaseSession instances. + */ +class BaseSession { + +public: + + /** + * Constructor + * + * Accepts a pointer to a libevent bufferevent as the only argument. The bufferevent is forwarded to a + * newly instantiated PacketManager that use it to handle all network related functions. + * + * This BaseSession instance can persist in memory after the network connection is closed. If a connection is + * received and the Connect control packet contains the same client id as an existing session. Any currently + * active connection in the original session is closed and this PacketManager will be moved to the original + * session. This session will then be deleted. + * + * @param bev Pointer to a bufferevent. + */ + BaseSession(struct bufferevent *bev) : packet_manager(new PacketManager(bev)) { + packet_manager->set_packet_received_handler( + std::bind(&BaseSession::packet_received, this, std::placeholders::_1)); + packet_manager->set_event_handler(std::bind(&BaseSession::packet_manager_event, this, std::placeholders::_1)); + } + + /** + * Desctructor + * + * Virtual so the desctructor for derived classes will be called. + */ + virtual ~BaseSession() {} + + /** Client id. */ + std::string client_id; + + /** Clean session flag. */ + bool clean_session; + + /** + * PacketManager callback. + * + * Invoked by the installed PacketManager instance when it receives a complete control packet. The default handler + * methods will be passed a reference to the received packet. Packet memory is heap allocated on creation and + * will be freed according to standard C++ std::unique_ptr rules. It is the responsibility of subclasses to + * manage the std::unique_ptr. + * + * @param packet Pointer to a packet. + */ + virtual void packet_received(std::unique_ptr packet); + + /** + * PacketManager callback. + * + * Invoked by the installed PacketManager instance when it detects a low level protocol or network error. The + * default action is to close the network connection. + * + * @param event The type of event detected. + */ + virtual void packet_manager_event(PacketManager::EventType event); + + /** + * Handle a received ConnectPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param connect_packet A reference to the packet. + */ + virtual void handle_connect(const ConnectPacket & connect_packet); + + /** + * Handle a received ConnackPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param connack_packet A reference to the packet. + */ + virtual void handle_connack(const ConnackPacket & connack_packet); + + /** + * Handle a received PublishPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param publish_packet A reference to the packet. + */ + virtual void handle_publish(const PublishPacket & publish_packet); + + /** + * Handle a received PubackPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param puback_packet A reference to the packet. + */ + virtual void handle_puback(const PubackPacket & puback_packet); + + /** + * Handle a received PubrecPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param pubrec_packet A reference to the packet. + */ + virtual void handle_pubrec(const PubrecPacket & pubrec_packet); + + /** + * Handle a received PubrelPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param pubrel_packet A reference to the packet. + */ + virtual void handle_pubrel(const PubrelPacket & pubrel_packet); + + /** + * Handle a received PubcompPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param pubcomp_packet A reference to the packet. + */ + virtual void handle_pubcomp(const PubcompPacket & pubcomp_packet); + + /** + * Handle a received SubscribePacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param subscribe_packet A reference to the packet. + */ + virtual void handle_subscribe(const SubscribePacket & subscribe_packet); + + /** + * Handle a received SubackPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param suback_packet A reference to the packet. + */ + virtual void handle_suback(const SubackPacket & suback_packet); + + /** + * Handle a received UnsubscribePacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param unsubscribe_packet A reference to the packet. + */ + virtual void handle_unsubscribe(const UnsubscribePacket & unsubscribe_packet); + + /** + * Handle a received UnsubackPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param unsuback_packet A reference to the packet. + */ + virtual void handle_unsuback(const UnsubackPacket & unsuback_packet); + + /** + * Handle a received PingreqPacket. + * + * The default action is to send a Pingresp packet. Subclasses can override this method. + * + * @param pingreq_packet A reference to the packet. + */ + virtual void handle_pingreq(const PingreqPacket & pingreq_packet); + + /** + * Handle a received PingrespPacket. + * + * The default action is to do nothing. Subclasses can override this method. + * + * @param pingresp_packet A reference to the packet. + */ + virtual void handle_pingresp(const PingrespPacket & pingresp_packet); + + /** + * Handle a received DisconnectPacket. + * + * The default action is to throw an exception. Subclasses should override this method. + * + * @param disconnect_packet A reference to the packet. + */ + virtual void handle_disconnect(const DisconnectPacket & disconnect_packet); + + /** Pointer to the installed PacketManager instance. */ + std::unique_ptr packet_manager; + +}; \ No newline at end of file diff --git a/custom_modules/mqtt_server/mqtt_broker/src/broker.cc b/custom_modules/mqtt_server/mqtt_broker/src/broker.cc new file mode 100644 index 0000000..7e71e38 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/broker.cc @@ -0,0 +1,181 @@ +/** + * @file broker.cc + * + * MQTT Broker (server) + * + * Listen for connections from clients. Accept subscribe, unsubscribe and publish commands and forward according to + * the [MQTT protocol](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html) + */ + +#include "session_manager.h" +#include "broker_session.h" + +#include + +#include + +#include +#include + +/** + * Manange sessions for each client. + * Sessions will persist between connections and are identified by the client id of the connecting client. + */ +SessionManager session_manager; + +/** + * Callback run when SIGINT or SIGTERM is attached, will cleanly exit. + * + * @param signal Integer value of signal. + * @param event Should be EV_SIGNAL. + * @param arg Pointer originally passed to evsignal_new. + */ +static void signal_cb(evutil_socket_t signal, short event, void * arg); + +/** + * Callback run when connection is received on the listening socket. + * + * @param listener Pointer to this listener's internal control structure. + * @param fd File descriptor of the newly accepted socket. + * @param addr Address structure for the peer. + * @param socklen Length of the address structure. + * @param arg Pointer orignally passed to evconlistener_new_bind. + */ +static void listener_cb(struct evconnlistener * listener, evutil_socket_t fd, + struct sockaddr * addr, int socklen, void * arg); + +/** + * Parse command line. + * + * Recognized command line arguments are parsed and added to the options instance. This options instance will be + * used to configure the broker instance. + * + * @param argc Command line argument count. + * @param argv Command line argument values. + */ +static void parse_arguments(int argc, char *argv[]); + +/** + * Options settable through command line arguments. + */ +struct options_t { + + /** Network interface address to bind to. */ + std::string bind_address = "0"; + + /** Port number to bind to. */ + uint16_t bind_port = 1883; + +} options; + +int main(int argc, char *argv[]) { + + struct event_base *evloop; + struct event *signal_event; + struct evconnlistener *listener; + struct sockaddr_in sin; + + unsigned short listen_port = 1883; + + parse_arguments(argc, argv); + + evloop = event_base_new(); + if (!evloop) { + std::cerr << "Could not initialize libevent\n"; + return 1; + } + + signal_event = evsignal_new(evloop, SIGINT, signal_cb, evloop); + evsignal_add(signal_event, NULL); + signal_event = evsignal_new(evloop, SIGTERM, signal_cb, evloop); + evsignal_add(signal_event, NULL); + + std::memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + evutil_inet_pton(sin.sin_family, options.bind_address.c_str(), &sin.sin_addr); + sin.sin_port = htons(listen_port); + + listener = evconnlistener_new_bind(evloop, listener_cb, (void *) evloop, + LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, -1, + (struct sockaddr *) &sin, sizeof(sin)); + if (!listener) { + std::cerr << "Could not create listener!\n"; + return 1; + } + + event_base_dispatch(evloop); + + event_free(signal_event); + evconnlistener_free(listener); + event_base_free(evloop); + + return 0; + +} + +void usage() { + std::cout << + R"END(usage: mqtt_broker [OPTION] + +MQTT broker server. Bind to address and listen for client connections. + +OPTIONS + +--broker-host | -b Broker host name or ip address, default localhost +--broker-port | -p Broker port, default 1883 +--help | -h Display this message and exit +)END"; + +} +void parse_arguments(int argc, char *argv[]) { + static struct option longopts[] = { + {"bind-addr", required_argument, NULL, 'b'}, + {"bind-port", required_argument, NULL, 'p'}, + {"help", no_argument, NULL, 'h'} + }; + + + int ch; + while ((ch = getopt_long(argc, argv, "b:p:h", longopts, NULL)) != -1) { + switch (ch) { + case 'b': + options.bind_address = optarg; + break; + case 'p': + options.bind_port = static_cast(atoi(optarg)); + break; + case 'h': + usage(); + std::exit(0); + default: + usage(); + std::exit(1); + } + } + +} + +static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, + struct sockaddr *sa, int socklen, void *user_data) { + struct event_base *base = static_cast(user_data); + struct bufferevent *bev; + + bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); + if (!bev) { + std::cerr << "Error constructing bufferevent!\n"; + event_base_loopbreak(base); + return; + } + + session_manager.accept_connection(bev); +} + +static void signal_cb(evutil_socket_t fd, short event, void *arg) { + + event_base *base = static_cast(arg); + + if (event_base_loopexit(base, NULL)) { + std::cerr << "failed to exit event loop\n"; + } + +} diff --git a/custom_modules/mqtt_server/mqtt_broker/src/broker_session.cc b/custom_modules/mqtt_server/mqtt_broker/src/broker_session.cc new file mode 100644 index 0000000..72c5b5b --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/broker_session.cc @@ -0,0 +1,250 @@ +/** + * @file broker_session.cc + */ + +#include "broker_session.h" +#include "session_manager.h" + +#include + +bool BrokerSession::authorize_connection(const ConnectPacket &packet) { + return true; +} + +void BrokerSession::resume_session(std::unique_ptr &session, + std::unique_ptr packet_manager_ptr) { + + packet_manager_ptr->set_event_handler( + std::bind(&BrokerSession::packet_manager_event, session.get(), std::placeholders::_1)); + packet_manager_ptr->set_packet_received_handler( + std::bind(&BrokerSession::packet_received, session.get(), std::placeholders::_1)); + session->packet_manager = std::move(packet_manager_ptr); + + ConnackPacket connack; + + connack.session_present(true); + connack.return_code = ConnackPacket::ReturnCode::Accepted; + + session->packet_manager->send_packet(connack); +} + +void BrokerSession::forward_packet(const PublishPacket &packet) { + + if (packet.qos() == QoSType::QoS0) { + packet_manager->send_packet(packet); + } else if (packet.qos() == QoSType::QoS1) { + PublishPacket packet_to_send(packet); + packet_to_send.dup(false); + packet_to_send.retain(false); + packet_to_send.packet_id = packet_manager->next_packet_id(); + qos1_pending_puback.push_back(packet_to_send); + packet_manager->send_packet(packet_to_send); + } else if (packet.qos() == QoSType::QoS2) { + + PublishPacket packet_to_send(packet); + packet_to_send.dup(false); + packet_to_send.retain(false); + packet_to_send.packet_id = packet_manager->next_packet_id(); + + auto previous_packet = find_if(qos2_pending_pubrec.begin(), qos2_pending_pubrec.end(), + [&packet](const PublishPacket &p) { return p.packet_id == packet.packet_id; }); + if (previous_packet == qos2_pending_pubrec.end()) { + qos2_pending_pubrec.push_back(packet_to_send); + } + + packet_manager->send_packet(packet_to_send); + + } +} + +void BrokerSession::send_pending_message() { + + if (!qos1_pending_puback.empty()) { + packet_manager->send_packet(qos1_pending_puback[0]); + } else if (!qos2_pending_pubrec.empty()) { + packet_manager->send_packet(qos2_pending_pubrec[0]); + } else if (!qos2_pending_pubrel.empty()) { + PubrecPacket pubrec_packet; + pubrec_packet.packet_id = qos2_pending_pubrel[0]; + packet_manager->send_packet(pubrec_packet); + } else if (!qos2_pending_pubcomp.empty()) { + PubrelPacket pubrel_packet; + pubrel_packet.packet_id = qos2_pending_pubcomp[0]; + packet_manager->send_packet(pubrel_packet); + } + + return; +} + +void BrokerSession::packet_received(std::unique_ptr packet) { + BaseSession::packet_received(std::move(packet)); + send_pending_message(); +} + +void BrokerSession::packet_manager_event(PacketManager::EventType event) { + BaseSession::packet_manager_event(event); + if (clean_session) { + session_manager.erase_session(this); + } +} + +void BrokerSession::handle_connect(const ConnectPacket &packet) { + + if (!authorize_connection(packet)) { + session_manager.erase_session(this); + return; + } + + if (packet.clean_session()) { + session_manager.erase_session(packet.client_id); + } else { + auto previous_session_it = session_manager.find_session(packet.client_id); + if (previous_session_it != session_manager.sessions.end()) { + std::unique_ptr &previous_session_ptr = *previous_session_it; + resume_session(previous_session_ptr, std::move(packet_manager)); + session_manager.erase_session(this); + return; + } + } + + client_id = packet.client_id; + clean_session = packet.clean_session(); + + ConnackPacket connack; + + connack.session_present(false); + connack.return_code = ConnackPacket::ReturnCode::Accepted; + + packet_manager->send_packet(connack); + +} + +void BrokerSession::handle_publish(const PublishPacket &packet) { + + if (packet.qos() == QoSType::QoS0) { + + session_manager.handle_publish(packet); + + } else if (packet.qos() == QoSType::QoS1) { + + session_manager.handle_publish(packet); + PubackPacket puback; + puback.packet_id = packet.packet_id; + packet_manager->send_packet(puback); + + } else if (packet.qos() == QoSType::QoS2) { + + auto previous_packet = find_if(qos2_pending_pubrel.begin(), qos2_pending_pubrel.end(), + [& packet](uint16_t packet_id) { return packet_id == packet.packet_id; }); + if (previous_packet == qos2_pending_pubrel.end()) { + qos2_pending_pubrel.push_back(packet.packet_id); + session_manager.handle_publish(packet); + } + + } + + session_manager.handle_local_publish(client_id, packet); +} + +void BrokerSession::handle_puback(const PubackPacket &packet) { + + auto message = find_if(qos1_pending_puback.begin(), qos1_pending_puback.end(), + [&packet](const PublishPacket &p) { return p.packet_id == packet.packet_id; }); + if (message != qos1_pending_puback.end()) { + qos1_pending_puback.erase(message); + } + +} + +void BrokerSession::handle_pubrec(const PubrecPacket &packet) { + + qos2_pending_pubrec.erase( + std::remove_if(qos2_pending_pubrec.begin(), qos2_pending_pubrec.end(), + [&packet](const PublishPacket &p) { return p.packet_id == packet.packet_id; }), + qos2_pending_pubrec.end() + ); + + auto pubcomp_packet = find_if(qos2_pending_pubcomp.begin(), qos2_pending_pubcomp.end(), + [&packet](uint16_t packet_id) { return packet_id == packet.packet_id; }); + + if (pubcomp_packet == qos2_pending_pubcomp.end()) { + qos2_pending_pubcomp.push_back(packet.packet_id); + } + +} + +void BrokerSession::handle_pubrel(const PubrelPacket &packet) { + + qos2_pending_pubrel.erase( + std::remove_if(qos2_pending_pubrel.begin(), qos2_pending_pubrel.end(), + [&packet](uint16_t packet_id) { return packet_id == packet.packet_id; }), + qos2_pending_pubrel.end() + ); + + PubcompPacket pubcomp; + pubcomp.packet_id = packet.packet_id; + packet_manager->send_packet(pubcomp); +} + +void BrokerSession::handle_pubcomp(const PubcompPacket &packet) { + + qos2_pending_pubcomp.erase( + std::remove_if(qos2_pending_pubcomp.begin(), qos2_pending_pubcomp.end(), + [&packet](uint16_t packet_id) { return packet_id == packet.packet_id; }), + qos2_pending_pubcomp.end() + ); + +} + +void BrokerSession::handle_subscribe(const SubscribePacket &packet) { + + SubackPacket suback; + + suback.packet_id = packet.packet_id; + + for (auto subscription : packet.subscriptions) { + + auto previous_subscription = find_if(subscriptions.begin(), subscriptions.end(), + [&subscription](const Subscription &s) { + return topic_match(s.topic_filter, subscription.topic_filter); + }); + if (previous_subscription != subscriptions.end()) { + subscriptions.erase(previous_subscription); + } + + subscriptions.push_back(subscription); + + SubackPacket::ReturnCode return_code = SubackPacket::ReturnCode::Failure; + switch (subscription.qos) { + case QoSType::QoS0: + return_code = SubackPacket::ReturnCode::SuccessQoS0; + break; + case QoSType::QoS1: + return_code = SubackPacket::ReturnCode::SuccessQoS1; + break; + case QoSType::QoS2: + return_code = SubackPacket::ReturnCode::SuccessQoS2; + break; + } + suback.return_codes.push_back(return_code); + } + + packet_manager->send_packet(suback); + +} + +void BrokerSession::handle_unsubscribe(const UnsubscribePacket &packet) { + + UnsubackPacket unsuback; + + unsuback.packet_id = packet.packet_id; + + packet_manager->send_packet(unsuback); + +} + +void BrokerSession::handle_disconnect(const DisconnectPacket &packet) { + if (clean_session) { + session_manager.erase_session(this); + } +} diff --git a/custom_modules/mqtt_server/mqtt_broker/src/broker_session.h b/custom_modules/mqtt_server/mqtt_broker/src/broker_session.h new file mode 100644 index 0000000..5ff79dc --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/broker_session.h @@ -0,0 +1,266 @@ +/** + * @file broker_session.h + * + * This class builds on the BaseSession class adding members and methods needed for a MQTT session in the broker. + * + * Drived class for MQTT broker sessions. In addition to maintaining session state throughout the lifetime of the + * connection, the MQTT specification requires that the broker persist session state after a client closes the + * connection. When a subsequent connection is made with the same client id, the persisted session should be resumed. + * Any QoS 1 or QoS 2 messages delivered to client subscribed topics should be forwarded over the new connection. + */ + +#pragma once + +#include "base_session.h" +#include "packet_manager.h" +#include "packet.h" + +#include + +#include +#include + +class SessionManager; + +class Message; + +class Subscription; + +/** + * Broker session class + * + * In addition to maintaining session attributes and handling control packets, this subclass adds facilities for + * persisting and resuming session state according to the MQTT 3.1.1 standard. + */ +class BrokerSession : public BaseSession { + +public: + + /** + * Constructor + * + * In addition to the bufferen event pointer required by the BaseSession constructor, this constructor accepts + * a reference to a SessionManager class. + * + * @param bev Pointer to a bufferevent internal control structure. + * @param session_manager Reference to the SessionManager. + */ + BrokerSession(struct bufferevent *bev, SessionManager &session_manager) : BaseSession(bev), + session_manager(session_manager) { + } + + /** + * Handle authentication and authorization of a connecting client. + * + * This method is called from the connect packet handler. It currently always returns true. + * + * @return Authorization granted. + */ + bool authorize_connection(const ConnectPacket &); + + /** + * Resume a persisted session. + * + * The MQTT 3.1.1 standard requires that the session state be restored for clients connecting with the same client + * id. This method is used to perform that action once a persisted session is recognized. This method accepts + * a reference to the BrokerSession to be restored and PacketManager instance to be installed in the restored + * session. Once installed a the PacketManager will send a Connack packet to the connecting client with the + * Session Present flag set. + * + * @param session Reference to the session to be resumed. + * @param packet_manager PacketManager to be installed in the resumed session. + */ + void resume_session(std::unique_ptr &session, + std::unique_ptr packet_manager); + + /** + * List of topics subscribed to by this client. + */ + std::vector subscriptions; + + /** + * Forward a publshed message to the connected client. + * + * This method is called by the SessionManager when forwarding messages to subscribed clients. It will behave + * according to the QoS in the PublishPacket. QoS 0 packets will be forwarded and forgotten. In the case of QoS 1 + * or 2 messages, these will be retained until they are acknowledged according to the publish control packet + * protocol flow described in the MQTT 3.1.1 standard. + * + * @param packet Reference to the PublishPacket to forward. + */ + void forward_packet(const PublishPacket &packet); + + /** + * Send messages from the pending queues. + * + * Iterate through the pending message queues and if non-empty send a single pending message. This method should + * be called periodically. Currently it is called each time a packet is received from a client. + */ + void send_pending_message(void); + + /** + * PacketManager callback. + * + * This method will delegate to the BaseSession method and then invoke send_pending_message. Ownership of the + * Packet is transfered back to the BaseSession instance. + * + * @param packet Reference counted pointer to a packet. + */ + void packet_received(std::unique_ptr packet) override; + + /** + * PacketManager callback. + * + * This method will delegate to the BaseSession method then potentially remove this session from the SessionManager + * based on the clean_session flag. + * + * @param event The type of event detected. + */ + void packet_manager_event(PacketManager::EventType event) override; + + /** + * Handle a received ConnectPacket. + * + * This method will examine the ConnectPacket and restore or set up a new session. The authorize_connection method + * will be called to authenticate and authorize this connection. The client id will be used to lookup any + * previous session and if found the PacketManager instance installed in this session will be moved to the + * persisted session and this session instance will be destroyed. + * + * In case a persisted session is not found. A Connack packet will be sent with the session_present flag set to + * false. + * + * @param connect_packet A reference to the packet. + */ + void handle_connect(const ConnectPacket & connect_packet) override; + + /** + * Handle a received PublishPacket. + * + * Delegate forwarding of this message to the SessionManager. Additional actions will be performed based on the + * QoS value in the PublishPacket. For QoS 1 a Puback packet will be sent. For QoS 2, queue and expected Pubrel + * packet id which will initiate the sending of a Pubrec packet at the next run of the pending packets queue. + * + * @param publish_packet A reference to the packet. + */ + void handle_publish(const PublishPacket & publish_packet) override; + + /** + * Handle a received PubackPacket. + * + * This packet is expected in response to a Publish control packet with QoS 1. Publish packets with QoS 1 will be + * resent periodically until a Puback is received. QoS 1 Publish packets have an 'at least once' delivery + * guarantee. This handler will remove the Publish packet from the queue of pending messages ending the QoS 1 + * protocol flow. + * + * @param puback_packet A reference to the packet. + */ + void handle_puback(const PubackPacket & puback_packet) override; + + /** + * Handle a received PubrecPacket + * + * This packet is received in response to a Publish control packet with QoS 2. Publish packets with QoS 2 will be + * resent periodically until a PubRec is received. QoS 2 Publish packets have an 'exactly once' delivery + * guarantee. This handler will remove the Publish packet from the queue of pending messages and will continue + * the QoS 2 protocol flow by adding the packet id to the pending Pubcomp queue. This will enable the send of a + * Pubrel control packet at the next pending packet queue run. + * + * @param pubrec_packet A reference to the packet. + */ + void handle_pubrec(const PubrecPacket & pubrec_packet) override; + + /** + * Handle a received PubrelPacket. + * + * This packet is received in response to a Pubrec packet in the QoS 2 protocol flow. This handler will remove + * the Pubrec packet id from the queue of pending Pubrel packets and send a Pubcomp packet ending the QoS 2 + * protocol flow. + * + * @param pubrel_packet A reference to the packet. + */ + void handle_pubrel(const PubrelPacket & pubrel_packet) override; + + /** + * Handle a received PubcompPacket. + * + * This packet is received in response to a Pubrel control packet in the QoS 2 protocol flow. This handler will + * remove the packet id from the pending Pubcomp queue. No further processing is done. + * + * @param pubcomp_packet A reference to the packet. + */ + void handle_pubcomp(const PubcompPacket & pubcomp_packet) override; + + /** + * Handle a received SubscribePacket. + * + * Add the contained topic names to the list of subscriptions maintained in this session. Any previous matching + * subscribed topic will be replaced by the new one overriding the subscribed QoS. Send a Suback packet in + * response. + * + * @param subscribe_packet A reference to the packet. + */ + void handle_subscribe(const SubscribePacket & subscribe_packet) override; + + /** + * Handle a received UnsubscribePacket. + * + * Remove the topic name from the list of subscribed topics. + * + * //TODO This function is currently incomplete. + * + * @param unsubscribe_packet A reference to the packet. + */ + void handle_unsubscribe(const UnsubscribePacket & unsubscribe_packet) override; + + /** + * Handle a DisconnectPacket. + * + * Remove this session from the pool of persistent sessions and destroy it, depending on the clean_session + * attribute of this session. + * + * @param disconnect_packet A reference to the packet. + */ + void handle_disconnect(const DisconnectPacket & disconnect_packet) override; + + /** + * List of QoS 1 messages waiting for Puback. + * + * These messages have been forwarded to subscribed clients. This list will be persisted between connections as + * part of the BrokerSession state. + */ + std::vector qos1_pending_puback; + + /** + * List of QoS 2 messages waiting for Pubrec. + * + * These messages have been forwarded to subscribed clients. This list will be persisted between connections as + * part of the BrokerSession state. + */ + std::vector qos2_pending_pubrec; + + /** + * List of QoS 2 messages waiting for Pubrel. + * + * These messages have been received in Publish control packets from a client connected to this session and + * potentially forwarded on by the SessionManager to other subscribed clients. Packet ids are added to this + * list when a Pubrec control packet has been sent. The list will be persisted between connections as part of the + * BrokerSession state. + */ + std::vector qos2_pending_pubrel; + + /** + * List of QoS 2 messages waiting for Pubcomp. + * + * These messages have been forwarded to subscribed clients. Packet ids are added to this list when a Pubrel + * control packet has been received. This list will be persisted between connections as part of the BrokerSession + * state. + */ + std::vector qos2_pending_pubcomp; + + /** + * A reference to the SessionManager instance. + */ + SessionManager &session_manager; + +}; + diff --git a/custom_modules/mqtt_server/mqtt_broker/src/client_id.cc b/custom_modules/mqtt_server/mqtt_broker/src/client_id.cc new file mode 100644 index 0000000..215f833 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/client_id.cc @@ -0,0 +1,26 @@ +/** + * @file client_id.cc + */ + +#include "client_id.h" + +#include +#include +#include + +static const std::string characters = "abcdefghijklmnopqrstuvwxyz0123456789"; +static std::once_flag init_rnd; + +std::string generate_client_id(size_t len) { + + std::call_once(init_rnd, [](){ std::srand(std::time(nullptr)); }); + + std::string random_string; + + for (size_t i=0; i +#include + +/** + * Generate a unique client id. + * + * The client id is a random character sequence drawn from the character set [a-z0-9]. + * + * @param len Length of the sequence to generate + * @return Random character sequence + */ +std::string generate_client_id(size_t len=32); \ No newline at end of file diff --git a/custom_modules/mqtt_server/mqtt_broker/src/client_pub.cc b/custom_modules/mqtt_server/mqtt_broker/src/client_pub.cc new file mode 100644 index 0000000..bfb141e --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/client_pub.cc @@ -0,0 +1,362 @@ +/** + * @file client_pub.cc + * + * MQTT Publisher (client) + * + * Connect to a listening broker and publish a message on a topic. Topic and message are passed as command line + * arguments to this program. + * See [the MQTT specification](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html) + */ + +#include "packet.h" +#include "base_session.h" + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +/** + * Display usage message + * + * Displays help on command line arguments. + */ +static void usage(void); + +/** + * Parse command line. + * + * Recognized command line arguments are parsed and added to the options instance. This options instance will be + * passed to the session instance. + * + * @param argc Command line argument count. + * @param argv Command line argument values. + */ +static void parse_arguments(int argc, char *argv[]); + +/** + * On broker connection callback. + * + * @param bev Pointer to bufferevent internal control structure. + * @param event The bufferevent event code, on success this will be EV_EVENT_CONNECTED, it can also be one of + * EV_EVENT_EOF, EV_EVENT_ERROR, or EV_EVENT_TIMEOUT. + * @param arg Pointer to user data passed in when callback is set. Here this should be a pointer to the event_base + * object. + */ +static void connect_event_cb(struct bufferevent *bev, short event, void *arg); + +/** + * Socket close handler. + * + * When the session is closing this function is set to be called when the write buffer is empty. When called it will + * close the connection and exit the event loop. + * + * @param bev Pointer to the bufferevent internal control structure. + * @param arg Pointer to user data passed in when callback is set. Here this should be a pointer to the event_base + * object. + */ +static void close_cb(struct bufferevent *bev, void *arg); + +/** + * Options settable through command line arguments. + */ +static struct options_t { + + /** Broker host to connect to. DNS name is allowed. */ + std::string broker_host = "localhost"; + + /** Broker port. */ + uint16_t broker_port = 1883; + + /** Client id. If empty no client id will be sent. The broker will generate a client id automatically. */ + std::string client_id; + + /** Topic to publish to. */ + std::string topic; + + /** Message text to publish. */ + std::vector message; + + /** Quality of service specifier for message. */ + QoSType qos = QoSType::QoS0; + + /** + * Drop this session on exit if true. If false this session will persist in the broker after disconnection + * and will be continued at the next connection with the same client id. This feature isn't useful when a client + * id is not provided. + */ + bool clean_session = false; + +} options; + +/** + * Session class specialized for this publishing client. + * + * Override base class control packet handlers used in message publishing. Any other control packets received will be + * handled by default methods, in most cases that will result in a thrown exception. + */ +class ClientSession : public BaseSession { + +public: + + /** + * Constructor + * + * @param bev Pointer to the buffer event structure for the broker connection. + * @param options Options structure. + */ + ClientSession(bufferevent *bev, const options_t &options) : BaseSession(bev), options(options) {} + + /** Reference to the options structure with members updated from command line arguments. */ + const options_t &options; + + /** + * Store the packet id of the publish packet we send for comparisison with any puback or pubcomp control packets + * received from the broker. + */ + uint16_t published_packet_id = 0; + + /** + * Handle a connack control packet from the broker. + * + * This packet will be sent in response to the connect packet that this client will send. Check the return code + * and disconnect on any error. Otherwise construct a publish packet from the options and send this to the broker. + * + * @param connack_packet The connack control packet received. + */ + void handle_connack(const ConnackPacket &connack_packet) override { + + if (connack_packet.return_code != ConnackPacket::ReturnCode::Accepted) { + std::cerr << "connection not accepted by broker\n"; + disconnect(); + } + + PublishPacket publish_packet; + publish_packet.qos(options.qos); + publish_packet.topic_name = options.topic; + publish_packet.packet_id = packet_manager->next_packet_id(); + published_packet_id = publish_packet.packet_id; + publish_packet.message_data = std::vector(options.message.begin(), options.message.end()); + packet_manager->send_packet(publish_packet); + + if (options.qos == QoSType::QoS0) { + disconnect(); + } + } + + /** + * Handle a puback control packet from the broker. + * + * This packet will be sent in response to a publish message with QoS 1. Compare the packet id with the packet + * id sent in a previous publish message. Notify in case of a mismatch. + * + * @param puback_packet The received puback control packet. + */ + void handle_puback(const PubackPacket &puback_packet) override { + + if (puback_packet.packet_id != published_packet_id) { + std::cout << "puback packet id mismatch: sent " << published_packet_id << " received " + << puback_packet.packet_id << "\n"; + } + disconnect(); + } + + /** + * Handle a pubrec control packet from the broker. + * + * This packet will be sent in repsponse to a publish message with QoS 2. Compare the packet id with the packet + * id sent in a previous publish message. Notify in case of mismatch. Send a pubrel packet containing the received + * packet id in response. Wait for pubcomp control packet response. + * + * @param pubrec_packet The received pubrec control packet. + */ + void handle_pubrec(const PubrecPacket &pubrec_packet) override { + + if (pubrec_packet.packet_id != published_packet_id) { + std::cout << "pubrec packet id mismatch: sent " << published_packet_id << " received " + << pubrec_packet.packet_id << "\n"; + } + + PubrelPacket pubrel_packet; + pubrel_packet.packet_id = pubrec_packet.packet_id; + packet_manager->send_packet(pubrel_packet); + + } + + /** + * Handle a pubcomp control packet from the broker. + * + * This packet will be sent in response to a pubrel packet confirmation of a QoS 2 publish message. Compare the + * packet id sent in a previous publish message. Notify in case of mismatch. On receipt of this message the QoS 2 + * confirmation exchange is complete. If the packet id matches the the packet id of the original message + * disconnect from the broker, otherwise stay connected waiting for the pubcomp with the required packet id. + * + * @param puback_packet the received pubcomp packet + */ + void handle_pubcomp(const PubcompPacket &pubcomp_packet) override { + + if (pubcomp_packet.packet_id != published_packet_id) { + std::cout << "pubcomp packet id mismatch: sent " << published_packet_id << " received " + << pubcomp_packet.packet_id << "\n"; + + } else { + disconnect(); + } + } + + /** + * Disconnect from the broker. + * + * Send a disconnect control packet. Set up libevent to wait for the disconnect packet to be written then close + * the network connection. + */ + void disconnect() { + DisconnectPacket disconnect_packet; + packet_manager->send_packet(disconnect_packet); + bufferevent_enable(packet_manager->bev, EV_WRITE); + bufferevent_setcb(packet_manager->bev, packet_manager->bev->readcb, close_cb, NULL, + packet_manager->bev->ev_base); + } +}; + +/** + * The session instance. + * + * MQTT requires that both the client and server maintain a session state. + */ +static std::unique_ptr session; + +int main(int argc, char *argv[]) { + + struct event_base *evloop; + struct evdns_base *dns_base; + struct bufferevent *bev; + + parse_arguments(argc, argv); + + evloop = event_base_new(); + if (!evloop) { + std::cerr << "Could not initialize libevent\n"; + std::exit(1); + } + + dns_base = evdns_base_new(evloop, 1); + + bev = bufferevent_socket_new(evloop, -1, BEV_OPT_CLOSE_ON_FREE); + + bufferevent_setcb(bev, NULL, NULL, connect_event_cb, evloop); + + bufferevent_socket_connect_hostname(bev, dns_base, AF_UNSPEC, options.broker_host.c_str(), options.broker_port); + + evdns_base_free(dns_base, 0); + + event_base_dispatch(evloop); + event_base_free(evloop); + +} + +static void connect_event_cb(struct bufferevent *bev, short events, void *arg) { + + if (events & BEV_EVENT_CONNECTED) { + + session = std::unique_ptr(new ClientSession(bev, options)); + + ConnectPacket connect_packet; + connect_packet.client_id = options.client_id; + session->packet_manager->send_packet(connect_packet); + + } else if (events & (BEV_EVENT_ERROR | BEV_EVENT_EOF)) { + std::cerr << "error connecting to broker\n"; + struct event_base *base = static_cast(arg); + if (events & BEV_EVENT_ERROR) { + int err = bufferevent_socket_get_dns_error(bev); + if (err) + std::cerr << "DNS error: " << evutil_gai_strerror(err) << "\n"; + } + + bufferevent_free(bev); + event_base_loopexit(base, NULL); + } + +} + +static void usage() { + std::cout << +R"END(usage: mqtt_client_pub [OPTIONS] + +Connect to an MQTT broker and publish a single message to a single topic. + +OPTIONS + +--broker-host | -b Broker host name or ip address, default localhost +--broker-port | -p Broker port, default 1883 +--client-id | -i Client id, default none +--topic | -t Topic string, default none +--message | -m Message data, default none +--qos | -q QoS (Quality of Service), should be 0, 1, or 2, default 0 +--clean-session | -c Disable session persistence, default false +--help | -h Display this message and exit +)END"; + +} + +static void parse_arguments(int argc, char *argv[]) { + static struct option longopts[] = { + {"broker-host", required_argument, NULL, 'b'}, + {"broker-port", required_argument, NULL, 'p'}, + {"client-id", required_argument, NULL, 'i'}, + {"topic", required_argument, NULL, 't'}, + {"message", required_argument, NULL, 'm'}, + {"qos", required_argument, NULL, 'q'}, + {"clean-session", no_argument, NULL, 'c'}, + {"help", no_argument, NULL, 'h'} + }; + + + int ch; + while ((ch = getopt_long(argc, argv, "b:p:i:t:m:q:ch", longopts, NULL)) != -1) { + switch (ch) { + case 'b': + options.broker_host = optarg; + break; + case 'p': + options.broker_port = static_cast(atoi(optarg)); + break; + case 'i': + options.client_id = optarg; + break; + case 't': + options.topic = optarg; + break; + case 'm': + options.message = std::vector(optarg, optarg + strlen(optarg)); + case 'q': + options.qos = static_cast(atoi(optarg)); + break; + case 'c': + options.clean_session = true; + break; + case 'h': + usage(); + std::exit(0); + + default: + usage(); + std::exit(1); + } + } + +} + +static void close_cb(struct bufferevent *bev, void *arg) { + session->packet_manager->close_connection(); + event_base *base = static_cast(arg); + event_base_loopexit(base, NULL);; +} diff --git a/custom_modules/mqtt_server/mqtt_broker/src/client_sub.cc b/custom_modules/mqtt_server/mqtt_broker/src/client_sub.cc new file mode 100644 index 0000000..1de4241 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/client_sub.cc @@ -0,0 +1,369 @@ +/** + * @file client_sub.cc + * + * MQTT Subscriber (client) + * + * Connect to a listening broker and add a subscription a topic then listen for pubished messages from the broker. + * Topic strings can follow the MQTT 3.1.1 specification including wildcards. + * See [the MQTT specification](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html) + */ + +#include "packet.h" +#include "packet_manager.h" +#include "base_session.h" + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +/** + * Display usage message + * + * Displays help on command line arguments. + */ +static void usage(void); + +/** + * Parse command line. + * + * Recognized command line arguments are parsed and added to the options instance. This options instance will be + * passed to the session instance. + * + * @param argc Command line argument count. + * @param argv Command line argument values. + */ +static void parse_arguments(int argc, char *argv[]); + +/** + * On broker connection callback. + * + * @param bev Pointer to bufferevent internal control structure. + * @param event The bufferevent event code, on success this will be EV_EVENT_CONNECTED, it can also be one of + * EV_EVENT_EOF, EV_EVENT_ERROR, or EV_EVENT_TIMEOUT. + * @param arg Pointer to user data passed in when callback is set. Here this should be a pointer to the event_base + * object. + */ +static void connect_event_cb(struct bufferevent *bev, short event, void *arg); + +/** + * Socket close handler. + * + * When the session is closing this function is set to be called when the write buffer is empty. When called it will + * close the connection and exit the event loop. + * + * @param bev Pointer to the bufferevent internal control structure. + * @param arg Pointer to user data passed in when callback is set. Here this should be a pointer to the event_base + * object. + */ +static void close_cb(struct bufferevent *bev, void *arg); + +/** + * Callback run when SIGINT or SIGTERM is attached, will cleanly exit. + * + * @param signal Integer value of signal. + * @param event Should be EV_SIGNAL. + * @param arg Pointer originally passed to evsignal_new. + */ +static void signal_cb(evutil_socket_t, short event, void *); + +/** + * Options settable through command line arguments. + */ +struct options_t { + + /** Broker host to connect to. DNS name is allowed. */ + std::string broker_host = "localhost"; + + /** Broker port. */ + uint16_t broker_port = 1883; + + /** Client id. If empty no client id will be sent. The broker will generate a client id automatically. */ + std::string client_id; + + /** Topics to subscribe to. This option can be specified more than once to subscribe to multiple topics. */ + std::vector topics; + + /** Quality of service specifier for message. */ + QoSType qos = QoSType::QoS0; + + /** + * Drop this session on exit if true. If false this session will persist in the broker after disconnection + * and will be continued at the next connection with the same client id. This feature isn't useful when a client + * id is not provided. + */ + bool clean_session = false; + +} options; + +/** + * Session class specialized for this publishing client. + * + * Override base class control packet handlers used to subscribe to topics and to receive messages forwarded from the + * broker. Any other control packets received will be handled by default methods, in most cases that will result in a + * thrown exception. + */ +class ClientSession : public BaseSession { +public: + + /** + * Constructor + * + * @param bev Pointer to the buffer event structure for the broker connection. + * @param options Options structure. + */ + ClientSession(bufferevent *bev, const options_t &options) : BaseSession(bev), options(options) {} + + /** Reference to the options structure with members updated from command line arguments. */ + const options_t &options; + + /** + * Handle a connack control packet from the broker. + * + * This packet will be sent in response to the connect packet that this client will send. Check the return code + * and disconnect on any error. Otherwise construct a subscribe packet from the options and send it to the broker. + * + * @param connack_packet The connack control packet received. + */ + void handle_connack(const ConnackPacket &connack_packet) override { + + SubscribePacket subscribe_packet; + subscribe_packet.packet_id = packet_manager->next_packet_id(); + + for (auto topic : options.topics) { + subscribe_packet.subscriptions.push_back(Subscription{topic, options.qos}); + } + packet_manager->send_packet(subscribe_packet); + } + + /** + * Handle a suback control packet from the broker. + * + * This packet will be sent in response to a subscribe message. Check the error code in the packet and if there is + * an error output an error message but continue to listen for messages. Also check the qos field in the suback + * packet and compare with the requested qos in the original subscribe. If there is a mismatch output a message. + * + * @param suback_packet The received suback control packet. + */ + void handle_suback(const SubackPacket &suback_packet) override { + + for (size_t i = 0; i < suback_packet.return_codes.size(); i++) { + SubackPacket::ReturnCode code = suback_packet.return_codes[i]; + if (code == SubackPacket::ReturnCode::Failure) { + std::cout << "Subscription to topic " << options.topics[i] << "failed\n"; + } else if (static_cast(code) != options.qos) { + std::cout << "Topic " << options.topics[i] << " requested qos " << static_cast(options.qos) + << " subscribed " + << static_cast(code) << "\n"; + } + } + } + + /** + * Handle a publish control packet from the broker. + * + * This packet will contain forwarded messages from other clients published to the topic. Output the message and + * acknowledge based on the QoS in the packet. In the case of a QoS 0 message there is no acknowledegment. + * A Qos 1 message will require a Puback packet in response. A QoS 2 message requires a Pubrec packet from the + * subscriber followed by a Pubrel packet from the broker and finally a Pubcomp packet is sent from the subscriber. + * + * @param publish_packet the received publish packet + */ + void handle_publish(const PublishPacket &publish_packet) override { + + std::cout << std::string(publish_packet.message_data.begin(), publish_packet.message_data.end()) << "\n"; + + if (publish_packet.qos() == QoSType::QoS1) { + PubackPacket puback_packet; + puback_packet.packet_id = publish_packet.packet_id; + packet_manager->send_packet(puback_packet); + } else if (publish_packet.qos() == QoSType::QoS2) { + PubrecPacket pubrec_packet; + pubrec_packet.packet_id = publish_packet.packet_id; + packet_manager->send_packet(pubrec_packet); + } + } + + + /** + * Handle a pubrel control packet from the broker. + * + * This packet will be sent in repsponse to a Pubrel packet in the QoS 2 protocol flow. Send a Pubcomp packet + * in response. This completes the QoS 2 flow. + * + * @param pubrel_packet The received pubrel control packet. + */ + void handle_pubrel(const PubrelPacket &pubrel_packet) override { + PubcompPacket pubcomp_packet; + pubcomp_packet.packet_id = pubrel_packet.packet_id; + packet_manager->send_packet(pubcomp_packet); + } + + /** + * Handle protocol events in the packet manager. + * + * This callback will be called by the packet manager in case of protocol or network error. In most cases the + * response is to close the connection to the broker. + * + * @param event The specific type of the event reported by the packet manager. + */ + void packet_manager_event(PacketManager::EventType event) override { + event_base_loopexit(packet_manager->bev->ev_base, NULL); + BaseSession::packet_manager_event(event); + } +}; + +/** + * The session instance. + * + * MQTT requires that both the client and server maintain a session state. + */ +std::unique_ptr session; + +int main(int argc, char *argv[]) { + + struct event_base *evloop; + struct event *signal_event; + struct evdns_base *dns_base; + struct bufferevent *bev; + + parse_arguments(argc, argv); + + evloop = event_base_new(); + if (!evloop) { + std::cerr << "Could not initialize libevent\n"; + std::exit(1); + } + + signal_event = evsignal_new(evloop, SIGINT, signal_cb, evloop); + evsignal_add(signal_event, NULL); + signal_event = evsignal_new(evloop, SIGTERM, signal_cb, evloop); + evsignal_add(signal_event, NULL); + + dns_base = evdns_base_new(evloop, 1); + + bev = bufferevent_socket_new(evloop, -1, BEV_OPT_CLOSE_ON_FREE); + + bufferevent_setcb(bev, NULL, NULL, connect_event_cb, evloop); + + bufferevent_socket_connect_hostname(bev, dns_base, AF_UNSPEC, options.broker_host.c_str(), options.broker_port); + evdns_base_free(dns_base, 0); + + event_base_dispatch(evloop); + + event_free(signal_event); + event_base_free(evloop); + +} + +static void connect_event_cb(struct bufferevent *bev, short events, void *arg) { + + if (events & BEV_EVENT_CONNECTED) { + + session = std::unique_ptr(new ClientSession(bev, options)); + + ConnectPacket connect_packet; + connect_packet.client_id = options.client_id; + connect_packet.clean_session(options.clean_session); + session->packet_manager->send_packet(connect_packet); + + } else if (events & (BEV_EVENT_ERROR | BEV_EVENT_EOF)) { + struct event_base *base = static_cast(arg); + if (events & BEV_EVENT_ERROR) { + int err = bufferevent_socket_get_dns_error(bev); + if (err) + std::cerr << "DNS error: " << evutil_gai_strerror(err) << "\n"; + } + + bufferevent_free(bev); + event_base_loopexit(base, NULL); + } + +} + +void usage() { + std::cout << +R"END(usage: mqtt_client_sub [OPTIONS] + +Connect to an MQTT broker and publish a single message to a single topic. + +OPTIONS + +--broker-host | -b Broker host name or ip address, default localhost +--broker-port | -p Broker port, default 1883 +--client-id | -i Client id, default none +--topic | -t Topic string to subscribe to, this option can be provided more that once to subscribe + to multiple topics, default none +--qos | -q QoS (Quality of Service), should be 0, 1, or 2, default 0 +--clean-session | -c Disable session persistence, default false +--help | -h Display this message and exit +)END"; + +} + +void parse_arguments(int argc, char *argv[]) { + static struct option longopts[] = { + {"broker-host", required_argument, NULL, 'b'}, + {"broker-port", required_argument, NULL, 'p'}, + {"client-id", required_argument, NULL, 'i'}, + {"topic", required_argument, NULL, 't'}, + {"qos", required_argument, NULL, 'q'}, + {"clean-session", no_argument, NULL, 'c'}, + {"help", no_argument, NULL, 'h'} + }; + + + int ch; + while ((ch = getopt_long(argc, argv, "b:p:i:t:q:ch", longopts, NULL)) != -1) { + switch (ch) { + case 'b': + options.broker_host = optarg; + break; + case 'p': + options.broker_port = static_cast(atoi(optarg)); + break; + case 'i': + options.client_id = optarg; + break; + case 't': + options.topics.push_back(optarg); + break; + case 'q': + options.qos = static_cast(atoi(optarg)); + break; + case 'c': + options.clean_session = true; + break; + case 'h': + usage(); + std::exit(0); + + default: + usage(); + std::exit(1); + } + } + +} + +static void close_cb(struct bufferevent *bev, void *arg) { + + event_base *base = static_cast(arg); + event_base_loopexit(base, NULL); +} + +static void signal_cb(evutil_socket_t fd, short event, void *arg) { + + DisconnectPacket disconnect_packet; + session->packet_manager->send_packet(disconnect_packet); + + bufferevent_disable(session->packet_manager->bev, EV_READ); + bufferevent_setcb(session->packet_manager->bev, NULL, close_cb, NULL, arg); +} diff --git a/custom_modules/mqtt_server/mqtt_broker/src/packet.cc b/custom_modules/mqtt_server/mqtt_broker/src/packet.cc new file mode 100644 index 0000000..01deed8 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/packet.cc @@ -0,0 +1,509 @@ +/** + * @file packet.cc + */ + +#include "packet.h" +#include "client_id.h" + +#include + +void Packet::read_fixed_header(PacketDataReader &reader) { + + uint8_t command_header = reader.read_byte(); + type = static_cast(command_header >> 4); + header_flags = command_header & 0x0F; + + size_t remaining_length = reader.read_remaining_length(); + if (remaining_length != reader.get_packet_data().size() - reader.get_offset()) { + throw std::exception(); + } +} + +ConnectPacket::ConnectPacket(const packet_data_t &packet_data) { + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Connect) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } + + protocol_name = reader.read_string(); + protocol_level = reader.read_byte(); + connect_flags = reader.read_byte(); + keep_alive = reader.read_uint16(); + client_id = reader.read_string(); + + if (client_id.empty()) { + client_id = generate_client_id(); + } + + if (will_flag()) { + will_topic = reader.read_string(); + will_message = reader.read_bytes(); + } + + if (username_flag()) { + username = reader.read_string(); + } + + if (password_flag()) { + password = reader.read_bytes(); + } + +} + +packet_data_t ConnectPacket::serialize() const { + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + + size_t remaining_length = 2 + protocol_name.size(); + remaining_length += 1; // protocol_level + remaining_length += 1; // connect_flags + remaining_length += 2; // keep_alive + remaining_length += 2 + client_id.size(); + + if (will_flag()) { + remaining_length += 2 + will_topic.size(); + remaining_length += 2 + will_message.size(); + } + + if (username_flag()) { + remaining_length += 2 + username.size(); + } + + if (password_flag()) { + remaining_length += 2 + password.size(); + } + + writer.write_remaining_length(remaining_length); + writer.write_string(protocol_name); + writer.write_byte(protocol_level); + writer.write_byte(connect_flags); + writer.write_uint16(keep_alive); + writer.write_string(client_id); + + if (will_flag()) { + writer.write_string(will_topic); + writer.write_bytes(will_message); + } + + if (username_flag()) { + writer.write_string(username); + } + + if (password_flag()) { + writer.write_bytes(password); + } + + return packet_data; +} + +ConnackPacket::ConnackPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Connack) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } + + acknowledge_flags = reader.read_byte(); + return_code = static_cast(reader.read_byte()); +} + +packet_data_t ConnackPacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(2); + writer.write_byte(acknowledge_flags); + writer.write_byte(static_cast(return_code)); + return packet_data; +} + +PublishPacket::PublishPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Publish) { + throw std::exception(); + } + + topic_name = reader.read_string(); + + if (qos() != QoSType::QoS0) { + packet_id = reader.read_uint16(); + } + + size_t payload_len = packet_data.size() - reader.get_offset(); + + message_data = reader.read_bytes(payload_len); + +} + +packet_data_t PublishPacket::serialize() const { + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + uint16_t remaining_length = 2 + topic_name.size() + message_data.size(); + if (qos() != QoSType::QoS0) { + remaining_length += 2; + } + writer.write_remaining_length(remaining_length); + writer.write_string(topic_name); + if (qos() != QoSType::QoS0) { + writer.write_uint16(packet_id); + } + for (size_t i = 0; i < message_data.size(); i++) { + writer.write_byte(message_data[i]); + } + + return packet_data; +} + +PubackPacket::PubackPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Puback) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } + + packet_id = reader.read_uint16(); + +} + +packet_data_t PubackPacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(2); + writer.write_uint16(packet_id); + return packet_data; +} + +PubrecPacket::PubrecPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Pubrec) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } + + packet_id = reader.read_uint16(); + +} + +packet_data_t PubrecPacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(2); + writer.write_uint16(packet_id); + return packet_data; +} + +PubrelPacket::PubrelPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Pubrel) { + throw std::exception(); + } + + if (header_flags != 0x02) { + throw std::exception(); + } + + packet_id = reader.read_uint16(); + +} + +packet_data_t PubrelPacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(2); + writer.write_uint16(packet_id); + return packet_data; +} + +PubcompPacket::PubcompPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Pubcomp) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } + + packet_id = reader.read_uint16(); + +} + +packet_data_t PubcompPacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(2); + writer.write_uint16(packet_id); + return packet_data; +} + +SubscribePacket::SubscribePacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Subscribe) { + throw std::exception(); + } + + if (header_flags != 0x02) { + throw std::exception(); + } + + packet_id = reader.read_uint16(); + + do { + std::string topic = reader.read_string(); + QoSType qos = static_cast(reader.read_byte()); + // TODO use emplace_back + subscriptions.push_back(Subscription{topic, qos}); + } while (!reader.empty()); +} + +packet_data_t SubscribePacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + + size_t remaining_length = 2; + for (auto subscription : subscriptions) { + remaining_length += 1 + 2 + std::string(subscription.topic_filter).size(); + } + + writer.write_remaining_length(remaining_length); + writer.write_uint16(packet_id); + + for (auto subscription : subscriptions) { + writer.write_string(std::string(subscription.topic_filter)); + writer.write_byte(static_cast(subscription.qos)); + } + + return packet_data; + +} + +SubackPacket::SubackPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Suback) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } + + packet_id = reader.read_uint16(); + + do { + ReturnCode return_code = static_cast(reader.read_byte()); + return_codes.push_back(return_code); + } while (!reader.empty()); +} + +packet_data_t SubackPacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(2 + return_codes.size()); + writer.write_uint16(packet_id); + for (auto return_code : return_codes) { + writer.write_byte(static_cast(return_code)); + } + return packet_data; +} + +UnsubscribePacket::UnsubscribePacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Unsubscribe) { + throw std::exception(); + } + + if (header_flags != 0x02) { + throw std::exception(); + } + + packet_id = reader.read_uint16(); + + do { + topics.push_back(reader.read_string()); + } while (!reader.empty()); +} + +packet_data_t UnsubscribePacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + size_t topics_size = 0; + for (auto topic : topics) { + // string data + 2 byte length + topics_size += topic.size() + 2; + } + writer.write_remaining_length(2 + topics_size); + writer.write_uint16(packet_id); + for (auto topic : topics) { + writer.write_string(topic); + } + return packet_data; +} + +UnsubackPacket::UnsubackPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Unsuback) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } + + packet_id = reader.read_uint16(); +} + +packet_data_t UnsubackPacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(2); + writer.write_uint16(packet_id); + return packet_data; +} + +PingreqPacket::PingreqPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Pingreq) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } +} + +packet_data_t PingreqPacket::serialize() const { + + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(0); + return packet_data; +} + +PingrespPacket::PingrespPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Pingresp) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } +} + +packet_data_t PingrespPacket::serialize() const { + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(0); + return packet_data; +} + +DisconnectPacket::DisconnectPacket(const packet_data_t &packet_data) { + + PacketDataReader reader(packet_data); + + read_fixed_header(reader); + + if (type != PacketType::Disconnect) { + throw std::exception(); + } + + if (header_flags != 0) { + throw std::exception(); + } + +} + +packet_data_t DisconnectPacket::serialize() const { + packet_data_t packet_data; + PacketDataWriter writer(packet_data); + writer.write_byte((static_cast(type) << 4) | (header_flags & 0x0F)); + writer.write_remaining_length(0); + return packet_data; +} diff --git a/custom_modules/mqtt_server/mqtt_broker/src/packet.h b/custom_modules/mqtt_server/mqtt_broker/src/packet.h new file mode 100644 index 0000000..ab9335c --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/packet.h @@ -0,0 +1,503 @@ +/** + * @file packet.h + * + * Standard control packet classes. + * + * The MQTT 3.1.1 standard specifies the wire-level structure and operational behavior protocol control packets. This + * structure and some low level behavior is implemented here. + * + * Serialization of a control packet instance to wire format is accomplisted through instance serialization methods. + * + * Deserialization from the wire level is handled by a control packet constructor that accepts a octect sequence. + * + * Control packet instances also provide a default constructor that will create an instance using default values. + */ + +#pragma once + +#include "packet_data.h" +#include "topic.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/** + * Enumeration constants for packet types. + * + * The interger values correspond to control packet type values as defined in the MQTT 3.1.1 standard. + */ +enum class PacketType { + Connect = 1, + Connack = 2, + Publish = 3, + Puback = 4, + Pubrec = 5, + Pubrel = 6, + Pubcomp = 7, + Subscribe = 8, + Suback = 9, + Unsubscribe = 10, + Unsuback = 11, + Pingreq = 12, + Pingresp = 13, + Disconnect = 14, +}; + +/** + * Enumeration constants for QoS values. + */ +enum class QoSType : uint8_t { + QoS0 = 0, + QoS1 = 1, + QoS2 = 2, +}; + +/** + * Subscription Class + * + * A subscription is composed of a TopicFilter and a QoS. Matching rules for topic filters differ from topic + * names. + */ +class Subscription { +public: + TopicFilter topic_filter; + QoSType qos; +}; + +/** + * Abstract base control packet class. + * + * Packet classes inherit this and extend as necessary. The serialize method implementation is required. + */ +class Packet { +public: + PacketType type; + uint8_t header_flags; + + virtual ~Packet() {} + + void read_fixed_header(PacketDataReader &); + + // static Packet unserialize(const packet_data_t &); + virtual packet_data_t serialize(void) const = 0; + +}; + +/** + * Connect control packet class + */ +class ConnectPacket : public Packet { +public: + + ConnectPacket() { + type = PacketType::Connect; + header_flags = 0; + protocol_name = "MQIsdp"; + protocol_level = 4; + } + + ConnectPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + std::string protocol_name; + uint8_t protocol_level; + uint8_t connect_flags; + uint16_t keep_alive; + std::string client_id; + std::string will_topic; + std::vector will_message; + std::string username; + std::vector password; + + bool clean_session() const { + return connect_flags & 0x02; + } + + void clean_session(bool set) { + if (set) { + connect_flags |= 0x02; + } else { + connect_flags &= ~0x02; + } + } + + bool will_flag() const { + return connect_flags & 0x04; + } + + void will_flag(bool set) { + if (set) { + connect_flags |= 0x04; + } else { + connect_flags &= ~0x04; + } + } + + QoSType qos() const { + return static_cast((connect_flags >> 3) & 0x03); + } + + void qos(QoSType qos) { + connect_flags |= (static_cast(qos) << 3); + } + + bool will_retain() const { + return connect_flags & 0x20; + } + + void will_retain(bool set) { + if (set) { + connect_flags |= 0x20; + } else { + connect_flags &= ~0x20; + } + } + + bool password_flag() const { + return connect_flags & 0x40; + } + + void password_flag(bool set) { + if (set) { + connect_flags |= 0x40; + } else { + connect_flags &= ~0x40; + } + } + + bool username_flag() const { + return connect_flags & 0x80; + } + + void username_flag(bool set) { + if (set) { + connect_flags |= 0x80; + } else { + connect_flags &= ~0x80; + } + } + +}; + +/** + * Connack control packet class. + */ +class ConnackPacket : public Packet { +public: + + ConnackPacket() { + type = PacketType::Connack; + header_flags = 0; + acknowledge_flags = 0; + } + + ConnackPacket(const packet_data_t &packet_data); + + enum class ReturnCode : uint8_t { + Accepted = 0x00, + UnacceptableProtocolVersion = 0x01, + IdentifierRejected = 0x02, + ServerUnavailable = 0x03, + BadUsernameOrPassword = 0x04, + NotAuthorized = 0x05 + }; + + packet_data_t serialize() const; + + uint8_t acknowledge_flags; + ReturnCode return_code; + + bool session_present() const { + return acknowledge_flags & 0x01; + } + + void session_present(bool set) { + if (set) { + acknowledge_flags |= 0x01; + } else { + acknowledge_flags &= ~0x01; + } + } + +}; + +/** + * Publish control packet class. + */ +class PublishPacket : public Packet { +public: + + PublishPacket() { + type = PacketType::Publish; + header_flags = 0; + } + + PublishPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + std::string topic_name; + std::vector message_data; + uint16_t packet_id; + + bool dup() const { + return header_flags & 0x08; + } + + void dup(bool set) { + if (set) { + header_flags |= 0x08; + } else { + header_flags &= ~0x08; + } + } + + QoSType qos() const { + return static_cast((header_flags >> 1) & 0x03); + } + + void qos(QoSType qos) { + header_flags |= static_cast(qos) << 1; + } + + bool retain() const { + return header_flags & 0x01; + } + + void retain(bool set) { + if (set) { + header_flags |= 0x01; + } else { + header_flags &= ~0x01; + } + } +}; + +/** + * Puback control packet class. + */ +class PubackPacket : public Packet { + +public: + + PubackPacket() { + type = PacketType::Puback; + header_flags = 0; + } + + PubackPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + uint16_t packet_id; +}; + +/** + * Pubrec control packet class. + */ +class PubrecPacket : public Packet { + +public: + + PubrecPacket() { + type = PacketType::Pubrec; + header_flags = 0; + } + + PubrecPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + uint16_t packet_id; +}; + +/** + * Pubrel control packet class. + */ +class PubrelPacket : public Packet { + +public: + + PubrelPacket() { + type = PacketType::Pubrel; + header_flags = 0x02; + } + + PubrelPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + uint16_t packet_id; +}; + +/** + * Pubcomp control packet class. + */ +class PubcompPacket : public Packet { + +public: + + PubcompPacket() { + type = PacketType::Pubcomp; + header_flags = 0; + } + + PubcompPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + uint16_t packet_id; +}; + +/** + * Subscribe control packet class. + */ +class SubscribePacket : public Packet { + +public: + + SubscribePacket() { + type = PacketType::Subscribe; + header_flags = 0x02; + } + + SubscribePacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + uint16_t packet_id; + + std::vector subscriptions; + +}; + +/** + * Suback control packet class. + */ +class SubackPacket : public Packet { + +public: + + SubackPacket() { + type = PacketType::Suback; + header_flags = 0; + } + + SubackPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + enum class ReturnCode : uint8_t { + SuccessQoS0 = 0x00, + SuccessQoS1 = 0x01, + SuccessQoS2 = 0x02, + Failure = 0x80 + }; + + uint16_t packet_id; + std::vector return_codes; + +}; + +/** + * Unsubscribe control packet class. + */ +class UnsubscribePacket : public Packet { + +public: + + UnsubscribePacket() { + type = PacketType::Unsubscribe; + header_flags = 0x02; + } + + UnsubscribePacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + uint16_t packet_id; + + std::vector topics; + +}; + +/** + * Unsuback control packet class. + */ +class UnsubackPacket : public Packet { + +public: + + UnsubackPacket() { + type = PacketType::Unsuback; + header_flags = 0; + } + + UnsubackPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; + + uint16_t packet_id; + +}; + +/** + * Pingreq control packet class. + */ +class PingreqPacket : public Packet { + +public: + + PingreqPacket() { + type = PacketType::Pingreq; + header_flags = 0; + } + + PingreqPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; +}; + +/** + * Pingresp control packet class. + */ +class PingrespPacket : public Packet { + +public: + + PingrespPacket() { + type = PacketType::Pingresp; + header_flags = 0; + } + + PingrespPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; +}; + +/** + * Disconnect control packet class. + */ +class DisconnectPacket : public Packet { + +public: + + DisconnectPacket() { + type = PacketType::Disconnect; + header_flags = 0; + } + + DisconnectPacket(const packet_data_t &packet_data); + + packet_data_t serialize() const; +}; + diff --git a/custom_modules/mqtt_server/mqtt_broker/src/packet_data.cc b/custom_modules/mqtt_server/mqtt_broker/src/packet_data.cc new file mode 100644 index 0000000..0c9d738 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/packet_data.cc @@ -0,0 +1,130 @@ +/** + * @file packet_data.cc + */ + +#include "packet_data.h" + +#include + +void PacketDataWriter::write_remaining_length(size_t length) { + + if (length > 127 + 128*127 + 128*128*127 + 128*128*128*127) { + throw std::exception(); + } + + do { + uint8_t encoded_byte = length % 0x80; + length >>= 7; + if (length > 0) { + encoded_byte |= 0x80; + } + packet_data.push_back(encoded_byte); + } while (length > 0); +} + +void PacketDataWriter::write_byte(uint8_t byte) { + packet_data.push_back(byte); +} + +void PacketDataWriter::write_uint16(uint16_t word) { + packet_data.push_back((word >> 8) & 0xFF); + packet_data.push_back(word & 0xFF); +} + +void PacketDataWriter::write_string(const std::string &s) { + write_uint16(s.size()); + std::copy(s.begin(), s.end(), std::back_inserter(packet_data)); +} + +void PacketDataWriter::write_bytes(const packet_data_t & b) { + write_uint16(b.size()); + std::copy(b.begin(), b.end(), std::back_inserter(packet_data)); +} + +bool PacketDataReader::has_remaining_length() { + + size_t remaining = std::min(packet_data.size() - offset, 4); + + for (size_t i=offset; i packet_data.size()) { + throw std::exception(); + } + return packet_data[offset++]; +} + + +uint16_t PacketDataReader::read_uint16() { + if (offset + 2 > packet_data.size()) { + throw std::exception(); + } + uint8_t msb = packet_data[offset++]; + uint8_t lsb = packet_data[offset++]; + return (msb << 8) + lsb; +} + +std::string PacketDataReader::read_string() { + uint16_t len = read_uint16(); + if (offset + len > packet_data.size()) { + throw std::exception(); + } + std::string s(&packet_data[offset], &packet_data[offset + len]); + offset += len; + return s; +} + +std::vector PacketDataReader::read_bytes() { + uint16_t len = read_uint16(); + if (offset + len > packet_data.size()) { + throw std::exception(); + } + std::vector v(&packet_data[offset], &packet_data[offset + len]); + offset += len; + return v; +} + +std::vector PacketDataReader::read_bytes(size_t len) { + if (offset + len > packet_data.size()) { + throw std::exception(); + } + std::vector v(&packet_data[offset], &packet_data[offset + len]); + offset += len; + return v; +} + +bool PacketDataReader::empty() { + return offset == packet_data.size(); +} diff --git a/custom_modules/mqtt_server/mqtt_broker/src/packet_data.h b/custom_modules/mqtt_server/mqtt_broker/src/packet_data.h new file mode 100644 index 0000000..c98f218 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/packet_data.h @@ -0,0 +1,171 @@ +/** + * @file packet_data.h + * + * Utility classes supporting serialization/deserialization of MQTT control packets. + */ + +#pragma once + +#include +#include +#include +#include + +/** Typedef for packet data container. */ +typedef std::vector packet_data_t; + +/** + * Serialization class. + * + * Methods are provided to write native types to the MQTT 3.1.1 standard wire format. + */ +class PacketDataWriter +{ +public: + + /** + * Constructor + * + * Accepts a reference to a packet_data_t container. This container will be filled with serialized data and + * can be sent directly through the network connection. + * + * @param packet_data A reference to a packet_data_t container. + */ + PacketDataWriter(packet_data_t & packet_data) : packet_data(packet_data) { + packet_data.resize(0); + } + + /** + * Write the integer length to the container using the MQTT 3.1.1 remaining length encoding scheme. + * + * @param length The value to encode. + */ + void write_remaining_length(size_t length); + + /** Write a byte to the packet_data_t container. */ + void write_byte(uint8_t byte); + + /** Write a 16 bit value to the packet_data_t container. */ + void write_uint16(uint16_t word); + + /** Write a UTF-8 character string to the packet_data_t container. */ + void write_string(const std::string & s); + + /** Copy the contents of a packet_data_t container into this instance's container. */ + void write_bytes(const packet_data_t & b); + +private: + + /** A reference to the packet_data_t container. */ + packet_data_t & packet_data; +}; + +/** + * Deserialization class. + * + * Methods are provided to read native types from the wire encoded control packets received over the network + * connection. MQTT 3.1.1 standard decoding methods are implemented. + */ +class PacketDataReader +{ + +public: + + /** + * Constructor + * + * Accepts a reference to a packet_data_t container that contains data received directly over a network connection. + * The class also contains a current offset pointer that is initialized to point to the beginning of the container. + * Each data read will advance the offset pointer forward to the next item in the container. + * + * @param packet_data A reference to a packet_data_t container. + */ + PacketDataReader(const packet_data_t & packet_data) : offset(0), packet_data(packet_data) {} + + /** + * Is a remaing lenght value present. + * + * Primitive function indicating a valid remaining_length value can be read from the current position in the + * packet_data_t container. The remaining length value is encoded in a variable sequence from 1 to 4 bytes. + * + * @return valid remaining length. + */ + bool has_remaining_length(); + + /** + * Read the remaining length value from the packet_data_t container. + * + * @return integer. + */ + size_t read_remaining_length(); + + /** + * Read a single byte from the packet_data_t container. + * + * @return byte. + */ + uint8_t read_byte(); + + /** + * Read a 16 bit value from the packet_data_t container. + * + * @return 16 bit integer. + */ + uint16_t read_uint16(); + + /** + * Read a UTF-8 encoded string from the packet_data_t container. + * + * @return character string. + */ + std::string read_string(); + + /** + * Read a byte sequence from the packet_data_t container. + * + * The sequence is assumed to be encoded according to the MQTT 3.1.1 standard wire format for a byte sequence. + * The sequence length is encoded along with the data. + * + * @return byte seqence. + */ + std::vector read_bytes(); + + /** + * Read a byte sequence from the packet_data_t contianer. + * + * The number of bytes read is passed as an argument to the method. + * + * @param len Lenght of the sequence to read. + * @return Byte sequence + */ + std::vector read_bytes(size_t len); + + /** + * Is the packet_data_t container empty. + * + * @return empty. + */ + bool empty(); + + /** + * Return the current packet_data_t container offset pointer. + * + * @return integer. + */ + size_t get_offset() { return offset; } + + /** + * Get a reference to the packet_data_t container. + * + * @return Reference to packet_data_t container. + */ + const packet_data_t & get_packet_data() { return packet_data; } + +private: + + /** Current packet_data_t container offset pointer */ + size_t offset; + + /** Packet data container. */ + const packet_data_t & packet_data; +}; diff --git a/custom_modules/mqtt_server/mqtt_broker/src/packet_manager.cc b/custom_modules/mqtt_server/mqtt_broker/src/packet_manager.cc new file mode 100644 index 0000000..5003a6a --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/packet_manager.cc @@ -0,0 +1,161 @@ +/** + * @file packet_manager.cc + */ + +#include "packet_manager.h" +#include "packet.h" + +#include +#include + +#include + +void PacketManager::receive_packet_data() { + + struct evbuffer *input = bufferevent_get_input(bev); + + while (evbuffer_get_length(input) != 0) { + + size_t available = evbuffer_get_length(input); + + if (available < 2) { + return; + } + + if (fixed_header_length == 0) { + + size_t peek_size = std::min(static_cast(available), 5); + + std::vector peek_buffer(peek_size); + evbuffer_copyout(input, &peek_buffer[0], peek_size); + + PacketDataReader reader(peek_buffer); + reader.read_byte(); + if (!reader.has_remaining_length()) { + if (peek_size == 5) { + if (event_handler) { + event_handler(EventType::ProtocolError); + } + evbuffer_drain(input, peek_size); + } + return; + } + + remaining_length = reader.read_remaining_length(); + fixed_header_length = reader.get_offset(); + + } + + size_t packet_size = fixed_header_length + remaining_length; + + if (available < packet_size) { + return; + } + + packet_data_t packet_data(packet_size); + evbuffer_remove(input, &packet_data[0], packet_size); + + fixed_header_length = 0; + remaining_length = 0; + + std::unique_ptr packet = parse_packet_data(packet_data); + + if (packet && packet_received_handler) { + packet_received_handler(std::move(packet)); + } + } +} + +std::unique_ptr PacketManager::parse_packet_data(const std::vector &packet_data) { + + PacketType type = static_cast(packet_data[0] >> 4); + + std::unique_ptr packet; + + try { + switch (type) { + case PacketType::Connect: + packet = std::unique_ptr(new ConnectPacket(packet_data)); + break; + case PacketType::Connack: + packet = std::unique_ptr(new ConnackPacket(packet_data)); + break; + case PacketType::Publish: + packet = std::unique_ptr(new PublishPacket(packet_data)); + break; + case PacketType::Puback: + packet = std::unique_ptr(new PubackPacket(packet_data)); + break; + case PacketType::Pubrec: + packet = std::unique_ptr(new PubrecPacket(packet_data)); + break; + case PacketType::Pubrel: + packet = std::unique_ptr(new PubrelPacket(packet_data)); + break; + case PacketType::Pubcomp: + packet = std::unique_ptr(new PubcompPacket(packet_data)); + break; + case PacketType::Subscribe: + packet = std::unique_ptr(new SubscribePacket(packet_data)); + break; + case PacketType::Suback: + packet = std::unique_ptr(new SubackPacket(packet_data)); + break; + case PacketType::Unsubscribe: + packet = std::unique_ptr(new UnsubscribePacket(packet_data)); + break; + case PacketType::Unsuback: + packet = std::unique_ptr(new UnsubackPacket(packet_data)); + break; + case PacketType::Pingreq: + packet = std::unique_ptr(new PingreqPacket(packet_data)); + break; + case PacketType::Pingresp: + packet = std::unique_ptr(new PingrespPacket(packet_data)); + break; + case PacketType::Disconnect: + packet = std::unique_ptr(new DisconnectPacket(packet_data)); + break; + } + } catch (std::exception &e) { + if (event_handler) { + event_handler(EventType::ProtocolError); + } + } + return packet; +} + +void PacketManager::send_packet(const Packet &packet) { + std::vector packet_data = packet.serialize(); + if (bev) { + bufferevent_write(bev, &packet_data[0], packet_data.size()); + } else { + std::cout << "not writing to closed bev\n"; + } +} + +void PacketManager::close_connection() { + if (bev) { + evutil_socket_t fd = bufferevent_getfd(bev); + evutil_closesocket(fd); + bufferevent_free(bev); + bev = nullptr; + } +} + +void PacketManager::handle_events(short events) { + + if (events & BEV_EVENT_EOF) { + if (event_handler) { + event_handler(EventType::ConnectionClosed); + } + } else if (events & BEV_EVENT_ERROR) { + if (event_handler) { + event_handler(EventType::NetworkError); + } + } else if (events & BEV_EVENT_TIMEOUT) { + if (event_handler) { + event_handler(EventType::Timeout); + } + } +} diff --git a/custom_modules/mqtt_server/mqtt_broker/src/packet_manager.h b/custom_modules/mqtt_server/mqtt_broker/src/packet_manager.h new file mode 100644 index 0000000..eb6a482 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/packet_manager.h @@ -0,0 +1,225 @@ +/** + * @file packet_manager.h + * + * Manage low level network communications. + * + * The PacketManager is responsible for sending and receiving MQTT control packets across the network connection. A + * PacketManager instance is installed into every BaseSession and can be moved between sessions to implement + * session persistance. + * + * MQTT control packets received by the PacketManager and network events are forwared to containing sessions through + * callbacks. Session instances control the packet manager by invoking its methods directly. + */ + +#pragma once + +#include "packet.h" + +#include +#include + +#include +#include +#include +#include + +/** + * PacketManager class. + * + * Manage low level network operations and invoke callbacks on MQTT control packet reception or network event. + */ +class PacketManager { +public: + + /** + * Enumeration constants for PacketManager events. + * + * Events are low level network events or unrecoverable protocol errors. + * + */ + enum class EventType { + NetworkError, + ProtocolError, + ConnectionClosed, + Timeout, + }; + + /** + * Constructor + * + * The PacketManager constructor accepts a pointer to a libevent bufferevent internal structure. Callbacks are + * installed for network data received and network events. A pointer to this PacketManager instance is passed + * as the user data argument. It will be used to invoke instance methods from the static callback wrapper. + * + * @param bev Pointer to a bufferevent control structure. + */ + PacketManager(struct bufferevent *bev) : bev(bev) { + bufferevent_setcb(bev, input_ready, NULL, network_event, this); + bufferevent_enable(bev, EV_READ); + } + + /** + * Destructor + * + * Will free the bufferevent pointer. This call should also close any underlying socket connection provided + * the libevent flag LEV_OPT_CLOSE_ON_FREE was used to create the bufferevent. + */ + ~PacketManager() { + if (bev) { + bufferevent_free(bev); + bev = nullptr; + } + } + + /** + * Send a control packet through the network connection. + * + * This method is invoked by containing session instances when they want to send a control packet. The packet + * will be serialized and transmitted provided the underlying socket connection is not closed. + */ + void send_packet(const Packet &); + + /** + * Close the network connection. + * + * Explicitly close the network connection maintained by the bufferevent. This connection should also be closed + * when the destructor for this instance is run provided the bufferevent was created with the LEV_OPT_CLOSE_ON_FREE + * flag. + */ + void close_connection(); + + /** + * Set the packet received callback. + * + * This callback will be invoked when a packet is received from the network and deserialized. The callback will + * assume ownership of the packet memory. A pointer to the base packet type is passed and the actual packet can + * be recovered through a dynamic_cast<>(). + * + * @param handler Callback function. + */ + void set_packet_received_handler(std::function)> handler) { + packet_received_handler = handler; + } + + /** + * Set the network event callback. + * + * This callback will be invoked when a low level network or protocol error is detected. The type of event is + * indicated by the an EventType enumeration constant passed as an argument to the callback. + * + * @param handler Callback function. + */ + void set_event_handler(std::function handler) { + event_handler = handler; + } + + /** + * Return the next available packet id in sequence. + * + * @return Next packet id. + */ + uint16_t next_packet_id() { + + if (++packet_id == 0) { + ++packet_id; + } + return packet_id; + } + + /** + * Pointer to the contained libevent bufferevent internal control structure. + */ + struct bufferevent *bev; + +private: + + /** + * Data receiving method. + * + * This instance method is invoked from the static input_ready callback wrapper. It is run asynchronously + * whenever data is received from the network connection. The data will be buffered inside the bufferevent control + * structure until a complete control packet is received. At that point the packet will be deserialized and + * passed to any installed packet_received_handler callback. + */ + void receive_packet_data(); + + /** + * Libevent callback wrapper. + * + * Static method invoked by libevent C library. The callback method will be passed a pointer to a bufferevent + * control structure. This should be the same pointer that was originally passed to the PacketManager constructor. + * The method will also receive a pointer to the containing PacketManager instance which will be used to invoke the + * receive_packet_data instance method. + * + * @param bev Pointer to a bufferevent + * @param arg Pointer to user data installed with the callback. In this case it is a pointer to the containing + * PacketManager instance. + */ + static void input_ready(struct bufferevent *bev, void *arg) { + PacketManager *_this = static_cast(arg); + _this->receive_packet_data(); + } + + /** + * Network event callback. + * + * This instance method is invoked from the static network_event callback wrapper. It will be passed a set of + * flags indicating the type of network event that caused the invocation. The method will then deletegate to any + * installed event_handler callback passing the event type as the an EventType argument. + * + * @param events + */ + void handle_events(short events); + + /** + * Libevent callback wrapper. + * + * The callback method will be passed a pointer to a bufferevent control structure. This should be the same + * pointer that was originally passed to the PacketManager constructor. The method will also receive a pointer + * to the containing PacketManager instance which will be used to invoke the handle_events instance method. + * + * @param bev Pointer to a bufferevent control structure. + * @param events Flags indicating the type of event that caused the callback to be invoked. + * @param arg Pointer to the containing PacketManager instance, installed along with the callback wrapper. + */ + static void network_event(struct bufferevent *bev, short events, void *arg) { + PacketManager *_this = static_cast(arg); + _this->handle_events(events); + } + + /** + * Packet deserialization method. + * + * This method will receive a packet_data_t container when the receive_packet_data method has determined + * that data for a complete packet has been received. The packet will be deserialized and a reference counted + * pointer to the instantiated packet will be returned. + * + * @param packet_data Reference to a packet_data_t container. + * @return Reference counted pointer to Packet. + */ + std::unique_ptr parse_packet_data(const packet_data_t &packet_data); + + /** + * Packet received callback. + * + * Callback installed to be invoked by this PacketManager when an MQTT control packet is received from the network. + */ + std::function)> packet_received_handler; + + /** + * Network event callback. + * + * Callback installed to be invoked by this PacketManager when a low level network or protocol error is detected. + */ + std::function event_handler; + + /** Packet id counter. */ + uint16_t packet_id = 0; + + /** State variable used to determine when data for a complete control packet is available. */ + size_t fixed_header_length = 0; + + /** State variable used to determine when data for a complete control packet is available. */ + size_t remaining_length = 0; + +}; \ No newline at end of file diff --git a/custom_modules/mqtt_server/mqtt_broker/src/session_manager.cc b/custom_modules/mqtt_server/mqtt_broker/src/session_manager.cc new file mode 100644 index 0000000..7853328 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/session_manager.cc @@ -0,0 +1,57 @@ +/** + * @file session_manager.cc + */ + +#include "session_manager.h" +#include "broker_session.h" +#include "topic.h" + +#include +#include + +void SessionManager::accept_connection(struct bufferevent *bev) { + + auto session = std::unique_ptr(new BrokerSession(bev, *this)); + sessions.push_back(std::move(session)); +} + +std::list >::iterator SessionManager::find_session(const std::string &client_id) { + + return find_if(sessions.begin(), sessions.end(), [&client_id](const std::unique_ptr &s) { + return (!s->client_id.empty() and (s->client_id == client_id)); + }); +} + +void SessionManager::erase_session(const std::string &client_id) { + sessions.erase(std::remove_if(sessions.begin(), sessions.end(), [&client_id](std::unique_ptr &s) { + return (!s->client_id.empty() and (s->client_id == client_id)); + }), + sessions.end()); +} + +void SessionManager::erase_session(const BrokerSession *session) { + sessions.erase(std::remove_if(sessions.begin(), sessions.end(), [session](std::unique_ptr &s) { + return s.get() == session; + }), + sessions.end()); +} + +void SessionManager::handle_publish(const PublishPacket &packet) { + for (auto &session : sessions) { + for (auto &subscription : session->subscriptions) { + if (topic_match(subscription.topic_filter, TopicName(packet.topic_name))) { + session->forward_packet(packet); + } + } + } +} + +void SessionManager::handle_local_publish(const std::string &client_id, const PublishPacket &packet) { + for (size_t i = 0; i < local_sessions.size(); ++i) { + LocalSession &l = local_sessions[i]; + + if (topic_match(l.filter, TopicName(packet.topic_name))) { + l.func(client_id, packet.message_data, l.obj); + } + } +} \ No newline at end of file diff --git a/custom_modules/mqtt_server/mqtt_broker/src/session_manager.h b/custom_modules/mqtt_server/mqtt_broker/src/session_manager.h new file mode 100644 index 0000000..5cc1653 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/session_manager.h @@ -0,0 +1,104 @@ +/** + * @file session_manager.h + * + * Manage BrokerSessions. + * + * The SessionManager maintains a contaier of all sessions in a broker. BrokerConnects are created in the session + * manager when a network session is accepted the new session is added to the sessions container. The session is then + * responsible for managing the MQTT protocol. The MQTT 3.1.1 standard requires that sessions + * can persist after a client disconnects and that any subscribe QoS 1 and Qo2 messages published while disconnected be + * delivered on reconnection. + * + * The SessionManager is responsible for forwarding published messages to all subscribing clients. + */ + +#pragma once + +#include +#include +#include +#include + +struct bufferevent; + +class BrokerSession; +class PublishPacket; + +/** + * SessionManager class + * + * Composes a container of broker sessions and methods to manage them. + */ +class SessionManager { +public: + /** + * Accept a new network connection. + * + * Creates a new BrokerSession instance and adds it to the container of sessions. The session instance will manage + * the MQTT protocol. + * + * @param bev Pointer to a bufferevent + */ + void accept_connection(struct bufferevent *bev); + + /** + * Find a session in the session container. + * + * @param client_id Unique client id to find. + * @return Iterator to BrokerSession. + */ + std::list >::iterator find_session(const std::string &client_id); + + /** + * Delete a session + * + * Given a pointer to a BrokerSession, finds that session in the session container and removes it from the + * container. The session instance will be deleted. + * + * @param session Pointer to a BrokerSession; + */ + void erase_session(const BrokerSession *session); + + /** + * Finds a session in the session container with the given client id. If found the session is removed from the + * container. The session instance will be deleted. + * + * @param client_id A Client id. + */ + void erase_session(const std::string &client_id); + + /** + * Forward a message to subsribed clients. + * + * Searches through each session and their subscriptions and invokes the forward_packet method on each session + * instance with a matching subscribed TopicFilter. The session will be responsible for Managing the MQTT publish + * protocol and correctly delivering the message to its subscribed client + * + * @param publish_packet Reference to a PublishPacket; + */ + void handle_publish(const PublishPacket &publish_packet); + + void handle_local_publish(const std::string &client_id, const PublishPacket &packet); + + /** Container of BrokerSessions. */ + std::list > sessions; + +public: + void add_local_session(const std::string &filter, void (*func)(const std::string &client_id, const std::vector &data, void *obj), void *obj) { + LocalSession l; + + l.filter = filter; + l.func = func; + l.obj = obj; + + local_sessions.push_back(l); + } + + struct LocalSession { + std::string filter; + void (*func)(const std::string &client_id, const std::vector &data, void *obj); + void *obj; + }; + + std::vector local_sessions; +}; \ No newline at end of file diff --git a/custom_modules/mqtt_server/mqtt_broker/src/topic.cc b/custom_modules/mqtt_server/mqtt_broker/src/topic.cc new file mode 100644 index 0000000..ec7c718 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/topic.cc @@ -0,0 +1,131 @@ +/** + * @file topic.cc + */ + +#include "topic.h" + +#include + +TopicName::TopicName(const std::string & s) { + if (!is_valid(s)) { + throw std::exception(); + } + + name = s; +} + +bool TopicName::is_valid(const std::string &s) const { + if (s.size() > MaxNameSize) { + return false; + } + + if ((s.find('+') == std::string::npos) and (s.find('#') == std::string::npos)) { + return true; + } + + return false; +} + +TopicFilter::TopicFilter(const std::string &s) { + if (!is_valid(s)) { + throw std::exception(); + } + + filter = s; +} + +bool TopicFilter::is_valid(const std::string &s) const { + + if (s.size() > MaxFilterSize) { + return false; + } + + size_t pos = 0; + + for (char c : s) { + if (c == '+') { + if ((pos != 0 and s[pos - 1] != '/') or (pos + 1 != s.size() and s[pos + 1] != '/')) { + return false; + } + } else if (c == '#') { + if ((pos != 0 and s[pos - 1] != '/') or (pos + 1 != s.size())) { + return false; + } + } + pos++; + } + + return true; +} + +bool topic_match(const TopicFilter &filter, const TopicName &name) { + + const std::string &f = filter.filter; + const std::string &n = name.name; + + // empty strings don't match + if (f.empty() or n.empty()) { + return false; + } + + size_t fpos = 0; + size_t npos = 0; + + // Cannot match $ with wildcard + if ((f[fpos] == '$' and n[npos] != '$') or (f[fpos] != '$' and n[npos] == '$')) { + return false; + } + + while (fpos < f.size() and npos < n.size()) { + + // filter and topic name match at the current position + if (f[fpos] == n[npos]) { + + // last character in the topic name + if (npos == n.size() - 1) { + + // at the end of the topic name and the filter has a separator followed by a multi-level wildcard, + // causing a parent level match. + if ((fpos == f.size() - 3) and (f[fpos + 1] == '/') and (f[fpos + 2] == '#')) { + return true; + } + } + + fpos++; + npos++; + + // at the end of both the filter and topic name, match + if ((fpos == f.size()) && (npos == n.size())) { + return true; + + // at the end of the topic name and the next character in the filter is wildcard. + } else if ((npos == n.size()) and (fpos == f.size() - 1) and (f[fpos] == '+')) { + return true; + } + + } else { + + if (f[fpos] == '+') { + fpos++; + while ((npos < n.size()) and (n[npos] != '/')) { + npos++; + } + if ((npos == n.size()) and (fpos == f.size())) { + return true; + } + } else if (f[fpos] == '#') { + return true; + } else { + return false; + } + } + } + + return false; +} + +bool topic_match(const TopicFilter &filter1, const TopicFilter &filter2) { + + return filter1.filter == filter2.filter; + +} \ No newline at end of file diff --git a/custom_modules/mqtt_server/mqtt_broker/src/topic.h b/custom_modules/mqtt_server/mqtt_broker/src/topic.h new file mode 100644 index 0000000..601e1ba --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_broker/src/topic.h @@ -0,0 +1,141 @@ +/** + * @file topic.h + * + * Classes for managing topic names and topic filters. + * + * The MQTT 3.1.1 standard allows structured topic names. It also defines rules for matching these names and provides + * wildcard characters to enhance matching rules. + */ + +#pragma once + +#include + +class TopicFilter; + +/** + * Topic Name + * + * Topic names are UTF-8 encoded character strings. The have a structure imposed by the MQTT 3.1.1 standard. This + * class enforces that structure. Topic names differe from topic filters in that topic filters allow wildcard + * characters. + * + * This class friends the topic_match function. + */ +class TopicName { +public: + + /** Maximum lenght of a topic name according the the MQTT 3.1.1 standard. */ + const static size_t MaxNameSize = 65535; + + /** + * Constructor + * + * The string will be validated against the MQTT topic name rules. An exception will be thrown if the name is + * invalid. + * + * @param name A reference to a the topic name string. + */ + TopicName(const std::string & name); + + /** + * Validate the topic name against the MQTT 3.1.1 standard rules. + * + * @param name A name string. + * @return Topic name is valid. + */ + bool is_valid(const std::string & name) const; + + /** + * Cast an instance of this class to a std::string. + * + * @return std::string + */ + operator std::string() const {return name;} + + /** Matching friend function. */ + friend bool topic_match(const TopicFilter &, const TopicName &); + +private: + + /** The name character string. */ + std::string name; +}; + +/** + * Topic Filter + * + * Topic filters are composed of UTF-8 encoded character strings. The have a structure imposed by the MQTT 3.1.1 + * standard including wildcard characters. This class enforces that structure. + * + * This class friends the topic_match function. + */ +class TopicFilter { +public: + + /** Maximum lenght of a topic filter according the the MQTT 3.1.1 standard. */ + const static size_t MaxFilterSize = 65535; + + /** + * Constructor + * + * The string will be validated against the MQTT topic filter rules. An exception will be thrown if the filter is + * invalid. + * + * @param filter A reference to a the topic filter string. + */ + TopicFilter(const std::string & filter); + + /** + * Validate the topic filter against the MQTT 3.1.1 standard rules. + * + * @param filter A filter string. + * @return Topic filter is valid. + */ + bool is_valid(const std::string & filter) const; + + /** + * Cast an instance of this class to a std::string. + * + * @return std::string + */ + operator std::string() const {return filter;} + + /** Matching friend function. */ + friend bool topic_match(const TopicFilter &, const TopicName &); + + /** Matching friend function. */ + friend bool topic_match(const TopicFilter &, const TopicFilter &); + +private: + + /** The filter character string. */ + std::string filter; +}; + +/** + * Match a TopicFilter against a TopicName. + * + * The MQTT 3.1.1 standard topic filter matching rules will be applied including wildcard characters. + * + * @param topic_filter A reference to a TopicFilter. + * @param topic_name A reference to a TopicName + * @return match + */ +bool topic_match(const TopicFilter & topic_filter, const TopicName & topic_name); + +/** + * Match a TopicFilter against another TopicFilter. + * + * The MQTT 3.1.1 standard topic filter matching rules are applied. These are a direct character by character match. + * This function can be used when finding an existing subscription filter, in that case wildcard character matching + * does not apply. + * + * For example, the topic filters 'a/+/c' and 'a/#' both match the topic name 'a/b/c' but the two topic filters do not + * match. + * + * @param topic_filter A reference to a TopicFilter. + * @param topic_name A reference to a TopicName + * @return match + */ +bool topic_match(const TopicFilter & topic_filter, const TopicFilter & topic_name); diff --git a/custom_modules/mqtt_server/mqtt_server.cpp b/custom_modules/mqtt_server/mqtt_server.cpp new file mode 100644 index 0000000..b5c8f46 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_server.cpp @@ -0,0 +1,85 @@ +#include "mqtt_server.h" + +void MQTTServer::add_local_session(const std::string &filter, void (*func)(const std::string &client_id, const std::vector &data, void *obj), void* obj) { + session_manager->add_local_session(filter, func, obj); +} + +void MQTTServer::initialize() { + evloop = event_base_new(); + + if (!evloop) { + printf("Could not initialize libevent\n"); + return; + } + + std::memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + evutil_inet_pton(sin.sin_family, bind_address.c_str(), &sin.sin_addr); + sin.sin_port = htons(port); + + listener = evconnlistener_new_bind(evloop, MQTTServer::listener_cb, + (void *)this, + LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, -1, + (struct sockaddr *)&sin, sizeof(sin)); + + if (!listener) { + std::cerr << "Could not create listener!\n"; + return; + } +} + +void MQTTServer::listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sa, int socklen, void *user_data) { + + MQTTServer *server = static_cast(user_data); + + struct bufferevent *bev; + + bev = bufferevent_socket_new(server->evloop, fd, BEV_OPT_CLOSE_ON_FREE); + if (!bev) { + std::cerr << "Error constructing bufferevent!\n"; + event_base_loopbreak(server->evloop); + return; + } + + server->session_manager->accept_connection(bev); +} + +void MQTTServer::run_async() { + if (_thread) { + printf("MQTTServer::run_async Error! A thread is already runnig!\n"); + return; + } + + _thread = new std::thread([this]() { event_base_dispatch(this->evloop); }); +} + +MQTTServer::MQTTServer() { + bind_address = "0"; + port = 1883; + _thread = nullptr; + + session_manager = new SessionManager(); + + evloop = nullptr; + listener = nullptr; +} + +MQTTServer::~MQTTServer() { + //this first, as evloop runs in _thread + if (evloop && event_base_loopexit(evloop, NULL)) { + std::cout << "failed to exit event loop\n"; + } + + if (_thread) { + _thread->join(); + delete _thread; + } + + if (listener) + evconnlistener_free(listener); + + if (evloop) + event_base_free(evloop); + + delete session_manager; +} diff --git a/custom_modules/mqtt_server/mqtt_server.h b/custom_modules/mqtt_server/mqtt_server.h new file mode 100644 index 0000000..e817730 --- /dev/null +++ b/custom_modules/mqtt_server/mqtt_server.h @@ -0,0 +1,43 @@ +#ifndef MQTT_SERVER_H +#define MQTT_SERVER_H + +#include +#include +#include +#include + +#include "./mqtt_broker/src/broker_session.h" +#include "./mqtt_broker/src/session_manager.h" + +#include + +#include + +#include +#include + +class MQTTServer { + +public: + static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr, int socklen, void *arg); + + void add_local_session(const std::string &filter, void (*func)(const std::string &client_id, const std::vector &data, void *obj), void* obj); + + void initialize(); + void run_async(); + + MQTTServer(); + ~MQTTServer(); + + std::thread *_thread; + + SessionManager *session_manager; + std::string bind_address; + uint16_t port; + + struct event_base *evloop; + struct evconnlistener *listener; + struct sockaddr_in sin; +}; + +#endif \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..e06b787 --- /dev/null +++ b/main.cpp @@ -0,0 +1,109 @@ +#include +#include +#include + +#include "core/http/web_application.h" +#include "core/file_cache.h" +#include "core/bry_http/http_server.h" + +#include "app/ic_application.h" + +#include "core/database/database_manager.h" + +#include "database/db_init.h" + +#include "core/settings.h" + +#include "custom_modules/mqtt_server/mqtt_server.h" + +#define MAIN_CLASS ICApplication + +void create_databases() { + + //Settings *settings = Settings::get_singleton(); + + //if (!settings) { + // printf("create_databases: Settings singleton is null!"); + // return; + //} + + /* + rapidjson::Value dbs = settings->settings["databases"]; + + if (!dbs.IsArray()) { + printf("create_databases: dbs !dbs.IsArray()!"); + return; + } +*/ + + DatabaseManager *dbm = DatabaseManager::get_singleton(); + + //uint32_t index = dbm->create_database("mysql"); + //Database *db = dbm->databases[0]; + //db->connect(""); + + uint32_t index = dbm->create_database("sqlite"); + Database *db = dbm->databases[index]; + db->connect("database.sqlite"); +} + +int main(int argc, char **argv) { + bool migrate = false; + + for (int i = 1; i < argc; ++i) { + const char *a = argv[i]; + + if (a[0] == 'm') { + migrate = true; + } + } + + initialize_database_backends(); + + Settings *settings = new Settings(true); + + settings->parse_file("settings.json"); + + FileCache *file_cache = new FileCache(true); + file_cache->wwwroot = "./content/www"; + file_cache->wwwroot_refresh_cache(); + + DatabaseManager *dbm = new DatabaseManager(); + + create_databases(); + + WebApplication *app = new MAIN_CLASS(); + + app->load_settings(); + app->setup_routes(); + app->setup_middleware(); + + HTTPServer *server = new HTTPServer(); + server->application = app; + + server->port = 8080; + server->initialize(); + + MQTTServer *mqtt_server = new MQTTServer(); + mqtt_server->initialize(); + mqtt_server->add_local_session("a/b", [](const std::string &client_id, const std::vector &data, void* obj){ reinterpret_cast(obj)->mqtt_sensor_callback(client_id, data); }, app); + + if (!migrate) { + printf("Initialized!\n"); + + mqtt_server->run_async(); + server->main_loop(); + } else { + printf("Running migrations.\n"); + app->migrate(); + } + + delete mqtt_server; + delete server; + delete app; + delete dbm; + delete file_cache; + delete settings; + + return 0; +} \ No newline at end of file diff --git a/migrate.sh b/migrate.sh new file mode 100755 index 0000000..5ae21d3 --- /dev/null +++ b/migrate.sh @@ -0,0 +1 @@ +./engine/bin/server m \ No newline at end of file diff --git a/publish_data.sh b/publish_data.sh new file mode 100755 index 0000000..03a6650 --- /dev/null +++ b/publish_data.sh @@ -0,0 +1 @@ +python publish_random_data.py \ No newline at end of file diff --git a/publish_random_data.py b/publish_random_data.py new file mode 100644 index 0000000..e6ae903 --- /dev/null +++ b/publish_random_data.py @@ -0,0 +1,17 @@ +import time +import random +import sys +import os +import subprocess + +initial_val = random.uniform(-10, 60) + + +while True: + initial_val += random.uniform(-2.3, 2.3); + + subprocess.call('mosquitto_pub -t "a/b" -m "' + str(initial_val) + '" -i 1', shell=True) + + print("Sending: " + str(initial_val)) + + time.sleep(1) diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..633e0e5 --- /dev/null +++ b/run.sh @@ -0,0 +1 @@ +./engine/bin/server \ No newline at end of file