diff --git a/404.html b/404.html index 532f6737..40918778 100644 --- a/404.html +++ b/404.html @@ -1,6 +1,2 @@ -404 Page not found | OpenBikeSensor - - - -

Not found

Oops! This page doesn't exist. Try going back to our home page.

You can learn how to make a 404 page like this in Custom 404 Pages.

- \ No newline at end of file +404 Page not found | OpenBikeSensor +

Not found

Oops! This page doesn't exist. Try going back to our home page.

You can learn how to make a 404 page like this in Custom 404 Pages.

\ No newline at end of file diff --git a/_print/bauanleitung/classic/index.html b/_print/bauanleitung/classic/index.html deleted file mode 100644 index 1579644f..00000000 --- a/_print/bauanleitung/classic/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/build-instructions/_print/ \ No newline at end of file diff --git a/_print/bauanleitung/index.html b/_print/bauanleitung/index.html deleted file mode 100644 index 1579644f..00000000 --- a/_print/bauanleitung/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/build-instructions/_print/ \ No newline at end of file diff --git a/_print/bauanleitung/v00.03.12/index.html b/_print/bauanleitung/v00.03.12/index.html deleted file mode 100644 index e5323908..00000000 --- a/_print/bauanleitung/v00.03.12/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/build-instructions/v00.03.12/_print/ \ No newline at end of file diff --git a/_print/bauteile/index.html b/_print/bauteile/index.html deleted file mode 100644 index c1eba6c0..00000000 --- a/_print/bauteile/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/parts/_print/ \ No newline at end of file diff --git a/_print/bauteile/v00.03.12/index.html b/_print/bauteile/v00.03.12/index.html deleted file mode 100644 index c1eba6c0..00000000 --- a/_print/bauteile/v00.03.12/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/parts/_print/ \ No newline at end of file diff --git a/_print/docs/classic/about/construction-kit-00.03.10.jpg b/_print/docs/classic/about/construction-kit-00.03.10.jpg deleted file mode 100644 index 507d135d..00000000 Binary files a/_print/docs/classic/about/construction-kit-00.03.10.jpg and /dev/null differ diff --git a/_print/docs/classic/about/construction-kit-00.03.10_hue721a11ac8ecd4296946435a351f8f79_288603_600x0_resize_q75_catmullrom.jpg b/_print/docs/classic/about/construction-kit-00.03.10_hue721a11ac8ecd4296946435a351f8f79_288603_600x0_resize_q75_catmullrom.jpg deleted file mode 100644 index febccbbf..00000000 Binary files a/_print/docs/classic/about/construction-kit-00.03.10_hue721a11ac8ecd4296946435a351f8f79_288603_600x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/build-instructions/battery-connector-orientations.png b/_print/docs/classic/build-instructions/battery-connector-orientations.png deleted file mode 100644 index 27fd21f1..00000000 Binary files a/_print/docs/classic/build-instructions/battery-connector-orientations.png and /dev/null differ diff --git a/_print/docs/classic/build-instructions/battery-connector-orientations_hudc132350f747f550efaf8b519a8ac884_257375_500x500_fit_catmullrom_3.png b/_print/docs/classic/build-instructions/battery-connector-orientations_hudc132350f747f550efaf8b519a8ac884_257375_500x500_fit_catmullrom_3.png deleted file mode 100644 index b002194b..00000000 Binary files a/_print/docs/classic/build-instructions/battery-connector-orientations_hudc132350f747f550efaf8b519a8ac884_257375_500x500_fit_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/classic/build-instructions/connectors.png b/_print/docs/classic/build-instructions/connectors.png deleted file mode 100644 index a84ed0bf..00000000 Binary files a/_print/docs/classic/build-instructions/connectors.png and /dev/null differ diff --git a/_print/docs/classic/build-instructions/connectors_hu74235dab2c32ee6d84a3e173bb875ade_125647_500x500_fit_catmullrom_3.png b/_print/docs/classic/build-instructions/connectors_hu74235dab2c32ee6d84a3e173bb875ade_125647_500x500_fit_catmullrom_3.png deleted file mode 100644 index 0b531092..00000000 Binary files a/_print/docs/classic/build-instructions/connectors_hu74235dab2c32ee6d84a3e173bb875ade_125647_500x500_fit_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/classic/build-instructions/diode.png b/_print/docs/classic/build-instructions/diode.png deleted file mode 100644 index 6365a14d..00000000 Binary files a/_print/docs/classic/build-instructions/diode.png and /dev/null differ diff --git a/_print/docs/classic/build-instructions/diode_hu26286727106c4739ecd91c061fdadc96_185217_500x500_fit_catmullrom_3.png b/_print/docs/classic/build-instructions/diode_hu26286727106c4739ecd91c061fdadc96_185217_500x500_fit_catmullrom_3.png deleted file mode 100644 index 3b6a9176..00000000 Binary files a/_print/docs/classic/build-instructions/diode_hu26286727106c4739ecd91c061fdadc96_185217_500x500_fit_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/classic/build-instructions/gps-sd-placement.jpg b/_print/docs/classic/build-instructions/gps-sd-placement.jpg deleted file mode 100644 index 8f3e6a18..00000000 Binary files a/_print/docs/classic/build-instructions/gps-sd-placement.jpg and /dev/null differ diff --git a/_print/docs/classic/build-instructions/gps-sd-placement_hu34bd0f0193de92099deb545a93f2fbae_4919766_800x600_fit_q75_catmullrom.jpg b/_print/docs/classic/build-instructions/gps-sd-placement_hu34bd0f0193de92099deb545a93f2fbae_4919766_800x600_fit_q75_catmullrom.jpg deleted file mode 100644 index 828dc530..00000000 Binary files a/_print/docs/classic/build-instructions/gps-sd-placement_hu34bd0f0193de92099deb545a93f2fbae_4919766_800x600_fit_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/Halterung_Display.JPG b/_print/docs/classic/case/Halterung_Display.JPG deleted file mode 100644 index ff76bcdf..00000000 Binary files a/_print/docs/classic/case/Halterung_Display.JPG and /dev/null differ diff --git a/_print/docs/classic/case/OBS_vertical_case_alle_Teile.jpg b/_print/docs/classic/case/OBS_vertical_case_alle_Teile.jpg deleted file mode 100644 index bb3231c9..00000000 Binary files a/_print/docs/classic/case/OBS_vertical_case_alle_Teile.jpg and /dev/null differ diff --git a/_print/docs/classic/case/OBS_vertical_case_alle_Teile_hue39e05e339c077d59aee48c72fb18c29_97690_800x600_fit_q75_catmullrom.jpg b/_print/docs/classic/case/OBS_vertical_case_alle_Teile_hue39e05e339c077d59aee48c72fb18c29_97690_800x600_fit_q75_catmullrom.jpg deleted file mode 100644 index 0e5c1262..00000000 Binary files a/_print/docs/classic/case/OBS_vertical_case_alle_Teile_hue39e05e339c077d59aee48c72fb18c29_97690_800x600_fit_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/Zugentlastung mit Schrauben.JPG b/_print/docs/classic/case/Zugentlastung mit Schrauben.JPG deleted file mode 100644 index b8b58875..00000000 Binary files a/_print/docs/classic/case/Zugentlastung mit Schrauben.JPG and /dev/null differ diff --git a/_print/docs/classic/case/color-prints/main-case-parts-original.png b/_print/docs/classic/case/color-prints/main-case-parts-original.png deleted file mode 100644 index a5315198..00000000 Binary files a/_print/docs/classic/case/color-prints/main-case-parts-original.png and /dev/null differ diff --git a/_print/docs/classic/case/color-prints/main-case-parts.png b/_print/docs/classic/case/color-prints/main-case-parts.png deleted file mode 100644 index ae716ec4..00000000 Binary files a/_print/docs/classic/case/color-prints/main-case-parts.png and /dev/null differ diff --git a/_print/docs/classic/case/color-prints/main-case-parts_hu83e0249cd20acef9c5d391ebeeb147b8_269187_600x0_resize_catmullrom_3.png b/_print/docs/classic/case/color-prints/main-case-parts_hu83e0249cd20acef9c5d391ebeeb147b8_269187_600x0_resize_catmullrom_3.png deleted file mode 100644 index 63cdd927..00000000 Binary files a/_print/docs/classic/case/color-prints/main-case-parts_hu83e0249cd20acef9c5d391ebeeb147b8_269187_600x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/classic/case/color-prints/main-case-printed.jpg b/_print/docs/classic/case/color-prints/main-case-printed.jpg deleted file mode 100644 index 6b507d29..00000000 Binary files a/_print/docs/classic/case/color-prints/main-case-printed.jpg and /dev/null differ diff --git a/_print/docs/classic/case/color-prints/main-case-printed_hu96770d98d2815c19d000487f0e8d6252_187164_600x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/color-prints/main-case-printed_hu96770d98d2815c19d000487f0e8d6252_187164_600x0_resize_q75_catmullrom.jpg deleted file mode 100644 index b3e6a75f..00000000 Binary files a/_print/docs/classic/case/color-prints/main-case-printed_hu96770d98d2815c19d000487f0e8d6252_187164_600x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/adfc_logo_drucklage.jpg b/_print/docs/classic/case/printing/adfc_logo_drucklage.jpg deleted file mode 100644 index c03bb616..00000000 Binary files a/_print/docs/classic/case/printing/adfc_logo_drucklage.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/adfc_logo_drucklage_hu0483bf0286ce501e9d8611609dc3173b_54972_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/adfc_logo_drucklage_hu0483bf0286ce501e9d8611609dc3173b_54972_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 36c8456b..00000000 Binary files a/_print/docs/classic/case/printing/adfc_logo_drucklage_hu0483bf0286ce501e9d8611609dc3173b_54972_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/adfc_logo_gedreht.jpg b/_print/docs/classic/case/printing/adfc_logo_gedreht.jpg deleted file mode 100644 index 704b7182..00000000 Binary files a/_print/docs/classic/case/printing/adfc_logo_gedreht.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/adfc_logo_gedreht_hu62c8376538a429cb5e2bf097057fd917_89121_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/adfc_logo_gedreht_hu62c8376538a429cb5e2bf097057fd917_89121_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index b4946903..00000000 Binary files a/_print/docs/classic/case/printing/adfc_logo_gedreht_hu62c8376538a429cb5e2bf097057fd917_89121_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_enable_support.jpg b/_print/docs/classic/case/printing/cura_case_enable_support.jpg deleted file mode 100644 index d7b8a0f0..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_enable_support.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_enable_support_hufea0db224650798404277cb2d80ca31f_241435_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_case_enable_support_hufea0db224650798404277cb2d80ca31f_241435_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index e1833b6f..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_enable_support_hufea0db224650798404277cb2d80ca31f_241435_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_extruder.jpg b/_print/docs/classic/case/printing/cura_case_extruder.jpg deleted file mode 100644 index 11c2687f..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_extruder.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_extruder_hu8e75c1970368449d8b7aa6b1154e6582_248064_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_case_extruder_hu8e75c1970368449d8b7aa6b1154e6582_248064_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 012c7408..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_extruder_hu8e75c1970368449d8b7aa6b1154e6582_248064_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_overhangs.jpg b/_print/docs/classic/case/printing/cura_case_overhangs.jpg deleted file mode 100644 index e5d2f440..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_overhangs.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_overhangs_hu902d7b391735fc79bb204ce0620a1f78_119705_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_case_overhangs_hu902d7b391735fc79bb204ce0620a1f78_119705_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 7019600b..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_overhangs_hu902d7b391735fc79bb204ce0620a1f78_119705_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_prepare.jpg b/_print/docs/classic/case/printing/cura_case_prepare.jpg deleted file mode 100644 index df9c1748..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_prepare.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_prepare_hu97520d1c04b73b289a682a03d2742442_242641_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_case_prepare_hu97520d1c04b73b289a682a03d2742442_242641_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index b8e56b05..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_prepare_hu97520d1c04b73b289a682a03d2742442_242641_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_settings.jpg b/_print/docs/classic/case/printing/cura_case_settings.jpg deleted file mode 100644 index 45474a37..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_settings.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_settings_hu33e9ea5868e43b0547b327e359f95812_253158_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_case_settings_hu33e9ea5868e43b0547b327e359f95812_253158_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 3333d934..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_settings_hu33e9ea5868e43b0547b327e359f95812_253158_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_slice.jpg b/_print/docs/classic/case/printing/cura_case_slice.jpg deleted file mode 100644 index d6d25dd6..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_slice.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_slice_hu6b7c1f901824d1c1fe3085dac10f4368_245514_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_case_slice_hu6b7c1f901824d1c1fe3085dac10f4368_245514_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index fceed730..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_slice_hu6b7c1f901824d1c1fe3085dac10f4368_245514_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_slice_information.jpg b/_print/docs/classic/case/printing/cura_case_slice_information.jpg deleted file mode 100644 index bfcd22ab..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_slice_information.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_slice_information_huc84ef2d52f91639d382dc25ffc31cef8_254883_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_case_slice_information_huc84ef2d52f91639d382dc25ffc31cef8_254883_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 7c4f32a5..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_slice_information_huc84ef2d52f91639d382dc25ffc31cef8_254883_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_slice_preview.jpg b/_print/docs/classic/case/printing/cura_case_slice_preview.jpg deleted file mode 100644 index 81b642e2..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_slice_preview.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_slice_preview_hub7a7e3851ad8f46519c3fb8dee24db37_284574_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_case_slice_preview_hub7a7e3851ad8f46519c3fb8dee24db37_284574_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 0de8195b..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_slice_preview_hub7a7e3851ad8f46519c3fb8dee24db37_284574_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_supports.jpg b/_print/docs/classic/case/printing/cura_case_supports.jpg deleted file mode 100644 index 9b8928a8..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_supports.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_case_supports_hu7deee38c0fe3631ee7f2541ab23bc71b_445386_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_case_supports_hu7deee38c0fe3631ee7f2541ab23bc71b_445386_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 022d342a..00000000 Binary files a/_print/docs/classic/case/printing/cura_case_supports_hu7deee38c0fe3631ee7f2541ab23bc71b_445386_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_lid_oriented.jpg b/_print/docs/classic/case/printing/cura_lid_oriented.jpg deleted file mode 100644 index 90d4e52c..00000000 Binary files a/_print/docs/classic/case/printing/cura_lid_oriented.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_lid_oriented_hu585cef0d47e2c3b6c3e9e62e99209ea2_256785_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_lid_oriented_hu585cef0d47e2c3b6c3e9e62e99209ea2_256785_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index c428aca2..00000000 Binary files a/_print/docs/classic/case/printing/cura_lid_oriented_hu585cef0d47e2c3b6c3e9e62e99209ea2_256785_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_lid_overhangs.jpg b/_print/docs/classic/case/printing/cura_lid_overhangs.jpg deleted file mode 100644 index 7037a6f4..00000000 Binary files a/_print/docs/classic/case/printing/cura_lid_overhangs.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_lid_overhangs_hu8d3d7d278145fa7e12746b63835dca5b_140617_1000x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_lid_overhangs_hu8d3d7d278145fa7e12746b63835dca5b_140617_1000x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 47d1f36d..00000000 Binary files a/_print/docs/classic/case/printing/cura_lid_overhangs_hu8d3d7d278145fa7e12746b63835dca5b_140617_1000x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_maincase_parts.jpg b/_print/docs/classic/case/printing/cura_maincase_parts.jpg deleted file mode 100644 index 5d9e1f60..00000000 Binary files a/_print/docs/classic/case/printing/cura_maincase_parts.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_maincase_parts_huea0ddd23204d4da1e22c59ac91c7296b_349434_800x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_maincase_parts_huea0ddd23204d4da1e22c59ac91c7296b_349434_800x0_resize_q75_catmullrom.jpg deleted file mode 100644 index ffb53f15..00000000 Binary files a/_print/docs/classic/case/printing/cura_maincase_parts_huea0ddd23204d4da1e22c59ac91c7296b_349434_800x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_mounting_parts.jpg b/_print/docs/classic/case/printing/cura_mounting_parts.jpg deleted file mode 100644 index b01c9fb9..00000000 Binary files a/_print/docs/classic/case/printing/cura_mounting_parts.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/cura_mounting_parts_hua6318f27f7fbc9a66ef72ef025c00707_512076_800x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/cura_mounting_parts_hua6318f27f7fbc9a66ef72ef025c00707_512076_800x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 52797d84..00000000 Binary files a/_print/docs/classic/case/printing/cura_mounting_parts_hua6318f27f7fbc9a66ef72ef025c00707_512076_800x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/display_labeled.jpg b/_print/docs/classic/case/printing/display_labeled.jpg deleted file mode 100644 index 2ca0716c..00000000 Binary files a/_print/docs/classic/case/printing/display_labeled.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/display_labeled_hud2a4707b9b7a63e31755167eb4289548_224785_400x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/display_labeled_hud2a4707b9b7a63e31755167eb4289548_224785_400x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 02cede8f..00000000 Binary files a/_print/docs/classic/case/printing/display_labeled_hud2a4707b9b7a63e31755167eb4289548_224785_400x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/logo_preview.jpg b/_print/docs/classic/case/printing/logo_preview.jpg deleted file mode 100644 index e914ccaf..00000000 Binary files a/_print/docs/classic/case/printing/logo_preview.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/logo_preview_hu887ebcc573f3f6020fa3b097da069bf9_302444_800x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/logo_preview_hu887ebcc573f3f6020fa3b097da069bf9_302444_800x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 4cddf0a1..00000000 Binary files a/_print/docs/classic/case/printing/logo_preview_hu887ebcc573f3f6020fa3b097da069bf9_302444_800x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/mounts.jpg b/_print/docs/classic/case/printing/mounts.jpg deleted file mode 100644 index 39950f2c..00000000 Binary files a/_print/docs/classic/case/printing/mounts.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/mounts_hu55f4d15c41473aceef0d4ea4c3fa796b_99024_800x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/mounts_hu55f4d15c41473aceef0d4ea4c3fa796b_99024_800x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 6812c2f9..00000000 Binary files a/_print/docs/classic/case/printing/mounts_hu55f4d15c41473aceef0d4ea4c3fa796b_99024_800x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/problem_broken_slide.jpg b/_print/docs/classic/case/printing/problem_broken_slide.jpg deleted file mode 100644 index f80bd5c4..00000000 Binary files a/_print/docs/classic/case/printing/problem_broken_slide.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/problem_broken_slide_hud31f3ccf72ffc25f75a29a7fa872d251_122679_400x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/problem_broken_slide_hud31f3ccf72ffc25f75a29a7fa872d251_122679_400x0_resize_q75_catmullrom.jpg deleted file mode 100644 index dd5ff622..00000000 Binary files a/_print/docs/classic/case/printing/problem_broken_slide_hud31f3ccf72ffc25f75a29a7fa872d251_122679_400x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/problem_support_missing.jpg b/_print/docs/classic/case/printing/problem_support_missing.jpg deleted file mode 100644 index 47874b98..00000000 Binary files a/_print/docs/classic/case/printing/problem_support_missing.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/problem_support_missing_hu48542aa11fbcdeb654aeb05e1a5a852a_207335_400x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/problem_support_missing_hu48542aa11fbcdeb654aeb05e1a5a852a_207335_400x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 33412bc8..00000000 Binary files a/_print/docs/classic/case/printing/problem_support_missing_hu48542aa11fbcdeb654aeb05e1a5a852a_207335_400x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/ultimaker.jpg b/_print/docs/classic/case/printing/ultimaker.jpg deleted file mode 100644 index f50293e8..00000000 Binary files a/_print/docs/classic/case/printing/ultimaker.jpg and /dev/null differ diff --git a/_print/docs/classic/case/printing/ultimaker_hu8c5840cc3cfb64402da3bf832f20ecbc_279275_600x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/printing/ultimaker_hu8c5840cc3cfb64402da3bf832f20ecbc_279275_600x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 844828ec..00000000 Binary files a/_print/docs/classic/case/printing/ultimaker_hu8c5840cc3cfb64402da3bf832f20ecbc_279275_600x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/case/variants/back-rider-top-rider.jpg b/_print/docs/classic/case/variants/back-rider-top-rider.jpg deleted file mode 100644 index ef7e8cec..00000000 Binary files a/_print/docs/classic/case/variants/back-rider-top-rider.jpg and /dev/null differ diff --git a/_print/docs/classic/case/variants/back-rider-top-rider_hu8dbb6547437a3223229bb6b1a9caee02_107752_600x0_resize_q75_catmullrom.jpg b/_print/docs/classic/case/variants/back-rider-top-rider_hu8dbb6547437a3223229bb6b1a9caee02_107752_600x0_resize_q75_catmullrom.jpg deleted file mode 100644 index 3e693c4b..00000000 Binary files a/_print/docs/classic/case/variants/back-rider-top-rider_hu8dbb6547437a3223229bb6b1a9caee02_107752_600x0_resize_q75_catmullrom.jpg and /dev/null differ diff --git a/_print/docs/classic/general/collective-order/index.html b/_print/docs/classic/general/collective-order/index.html deleted file mode 100644 index dc115564..00000000 --- a/_print/docs/classic/general/collective-order/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/other/collective-order/_print/ \ No newline at end of file diff --git a/_print/docs/firmware/flash-windows/esp32-download-tool.png b/_print/docs/firmware/flash-windows/esp32-download-tool.png deleted file mode 100644 index 08293e8d..00000000 Binary files a/_print/docs/firmware/flash-windows/esp32-download-tool.png and /dev/null differ diff --git a/_print/docs/firmware/flash-windows/esp32-download-tool_hu8c7b391d137a39822a3fbb6fa6b5931a_134314_300x0_resize_catmullrom_3.png b/_print/docs/firmware/flash-windows/esp32-download-tool_hu8c7b391d137a39822a3fbb6fa6b5931a_134314_300x0_resize_catmullrom_3.png deleted file mode 100644 index 9d3435ac..00000000 Binary files a/_print/docs/firmware/flash-windows/esp32-download-tool_hu8c7b391d137a39822a3fbb6fa6b5931a_134314_300x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/hardware/general/case/index.html b/_print/docs/hardware/general/case/index.html deleted file mode 100644 index ab323679..00000000 --- a/_print/docs/hardware/general/case/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/case/_print/ \ No newline at end of file diff --git a/_print/docs/hardware/general/pcb/index.html b/_print/docs/hardware/general/pcb/index.html deleted file mode 100644 index 3a635fc1..00000000 --- a/_print/docs/hardware/general/pcb/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/pcb/_print/ \ No newline at end of file diff --git a/_print/docs/hardware/index.html b/_print/docs/hardware/index.html deleted file mode 100644 index ef78e9e3..00000000 --- a/_print/docs/hardware/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/_print/ \ No newline at end of file diff --git a/_print/docs/hardware/v00.03.12/build-instructions/index.html b/_print/docs/hardware/v00.03.12/build-instructions/index.html deleted file mode 100644 index e5323908..00000000 --- a/_print/docs/hardware/v00.03.12/build-instructions/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/build-instructions/v00.03.12/_print/ \ No newline at end of file diff --git a/_print/docs/hardware/v00.03.12/parts/index.html b/_print/docs/hardware/v00.03.12/parts/index.html deleted file mode 100644 index c1eba6c0..00000000 --- a/_print/docs/hardware/v00.03.12/parts/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/classic/parts/_print/ \ No newline at end of file diff --git a/_print/docs/other/collective-order/aj-sr04m-general.png b/_print/docs/other/collective-order/aj-sr04m-general.png deleted file mode 100644 index 44d64ab8..00000000 Binary files a/_print/docs/other/collective-order/aj-sr04m-general.png and /dev/null differ diff --git a/_print/docs/other/collective-order/aj-sr04m-general_huae751d8764c07c64151502816b4f3c5b_719818_600x0_resize_catmullrom_3.png b/_print/docs/other/collective-order/aj-sr04m-general_huae751d8764c07c64151502816b4f3c5b_719818_600x0_resize_catmullrom_3.png deleted file mode 100644 index 7304da0c..00000000 Binary files a/_print/docs/other/collective-order/aj-sr04m-general_huae751d8764c07c64151502816b4f3c5b_719818_600x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/other/collective-order/aj-sr04m-order-2021-02.png b/_print/docs/other/collective-order/aj-sr04m-order-2021-02.png deleted file mode 100644 index 05a299e7..00000000 Binary files a/_print/docs/other/collective-order/aj-sr04m-order-2021-02.png and /dev/null differ diff --git a/_print/docs/other/collective-order/aj-sr04m-order-2021-02_hu184eb2cf55d126d36bd2c009a05f4dfd_6737558_600x0_resize_catmullrom_3.png b/_print/docs/other/collective-order/aj-sr04m-order-2021-02_hu184eb2cf55d126d36bd2c009a05f4dfd_6737558_600x0_resize_catmullrom_3.png deleted file mode 100644 index d57e40b6..00000000 Binary files a/_print/docs/other/collective-order/aj-sr04m-order-2021-02_hu184eb2cf55d126d36bd2c009a05f4dfd_6737558_600x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-2.0.png b/_print/docs/other/collective-order/jsn-sr04t-2.0.png deleted file mode 100644 index daa277ef..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-2.0.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-2.0_hu3ed92257a96d64811ce717793d9a7b1f_685588_600x0_resize_catmullrom_3.png b/_print/docs/other/collective-order/jsn-sr04t-2.0_hu3ed92257a96d64811ce717793d9a7b1f_685588_600x0_resize_catmullrom_3.png deleted file mode 100644 index 436c7f8e..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-2.0_hu3ed92257a96d64811ce717793d9a7b1f_685588_600x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-back-1.png b/_print/docs/other/collective-order/jsn-sr04t-back-1.png deleted file mode 100644 index 3dd0e055..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-back-1.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-back-1_hu62898702615cd8e687e36d56f8908eda_212957_300x0_resize_catmullrom_3.png b/_print/docs/other/collective-order/jsn-sr04t-back-1_hu62898702615cd8e687e36d56f8908eda_212957_300x0_resize_catmullrom_3.png deleted file mode 100644 index e9679dba..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-back-1_hu62898702615cd8e687e36d56f8908eda_212957_300x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-back-2.png b/_print/docs/other/collective-order/jsn-sr04t-back-2.png deleted file mode 100644 index cbf05cad..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-back-2.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-back-2_hub574b5fff740f3e2a3a710deb0d7bc74_346211_300x0_resize_catmullrom_3.png b/_print/docs/other/collective-order/jsn-sr04t-back-2_hub574b5fff740f3e2a3a710deb0d7bc74_346211_300x0_resize_catmullrom_3.png deleted file mode 100644 index e345ccbd..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-back-2_hub574b5fff740f3e2a3a710deb0d7bc74_346211_300x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-en.pdf b/_print/docs/other/collective-order/jsn-sr04t-en.pdf deleted file mode 100644 index 45b37438..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-en.pdf and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-front-1.png b/_print/docs/other/collective-order/jsn-sr04t-front-1.png deleted file mode 100644 index ef7a67d7..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-front-1.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-front-1_hua606a29ab2de5a49956e32ce009e3a37_387618_300x0_resize_catmullrom_3.png b/_print/docs/other/collective-order/jsn-sr04t-front-1_hua606a29ab2de5a49956e32ce009e3a37_387618_300x0_resize_catmullrom_3.png deleted file mode 100644 index eecf0065..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-front-1_hua606a29ab2de5a49956e32ce009e3a37_387618_300x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-front-2.png b/_print/docs/other/collective-order/jsn-sr04t-front-2.png deleted file mode 100644 index 1537cb38..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-front-2.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-front-2_hu48304420d4427ad8b7e31d3a69dfa05d_507688_300x0_resize_catmullrom_3.png b/_print/docs/other/collective-order/jsn-sr04t-front-2_hu48304420d4427ad8b7e31d3a69dfa05d_507688_300x0_resize_catmullrom_3.png deleted file mode 100644 index f2bde4f9..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-front-2_hu48304420d4427ad8b7e31d3a69dfa05d_507688_300x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-v3.0.png b/_print/docs/other/collective-order/jsn-sr04t-v3.0.png deleted file mode 100644 index 9b0930ff..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-v3.0.png and /dev/null differ diff --git a/_print/docs/other/collective-order/jsn-sr04t-v3.0_hud81a27fdf962bb6bf487928689d0271e_658700_600x0_resize_catmullrom_3.png b/_print/docs/other/collective-order/jsn-sr04t-v3.0_hud81a27fdf962bb6bf487928689d0271e_658700_600x0_resize_catmullrom_3.png deleted file mode 100644 index b9cce850..00000000 Binary files a/_print/docs/other/collective-order/jsn-sr04t-v3.0_hud81a27fdf962bb6bf487928689d0271e_658700_600x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/docs/other/collective-order/sr04m-2.png b/_print/docs/other/collective-order/sr04m-2.png deleted file mode 100644 index 4ae3df3d..00000000 Binary files a/_print/docs/other/collective-order/sr04m-2.png and /dev/null differ diff --git a/_print/docs/other/collective-order/sr04m-2_hu274a3bdd777eb732370e3aa6eca3949f_711863_600x0_resize_catmullrom_3.png b/_print/docs/other/collective-order/sr04m-2_hu274a3bdd777eb732370e3aa6eca3949f_711863_600x0_resize_catmullrom_3.png deleted file mode 100644 index 9770f3fa..00000000 Binary files a/_print/docs/other/collective-order/sr04m-2_hu274a3bdd777eb732370e3aa6eca3949f_711863_600x0_resize_catmullrom_3.png and /dev/null differ diff --git a/_print/flash/index.html b/_print/flash/index.html deleted file mode 100644 index 612cac36..00000000 --- a/_print/flash/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/docs/firmware/_print/ \ No newline at end of file diff --git a/_print/kontakt/index.html b/_print/kontakt/index.html deleted file mode 100644 index 7a25a25e..00000000 --- a/_print/kontakt/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/contact/_print/ \ No newline at end of file diff --git a/_print/slack/index.html b/_print/slack/index.html deleted file mode 100644 index b8d1591d..00000000 --- a/_print/slack/index.html +++ /dev/null @@ -1 +0,0 @@ -https://www.openbikesensor.org/community/_print/ \ No newline at end of file diff --git a/aliases/index.html b/aliases/index.html index b097a642..eaed246e 100644 --- a/aliases/index.html +++ b/aliases/index.html @@ -1,8 +1,3 @@ -Kurzlinks | OpenBikeSensor - - - -
- \ No newline at end of file +Kurzlinks | OpenBikeSensor +
\ No newline at end of file diff --git a/bauanleitung/classic/index.html b/bauanleitung/classic/index.html index 46686887..787c6454 100644 --- a/bauanleitung/classic/index.html +++ b/bauanleitung/classic/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/build-instructions/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/build-instructions/ + \ No newline at end of file diff --git a/bauanleitung/index.html b/bauanleitung/index.html index 46686887..787c6454 100644 --- a/bauanleitung/index.html +++ b/bauanleitung/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/build-instructions/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/build-instructions/ + \ No newline at end of file diff --git a/bauanleitung/v00.03.12/index.html b/bauanleitung/v00.03.12/index.html index 99ee36fa..8493c18a 100644 --- a/bauanleitung/v00.03.12/index.html +++ b/bauanleitung/v00.03.12/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/build-instructions/v00.03.12/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/build-instructions/v00.03.12/ + \ No newline at end of file diff --git a/bauteile/index.html b/bauteile/index.html index 6d56aa2f..851e9a88 100644 --- a/bauteile/index.html +++ b/bauteile/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/parts/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/parts/ + \ No newline at end of file diff --git a/bauteile/v00.03.12/index.html b/bauteile/v00.03.12/index.html index 6d56aa2f..851e9a88 100644 --- a/bauteile/v00.03.12/index.html +++ b/bauteile/v00.03.12/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/parts/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/parts/ + \ No newline at end of file diff --git a/blog/2021/03/23/openbikesensor-goes-lgpl/index.html b/blog/2021/03/23/openbikesensor-goes-lgpl/index.html index cfef86cb..ba7b39db 100644 --- a/blog/2021/03/23/openbikesensor-goes-lgpl/index.html +++ b/blog/2021/03/23/openbikesensor-goes-lgpl/index.html @@ -1,14 +1,12 @@ -OpenBikeSensor goes LGPL | OpenBikeSensorOpenBikeSensor goes LGPL | OpenBikeSensor + - - - -

OpenBikeSensor goes LGPL

Als Open-Source-Projekt freuen wir uns, bekanntgeben zu können, dass wir uns +Freier Zugang zu Information sowie deren freie Verwendung ist ein Grundsatz, der uns allen sehr wichtig ist. Daher stand auch nie wirklich zur Diskussion, eine Open-Source-Lizenz für unsere Werke zu wählen.">

OpenBikeSensor goes LGPL

Als Open-Source-Projekt freuen wir uns, bekanntgeben zu können, dass wir uns auf eine gemeinsame Lizenz für unsere bestehenden und zukünftigen Software-, Design- und Dokumentationswerke geeinigt haben.

Nach langer Diskussion hat sich die Community über die Grundsätze einer freien und quelloffenen Arbeit verständigt, die das Projekt hoffentlich lange @@ -36,5 +34,4 @@ Vorteile, die Open-Source-Projekte genießen, die es voranbringen.

Wenn du mehr zum Thema Open Source, Freiheit von Software und Informationen wissen möchtest, schau dich doch einmal bei der Free Software Foundation um.

Werde auch du auch Teil des OpenBikeSensors! Dank -Open-Source-Lizenz ist das einfach und unkompliziert möglich.

- \ No newline at end of file +Open-Source-Lizenz ist das einfach und unkompliziert möglich.

\ No newline at end of file diff --git a/blog/2021/03/28/das-projekt-openbikesensor-im-ersten/index.html b/blog/2021/03/28/das-projekt-openbikesensor-im-ersten/index.html index f1bfb292..cbe289cc 100644 --- a/blog/2021/03/28/das-projekt-openbikesensor-im-ersten/index.html +++ b/blog/2021/03/28/das-projekt-openbikesensor-im-ersten/index.html @@ -1,17 +1,15 @@ -Das Projekt OpenBikeSensor im Ersten | OpenBikeSensorDas Projekt OpenBikeSensor im Ersten | OpenBikeSensor + - - - -

Das Projekt OpenBikeSensor im Ersten

Am 26. März 2021 hat die ARD im Magazin „Brisant” einen Beitrag des +Wir freuen uns sehr über diesen gelungenen Beitrag. In den Tagen nach der Ausstrahlung kammen immer mehr neue Mitglieder in den Slack, die durch diese öffentliche Aufmerksamkeit von OpenBikeSensor erfahren haben, und nun Teil der immer weiter wachsenden Community geworden sind.">

Das Projekt OpenBikeSensor im Ersten

Am 26. März 2021 hat die ARD im Magazin „Brisant” einen Beitrag des SWR zum Thema Überholabstände zu Radfahrenden ausgestrahlt, mit dabei unser Projekt.

Der Beitrag beginnt mit erschreckenden Bildern von Überholvorgängen um das Problem zu verdeutlichen. Als Beispiel wird die auch uns bekannte Strecke im @@ -20,5 +18,4 @@ Ausstrahlung kammen immer mehr neue Mitglieder in den Slack, die durch diese öffentliche Aufmerksamkeit von OpenBikeSensor erfahren haben, und nun Teil der immer weiter wachsenden Community geworden sind.

Den ganzen Fernsehbeitrag haben wir hier eingebunden, und auf swr.de -gibt es dazu auch noch einen schriftlichen Artikel.

- \ No newline at end of file +gibt es dazu auch noch einen schriftlichen Artikel.

\ No newline at end of file diff --git a/blog/2021/05/24/der-openbikesensor-im-deutschlandfunk/index.html b/blog/2021/05/24/der-openbikesensor-im-deutschlandfunk/index.html index f2394881..55fe2f73 100644 --- a/blog/2021/05/24/der-openbikesensor-im-deutschlandfunk/index.html +++ b/blog/2021/05/24/der-openbikesensor-im-deutschlandfunk/index.html @@ -1,14 +1,11 @@ -Der OpenBikeSensor im Deutschlandfunk | OpenBikeSensorDer OpenBikeSensor im Deutschlandfunk | OpenBikeSensor + - - - -

Der OpenBikeSensor im Deutschlandfunk

Bereits am 09. Mai 2021 gab es einen Beitrag über den OpenBikeSensor in der Sendung Netzbasteln im Deutschlandfunk Nova. +Wir freuen uns sehr über diesen Beitrag.">

Der OpenBikeSensor im Deutschlandfunk

Bereits am 09. Mai 2021 gab es einen Beitrag über den OpenBikeSensor in der Sendung Netzbasteln im Deutschlandfunk Nova. Der Deutschlandfunk-Nova-Reporter Moritz Metz hat selbst einen OpenBikeSensor zusammengebaut und diesen “live” auf einer Bundesstraße in Brandenburg getestet.

Der ganze Beitrag findet sich auf deutschlandfunknova.de. -Auch auf Twitter hat Moritz Metz fleißig über den OpenBikeSensor berichtet.

Wir freuen uns sehr über diesen Beitrag.

- \ No newline at end of file +Auch auf Twitter hat Moritz Metz fleißig über den OpenBikeSensor berichtet.

Wir freuen uns sehr über diesen Beitrag.

\ No newline at end of file diff --git a/blog/2021/06/17/openbikesensor-zu-gast-im-achter/index.html b/blog/2021/06/17/openbikesensor-zu-gast-im-achter/index.html index 243b0212..31140e09 100644 --- a/blog/2021/06/17/openbikesensor-zu-gast-im-achter/index.html +++ b/blog/2021/06/17/openbikesensor-zu-gast-im-achter/index.html @@ -1,9 +1,6 @@ -OpenBikeSensor zu Gast im "Achter" | OpenBikeSensorOpenBikeSensor zu Gast im "Achter" | OpenBikeSensor + - - - -

OpenBikeSensor zu Gast im "Achter"

Zum internationalen Tag des Fahrrads (03.06.) hatte sich Thomas Albrecht, Fahrrad-Enthusiast aus Esslingen am Neckar und Moderator beim Freien Radio Stuttgart, einen Abstandsmesser von uns geliehen. Aus seiner Begeisterung für diesen Testlauf heraus lud er (unter anderen) Franziska zum Fahrrad-Magazin ein.

Achter, das Fahrrad-Magazin für Stuttgart und Umgebung

Ein Mal monatlich geht im Freien Radio Stuttgart das Fahrrad-Magazin “Achter” auf Sendung. Es ist ein Kessel “Buntes” zum Thema Fahrrad aus Berichten, Gesprächen mit Akteuren und viel Musik.

In der Juni-Ausgabe, stellt das Team zum Einen das “Radbündnis Filder” vor [ ab 0'41’’ ]. Hier diskutieren Evelyn Sindermann und Thomas die typischen Probleme, die sich an Gemarkungsgrenzen in Sachen Fahrrad-Infrastruktur ergeben. Evelyn berichtet, wie das Aktionsbündnis vorgeht und erste Erfolge in Aussicht stehen.

Anschließend fasst Constanze die zentralen Resultate der Mitmach-Aktion “Besser Radfahren” des SWR und des Klimabündnisses zusammen [ 11'45’’ ]. Bei dieser Aktion wurden die Rückmeldungen von über 10.000en Radfahrenden von Experten der Hochschule Karlsruhe ausgewertet. Die Daten stehen anonymisiert für eigene Auswertungen zur Verfügung: Download Ergebnisse der Mitmach-Aktion #BesserRadfahren.

Alle Beiträge des SWR zur Aktion findet Ihr unter www.swr.de/radfahren.

Der dritte Teil des “Achter” [ab 13'33’’] widmet sich dann dem OpenBikeSensor. Thomas unterhält sich mit Franziska Köppe über das zivilgesellschaftliche Forschungsprojekt. Sie sprechen über die Vision, die Franziska dabei vor Augen hat, über den aktuellen Stand und wohin die weiteren Entwicklungen gehen könnten. Sie diskutieren objektive und subjektive Sicherheit im Straßenverkehr. Sie hinterfragen geeignete Strategien, nicht zu eng überholt zu werden. Und wie individuelle wie kollektive Forschungsvorhaben in Familien, in Schulen oder beim Arbeitgeber aussehen könnten.

Zu hören ist das Gespräch via freie-radios.net unter “Achter” Juni 2021.

Viel Spaß beim Hören!

- \ No newline at end of file +Achter, das Fahrrad-Magazin für Stuttgart und Umgebung Ein Mal monatlich geht im Freien Radio Stuttgart das Fahrrad-Magazin “Achter” auf Sendung. Es ist ein Kessel “Buntes” zum Thema Fahrrad aus Berichten, Gesprächen mit Akteuren und viel Musik.">

OpenBikeSensor zu Gast im "Achter"

Zum internationalen Tag des Fahrrads (03.06.) hatte sich Thomas Albrecht, Fahrrad-Enthusiast aus Esslingen am Neckar und Moderator beim Freien Radio Stuttgart, einen Abstandsmesser von uns geliehen. Aus seiner Begeisterung für diesen Testlauf heraus lud er (unter anderen) Franziska zum Fahrrad-Magazin ein.

Achter, das Fahrrad-Magazin für Stuttgart und Umgebung

Ein Mal monatlich geht im Freien Radio Stuttgart das Fahrrad-Magazin “Achter” auf Sendung. Es ist ein Kessel “Buntes” zum Thema Fahrrad aus Berichten, Gesprächen mit Akteuren und viel Musik.

In der Juni-Ausgabe, stellt das Team zum Einen das “Radbündnis Filder” vor [ ab 0'41’’ ]. Hier diskutieren Evelyn Sindermann und Thomas die typischen Probleme, die sich an Gemarkungsgrenzen in Sachen Fahrrad-Infrastruktur ergeben. Evelyn berichtet, wie das Aktionsbündnis vorgeht und erste Erfolge in Aussicht stehen.

Anschließend fasst Constanze die zentralen Resultate der Mitmach-Aktion “Besser Radfahren” des SWR und des Klimabündnisses zusammen [ 11'45’’ ]. Bei dieser Aktion wurden die Rückmeldungen von über 10.000en Radfahrenden von Experten der Hochschule Karlsruhe ausgewertet. Die Daten stehen anonymisiert für eigene Auswertungen zur Verfügung: Download Ergebnisse der Mitmach-Aktion #BesserRadfahren.

Alle Beiträge des SWR zur Aktion findet Ihr unter www.swr.de/radfahren.

Der dritte Teil des “Achter” [ab 13'33’’] widmet sich dann dem OpenBikeSensor. Thomas unterhält sich mit Franziska Köppe über das zivilgesellschaftliche Forschungsprojekt. Sie sprechen über die Vision, die Franziska dabei vor Augen hat, über den aktuellen Stand und wohin die weiteren Entwicklungen gehen könnten. Sie diskutieren objektive und subjektive Sicherheit im Straßenverkehr. Sie hinterfragen geeignete Strategien, nicht zu eng überholt zu werden. Und wie individuelle wie kollektive Forschungsvorhaben in Familien, in Schulen oder beim Arbeitgeber aussehen könnten.

Zu hören ist das Gespräch via freie-radios.net unter “Achter” Juni 2021.

Viel Spaß beim Hören!

\ No newline at end of file diff --git "a/blog/2021/11/12/startschuss-f\303\274r-neues-openbikesensor-forum/index.html" "b/blog/2021/11/12/startschuss-f\303\274r-neues-openbikesensor-forum/index.html" index 3a5fdff6..cf6d85c3 100644 --- "a/blog/2021/11/12/startschuss-f\303\274r-neues-openbikesensor-forum/index.html" +++ "b/blog/2021/11/12/startschuss-f\303\274r-neues-openbikesensor-forum/index.html" @@ -1,17 +1,15 @@ -Startschuss für neues OpenBikeSensor-Forum | OpenBikeSensorStartschuss für neues OpenBikeSensor-Forum | OpenBikeSensor + - - - -

Startschuss für neues OpenBikeSensor-Forum

Wir haben vor Kurzem unser eigenes Forum gestartet, und nun heißt es offiziell: +Das Forum kann öffentlich gelesen werden. So sind bekannte Probleme und deren Lösungen auffindbar, Entscheidungen transparent nachvollziehbar, und die Einstiegshürde zum Projekt generell geringer.">

Startschuss für neues OpenBikeSensor-Forum

Wir haben vor Kurzem unser eigenes Forum gestartet, und nun heißt es offiziell: Herzlich willkommen im OpenBikeSensor Discourse:

https://forum.openbikesensor.org

Da wir uns aus verschiedenen Gründen von Slack verabschieden müssen und wollen, waren wir lange auf der Suche nach etwas neuem. Wir hoffen, dass das Forum für einen Großteil der Kommunikation zwischen Mitgliedern der Community der @@ -27,5 +25,4 @@ Koordinierung, sowie 1:1-Gespräche. Wir werden hier vermutlich eine Lösung mit Matrix anstreben, aber die genaue Umsetzung fehlt noch.

Vorerst bleibt der Slack wo er ist, aber wenn das Forum für die passenden Themen gut angenommen wird, werden wir hoffentlich bald einige Channel -archivieren können.

Wir sehen uns im Forum!

- \ No newline at end of file +archivieren können.

Wir sehen uns im Forum!

\ No newline at end of file diff --git "a/blog/2021/12/07/gr\303\274ndung-des-gemeinn\303\274tzigen-vereins-openbikesensor/index.html" "b/blog/2021/12/07/gr\303\274ndung-des-gemeinn\303\274tzigen-vereins-openbikesensor/index.html" index 4d52b465..ce201705 100644 --- "a/blog/2021/12/07/gr\303\274ndung-des-gemeinn\303\274tzigen-vereins-openbikesensor/index.html" +++ "b/blog/2021/12/07/gr\303\274ndung-des-gemeinn\303\274tzigen-vereins-openbikesensor/index.html" @@ -1,11 +1,9 @@ -Gründung des gemeinnützigen Vereins OpenBikeSensor | OpenBikeSensor - - - -

Gründung des gemeinnützigen Vereins OpenBikeSensor

Nach etwas mehr als drei Stunden war es endlich geschafft: Die Satzung +Gründung des gemeinnützigen Vereins OpenBikeSensor | OpenBikeSensor +

Gründung des gemeinnützigen Vereins OpenBikeSensor

Nach etwas mehr als drei Stunden war es endlich geschafft: Die Satzung verabschiedet, ein Vorstand gewählt, wir hatten einen Verein gegründet.

Gestern Abend, am 6. Dezember 2021, haben 16 Mitglieder der Community gemeinsam einen großen Schritt getan, um das Projekt OpenBikeSensor noch lange fortbestehen zu lassen. Wir haben einen Verein gegründet, der in Zukunft @@ -38,7 +36,7 @@ Vorstand. Ansonsten soll der Verein keineswegs die Arbeit der Community, wie sie bisher stattfand, einschränken. Entscheidungen werden weiter gemeinsam mit allen Interessierten gefällt, in formlosen Onlinetreffen und zwischendurch im -Forum, auf Github und via Chat, über Konsens- bzw. Widerstandsentscheide. Wenn +Forum, auf GitHub und via Chat, über Konsens- bzw. Widerstandsentscheide. Wenn du trotzdem Mitglied werden willst, um den Verein in seiner Arbeit zu unterstützen und einen finanziellen Beitrag zu leisten, kann die Aufnahme beim Vorstand beantragt werden. Wir werden in Kürze ein Antragsformular und eine @@ -46,5 +44,4 @@ IT-Infrastruktur, die im Moment auf verschiedene Personen verteilt sind. Nicht alles davon muss sich jetzt ändern, aber einiges wird. Diese Website zum Beispiel wird vermutlich in der Zukunft vom Verein übernommen, aber nach wie -vor von der Community bearbeitet.

Mehr Infos…

wird es in Zukunft auf der neuen Unterseite geben.

- \ No newline at end of file +vor von der Community bearbeitet.

Mehr Infos…

wird es in Zukunft auf der neuen Unterseite geben.

\ No newline at end of file diff --git a/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/index.html b/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/index.html index 0d3a84d3..d206b48f 100644 --- a/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/index.html +++ b/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/index.html @@ -1,9 +1,11 @@ -OpenBikeSensor mit Deutschem Fahrradpreis ausgezeichnet | OpenBikeSensor - - - -

OpenBikeSensor mit Deutschem Fahrradpreis ausgezeichnet

OpenBikeSensor und SimRa teilen sich den ersten Platz beim Deutschen Fahrradpreis 2022 in der Kategorie Kommunikation und Service.

Wir sind unglaublich stolz und froh, verkünden zu dürfen, beim diesjährigen Deutschen Fahrradpreis den ersten Preis in der Kategorie Kommunikation und Service gewonnen zu haben. Die Anerkennung bedeutet uns sehr viel, denn sie zeigt, wie wichtig und wertvoll die viele Arbeit ist, die wir bereits in dieses Projekt investiert haben.

Auch freut uns die Bestätigung, die unserer Zusammenarbeit mit SimRa durch die gemeinsame Verleihung des Preises zuteil wird. Wir nehmen das als Zeichen, hier auf dem richtigen Weg zu sein. Besonders bei den hochkarätigen Mitbewerbern hätten wir eine solche Platzierung eigentlich für unmöglich gehalten.

Wir haben schon viel Zeit in die Entwicklung und den Einsatz des OpenBikeSensors gesteckt, und sind noch lange nicht fertig. Natürlich werden wir das Preisgeld im Sinne des OpenBikeSensors verwenden. Die Community hat sich bereits getroffen und sich ausgetauscht über mögliche Projekte die, auch dank dieses Preises, dieses Jahr angegangen werden können. Unter anderem sind das:

  • Anschaffung und Bau einer Reihe OpenBikeSensoren, die zeitweise (z.B. für ein paar Monate) an lokale Initiativen oder Forschungsprojekte verliehen werden können.
  • Unterstützung bei der Organisation von Einzel- und Sammelbestellungen. Die genauen Maßnahmen müssen noch in der Community besprochen werden. Dies kann z.b. durch Vorrätighalten von Hardwarekomponenten, Tests der Komponenten von neuen Anbietern oder Anschaffungen von Werkzeug zum Verleih an Initiativen im Selbstbau geschehen.
  • Betrieb der technischen Infrastruktur zur Auswertung - zunächst für alle, die nicht in einer lokalen Initiative organisiert sind, welche den Betrieb übernehmen könnte.
  • Weitere sinnvolle Nutzungsmöglichkeiten fallen uns sicher noch ein, und wenn du selbst Ideen hast, kannst du sie natürlich bei uns in der Community einbringen!

Jetzt mitmachen!

Auch du kannst Teil des OpenBikeSensor-Projekts werden! Es werden immer Menschen gebraucht, die ihre Zeit und ihre Fähigkeiten einbringen. Das sind nicht nur technische Themen (Entwicklung und Dokumentation), sondern auch die Organisation der Community, von Hardwarebestellungen, und nicht zu vergessen die Kommunikation mit Entscheidungsträger:innen der Lokalpolitik und Medienvertreter:innen. Melde dich gerne bei uns im Forum oder schau dich auf dieser Website um, um mehr über das Projekt zu erfahren! Auf der Karte kannst du sehen, ob es in deiner Nähe schon Initativen gibt.

Besonders gefragt sind im Moment Python-, Embedded- oder Webentwickler:innen sowie Data Scientists. Wenn du dich hier auskennst und Interesse hast, deine Fähigkeiten im Sinne einer wissenschaftlichen Untersuchung der Verkehrswende einzusetzen, können wir auf jeden Fall deine Hilfe gebrauchen! Melde dich im Forum, bei Matrix, oder direkt auf Github, und hilf uns, die Auswertung der gesammelten Daten wieder einen großen Schritt voranzubringen!

- \ No newline at end of file +OpenBikeSensor mit Deutschem Fahrradpreis ausgezeichnet | OpenBikeSensor +

OpenBikeSensor mit Deutschem Fahrradpreis ausgezeichnet

OpenBikeSensor und SimRa teilen sich den ersten Platz beim Deutschen Fahrradpreis 2022 in der Kategorie Kommunikation und Service.

Wir sind unglaublich stolz und froh, verkünden zu dürfen, beim diesjährigen Deutschen Fahrradpreis den ersten Preis in der Kategorie Kommunikation und Service gewonnen zu haben. Die Anerkennung bedeutet uns sehr viel, denn sie zeigt, wie wichtig und wertvoll die viele Arbeit ist, die wir bereits in dieses Projekt investiert haben.

Auch freut uns die Bestätigung, die unserer Zusammenarbeit mit SimRa durch die gemeinsame Verleihung des Preises zuteil wird. Wir nehmen das als Zeichen, hier auf dem richtigen Weg zu sein. Besonders bei den hochkarätigen Mitbewerbern hätten wir eine solche Platzierung eigentlich für unmöglich gehalten.

Wir haben schon viel Zeit in die Entwicklung und den Einsatz des OpenBikeSensors gesteckt, und sind noch lange nicht fertig. Natürlich werden wir das Preisgeld im Sinne des OpenBikeSensors verwenden. Die Community hat sich bereits getroffen und sich ausgetauscht über mögliche Projekte die, auch dank dieses Preises, dieses Jahr angegangen werden können. Unter anderem sind das:

  • Anschaffung und Bau einer Reihe OpenBikeSensoren, die zeitweise (z.B. für ein paar Monate) an lokale Initiativen oder Forschungsprojekte verliehen werden können.
  • Unterstützung bei der Organisation von Einzel- und Sammelbestellungen. Die genauen Maßnahmen müssen noch in der Community besprochen werden. Dies kann z.b. durch Vorrätighalten von Hardwarekomponenten, Tests der Komponenten von neuen Anbietern oder Anschaffungen von Werkzeug zum Verleih an Initiativen im Selbstbau geschehen.
  • Betrieb der technischen Infrastruktur zur Auswertung - zunächst für alle, die nicht in einer lokalen Initiative organisiert sind, welche den Betrieb übernehmen könnte.
  • Weitere sinnvolle Nutzungsmöglichkeiten fallen uns sicher noch ein, und wenn du selbst Ideen hast, kannst du sie natürlich bei uns in der Community einbringen!

Jetzt mitmachen!

Auch du kannst Teil des OpenBikeSensor-Projekts werden! +Es werden immer Menschen gebraucht, die ihre Zeit und ihre Fähigkeiten einbringen. +Das sind nicht nur technische Themen (Entwicklung und Dokumentation), sondern auch die Organisation der Community, von Hardwarebestellungen, und nicht zu vergessen die Kommunikation mit Entscheidungsträger:innen der Lokalpolitik und Medienvertreter:innen. +Melde dich gerne bei uns im Forum oder schau dich auf dieser Website um, um mehr über das Projekt zu erfahren! Auf der Karte kannst du sehen, ob es in deiner Nähe schon Initativen gibt.

Besonders gefragt sind im Moment Python-, Embedded- oder Webentwickler:innen sowie Data Scientists. +Wenn du dich hier auskennst und Interesse hast, deine Fähigkeiten im Sinne einer wissenschaftlichen Untersuchung der Verkehrswende einzusetzen, können wir auf jeden Fall deine Hilfe gebrauchen! +Melde dich im Forum, bei Matrix, oder direkt auf GitHub, und hilf uns, die Auswertung der gesammelten Daten wieder einen großen Schritt voranzubringen!

\ No newline at end of file diff --git a/blog/_print/index.html b/blog/_print/index.html deleted file mode 100644 index 55944a2b..00000000 --- a/blog/_print/index.html +++ /dev/null @@ -1,103 +0,0 @@ -OpenBikeSensor Blog | OpenBikeSensor - - - -

OpenBikeSensor mit Deutschem Fahrradpreis ausgezeichnet

OpenBikeSensor und SimRa teilen sich den ersten Platz beim Deutschen Fahrradpreis 2022 in der Kategorie Kommunikation und Service.

Wir sind unglaublich stolz und froh, verkünden zu dürfen, beim diesjährigen Deutschen Fahrradpreis den ersten Preis in der Kategorie Kommunikation und Service gewonnen zu haben. Die Anerkennung bedeutet uns sehr viel, denn sie zeigt, wie wichtig und wertvoll die viele Arbeit ist, die wir bereits in dieses Projekt investiert haben.

Auch freut uns die Bestätigung, die unserer Zusammenarbeit mit SimRa durch die gemeinsame Verleihung des Preises zuteil wird. Wir nehmen das als Zeichen, hier auf dem richtigen Weg zu sein. Besonders bei den hochkarätigen Mitbewerbern hätten wir eine solche Platzierung eigentlich für unmöglich gehalten.

Wir haben schon viel Zeit in die Entwicklung und den Einsatz des OpenBikeSensors gesteckt, und sind noch lange nicht fertig. Natürlich werden wir das Preisgeld im Sinne des OpenBikeSensors verwenden. Die Community hat sich bereits getroffen und sich ausgetauscht über mögliche Projekte die, auch dank dieses Preises, dieses Jahr angegangen werden können. Unter anderem sind das:

  • Anschaffung und Bau einer Reihe OpenBikeSensoren, die zeitweise (z.B. für ein paar Monate) an lokale Initiativen oder Forschungsprojekte verliehen werden können.
  • Unterstützung bei der Organisation von Einzel- und Sammelbestellungen. Die genauen Maßnahmen müssen noch in der Community besprochen werden. Dies kann z.b. durch Vorrätighalten von Hardwarekomponenten, Tests der Komponenten von neuen Anbietern oder Anschaffungen von Werkzeug zum Verleih an Initiativen im Selbstbau geschehen.
  • Betrieb der technischen Infrastruktur zur Auswertung - zunächst für alle, die nicht in einer lokalen Initiative organisiert sind, welche den Betrieb übernehmen könnte.
  • Weitere sinnvolle Nutzungsmöglichkeiten fallen uns sicher noch ein, und wenn du selbst Ideen hast, kannst du sie natürlich bei uns in der Community einbringen!

Jetzt mitmachen!

Auch du kannst Teil des OpenBikeSensor-Projekts werden! Es werden immer Menschen gebraucht, die ihre Zeit und ihre Fähigkeiten einbringen. Das sind nicht nur technische Themen (Entwicklung und Dokumentation), sondern auch die Organisation der Community, von Hardwarebestellungen, und nicht zu vergessen die Kommunikation mit Entscheidungsträger:innen der Lokalpolitik und Medienvertreter:innen. Melde dich gerne bei uns im Forum oder schau dich auf dieser Website um, um mehr über das Projekt zu erfahren! Auf der Karte kannst du sehen, ob es in deiner Nähe schon Initativen gibt.

Besonders gefragt sind im Moment Python-, Embedded- oder Webentwickler:innen sowie Data Scientists. Wenn du dich hier auskennst und Interesse hast, deine Fähigkeiten im Sinne einer wissenschaftlichen Untersuchung der Verkehrswende einzusetzen, können wir auf jeden Fall deine Hilfe gebrauchen! Melde dich im Forum, bei Matrix, oder direkt auf Github, und hilf uns, die Auswertung der gesammelten Daten wieder einen großen Schritt voranzubringen!

Gründung des gemeinnützigen Vereins OpenBikeSensor

Nach etwas mehr als drei Stunden war es endlich geschafft: Die Satzung -verabschiedet, ein Vorstand gewählt, wir hatten einen Verein gegründet.

Gestern Abend, am 6. Dezember 2021, haben 16 Mitglieder der Community -gemeinsam einen großen Schritt getan, um das Projekt OpenBikeSensor noch lange -fortbestehen zu lassen. Wir haben einen Verein gegründet, der in Zukunft -das rechtliche Rahmenwerk für die großartige Arbeit der vielen ehrenamtlichen -Tätigkeiten in und um die Community bilden kann.

Die Arbeit in der Community läuft seit mehr als zwei Jahren sehr gut. Wir haben -gemeinsam schon viel erreicht, entwickelt, getüftelt, gemessen und bewegt. All -das können wir gut ohne eine rechtliche Struktur, doch manchmal stoßen wir an -Grenzen, wenn es um Finanzen geht zum Beispiel, um Verantwortung, oder um -Haftung.

Darum haben wir uns in den letzten Wochen gemeinsam auf den Weg gemacht, eine -juristische Person zu schaffen, die hier ihren Einsatz findet. Ein Verein -bildet die Grundlage, gemeinnützig zu agieren, Spenden und Fördergelder zu -erhalten, und für das festgelegte Ziel wieder ausgeben zu können. Außerdem löst -der Verein das Problem, dass keine Einzelperson rechtlich verantwortlich sein -möchte für das Handeln der Gemeinschaft.

Die Gründung war ein ganzer Batzen Arbeit. Als Autor dieses Blogeintrags möchte -ich (@opatut) hier herzlich allen danken, die maßgeblich dazu beigetragen -haben, dass die Gründung so reibungslos über die Bühne lief. Denen, die die -Satzung und Gründungsveranstaltung vorbereiteten, denen, die mit ihrer -Erfahrung uns zur Seite standen, und natürlich allen Gründungsmitgliedern für -ihre Teilnahme an den letzten Detailarbeiten und der gemeinsamen Durchführung -der Gründung.

Wie geht’s weiter?

Von den 16 Gründungsmitgliedern wurde ein Vorstand aus -sieben Personen gewählt, die sich nun um eine Menge Formalia kümmern werden. -Dazu gehören ein Termin im Notariat, Korrespondenz mit dem Finanzamt, die -Eröffnung und Führung eines Bankkontos und noch einige andere -Verwaltungsaufgaben. Das wird einige Monate dauern, bis ein “ordentlicher” -Vereinsbetrieb möglich ist.

Der Vorstand nach der Gründung besteht aus @rotger, @thomaso und @margit mit -den Beisitzenden @Mentra, @SubOptimal, @gluap und @opatut.

Was bringt eine Mitgliedschaft?

Eigentlich… nichts? Nun, sie gewährt selbstverständlich Stimmrecht in -Vereinsangelegenheiten und kostet einen kleinen Jahresbeitrag, der dem Verein -hilft, wiederkehrende Ausgaben z. B. für Infrastruktur zu decken. Das einzige, -wofür eine Mitgliedschaft im Verein Voraussetzung ist, ist die Ernennung zum -Vorstand. Ansonsten soll der Verein keineswegs die Arbeit der Community, wie -sie bisher stattfand, einschränken. Entscheidungen werden weiter gemeinsam mit -allen Interessierten gefällt, in formlosen Onlinetreffen und zwischendurch im -Forum, auf Github und via Chat, über Konsens- bzw. Widerstandsentscheide. Wenn -du trotzdem Mitglied werden willst, um den Verein in seiner Arbeit zu -unterstützen und einen finanziellen Beitrag zu leisten, kann die Aufnahme beim -Vorstand beantragt werden. Wir werden in Kürze ein Antragsformular und eine -Kontaktadresse dafür bereitstellen.

Wem gehört was?

Es gibt einiges an Anschaffung, Spendengeldern beim ADFC, sowie die -IT-Infrastruktur, die im Moment auf verschiedene Personen verteilt sind. Nicht -alles davon muss sich jetzt ändern, aber einiges wird. Diese Website zum -Beispiel wird vermutlich in der Zukunft vom Verein übernommen, aber nach wie -vor von der Community bearbeitet.

Mehr Infos…

wird es in Zukunft auf der neuen Unterseite geben.

Startschuss für neues OpenBikeSensor-Forum

Wir haben vor Kurzem unser eigenes Forum gestartet, und nun heißt es offiziell: -Herzlich willkommen im OpenBikeSensor Discourse:

https://forum.openbikesensor.org

Da wir uns aus verschiedenen Gründen von Slack verabschieden müssen und wollen, -waren wir lange auf der Suche nach etwas neuem. Wir hoffen, dass das Forum für -einen Großteil der Kommunikation zwischen Mitgliedern der Community der -richtige Platz ist. Vorteile sind vor allem:

  • Das Forum kann öffentlich gelesen werden. So sind bekannte Probleme und deren -Lösungen auffindbar, Entscheidungen transparent nachvollziehbar, und die -Einstiegshürde zum Projekt generell geringer.
  • Die Kommunikation verläuft automatisch in Threads. Neue und aktive Themen -landen ganz oben, es ist leichter die Diskussionen zu verfolgen. Starke -Moderationstools erlauben das “Aufräumen” und Aufbereiten von Informationen, -sodass Gesagtes langfristig hilfreich bleibt.
  • Wir haben datenschutztechnisch die Kontrolle und müssen keinem US-Konzern -unsere Daten anvertrauen.
  • Discourse, die Forumssoftware, ist Open Source. Es werden nicht plötzlich -hohe Kosten auf uns zukommen, wenn das Projekt “zu groß” geworden ist.

Was uns nun noch fehlt, ist eine Möglichkeit zur schnellen und unkomplizierten -“Ad-Hoc Kommunikation”, also ein Chat für kurzlebige Informationen oder -Koordinierung, sowie 1:1-Gespräche. Wir werden hier vermutlich eine Lösung mit -Matrix anstreben, aber die genaue Umsetzung fehlt noch.

Vorerst bleibt der Slack wo er ist, aber wenn das Forum für die passenden -Themen gut angenommen wird, werden wir hoffentlich bald einige Channel -archivieren können.

Wir sehen uns im Forum!

OpenBikeSensor zu Gast im "Achter"

Zum internationalen Tag des Fahrrads (03.06.) hatte sich Thomas Albrecht, Fahrrad-Enthusiast aus Esslingen am Neckar und Moderator beim Freien Radio Stuttgart, einen Abstandsmesser von uns geliehen. Aus seiner Begeisterung für diesen Testlauf heraus lud er (unter anderen) Franziska zum Fahrrad-Magazin ein.

Achter, das Fahrrad-Magazin für Stuttgart und Umgebung

Ein Mal monatlich geht im Freien Radio Stuttgart das Fahrrad-Magazin “Achter” auf Sendung. Es ist ein Kessel “Buntes” zum Thema Fahrrad aus Berichten, Gesprächen mit Akteuren und viel Musik.

In der Juni-Ausgabe, stellt das Team zum Einen das “Radbündnis Filder” vor [ ab 0'41’’ ]. Hier diskutieren Evelyn Sindermann und Thomas die typischen Probleme, die sich an Gemarkungsgrenzen in Sachen Fahrrad-Infrastruktur ergeben. Evelyn berichtet, wie das Aktionsbündnis vorgeht und erste Erfolge in Aussicht stehen.

Anschließend fasst Constanze die zentralen Resultate der Mitmach-Aktion “Besser Radfahren” des SWR und des Klimabündnisses zusammen [ 11'45’’ ]. Bei dieser Aktion wurden die Rückmeldungen von über 10.000en Radfahrenden von Experten der Hochschule Karlsruhe ausgewertet. Die Daten stehen anonymisiert für eigene Auswertungen zur Verfügung: Download Ergebnisse der Mitmach-Aktion #BesserRadfahren.

Alle Beiträge des SWR zur Aktion findet Ihr unter www.swr.de/radfahren.

Der dritte Teil des “Achter” [ab 13'33’’] widmet sich dann dem OpenBikeSensor. Thomas unterhält sich mit Franziska Köppe über das zivilgesellschaftliche Forschungsprojekt. Sie sprechen über die Vision, die Franziska dabei vor Augen hat, über den aktuellen Stand und wohin die weiteren Entwicklungen gehen könnten. Sie diskutieren objektive und subjektive Sicherheit im Straßenverkehr. Sie hinterfragen geeignete Strategien, nicht zu eng überholt zu werden. Und wie individuelle wie kollektive Forschungsvorhaben in Familien, in Schulen oder beim Arbeitgeber aussehen könnten.

Zu hören ist das Gespräch via freie-radios.net unter “Achter” Juni 2021.

Viel Spaß beim Hören!

Der OpenBikeSensor im Deutschlandfunk

Bereits am 09. Mai 2021 gab es einen Beitrag über den OpenBikeSensor in der Sendung Netzbasteln im Deutschlandfunk Nova. -Der Deutschlandfunk-Nova-Reporter Moritz Metz hat selbst einen OpenBikeSensor zusammengebaut und diesen “live” auf einer Bundesstraße in Brandenburg getestet.

Der ganze Beitrag findet sich auf deutschlandfunknova.de. -Auch auf Twitter hat Moritz Metz fleißig über den OpenBikeSensor berichtet.

Wir freuen uns sehr über diesen Beitrag.

Das Projekt OpenBikeSensor im Ersten

Am 26. März 2021 hat die ARD im Magazin „Brisant” einen Beitrag des -SWR zum Thema Überholabstände zu Radfahrenden ausgestrahlt, mit dabei unser -Projekt.

Der Beitrag beginnt mit erschreckenden Bildern von Überholvorgängen um das -Problem zu verdeutlichen. Als Beispiel wird die auch uns bekannte Strecke im -Stuttgarter Kaltental gezeigt.

Das Projekt OpenBikeSensor und unser Überholabstandsmesser werden dann als Teil -der Lösung vorgestellt.

Wir freuen uns sehr über diesen gelungenen Beitrag. In den Tagen nach der -Ausstrahlung kammen immer mehr neue Mitglieder in den Slack, die durch diese -öffentliche Aufmerksamkeit von OpenBikeSensor erfahren haben, und nun Teil der -immer weiter wachsenden Community geworden sind.

Den ganzen Fernsehbeitrag haben wir hier eingebunden, und auf swr.de -gibt es dazu auch noch einen schriftlichen Artikel.

OpenBikeSensor goes LGPL

Als Open-Source-Projekt freuen wir uns, bekanntgeben zu können, dass wir uns -auf eine gemeinsame Lizenz für unsere bestehenden und zukünftigen Software-, -Design- und Dokumentationswerke geeinigt haben.

Nach langer Diskussion hat sich die Community über die Grundsätze einer freien -und quelloffenen Arbeit verständigt, die das Projekt hoffentlich lange -begleiten werden.

Freier Zugang zu Information sowie deren freie Verwendung ist ein Grundsatz, der -uns allen sehr wichtig ist. Daher stand auch nie wirklich zur Diskussion, eine -Open-Source-Lizenz für unsere Werke zu wählen.

Wir haben uns gemeinsam entschieden, unsere Software-Projekte und -Hardware-Designs sowie die begleitende Dokumentation unter den Bedingungen der -GNU Lesser General Public License zu veröffentlichen.

Diese Lizenz entspricht unseren Wünschen nach folgenden Eigenschaften:

  • Alle dürfen die Werke verwenden, für private, öffentliche, kommerzielle und -alle weiteren Zwecke. Wir schränken die Freiheit der Nutzung nicht ein.
  • Alle dürfen die Werke weiterentwickeln, sofern die Weiterentwicklung unter -der gleichen Lizenz weiter veröffentlicht wird. In der Regel erfolgt dies -durch Rückführen der Änderung ins Originalprojekt, worüber wir uns sehr -freuen.
  • Eine kommerzielle Nutzung der Werke ist erlaubt, unter den Bedingungen der Lizenz. -Wir haben den starken Wunsch, dass Unternehmen, die unsere Werke nutzen, auch -unserem Grundsatz freier Daten folgen, und erhobene Daten in Form von Open -Data veröffentlichen bzw. in unsere Veröffentlichungen integrieren.
  • Die Entwicklung von Werken, die unsere Werke beinhalten oder integrieren, ist -erlaubt. Wir erzwingen mit der LGPL keine Verwendung einer bestimmten Lizenz, -wünschen uns aber natürlich auch hier freie Lizenzen.

Sind das nicht unnütze Hürden?

Es mag unintuitiv erscheinen, doch eine Lizenz für die Bestandteile eines -Projekts wie unseres ist keine Hürde für Menschen, die sich beteiligen wollen -– im Gegenteil! Ohne richtige Lizenz greift nämlich einzig und allein das -Urheberrecht, das die Nutzung oder Veränderung ohne Erlaubnis grundsätzlich -verbietet. Dank einer Lizenz haben alle einen fest definierten -Handlungsspielraum. Mit einer Open-Source-Lizenz speziell einen besonders -großen. Alle wissen, was sie tun dürfen.

Die Freiheit von Informationen und Werkzeugen (frei, nicht kostenlos!) ist ein -gesellschaftliches Gut, das wir fördern wollen. Dazu kommen viele strategische -Vorteile, die Open-Source-Projekte genießen, die es voranbringen.

Wenn du mehr zum Thema Open Source, Freiheit von Software und Informationen -wissen möchtest, schau dich doch einmal bei der Free Software -Foundation um.

Werde auch du auch Teil des OpenBikeSensors! Dank -Open-Source-Lizenz ist das einfach und unkompliziert möglich.

- \ No newline at end of file diff --git a/blog/index.html b/blog/index.html index 929e8910..34f689be 100644 --- a/blog/index.html +++ b/blog/index.html @@ -1,11 +1,8 @@ -OpenBikeSensor Blog | OpenBikeSensor - - - -

Einträge in 2022

  • Deutscher Fahrradpreis

    17.02.2022 in Blog

    Wir sind unglaublich stolz und froh, verkünden zu dürfen, beim diesjährigen Deutschen Fahrradpreis den ersten Preis in der Kategorie Kommunikation und Service gewonnen zu haben. Die Anerkennung bedeutet uns sehr viel, denn sie zeigt, wie wichtig und …

    Weiterlesen

Einträge in 2021

- \ No newline at end of file +Da wir uns aus verschiedenen Gründen von Slack verabschieden müssen und wollen, waren …

Weiterlesen

  • OpenBikeSensor zu Gast im "Achter"

    17.06.2021 in Blog

    Zum internationalen Tag des Fahrrads (03.06.) hatte sich Thomas Albrecht, Fahrrad-Enthusiast aus Esslingen am Neckar und Moderator beim Freien Radio Stuttgart, einen Abstandsmesser von uns geliehen. Aus seiner Begeisterung für diesen Testlauf heraus …

    Weiterlesen

  • Der OpenBikeSensor im Deutschlandfunk

    24.05.2021 in Blog

    Bereits am 09. Mai 2021 gab es einen Beitrag über den OpenBikeSensor in der Sendung Netzbasteln im Deutschlandfunk Nova. Der Deutschlandfunk-Nova-Reporter Moritz Metz hat selbst einen OpenBikeSensor zusammengebaut und diesen “live” auf …

    Weiterlesen

  • Das Projekt OpenBikeSensor im Ersten

    28.03.2021 in Blog

    Am 26. März 2021 hat die ARD im Magazin „Brisant” einen Beitrag des SWR zum Thema Überholabstände zu Radfahrenden ausgestrahlt, mit dabei unser Projekt. +Der Beitrag beginnt mit erschreckenden Bildern von Überholvorgängen um das Problem zu …

    Weiterlesen

  • OpenBikeSensor goes LGPL

    23.03.2021 in Blog

    Als Open-Source-Projekt freuen wir uns, bekanntgeben zu können, dass wir uns auf eine gemeinsame Lizenz für unsere bestehenden und zukünftigen Software-, Design- und Dokumentationswerke geeinigt haben. +Nach langer Diskussion hat sich die Community …

    Weiterlesen

  • \ No newline at end of file diff --git a/blog/page/1/index.html b/blog/page/1/index.html index 6b12f873..468297cf 100644 --- a/blog/page/1/index.html +++ b/blog/page/1/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/blog/ \ No newline at end of file +https://www.openbikesensor.org/blog/ + \ No newline at end of file diff --git a/community/_print/index.html b/community/_print/index.html deleted file mode 100644 index bcf87534..00000000 --- a/community/_print/index.html +++ /dev/null @@ -1,27 +0,0 @@ -Community | OpenBikeSensor - - - -

    Werde Teil der OpenBikeSensor-Community

    Der OpenBikeSensor ist ein offenes Projekt an dem alle teilnehmen können. Hilf -mit, den Sensor weiterzuentwickeln, auszuprobieren, Daten zu sammeln und -auszuwerten. So kannst du mitmachen:

    Fragen und Diskutieren

    Komm in unser Discourse-Forum, und diskutiere mit den anderen Interessierten -und Aktiven. Hier findet fast alles einen Platz: Unterstützung bei Problemen, -Lokalgruppen, Forschungs­projekte, Events, Entwicklungsthemen, und vieles mehr.

    Zum Forum

    Weiterentwickeln

    Was wir erstellen ist quelloffen, auf GitHub veröffentlichen wir den kompletten -Code. Hier findest Du auch alle Pläne und Anleitungen sowie die Software zur -Visualisierung der gesammelten Daten.

    Zu den GitHub-Repositories

    Austauschen

    Fast wöchentlich tauschen wir uns zu aktuellen Themen und zum Fortschritt der -Entwicklung aus. Neulinge und Interessierte sind hier herzlich willkommen, so -können wir einander gut kennen lernen und gemeinsam das Projekt voranbringen.

    So nimmst du teil

    Offene Treffen per Videochat

    Den direkten Austausch unseres Wissens und unserer aktuellen Arbeit nehmen wir -in offenen Treffen, meist montags, vor. Den Zugang zu diesem Videoraum halten -wir sehr leicht versteckt, damit keine Bots hereinkommen und uns stören oder -aufzeichnen. Daher ist ein Account im Forum (oder ein:e Freund:in, die schon -dabei ist) Voraussetzung für die Teilnahme – der Link und Code für den Raum -stehen in einem nicht-öffentlichen Bereich des -Forums.

    Auch wenn sich das aufgrund der Sicherheitsmaßnahmen nicht so anfühlt – du -bist herzlich zu diesen Treffen eingeladen, Neulinge sind immer willkommen!

    Das Forum

    Für langlebige Kommunikation verwenden wir in der Community -das Forum. Hier sind Inhalte auch nach Monaten -noch gut zu finden, und Besucher können auch ohne Anmeldung mitlesen.

    Matrix

    Echtzeitkommunikation findet in unserem Matrix-Space statt - Das ist ein föderiertes Netzwerk, -das sehr nutzerfreundliche Chatclients bietet - wenn du Slack und Konsorten bedienen -kannst, kannst auch einen Matrix Client bedienen.

    Früher haben wir hierfür Slack verwendet - Falls du dort durch die Archive -blättern willst, kannst du uns im Forum ansprechen - noch kann man dort -‘rein schauen.

    - \ No newline at end of file diff --git a/community/index.html b/community/index.html index 34582700..da19b348 100644 --- a/community/index.html +++ b/community/index.html @@ -1,10 +1,7 @@ -Community | OpenBikeSensor - - - -

    Werde Teil der OpenBikeSensor-Community

    Der OpenBikeSensor ist ein offenes Projekt an dem alle teilnehmen können. Hilf +Community | OpenBikeSensor +

    Werde Teil der OpenBikeSensor-Community

    Der OpenBikeSensor ist ein offenes Projekt an dem alle teilnehmen können. Hilf mit, den Sensor weiterzuentwickeln, auszuprobieren, Daten zu sammeln und -auszuwerten. So kannst du mitmachen:

    Fragen und Diskutieren

    Komm in unser Discourse-Forum, und diskutiere mit den anderen Interessierten +auszuwerten. So kannst du mitmachen:

    Fragen und Diskutieren

    Komm in unser Discourse-Forum, und diskutiere mit den anderen Interessierten und Aktiven. Hier findet fast alles einen Platz: Unterstützung bei Problemen, Lokalgruppen, Forschungs­projekte, Events, Entwicklungsthemen, und vieles mehr.

    Zum Forum

    Weiterentwickeln

    Was wir erstellen ist quelloffen, auf GitHub veröffentlichen wir den kompletten Code. Hier findest Du auch alle Pläne und Anleitungen sowie die Software zur @@ -23,5 +20,4 @@ das sehr nutzerfreundliche Chatclients bietet - wenn du Slack und Konsorten bedienen kannst, kannst auch einen Matrix Client bedienen.

    Früher haben wir hierfür Slack verwendet - Falls du dort durch die Archive blättern willst, kannst du uns im Forum ansprechen - noch kann man dort -‘rein schauen.

    - \ No newline at end of file +‘rein schauen.

    \ No newline at end of file diff --git a/contact/_print/index.html b/contact/_print/index.html deleted file mode 100644 index 133fb245..00000000 --- a/contact/_print/index.html +++ /dev/null @@ -1,20 +0,0 @@ -Kontakt | OpenBikeSensor - - - -

    Kontakt zum OpenBikeSensor-Projekt

    Für fast alle Angelegenheiten

    .. ist die OpenBikeSensor Community der richtige Anlaufpunkt. Bitte richte deine Fragen zu allen -Themen rund um technische Inhalte, Unterstützung bei der Beschaffung und dem -Bau von OpenBikeSensor Geräten, die technische Weiterentwicklung, die Nutzung -der Daten, und alle anderen Themen, die das Projekt voranbringen, über das -Forum an die Community.

    Die Community besteht aus einem losen Haufen interessierter Menschen, die ihre -Zeit und Fähigkeiten so gut sie können ehrenamtlich einbringen. Wir pflegen -daher keine verbindlichen personellen Verantwortlichkeiten für spezielle -Aufgabenbereiche. Auf Fragen antwortet, wer sich auskennt und die Zeit dazu hat -– und das klappt bei uns außerordentlich gut. Schrecke nicht davor zurück, -öffentlich um Hilfe zu bitten – viele andere werden davon ebenso profitieren.

    Impressum

    Diese Webseite wird betrieben vom OpenBikeSensor e. V.. Die Postanschrift des Vereins lautet:

    OpenBikeSensor e. V.
    Liststraße 43
    70180 Stuttgart

    Der Verein ist eingetragen beim Amtsgericht Stuttgart unter Vereinsregisternummer VR 725447.

    Der Verein wird vertreten durch den Vorstand. Vorsitzende des Vorstands sind:

    • Thomas Obst, erster Vorsitzender
    • Reinhard Otter, zweiter Vorsitzender
    • Margit Obst, Schatzmeisterin

    Der Vorstand ist erreichbar unter .

    Verantwortlich für redaktionelle Inhalte dieser Website ist Thomas Obst, -erreichbar als Vorsitzender des Vereinsvorstands über oben genannte -Vereinsanschrift.

    Kontakt per E-Mail

    Wenn du gar nicht weiter weißt, kannst du allgemeine Anfragen auch an senden. Bitte versuche dein Glück jedoch zunächst bei der Community. -Vertreter:innen der Presse wenden sich bitte an .

    Diese Postfächer werden von der Community verwaltet und empfangene Anfragen -unter Umständen zur Diskussion im Forum oder über andere Kanäle veröffentlicht. -Vertraulich zu behandelnde Inhalte nimmt der Vorstand (siehe oben) entgegen.

    - \ No newline at end of file diff --git a/contact/index.html b/contact/index.html index de68a8c1..f5953aba 100644 --- a/contact/index.html +++ b/contact/index.html @@ -1,8 +1,5 @@ -Kontakt | OpenBikeSensor - - - -

    Kontakt zum OpenBikeSensor-Projekt

    Für fast alle Angelegenheiten

    .. ist die OpenBikeSensor Community der richtige Anlaufpunkt. Bitte richte deine Fragen zu allen +Kontakt | OpenBikeSensor +

    Kontakt zum OpenBikeSensor-Projekt

    Für fast alle Angelegenheiten

    .. ist die OpenBikeSensor Community der richtige Anlaufpunkt. Bitte richte deine Fragen zu allen Themen rund um technische Inhalte, Unterstützung bei der Beschaffung und dem Bau von OpenBikeSensor Geräten, die technische Weiterentwicklung, die Nutzung der Daten, und alle anderen Themen, die das Projekt voranbringen, über das @@ -16,5 +13,4 @@ Vereinsanschrift.

    Kontakt per E-Mail

    Wenn du gar nicht weiter weißt, kannst du allgemeine Anfragen auch an senden. Bitte versuche dein Glück jedoch zunächst bei der Community. Vertreter:innen der Presse wenden sich bitte an .

    Diese Postfächer werden von der Community verwaltet und empfangene Anfragen unter Umständen zur Diskussion im Forum oder über andere Kanäle veröffentlicht. -Vertraulich zu behandelnde Inhalte nimmt der Vorstand (siehe oben) entgegen.

    - \ No newline at end of file +Vertraulich zu behandelnde Inhalte nimmt der Vorstand (siehe oben) entgegen.

    \ No newline at end of file diff --git a/css/prism.css b/css/prism.css index f55c4c6e..716b70d6 100644 --- a/css/prism.css +++ b/css/prism.css @@ -1,208 +1,4 @@ -/* PrismJS 1.21.0 +/* PrismJS 1.28.0 https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+csharp+cpp+go+java+markdown+python+scss+sql+toml+yaml&plugins=toolbar+copy-to-clipboard */ -/** - * prism.js default theme for JavaScript, CSS and HTML - * Based on dabblet (http://dabblet.com) - * @author Lea Verou - */ - -code[class*="language-"], -pre[class*="language-"] { - color: black; - background: none; - text-shadow: 0 1px white; - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - font-size: 1em; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, -code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { - text-shadow: none; - background: #b3d4fc; -} - -pre[class*="language-"]::selection, pre[class*="language-"] ::selection, -code[class*="language-"]::selection, code[class*="language-"] ::selection { - text-shadow: none; - background: #b3d4fc; -} - -@media print { - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } -} - -/* Code blocks */ -pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; -} - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background: #f5f2f0; -} - -/* Inline code */ -:not(pre) > code[class*="language-"] { - padding: .1em; - border-radius: .3em; - white-space: normal; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: slategray; -} - -.token.punctuation { - color: #999; -} - -.token.namespace { - opacity: .7; -} - -.token.property, -.token.tag, -.token.boolean, -.token.number, -.token.constant, -.token.symbol, -.token.deleted { - color: #905; -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.inserted { - color: #690; -} - -.token.operator, -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string { - color: #9a6e3a; - /* This background color was intended by the author of this theme. */ - background: hsla(0, 0%, 100%, .5); -} - -.token.atrule, -.token.attr-value, -.token.keyword { - color: #07a; -} - -.token.function, -.token.class-name { - color: #DD4A68; -} - -.token.regex, -.token.important, -.token.variable { - color: #e90; -} - -.token.important, -.token.bold { - font-weight: bold; -} -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} - -div.code-toolbar { - position: relative; -} - -div.code-toolbar > .toolbar { - position: absolute; - top: .3em; - right: .2em; - transition: opacity 0.3s ease-in-out; - opacity: 0; -} - -div.code-toolbar:hover > .toolbar { - opacity: 1; -} - -/* Separate line b/c rules are thrown out if selector is invalid. - IE11 and old Edge versions don't support :focus-within. */ -div.code-toolbar:focus-within > .toolbar { - opacity: 1; -} - -div.code-toolbar > .toolbar .toolbar-item { - display: inline-block; -} - -div.code-toolbar > .toolbar a { - cursor: pointer; -} - -div.code-toolbar > .toolbar button { - background: none; - border: 0; - color: inherit; - font: inherit; - line-height: normal; - overflow: visible; - padding: 0; - -webkit-user-select: none; /* for button */ - -moz-user-select: none; - -ms-user-select: none; -} - -div.code-toolbar > .toolbar a, -div.code-toolbar > .toolbar button, -div.code-toolbar > .toolbar span { - color: #bbb; - font-size: .8em; - padding: 0 .5em; - background: #f5f2f0; - background: rgba(224, 224, 224, 0.2); - box-shadow: 0 2px 0 0 rgba(0,0,0,0.2); - border-radius: .5em; -} - -div.code-toolbar > .toolbar a:hover, -div.code-toolbar > .toolbar a:focus, -div.code-toolbar > .toolbar button:hover, -div.code-toolbar > .toolbar button:focus, -div.code-toolbar > .toolbar span:hover, -div.code-toolbar > .toolbar span:focus { - color: inherit; - text-decoration: none; -} - +code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} +div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} diff --git a/css/swagger-ui.css b/css/swagger-ui.css deleted file mode 100644 index c61e5a85..00000000 --- a/css/swagger-ui.css +++ /dev/null @@ -1,4 +0,0 @@ -.swagger-ui{ - /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */font-family:sans-serif;color:#3b4151}.swagger-ui html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{background-color:transparent;-webkit-text-decoration-skip:objects}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui template{display:none}.swagger-ui [hidden]{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left{background-repeat:no-repeat;background-position:0}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top-ns{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right-ns{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom-ns{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left-ns{background-repeat:no-repeat;background-position:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bg-center-m{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top-m{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right-m{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom-m{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left-m{background-repeat:no-repeat;background-position:0}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top-l{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right-l{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom-l{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left-l{background-repeat:no-repeat;background-position:0}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:hsla(0,0%,100%,.9)}.swagger-ui .b--white-80{border-color:hsla(0,0%,100%,.8)}.swagger-ui .b--white-70{border-color:hsla(0,0%,100%,.7)}.swagger-ui .b--white-60{border-color:hsla(0,0%,100%,.6)}.swagger-ui .b--white-50{border-color:hsla(0,0%,100%,.5)}.swagger-ui .b--white-40{border-color:hsla(0,0%,100%,.4)}.swagger-ui .b--white-30{border-color:hsla(0,0%,100%,.3)}.swagger-ui .b--white-20{border-color:hsla(0,0%,100%,.2)}.swagger-ui .b--white-10{border-color:hsla(0,0%,100%,.1)}.swagger-ui .b--white-05{border-color:hsla(0,0%,100%,.05)}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.025)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.0125)}.swagger-ui .b--black-90{border-color:rgba(0,0,0,.9)}.swagger-ui .b--black-80{border-color:rgba(0,0,0,.8)}.swagger-ui .b--black-70{border-color:rgba(0,0,0,.7)}.swagger-ui .b--black-60{border-color:rgba(0,0,0,.6)}.swagger-ui .b--black-50{border-color:rgba(0,0,0,.5)}.swagger-ui .b--black-40{border-color:rgba(0,0,0,.4)}.swagger-ui .b--black-30{border-color:rgba(0,0,0,.3)}.swagger-ui .b--black-20{border-color:rgba(0,0,0,.2)}.swagger-ui .b--black-10{border-color:rgba(0,0,0,.1)}.swagger-ui .b--black-05{border-color:rgba(0,0,0,.05)}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.025)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.0125)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left{border-top-right-radius:0;border-bottom-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left-ns{border-top-right-radius:0;border-bottom-right-radius:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left-m{border-top-right-radius:0;border-bottom-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left-l{border-top-right-radius:0;border-bottom-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{top:0;right:0;bottom:0;left:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{top:0;right:0;bottom:0;left:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{top:0;right:0;bottom:0;left:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{top:0;right:0;bottom:0;left:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{*zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{float:left;_display:inline}.swagger-ui .fr{float:right;_display:inline}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{float:left;_display:inline}.swagger-ui .fr-ns{float:right;_display:inline}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .fl-m{float:left;_display:inline}.swagger-ui .fr-m{float:right;_display:inline}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{float:left;_display:inline}.swagger-ui .fr-l{float:right;_display:inline}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{text-decoration:none}.swagger-ui .link,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:hover{transition:color .15s ease-in}.swagger-ui .link:active{transition:color .15s ease-in}.swagger-ui .link:focus{transition:color .15s ease-in;outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.33333%}.swagger-ui .w-two-thirds{width:66.66667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.33333%}.swagger-ui .w-two-thirds-ns{width:66.66667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.33333%}.swagger-ui .w-two-thirds-m{width:66.66667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.33333%}.swagger-ui .w-two-thirds-l{width:66.66667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315{-webkit-transform:rotate(315deg);transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90-ns{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135-ns{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180-ns{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225-ns{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270-ns{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315-ns{-webkit-transform:rotate(315deg);transform:rotate(315deg)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .rotate-45-m{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90-m{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135-m{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180-m{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225-m{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270-m{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315-m{-webkit-transform:rotate(315deg);transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90-l{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135-l{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180-l{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225-l{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270-l{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315-l{-webkit-transform:rotate(315deg);transform:rotate(315deg)}}.swagger-ui .black-90{color:rgba(0,0,0,.9)}.swagger-ui .black-80{color:rgba(0,0,0,.8)}.swagger-ui .black-70{color:rgba(0,0,0,.7)}.swagger-ui .black-60{color:rgba(0,0,0,.6)}.swagger-ui .black-50{color:rgba(0,0,0,.5)}.swagger-ui .black-40{color:rgba(0,0,0,.4)}.swagger-ui .black-30{color:rgba(0,0,0,.3)}.swagger-ui .black-20{color:rgba(0,0,0,.2)}.swagger-ui .black-10{color:rgba(0,0,0,.1)}.swagger-ui .black-05{color:rgba(0,0,0,.05)}.swagger-ui .white-90{color:hsla(0,0%,100%,.9)}.swagger-ui .white-80{color:hsla(0,0%,100%,.8)}.swagger-ui .white-70{color:hsla(0,0%,100%,.7)}.swagger-ui .white-60{color:hsla(0,0%,100%,.6)}.swagger-ui .white-50{color:hsla(0,0%,100%,.5)}.swagger-ui .white-40{color:hsla(0,0%,100%,.4)}.swagger-ui .white-30{color:hsla(0,0%,100%,.3)}.swagger-ui .white-20{color:hsla(0,0%,100%,.2)}.swagger-ui .white-10{color:hsla(0,0%,100%,.1)}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:rgba(0,0,0,.9)}.swagger-ui .bg-black-80{background-color:rgba(0,0,0,.8)}.swagger-ui .bg-black-70{background-color:rgba(0,0,0,.7)}.swagger-ui .bg-black-60{background-color:rgba(0,0,0,.6)}.swagger-ui .bg-black-50{background-color:rgba(0,0,0,.5)}.swagger-ui .bg-black-40{background-color:rgba(0,0,0,.4)}.swagger-ui .bg-black-30{background-color:rgba(0,0,0,.3)}.swagger-ui .bg-black-20{background-color:rgba(0,0,0,.2)}.swagger-ui .bg-black-10{background-color:rgba(0,0,0,.1)}.swagger-ui .bg-black-05{background-color:rgba(0,0,0,.05)}.swagger-ui .bg-white-90{background-color:hsla(0,0%,100%,.9)}.swagger-ui .bg-white-80{background-color:hsla(0,0%,100%,.8)}.swagger-ui .bg-white-70{background-color:hsla(0,0%,100%,.7)}.swagger-ui .bg-white-60{background-color:hsla(0,0%,100%,.6)}.swagger-ui .bg-white-50{background-color:hsla(0,0%,100%,.5)}.swagger-ui .bg-white-40{background-color:hsla(0,0%,100%,.4)}.swagger-ui .bg-white-30{background-color:hsla(0,0%,100%,.3)}.swagger-ui .bg-white-20{background-color:hsla(0,0%,100%,.2)}.swagger-ui .bg-white-10{background-color:hsla(0,0%,100%,.1)}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:rgba(0,0,0,.9)}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:rgba(0,0,0,.8)}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:rgba(0,0,0,.7)}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:rgba(0,0,0,.6)}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:rgba(0,0,0,.5)}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:rgba(0,0,0,.4)}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:rgba(0,0,0,.3)}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:rgba(0,0,0,.2)}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:rgba(0,0,0,.1)}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:hsla(0,0%,100%,.9)}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:hsla(0,0%,100%,.8)}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:hsla(0,0%,100%,.7)}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:hsla(0,0%,100%,.6)}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:hsla(0,0%,100%,.5)}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:hsla(0,0%,100%,.4)}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:hsla(0,0%,100%,.3)}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:hsla(0,0%,100%,.2)}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:hsla(0,0%,100%,.1)}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-top:0;padding-bottom:0}.swagger-ui .pv1{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-top:0;margin-bottom:0}.swagger-ui .mv1{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-top:0;padding-bottom:0}.swagger-ui .pv1-ns{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2-ns{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3-ns{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4-ns{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5-ns{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6-ns{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7-ns{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-top:0;margin-bottom:0}.swagger-ui .mv1-ns{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2-ns{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3-ns{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4-ns{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5-ns{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6-ns{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7-ns{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-top:0;padding-bottom:0}.swagger-ui .pv1-m{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2-m{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3-m{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4-m{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5-m{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6-m{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7-m{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-top:0;margin-bottom:0}.swagger-ui .mv1-m{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2-m{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3-m{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4-m{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5-m{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6-m{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7-m{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-top:0;padding-bottom:0}.swagger-ui .pv1-l{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2-l{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3-l{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4-l{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5-l{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6-l{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7-l{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-top:0;margin-bottom:0}.swagger-ui .mv1-l{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2-l{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3-l{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4-l{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5-l{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6-l{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7-l{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.swagger-ui .stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.swagger-ui .strike{text-decoration:line-through}.swagger-ui .underline{text-decoration:underline}.swagger-ui .no-underline{text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{text-decoration:line-through}.swagger-ui .underline-ns{text-decoration:underline}.swagger-ui .no-underline-ns{text-decoration:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .strike-m{text-decoration:line-through}.swagger-ui .underline-m{text-decoration:underline}.swagger-ui .no-underline-m{text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{text-decoration:line-through}.swagger-ui .underline-l{text-decoration:underline}.swagger-ui .no-underline-l{text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps{font-variant:small-caps}.swagger-ui .truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps-ns{font-variant:small-caps}.swagger-ui .truncate-ns{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps-m{font-variant:small-caps}.swagger-ui .truncate-m{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps-l{font-variant:small-caps}.swagger-ui .truncate-l{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .center-m{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}@media screen and (min-width:30em){.swagger-ui .clip-ns{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .clip-m{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:60em){.swagger-ui .clip-l{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-out;transition:transform .25s ease-out;transition:transform .25s ease-out, -webkit-transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.swagger-ui .grow:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-in-out;transition:transform .25s ease-in-out;transition:transform .25s ease-in-out, -webkit-transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.swagger-ui .grow-large:active{-webkit-transform:scale(.95);transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{content:"";box-shadow:0 0 16px 2px rgba(0,0,0,.2);border-radius:inherit;opacity:0;position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;transition:opacity .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial{z-index:auto}.swagger-ui .z-unset{z-index:unset}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{padding-left:0;margin-left:0;list-style-type:none}.swagger-ui .nested-copy-indent p+p{text-indent:.1em;margin-top:0;margin-bottom:0}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{width:100%;max-width:100%;display:block}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{width:100%;max-width:1460px;margin:0 auto;padding:0 20px;box-sizing:border-box}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .opblock-tag{display:flex;align-items:center;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{font-size:24px;margin:0 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{font-size:14px;font-weight:400;flex:1;padding:0 10px;font-family:sans-serif;color:#3b4151}.swagger-ui .parameter__type{font-size:12px;padding:5px 0;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-weight:700;font-size:.9rem;margin-bottom:.5rem}.swagger-ui .examples-select{margin-bottom:.75em}.swagger-ui .examples-select__section-label{font-weight:700;font-size:.9rem;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-weight:700;font-size:.9rem;margin-bottom:.5rem}.swagger-ui .view-line-link{position:relative;top:3px;width:20px;margin:0 5px;cursor:pointer;transition:all .5s}.swagger-ui .opblock{margin:0 0 15px;border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19)}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{padding:0 40px;cursor:pointer}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{position:absolute;bottom:-15px;left:50%;width:120%;height:4px;content:"";-webkit-transform:translateX(-50%);transform:translateX(-50%);background:grey}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{display:flex;align-items:center;padding:8px 20px;min-height:50px;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-section-header>label{font-size:12px;font-weight:700;display:flex;align-items:center;margin:0 0 0 auto;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{font-size:14px;flex:1;margin:0;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary-method{font-size:14px;font-weight:700;min-width:80px;padding:6px 15px;text-align:center;border-radius:3px;background:#000;text-shadow:0 1px 0 rgba(0,0,0,.1);font-family:sans-serif;color:#fff}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:16px;display:flex;align-items:center;word-break:break-word;padding:0 10px;font-family:monospace;font-weight:600;color:#3b4151}@media (max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{font-size:13px;flex:1 1 auto;word-break:break-word;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary{display:flex;align-items:center;padding:5px;cursor:pointer}.swagger-ui .opblock .opblock-summary .view-line-link{position:relative;top:2px;width:0;margin:0;cursor:pointer;transition:all .5s}.swagger-ui .opblock .opblock-summary:hover .view-line-link{width:18px;margin:0 5px}.swagger-ui .opblock.opblock-post{border-color:#49cc90;background:rgba(73,204,144,.1)}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{border-color:#fca130;background:rgba(252,161,48,.1)}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{border-color:#f93e3e;background:rgba(249,62,62,.1)}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{border-color:#61affe;background:rgba(97,175,254,.1)}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{border-color:#50e3c2;background:rgba(80,227,194,.1)}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{border-color:#9012fe;background:rgba(144,18,254,.1)}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{border-color:#0d5aa7;background:rgba(13,90,167,.1)}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{opacity:.6;border-color:#ebebeb;background:hsla(0,0%,92.2%,.1)}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{width:100%;margin:20px 0;padding:10px;border:2px solid #d8dde7}.swagger-ui .model-example{margin-top:1em}.swagger-ui .tab{display:flex;padding:0;list-style:none}.swagger-ui .tab li{font-size:12px;min-width:60px;padding:0;cursor:pointer;font-family:sans-serif;color:#3b4151}.swagger-ui .tab li:first-of-type{position:relative;padding-left:0;padding-right:12px}.swagger-ui .tab li:first-of-type:after{position:absolute;top:0;right:6px;width:1px;height:100%;content:"";background:rgba(0,0,0,.2)}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{font-size:12px;margin:0 0 5px;padding:15px 20px;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{font-size:12px;margin:0 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{font-size:14px;margin:0;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{width:100%;padding:8px 40px}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{font-size:12px;margin:10px 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui .response-col_status{font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .response-col_status .response-undocumented{font-size:11px;font-family:monospace;font-weight:600;color:#909090}.swagger-ui .response-col_links{padding-left:2em;max-width:40em;font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .response-col_links .response-undocumented{font-size:11px;font-family:monospace;font-weight:600;color:#909090}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{font-size:12px;margin:0;padding:10px;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;border-radius:4px;background:#41444e;overflow-wrap:break-word;font-family:monospace;font-weight:600;color:#fff}.swagger-ui .opblock-body pre.microlight span{color:#fff!important}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{overflow-y:auto;max-height:400px;min-height:6em}.swagger-ui .download-contents{position:absolute;bottom:10px;right:10px;cursor:pointer;background:#7d8293;text-align:center;padding:5px;border-radius:4px;font-family:sans-serif;font-weight:600;color:#fff;font-size:14px;height:30px;width:75px}.swagger-ui .scheme-container{margin:0 0 20px;padding:30px 0;background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.swagger-ui .scheme-container .schemes{display:flex;align-items:flex-end}.swagger-ui .scheme-container .schemes>label{font-size:12px;font-weight:700;display:flex;flex-direction:column;margin:-20px 15px 0 0;font-family:sans-serif;color:#3b4151}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{padding:40px 0 60px;margin-top:1em;min-height:1px;display:flex;justify-content:center;align-items:center;flex-direction:column}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{font-size:10px;font-weight:700;position:absolute;top:50%;left:50%;content:"loading";-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-transform:uppercase;font-family:sans-serif;color:#3b4151}.swagger-ui .loading-container .loading:before{position:absolute;top:50%;left:50%;display:block;width:60px;height:60px;margin:-30px;content:"";-webkit-animation:rotation 1s linear infinite,opacity .5s;animation:rotation 1s linear infinite,opacity .5s;opacity:1;border:2px solid rgba(85,85,85,.1);border-top-color:rgba(0,0,0,.6);border-radius:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.swagger-ui .response-controls{padding-top:1em;display:flex}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;margin-bottom:.2em;font-size:.7em}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui section h3{font-family:sans-serif;color:#3b4151}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{text-decoration:inherit;color:inherit;cursor:pointer}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;justify-content:center;height:100%;font-size:1.2em;text-align:center;line-height:1.5em;padding:0 .6em}.swagger-ui .version-pragma__message>div{max-width:55ch;flex:1}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .btn{font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s;border:2px solid grey;border-radius:4px;background:transparent;box-shadow:0 1px 2px rgba(0,0,0,.1);font-family:sans-serif;color:#3b4151}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{border-color:#ff6060;background-color:transparent;font-family:sans-serif;color:#ff6060}.swagger-ui .btn.authorize{line-height:1;display:inline;color:#49cc90;border-color:#49cc90;background-color:transparent}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;color:#fff;border-color:#4990e2}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{padding:0 10px;border:none;background:none}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .expand-methods,.swagger-ui .expand-operation{border:none;background:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{width:20px;height:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{transition:all .3s;fill:#707070}.swagger-ui button{cursor:pointer;outline:none}.swagger-ui button.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui select{font-size:14px;font-weight:700;padding:5px 40px 5px 10px;border:2px solid #41444e;border-radius:4px;background:#f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+PHBhdGggZD0iTTEzLjQxOCA3Ljg1OWEuNjk1LjY5NSAwIDAxLjk3OCAwIC42OC42OCAwIDAxMCAuOTY5bC0zLjkwOCAzLjgzYS42OTcuNjk3IDAgMDEtLjk3OSAwbC0zLjkwOC0zLjgzYS42OC42OCAwIDAxMC0uOTY5LjY5NS42OTUgMCAwMS45NzggMEwxMCAxMWwzLjQxOC0zLjE0MXoiLz48L3N2Zz4=) right 10px center no-repeat;background-size:20px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);font-family:sans-serif;color:#3b4151;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui select[multiple]{margin:5px 0;padding:5px;background:#f7f7f7}.swagger-ui select.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui .opblock-body select{min-width:230px}@media (max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}.swagger-ui label{font-size:12px;font-weight:700;margin:0 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{min-width:100px;margin:5px 0;padding:8px 10px;border:1px solid #d9d9d9;border-radius:4px;background:#fff}@media (max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{max-width:175px}}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}.swagger-ui textarea{font-size:12px;width:100%;min-height:280px;padding:10px;border:none;border-radius:4px;outline:none;background:hsla(0,0%,100%,.8);font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{font-size:12px;min-height:100px;margin:0;padding:10px;resize:none;border-radius:4px;background:#41444e;font-family:monospace;font-weight:600;color:#fff}.swagger-ui .checkbox{padding:5px 0 10px;transition:opacity .5s;color:#303030}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{font-weight:400!important;font-style:italic;margin:0!important;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{position:relative;top:3px;display:inline-block;width:16px;height:16px;margin:0 8px 0 0;padding:5px;cursor:pointer;border-radius:1px;background:#e8e8e8;box-shadow:0 0 0 2px #e8e8e8;flex:none}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E") 50% no-repeat}.swagger-ui .dialog-ux{position:fixed;z-index:9999;top:0;right:0;bottom:0;left:0}.swagger-ui .dialog-ux .backdrop-ux{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.8)}.swagger-ui .dialog-ux .modal-ux{position:absolute;z-index:9999;top:50%;left:50%;width:100%;min-width:300px;max-width:650px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border:1px solid #ebebeb;border-radius:4px;background:#fff;box-shadow:0 10px 30px 0 rgba(0,0,0,.2)}.swagger-ui .dialog-ux .modal-ux-content{overflow-y:auto;max-height:540px;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{font-size:12px;margin:0 0 5px;color:#41444e;font-family:sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-content h4{font-size:18px;font-weight:600;margin:15px 0 0;font-family:sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-header{display:flex;padding:12px 0;border-bottom:1px solid #ebebeb;align-items:center}.swagger-ui .dialog-ux .modal-ux-header .close-modal{padding:0 10px;border:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui .dialog-ux .modal-ux-header h3{font-size:20px;font-weight:600;margin:0;padding:0 20px;flex:1;font-family:sans-serif;color:#3b4151}.swagger-ui .model{font-size:12px;font-weight:300;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{text-decoration:line-through}.swagger-ui .model-toggle{font-size:10px;position:relative;top:6px;display:inline-block;margin:auto .3em;cursor:pointer;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in, -webkit-transform .15s ease-in;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}.swagger-ui .model-toggle.collapsed{-webkit-transform:rotate(0deg);transform:rotate(0deg)}.swagger-ui .model-toggle:after{display:block;width:20px;height:20px;content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E") 50% no-repeat;background-size:100%}.swagger-ui .model-jump-to-path{position:relative;cursor:pointer}.swagger-ui .model-jump-to-path .view-line-link{position:absolute;top:-.4em;cursor:pointer}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{position:absolute;top:-1.8em;visibility:hidden;padding:.1em .5em;white-space:nowrap;color:#ebebeb;border-radius:4px;background:rgba(0,0,0,.7)}.swagger-ui .model p{margin:0 0 1em}.swagger-ui section.models{margin:30px 0;border:1px solid rgba(59,65,81,.3);border-radius:4px}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{margin:0 0 5px;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui section.models h4{font-size:16px;display:flex;align-items:center;margin:0;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;font-family:sans-serif;color:#606060}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{font-size:16px;margin:0 0 10px;font-family:sans-serif;color:#707070}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{margin:0 20px 15px;position:relative;transition:all .5s;border-radius:4px;background:rgba(0,0,0,.05)}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{position:absolute;top:8px;right:5px;opacity:.65}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{padding:10px;display:inline-block;border-radius:4px;background:rgba(0,0,0,.1)}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{font-size:16px;font-family:sans-serif;color:#505050}.swagger-ui .model-deprecated-warning{font-size:16px;font-weight:600;margin-right:1em;font-family:sans-serif;color:#f93e3e}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{font-size:12px;margin:-20px 15px 0 0;font-family:sans-serif;color:#3b4151}.swagger-ui .servers>label select{min-width:130px;max-width:100%}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;vertical-align:middle;padding-top:10px;padding-bottom:10px}.swagger-ui .servers table td:first-of-type{padding-right:2em}.swagger-ui .servers table td input{width:100%;height:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;padding:4px;font-size:16px;margin:0 1em}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{width:100%;padding:0 10px;border-collapse:collapse}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{width:174px;padding:0 0 0 2em}.swagger-ui table.headers td{font-size:12px;font-weight:300;vertical-align:middle;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{max-width:20%;min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{font-size:12px;font-weight:700;padding:12px 0;text-align:left;border-bottom:1px solid rgba(59,65,81,.2);font-family:sans-serif;color:#3b4151}.swagger-ui .parameters-col_description{width:99%;margin-bottom:2em}.swagger-ui .parameters-col_description input[type=text]{width:100%;max-width:340px}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameter__name{font-size:16px;font-weight:400;margin-right:.75em;font-family:sans-serif;color:#3b4151}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required:after{font-size:10px;position:relative;top:-6px;padding:5px;content:"required";color:rgba(255,0,0,.6)}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{font-size:12px;font-style:italic;font-family:monospace;font-weight:600;color:grey}.swagger-ui .parameter__deprecated{font-size:12px;font-style:italic;font-family:monospace;font-weight:600;color:red}.swagger-ui .parameter__empty_value_toggle{font-size:13px;padding-top:5px;padding-bottom:12px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .topbar{padding:10px 0;background-color:#1b1b1b}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{display:flex;align-items:center}.swagger-ui .topbar a{font-size:1.5em;font-weight:700;flex:1;max-width:300px;text-decoration:none;font-family:sans-serif;color:#fff}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{width:100%;margin:0;border:2px solid #62a03f;border-radius:4px 0 0 4px;outline:none}.swagger-ui .topbar .download-url-wrapper .select-label{display:flex;align-items:center;width:100%;max-width:600px;margin:0;color:#f0f0f0}.swagger-ui .topbar .download-url-wrapper .select-label span{font-size:16px;flex:1;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{flex:2;width:100%;border:2px solid #62a03f;outline:none;box-shadow:none}.swagger-ui .topbar .download-url-wrapper .download-url-button{font-size:16px;font-weight:700;padding:4px 30px;border:none;border-radius:0 4px 4px 0;background:#62a03f;font-family:sans-serif;color:#fff}.swagger-ui .info{margin:50px 0}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info pre{font-size:14px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{font-family:sans-serif;color:#3b4151}.swagger-ui .info a{font-size:14px;transition:all .4s;font-family:sans-serif;color:#4990e2}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{font-size:12px;font-weight:300!important;margin:0;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .info .title{font-size:36px;margin:0;font-family:sans-serif;color:#3b4151}.swagger-ui .info .title small{font-size:10px;position:relative;top:-5px;display:inline-block;margin:0 0 0 5px;padding:2px 4px;vertical-align:super;border-radius:57px;background:#7d8492}.swagger-ui .info .title small pre{margin:0;padding:0;font-family:sans-serif;color:#fff}.swagger-ui .auth-btn-wrapper{display:flex;padding:10px 0;justify-content:center}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{padding-right:20px;margin-right:10px}.swagger-ui .auth-container{margin:0 0 10px;padding:10px 20px;border-bottom:1px solid #ebebeb}.swagger-ui .auth-container:last-of-type{margin:0;padding:10px 20px;border:0}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{font-size:12px;padding:10px;border-radius:4px;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .scopes h2{font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{margin:20px;padding:10px 20px;-webkit-animation:scaleUp .5s;animation:scaleUp .5s;border:2px solid #f93e3e;border-radius:4px;background:rgba(249,62,62,.1)}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{font-size:14px;margin:0;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper hgroup{display:flex;align-items:center}.swagger-ui .errors-wrapper hgroup h4{font-size:20px;margin:0;flex:1;font-family:sans-serif;color:#3b4151}@-webkit-keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{color:#000;font-weight:400;white-space:pre-wrap;background:none;padding:0}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{font-size:14px;padding:5px 7px;border-radius:4px;background:rgba(0,0,0,.05);font-family:monospace;font-weight:600;color:#9012fe}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block} - -/*# sourceMappingURL=swagger-ui.css.map*/ \ No newline at end of file diff --git a/device/index.html b/device/index.html index 5b8f8991..127d9567 100644 --- a/device/index.html +++ b/device/index.html @@ -1,15 +1,11 @@ -Gerätevarianten | OpenBikeSensor - - - -

    Das Messgerät

    Kern unseres Projekts ist ein Gerät, das die Überholabstände beim Radfahren +Gerätevarianten | OpenBikeSensor +

    Das Messgerät

    Kern unseres Projektes ist ein Gerät, das die Überholabstände beim Radfahren aufzeichnet. Dieses Gerät haben wir als quelloffenes Design entwickelt, sodass du, wenn du magst, dir selbst eines bauen kannst und darfst! Hier siehst du alle -Varianten.

    OpenBikeSensor Lite

    In Entwicklung +Varianten.

    OpenBikeSensor Lite

    In Entwicklung
    • klein und leicht
    • minimaler Bauaufwand
    • wird mit Android-Handy und App kombiniert
    • sehr kostengünstig
    • wetterfest

    Entwicklung verfolgen

    OpenBikeSensor Pro

    In Entwicklung -
    • voller Funktionsumfang ohne Handy
    • bestückt bestellbar
    • wetterfest

    Entwicklung verfolgen

    - \ No newline at end of file +
    • voller Funktionsumfang ohne Handy
    • bestückt bestellbar
    • wetterfest

    Entwicklung verfolgen

    \ No newline at end of file diff --git a/docs/_print/index.html b/docs/_print/index.html deleted file mode 100644 index 3e0619f3..00000000 --- a/docs/_print/index.html +++ /dev/null @@ -1,1332 +0,0 @@ -OpenBikeSensor Dokumentation | OpenBikeSensor - - - -

    1 - Bedienungsanleitung

    Dieser Abschnitt hilft dir bei der Benutzung deines OpenBikeSensors (OBS). -Betrachte es wie ein Handbuch, das einem Gerät beiliegt, nur dass wir es nicht -ausdrucken müssen. Egal ob du deinen Sensor selbst zusammengebaut oder einen -vorgefertigten Sensor von jemand anderem bekommen hast, diese Anleitung -beschreibt, wie du wichtige Daten mit deinem neuen Gerät sammeln kannst.

    Falls du noch keinen OBS besitzt, schau in den Abschnitt “Hardware”. Dort -findest du Anleitungen zum Selberbau.

    1.1 - Schnellstart-Anleitung

    Diese Anleitung geht davon aus, dass du einen funktionierenden -OpenBikeSensor Classic hast.

    Sobald du einen OpenBikeSensor hast, solltest du ein paar Dinge damit tun:

    Funktionsprüfung

    Beim ersten Einschalten generiert der OpenBikeSensor ein Zertifikat, der erste Start kann deshalb etwas länger dauern. Das wird währenddessen auch auf dem Display angezeigt.

    Ab dem zweiten Einschalten sollte auf dem Display das OpenBikeSensor Logo angezeigt -werden und auf der rechten Seite ein paar Startmeldungen durchlaufen. Normalerweise steht -dort:

    • Versionsnummer
    • Batteriespannung (wird diese nicht angezeigt, könnte es sein, dass es ein problem mit dem Spannungsteiler gibt, mit dem die Batteriespannung gemessen wird.)
    • config...
    • <35|-|35> (Die konfigurierte linke und rechte Lenkerbreite, hier 35cm)
    • SD... OK
    • Start GPS OK
    • CSV file... OK
    • Wait for GPS (Sobald das GPS-Datum gefunden wurde durch die aktuelle Uhrzeit ersetzt)
    • 0Sats sn:98 (Anzahl der bereits gefundenen Satteliten, SNR)

    GPS testen

    Lege dein Gerät unter freiem Himmel hin und schalte es ein. Nach ein paar -Minuten sollte es von der Ansicht mit OpenBikeSensor Logo im Display -von allein in die Messansicht (ohne OpenBikeSensor Logo im Display) wechseln. -Geschieht dies nicht oder regelmäßig erst nach 10 oder mehr Minuten, sind -probleme am GPS-Modul oder der Antenne wahrscheinlich. In der Troubleshooting-Sektion findest du ein -paar Links zur weiteren Diagnose.

    Ultraschallsensor testen

    Um sicherzugehen, dass dein Gerät voll funktionsfähig ist, führe vor -der ersten Montage und danach regelmäßig (z.B. jedes mal nach dem Aufladen -des Akkus oder wöchentlich) folgenden Test durch:

    Halte dein Gerät im Freien eingeschaltet mit der linken Seite zum Himmel und -der rechten Seite nach unten in die Luft. Nachdem die Haltezeit für den -linksseitigen Messwert abgelaufen ist, sollte kein Messwert mehr angezeigt. -Hast du noch keinen GPS-Empfang und möchtest nicht warten, bis das GPS Empfang -hat, kannst du durch kurzes Drücken auf den Knopf am Display in die Messansicht -kommen.

    Werden trotzdem gelegentlich Messwerte angezeigt (und du befindest dich unter -freiem Himmel, also nicht unter einem Baum/ einer Brücke), gibt es ein Problem -mit dem Ultraschallsensor. In der Troubleshooting-Sektion -findest du weitere Informationen.

    Halte das Gerät nun mit der linken Seite in Richtung einer Wand, und gehe -langsam auf die Wand zu. Du solltest etwa ab 2.50m Abstand von der Wand im -Display eine abnehmende Distanz sehen. Siehst du keine Abstandsanzeige oder -erst bei deutlich unter 2,50 m Findest du in der Troubleshooting-Sektion -weitere Informationen.

    Wenn du den Sensor in der Ansicht mit allen Messwerten -benutzt, kannst du die gleiche Funktionsprüfung auch für den rechtsseitigen -Sensor durchführen.

    Inbetriebnahme

    1. Befestige die Halterung für den OpenBikeSensor und die Lenkerhalterung für -das Display. Dies funktioniert je nach Modell unterschiedlich. Siehe auch -Montageanleitung.
    2. Miss den Abstand vom Rand der Lenkstange zur Mitte des Fahrrads auf beiden -Seiten. Zieh jeweils die Hälfte der Breite des OpenBikeSensors ab, und gib -dies in den Einstellungen entsprechend als Abstands-Offset an. Wie du in den -Konfigurationsmodus kommst, siehst du in der Konfigurationsanleitung.
    3. Richte deine Privatsphäre-Zonen ein. Mit einer Karten-App auf einem -Smartphone lässt sich dein aktueller Standort bestimmen, den du dann -eintippen kannst.
    4. Prüfe, ob deine SD-Karte funktioniert und am besten auch leer ist. Der -OpenBikeSensor erwartet eine Fat32 Partition, SD-Karten werden üblicherweise -mit einer Fat32 Partition ausgeliefert, so dass sie im OpenBikeSensor direkt -Benutzt werden können. Neuere SD-Karten sind gelegentlich mit exFAT -formatiert und müssen auf FAT32 umformatiert werden.
    5. Lade den Akku des Gerätes mit einem USB-C Kabel und einem normalen -USB-Ladegerät auf. Die LED am Lademodul leuchtet rot während des Ladens und -wird blau, wenn der Akku voll ist. Achtung: Lade an einem USB-A-Port auf, -mit einem beidseitigen USB-C-Kabel oder einem Netzteil, das direkt in einen -USB-C-Stecker mündet funktioniert das Laden meist nicht, da das Lademodul -nicht USB-C-korrekt Ladespannung anfordert.
    6. Schalte das Gerät ein. Warte bis GPS-Koordinaten vorhanden sind. Dies kann -eine Weile dauern. Am schnellsten geht es, wenn das Geräte in Ruhe im Freien -liegt und nicht bewegt wird.
    7. Montiere den Sensor am Fahrrad und fahre los. Bitte achte auf den Verkehr um -dich herum und lass dich nicht durch das Gerät ablenken.
    8. Wenn dich ein Fahrzeug überholt (egal ob LKW, PKW, Bus, …) drück kurz auf -den Knopf. Es ist wichtig, dass auch Überholvorgänge mit ausreichend -Seitenabstand so markiert werden, um keine verzerrte Statistik zu erzeugen. -Versuche also, wirklich alle Überholvorgänge zu markieren.
    9. Nach deiner Fahrt schalte das Gerät aus. Dafür halte den Knopf am Display -gedrückt, während du den Strom abstellst. Nur so wird sichergestellt, dass -keine Daten verloren gehen.
    10. Du kannst deine Daten in ein Portal -hochladen, indem du einen Account erstellst, den API-Key von den -Profileinstellungen in die Konfiguration des OpenBikeSensors kopierst, und -im Konfigurationsmodus auf “Upload tracks” drückst, oder den Knopf am -Display gedrückt hältst. Für letzteres muss das Gerät in einem WLAN mit -Internetzugang sein.

    1.2 - Montage des Sensors am Fahrrad

    Überblick

    Diese Montageanleitung beschreibt die Möglichkeiten, wie ein OpenBikeSensor am -Fahrrad befestigt werden kann. Zur Auswahl stehen einige verschiedene Modelle, -um an möglichst vielen Fahrrädern eine einfache und sichere Montage zu -ermöglichen.

    • Sattelstützen-Halterung (Seat post mount), für die Montage unter dem -Sattel, an der Sattelstütze.
    • Oberrohr-Halterung (Top tube mount) sitzt auf dem Oberrohr des Rahmens.
    • Gepäckträger-Halterung (Bike rack mount) ist am Gepäckträger befestigt.

    Für die Befestigung des Displays am Lenker wird die Displayhalterung -verwendet, die universell ist.

    Die meisten Halterungen werden mit Kabelbindern befestigt. Sie bleiben -dauerhaft am Rad, das Gerät lässt sich davon jedoch abnehmen, um nicht im Regen -zu stehen oder gestohlen zu werden.

    Kompatibilität

    • Bei der Sattelstützenhalterung zeigt die Schiene zum Aufschieben des -Hauptgehäuses nach hinten. Hierfür passt ein OpenBikeSensor Hauptgehäuse der -Variante “Back Rider” (das ist das Standardmodell) am besten, mit dem “Top -Rider” an dieser Halterung stünde das Gehäuse senkrecht und so wäre das Logo -verdreht.
    • Die Halterungen für Oberrohr und Gepäckträger haben die Schiene oben, hierfür -ist ein “Top rider” Hauptgehäuse nötig, oder ein Adapter der einen “Back -rider” zu einem “Top rider” macht. Alternativ fährt der OpenBikeSensor -senkrecht, was für die Messergebnisse keinen Unterschied macht, aber nicht so -ästhetisch ist und zu einem um 90° gedrehten Logo führt.
    • Die Varianten “Back rider” und “Top Rider” werden in der Gehäusedokumentation erläutert.
    • Alle Halterungen haben die gleiche Schiene, die mit dem -StandardMountAdapter kompatibel ist. Dieser wird an der passenden Stelle am -Hauptgehäuse fest angeschraubt.
    • Für das Displaygehäuse gibt es nur eine Halterung.

    Halterungen für das Hauptgehäuse

    Sattelstützen-Halterung

    Diese Halterung wird mittels zweier Kabelbindern (max 8mm breit) an der -Sattelstütze befestigt. Zur Verdrehsicherung kann ein Stück Isolierband oder -Fahrradschlauch zwischen Sattelstütze und Halterung befestigt werden.

    Sattelstützenhalterung mit Kabelbindern an der Sattelstütze

    Gepäckträger-Halterung

    Die Gepäckträger-Halterung besteht aus mehreren Teilen:

    • 2 Seitenteile
    • 1 Mittelteil, das es in längs- und Quervariante gibt
    • 2 Stück Rundholz oder Aluminium-Rohr mit Durchmesser 10 mm, je nach -Größe des Gepäckträgers ca. 12-16 cm lang.

    Die Rundstäbe verbinden die drei 3D-gedruckten Teile und lassen sich auf die -benötigte Breite des Gepäckträgers anpassen. Seiten- und Mittelteile können -mithilfe von Einschmelzmuttern und M3x8 Schrauben auf die Stäbe geklemmt oder -für dauerhafte Montage mit den Stäben verklebt werden.

    Die Seitenteile werden mit Kabelbindern befestigt. Es gibt viele Möglichkeiten, -diese Konstruktion am Fahrrad anzubringen:

    Option 1, unterhalb der Gepäckauflagefläche, hängendOption 2, vorn auf dem Gepäckträger, vor dem BügelOption 3, unterhalb der Gepäckauflagefläche, auf den zweiten Längsrohren aufliegendOption 4, unterhalb des Rücklichts

    Die gewählte Option hängt stark vom Gepäckträger, dem Fahrrad, und der -gewünschten Nutzung ab. Nicht jede Montageart erlaubt die volle Nutzung des -Gepäckträgers und schränkt z. B. die Nutzbarkeit der Gepäckauflagefläche oder -die Anbringung von Satteltaschen ein. Ob die Nutzbarkeit eingeschränkt wird -hängt je nach Montageoption außerdem davon ab, ob ein Sensor angebracht ist -oder nicht. Insgesamt ist die Wahl der Montageart also sehr individuell.

    Ein alternatives Mittelteil ermöglicht auch eine Montage in Längsrichtung -(nicht gezeigt), bei der die “Seitenteile” auf zwei parallelen, quer zur -Fahrtrichtung verlaufenden Stangen aufliegen.

    Oberrohr-Halterung

    Die Oberrohrhalterung ist eine modifizierte Sattelstützenhalterung, die einen -breiteren Radius zum Rohr hat und nicht angewinkelt ist. Bei horizontaler -Montage zeigt die Schiene nach oben, also ist ein Top Rider Hauptgehäuse -nötig.

    Die Oberrohrhalterung sollte nur verwendet werden, wenn durch die Haltung -des/der Fahrer:in keine Beeinträchtigung der Messergebnisse vorliegt, z. B. -indem Arme oder Beine in den Bereich der Sensoren gelangen.

    Displayhalterung

    Das Display wird am Lenker in der Nähe des linken oder rechten Handgriffes -befestigt. Die ehemals verfügbaren Halterungen zum Anschrauben haben sich nicht -bewährt, weil sie häufig gebrochen sind. Stattdessen wird nur noch eine -Displayhalterung angeboten, diese wird mit zwei Kabelbindern oder alternativ mit -einer Schlauchschelle befestigt. Auch hier hilft ein Stück Klebeband oder alter -Fahrradschlauch gegen Verdrehen oder Verrutschen.

    Eine Halterung sollte reichen! Die mittlere, weiße Halterung zeigt das -aktuelle Modell mit Kabelbinder.

    Optimal ist es, wenn der Druckknopf in direkter Reichweite des Daumens liegt, -um beim Drücken die Hand nicht vom Lenker nehmen zu müssen -(Verkehrssicherheit).

    Befestigung des Geräts

    Zunächst muss der Sicherungsstift vorbereitet werden. Dafür wird in das -3D-gedruckte Bauteil ein Schraube (M3x16 bis M3x20) eingeschraubt. Diese sollte -fest darin sitzen, wenn sie nicht gut greift hilft ein wenig Sekundenkleber.

    Dann wird das Gerät seitlich auf die Halterungsschiene geschoben und mit den -Sicherungsstift gesichert. Der Stift wird dafür um 180° im Loch gedreht.

    Gerät von der Seite einschieben

    Sicherungsstift einstecken und drehen

    Es gibt Geräte mit sehr unterschiedlichen Kabellängen. Für große Tiefeinsteiger -werden bis zu 1,8m Kabel benötigt. Das Kabel muss auf jeden Fall so verlegt -werden, dass es während der Fahrt die Sicherheit nicht beeinträchtigt. Es kann -durch Umwickeln, wiederverwendbare Kabelbinder, Klebeband oder geeignete -Kabelclips gesichert werden.

    Kabel um Rahmen gewickelt

    Das Display wird von links auf die Halterung geschoben und hält sich selbst mit -den darin enthaltenen Magneten fest.

    Display auf die Halterung schieben

    1.3 - Einstellungen

    Diese Seite beschreibt, wie du an deinem OpenBikeSensor Classic die -Einstellungen änderst.

    Wenn du deinen OpenBikeSensor zum ersten mal benutzt, solltest du zunächst -einige wichtige Einstellungen anpassen. Mehr dazu unten bei “Wichtige -Einstellungen”.

    Konfigurationsmodus

    Zuerst musst du den OpenBikeSensor in den Konfigurationsmodus bringen. Schalte -das Gerät dafür aus, halte den Knopf am Display gedrückt, und schalte es wieder -ein. Nach einigen Sekunden kannst du den Knopf loslassen.

    Wenn du zuvor ein WLAN konfiguriert hast, wählt sich der Sensor nun in dieses -WLAN ein. Ansonsten, oder falls dieses WLAN nicht verfügbar ist, startet das -Gerät im “Access Point” Modus, in dem es selbst ein WLAN aufmacht, dessen Namen -mit “OpenBikeSensor” beginnt. In diesem Fall ist das WLAN-Passwort -12345678.

    Nimm nun ein Smartphone oder einen Computer zur Hand, und gehe mit diesem in -das gleiche Netz wie der OpenBikeSensor – entweder dein konfiguriertes -WLAN/Heimnetz, oder das WLAN das der OpenBikeSensor geöffnet hat. Öffne einen -Browser (z. B. Firefox) und gib dort in die Adressleiste die IP-Adresse ein, -die im Display des Gerätes steht.

    Es sollte sich nun die Login-Seite des OpenBikeSensors öffnen. Auf einem -Smartphone muss du möglicherweise die mobilen Daten deaktivieren, damit das -funktioniert.

    Login in das Konfigurationsmenü

    Zugang zum Konfigurationsmenü ist durch eine verschlüsselte Verbindung und eine PIN gesichert.

    Die verschlüsselte Verbindung benutzt du durch Klick auf go to https. Dein -Browser wird dir nun eine Zertifikatswarnung anzeigen, die du ignorieren darfst -(das solltest du normalerweise im Internet auf jeden Fall vermeiden – hier ist -es okay). Alternativ kannst du eine unverschlüsselte Verbindung benutzen, indem -du enable unencrypted access anklickst. Dies solltest du nur in sicheren -Drahtlosnetzen verwenden, zum Beispiel in deinem eigenen Heimnetz.

    Nach Auswahl des Konfigurationsmodus wird im Browser ein Nutzername und ein -Passwort verlangt. Der Benutzername ist egal, du kannst also zum Beispiel -obs eintippen, das Feld darf nur nicht leer bleiben. Das Passwort wird im -Display des Geräts angezeigt, es ist ein bis zu sechsstelliger Zahlencode.

    Wichtige Einstellungen

    Zum direkten Nutzen eines neuen OpenBikeSensors solltest du mindestens 3 -Einstellungen vornehmen:

    • Lenkerbreite
      • Miss den horizontalen Abstand deines linken und rechten Lenkerrands bis zur -Radmitte. Ein symmetrischer Lenker hat zum Beispiel 75cm Breite, das heißt -37.5cm auf jeder Seite. Ein asymmetrisches Fahrrad hat eventuell -unterschiedliche Werte.
      • Ziehe von beiden Werten (links und rechts) jeweils 2.5cm ab, um die Breite -des Sensors (5cm) zu korrigieren. Unser obiger Beispiellenker hat dann -einen Offset-Wert von je 35cm.
      • Diese Werte, in Zentimetern, trage unter General bei Offset Sensor Left -und Offset Sensor Right ein.
      • Speichern nicht vergessen.
      • Nun kann das Gerät den tatsächlichen Abstand zum Fahrrad ermitteln, nachdem -es den Abstand vom Sensor aus gemessen hat.
    • WLAN-Einstellungen zum Hochladen der Daten
      • Um deine Fahrten hochzuladen musst du dem OpenBikeSensor beibringen, ins -Internet zu kommen.
      • Trage dafür den Namen und das Passwort deines WLANs unter Wifi bei SSID -und Password ein. Achte auf korrekte Schreibweise inklusive Groß- und -Kleinschreibung bei beiden Einträgen.
      • Speichern nicht vergessen.
      • Beim nächsten Start in den Konfigurationsmodus wird das Gerät sich mit -diesem WLAN verbinden, und nur ein eigenes WLAN aufmachen, falls das nicht -klappt. Im Display kannst du sehen, in welchem WLAN das Gerät eingewählt -ist.
    • API-Schlüssel
      • Du wirst deine Fahrten vermutlich in ein regionales oder projektbezogenes -Portal hochladen wollen. Eine Liste verfügbarer Portale befindet sich im -Forum.
      • Erstelle einen Account auf dem ausgewählten Portal. Logge dich dort ein und -navigiere über dein Profilsymbol zur Einstellungsseite. Dort findest du -deinen “API-Schlüssel” (oder Englisch “API Key”).
      • Kopiere diesen Schlüssel und füge ihn unter General im Bereich Upload -User Data wieder ein.
      • Kopiere ebenfalls die “API URL” aus deinem Profil und füge sie ebenfalls -hier ein.
      • Speichern nicht vergessen.

    Mit diesen Einstellungen kannst du nun Fahrten korrekt aufzeichnen und dann -hochladen.

    Alle Einstellungen

    Eine sinnvolle Konfiguration ist voreingestellt und sollte nur bei Bedarf -verändert werden. Hier erklären wir die einzelnen Einstellungen im Detail.

    General

    • Sensor

      Bestimmt die Differenz zwischen dem Ende des Lenkers und der Außenkante des -OpenBikeSensors. Diese Werte werden automatisch von der aktuellen Messung -subtrahiert. Zusätzlich kannst du die linke und rechte Messung „vertauschen“, -falls du das Gerät am Fahrrad umgekehrt montierst.

    • GPS

      Du kannst festlegen, auf welche Weise das Gerät einen gültigen GPS-Fix -bestätigt und die Messungen beginnt. Typischerweise wird es den regulären -Betrieb aufnehmen, sobald es Kontakt zu 4 GPS-Satelliten hat.

    • Generic Display

      • drehen des Displays, falls du es über Kopf montiert hast
      • invertieren der hellen / dunklen Bereiche des Displays, was bei hellem Sonnenlicht helfen kann
    • Measurement Display

      Hier gibt es mehrere Optionen dafür, verschiedene Werte auf dem Display anzuzeigen:

      • „simple Mode“ – nur die Anzeige der Abstandsmessung nach links
      • Anzeige von linker / rechter Abstandsmessung
      • show satellite – Anzeige der Anzahl der vom Gerät erkannten GPS-Satelliten (mehr Satelliten – genauere Positionsbestimmung)
      • show velocity – Anzeige der aktuellen Geschwindigkeit (recht ungenau aufgrund der langsamen GPS-Messintervalle)
      • show confirmation stats – zählt Tastendruck und bestätigte Erkennung von Überholvorgängen
      • show nerd details for distance sensors – Anzeige der Sensor-Rohdaten und Anzahl der Messereignisse innerhalb einer Sekunde (hilfreich bei der Fehlersuche)
    • Privacy Options

      Um deine Privatsphäre zu wahren, kannst du dem Gerät mitteilen, dass es die -Aufzeichnung in der Nähe deiner Wohnung oder einer anderen Privatsphäre-Zone -unterdrücken soll. Es ist möglich hier generell keine Aufzeichnung zu machen, -oder nur den GPS-Track zu unterdrücken, aber immer noch alle bestätigten -Überholvorgänge zu speichern.

      Mehr Infos zu Privatsphäre-Zonen gibt es auf dieser Seite.

    • Upload User Data

      Einrichtung der Portalverbindung zum Hochladen der aufgezeichneten -Streckendaten. Wie diese korrekt eingerichtet wird, ist oben bei “Wichtige -Einstellungen” beschrieben.

    • Operation

      • Enable Bluetooth – aktivieren, wenn du den OpenBikeSensor mit einer kompatiblen Smartphone App, wie z.B. SimRa, verbinden willst
      • SimRa Mode – aktivieren, wenn du den OpenBikeSensor mit der SimRa App verbinden willst

    Privacy Zones

    Hier kannst du einzelne Privatzonen mit jeweils eigenem Mittelpunkt und Radius -festlegen. In den Privatsphäre-Optionen unter General entscheidest du, wie -sich der OpenBikeSensor innerhalb dieser Privatsphäre-Zone verhalten soll.

    WiFi Settings

    Der OpenBikeSensor kann sich mit einem verfügbaren WLAN verbinden, wenn du hier -dessen Zugangsdaten angibst. Dies ist notwendig für den Upload zum Portal und -außerdem praktisch, wenn du bei der Konfiguration des Sensors mit deinem -eigenen WLAN verbunden bleiben möchtest.

    Backup & Restore

    Hier kannst du Einstellungen des OpenBikeSensors auf deinem PC oder mobilen -Gerät sichern. Zum Wiederherstellen aus einer gespeicherten Konfiguration wähle -im Menü-Dialog die entsprechende Datei aus.

    Verwende diese Option vor einem Firmware-Update um sicherzustellen, dass du -deine Einstellungen wiederherstellen kannst, falls beim Update etwas -schiefgeht.

    Update Firmware

    Hier kannst du ein Update für die Firmware hochladen. Die neueste Version findest du immer -auf GitHub.

    Nach einem erfolgreichen Update wird der OpenBikeSensor automatisch neu -gestartet.

    Reboot

    Mit dieser Option startet das Gerät wieder in den regulären Messmodus und -verlässt die Einstellungen.

    1.4 - Aufzeichnung einer Messfahrt

    Vorbereitung

    Grundsätzlich muss vor Beginn einer Messfahrt der Ladezustand des Akkus geprüft -werden. Dazu das Gerät einschalten und die Spannungsanzeige im Display oben -rechts ablesen. Sie muss größer als 3,6 V sein. Bei Bedarf vor der Messfahrt -mittels USB-C Ladekabel nachladen.

    Das Gerät im Freien platzieren, einschalten und auf den korrekten GPS-Empfang -warten. Dies kann eine Weile dauern, auch mal bis zu 10 Minuten. Wir arbeiten -daran, dass dies in Zukunft eventuell schneller klappt.

    Bei empfangenen GPS Signal erscheint die reguläre Distanzanzeige für den linken -Überholabstand. Die korrekte Funktion kann gegen eine Wand überprüft werden:

    • Linken Sensor ins Freie ohne Hindernisse richten. Die Anzeige sollte --- cm zeigen.
    • Linken Sensor gegen eine Wand gerichtet (max. 2,50 m Abstand). Die Anzeige -sollte den Abstand, minus der halben Lenkerbreite (also bei -Standardeinstellung minus 35cm) anzeigen.

    Gerät am Fahrrad befestigen, wie unter „Montage“ beschrieben, und Messfahrt -beginnen. Die gefahrene Strecke (Track) wird aufgezeichnet.

    Datenschutz für Privatzonen

    Um in den veröffentlichten Aufzeichnungen den eigenen Wohnort unkenntlich zu -halten, wird empfohlen, die Messfahrt entfernt vom Wohnort zu starten und zu -beenden.

    Überholvorgänge markieren

    Prinzipiell werden kontinuierlich die Abstände links und rechts gemessen und -auf einer SD-Karte gespeichert. Darin sind alle Hindernisse innerhalb des -maximalen Messbereiches (285 cm) enthalten, auch Häuser, Masten, Radfahrer, -Fußgänger usw., die nicht dem Messzweck dienen. Nähert sich ein KFZ von -hinten, muss der Knopf am Display gedrückt werden, um den Überholvorgang zu -erfassen. Bitte achte dabei auf deine eigene Sicherheit: Es ist nicht notwendig, -während des Überholvorgangs selbst auf den Button zu drücken. Es ist ausreichend, -dies innerhalb von ca. 5 Sekunden nach der ersten Erfassung des Seitenabstands zu tun.

    Das Display bestätigt den Überholvorgang:

    • durch kurzes Invertieren der Anzeige
    • durch Hochzählen der Anzeige „press“
    • durch Hochzählen der Anzeige „conf“, falls dabei ein Objekt auf der linken Seite erkannt wurde

    Beenden der Messfahrt

    Bei gedrücktem Knopf das Gerät ausschalten. Nur so werden alle Messungen zuverlässig gespeichert.

    Die Aufzeichnung erfolgt in einer CSV-Datei mit einem Dateinamen, der von -Datum, Uhrzeit und der Geräte-ID abhängt, also zum Beispiel -2021-01-20T13.32.52-4495.obsdata.csv.

    1.5 - Tracks hochladen

    Voraussetzungen

    Damit Tracks hochgeladen werden können, müssen mindestens die unter “Wichtige -Einstellungen” aufgeführten Einstellungen vorgenommen worden sein. Das sind -die Einrichtung der WLAN-Verbindung sowie des API-Zugangs zum Portal.

    Mit WLAN verbinden

    Halte den Knopf des OpenBikeSensors gedrückt und schalte ihn dann ein. Nun wird -sich das Gerät in dein konfiguriertes WLAN einwählen. Sofern das klappt zeigt -der OpenBikeSensor den Namen des WLANs und die IP-Adresse im Display an.

    Kommt keine Verbindung zustande, macht der OpenBikeSensor nach 10 Sekunden einen -eigenen AccessPoint auf. Ein Hochladen der Tracks ist im AccessPoint-Modus -nicht möglich, da dann keine Verbindung zum Internet besteht. Verbinde dich -dann mit diesem Netzwerk wie unter Einstellungen beschrieben und stelle die WLAN-Details richtig ein.

    Upload starten

    Wenn der OpenBikeSensor mit einem WLAN verbunden ist, kann der Upload gestartet -werden, indem der Knopf gedrückt und gehalten wird, bis der Upload startet.

    Alternativ kann der Upload auch aus dem Konfigurationsmenü vom Handy oder PC -aus gestartet werden.

    1.6 - OpenBikeSensor mit der SimRa-App betreiben

    Es ist möglich, den OpenBikeSensor per Bluetooth mit der SimRa App zu verbinden. SimRa steht für “Sicherheit im Radverkehr” und ist eine App, die beim Radfahren aktiviert ist und über die Sensoren des Smartphones herauszufinden versucht, wann es gefährliche Situationen gab, die man anschließend beschreiben und bewerten kann. Durch die Kopplung mit dem OpenBikeSensor bekommt die SimRa App zusätzlich die Überholabstände.

    SimRa App installieren

    OpenBikeSensor konfigurieren

    In der Konfigurationsoberfläche des OpenBikeSensor aktiviert man im Untermenü “General” ganz unten Bluetooth im Bereich “Operation”:

    Bluetooth-Einstellungen im OpenBikeSensor

    SimRa Mode: Normalerweise wählt sich der OpenBikeSensor in ein WLAN ein bzw. -stellt einen WLAN-Hotspot zur Verfügung, wenn er ohne angeschlossenes Display -eingeschaltet wird. Aktiviert man den “SimRa Mode”, dann passiert das nicht.

    Wenn “SimRa Mode” aktiviert wird, dann startet der OpenBikeSensor nicht im -Server Modus, wenn das Display nicht angeschlossen ist.

    Nach dem Speichern kann man das Gerät neustarten.

    SimRa App einrichten

    Bluetooth muss natürlich auf dem Smartphone aktiviert sein.

    Android

    1. App starten.

    2. In die Einstellungen gehen und unten OpenBikeSensor aktivieren:

    3. OpenBikeSensor Einstellungen öffnen. Verfügbare Geräte werden gesucht.

    4. Auf den Eintrag mit “OpenBikeSensor xxx” drücken und anschließend auf “Verbinden” drücken.

    5. Der jeweils gemessene Wert sollte jetzt angezeigt werden.

    6. Jetzt muss man noch einstellen, wie breit der Lenker des Fahrrad (von der -Mitte) ist.

    7. Optional kann aktiviert werden, dass ein Foto mit dem Smartphone gemacht -werden soll, wenn der Überholabstand unterschritten wird. Dazu muss das -Smartphone natürlich entsprechend am Fahrrad befestigt und ausgerichtet -sein.

    In der SimRa App wird nun links unten ein blaues Bluetooth Symbol angezeigt, -wenn Bluetooth aktiviert ist und ein grünes Symbol, wenn der OpenBikeSensor -verbunden werden konnte.

    2 - OpenBikeSensor Classic

    2.1 - Überblick

    Der OpenBikeSensor Classic ist das Originalgerät, das seit 2018 in ehrenamtlicher Arbeit von vielen Beteiligten als Open Hardware Design entworfen und entwickelt wird.

    Die Classic Variante des OpenBikeSensors ist ein eigenständiges Design, das -alle benötigten Funktionalitäten zum Aufzeichnen von Überholabständen vereint. -Es wird in Handarbeit aus kommerziell verfügbaren Modulen (wie einem -GPS-Empfänger und Ultraschallsensoren) zusammengebaut. Das Ergebnis ist ein -robustes Gerät das leicht und ohne weitere Voraussetzungen bedient und gut -verliehen werden kann.

    Dieser Bereich der Dokumentation enthält die Bauteileliste, Bauanleitung, Links -zum Gehäuse und Hilfen beim Beschaffen der Teile.

    • Die Bauteileliste enthält alle benötigten elektronischen -Module und Einzelkomponenten, die mechanischen Bauteile wie Schrauben -und Muttern sowie jeglichen “Kleinkram” wie Kabel und Befestigungen.
    • Das Gehäuse wird im 3D-Druck-Verfahren hergestellt.
    • Die Hauptplatine wurde speziell für den -OpenBikeSensor entworfen und kann als Spezialanfertigung bei einem -Platinenhersteller anhand der bereitgestellten Designdateienen bestellt -werden.
    • Die Bauanleitung beschreibt, wie die -Bauteile auf der Hauptplatine installiert und das ganze ins Gehäuse -eingesetzt werden.

    Muss ich den OpenBikeSensor selbst bauen?

    Ja! Es gibt den OpenBikeSensor nicht als fertiges Gerät zu kaufen. Stattdessen -baust du ihn dir selbst zusammen.

    Du brauchst auch keine Angst zu haben, damit loszulegen – selbst wenn nicht -immer sofort offensichtlich ist, wie alles funktioniert, so ist es trotzdem -auch für Anfänger:innen möglich, erfolgreich einen Sensor anhand dieser -Anleitungen zu bauen. Und wenn das mal nicht klappt, gibt es genug Leute die -dir gern weiterhelfen, und ihr Wissen teilen.

    Vielleicht kannst du dich auch mit einigen Anderen in deiner Gegend -zusammentun. Schau in der Community vorbei oder -auf die Karte der Initiativen, und finde -Gleichgesinnte, mit denen du zusammen arbeiten und lernen kannst.

    Das Gerät besteht aus vielen Einzelteilen aus verschiedenen Quellen besteht. -Sammelbestellungen sind eine gute Möglichkeit, die Komplexität aufzuteilen und -für jede:n Einzelne:n zu verringern. Dabei sparen wir alle Geld, denn in Menge -bestellt sind viele Teile günstiger. Auch solche Sammelbestellungen werden in -der Community organsiert.

    OpenBikeSensor Classic Bausatz (alte Version)

    Hinweis für den Bau großer Stückzahlen

    Leider hatten wir in der Verangenheit immer wieder Probleme damit, dass die aus -China gelieferten fertigen Module nicht oder nur teilweise den Spezifikationen -entsprachen. Auch die Abmaße von Teilen ändern sich manchmal, z.B. bekamen wir -vom Lieferanten plötzlich größere Displays als üblich.

    Wenn du mehrere Geräte vom Typ OpenBikeSensor Classic herstellen möchtest, -empfiehlt es sich daher, zunächst einen Probelauf zu machen. So stellst du -sicher, dass die gelieferten Teile alle korrekt angekommen sind und den -Anforderungen entsprechen. Löte dafür einen der Bausätze vollständig zusammen -und baue ihn auch in das Gehäuse ein.

    Wenn du auf diese Weise bemerkst, dass Lieferanten plötzlich andere Teile -liefern, sprich es auf jeden Fall in der Community an. Vielleicht muss die Lieferantenliste angepasst werden, oder es gibt eine -einfache Änderung am Gehäuse, um auch mit den neuen Teilen kompatibel zu -werden. Der:die nächste freut sich!

    Alternativen

    Aufgrund der Vielfalt in dem Projekt und der unterschiedlichen Anforderungen -der Beteiligten gibt es auch eine Vielzahl Varianten für fast jedes Teil. Der -Einfachheit halber pflegen wir jedoch hier auf der Website, in den Anleitungen -und Bestelllisten, nur eine “Standard-Variante”. Diese ist zur Zeit:

    • PCB Version 00.03.12
    • Hauptgehäuse (ehem. “Vertical Case”)
    • Displaygehäuse (ehem. “SlideOnDisplay”)
    • eine Halterung nach jeweiligen Anforderungen

    Alternativen, wie alte Versionen oder andere Gehäuse, verlinken Aktive im Forum -oder auf GitHub. Dort kannst du dich gern umschauen, falls du eine Anpassung -wünscht und diese nicht selbst erfinden möchtest – vielleicht hat das ja schon -irgendwer getan.

    2.2 - Bauteile

    Diese Seite listet alle Bauteile auf, die bestellt oder hergestellt werden müssen, um einen OpenBikeSensor Classic zusammenzubauen.

    Bei manchen Komponenten funktionieren die Links auf die Produkte nicht mehr. Wir arbeiten zurzeit daran, bei neuen Lieferanten testzubestellen. Wenn du gerade bestellst, kannst du @gluap im Forum kontaktieren, um bei der Testbestellung dieser Komponenten mitzumachen.

    Bitte lies diese Seite sorgfältig durch, und auch den Abschnitt “Notizen”, denn -bei einige Teilen musst du aufpassen, das richtige zu erwischen.

    Einige Links könnten in der Zukunft kaputt gehen, wir werden dann versuchen -neue zu finden und Verkäufer:innen zu verlinken, mit denen wir gute Erfahrungen -gemacht haben.

    Diese Liste kann natürlich fehlerhaft oder veraltet sein. Bitte vergleiche die -Designdateien (Platine, Schaltplan, Gehäusedesign, …) mit deiner Bestellung, -um eventuelle Unterschiede festzustellen. Insbesondere wenn du größere Mengen -einkaufen möchtest (z.B. für Sammelbestellungen), oder die Bauteile aus China -geliefert werden und einige Wochen Lieferzeit haben, solltest du alles doppelt -überprüfen.

    Hinweise

    • ESP32 Development Board: Von diesem Modul existieren einige verschiedene -Versionen. Du brauchst die Variante mit 30 Pins. Diese wird oft unter der -Bezeichnung “ESP32 DEVKIT v1” verkauft.

    • SD-Karte: Billige SD-Karten haben schon öfters Probleme verursacht, wähle -lieber ein Markenprodukt. Versuche eine SD-Karte unter 100 MB/s zu bekommen, -z.B. SanDisk Karten mit 120 MB/s haben auch schon Probleme verursacht, da sie -die von uns verwendete Schnittstelle nicht mehr unterstützen.

    • GPS-Modul: Bevorzuge die Variante mit großer Antenne -(Link1, -Link2). Die Antennen -haben unterschiedliche Qualität und Kabellänge, bei Ersatzbedarf gibt es auch -günstige Weiterverkäufer:innen der Antennen in Deutschland.

    • Displaykabel: Hier solltest du auf keinen Fall sparen. Kaufe ein -LifY11Y-Kabel in hoher Qualität, oder die Verbindung zum Display könnte -darunter leiden und nur unzuverlässig funktionieren. Zwei Meter Länge sind -genug für große Fahrräder und ein paar extra Versuche bis das Crimpen klappt. -Cat5 oder Cat6 Netzwerkkabel könnten zwar elektronisch auch funktionieren, -sind aber in der Regeln nicht so flexibel und fühlen sich nicht so gut an.

    • JSN-SR04T: Hier musst du auf die richtige Version achten. Es gibt eine -ganze Menge Varianten, von denen viele nicht funktionieren. Wir haben auf -dieser Seite dokumentiert, welche wir -gefunden haben und wie gut die jeweils funktionieren.

    • Einige Bauteile können in größeren Mengen zu wesentlich günstigeren -Preisen gekauft werden. Bildet Sammelbestellungen um viel Geld zu sparen!

    • Von besonders günstigen Teile kannst du gern etwas mehr bestellen, als -Ersatz, falls etwas verloren oder kaputt geht (Widerstände, Schrauben und -Muttern, Crimp-Kontakte, Kabel und Litze, …)

    • Gehäuse müssen in PETG 3D-gedruckt werden. Es -gibt viele Versionen für verschiedene Zwecke und von verschiedenen Leuten. -Die Community pflegt aktiv ein bestimmtes Gehäuse für jede PCB-Version. -Schau’ dich im -Gehäuse-Repository -auf Github um. Du kannst dein Gehäuse selbst drucken, andere Mitglieder der -Community darum bitten, oder fertige Drucke anhand der Designdateien von -einem 3D-Druck-Service bestellen (das ist aber in der Regel relativ teuer).

    • PCB: Du benötigst ein PCB der passenden Version, speziell anhand der -Designdateien hergestellt. Dies sollte am besten -ebenfalls in großen Mengen bestellt werden, da der Stückpreis dann stark -sinkt. Frag’ auf jeden Fall im Slack nach, ob irgendwer noch welche auf Lager -hat, bevor du neue anfertigen lässt!

    Bauteile

    MengeBauteilLinks
    Module
    1ESP32-WROOM Development Board (Hinweis beachten)aliexpress.com - Wanzai Store (Variante ESP-32 30P)
    aliexpress.com - Win win. (Variante ESP-32 30P)
    aliexpress.com - KEWEITE Store (Variante ESP-32)
    10.96-Zoll OLED Displayaliexpress.com
    1USB-C Lademodulaliexpress.com 1
    aliexpress.com 2
    1SD-Karten-Modulaliexpress.com -androegg.de[forenthread]
    1Buck-Boost Modul for LiPo, 3.3V (Spannungsregler)Derzeit ist kein zuverlässiger Händler für dieses Modul bekannt. Module mit Beschriftung ``A1731i`` auf dem sechsbeinigen Bauteil **funktionieren NICHT**.
    118650 LiIon-Akku (mit Lötfahnen)akkuteile.de
    nkon.nl
    1SD-Karte, 16 GB / 32 GB (Hinweis beachten)amazon.de
    google Suche
    1GPS-NEO-6M Modul (Hinweis beachten)aliexpress.com 1
    aliexpress.com 2
    aliexpress.com 3
    aliexpress.com 4
    2JSN-SR04T Sensormodule (Hinweis beachten)EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
    EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
    androegg.de (JSN-SR04T-v3.0)
    Kleinteile
    112mm Drucktasteraliexpress.com -aliexpress.com
    1Miniatur-Kippschalterreichelt.de
    aliexpress.com
    ca. 2mDisplaykabel (Hinweis beachten)automation24.de
    Steckverbinder
    15 (+10 Ersatz)JST-XH Crimp-Kontakte (BXH-001T-P0.6)reichelt.de
    farnell.com
    3JST-XH Gehäuse 2-polig (XHP-2)reichelt.de
    2JST-XH Platinenstecker 2-polig 90°reichelt.de
    1JST-XH Gehäuse 4-polig (XHP-4)reichelt.de
    1JST-XH Gehäuse 5-polig (XHP-5)reichelt.de
    1JST-XH Platinenstecker 2-polig (B2B-XH-A)reichelt.de
    1JST-XH Platinenstecker 5-polig (B5B-XH-A)reichelt.de
    1Batteriekabel (gerade, 2-polig)reichelt.de
    1Platinenstecker für Batteriekabel (gerade, 2-polig, mit rot-schwarzen Kabeln, 2.54mm RM)pollin.de 1
    pollin.de 2
    1Winkelstiftleiste (mind. 10-polig, 2.54mm RM)reichelt.de
    1Stiftleiste gerade (mind. 11-polig, 2.54mm RM)reichelt.de
    2SMD-Buchsenleisten (15-polige, 2.54mm SMD, wechselseitig, BL LP 5 SMD)
    (15-polige Variante ist selten; 16-polige kann gekürzt werden)
    fischerelektronik.de
    Elektronische Bauelemente
    1Widerstand (THT) 10 kΩ, 250 mW, 5 %reichelt.de
    1Widerstand (THT) 150 kΩ, 250 mW, 5 %reichelt.de
    1Widerstand (THT) 300 kΩ, 250 mW, 5 %reichelt.de
    2Widerstand (THT) 1.1 kΩ, 250 mW, 5 %reichelt.de
    1Keramikkondensator 100 nF, 10 %reichelt.de
    2Elektrolytkondensator, radial, 22 µF, 10 V, niedrige ESRreichelt.de
    1Schottky-Diode, 60 V, 5 A, DO-201ADreichelt.de
    1Rückstellende Sicherung, max. 40 A - 30 V, 6.6 sec
    Typ PFRA, radiale Bauform
    reichelt.de
    Mechanische Bauteile
    4Neodym-Magnete, 20x10x2mmamazon.de -supermagnete.de (teuer, stark)
    4Neodym-Magnete, 3x3x3mmamazon.de -supermagnete.de
    28M3x8mm Zylinderschraube mit Innensechskant (DIN912). (1x GPS, 8x für zwei Gehäuseöffnungen, 3x Platine, 5x Deckel, 3x Display, 6x 2 Gepäckträgerhalterungen, 2x für Kabelzugentlastung), je nach Variante können weniger Schrauben reichen.
    1M3x30mm Zylinderschraube mit Innensechskant (DIN912) (für den Locking Pin)
    10M3 Mutter (DIN934) (je 4x für zwei Gehäuseöffnungen, 2x für Kabelzugentlastung, je nach Variante können weniger Muttern reichen.)
    18Gewindeeinsatz / Einpressmutter M3x5.7 (1x GPS, 5x Deckel, 3x Platine, 3x Display, 6x für 2 Gepäckträgerhalterungen, je nach Variante können weniger Muttern reichen.)amazon.de 1
    amazon.de 2
    4Kabelbinder (2x Batterie, 2x Displayhalterung
    2Kabelbinder (Sattelhalterung)
    Spezialanfertigungen
    1PCB v00.03.12github.com
    13D-Druck: Hauptgehäuse, Displaygehäuse, Halterung(en)Link

    Werkzeuge

    Diese Werkzeuge werden benötigt, um den Sensor zusammenzubauen. Das -spezialisierteste Werkzeug ist die Crimpzange, welche dein lokaler Hackspace / -Maker Space / Fab Lab sicherlich rumliegen hat. Eventuell musst du also nicht -jedes dieser Werkzeuge kaufen, wenn du eines ausleihen kannst.

    • Crimpzange für JST-XH Steckverbinder (andere Marken oder Zangentypen, die mit diesen Verbindern kompatibel sind, funktionieren auch, z.B. Engineer PA-09).
    • Ein guter, regelbarer Lötkolben oder eine Lötstation, mit entsprechender Lösung zur Entlüftung
    • Pinzetten
    • Seitenschneider (z.B. Knipex Super Knips)
    • Abisolierzange, (z.B. Knipex, Jokari- mit diesen beiden Zangen kann man auch denn Innenleiter der Ultraschallsensoren abisolieren)
    • Innensechskantschraubendreher 2,5mm für M3 (“Inbussschlüssel” oder Schraubendreher)
    • Persönliche Schutzausrüstung: Schutzbrille, eventuell Handschuhe, …
    • ESD-Schutzausrüstung (nicht zwingend notwendig, aber nutze sie, wenn du sie hast)

    Verbrauchsgüter

    Die meisten dieser Artikel gibt’s in jedem Elektroniklabor, wenn du also in -einem Maker Space oder ähnlichem arbeitest, kannst du sicher kleine Mengen -hiervon bekommen ohne die große Packung kaufen zu müssen.

    • Gutes Lötzinn, bleifrei
    • Enlötlitze
    • Isolierklebeband, bevorzugt Kapton-Band
    • Schrumpfschlauch (optional)
    • Etwa 25cm dünne (0.25 mm2 / 23 AWG) Litze

    2.3 - Platine

    Die Hauptplatine des OpenBikeSensor Classic verbindet alle Module und elektronisch Einzelbauteile miteinander. Hier beschreiben wir, wie du eine solche Platine bekommst.

    Ein sehr wichtiger Bestandteil des Gerätes ist die Platine, auch -„PCB” (englisch printed circuit board) genannt. Der schwierige -Teil hieran ist das „printed” – ein PCB ist ein professionell -hergestelltes Bauteil das schwierig selbst zu erstellen ist. Hier sind deine -Optionen:

    • Das PCB anhand der Designdateien von einem Platinenhersteller anfertigen -lassen. Je nachdem wo, in welcher Qualität und wie viele Platinen du -bestellst wird dies erstaunlich wenig bis sehr viel kosten.
    • Finde heraus, ob jemensch anders schon Platinen anhand der gleichen Dateien -hat herstellen lassen. Eventuell hat er:sie noch Exemplare übrig, frag am -besten in der Community nach.
    • Bastel dir selbst eine Platine, ganz im DIY-Stil. Da unseren Platinen jedoch -Durchkontaktierungen und beidseitige Leiterbahnen benötigen, ist das -besonders schwierig. Je nach Ausrüstung und Erfahrung ist es aber machbar. -Besonders viel günstiger als bestellen ist es allerdings vermutlich nicht.
    • Benutze keine Platine. Du kannst einen kompatiblen Sensor ganz ohne Platine -zusammenbauen, indem du die Komponenten mit Kabeln aneinander lötests. -Allerdings haben wir hierfür keine Anleitung und das Gehäuse wird auch nicht -passen. Orientiere dich am Schaltplan, den Rest musst du selbst herausfinden.

    PCB Layout-Parameter

    Wenn du dich für einen Hersteller entscheidest, solltest du sicherstellen, dass -folgende Layoutparameter unterstützt sind. In der Regel listet jeder Hersteller -auf der Website diese Informationen auf, und die Minimal- und Maximalgrößen -dürfen nicht unter- bzw. überschritten werden, sonst könnte die Herstellung -fehlschlagen.

    Wir verwenden in unseren Designs:

    • TODO: Via size, minimum trace width, milling path restrictions

    Gerber-Dateien

    TODO: Wo sind die Dateien zu finden?

    2.4 - Gehäuse

    In das Gehäuse des OpenBikeSensor Classic werden die elektronischen Komponenten eingebaut. Es wird im 3D-Druck-Verfahren selbst gefertigt.

    OpenBikeSensor Gehäusebausatz (alte Version)

    Es gibt viele Möglichkeiten, ein Gehäuse für deinen OpenBikeSensor zu bekommen. -Unter Umständen findest du in der Community hilfreiche Bastler:innen, die dir -ein Gehäuse herstellen – hierzu fragst du am besten im Forum nach.

    Eine andere Möglichkeit ist, einen lokalen Maker- oder Hackspace zu finden, in -dem 3D-Drucker und Know-How zur Verfügung stehen. Hierfür haben wir eine -Anleitung mit allen Details für den Druck von -OpenBikeSensor-Gehäuseteilen geschrieben.

    Natürlich kannst du die Elektronik auch in eine alte Plastikdose stecken und -Löcher hineinbohren für Sensoren und Kabel. Das mag wesentlich einfacher sein -und zum Ziel führen, ist aber im Betrieb eher unpraktisch. Du musst dir eine -Möglichkeit ausdenken, das ganze an dein Rad anzubringen und evtl. auch wieder -abnehmbar zu machen, um das Gerät zu laden oder zu warten. Es ist also -natürlich möglich, aber am Ende schöner und praktiabler ist der 3D-Druck – es -lohnt sich!

    Falls das Selbstdrucken dir zu aufwendig erscheint, oder du einfach keinen -Zugang zu einem 3D-Drucker in deiner Nähe hast, sind vielleicht auch -3D-Druck-Dienstleister eine Option für dich. Diese drucken Teile nach deinen -Dateien Anweisungen als Auftragsarbeit. Preisgünstige Anbieter nehmen für ein -komplettes OpenBikeSensor-Gehäuse ca. 20-30 €. Wenn du dich mit anderen zu -Erfahrungen hiermit austauschen möchtest, ist das Forum der richtige Ort!

    2.4.1 - Gehäusedruck

    In dieser Anleitung geht es darum, ein komplettes Gehäuse mit Halterungen -selbst zu drucken und herzustellen. Der Druck eines kompletten -OpenBikeSensor-Gehäusesatzes, oder auch nur von Teilen davon, ist problemlos -möglich, vorausgesetzt du hast einen 3D-Drucker zur Verfügung.

    Der 3D-Druck kostet ca. 5 € Material (Filamentkosten können variieren), -Verschleiß, Stromkosten und vor allem Zeit, ca. 10-20h Druckzeit muss man schon -einplanen.

    Drucker und Slicer

    Der Ultimaker 3 hat ein Displaygehäuse mit Zugentlastung fertig gedruckt.

    Für den Beispieldruck in dieser Anleitung verwenden wir einen Ultimaker 3. -Dieser hat zwei Extruder, sodass mit zwei Filamenten gleichzeitig gedruckt -werden kann. Das vereinfacht den Druck des Sensorgehäuses und des Deckels, da -für die Logos eine zusätzliche Farbe verwendet werden kann. Bei einem Drucker -mit nur einem Extruder muss während des Drucks das Filament gewechselt werden. -Hierfür gibt es verschiedene Strategien, die je nach Drucker, Firmware und -Slicer variieren. Alternativ können alle Teile auch einfach ohne Logo mit nur -einem Filament gedruckt werden.

    Wichtig ist die Slicer-Software, die den Druck für den jeweiligen Drucker -aufbereitet. Für den Ultimaker (und viele andere Drucker) kann Cura von der -offiziellen Website -heruntergeladen und kostenlos verwendet werden (für Linux, Windows und macOS). -Eine starke Alternative ist der Prusa -Slicer. Die Wahl des Slicers hängt von -persönlicher Präferenz und den unterstützten Druckern ab, sowie in -Spezialfällen den unterstützten Features. Beide Slicer eignen sich für den -Druck von OpenBikeSensor-Gehäuseteilen.

    Material und Farben

    Das empfohlene Material für den Druck der Gehäuseteile ist PETG, das Material -mit den meisten Vorteile für unser Projekt:

    • hohe Schlagfestigkeit und dennoch flexibel – wichtig für den Einsatz am Fahrrad
    • hydrophob, wasserabweisend, witterungsbeständig – wichtig für Außeneinsatz
    • geruchsneutrales Drucken – erleichtert das Drucken auch zu Hause
    • niedrige Viskosität (Zähigkeit)
    • verfügbar in vielen verschiedenen Farben, sogar transparent

    Nachteilig ist allerdings die UV Beständigkeit, die nicht so hoch ist wie bei -ABS oder ASA. Doch die Vorteile überwiegen diese Einschränkung.

    Beispiel eines gedruckten Gehäuses mit Logos

    Druckvorbereitung

    Alle Dateien für das OpenBikeSensor Projekt wie Software, Firmware, Dokumentation und auch die 3D-Druckdateien liegen auf GitHub. Das Repository für die Gehäusedaten ist:

    Die Gehäuselemente werden unterschieden in die Bestandteile

    • Hauptgehäuse (MainCase)
    • Displaygehäuse (DisplayCase)
    • Halterungen (Mounting)

    Ein ZIP-Archiv mit allen aktuellen Dateien, sowohl dem Quelltext als auch den -exportierten STL-Dateien für den 3D-Druck können von GitHub direkt -heruntergeladen werden:

    Im Archiv befindet sich ein Ordner export/ mit den obigen Kategorien, und -darin sind jeweils die STL-Dateien für den Slicer zu finden.

    Allgemeines Vorgehen

    Der Import einer STL-Datei in eine Slicer Software (wie z.B. Cura) ist der -erste Schritt um ein 3D Objekt zu drucken. Im Slicer wird das 3D-Objekt so auf -die Druckplatte gelegt, sodass es möglichst wenig Überhänge gibt:

    1. So sollte es aussehen, kann aber in dieser Lage so nicht gedruckt werden2. Drucken mit dem Gesicht nach unten

    Die STL-Dateien werden in der Regel so generiert, dass sie nach dem importieren -bereits in der empfohlenen Lage auf dem Druckbett liegen. Auf Support kannst du -dann in der Regel verzichten, denn bei der Modellierung wird bereits die -supportfreie Druckbarkeit beachtet. Du kannst dich natürlich auch anders -entscheiden und die Objekte drehen, sollte dein Drucker oder Slicer sonst keine -guten Ergebnisse liefern.

    Als nächstes werden der richtige Drucker, das Filament und die -Druckeinstellungen (Infull, Support, Geschwindigkeit, Schichtdicke, …) -gewählt. Hier gilt, dass du dich am besten an den Vorgaben der Hersteller (von -Drucker und Filament) orientierst, aber auch immer ein bisschen experimentierst -und die für dich und deinen Anwendungsfall richtigen Einstellungen findest. -Informationsmaterial, Anleitungen und Tutorials gibt es massenweise im Netz.

    1. Cura view auf main case im Vorbereitungsmode2. Einstellung auf PETG und 2 Extruder3. Settings für Druckdichte (Infill), Support, Düsendurchmesser4. starte Slicing

    Beim eigentlichen “Slicen” erstellt Cura nun eine GCODE-Datei, die alle Befehle -für den speziellen Drucker und das Material enthält (z.B. Bewegungen, -Temperaturen, etc.).

    1. Nachdem alle Einstellungen erfolgt sind, wird das Slicing gestartet 2. Slicing information gibt es im Preview, mit den beiden Schiebern unten und rechts kann man jede einzelne Bahn des Extruders verfolgen

    Die GCODE-Datei wird nun auf den 3D-Drucker übertragen. Je nach Druckermodell -geschieht dies über WLAN, mithilfe einer SD-Karte oder eines USB-Sticks, oder -der Drucker ist direkt (per USB) am PC angeschlossen. Das genaue Verfahren ist -im Handbuch des Druckers vermutlich beschrieben.

    Im Menü des Druckers wird die erstellte GCODE-Datei für den Druck ausgewählt -und der Druck gestartet. Ab hier übernimmt der Roboter die Arbeit für uns, und -wenn wir alles richtig eingestellt haben, ist in einigen Minuten bis Stunden -ein neues Gehäuseteil fertig.

    Hauptgehäuse

    Das Hauptgehäuse enthält den Großteil der Elektronik (PCB, Sensorboards, -SD-Karte, GPS, Hauptschalter, Ladeelektronik) sowie die zwei Abstandssensoren, -die GPS-Antenne und die Batterie.

    Sowohl das Hauptteil als auch der Deckel können mit einem Logo gedruckt werden. -Dies ist ein wenig mehr Aufwand, lohnt sich aber optisch sehr, und es hilft -erfahrungsgemäß auch dabei, auf der Straße auf das Gerät angesprochen zu werden -und dem Projekt mehr Aufmerksamkeit zu generieren. Details zum Druck des Logos findest du hier: Logo-Druck (mehrfarbig).

    Die Teile zum Drucken:

    Die ersten zwei Teile gibt es jeweils auch mit OpenBikeSensor-Logo. Für jedes -Bauteil sind hierfür vier Dateien verfügbar. Das Logo kann invertiert oder -normal gedruckt werden, und für den Zweifarben-Druck sind pro Bauteil zwei -Dateien nötig (main und highlight), die die in der jeweiligen Farbe zu -druckenden Bestandteile repräsentieren. Hier sind demnach alle acht Dateien für das -OBS-Logo.

    Das Bauteil StandardMountAdapter gehört zwar eigentlich zu den Halterungen, -wird aber fest am Hauptgehäuse angebracht und bildet eine Hälfte des -Befestigungsmechanismus. Es gehört also auch irgendwie zum Hauptgehäuse.

    Das Bauteil AttachmentCover verschließt die Öffnung des Standardgehäuses, -an der nicht die Halteklammer montiert wird. Dieses Teil wird nicht benötigt, -wenn das Gehäuse ohne zweite Öffnung verwendet wird.

    Die Bauteile des Hauptgehäuses auf dem Druckbett

    Fahrradhalterung

    Zwei Halterungen, das SeatPostMount und eine alte Variante des TopTubeMount.

    Es gibt verschiedene Möglichkeiten, den OBS Sensor am Fahrrad zu montieren. Wie die Halterungen angebracht werden und aussehen, ist in der Montageanleitung zu sehen.

    1. Standard: Sattelhalterung, an der Sattelstange hinter -dem/der Fahrer:in montiert.
    2. Oberrohr-Halterung: Wenn die Sattelhalterungen nicht -verwendbar sind, kann die Montage weiter vorne an der Querstange erfolgen.
    3. Gepäckträgerhalterung: Dreiteilig, wird mit etwas Rundstab oder -Alu-Rundprofil verbunden. Kann auf, unter oder hinter dem Gepäckträger -montiert werden.

    Außerdem nötig ist ein Sicherungsstift (LockingPin). Das Display wird mit der -dazugehörigen Schiene (Mounting/HandlebarRail) am Lenker befestigt.

    Lage dreier Halterungen und des Sicherungspin auf dem Druckbett (die -verlängerte Variante kann parametrisch mit OpenSCAD erstellt werden). Der -LockingPin sollte jedoch lieber stehend gedruckt werden.

    Displaygehäuse (Anzeige und Knopf)

    Im Displaygehäuse sind nur das Display und der Knopf verbaut. Die nötigen Bauteile sind:

    In die Vertiefung der zwei Gehäusehälften werden zwei Magnete eingelegt, die -das Display während der Fahrt an der Schiene (HandlebarRail, siehe -“Fahrradhalterung” oben) halten.

    Fertiges Displaygehäuse (alte Version)

    Materialverbrauch und Zeitbedarf

    Nach dem Slicen wird angezeigt, wie lange der Druckvorgang dauern wird und wie -viel Material für den Druck benötigt wird. Abhängig von den Einstellungen kann -die Druckdauer sehr unterschiedlich sein. Oft geht mit mehr -Druckgeschwindigkeit ein Qualitätsverlust einher, sodass die beiden -gegeneinander abgewogen werden müssen.

    Üblich für den Druck eines ganzen Gehäuses ist daher je nach Drucker etwa 10 -Stunden in Summe. Die Kosten des Filaments belaufen sich auf ca. 3 €, wer -Verschleiß und Stromkosten einrechnet kommt auf etwa 5 € Gesamtkosten.

    Troubleshooting

    Lage der Druckteile und Überhänge

    Beim Druck der Gehäuseteile ist die Lage des Teiles wichtig, denn Überhänge -sollten vermieden werden, sodass der Drucker nicht in der luft drucken muss. -Das Design der Modelle ist bereits darauf ausgelegt, möglichst gut druckbar zu -sein, die Positionierung auf dem Druckbett ist daher auch besonders wichtig.

    Nach dem Laden der STL-Dateien in Cura werden in der Vorschau die Überhänge in -rot angezeigt. Am Beispiel des Deckels (Bilder 1 und 2) ist es sehr -offensichtlich das die Lage eine wesentliche Rolle spielt, wie herum das Teil -auf die Druckerplatte gelegt werden soll.

    Aber selbst bei einer optimalen Lage wie im Beispiel des Sensorgehäuses zeigt -Cura wo sich trotzdem noch Überhänge bilden. Manche Überhänge wie -Schraubenlöcher sind unkritisch da der Drucker das selbst überbrücken kann -(bridging). Doch wenn der Übergang zu groß wird können sich viele Fäden -ziehen. Um das zu vermeiden kann die Supportfunktion eingeschalten werden, der -Drucker erstellt dann leichte Stützstrukturen, die nach dem Druck wieder -entfernt werden.

    1. Schlechte Positionierung erzeugt Überhänge (rot)2. Richtiges Positionieren ist wichtig3. In der Vorschau werden bereits in rot Überhänge angezeigt4. Support einschalten5. Die zusätzliche Supportstruktur ist nach dem Slicing in der Vorschau sichtbar

    Fehlerhafte Drucke

    Einige Fehler traten während der Drucke auf:

    Support fehlt, Düse vom 2. Extruder verstopft

    Brüchige Verbindung, vermutlich Druckdichte (Infill) zu gering

    Weitere Anleitungen

    • Detaillierte Anleitung für den Zusammenbau des gesamten -OpenBikeSensors beschreibt den Einbau der elektronischen Komponenten in die -beiden Gehäuse.
    • Die Montage des Sensors am Fahrrad wird mit -verschiedenen Halterungen und für das Displaygehäuse gezeigt.

    2.4.2 - Gehäusebauteile

    Hier möchten wir eine Übersicht über alle verfügbaren Gehäusebauteile geben. -Die Links führen jeweils zur Quelldatei (OpenSCAD) und zum STL-Export für den -3D-Druck. Alle Dateien lassen sich auch auf einmal herunterladen, direkt von -Github in der neuesten Version als ZIP-Archiv. Darin finden sich im Ordner -export alle Dateien für den 3D-Druck:

    Eine detaillierte Anleitung zum Gehäusedruck gibt es hier.

    Hauptgehäuse

    BildBauteilname & BeschreibungLinks
    MainCase/MainCase
    Das Hauptgehäuse, in dem die Elektronik untergebracht ist.
    OpenSCAD, -STL
    MainCase/MainCaseLid
    Der Deckel für das Hauptgehäuse, mit Batteriehalterung.
    OpenSCAD, -STL
    MainCase/UsbCover
    Ein kleiner Deckel für die Öffnung des USB-C Ladesteckers im Hauptgehäuse.
    OpenSCAD, -STL
    MainCase/GpsAntennaLid
    Ein kleiner Deckel für die GPS-Antenne im Hauptgehäuse.
    OpenSCAD, -STL

    Displaygehäuse

    BildBauteilname & BeschreibungLinks
    DisplayCase/DisplayCableStrainRelief
    Zugsicherung für das Displaykabel im Displaygehäuse (2x drucken).
    OpenSCAD, -STL
    DisplayCase/DisplayCaseBottom
    Die untere Hälfte des Displaygehäuses.
    OpenSCAD, -STL
    DisplayCase/DisplayCaseTop
    Die obere Hälfte des Displaygehäuses.
    OpenSCAD, -STL

    Halterungen

    Die verschiedenen Halterungen und ihre Montage werden in der Montageanleitung beschrieben.

    BildBauteilname & BeschreibungLinks
    Mounting/AttachmentCover
    Eine Abdeckung für ungenutzte Montagepunkte am Hauptgehäuse (z. B. für kombinierte Back Rider und Top Rider Gehäuse).
    OpenSCAD, -STL
    Mounting/BikeRackMountCenter
    Das Mittelstück für die Gepäckträgerhalterung in Quermontage.
    OpenSCAD, -STL
    Mounting/BikeRackMountCenterLongitudinal
    Das Mittelstück für die Gepäckträgerhalterung in Längsmontage (ungewöhnlich).
    OpenSCAD, -STL
    Mounting/BikeRackMountSide
    Ein Seitenstück der Gepäckträgerhalterung (2x drucken).
    OpenSCAD, -STL
    Mounting/HandlebarRail
    Die Schiene für die Befestigung des Displays am Lenker (Version für Kabelbinderbefestigung).
    OpenSCAD, -STL
    Mounting/HandlebarRailOring
    Die Schiene für die Befestigung des Displays am Lenker (Version für O-Ring-Befestigung).
    OpenSCAD, -STL
    Mounting/LockingPin
    Der Befestigungsstift für das Hauptgehäuse.
    OpenSCAD, -STL
    Mounting/SeatPostMount
    Die Sattelstützenhalterung.
    OpenSCAD, -STL
    Mounting/StandardMountAdapter
    Wird am Hauptgehäuse montiert und ermöglicht das Aufschieben auf die Schienen der Halterungen. Wirkt ebenfalls als Zugsicherung für das Displaykabel am Hauptgehäuse.
    OpenSCAD, -STL
    Mounting/TopTubeMount
    Die Halterung für das Oberrohr.
    OpenSCAD, -STL

    2.4.3 - Gehäusevarianten

    Top Rider / Back Rider

    Das Hauptgehäuse kann als “Top Rider” oder “Back Rider” konfiguriert werden, -oder beides gleichzeitig. Dies definiert, welche Montagepunkte verfügbar sind.

    Ein “Top Rider” Hauptgehäuse hat den Montagepunkt unten (wenn am Rad montiert), -wohingegen ein “Back Rider” ihn vorn hat. Alte Modelle des OpenBikeSensors -waren somit alle “Back Rider”, denn sie wurden immer an der Sattelstütze -montiert, horizontal dahinter hängend.

    Da viele Radfahrende ihre Räder so einstellen, dass hier nicht genug Platz für -einen OpenBikeSensor bleibt, wurde die Variante “Top Rider” mit entsprechenden -Halterungen eingeführt. Top Rider OBS sitzen auf dem Oberrohr, dem -Gepäckträger, oder überall wo unter ihnen Platz für eine Halterung ist. Der -nach unten zeigende Montagepunkt macht das wesentlich stabiler als eine -Halterung, die “um die Ecke” gehen muss, um eine Schiene anzubieten, die nach -hinten zeigt.

    Die Montagepunkte am Hauptgehäuse.

    Ein Gehäuse kann sowohl Top Rider als auch Back Rider gleichzeitig sein. Auf -jeden der Montagepunkte passt der StandardMountAdapter (siehe -Gehäusebauteile). Ein ungenutzter Montagepunkt -sollte mit dem AttachmentCover abgedeckt werden, um die Löcher zu schließen.

    Die Parametrierung erfolgt über die OpenSCAD-Variablen

    MainCase_back_rider
    -MainCase_top_rider
    -MainCase_back_rider_cable
    -MainCase_top_rider_cable
    -

    Ein Adapter (Mounting/BackRiderTopRiderAdapter) ist verfügbar für (ältere) -Geräte, die nur Back Rider sind, aber auf einer Top Rider Halterung angebracht -werden sollen. Das Gegenteil davon haben wir (noch) nicht entworfen.

    OpenSCAD Schnellstart

    OpenSCAD ermöglicht die parametrische Erstellung von 3D-Modellen mit Code. Den -Code haben wir geschrieben, die Parameter kannst du ändern. Damit gibt es jede -Menge Anpassungsmöglichkeiten für jeden Anwendungsfall.

    Die STL-Dateien werden anhand der SCAD-Dateien erzeugt, die alle im -GitHub-Repository -liegen. Am besten benutzt du git, um dir eine Kopie herunterzuladen -(clone), und dann kannst du die Parameter ändern:

    git clone --recurse-submodules https://github.com/openbikesensor/OpenBikeSensor3dPrintableCase
    -cd OpenBikeSensor3dPrintableCase
    -

    Jetzt kannst du die Datei variables.scad anpassen und deine gewünschten Werte -setzen (z. B. MainCase_back_rider, siehe oben).

    Die einzelnen Bauteile aus dem Ordner src/ kannst du dann mit dem Programm -OpenSCAD (das du direkt von seiner Website -herunterladen oder mit deinem -Paketmanager installieren kannst) anschauen. Einzelne Bauteile kannst du darin -auch rendern (F6) und danach als STL exportieren (F7).

    Wenn du alle Teile neu generieren möchtest, kannst du auch in deinem Terminal -make eingeben. Dies erzeugt alle geänderten Bauteile neu, möchtest du alle -neu erstellen, hilft vorher ein make clean. Diese Bauteile werden dann nach -export/... exportiert und überschreiben die dort vorhandenen STL-Dateien. Es -dauert jedoch eine Weile die ganzen Geometrien zu berechnen, erwarte etwa 2-20 -Minuten, je nachdem wie schnell dein Rechner ist.

    2.4.4 - Logo-Druck (mehrfarbig)

    Ein Hauptgehäuse mit eingedrucktem Logo.

    Logo-Dateien

    Statt der Bauteile MainCase und MainCaseLid werden entsprechende Bauteile -gedruckt, die geometrisch identisch sind, aber das Logo enthalten.

    Je nach Logo und Filamentwahl kann es sinnvoll sein, das Logo zu invertieren.

    • Normal: Das Logo hat eine andere Farbe als der Rest des Bauteils.
    • Invertiert: Die Grundfläche, auf der das Logo gedruckt wird, hat eine -andere Farbe als der Rest des Bauteils. Das Logo hat die gleiche Farbe wie -die Wände und das Innere des Bauteils.

    Je nach Drucktechnik sind pro Bauteil eine oder zwei Dateien notwendig, nämlich -das Logo an sich, und das Bauteil, aus dem das Logo herausgeschnitten wurde.

    • Main: Der Hauptteil des Bauteils ohne Logo, bzw. bei invertierten Logo -der Hauptteil mit Logo, aber ohne Grundfläche.
    • Highlight: Das Logo, das herausgeschnitten wurde, bzw. bei invertierten -Logo die Grundfläche ohne Logo.

    Bezeichnungen der vier Dateien für den Logo-Druck des Hauptgehäuses (nur -das Gehäuse, nicht der Deckel).

    Jede dieser vier Dateien gibt es für das Hauptgehäuses und seinen Deckel, -insgesamt pro Logo also acht Dateien. Die vorgenerierten STL-Dateien für das -OpenBikeSensor-Logo werden ebenfalls auf GitHub veröffentlicht und liegen dort -im Verzeichnis -export/logo/OpenBikeSensor/.

    OpenSCAD Logo Generator

    Die Anleitung hierfür folgt demnächst. Möchtest du jetzt schon dein eigenes -Logo auf einen OpenBikeSensor drucken? Bestimmt wird dir im Forum geholfen!

    Mehrfarbendruck

    Zu diesem Thema haben wir noch keine ausführliche Dokumentation, aber es gibt -einen Diskussionsfaden im Forum. Vielleicht hilft dir das schon weiter, -ansonsten kannst du gern dort deine Fragen und Ideen einbringen:

    https://forum.openbikesensor.org/t/mehrfarbiger-gehaeusedruck/111

    2.5 - Bauanleitung (OpenBikeSensor Classic 1.0.0)

    Sobald der Bausatz für den OpenBikeSensor Classic zusammengestellt ist, kann anhand dieser Anleitung der Bau begonnen werden. Der Zusammenbau besteht aus einer Menge Lötarbeit, sowie dem Test der Elektronik und dem Einbau in das Gehäuse.

    Dies ist die Anleitung zum Aufbau des OpenBikeSensor Classic. Die aktuelle -Version dieser Bauanleitung setzt die Hauptplatine der Version 1.0.0 voraus, -sowie die Verwendung der auf dieser Website dokumentierten Bau- und -Gehäuseteile. Auch die benötigten Verbrauchsgüter und Werkzeuge sind bei der -Bauteileliste beschrieben. Hast du einen älteren -Bausatz mit der Platinenversion 00.03.12 kannst du diesen entweder -mit einer Platine Version 1.0.0 upgraden und der Bauanleitung 1.0.0 folgen -(alle Bauteile sind gleich), oder du kannst. -hier die Anleitung für die 0.03.12 Platine finden

    Die beschriebene Vorgehensweise ist nur eine Möglichkeit, zu einem -funktionierenden Modell zu kommen. Wenn du alternative Wege gehen möchtest, -kannst du das natürlich tun. Solltest du einen massentauglichen besseren oder -einfacheren Weg für einen der Schritte finden, freuen wir uns über -Änderungsvorschläge -oder eine kurze Nachricht.

    Ein fertig gebauter OpenBikeSensor der Version 1.0.0

    Voraussetzungen und Hinweise

    Achtung, bitte lies die folgenden Hinweise gut durch, bevor du mit dem Aufbau -anfängst.

    • Diese Anleitung setzt voraus, dass die Grundtechniken wie Löten, das -Abisolieren von Kabeln und das Crimpen von JST-Verbindern bereits bekannt -sind. Für letztere empfehlen wir das -JST-Crimp-Tutorial, auch für -die anderen Techniken findest du Anleitungen und Tipps im Internet.

    • Gehe bewusst und gewissenhaft mit deinen Werkzeugen um. An scharfen -Werkzeugen wie einem Cuttermesser oder einem Seitenschneider kannst du dich -schneiden. Das vordere Ende des Lötkolbens kann bis zu 450°C heiß werden. -Berühre daher immer nur das dafür vorgesehen Griffstück. Sollte er dir -wegrutschen oder herunterfallen weiche daher lieber aus, anstatt ihn -aufzufangen.

    • Die Dämpfe, die beim Löten durch das Verbrennen des Flussmittels (Flux) -entstehen, können gesundheitsschädlich sein. Atme sie daher nicht direkt ein. -Du hast bei dir daheim oder in deinem Makerspace eine Lötdampfabsaugung? Dann -nutze sie! Gerade bleifreies Lötzinn enthält mehr Flussmittel und ist daher -während des Lötens auch deutlich gesundheitsschädlicher. Solltest du keine -Absaugung haben ist daher bleihaltiges Zinn empfehlenswerter. Dieses solltest -du allerdings wiederum nicht in den Mund nehmen und dir nach dem Löten die -Hände waschen.

    • Bei einem der Bauteile handelt es sich um eine LiPo[^1]-Batterie. Diese -Batterien sind zwar heute weit verbreitet, können allerdings bei falscher -Handhabung in Brand geraten. Solltest du nicht vertraut mit LiPos oder dir -noch unsicher sein, lies bitte den Abschnitt in der Anleitung zur Vorbereitung und zum Umgang mit den Akkus -sehr aufmerksam. Außerdem empfehlen wir, die Zelle aus einer -vertrauenswürdigen Quelle zu beschaffen und nicht die billigste Zelle aus -China zu bestellen.

    • Es handelt sich beim OpenBikeSensor um ein frei verfügbares Design, und nicht -um ein fertiges Gerät. Alles, was wir dir mit den Bauteillisten, -Schaltungsentwürfen und Anleitungen zeigen, sind Vorschläge und kann Fehler -enthalten. Bist du dir an einer Stelle nicht sicher oder du glaubst einen -Fehler gefunden zu haben, dann melde dich in der Community. Außerdem sind wir nicht für Fehler verantwortlich -die du während des Aufbaus machst. Sollte etwas schief gehen und du brauchst -Hilfe kannst du dich natürlich trotzdem an uns wenden.

    Buchsenleisten

    Stecke die Buchsenleisten auf den ESP32, um den Abstand später genau passend zu -haben. Positioniere den ESP32 mit den Buchsenleisten auf der Hauptplatine. -Achte auf eine gute Ausrichtung. Es hilft, wenn dir jemand den ESP32 festhält, -damit er nicht verrutscht.

    Löte einen der Pins in einer Ecke fest. Prüfe die Ausrichtung noch einmal, -jetzt kannst du noch nacharbeiten. Löte dann den diagonal gegenüberliegenden -Pin an, und prüfe erneut die Ausrichtung.

    Löte nun alle Pins an den Außenseiten der Buchsenleisten, dann ziehe den ESP32 -vorsichtig ab – er wird erst gegen Ende wieder gebraucht.

    Falls du wechselseitige Buchsenleisten verwendest, löte nun auch innen alle -Pins an.

    Bauteile bereitlegenBuchsenleistung an ESP gesteckt und auf dem Board positioniert. -Erste Ecke löten und Positionierung kontrollieren. -In finaler Positionierung die verbleibenden äußeren Pins löten.Ausrichten und auf der gegenüberliegenden Seite ebenfalls fixieren -Innere Pins festlöten

    Spannungsregler (rot)

    Dieses Modul wird auf der Rückseite der Hauptplatine in SMD-Bauweise verlötet, -also ohne durchgesteckte Stifte oder Beine. Die halbrunden Pads an den -Außenseiten des Moduls werden direkt auf die Pads der Hauptplatine gelötet.

    Löte zunächst ein Pad an. Prüfe, dass das Lötzinn beide Pads gut benetzt. Achte -auf gute Ausrichtung, erst dann löte die anderen Pads ebenso.

    Die zwei direkt benachbarten Pads dürfen verbunden bleiben, sollte dir das -passieren.

    Eines der Pads mit Lötzinn benetzen. -Lötzinn erhitzen, und das Modul positionieren.Wenn fertig positioniert restliche Pins verlööten.Verlötet

    USB-C-Lademodul (blau)

    Das Lademodul ist ein blaues Modul mit einer USB-C Buchse darauf.

    Trenne von einer geraden Stiftleiste zwei einzelne Stifte und zwei Stiftpaare ab.

    Platziere das Modul auf der Unterseite der Hauptplatine. Stecke die Stifte in -die entsprechenden Löcher, sodass das schwarze Plastikteil sichtbar ist. Prüfe, -dass das Modul flach und ohne Lücke auf der Hauptplatine aufliegt, sonst -passt am Ende das Ladekabel nicht.

    Drehe nun die Hauptplatine samt Modul und Stiften um. Achte darauf, dass -keine Stifte herausfallen. Löte die Stifte auf der Oberseite der Hauptplatine fest.

    Drehe nun alles wieder um, und entferne die schwarzen Plastikteile von den -Stiften, indem du sie mit einer Pinzette oder Zange nach oben ziehst. Löte alle -Stifte an das Lademodul, dann kürze alle überstehenden Stifte mit dem -Seitenschneider.

    Mit stiftleisten fixierenMit Verpackungsmaterial (z.B. aus der ESP32 Verpackung) fixieren und Platine umdrehenPins auf der Platinenoberseite verlötenPlastikteile von den Pins abziehen -Pins mit dem blauen Modul verlöten

    Kleine elektronische Bauteile

    Widerstände

    Ordne zunächst alle Widerstände richtig zu, indem du die Farbcodes abliest oder -mit einem Multimeter misst:

    BauteilWertFarbcode 4 RingeFarbcode 5 RingeSMD Code
    R1, R21,2 kΩ
    braun, rot, rot, gold
    braun, rot, schwarz, braun, braun
    122 / 1201
    R310 kΩ
    braun, schwarz, orange, gold
    braun, schwarz, schwarz, rot, braun
    103 / 1002
    R4150 kΩ
    braun, grün, gelb, gold
    braun, grün, schwarz, orange, braun
    154 / 1503
    R5300 kΩ
    orange, schwarz, gelb, gold
    orange, schwarz, schwarz, orange, braun
    304 / 3003

    Nachdem du alle Widerstande zugeordnet hast, platziere sie an den dafür -vorgesehenen Stellen auf der Vorderseite der Hautplatine. Stecke die Beinchen -jeweils durch die beiden Löcher und biege sie etwa 30° nach außen, sodass die -Widerstände nicht mehr herausfallen. Drehe die Platine um und löte alle Beine -auf der Rückseite fest. Danach schneide den überstehenden Draht ab.

    Du kannst auch SMD-Widerstände verwenden, falls du solche hast. In diesem Fall -gehen wir davon aus, dass du auch weißt, wie du sie anbringst.

    Die Widerstände platzieren.Auf der Rückseite durch Verbiegen fixieren.Verlöten.

    Kondensatoren

    Identifiziere zunächst alle Kondensatoren und ordne sie korrekt zu. C1 ist -ein 100 nF großer Keramikkondensator, der ist in der Regel blau oder -hellbraun und hat manchmal die Aufschrift 104 (verwechsle ihn nicht mit der -Sicherung, die normalerweise gelb ist). C2 und C3 sind -Elektrolytkondensator mit 22 µF Kapazität, diese sind normalerweise -schwarz mit heller Aufschrift, zylinderförmig und haben zwei unterschiedlich -lange Beine auf der gleichen Seite.

    Bei C2 und C3 musst du auf die Polung auf Platine und Kondensator achten! -Ein Plus-Symbol auf der Platine zeigt die Seite, auf die das längere Bein -gehört. Die andere Seite ist auf der Platine ausgefüllt, am Kondensator ist -dort ein heller Streifen auf den Hauptkörper aufgedruckt, und das Bein ist -etwas kürzer.

    Stecke alle Kondensatoren, genau wie zuvor die Widerstände, von der Vorderseite -ein und biege die Beine etwas um. Dann drehe die Platine erneut um und löte die -Beine auf der Rückseite fest, und schneide dann den überstehenden Draht ab.

    Die KondensatorenC1 und C2 platzieren.Prüfen: Passt C2 unter den ESP? Falls nicht: Hinreichend viel Beinchen nach oben überstehen lassen, um C2 liegend zu montieren.C3 Montieren. Wie bei C2 prüfen, ob er unter den ESP passt.

    Sicherung

    Die Sicherung F1 ist in der Regel gelb, flach und hat 2 Beine. Der Körper -ist rund oder rechteckig. Die Sicherung sieht so ähnlich aus wie ein -Keramikkondensator, also verwechsle sie nicht mit C1.

    Die Polung der Sicherung ist egal. Die kleinen Biegungen in den Beinchen sorgen -für den richtigen Abstand zur Platine, da die Sicherung nicht direkt darauf -aufsitzen darf um korrekt zu funktionieren.

    Die Sicherung wie die bisherigen Bauteile eingebaut.

    Batteriestecker

    Der Batteriestecker wird üblicherweise als Kombination mit dem Kabel zusammen -geliefert. Du solltest sie zunächst zusammengesteckt lassen um die richtige -Polung herauszufinden.

    Hast du ein rote-schwarzes Batteriekabel solltest du für rot an Plus und -schwarz an Minus verwenden. Ist dein Batteriekabel braun-schwarz, nimm -braun an Plus und schwarz an Minus. Bei anderen Farben musst du dich -selbst entscheiden.

    Kürze das Batteriekabel auf 12 cm.

    Finde heraus, wie herum dein Stecker auf die Platine (bei J1 bzw. “Battery”) -gelötet werden muss, damit die Farbzuordnung mit der Platinenbedruckung -übereinstimmt. Löse dann das Kabel vom Stecker.

    Zwei unterschiedliche Ausrichtungen des Batteriesteckers. Die korrekte -Ausrichtung ist vom gelieferten Stecker und Kabel abhängig.

    Stecke den Stecker auf die Platine, drehe sie um und löte auf der Rückseite -einen der Pins fest. Prüfe nun, ob der Stecker gut und gerade auf der Platine -sitzt, ansonsten kannst du nacharbeiten. Löte dann die andere Seite fest.

    Diode

    Die Diode ist das größte der einzelnen Elemente, mit rundem schwarzen Körper -und ziemlich dicken Beinen, die an beiden Seiten heraustreten. Ein Ende des -Diodenkörpers ist mit einem hellen Kreis markiert.

    Bei der Diode musst du dringend die Polung beachten. Die Diode “steht” auf -dem Kreis auf dem PCB, aber der weiße Ring auf der Diode dabei zeigt nach oben. -Auf der Platine ist die richtige Polung auch als Piktogramm abgebildet.

    Biege die Beine der Diode um und stecke sie an die richtige Stelle. Kürze die -Enden vor dem Löten bereits, um beim Löten weniger Metall aufheizen zu müssen.

    Eigentlich sollen Halbleiter nur kurz gelötet werden, aber dieses ist ein sehr -großes Bauteil, und auch erstaunlich robust. Arbeite zügig, aber erwarte dass -es eine Weile dauert, bis das Bauteil und die Pads auf Temperatur gebracht sind -und das Lötzinn schmilzt.

    Kürze die überstehenden Enden nach dem Löten noch einmal auf ihre endgültige -Länge.

    Die Diode in ihrer korrekten Position. Achte darauf, dass der weiße Ring -nach oben zeigt, und die Diode auf der Platine auf dem weißen Kreis steht.

    Verbinder für Taster und Display

    Die weißen Buchsen für die Steckverbinder zum Ein- und Ausschalter (J2) sowie -zum Display (J3) werden nebeneinander oben auf die Hauptplatine aufgelötet.

    Löte wie beim Batteriestecker immer erst ein Bein fest, und prüfe danach, dass -die Buchse fest und vollständig auf der Hauptplatine aufsitzt. Löte danach erst -die anderen Beine an.

    Die beiden Stecker werden wie auf der Platine aufgedruckt platziert und -sollten flach und fest auf der Platine aufsitzen.

    Sensorboards

    Vorbereitung

    Die erste Option ist die bevorzugte. Dafür wird die JST-Buchse auf dem -Sensorboard durch eine abgewinkelte JST-Buchse ersetzt. Ziehe hierfür das weiße -Kunststoffteil der Buchse von den Metallstiften. Versehe diese mit ein wenig -Lötzinn, sodass es wieder leichter fließt, und löte sie dann aus, indem du sie -einzeln mit einer Pinzette herausziehst. Reinige anschließend die inneren zwei -Löcher mit einer Entlötsaugpumpe oder etwas Entlötlitze, sodass sie nicht mehr -verstopft sind. Löte dann die gewinkelte Buchse so ein, dass sie von der -Winkelstiftleiste weg zeigt.

    Die zweite Option ist der Einsatz einer Winkelstiftleiste anstelle der -richtigen JST-Buchse. Löte wie oben beschrieben die vorhandene gerade -JST-Buchse aus der Modulplatine aus, und ersetze sie durch eine -Winkelstiftleiste mit 2 Stiften. Führe dabei das kurze Ende nur so weit ins -Sensorboard ein, dass die Spitze der Stifte gerade so auf der anderen Seite -herausschaut. Diese Option solltest du nur wählen, wenn du keine gewinkelten -JST-Buchsen zur Hand hast.

    Die letzte Option ist ein wenig riskant und nicht besonders stabil, hat -aber auch schon oft und erstaunlich gut funktioniert. Dafür ziehe den weißen -Kunststoff der bestehenden JST-Buchse ab, und biege die zurückbleibenden -Metallstifte vorsichtig um, sodass sie weg von der vierpoligen Stifteleiste -“nach oben” zeigen. Dabei sollte die Biegung in etwa 2mm Abstand von der -Modulplatine anfangen. Am besten geht das mit einer stabilen Pinzette und einer -Flachzange. Die Stifte können dabei brechen, dann musst du das kreativ -reparieren. Auf die gebogenen Stifte lässt sich ein JST-Stecker aufstecken, -aber nicht arretieren. Wir hatten jedoch bisher keine Probleme mit dieser -Variante im Betrieb.

    Einbau

    Stecke beide Sensorboards an die vorgesehenen Plätze, achte dabei auf die -Beschriftung (+3V3, TRIG, ECHO, GND). Die Boards stehen sich “gegenüber” und -dürfen einander nicht berühren, die JST-Buchsen sind außen. Wenn die -Platzierung der Boards klar ist, lege das innere Board wieder beiseite.

    Fixiere zunächst das äußere Board. Hierfür kannst du die Hauptplatine mit dem -gestecktem Board auf den Kopf drehen, es steht so ganz gut von selbst.

    Löte nur einen Pin an, danach prüfe wie üblich die Ausrichtung. In der Regel -ist das Board beim ersten Versuch noch nicht senkrecht, und liegt auch nicht -auf voller Länge auf dem PCB auf, sondern hat “Luft” darunter. Dies kannst du -gut korrigieren, indem du die Hauptplatine mit Board in eine Hand nimmst, -sodass du mit dem Finger oder Daumen die Ausrichtung des Boards korrigieren -kannst. Mit der anderen Hand kannst du jetzt noch den Lötkolben führen. Da der -eine Pin bereits verlötet ist, benötigst du kein dritte Hand für das Lötzinn. -Passe so die Ausrichtung so lange an, bis sie aus allen Richtungen gut -aussieht.

    Erst dann werden die drei verbleibenden Pins verlötet. Platziere das zweite -Sensorboard auf dieselbe Weise, und kürze am Ende alle Stifte.

    Sensorboardplatzierung von oben.C1 und C2 platzieren.

    SD-Karten-Modul und GPS-Modul

    Trenne von einer Winkelstiftleiste eine Gruppe von 6 Stiften ab. Stecke sie -genau wie in der Abbildung gezeigt in das SD-Karten-Modul ein. Die korrekte -Ausrichtung ist wichtig, es gibt viele Möglichkeiten die Stiftleiste zu stecken -und die meisten davon passen am Ende nicht.

    • Die Stiftleiste wird von der Oberseite der Modulplatine aufgesteckt.
    • Die Stifte haben direkt oberhalb der Platine ihre Biegung.
    • Dann erst kommt die schwarze Kunststoffleiste.
    • Die lange, gerade Seite der Pins zeigt vom Modul weg.

    Verlöte die Winkelstiftleiste mit dem SD-Modul und kürze die überstehenden Pins -auf der Rückseite.

    Auch auf das GPS-Modul muss eine Winkelstiftleiste gelötet werden.

    • Die Stiftleiste wird mit der langen Seite in das GPS board gesteckt.
    • Die Stiftleiste steckt auf der Bestückungsseite des GPS Boards.
    • Die kurze Seite der Stiftleiste zeigt im rechten Winkel nach unten.

    Stecke die Module auf das PCB und achte dabei erneut auf die Ausrichtung. Die -Oberseiten beider Modulplatinen müssen zur Mitte der -OpenBikeSensor-Hauptplatine zeigen. Beachte auch das Foto unten.

    Verlöte wie gewohnt erst einen der Pins auf der Rückseite. Prüfe, dass das -Modul wirklich senkrecht auf der Hauptplatine steht und auch auf ganzer -Länge mit der Unterkante auf der Platine aufliegt, korrigiere dies bei Bedarf. -Erst dann löte die restlichen Pins und kürze sie.

    Die 6-polige Winkelstiftleiste muss von oben ins SD-Modul eingesetzt -werden, sodass die langen Enden der Stifte vom Modul weg zeigen und die -schwarzen Plastikteile einige Millimeter über die Platine hinausragen.

    Hier werden die zwei Module auf der Hauptplatine platziert. Die Oberseite -des Moduls zeigt in Richtung der Buchsenleiste für den ESP32.


    Ein/Aus-Schalter

    Schneide dir zwei kurze Stück Kabel von etwa 10cm Länge zurecht. Die eine Seite -wird jeweils mit einem Crimp versehen. Falls dein Batteriekabel über 20cm lang -ist, kannst du das Batteriekabel schon mal auf 12cm kürzen und die entstehenden -Abschnitte für dein Schalterkabel verwenden.

    Isoliere die andere Seite beider Kabel ca. 5mm weit ab und verdrille die Enden. -Nimm etwas Lötzinn und lasse es auf die freiliegenden Litzen fließen (dies wird -“verzinnen” genannt). Dadurch lässt sich die Litze wie ein solider Draht biegen.

    Biege die Enden in eine U-Form um. So lassen sie sich leicht in die Ösen des -Schalters einführen und halten sich selbst dort fest, bis du sie festgelötet -hast. Achte darauf nur kurz zu löten, sonst schmilzt der Kunststoff im Stecker.

    Verdrille nun die zwei Kabel zu einem, und führe dann die zwei Crimps in -das Steckergehäuse ein. Die Verdrillung wird sich ein wenig wieder lockern, -aber es sollte nun wie ein Kabel wirken, und keine große Schlaufe mehr bilden.

    Schalter mit Kabel und Stecker, noch unverdrillt..

    Ultraschallsensor-Kabel kürzen und crimpen

    Kürze langen schwarzen Kabel der Sensoren auf etwa 10cm, da die langen Kabel -nicht in das Gehäuse passen und auch die Plastikeinfassung der bestehenden -Stecker zu starr und zu dick für das Gehäuse ist.

    Entferne etwa 2cm der schwarzen Außenisolierung des Kabels. Schiebe die -Schirmung zur Seite und verdrille die einzelnen Leiter miteinander. Dies ist -einer der zwei Leiter, die gecript werden müssen. Isoliere vom inneren Leiter -nur etwa 1mm ab.

    Dann werden beide Leiter gecrimpt. Der Crimpkontakt muss für optimale -Verbindung den inneren Leiter und seine Isolierung greifen. Kürze die -Schirmung, sodass alle Adern gleich lang sind, dann crimpe sie alle gemeinsam. -Hier gibt es keine Isolierung, aber die Schirmung insgesamt ist stark genug um -auch mechanisch zu halten.

    Entferne, falls vorhanden, einzelne abstehende Leiter der Schirmung die nicht -im Crimp gesichert sind, sodass diese keinen Kurzschluss verursachen können.

    Führe die Crimpkontakte in das Steckergehäuse ein. Achte dabei auf die korrekte -Polung. Falls die Sensorboards modifiziert und mit gewinkelten -JST-Platinensteckern ausgestattet wurden (siehe Sensorboards » -Vorbereitung), wurde die Polung der Buchsen vertauscht und du musst deinen -Stecker ebenfalls anders herum polen.

    Sensor mit gekürztem Kabel und SteckerDetailaufnahme Stecker und Schirmung (ohne Winkelstecker-Modifikation)

    Batteriekabel anlöten

    Kürze das Batteriekabel auf ca. 12cm und isoliere etwa 5mm der Enden ab.

    Identifiziere die Polung der Batterie, der Pluspol ist auf der Seite mit -Einkerbung im Akku-Gehäuse, und in der Regel auch mit einem Plus auf dem -Aufdruck markiert. Im Zweifel miss mit dem Multimeter nach.

    Es empfiehlt sich, den Akku bereits in den Gehäusedeckel einzulegen, sodass er -bei der Arbeit nicht wegrollt. Statte beide Lötfahnen an ihrem Ende zunächst -mit einem großzügigen Lötpunkt aus. Lasse die Stellen wieder abkühlen, dann -nimm das Kabelende in die eine Hand und den Lötkolben in die andere, erhitze -den Lötpunkt von Neuem und führe das Kabelende seitlich in diesen ein, wenn das -Lötzinn flüssig geworden ist. Die Kabel sollen von der Lötfahne in die Mitte -der Batterie führen. Löte nicht zu lange an der gleichen Stelle, wenn etwas -nicht klappt, lasse das ganze lieber eine Minute lang abkühlen, bevor du es -erneut versuchst.

    Die Batteriekontakte werden nun mit Isolierband (wenn möglich Kapton-Tape) -gründlich isoliert und umwickelt, sodass die Pole und Lötfahnen komplett -bedeckt und die Kabel auch mechanisch fixiert sind.

    Befestige dann die Batterie mit einem kleinen Kabelbinder im Deckel des -Gehäuses. Stecke sie noch nicht ein.

    Akku mit Kabel und Stecker (Polung beachten!)Kontakte isolieren

    Gehäuse vorbereiten

    Gewindeeinsätze

    Im Haupt- sowie im Displaygehäuse gibt es einige Löcher, in die Gewindeeinsätze -(“heat-set inserts”) hinein gehören. Dort greifen später die Schrauben, die das -ganze Gerät zusammenhalten. Die Gewinde müssen an folgende Stellen:

    • 3 Stück in Hauptgehäuse für das PCB (mit Montagelöchern der Platine vergleichen)
    • 5 Stück in Hauptgehäuse für Hauptdeckel
    • 1 Stück in Hauptgehäuse beim GPS-Deckel
    • 3 Stück in Displaygehäuse

    Stelle deinen Lötkolben auf ca. 180-220°C ein und reinige die Spitze gründlich, -sodass kein Lot mehr daran hängt. Alternativ kannst du eine eigene Spitze für -diese Aufgabe verwenden, und danach wieder wechseln.

    Finde eines der vorgesehenen Löcher, nimm ein Gewinde und drücke es so weit es -geht von Hand in das Loch hinein. Halte das Gewinde bei Bedarf mit einer -Pinzette fest, während du den Lötkolben auflegst und leichten Druck ausübst. -Versuche, das Gewinde so senkrecht wie möglich und behutsam versinken lassen.

    Das Gewinde sollte lieber etwas zu tief sitzen, als über den Rand überzustehen, -um die Gehäuseteile bündig miteinander verbinden zu können. Die Gewinde, mit -denen das PCB befestigt wird, sollten allerdings auch nicht zu tief versinken, -sonst bildet sich eine Ausbuchtung auf der Außenseite.

    Vorsicht: Die Gewindeeinsätze sind noch lange nach dem Einsetzen heiß und -kühlen erst langsam ab. Lege das Gehäuseteil am besten einige Minuten zur -Seite, wenn du alle Gewinde darin platziert hast.

    Magnete

    Setze die kleinen Würfelmagnete in USB-Abdeckung ein. Wenn deine Abdeckung mit anderen -OpenBikeSensoren kompatibel sein soll, solltest du jetzt die Polung von einer Vorlage übernehmen.

    Setze zunächst die zwei Magnete in Abdeckung selbst ein. Die Magnete haben nur -in einer Achse Anziehungskraft, sie dürfen also nicht seitlich eingesetzt -werden. Es empfiehlt sich, die vier Magnete “als Stange” zu halten, um ein -Verdrehen zu vermeiden. Alternativ kannst du mit einem permanenten Marker die -richtige Seite markieren.

    Um die zwei Gegenstücke einzubauen, setze je einen Magneten auf einen der -Magnete in der Abdeckung. Stecke dann die Abdeckung ins Hauptgehäuse, und -drücke damit den einzelnen Magneten in sein vorgesehenes Loch. So stellst du -sicher, dass die Magneten einander anziehen.

    Sollten die Magnete nicht von selbst in ihrem Loch stecken bleiben, kannst du -sie auch mit etwas Sekunden- oder Alleskleber fixieren.

    Einpressgewinde in Displaygehäuse einschmelzen

    Hauptgehäuse mit Einpressgewinde (ältere Version mit zwei Mutternn für GPS)

    USB-Abdeckung mit Magneten

    Displayeinheit

    In diesem Abschnitt baust du das Display mit Knopf und Kabel in sein Gehäuse -ein.

    Verwende folgende Tabelle als Vorschlag für die Zuordnung der Leiter im -Displaykabel zu ihren Anschlüssen, oder tausche die Farben durch deine eigene -Zuordnung aus, falls dein Kabel andere Leitungsfarben verwendet.

    FarbeOBS-SeiteDisplayseiteButton
    blauSDASDA
    schwarzGNDGND
    grauBUT-Pin 1
    weißSCLSCK-
    braun+3V3-Pin 2
    kurzes Kabel (siehe unten)-VDDPin 2

    Kabel vorbereiten

    Entferne auf beiden Seiten des langen Displaykabel die Isolierung, auf der -einen Seite ca. 5-7cm lang (dies ist die Seite für das Hauptgerät) und auf der -anderen nur ca. 3cm. Die lange Seite wird vollständig gecrimpt, auf der -kurzen Seite crimpe nur drei Leiter, nämlich die für GND, SDA, SCL -(oder laut Farbtabelle den schwarzen, blauen und weißen Leiter). Die zwei -restlichen Leiter, +3V3 (braun) und BUT (grau) werden angelötet und dafür -ca. 5mm lang abisoliert.

    Bereite ein kleines Kabelstück von ca. 3cm Länge vor, und crimpe auch hier eine -Seite und isoliere die andere ab.

    Verzinne alle Kabelenden die zum Löten vorgesehen sind (drei Stück).

    Knopf

    Schraube den Knopf in das Gehäuseoberteil des Displays hinein. Wenn die Mutter -nicht das Gewinde greifen kann (den Knopf gibt es in verschiedenen Längen) -kannst du auch etwas Heißkleber verwenden.

    Löte die drei Leiter an die zwei Seiten des Buttons an. Dabei kommen das kleine -Kabel mit +3V3 (braun) zusammen auf eine Seite und BUT (grau) allein auf -die andere. Auch hier empfiehlt sich, wie beim Schalter, wenn du zuerst die -abisolierten und verzinnten Enden zu einer U-Form biegst und in die Ösen -einhängst, um dann nur kurz löten zu müssen, damit der Kunststoffkörper des -Knopfes nicht schmilzt. Wenn du mehrfach löten musst, lass den Taster zwischendurch -abkühlen.

    Stecker

    Ziehe am Displaymodul die schwarzen Plastikteile von der Stiftleiste ab und -kürze die vier Stifte um jeweils ca. 2mm.

    Entferne vom 4-poligen JST-Steckergehäuse die Arretierung (auf der einen Seite -leicht hervorstehende Plastikflügel), zum Beispiel mit einem Cuttermesser oder -Seitenschneider. Nur so passt der Stecker am Ende in das kleine Displaygehäuse.

    Stecke die 4 gecrimpten Kabelenden (drei vom langen Displaykabel und eines vom -kurzen Kabelstück) in das Steckergehäuse. Die Zuordnung kannst du anhand der -Tabelle und der Beschriftung auf der Displayplatine machen, oder du kompierst -die abgebildete Reihenfolge.

    Führe die 5 gecrimpten Kabelenden am langen abisolierten Ende des Kabels in das -5-polige JST-Steckergehäuse ein. Die Zuordnung kannst du wieder anhand der -Tabelle und der Beschriftung auf der Hautplatine machen, oder erneut die -abgebildete Reihenfolge kopieren.

    Zusammenbau

    Entferne die Schutzfolie vom Display. Sollte dein Display nicht ins Gehäuse -passen, kannst du mit einem Seitenschneider die Ecken der Platine etwas -bearbeiten, bis es passt.

    Stecke den 4-poligen Stecker auf die gekürzten Pins am Display und setze -dieses in das Gehäuseoberteil ein. Kürze bei Bedarf die Pins weiter, bis der -Stecker ganz auf der Displayplatine aufliegt, damit er ins Displaygehäuse -passt.

    Setze zwei rechteckige Magnete in die Seitentasche ein. Wenn dein Display -mit anderen OpenBikeSensoren kompatibel sein soll, solltest du jetzt die -Polarität von einer Vorlage übernehmen. Manchmal sind die Magnete etwas lose -und klappern, fixiere sie dann mit Kleber oder umwickele sie mit Klebeband.

    Setze die Gehäuseteile zusammen und drehe die drei Schrauben hinein, die sie -zusammenhalten.

    Stecke die beiden Hälften der Zugentlastung in die Öffnung der Unterseite -aus der das Kabel herauskommt. Setze erst die eine Seite ein, und dann die -zweite etwas angewinkelt, bevor du sie beide zusammendrückst, sodass sie das -Kabel am nicht abisolierten Teil greifen. Falls der zweite Teil sich nicht -hineinhebeln lässt kannst du die angewinkelten unteren Ecken etwas mit einem -Seitenschneider weiter abrunden, sodass die Halterung leichter hinein geht.

    Schraube mit je zwei Schrauben und Sechskantmuttern die zwei Hälften -zusammen. Achte darauf, dass die sechseckige Fixierung auf jeweils einer Seite -der Zugentlastung für die Mutter vorgesehen ist.

    Das untere Teil des Displaygehäuses mit ZugentlastungKabel durch Unterteil geführtButton in Displayoberteil eingeschraubtOBS-Seite: Alle 5 Adern crimpenOBS-Seite in Stecker einführenZwei Kabel an Button löten (Pin 2)Display-Seite: Button und Stecker fertigVerschiedene Displays vom gleichen Lieferanten -Wenn nötig, Display mit Seitenschneider stutzen -Display in Gehäuse einpassen, ohne GewaltMagnete passend einlegenDas Display mit verschraubtem GehäuseZugsicherung fixieren

    Firmware installieren

    Zunächst muss die OpenBikeSensor-Firmware auf den ESP32 installiert werden. -Dieser Vorgang heißt auf Englisch “to flash” oder eingedeutscht “flashen”.

    Schließe dafür den ESP32 mit einem Mikro-USB Kabel direkt an einen Computer an. -Benutze dann eine dieser Methoden, um die Firmware darauf zu installieren:

    Elektronik testen

    Vor dem Einbau ins Gehäuse sollte die Elektronik getestet werden. Führe -zunächst einen Sichttest der gelöteten Stellen durch, bevor du das erste Mal die -Batterie und/oder ein Ladekabel anschließt.

    • Sind alle Lötpunkte gut verbunden?
    • Siehst du eine kalte Lötstelle irgendwo?
    • Findest du auf der Platine heruntergetropftes Lötzinn oder einen Drahtrest, -der einen Kurzschluss verursachen könnte?
    • Sind irgendwo versehentlich benachbarte Pins miteinander verbunden worden -(häufig bei den Kondensatoren der Fall)?
    • Sind alle Module senkrecht und stabil eingebaut?

    Löte bei Bedarf die fehlerhaften Stellen nach.

    Für den Test der Elektronik solltest du einen vollständig geladenen Akku -verwenden. In Workshops ist meist einer vorbereitet, hast du nur den neuen und -ungeladenen Akku, so kannst du ihn mit deinem OpenBikeSensor jetzt aufladen:

    1. Ziehe alle Stecker aus der Platine und entferne den ESP32.
    2. Stecke den Hauptschalter ein.
    3. Stecke das Batteriekabel polungsrichtig ein
    4. Schließe ein normales USB-C Ladegerät (5 V) an das Lademodul an.
      • Einige Geräte funktionieren nur nach Anschluss an ein Ladegerät.
      • Ein Handyladeadapter funktioniert eigentlich immer, neuere oder -leistungsfähigere USB-C Netzteile manchmal nicht.
    5. Während des Ladevorgangs leuchtet die LED am Lademodul rot, wenn der Akku -voll ist blau.

    Wenn du einen vollen Akku hast, beginne mit dem Test der Elektronik:

    1. Ziehe den Akku zunächst wieder ab. Verbinde nur das Display und den -Hauptschalter und stecke den ESP32 auf seine Buchsenleisten. Achte dabei -darauf, dass der USB-Port des ESP32 in die auf der Platine markierte -Richtung zeigt.
    2. Achte darauf, dass der Schalter ausgeschaltet ist.
    3. Stecke die Batterie jetzt polungsrichtig ein.
    4. Schalte den Hauptschalter ein.
      • Nach etwa einer Sekunde sollte der Startbildschirm auf dem Display -erscheinen.
      • Wenn das nicht passiert, schalte das Gerät wieder aus. Sofern nichts -stinkt oder gar raucht, kannst du alle Verbindungen prüfen und es noch -einmal versuchen.
      • Wenn dein Display funktioniert und ein OpenBikeSensor-Logo sowie etwas -Text anzeigt, schalte das Gerät aus und fahre mit dem nächsten Testschritt -fort.
    5. Stecke die SD-Karte in die Halterung. Starte das Gerät und warte, bis auf -dem Display “SD OK” erscheint.
      • Kommt kein “SD OK” sondern ein “SD Error” und/oder ein Zähler, der 10 -Sekunden lang zählt, so wurde deine SD-Karte nicht erkannt. Prüfe in -diesem Fall die Verbindungen zwischen dem ESP32 und dem SD-Modul auf -Leitfähigkeit, nimm dafür den -Schaltplan -zu Hilfe.
      • Wenn deine SD-Karte funktioniert, schalte das Gerät aus und fahre mit dem -nächsten Testschritt fort.
    6. Stecke die GPS-Antenne an das GPS-Modul an. Sei vorsichtig mit dem kleinen -Stecker und der Buchse, sie können leicht verbiegen. Starte das Gerät und -lasse es eine Weile unter freiem Himmel liegen. Es kann bis zu 20 Minuten -dauern, bis ein GPS-Signal gefunden wurde. Keine Sorge, das ist nicht jedes -Mal so. Wenn das GPS-Signal gefunden wird, schaltet das Gerät vom -Startbildschirm in den Messmodus und zeigt die Abstände links und rechts an -(ohne Sensoren natürlich nicht). In diesem Fall fahre mit dem nächsten -Testschritt fort.
    7. Stecke die Ultraschallsensoren an ihre Module an. Starte das Gerät, -überspringe bei Bedarf mit dem Knopf das Suchen des GPS-Signals, und prüfe, -dass die Sensoren plausible Abstände messen.

    Wenn alle Komponenten korrekt funktionieren, kannst du das Gerät ausschalten, -alle Verbindungen wieder trennen, und mit dem Einbau ins Gehäuse beginnen. Hast -du einen Fehler gefunden, der sich nicht durch nachlöten reparieren lässt, -hilft dir vielleicht eine der Anleitung auf der Fehlersuche-Seite weiter.

    Zusammenbau

    • Kabel und Halterung

      • Die vier Sechskantmuttern in die Wand des Gehäuses einsetzen (bei Gehäuse -mit zwei Halterungen sind es acht Sechskantmuttern).
      • Sind die Sechskantlöcher eng, die Muttern mit der längeren M3 Schraube -von der Außenseite in die Öffnung ziehen.
      • Ist ein Sechskantloch auch dafür zu eng, vorsichtig mit dem Lötkolben -nachdrücken, und die Mutter von der Außenseite mit der längeren Schraube führen. -Vermeide dabei, mit dem Lötkolben das Plastik zu berühren.
      • Falls du ein Gehäuse mit mehreren Montageöffnungen baust, entscheide dich, an -welcher Öffnung du die Halteklammer installieren willst. Diese Öffnung -führt auch später das Kabel. Die andere Öffnung wird mit dem Deckel -(AttachmentCover) verschlossen.
    • PCB im Hauptgehäuse platzieren

      • Zunächst die SD-Karte einlegen, den ESP abziehen.
      • Gesamtes Board in leichtem Winkel herabsenken, auf Ausrichtung der USB-C -Ladebuchse achten. Bei Wiederzusammenbau am Displaykabel vorbei navigieren.
      • Bei Bedarf Unreinheiten des Gehäuses (vom 3D-Druck) entfernen, wenn das PCB -daran hängen bleibt.
      • Mit 3 Stück M3x6 oder M3x8 im Gehäuse verschrauben.
      • Nun kann der ESP wieder aufgesteckt werden. Dabei die Richtung der -USB-Markierung mit Mikro-USB-Buchse dem ESP32 abgleichen, -und sicherstellen, dass die Pins nicht um ein oder zwei Löcher verrutscht -eingesteckt werden.
      • Muss der ESP wieder abgezogen werden, um die Platinenschraube darunter wieder -zu lösen, kann man einen Inbus als “Enterhaken” verwenden, um den ESP zu lockern
    • Displaykabel in Gehäuse einstecken

      • Führe das Displaykabel mit dem Stecker voran von außen in das Hauptgehäuse hinein -(Falls in Schritt 16 nicht geschehen). -Entscheide dich, ob du -eine Top-Rider oder Back-Rider Variante -bauen möchtest, und führe das freie Ende des Kabels durch die entsprechende -Öffnung im Hauptgehäuse. Möchtest du beide Halterungen montieren und dir damit -beide Varianten ermöglichen, kannst du dir die Öffnung frei aussuchen.
      • Die Halterung mit Zugentlastung anbringen und damit das Kabel fixieren. -Noch nicht festziehen, nur sicherstellen, dass die Muttern nicht mehr -herausfallen.
      • Das Kabel sollte außen um die Elektronik herumgeführt werden, nicht -zwischen dem GPS- und SD-Karten-Modul hindurch. Im neuen Gehäuse sollte -dort genug Platz sein.
      • Jetzt zeigt sich auch, warum ca. 5cm Abisolierung hier sinnvoll ist, denn -ohne Isolierung ist das Kabel flexibler.
      • Stecker einsetzen (z.B. mit Pinzette)
      • Kabel so weit aus der Zugsicherung herausziehen, bis kein überschüssiges -Kabel im Innenraum des Gehäuses ist, aber das Kabel nicht straff liegt.
      • Schrauben der Zugsicherung bzw. Halterung nun fest anziehen.
    • GPS-Antenne einsetzen

      • Kabel der Antenne mit kleinem Stecker durch das kleine Loch fädeln.
      • GPS-Antenne mit Schirmung nach unten und Keramik nach oben in die -quadratische Aussparung einsetzen.
      • Den Antennenstecker auf das GPS-Board aufstecken. Der Stecker ist sehr -filigran und schwer zu stecken, es geht gut ihn mit den Fingern zu -platzieren und mit einer Pinzette den Stecker und die GPS-Modulplatine -zusammenzudrücken. Dabei auf richtigen Sitz achten um den Stecker nicht zu -beschädigen.
      • Den GPS-Deckel über die Antenne schieben und mit einer M3x6 oder M3x8 -Schraube fixieren.
      • Falls das Antennenkabel nicht reicht, kann die GPS-Antenne mithilfe eines -hinreichend langen Antennenkabels mit IPEX/U.FL Stecker verlängert werden. -Hierzu:
        • Den Metallschild des GPS-Moduls ablöten.
        • Das neue Kabel vorsichtig durch Rollen unter Cuttermesser auf etwa -5-7mm abisolieren.
        • Die Schirmung zurückschieben.
        • Noch vorsichtiger die innere Isolierung durch ganz sanftes Rollen -mit dem Cuttermesser abisolieren.
        • Das kurze Kabel ab- und das neue, längere anlöten.
        • Den Metallschild des Moduls wieder in ursprünglicher Ausrichtung -auflöten.
    • Schalter in Gehäuse einsetzen

      • Einschaltrichtung mit “I/O” Aufdruck des Gehäuses vergleichen.
      • Möglichst mit der mitgelieferten Unterlegscheibe und Mutter fixieren.
      • Schalterkabel verdrillen, falls nicht bereits geschehen..
      • Kabel entlang der Gehäusewand zur Buchse führen und dort einstecken.
    • Sensoren einbauen

      • Auf der Rückseite des Sensors gibt es einen Pfeil, der mit “UP” die -Richtung markiert, wo später oben sein soll.
      • Einen Sensor ins Hauptgehäuse einbauen, den anderen in den Deckel.
      • Sensoren einstecken. Den Sensor im Gehäuse an das ihm naheliegendste -Sensorboard anschließen, den Sensor vom Deckel in das entferntere (Anschluss über dem ESP32).
    • Akku einbauen

      • Akku im Deckel mit Kabelbinder fixieren (falls in Schritt 14 noch nicht erledigt)
      • Einstecken. Polung beachten!
      • Möglicherweise überstehendes Kabel möglichst auf der Seite des GPS -verstauen. Die Adern verdrillen und parallel legen.
    • Konfiguration des Sensors:

      • Die Anzeige kann im Konfigurationsmodus auf den Simple-Mode gestellt werden.
      • Außerdem kann die Breite des Lenkers und WLAN eingestellt werden.
      • Bei einem Reboot des Sensors wird nun auf der Sensor-Anzeige der Simple-Mode mit dem Abstand des linken Sensors angezeigt - abzüglich der Breite des Lenkers.
      • Alternativ im Profimodus weiterfahren.
    • Montage und Testfahrt mit dem Fahrrad.

    Akku und Ultraschallsensor an Deckel montieren ('Up'-Pfeil beachten)Ultraschallsensoren einsteckenLadebuchse (USB-C) ohne Gewalt in die Aussparung einfädelnPCB festschraubenHalterung und Zugentlastung festschraubenGPS-Deckel festschraubenDeckel festschraubenFertig!

    2.5.1 - Bauanleitung für den OpenBikeSensor v00.03.12

    Dies ist die Anleitung zum Aufbau des OpenBikeSensors v00.03.12 in der -Standardvariante. Andere Versionen können über das Dokumentationsmenü -aufgerufen werden.

    Die beschriebene Vorgehensweise ist nur eine Möglichkeit, zu einem -funktionierenden Modell zu kommen. Wenn du alternative Wege gehen möchtest, -kannst du das natürlich tun. Solltest du einen massentauglichen besseren oder -einfacheren Weg für einen der Schritte finden, freuen wir uns über -Änderungsvorschläge -oder eine kurze Nachricht.

    Ein fertig gebauter OpenBikeSensor der Version v00.03.12

    Voraussetzungen

    Diese Anleitung setzt voraus, dass die Grundtechniken wie Löten, das -Abisolieren von Kabeln und das Crimpen von JST-Verbindern bereits bekannt sind. -Für letzteres empfehlen wir das -JST-Crimp-Tutorial.

    Wenn du unsicher bist, wo -du ein Bauteil auf dem Board unterbringen sollst, kannst du die -interaktive Stückliste (BOM) verwenden, um dir -anzeigen zu lassen, wo ein Bauteil eingesetzt werden kann.

    Schritt 1: Buchsenleisten

    • Falls nur Buchsenleisten mit 16 Pins vorhanden sind, müssen diese auf 15 Pins gekürzt werden:
      • Mit dem Seitenschneider kürzen.
      • Mit dem Cuttermesser oder Schleifpapier nacharbeiten, um keine scharfe Kante zu hinterlassen.
    • Buchsenleisten auf ESP32 stecken, um den Abstand später genau passend zu haben.
      • Auf die Richtung der Pins (Kontaktbeine an der Buchsenleiste) achten!
      • Die Pads (Lötstellen auf der Platine) sind nicht symmetrisch, auf je einer -Seite ist nur jeder zweite Pin mit Pad versehen.
    • Buchsenleisten mit gestecktem ESP32 positionieren. Auf gute zentrierte Ausrichtung achten.
    • Einen Eck-Pin festlöten. Dabei den ESP32 gut festhalten, evtl. zu zweit arbeiten.
    • Ausrichtung prüfen, wenn der ESP32 verrutscht ist, nacharbeiten.
    • Diagonal gegenüberliegenden Pin anlöten. Ausrichtung erneut prüfen.
    • Alle äußeren Verbindungen verlöten.
    • Den ESP32 vorsichtig abziehen, sodass die Pins dabei nicht verbiegen.
    • Die inneren Kontakte anlöten.
    Bauteile bereitlegenBuchsenleite wenn nötig auf 15 Pins zuschneiden -Buchsenleisten auf ESP32 aufstecken -Gemeinsam auf dem PCB platzieren. Ausrichtung der abwechselnden Pins (innen) prüfen.Zunächst an einem Eckpunkt fixierenAusrichten und auf der gegenüberliegenden Seite ebenfalls fixieren -Alle äußeren Pins festlöten (beidseitig)Alle äußeren Pins festgelötet -Dann den ESP32 entfernen und die Innenseite verlöten

    Schritt 2: Spannungsregler (rot)

    • Wir verwenden Stiftleisten, um den Spannungsregler richtig zu positionieren. Verlötet -werden diese nicht, sondern später wieder herausgezogen und beim Lademodul -benutzt.
      • Bei Bedarf kann die beim SD-Karten-Modul mitgelieferte 6-polige Stiftleiste -verwendet werden, diese wird nicht für die SD-Karte gebraucht.
      • Stifte von der Leiste abtrennen: 1x1 und 1x2 Stifte.
      • Spannungsregler mit Stiften in zwei gegenüber liegenden Lötstellen platzieren.
      • Stifte nicht verlöten!
    • Das ausgerichtete Modul an den anderen beiden SMD-Pads verlöten.
      • Die Außenseite der Modulplatine hat ein halbrudes Loch mit Kontaktfläche.
      • Diese wird mit Lötzinn verbunden zum Pad auf der OBS-Hauptplatine darunter.
      • Auf guten Fluss des Lötzinns zum unteren Pad achten.
    • Die Ausrichtungsstifte abziehen und die restlichen Kontakte ebenfalls in -SMD-Bauweise verlöten.
    Stiftleisten ablängen -Bauteile bereitlegenBoard platzieren und mit Stiften ausrichten, anderes Pad wie SMD verlötenFreie Kontakte löten -Stifte entfernen und restliche Kontakte löten

    Schritt 3: USB-C-Lademodul (blau)

    • Für das blaue Lademodul 2x2 Stifte und 2x1 Stift vorbereiten (siehe oben).
    • Modul auf PCB auflegen
    • Die Stifte und Stiftpaare einstecken und evtl. fixieren.
    • Aufpassen, dass das Modul flach auf dem PCB aufliegt, sodass später die -Ausrichtung der USB-Ladebuchse korrekt ist.
    • Die Stifte von der anderen Seite verlöten.
    • Die schwarzen Plastikteile entfernen und die Oberseite ebenfalls verlöten.
    • Alle überstehenden Stifte mit dem Seitenschneider kürzen.
    Bauteile bereitlegenLademodul und Stifte platziertAuf Oberseite verlötenAlle Stifte auf Oberseite verlötet -Schwarze Plastikteile von Stiftleiste entfernenSchwarze Plastikteile von Stiftleiste entfernt -Oberseite verlötenStifte kürzen

    Schritt 4: Widerstände

    • Widerstände richtig zuordnen (Farbcodes z.B. via kiloohm.info decodieren oder mit einem Multimeter messen):
      • R1: 10 kΩ (braun - schwarz - orange - gold)
      • R2: 150 kΩ (braun - grün - gelb - gold)
      • R3: 300 kΩ (orange - schwarz - gelb - gold)
      • R6, R7: 1,1 kΩ (braun - braun - rot - gold) oder 1 kΩ (braun - schwarz - rot - gold)
      • Leider enthält die Platine einen Fehler, und R7 kann nicht wie vorgesehen platziert werden, sonst ist der Widerstand dem einen Sensorboard im Weg.
      • Statt auf der Oberseite verlöten wir den Widerstand auf der Unterseite.
      • Die Beinchen werden dabei nicht durch die Löcher gesteckt. Wir behandeln den Widerstand wie ein SMD-Bauteil.
      • Pads identifizieren. Eines der Pads auf der Platinenunterseite mit etwas -Lötzinn benetzen. Sehr wenig Zinn verwenden, sonst sickert es durch das -Loch durch und bildet auf der Rückseite eine Perle, die dann im Weg ist.
      • Zinn wieder verflüssigen, Widerstand mit einem Bein darin fixieren. Der -Widerstand liegt flach auf der Unterseite der Platine auf, mit nicht -gebogenen Beinen.
      • Anderes Bein mit Lötzinn auf anderes Pad löten.
      • Beine kürzen.
      • Falls doch Lötzinn zur Oberseite der Platine durchgesickert ist, mit -Entlötlitze reduzieren.
    • Falls ein SMD-Widerstand für R6 verwendet werden soll:
      • Einen Lötpunkt auf ein Pad setzen.
      • Widerstand flach auf das PCB legen, Lötpunkt erneut schmelzen und -das Bauteil mit der Pinzette darauf schieben.
      • Andere Seite normal festlöten.
      • R7 nicht so verbauen (s.o.)
    • Normale THT-Widerstände (R1, R2, R3, R6) stecken, verlöten, Beine kürzen.
    R7: Eines der Pads verzinnenR7: Den Widerstand wie ein SMD-Bauteil einseitig anlötenR7: Die zweite Seite verlötenR7: Fertig montiert -Ein Widerstand (R6) platziertAuf der Rückseite verlötenBeine kürzen. Widerstände R1-R3 ebenso montieren.

    Schritt 5: Kondensatoren

    • Kondensatoren identifizieren und richtig zuordnen
      • C1: 100 nF (in der Regel blau, manchmal Aufschrift 104)
      • C2, C3: 22 µF Elektrolytkondensator (i.d.R. schwarz mit heller Aufschrift, zylinderförmig, unterschiedlich lange Beine)
    • Bei C2 und C3: Polung auf Platine und Kondensator beachten!
      • Plus: Langer Pin
      • Minus: Kurzer Pin, mit Streifen markierte Seite, auf PCB ausgefüllte Hälfte
    • Kondensatoren C1 bis C3 stecken, zum Fixieren die Beine umbiegen
    • Auf Rückseite verlöten und überstehenden Draht abkneifen
    Die KondensatorenKondensatoren platzieren, auf Polung achten!Auf der Rückseite umbiegen und verlötenDrähte kürzen -Widerstände und Kondensatoren fertig platziert

    Schritt 6: Lötpunkt / Brücke

    • JP1 (mittig auf der Platine) mit einem Lötpunkt versehen und damit überbrücken
    • Erstes Bild im nächsten Schritt zeigt das Ergebnis

    Schritt 7: Stromversorgung

    • Sicherung (in der Regel dunkelgelb, flach mit 2 Beinen, rund oder rechteckig)
      • Position: F1
      • Die Polung ist egal
      • Die kleinen Biegungen in den Beinchen sorgen für den richtigen Abstand.
      • Einstecken, senkrecht verlöten, Beine abkneifen.
    • Batteriestecker
      • Stecker und Kabel zusammenstecken
      • Beschriftung auf der Platine beachten (Rot: „Plus“, Schwarz: „Minus“)
      • Auf der Rückseite einen Pin anlöten.
      • Das Kabel abziehen.
      • Auf guten Sitz des Steckers achten. Wenn der Stecker noch nicht flach und -senkrecht auf der Platine aufsitzt, die Lötstelle noch einmal heiß machen -und den Stecker an seinen Platz drücken.
      • Den zweiten Pin festlöten.
    • Diode
      • Polung beachten: Die Diode “steht” auf dem Kreis auf dem PCB, aber der -weiße Ring auf der Diode dabei zeigt nach oben.
      • Diode umbiegen und aufstecken
      • Enden vor dem Löten etwas kürzen, um beim Löten weniger Metall aufheizen zu -müssen
      • Verlöten: Eigentlich sollen Halbleiter nur kurz gelötet werden, aber dieses -ist ein sehr großes Bauteil, und auch erstaunlich robust. Arbeite zügig, -aber erwarte dass es eine Weile dauert, bis das Bauteil und die Pads auf -Temperatur gebracht sind und das Lötzinn schmilzt.
      • Die überstehenden Enden nachkürzen.
    Die fertig platzierten Bauteile (oben links)

    Schritt 8: Verbinder für Taster und Display

    • J5 (Displaykabel)
      • 5-Pin-Konnektor gemäß Markierung auf Platine aufsetzen
      • Die Aussparungen zeigen in Richtung der Mitte der Platine.
      • Einen Pin von unten verlöten.
      • Ausrichtung prüfen und evtl. korrigieren (Hinweise hierzu siehe -Batteriestecker).
      • Restliche Pins verlöten.
    • J6 (Schalter Ein/Aus)
      • 2-Pin-Connector so aufsetzen, dass er möglichst wenig über den Rand der -Platine übersteht und verlöten.
      • Polung egal.
      • Wie oben verlöten.
    5-poligen Stecker richtigherum aufsteckenAuf der Rückseite verlöten, auf guten Sitz achten2-poligen Stecker ebenso montieren

    Schritt 9: Sensorboards

    Vorbereitung

    • Option 1: (bevorzugt, benötigt gewinkelte 2-polige JST-Stecker)
      • Die JST-Stecker aus dem Sensorboard auslöten. Hierfür:
        • Das weiße Kunststoffteil abziehen.
        • Die zurückbleibenden Metallstifte mit etwas mehr Lötzinn versehen und -herausziehen.
        • Das innere Paar Löcher von Lötzinn befreien (Entlötsaugpumpe oder -Entlötlitze).
      • Gewinkelte JST-Stecker stattdessen einlöten.
      • Das Kabel, wenn eingesteckt, sollte weg von den 4 Pins des Boards zeigen -(nach oben, wenn montiert).
    • Option 2 (Winkelstiftleiste):
      • Die JST-Stecker aus dem Sensorboard auslöten (siehe oben).
      • Durch eine 2-polige Winkelstiftleiste ersetzen.
      • Dabei das kurze Ende nur so weit ins Sensorboard einführen, dass die Spitze -der Stifte gerade so auf der anderen Seite herausschaut und dann verlöten.
    • Option 3 (Kontakte biegen):
      • Den weißen Kunststoff vom JST-Stecker abziehen
      • Die zurückbleibenden Metallstifte vorsichtig umbiegen, sodass sie weg von -der vierpoligen Stifteleiste “nach oben” zeigen, dabei die Biegung in etwa -2 mm Abstand vom Board anfangen.
      • Die Stifte können dabei brechen, dann muss kreativ repariert werden. ;)
      • Hier lässt sich ein JST-Stecker einstecken, aber nicht arretieren. Wir -hatten jedoch bisher keine Probleme mit dieser Variante im Betrieb.
    Ein einzelnes Sensorboard -Das weiße Kunststoffteil entfernenKontakte des alten Steckers auslöten, neuen Stecker einlöten

    Einbau

    • Beide Sensorboards stecken, dabei Beschriftung (+3V3, TRIG, ECHO, GND) -beachten. Die Boards stehen sich “gegenüber” und dürfen einander nicht -berühren. Wenn die Platzierung der Boards klar ist, das inner Board wieder -beiseite legen.
    • Das erste Board fixieren. Hierfür kann das PCB mit gestecktem Board auf den -Kopf gedreht werden, es steht so ganz gut.
    • Nur einen Pin anlöten. Danach die Ausrichtung prüfen. In der Regel ist das -Board hier noch nicht senkrecht, und liegt auch nicht auf voller Länge auf -dem PCB auf, sondern hat “Luft” darunter.
    • Das PCB und Board in eine Hand nehmen, sodass mit dem Finger oder Daumen die -Ausrichtung des Boards korrigiert werden kann. Mit der anderen Hand kann der -Lötkolben geführt werden. Da der eine Pin bereits verlötet ist benötigen wir -keine weitere Hand für das Lötzinn. So kann die Ausrichtung leicht angepasst -werden, bis sie aus allen Richtungen gut aussieht.
    • Erst dann werden die drei verbleibenden Pins verlötet.
    • Das zweite Board genauso einlöten.
    • Überstehende Stifte kürzen.
    Sensorboards platzieren (schief aufgestellt für Übersicht, bitte gerade löten)Auf der Rückseite verlöten, Beine kürzen

    Schritt 10: SD-Karten-Modul

    • Gewinkelte Stiftleiste mit 6 Pins vorbereiten.
    • Gewinkelte Stiftleiste genau wie in der Abbildung gezeigt in SD-Karten-Modul -stecken. Die Ausrichtung ist wichtig, es gibt acht Möglichkeiten die Stiftleiste zu -stecken, sieben davon funktionieren nicht.
      • Die Stiftleiste wird von der Oberseite der Modulplatine aufgesteckt.
      • Die Stifte haben direkt oberhalb der Platine ihre Biegung.
      • Dann erst kommt die schwarze Kunststoffleiste.
      • Die lange, gerade Seite der Pins zeigt vom Modul weg.
    • Stiftleiste mit dem Modul verlöten und überstehende Pins abkneifen.
    • Modul auf das PCB stecken (Ausrichtung und Beschriftung beachten).
    • Verlöten und Stifte kürzen.
    SD-Karten Modul und Stiftleiste -Stiftleiste in Modul einstecken (Richtung beachten) -Stiftleiste in Modul verlöten (Richtung beachten)Modul platzierenAuf der Rückseite anlöten und kürzen

    Schritt 11: GPS-Modul

    • Gewinkelte Stiftleiste mit 4 Pins vorbereiten.
    • Stiftleiste in PCB einlöten:
      • Von der Unterseite stecken.
      • Langes Ende der Pins steht seitlich heraus.
    • Eng anliegend verlöten, Stifte kürzen.
    • GPS-Modul aufstecken, sodass es in der Aussparung des PCB liegt.
    • Einen Pin verlöten, Ausrichtung korrigieren wie bei Sensorboards
    • Restliche Pins Verlöten und Stifte kürzen.
    4-polige Winkelstiftleiste abkürzen und stecken (Richtung beachten)Auf der Oberseite verlötenGPS-Modul senkrecht aufstecken und verlöten

    Schritt 12: Ein/Aus-Schalter

    • Zwei Stück Kabel, ca. 10 cm lang, abtrennen.
    • Einseitig crimpen und in 2-fach JST Steckergehäuse einführen.
    • Andere Kabelenden an den Schalter löten.
      • Etwa 5 mm des Kabels abisolieren.
      • Drahtenden verdrillen und verzinnen.
      • Zu einem “U” oder “Z” biegen und in die Öse an den Schalterpins einführen.
      • Nur kurz löten, sonst schmilzt der Kunststoff im Stecker.
    Schalter mit Kabel und Stecker

    Schritt 13: Ultraschallsensor-Kabel kürzen und crimpen

    • Die langen schwarzen Kabel der Sensoren auf etwa 10 cm kürzen, da die langen -Kabel nicht in das Gehäuse passen und auch die Plastikeinfassung der -bestehenden Stecker zu starr und zu dick für das Gehäuse ist.
    • Empfehlung: Schrumpfschlauch (sofern vorhanden, optional) direkt nach dem -Kürzen auf das schwarze Sensorkabel aufziehen, noch bevor es abisoliert und -gecrimpt wird.
    • Abisolieren:
      • Etwa 2 cm des Kabels abisolieren.
      • Die Schirmung zur Seite schieben und alle Leiter miteinander verdrillen (dies ist einer der zwei Leiter, die gecript werden müssen).
      • Den inneren Leiter etwa 1 mm abisolieren.
    • Crimpen:
      • Beide Leiter werden gecript.
      • Der Crimpkontakt muss für optimale Verbindung den inneren Leiter und seine Isolierung greifen.
      • Die Schirmung auf dir gleiche Länge kürzen und gemeinsam crimpen. Eventuell -einzelne abstehende Leiter entfernen, sodass diese keinen Kurzschluss -verursachen.
    • Stecken:
    • Zum Schluss Schrumpfschlauch (falls vorhanden) erhitzen und befestigen, dabei -etwa 3-5 mm vom Stecker entfernt positionieren um ein Biegen in Steckernähe -beim Einstecken zu ermöglichen.
      • Hinweis: Dieser Schritt kann auch erst nach dem Testen der Eletronik -gemacht werden, wenn sichergestellt ist, dass der Sensor korrekt funktioniert.
    Sensor mit gekürztem Kabel und SteckerDetailaufnahme Stecker und Schirmung

    Schritt 14: Batteriekabel anlöten

    • Die Akkus müssen mit Lötfahnen ausgestattet sein. Akkus ohne Lötfahnen dürfen -nicht gelötet werden!
    • Das Batteriekabel (rot und schwarz) auf ca. 12 cm kürzen und neu auf ca. 5 mm -abisolieren.
    • Die Polung der Batterie identifizieren. Der Pluspol ist auf der Seite mit -Einkerbung im Akku-Gehäuse, und in der Regel auch mit einem Plus auf dem -Aufdruck markiert. Im Zweifel mit dem Multimeter nachmessen.
    • Es empfiehlt sich, den Akku bereits in den Gehäusedeckel einzulegen, sodass -er nicht wegrollt.
    • Jede Seite zunächst mit einem großzügigen Lötpunkt ausstatten. Dann den -Lötpunkt erneut erhitzen und das Kabelende seitlich ins Lötzinn einführen. -Die Kabel sollen von der Lötfahne in die Mitte der Batterie führen.
    • Die Batteriekontakte mit Isolierband (wenn möglich Kapton-Tape) isolieren und -einfach umwickeln, sodass die Pole und Lötfahnen komplett bedeckt sind und -die Kabel mechanisch fixiert werden.
    • Die Batterie mit einem kleinen Kabelbinder im Deckel befestigen.
    Akku mit Kabel und Stecker (Polung beachten!)Kontakte isolieren

    Schritt 15: Gehäuse vorbereiten

    • Einpressgewinde (“heat-set inserts”) einbauen:
      • Den Lötkolben auf ca. 180-220°C einstellen, gut reinigen (kein Lot an der -Spitze). Nach Möglichkeit eigene Spitze für diese Aufgabe verwenden, und -danach wieder wechseln.
      • Einpressgewinde so weit wie möglich von Hand in das vorgesehene Loch drücken.
      • Lötkolben auflegen, nur sehr leichten Druck ausüben.
      • Gewinde so senkrecht wie möglich und behutsam versinken lassen.
      • Das Gewinde sollte lieber etwas zu tief sitzen, als über den Rand -überzustehen, um die Gehäuseteile bündig miteinander verbinden zu können.
      • Die Gewinde, mit denen das PCB befestigt wird, nicht zu tief versenken, sonst -bildet sich eine Ausbuchtung auf der Außenseite.
      • Vorsicht: Die Einpressgewinde sind noch lange nach dem Einsetzen heiß -und kühlen erst langsam ab. Gehäuse am besten einige Minuten zur Seite legen.
    • Einpressgewinde hier platzieren:
      • 3 Stück in Hauptgehäuse für das PCB (mit Montagelöchern der Platine vergleichen)
      • 5 Stück in Hauptgehäuse für Hauptdeckel
      • 1 Stück in Hauptgehäuse beim GPS-Deckel
      • 3 Stück in Displaygehäuse
    • Kleine Würfelmagnete in USB-Abdeckung einsetzen
      • Wenn Kompatibilität mit anderen OBS gewünscht ist, muss auf gleiche Polung -geachtet werden, da sonst die Abdeckungen nicht austauschbar sind.
      • Erst Magnete in Abdeckung einsetzen.
      • Dann einen Magnet auf einen der eingesetzten platzieren und die -Abdeckung ins Hauptgehäuse stecken, dabei den einzelnen Magneten ins -Hauptgehäuse eindrücken. Mit der anderen Seite wiederholen.
    Einpressgewinde in Displaygehäuse einschmelzenHauptgehäuse mit EinpressgewindeUSB-Abdeckung mit Magneten

    Schritt 16: Display-Kabel

    • Zugentlastung in Displaygehäuse-Unterteil einsetzen:
      • Erste Hälfte der Zugentlastung einsetzen.
      • Zweite Hälfte von außen angewinkelt eindrücken, bei Bedarf die unteren -Ecken mit dem Seitenschneider leicht abrunden, damit sie sich leichter in -die vorgesehene Position stecken lässt.
    • Kabel durch Displaygehäuse-Unterteil und Zugentlastung führen.
    • Button in Gehäuseoberteil einschrauben.
    • Stecker OBS-Seite
      • Das andere Kabelende durch das Displaygehäuse-Unterteil stecken.
      • Die Außenisolierung kann gut auf ca. 5 cm abisoliert werden.
      • Die einzelnen Litzen nur 1-2 mm abisolieren und alle 5 Litzen crimpen. -Für stabilen Halt müssen die äußeren Flügel des Crimpkontakts die -Isolierung der jeweiligen Litze greifen.
      • Gecrimpte Kabelenden in das JST-Gehäuse (5-polig) einführen. -OBS-PCB und Display sind beschriftet. Zuordnung der Farben zu Beschriftung notieren. -Unten gibt es eine Verkabelungstabelle mit Farbvorschlag.
    • Stecker Display-Seite
      • Vom JST-Gehäuse (4-polig) die Arretierung (auf der einen Seite leicht -hervorstehende Plastikflügel) entfernen, also eben abschneiden (Cuttermesser -oder Seitenschneider).
      • Nur 3 Kabel crimpen: GND, SDA, SCL. Die Außenisolierung auf -ca. 2 cm abisolieren.
      • BUT an eine Seite des Buttons löten.
      • Kleines Kabelstück (ca. 3 cm):
        • vorbereiten, einseitig crimpen
        • mit +3V3 zusammen an andere Buttonseite löten
        • Crimpkontakt entspricht jetzt +3V3 bzw. VDD (am Display)
      • Gecrimpte Kabelenden in das JST-Gehäuse (4-polig) einführen.
    OBS-SeiteDisplayseiteButtonVorschlag Farbe
    SDASDAblau
    GNDGNDschwarz
    BUT-Pin 1grau
    SCLSCK-weiß
    +3V3-Pin 2braun
    -VDDPin 2(kurzes Stück Kabel)
    Das untere Teil des Displaygehäuses mit ZugentlastungKabel durch Unterteil geführtButton in Displayoberteil eingeschraubtOBS-Seite: Alle 5 Adern crimpenOBS-Seite in Stecker einführenZwei Kabel an Button löten (Pin 2)Display-Seite: Button und Stecker fertig

    Schritt 17: Display-Zusammenbau

    • 0,96-Zoll OLED-Displayboard vorbereiten
      • Die OLED-Boards haben teils etwas unterschiedliche Größen
        • Platine des Displays nach Bedarf etwas zurechtschneiden, insbesondere an den Ecken (Seitenschneider)
        • Je nach Genauigkeit des 3D-Drucks das Gehäuse etwas weiter ausfräsen
      • Schutzfolie von Display abziehen
      • Plastikteile an Steckkontakten entfernen und Pins um etwa 2 mm kürzen.
    • Display in Gehäuseoberteil (das mit dem Button) einsetzen.
    • Stecker auf die gekürzten Pins aufstecken (Polung beachten). Gegebenenfalls die Pins weiter kürzen, -bis der Stecker ganz auf dem Board aufliegt, damit er ins Displaygehäuse passt.
    • Magnete in die Seitentasche einsetzen.
      • Wenn Kompatibilität mit anderen OBS gewünscht ist, muss auf gleiche Polung -geachtet werden, da sonst die Halterungen nicht austauschbar sind.
      • Je nach Genauigkeit des 3D-Drucks können die Magnete lose sein und etwas klappern. -Die Magnete dann ggf. mit etwas Kleber fixieren oder mit einem Klebestreifen einwickeln.
    • Gehäuseunterteil aufsetzen und mit Schrauben fixieren.
    • Zugentlastung mit M3x8 Schrauben und Sechskantmuttern fixieren, dabei auf -sechseckige Fixierung auf jeweils einer Seite der Zugentlastung achten.
    Verschiedene Displays vom gleichen Lieferanten -Wenn nötig, Display mit Seitenschneider stutzen -Display in Gehäuse einpassen, ohne GewaltMagnete passend einlegenDas Display mit verschraubtem GehäuseZugsicherung fixieren

    Schritt 18: ESP32 flashen

    Zunächst muss die OpenBikeSensor-Firmware auf den ESP32 geflashed werden. -Am schnellsten sollte dies mit dem Chrome-Browser über diese Webseite gehen:

    Folge alternativ der Anleitung für dein Betriebssystem.

    Schritt 19: Elektronik testen

    Vor dem Einbau ins Gehäuse testen wir die Elektronik in dieser Reihenfolge:

    1. Ausschalten
    2. Batteriekabel polungsrichtig einstecken.
    3. Laden: Normales USB-C Ladegerät (5 V) anschließen
      • Einige Geräte funktionieren nur nach Anschluss an ein Ladegerät
      • Bei vollem Akku leuchtet das Modul blau, sonst rot.
    4. USB-C Kabel abstecken.
    5. Einschalten per Kippschalter (ohne dabei den Knopf am Display zu drücken)
      • Boot-Screen sollte auf dem Display erscheinen. Wenn nicht, nochmal aus- und, sofern nichts stinkt oder gar raucht, wieder einschalten.
    6. Bei angeschlossener GPS-Antenne GPS-Funktion im Freien testen
      • Nach einigen Minuten: GPS-Board blinkt, Boot-Screen wechselt zu Sensor-Anzeige. Werden 0 Satelliten angezeigt, wird trotzdem weitergesucht, was zu Beginn wegen des Downloads des Almanachs sehr lange dauern kann. 15 Minuten sind beim ersten Einschalten nicht ungewöhnlich.
      • Alternativ kann durch einen Druck auf den Taster vom Boot-Screen zur Sensor-Anzeige gewechelt werden.
    7. Sensoren-Funktion testen:
      • Sensoren mit den Sensor-Boards verbinden
        • Die Polung beachten. Siehe hierzu auch Schritt 13.
      • Zur Sensor-Anzeige wechseln, auf welcher in der Fußzeile die Roh-Werte, der Abstände (ohne Lenkerabstand) der Ultraschall-Sensoren, live angezeigt werden (Option “raw details” in der Konfiguration).
      • Hinweis: Der linke Sensor wird am äußeren, dem Loch zugewandten Sensor-Board angeschlossen.
    Die Elektronik funktioniert

    Schritt 21: Zusammenbau

    Vor dem Zusammenbau sicherstellen, dass die Firmware auf dem ESP32 aufgespielt ist, -dann muss dieser später nicht mehr ausgebaut werden.

    • Kabel und Halterung
      • Die vier Sechskantmuttern in die Wand des Gehäuses einsetzen (bei Gehäuse -mit zwei Halterungen sind es acht Sechskantmuttern).
      • Sind die Sechskantlöcher eng, die Muttern mit der längeren M3 Schraube -von der Außenseite in die Öffnung ziehen.
      • Ist ein Sechskantloch auch dafür zu eng, vorsichtig mit dem Lötkolben -nachdrücken, und die Mutter von der Außenseite mit der längeren Schraube führen. -Vermeide dabei, mit dem Lötkolben das Plastik zu berühren.
      • Falls du ein Gehäuse mit mehreren Montageöffnungen baust, entscheide dich, an -welcher Öffnung du die Halteklammer installieren willst. Diese Öffnung -führt auch später das Kabel. Die andere Öffnung wird mit dem Deckel -(AttachmentCover) verschlossen.
    • PCB im Hauptgehäuse platzieren
      • Zunächst die SD-Karte einlegen und den ESP32 aufstecken, dabei auf die -Polung achten (USB-Markierung mit Mikro-USB-Stecker auf ESP32 abgleichen) -und sicherstellen, dass die Pins nicht um ein oder zwei Löcher verrutscht -eingesteckt werden.
      • Gesamtes Board in leichtem Winkel herabsenken, auf Ausrichtung der USB-C -Ladebuchse achten. Bei Wiederzusammenbau am Displaykabel vorbei navigieren.
      • Bei Bedarf Unreinheiten des Gehäuses (vom 3D-Druck) entfernen, wenn das PCB -daran hängen bleibt.
      • Mit 3 Stück M3x6 oder M3x8 im Gehäuse verschrauben.
    • Displaykabel in Gehäuse einstecken
      • Führe das Displaykabel mit dem Stecker voran von außen in das Hauptgehäuse hinein -(falls in Schritt 16 nicht geschehen).
      • Die Halterung mit Zugentlastung anbringen und damit das Kabel fixieren. -Noch nicht festziehen, nur sicherstellen dass die Muttern nicht mehr -herausfallen.
      • Das Kabel sollte außen um die Elektronik herumgeführt werden, nicht -zwischen dem GPS- und SD-Karten-Modul hindurch. Im neuen Gehäuse sollte -dort genug Platz sein.
      • Jetzt zeigt sich auch, warum ca. 5 cm Abisolierung hier sinnvoll ist, denn -ohne Isolierung ist das Kabel flexibler.
      • Stecker einsetzen (z.B. mit Pinzette)
      • Kabel so weit aus der Zugsicherung herausziehen, bis kein überschüssiges -Kabel im Innenraum des Gehäuses ist, aber das Kabel nicht straff liegt.
      • Schrauben der Zugsicherung bzw. Halterung nun fest anziehen.
    • GPS-Antenne einsetzen
      • Kabel der Antenne mit kleinem Stecker durch das kleine Loch fädeln.
      • GPS-Antenne mit Schirmung nach unten und Keramik nach oben in die -quadratische Aussparung einsetzen.
      • Den Antennenstecker auf das GPS-Board aufstecken. Der Stecker ist sehr -filigran und schwer zu stecken, es geht gut ihn mit den Fingern zu -platzieren und mit einer Pinzette den Stecker und die GPS-Modulplatine -zusammenzudrücken. Dabei auf richtigen Sitz achten um den Stecker nicht zu -beschädigen.
      • Den GPS-Deckel über die Antenne schieben und mit einer M3x6 oder M3x8 -Schraube fixieren.
      • Falls das Antennenkabel nicht reicht, kann die GPS-Antenne mithilfe eines -hinreichend langen Antennenkabels mit IPEX/U.FL Stecker verlängert werden. -Hierzu:
        • Den Metallschild des GPS-Moduls ablöten.
        • Das neue Kabel vorsichtig durch Rollen unter Cuttermesser auf etwa -5-7 mm abisolieren.
        • Die Schirmung zurückschieben.
        • Noch vorsichtiger die innere Isolierung durch ganz sanftes Rollen -mit dem Cuttermesser abisolieren.
        • Das kurze Kabel ab- und das neue, längere anlöten.
        • Den Metallschild des Moduls wieder in ursprünglicher Ausrichtung -auflöten.
    • Schalter in Gehäuse einsetzen
      • Einschaltrichtung mit “I/O” Aufdruck des Gehäuses vergleichen.
      • Möglichst mit der mitgelieferten Unterlegscheibe und Mutter fixieren.
      • Schalterkabel verdrillen.
      • Kabel entlang der Gehäusewand zur Buchse führen und dort einstecken.
    • Sensoren einbauen
      • Auf der Rückseite des Sensors gibt es einen Pfeil, der mit “UP” die -Richtung markiert, wo später oben sein soll.
      • Einen Sensor ins Hauptgehäuse einbauen, den anderen in den Deckel.
      • Sensoren einstecken. Den Sensor im Gehäuse an das ihm naheliegendste -Sensorboard anschließen, den Sensor vom Deckel in das entferntere (Anschluss über dem ESP32).
    • Akku einbauen
      • Akku im Deckel mit Kabelbinder fixieren (falls in Schritt 14 noch nicht erledigt)
      • Einstecken. Polung beachten!
      • Möglicherweise überstehendes Kabel möglichst auf der Seite des GPS -verstauen. Beide Adern verdrillen und parallel legen.
    • Konfiguration des Sensors:
      • Die Anzeige kann im Konfigurationsmodus auf den Simple-Mode gestellt werden.
      • Außerdem kann die Breite des Lenkers und WLAN eingestellt werden.
      • Bei einem Reboot des Sensors wird nun auf der Sensor-Anzeige der Simple-Mode mit dem Abstand des linken Sensors angezeigt - abzüglich der Breite des Lenkers.
    • Montage und Testfahrt mit dem Fahrrad.
    Akku und Ultraschallsensor an Deckel montieren ('Up'-Pfeil beachten)Ultraschallsensoren einsteckenLadebuchse (USB-C) ohne Gewalt in die Aussparung einfädelnPCB festschraubenHalterung und Zugentlastung festschraubenGPS-Deckel festschraubenDeckel festschraubenFertig!

    2.6 - Fehlersuche

    Dieser Bereich enthält Anleitungen und Links zu Informationen, die bei bekannten Schwierigkeiten und Problemen Abhilfe schaffen könnten.

    Solltest du einem Problem begegnen, das hier noch nicht aufgeführt ist, könnte -eine Suche im Forum helfen. Findest -du auch dort nichts, ist die Kategorie Hilfe & -Support der richtige Ort, eine -Frage zu stellen und Unterstützung zu bekommen.

    Displaymeldung SD Error

    Es wird eine SD-Karte im Format FAT32 benötigt - Neuere SD-Karten kommen manchmal mit dem exFAT Dateisystem und müssen entsprechend umformatiert werden - unter Windows: Rechtsklick->Formatieren.

    Sind mehrere OpenBikeSensoren zur Hand, kann eine SD-Karte aus einem funktionierenden Sensor zum Testen verwendet werden - Funktioniert ein OpenBikeSensor auch mit der als funktionierend bekannten SD-Karte nicht, gibt es ein Problem mit dem SD-Karten Board oder dessen Verlötung. Funktioniert es mit der SD-Karte des anderen OpenBikeSensors, gibt es ein Problem mit der SD-Karte.

    Konnte die SD-Karte als Fehlerquelle ausgeschlossen werden, sollten die Lötstellen des SD-Boards (und die korresppondierenden Lötstellen an der ESP32 Sockelleiste) geprüft werden. Die Datenleitungen SD_CD/CS, SD_CLK/CLK, SD_DAT0/MISO und SD_CMD/MOSI liegen auf den Pins am ESP, die mit D5,D18,D19 und D23 beschriftet sind und können mit einem Multimeter durchgepiepst werden.

    In manchen Fällen kann es auch vorkommen, dass eine SD-Karte verwendet wird, die den alten SD-Standard nicht unterstützt, der vom OpenBikeSensor genutzt wird. Liegt keine “als funktionierend bekannte” SD-Karte vor, kann man das am einfachsten durch Einsatz einer möglichst alten (aber noch funktionierenden) SD-Karte prüfen, - z.B. aus einem alten Handy, MP3-Player, Raspberry Pi…, da ältere SD-Karten den Standard mith höherer Wahrscheinlichkeit unterstützen. Die SD-Karte muss natürlich auch FAT32 formatiert werden, um vom OpenBikeSensor genutzt zu werden.

    GPS

    Denke daran, dass das GPS Modul nur ein paar Euro kostet - im Notfall ist ein Tausch des GPS-Moduls also kein finanzieller Beinbruch.

    Ultraschallsensoren

    Phantommessungen

    Wenn die Kabel falsch herum gekrimpt sind, kommt es oft zu Störugen am Ultraschallsensor - diese äußern sich durch häufige Messwerte auch wenn gar kein Objekt Ultraschall reflektieren kann.

    Mögliche Ursachen:

    • Bei den Kabeln der Ultraschallsensoren sollte die Schirmung auf dem Pin des Ultraschallboards liegen, der weiter entfernt von dem großen viereckigen Metallbauteil liegt. Bei manchen Boards ist dieser auch mit “-” beschriftet.
    • Wenn Batterie - oder Schalterkabel große Leiterschleifen in der Nähe der Sensorboards bilden, kommt es oft zu Störungen der Ultraschallsensoren. Verdrille Batterie- und Schalterkabel, um diese Leiterschleifen zu vermeiden.

    Keine Messung

    • Werden keine Ultraschallmesswerte angezeigt, auch wenn z.B. gegen eine Wand gemessen wird gibt es mehrere mögliche Ursachen:
      • Bei Fehlern beim Krimpen haben die Sensoren manchmal keinen Kontakt am Krimp, neu Krimpen kann hier helfen.
      • Bei Fehlern beim Verlöten des Ultraschallboards ist ggf das gesamte Board nicht aktiv (Lötstellen Prüfen)
      • Wenn nur ein Ultraschallsensor funktioniert, lässt sich durch tausch der Transducer prüfen, ob der Fehler durch das Ultraschallboard verursacht wird (Der Fehler bleibt auf der gleichen Seite) oder durch den Ultraschallsensor selbst (der Fehler wandert mit dem Ultraschallsensor auf die andere Seite).

    Falls die oberen beiden Ursachen ausgeschlossen werden können hilft manchmal die Anleitung zur Kalibrierung

    3 - Firmware

    Firmware ist die Bezeichung für Software, die auf eingebetteten Systemen wie -dem ESP32 und anderen Mikroprozessoren läuft, und dort für die Funktionalität -der Hardware verantwortlich ist. Beim OpenBikeSensor ist dies also ein Programm -das wir selbst schreiben, mit dem der ESP32 bespielt wird, und das sich um die -Aufzeichnung der zu messenden Daten, die Anzeige im Display und die ganze -Konfigurationsoberfläche kümmert.

    Die Firmware wird, wie alle Softwareteile, unter Open Source Lizenz auf GitHub -entwickelt: https://github.com/openbikesensor/OpenBikeSensorFirmware. Für die -Weiterentwicklung sind alle eingeladen, die sich für -Mikroprozessorprogrammierung interessieren.

    Featurewünsche oder Fehlerberichte sammeln wir im Issue -Tracker auf -GitHub.

    Installation / Flashen

    Ein etwas komplizierter Schritt beim Aufbau des Sensors, den alle Bastler:innen -mindestens einmal mit ihrem neuen Gerät durchlaufen müssen, ist die initiale -Installation der Firmware auf dem ESP32. Dies wird auch als “Flashen” (engl. -to flash) bezeichnet.

    Hierfür muss das Mikroprozessor-Board aus dem OpenBikeSensor ausgebaut und mit -einem USB-Kabel an einen Computer angeschlossen werden. Die Anleitungen für das -Übertragen der Firmware auf den Mikroprozessor unterscheidet sich stark nach -Betriebssystem des Computers, daher haben wir sie hier getrennt aufgeführt:

    Versionsupgrade

    Eine neue Version der Firmware kann direkt über die Bedienoberfläche -eingespielt werden. Hierfür gibt es entsprechende Menüpunkte im Hauptmenü. Ein -Auseinanderbauen des Geräts und der Anschluss an einen Computer sind dafür -nicht mehr nötig.

    GGF musst du zunächst das “Flashtool” (über die OpenBikeSensor Oberfläche) installieren. -Danach kannst du, wenn dein OpenBikeSensor in einem internetfähigen WLAN eingebucht -ist über das Wlan-Menü deines OpenBikeSensors Firmwareupdates anstoßen.

    Bauen und Flashen der Firmware aus dem gihub-Repository

    mit VisualStudio Code und PlatformIO

    Zunächst VS Code und darin die Erweiterung PlatformIO -installieren.

    Danach den gewünschten Stand der OBS-Firmware aus dem github-Repository klonen und das Verzeichnis in VS Code öffnen. Dann mit dem Upload-Befehl (Pfeil nach rechts in der Fußzeile von VS Code) oder per pio run -t upload in der PlatformIO CLI auf den ESP32 flashen.

    3.1 - Flashen mit platformio

    Hast du git und python3 installiert, kannst du mit folgenden Kommandos die OpenBikeSensor Firmware bauen und flashen.

    Vorbereiten des Firmwareverzeichnisses:

    # Git-Repo klonen
    -git clone https://github.com/openbikesensor/OpenBikeSensorFirmware.git
    -cd OpenBikeSensorFirmware
    -# Platformio in einem virtuellen Python Environment installieren
    -python3 -m venv venv
    -venv/bin/pip install platformio
    -

    Flashen

    Nun kannst du den ESP (nicht den OpenBikeSensor) per USB-Kabel mit deinem Rechner verbinden und mit folgendem Kommando die Firmware flashen. (je nach systemkonfiguration benötigtst du dafür evtl. root-rechte). GGF ist es dafür nötig den boot-Knopf am ESP zu drücken.

    platformio run -t upload
    -

    Nach dem Flashen

    Es empfiehlt sich, dich in den Konfigurationsmodus zu begeben, um

    • Dein internetfähiges WLAN im OpenBikeSensor zu konfigurieren.
    • Das Flashtool zu installieren.
    • Noch einmal ein Firmwareupdate aus dem Internet zu installieren.
    • Deinen API-Key für Datenuploads einzurichten.

    3.2 - Flashen unter Linux

    Alternative 1: Installation via Browser

    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google Chrome oder Chromium zu öffnen und der Schritt-Für-Schritt Anleitung dort zu folgen. Funktioniert das für dich nicht, probiere eine der anderen Alternativen.

    Alternative 2:

    In der Allgemeinen Installationsanleitung wird der betriebssystemunabhängige Weg über Visual Studio Code und Platformio geschildert.

    Alternative 3: Installation mit esptool

    Vorbereitung

    Lade das neueste Release-Archiv -der OBS-Firmware von GitHub herunter.

    Du benötigst die ZIP-Datei mit dem Namen obs-v9.9.9.9999-initial-flash.zip (v9.9.9.9999 steht für die Versionsnummer). -Entpacke die Dateien in einem temporären Verzeichnis, sie heißen 0x??????.bin. Die Zahlen sind die Basisadresse, an die -die Daten geflasht werden sollen.

    Installation

    Installiere das Programm esptool, falls es noch nicht installiert ist. Es ist in den -meisten Linux-Distributionen verfügbar.

    Debian GNU/Linux, Ubuntu

    und davon abgeleitete Distributionen, wie z. B. Linux Mint

    sudo apt install esptool
    -

    Fedora

    sudo dnf install esptool
    -

    Alternative Installation

    Sollte Deine Linux Distribution dieses Paket nicht enthalten, dann kannst du versuchen es so zu installieren.

    • lege ein Verzeichnis an, in dem das Tool installiert werden soll, und wechsle in dieses Verzeichnis
    mkdir ~/esptool
    -cd ~/esptool
    -
    • für die Installation gib nacheinander folgende Befehle ein
    python3 -m venv venv
    -. venv/bin/activate
    -pip install esptool
    -
    • nun lass dir die Version anzeigen
    esptool.py version
    -
    • war die Installation erfolgreich, dann wird die Versionsnummer angezeigt (diese kann bei dir abweichend sein)
    esptool.py v3.2
    -3.2
    -

    Gerätenamen herausfinden

    Stelle sicher, dass du den Gerätenamen für das USB-Gerät kennst. Sehr wahrscheinlich wird es /dev/ttyUSB0 sein – -dieser Name wird auch im weiteren Beispiel verwendet.

    Herausfinden kannst du den Namen mit folgenden Schritten:

    • den OpenBikeSensor noch nicht mit dem Computer verbinden
    • in einem Terminal eingeben und ausführen
    ls -1d /dev/ttyUSB*
    -
    • wenn kein solches USB-Gerät an deinem Computer angeschlossen ist, wird ein Fehler angezeigt, anderenfalls eine Liste -der vorhandenen /dev/ttyUSB Geräte, z. B.
    /dev/ttyUSB0
    -/dev/ttyUSB1
    -
    • nun den OpenBikeSensor anschließen, einige Sekunden warten und nochmal im Terminal eingeben und ausführen
    ls -1d /dev/ttyUSB*
    -
    • nun sollte in der Liste der Geräte ein Eintrag dazugekommen sein, dies ist der Gerätename für deinen OpenBikeSensor
    /dev/ttyUSB0
    -/dev/ttyUSB1
    -/dev/ttyUSB2  <-- neu hinzugekommen
    -

    Flashen

    Führe im selben Verzeichnis, in das du die ZIP-Datei entpackt hast, folgenden Befehl aus:

    esptool \
    -    --chip esp32 \
    -    --port /dev/ttyUSB0 \
    -    --baud 921600 \
    -    --before default_reset \
    -    --after hard_reset \
    -    write_flash -z \
    -    --flash_mode dio \
    -    --flash_freq 40m \
    -    --flash_size detect \
    -    0x1000 0x01000.bin \
    -    0x8000 0x08000.bin \
    -    0xe000 0x0e000.bin \
    -    0x10000 0x10000.bin
    -
    cd ~/esptool
    -. venv/bin/activate
    -

    Und das Kommando esptool durch esptool.py ersetzen.

    • python3 esptool.py ...
    • python esptool.py ...
    • python3 /absoluter/pfad/zu/esptool.py ... (Pfad beim Paketmanager recherchieren)
    • python /absoluter/pfad/zu/esptool.py ... (s. o.)
    • python3 -m esptool ...
    • python -m esptool ...

    Führt auch keiner dieser Aufrufe zum Erfolg, melde dich im Forum (https://forum.openbikesensor.org), wir finden gemeinsam eine Lösung.

    Versionsupdates

    Versionsupdates können in weiterer Folge über die Weboberfläche des OpenBikeSensors erfolgen und nicht mehr durch den oben angeführten, doch recht komplizierten Vorgang.

    Jetzt ist dein OpenBikeSensor einsatzbereit und du kannst mit der Konfiguration fortfahren!

    Bei Problemen

    Wenn du keine Schreibberechtigung hast, kannst du den Dateimodus des Geräts ändern (oder das Kommando als root ausführen):

    sudo chmod 0x666 /dev/ttyUSB0
    -

    Wenn du öfter mit dem ESP32 arbeitest, installiere dir entsprechende udev-Regeln.

    Sollte alles fehlschlagen, und du noch Fragen haben oder weitere Infos suchen, findest -du in der Community immer Hilfe.

    3.3 - Flashen unter Windows

    Installation via Browser

    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google chrome zu öffnen und der Schritt-Für-Schritt anleitung dort zu folgen. Funktioniert das für dich nicht, folge den Schritten unten.

    Firmware herunterladen

    Lade das neueste -Release-Archiv -der OBS-Firmware von GitHub herunter.

    Du benötigst die größere ZIP-Datei mit dem Namen -obs-v9.9.9.9999-initial-flash.zip. Entpacke die Dateien in einen temporären -Ordner, sie heißen 0x??????.bin. Die Zahlen sind die Basisadresse, an die die -Daten geflasht werden sollen. Mach dir keine Gedanken darüber, was das bedeutet, -dies wird in den nächsten Schritten Sinn ergeben.

    Flash Tools herunterladen

    Lade die “Flash Download Tools” für -ESP32 (und einige -verwandte Chips) vom Hersteller ESPRESSIF herunter und extrahieren das Archiv -in einen speziellen temporären Ordner.

    Es erfolgt keine Installation, vielmehr wird das Tool direkt aus dem Ordner -heraus gestartet.

    Treiber installieren

    Du musst wahrscheinlich einen sogenannten USB-to-UART (seriellen) Treiber -installieren, damit Windows mit dem Chip auf dem ESP-Entwicklungsboard -kommunizieren kann. Da es sich um einen generischen Treiber handelt, hast du -diesen möglicherweise bereits schon bei anderen Projekten installiert? Im -Zweifelsfall lade und installiere sicherheitshalber den Treiber von der -Herstellerseite, Silicon Labs. Eventuell kann es sich auch lohnen, auf die -neueste Version zu aktualisieren. Der Treiber ist im Paket für die CP210x-Chips -enthalten. Du findest ihn auf dieser -Seite, er -heißt “CP210x Universal Windows Driver”. Folge den dort gegebenen Anweisungen.

    Sollte der Link nicht mehr funktionieren, verwende Google, um eine -aktualisierte Version zu erhalten, aber achte wie gewohnt darauf, dass du auf -einer vertrauenswürdigen Seite landest.

    Flash Tool Bedienung

    Trenne alle USB-Geräte vom Computer, die du gerade nicht benötigst. Der -Anschluss könnte ansonsten bei der Auswahl des richtigen (zu flashenden) -Gerätes verwechselt werden.

    Verbinde nun das ESP32 Board über USB-Kabel. Du kannst das Entwicklungsboard -hierfür aus dem OpenBikeSensor ausbauen, oder nur die Stromzufuhr der Batterie -mit dem Schalter trennen (normal ausschalten) und das USB-Kabel durch die -Öffnung hinter der GPS-Antenne führen und in das eingebauten Board einstecken.

    Windows sollte bestätigen, dass ein neues Gerät erkannt wurde. Manche Kabel -funktionieren nicht, wenn dein Gerät nicht erkannt wird, probiere es mit einem -anderen.

    Starte die ausführbare Datei flash_download_tool_3.X.X.exe im Ordner des -Flash Download Tools. Das dauert ein wenig – nur Geduld. Es öffnet zuerst ein -Konsolenfenster und schließlich eine einfache Benutzeroberfläche.

    Wähle Entwicklermodus - ESP32 DownloadTool in der Benutzeroberfläche (der -Factory-Modus kann verwendet werden, wenn mehrere ESPs gleichzeitig geflasht -werden sollen – in diesem Fall kann man auch mehrere ESPs gleichzeitig -verbinden).

    Eine korrekte Konfiguration der ESP32 Flash Download Tools (klicken zum Vergrößern)

    Jetzt musst du dem Tool mitteilen, was geflasht werden soll. Oben im Dialog -gibt es mehrere Zeilen, beginnend mit Kontrollkästchen, einem Textbereich, -einen Knopf mit drei Punkten, einem @-Zeichen und einem weiteren Textbereich.

    Wähle für jede der 4 Dateien, die wir flashen müssen, die drei Punkte aus, die -eine Dateiauswahl ermöglichen, in der du jeweils eine der 4 *.bin-Dateien der -Firmware auswählst. Die Reihenfolge ist nicht wichtig, aber du musst die -Adresse der Datei in das rechteste Textfeld eingeben. Die Adresse steht jeweils -im Dateinamen, z. B. 0x01000. Die Kästchen wechselt auf grünen Hintergrund, -was eine positive Plausibilitätsprüfung des Flash-Tools bedeutet.

    Aktivieren nun die Kontrollkästchen, die sich vor den soeben vorgenommenen Eingaben befinden. -Alle anderen Werte bleiben auf ihren Standardeinstellungen:

    • SPI SPEED: 40MHz
    • SPI MODE: DIO (ändert sich gleich automatisch)
    • FLASH SIZE: 32Mbit
    • SpiAutoSet: nicht ausgewählt
    • DoNotChgBin: ausgewählt

    Unten siehst du eine Dropdown-Box mit der Beschriftung COM. Hier musst du den -richtigen COM-Port für den Flash-Vorgang auswählen. Wenn du dir nicht sicher -bist, belasse den Standardwert und versuchen einen anderen Wert, wenn der -Vorgang fehlschlägt. Stelle sicher, dass keine anderen Geräte angeschlossen -sind!

    Drücke nun Start. Danach solltest du etwa Folgendes sehen: „Flashing in Progress“

    Wenn alles richtig läuft, erhältst du einen Fortschrittsbalken mit einer -abschließenden Erfolgsmeldung. Ziehe danach das USB-Kabel ab. Das ESP32 kann -dann in das OpenBikeSensor-Gehäuse eingebaut werden (falls noch nicht -geschehen).

    Versionsupdates können in weiterer Folge über die Weboberfläche des -OpenBikeSensors erfolgen und nicht mehr durch den oben angeführten, doch recht -komplizierten Vorgang.

    Jetzt ist dein OpenBikeSensor einsatzbereit und du kannst mit der -Konfiguration -fortfahren!

    Bei Problemen

    Wenn du eine rote Fehlermeldung erhältst, überprüfe ob die USB-Verbindung -korrekt ist und der richtige COM-Port ausgewählt wurde. Wenn alles fehlschlägt, -und du hast Fragen oder weitere Infos suchst, findest du in der Community immer Hilfe.

    3.4 - Flashen unter macOS

    Installation via Browser

    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google Chrome zu öffnen und der Schritt-Für-Schritt anleitung dort zu folgen. Funktioniert das für dich nicht, folge den Schritten unten.

    Vorbereitung

    Lade das neueste -Release-Archiv -der OBS-Firmware von GitHub herunter.

    Du benötigst die größere ZIP-Datei mit dem Namen -obs-v9.9.9.9999-initial-flash.zip. Entpacke die Dateien in einen temporären -Ordner, sie heißen 0x??????.bin. Die Zahlen sind die Basisadresse, an die die -Daten geflasht werden sollen.

    Installiere das Programm esptool, falls es noch nicht installiert ist. Über -Homebrew kannst du es so bekommen:

    brew install esptool
    -

    Stelle sicher, dass du den Gerätenamen für das USB-Gerät kennst. Dies ist -normalerweise /dev/tty.usbserial-0001 – dies wird auch im Beispiel unten -angenommen. Auf macOS kannst du deine aktuellen USB-Geräte mit ioreg -p IOUSB -w0 -l auflisten. Suche im Zweifelsfall nach einem USB-zu-UART-USB-Gerät.

    Flashen

    Führe im selben Verzeichnis, in das du die ZIP-Datei entpackt hast, folgenden Befehl aus:

    esptool.py \
    -    --chip esp32 \
    -    --port /dev/tty.usbserial-0001 \
    -    --baud 921600 \
    -    --before default_reset \
    -    --after hard_reset \
    -    write_flash -z \
    -    --flash_mode dio \
    -    --flash_freq 40m \
    -    --flash_size detect \
    -    0x1000 0x01000.bin \
    -    0x8000 0x08000.bin \
    -    0xe000 0x0e000.bin \
    -    0x10000 0x10000.bin
    -

    Bei Problemen

    Wenn du keine Schreibberechtigung hast, kannst du den Dateimodus des Geräts -ändern (oder das Kommando als root ausführen):

    sudo chmod 0x777 /dev/tty.usbserial-0001
    -

    Sollte alles fehlschlagen, und du noch Fragen haben oder weitere Infos suchen, findest -du in der Community immer Hilfe.

    4 - Verschiedenes

    In diesem Bereich der Dokumentation sammeln sich Artikel, die sonst nirgendwo so richtig hinpassen.

    4.1 - Hinweise für Sammelbestellungen

    Diese Seite soll einige Informationen bereitstellen, die wir bei früheren -Sammelbestellungen gesammelt haben.

    Überprüfe alles noch einmal

    Bitte beachte, dass sich das Projekt noch in der Entwicklung befindet, d.h. -Änderungen in Hardware oder Design sind zu jeder Zeit möglich. Bevor du Teile -bestellst, speziell bei größeren Mengen, überprüfe bitte dass das zugrundeliegende -Design und die Teileliste zusammenpassen. Und nicht das Eine neuer ist als -das Andere. Wenn du mehrere Gehäuse drucken willst: Starte den Seriendruck -erst, nachdem du ein Gerät fertig gelötet und zusammengeschraubt hast - so -weißt du, dass alles passt.

    Ultraschallsensor-Boards

    Die sensibelsten Teile des OBS sind die beiden Ultraschallsensoren. -Es gibt verschiedene Modelle auf dem Markt, aber viele werden unter der gleichen -Bezeichnung verkauft, JSN-SR04T.

    AJ-SR04M

    • Eigenschaften:
      • Betriebsmodus wird über Widerstand R19 gesteuert
      • 8 MHz Schwingquarz
      • Betriebsspannung: 3V bis 5,5V
    • Datenblatt

    AJ-SR04M: generelles Aussehen

    AJ-SR04M: das Modell von der Sammelbestellung im February 2021

    JSN-SR04T

    • Eigenschaften:
      • vermutlich kein Widerstand um den Betriebsmodus zu ändern
      • quer liegender IC an der Anschlussseite
      • 11.0592 MHz Schwingquarz
      • Betriebsspannung: 5V
    • Das Datenblatt, das oft auf Chinesischen Seiten erwähnt wird ist JSN-SR04T一体化超声波测距说明书.pdf (Englische Übersetzung).

    JSN-SR04T: Vorderseite (1)

    JSN-SR04T: Vorderseite (2)

    JSN-SR04T: Rückseite (1)

    JSN-SR04T: Rückseite (2)

    JSN-SR04T-2.0

    • Eigenschaften:
      • Betriebsmodus wird über Widerstand R27 gesteuert
      • 8 MHz Schwingquarz
      • Betriebsspannung: 3,3V bis 5,5V
    • Datenblatt

    JSN-SR04T-2.0

    JSN-SR04T-V3.0

    • Eigenschaften:
      • der Widerstand “mode” und die Überbrückungen “M1” und “M2” steuern den Betriebsmodus
      • 8 MHz Schwingquarz
      • Betriebsspannung: 3,3V bis 5,5V
    • Dokumentation

    JSN-SR04T-v3.0

    SR04M-2

    Nach ersten Tests scheint, dass dieses Modell nicht im OpenBikeSensor Abstandsmesser funktioniert.

    • Eigenschaften:
      • unbekannt

    SR04M-2

    4.2 - Privatsphäre-Zonen

    Privatsphäre-Zonen sind ein wichtiges Konzept im OpenBikeSensor-Ökosystem. Sie werden im OpenBikeSensor selbst, als auch im Datenportal verwendet, um Deinen Standort in bestimmten Bereichen zu verbergen.

    Dies ist eine Funktion zum Schutz der Privatsphäre. Da hochgeladene Daten im Datenportal (Open Data Repository) veröffentlicht werden können, ist es für den Benutzer möglich Privatsphäre-Zonen zu konfigurieren, um die eigene Privatsphäre zu verbergen. Im schlimmsten Fall könnte ein böswilliger Akteur anhand der Daten herausfinden, wo Du wohnst, arbeitest oder Dich häufig aufhälst.

    So funktionieren Privatsphäre-Zonen

    Eine Privatsphäre-Zone kann entweder im Sensorgerät selbst konfiguriert werden - wodurch sich die Aufzeichnungsaktivität ändert - oder später im Datenportal, wo die Privatsphäre-Zone dann zum Filtern von Daten vor der Veröffentlichung verwendet wird. Je nachdem, wie man den Sensor verwendet und wie groß die Bedenken sind, kann man eine oder auch beide Optionen wählen.

    Eine Privatsphäre-Zone ist ein kreisförmiger Bereich, der durch einen Mittelpunkt und einen Radius definiert ist. Damit können Daten maskiert werden. Du kannst mehrere dieser Zonen an relevanten Orten einrichten, damit böswillige Akteure nicht erkennen können, wo deine Spuren beginnen und enden:

    • Das Zuhause
    • Der Arbeitsplatz, Schule, Uni
    • Wohnungen von Freunden
    • Jeder Ort, an dem Du Dich mit dem Fahrrad regelmäßig aufhältst

    Aufzeichnungsalternativen

    Es gibt 4 Alternativen für den OpenBikeSensor um persöhnliche Daten zu schützen:

    1. Privatsphäre-Zonen im OBS einrichten
    2. Privatsphäre-Zonen im Datenportal einrichten
    3. die Track daten auf eigenem PC privatisieren bevor sie ins Portal hochgeldaen werden
    4. Keine Daten hochladen

    Welchen Modus kannst Du auswählen

    1. Wenn Du Privatsphäre-Zonen Einstellungen im OBS vornimmst und aktivierst, werden in diesen Bereichen keine Daten aufgezeichnet, sind also für niemanden zugänglich. Auch nicht für Dich, wenn Du z.B. die SD-Karte aus dem Sensor nimmst und die Dateien auf einen Computer überträgst.

    2. Wenn Du Deine eigenen Daten haben möchtest, diese aber nicht veröffentlicht werden sollen, kannst Du die Privatsphäre-Zonen stattdessen im Datenportal einrichten. Das bedeutet zwar, dass man darauf vertrauen muß, dass die Software des Datenportals ihre Aufgabe ordnungsgemäß erfüllt (und niemand kann garantieren, dass dies der Fall ist, aber wir versprechen, dass wir unser Bestes geben), aber Du kannst dann die unmaskierten Daten selbst vom Portal herunterladen.

    3. Eine dritte Möglichkeit besteht darin, die Daten nicht direkt vom OBS in das Datenportal hochzuladen, sondern die Track-Dateien erst einmal auf Deinen Computer zu verschieben. Dann kannst Du mit einem eigenen Skript die Daten privatisieren, bevor sie von Deinem Computer aus in das Datenportal hochladen werden.

    4. Die sicherste Option ist natürlich, die Daten überhaupt nicht hochzuladen. Aber wozu bauen wir dann einen OpenBikeSensor und ein Auswerte Software?

    Ein weiterer Unterschied zwischen der Konfiguration der Privatsphäre-Zonen im OpenBikeSensor und im Datenportal ist, dass der OpenBikeSensor die Datenschutzeinstellungen nicht rückwirkend anwendet. Wenn Du also einen Ort vergessen oder nicht den richtigen Aufzeichnungsmodus gewählt hast, bevor Du losgefahren bist, sind die Daten bereits im Track gespeichert.

    Das Datenportal hingegen wendet die Privatsphäre-Zonen bei jeder Änderung auf alle vergangenen (und zukünftigen) Tracks an.

    Allerdings ist zu bedenken, dass, sobald die Daten im Open-Data-Repository veröffentlicht sind, jeder bereits eine Kopie heruntergeladen haben könnte, und man diese nicht mehr zurücknehmen kann. Also die Einstellungen immer überprüfen, bevor man sie veröffentlicht!

    Privacy in the OBS ecosystem

    Warum Privatsphäre-Zonen verschoben werden können

    Wenn Du mehrere Tracks mit anonymisierten Daten veröffentlichst, könnte jeder die private Sphäre aus den veröffentlichten Daten rekonstruieren. Die Tracks, die von und zu einem privaten Ort innerhalb der Privatsphäre führen, werden zwar an der Grenze der Zone abgeschnitten, aber wenn Du mit dem Fahrrad in verschiedene Richtungen fährst, weg von Deinem privaten Punkt, ist es möglich, den Kreis, der zum Abschneiden der Spuren definiert wurde, mathematisch zu finden.

    Daher ist es nicht ratsam, den Mittelpunkt der Privatsphäre genau auf die Stelle zu legen, von der Du nicht willst, dass andere sie kennen. Im OpenBikeSensor hast Du die Möglichkeit, Deine Privatsphäre manuell in eine beliebige Richtung zu verschieben. Du solltest dies nur einmal für jede Zone tun. Man kann auch ein beliebiges externes Kartentool verwenden und manuell Zentralkoordinaten für eine Privatsphäre finden, die sinnvoll erscheint, aber nicht genau der privater Standort ist.

    Im Datenportal kannst Du den Kreis manuell so auf der Karte platzieren, dass er Deine privaten Standorte enthält. Oder Du gibst den tatsächlichen privaten Standort an und lässt die App einen zufälligen Offset wählen. Auf beiden Wegen kannst Du die verschobene Zone vor dem Speichern visuell überprüfen.

    Übrigens: Aus demselben Grund wie oben solltest Du den Versatz Deiner Privatsphäre-Zonen nicht zu oft ändern. Andernfalls ist es möglich, viele Kreise aus den Daten zu rekonstruieren, die alle den privaten Standort enthalten. Dies würde den Zweck der Verschiebung der Privatsphäre zunichte machen, da es die Größe des Bereichs, der wahrscheinlich den privaten Standort enthält, verringert. Das wäre kontraproduktiv, es verringert die Sicherheit, anstatt sie zu erhöhen!

    4.3 - Offline-Visualisierung

    Dieser Artikel beschreibt das Vorgehen, um offline, also ohne ein voll -funktionsfähiges Portal, eine Visualisierung bestehender Trackdateien -vorzunehmen.

    Dieses Vorgehen ist veraltet. Es funktioniert noch, aber in nächster Zeit wird -mehr Energie in die Weiterentwicklung des Portals gesteckt, da hier durch die -leistungsstärkere Architektur viel mehr Möglichkeiten zur Datenverarbeitung und -Visualisierung bestehen. Dennoch lässt sich mit diesem Vorgehen einiges -erreichen, wenn gerade kein Portal zur Hand ist, oder ein tieferer Einblick -erwünscht ist, als es das stark verarbeitende Portal erlaubt.

    Diese Anleitung sollte mit höchstens kleinen Anpassungen auf allen -Linux-Distributionen und unter macOS funktionieren, sofern Python 3.8 oder -höher verfügbar ist. Hat deine Distribution nur ältere Versionen, schau’ doch -mal ob -Anaconda/Conda -dir hier aushelfen kann, lokal eine andere Version zu installieren. Prüfe deine -Python-Version vorab mit dem Kommando python3 -V.

    Dieser Artikel beschreibt nur die Grundlagen, damit auch Anfänger:innen sich -ihre Daten anzeigen können. Weitere Features und Details sind direkt im -Repository -dokumentiert.

    Code holen und installieren

    Im Terminal am gewünschten Zielort das Git-Repository -OpenBikeSensor-Scripts -clonen:

    git clone https://github.com/openbikesensor/OpenBikeSensor-Scripts obs-scripts
    -

    Zum Wechseln in das neue Verzeichnis:

    cd obs-scripts
    -

    Ab sofort müssen alle Kommandos von diesem Verzeichnis aus ausgeführt werden.

    Erstellen einer virtuellen Python-Umgebung zur Installation der Abhängigkeiten -und der Kommandozeilentools:

    python3 -m venv env
    -source env/bin/activate
    -

    Bitte achte darauf, bei Änderungen am Code das Verzeichnis env zu ignorieren -und nicht mit zu committen. Du kannst es auch woanders erstellen (z. B. in -deinem Home-Verzeichnis). Den zweiten Befehl von oben (source ...) musst du -jedes Mal ausführen, nachdem du mit einem neuen Terminal in dieses Verzeichnis -wechselst, bevor du die OBS-Skripte nutzen kannst.

    Installation des obs-face Pakets und dessen Abhängigkeiten:

    pip install -e .
    -

    Es dauert eine Weile, bis alles installiert ist. Bei Erfolg erscheint -Successfully installed … in einer der letzten Zeilen (evtl. gefolgt von -einer Warnung, die du aber ignorieren kannst), bei Misserfolg eine -Fehlermeldung. Wenn du hier Hilfe brauchst, poste die Fehlermeldung im Forum, -dort gibt es immer Unterstützung.

    Vorbereiten der Dateien

    Du brauchst nun geschachtelte Ordner innerhalb des Ordners obs-scripts. Diese -erstellst du mit mkdir oder mkdir -p, oder einfach mit der graphischen -Bedienoberfläche deines Betriebssystems.

    Wir benötigen folgende Struktur:

    data
    -└── input
    -    ├── user1
    -    │   ├── track1.csv
    -    │   └── track2.csv
    -    └── user2
    -        ├── track1.csv
    -        └── track2.csv
    -

    Also ein Verzeichnis data in obs-scripts, darin wiederum ein Verzeichnis -input, in welchem für jede:n Benutzer:in ein eigener Ordner liegt, der alle -Tracks enthält. Es ist okay, wenn das nur ein Ordner ist, aber wenn du von -mehreren Personen die Tracks einsammelst, kannst du sie hiermit unterscheiden.

    Datenverarbeitung

    Auf der Kommandozeile, mit aktivierter Python-Umgebung, kannst du nun folgendes -ausführen:

    obs-face -ACV
    -

    Dies dauert eine Weile, denn es werden OpenStreetMap-Daten heruntergeladen, und -dann alle Tracks aus data/input eingelesen und verarbeitet. Du kannst die -Ausgabe dieses Kommandos auf Plausibilität prüfen, um zu sehen ob alle deine -Tracks erkannt und eingelesen wurden.

    Visualisierung

    Für die folgenden Kommands wechseln wir zunächst ins Unterverzeichnis visualization:

    cd visualization
    -

    Nun erstellen wir einen symbolischen Link zwischen der Ausgabe der Verarbeitung -und dem Visualisierungscode:

    ln -s ../data/visualization json
    -

    Mit Python starten wir einen kleinen Webserver, der es uns erlaubt, das -Ergebnis im Browser zu sehen:

    python -m http.server
    -

    Nun kannst du in deinem Browser eine dieser Seiten besuchen:

    - \ No newline at end of file diff --git a/docs/classic/_print/index.html b/docs/classic/_print/index.html deleted file mode 100644 index c9866a2a..00000000 --- a/docs/classic/_print/index.html +++ /dev/null @@ -1,895 +0,0 @@ -OpenBikeSensor Classic | OpenBikeSensor - - - -

    1 - Überblick

    Der OpenBikeSensor Classic ist das Originalgerät, das seit 2018 in ehrenamtlicher Arbeit von vielen Beteiligten als Open Hardware Design entworfen und entwickelt wird.

    Die Classic Variante des OpenBikeSensors ist ein eigenständiges Design, das -alle benötigten Funktionalitäten zum Aufzeichnen von Überholabständen vereint. -Es wird in Handarbeit aus kommerziell verfügbaren Modulen (wie einem -GPS-Empfänger und Ultraschallsensoren) zusammengebaut. Das Ergebnis ist ein -robustes Gerät das leicht und ohne weitere Voraussetzungen bedient und gut -verliehen werden kann.

    Dieser Bereich der Dokumentation enthält die Bauteileliste, Bauanleitung, Links -zum Gehäuse und Hilfen beim Beschaffen der Teile.

    • Die Bauteileliste enthält alle benötigten elektronischen -Module und Einzelkomponenten, die mechanischen Bauteile wie Schrauben -und Muttern sowie jeglichen “Kleinkram” wie Kabel und Befestigungen.
    • Das Gehäuse wird im 3D-Druck-Verfahren hergestellt.
    • Die Hauptplatine wurde speziell für den -OpenBikeSensor entworfen und kann als Spezialanfertigung bei einem -Platinenhersteller anhand der bereitgestellten Designdateienen bestellt -werden.
    • Die Bauanleitung beschreibt, wie die -Bauteile auf der Hauptplatine installiert und das ganze ins Gehäuse -eingesetzt werden.

    Muss ich den OpenBikeSensor selbst bauen?

    Ja! Es gibt den OpenBikeSensor nicht als fertiges Gerät zu kaufen. Stattdessen -baust du ihn dir selbst zusammen.

    Du brauchst auch keine Angst zu haben, damit loszulegen – selbst wenn nicht -immer sofort offensichtlich ist, wie alles funktioniert, so ist es trotzdem -auch für Anfänger:innen möglich, erfolgreich einen Sensor anhand dieser -Anleitungen zu bauen. Und wenn das mal nicht klappt, gibt es genug Leute die -dir gern weiterhelfen, und ihr Wissen teilen.

    Vielleicht kannst du dich auch mit einigen Anderen in deiner Gegend -zusammentun. Schau in der Community vorbei oder -auf die Karte der Initiativen, und finde -Gleichgesinnte, mit denen du zusammen arbeiten und lernen kannst.

    Das Gerät besteht aus vielen Einzelteilen aus verschiedenen Quellen besteht. -Sammelbestellungen sind eine gute Möglichkeit, die Komplexität aufzuteilen und -für jede:n Einzelne:n zu verringern. Dabei sparen wir alle Geld, denn in Menge -bestellt sind viele Teile günstiger. Auch solche Sammelbestellungen werden in -der Community organsiert.

    OpenBikeSensor Classic Bausatz (alte Version)

    Hinweis für den Bau großer Stückzahlen

    Leider hatten wir in der Verangenheit immer wieder Probleme damit, dass die aus -China gelieferten fertigen Module nicht oder nur teilweise den Spezifikationen -entsprachen. Auch die Abmaße von Teilen ändern sich manchmal, z.B. bekamen wir -vom Lieferanten plötzlich größere Displays als üblich.

    Wenn du mehrere Geräte vom Typ OpenBikeSensor Classic herstellen möchtest, -empfiehlt es sich daher, zunächst einen Probelauf zu machen. So stellst du -sicher, dass die gelieferten Teile alle korrekt angekommen sind und den -Anforderungen entsprechen. Löte dafür einen der Bausätze vollständig zusammen -und baue ihn auch in das Gehäuse ein.

    Wenn du auf diese Weise bemerkst, dass Lieferanten plötzlich andere Teile -liefern, sprich es auf jeden Fall in der Community an. Vielleicht muss die Lieferantenliste angepasst werden, oder es gibt eine -einfache Änderung am Gehäuse, um auch mit den neuen Teilen kompatibel zu -werden. Der:die nächste freut sich!

    Alternativen

    Aufgrund der Vielfalt in dem Projekt und der unterschiedlichen Anforderungen -der Beteiligten gibt es auch eine Vielzahl Varianten für fast jedes Teil. Der -Einfachheit halber pflegen wir jedoch hier auf der Website, in den Anleitungen -und Bestelllisten, nur eine “Standard-Variante”. Diese ist zur Zeit:

    • PCB Version 00.03.12
    • Hauptgehäuse (ehem. “Vertical Case”)
    • Displaygehäuse (ehem. “SlideOnDisplay”)
    • eine Halterung nach jeweiligen Anforderungen

    Alternativen, wie alte Versionen oder andere Gehäuse, verlinken Aktive im Forum -oder auf GitHub. Dort kannst du dich gern umschauen, falls du eine Anpassung -wünscht und diese nicht selbst erfinden möchtest – vielleicht hat das ja schon -irgendwer getan.

    2 - Bauteile

    Diese Seite listet alle Bauteile auf, die bestellt oder hergestellt werden müssen, um einen OpenBikeSensor Classic zusammenzubauen.

    Bei manchen Komponenten funktionieren die Links auf die Produkte nicht mehr. Wir arbeiten zurzeit daran, bei neuen Lieferanten testzubestellen. Wenn du gerade bestellst, kannst du @gluap im Forum kontaktieren, um bei der Testbestellung dieser Komponenten mitzumachen.

    Bitte lies diese Seite sorgfältig durch, und auch den Abschnitt “Notizen”, denn -bei einige Teilen musst du aufpassen, das richtige zu erwischen.

    Einige Links könnten in der Zukunft kaputt gehen, wir werden dann versuchen -neue zu finden und Verkäufer:innen zu verlinken, mit denen wir gute Erfahrungen -gemacht haben.

    Diese Liste kann natürlich fehlerhaft oder veraltet sein. Bitte vergleiche die -Designdateien (Platine, Schaltplan, Gehäusedesign, …) mit deiner Bestellung, -um eventuelle Unterschiede festzustellen. Insbesondere wenn du größere Mengen -einkaufen möchtest (z.B. für Sammelbestellungen), oder die Bauteile aus China -geliefert werden und einige Wochen Lieferzeit haben, solltest du alles doppelt -überprüfen.

    Hinweise

    • ESP32 Development Board: Von diesem Modul existieren einige verschiedene -Versionen. Du brauchst die Variante mit 30 Pins. Diese wird oft unter der -Bezeichnung “ESP32 DEVKIT v1” verkauft.

    • SD-Karte: Billige SD-Karten haben schon öfters Probleme verursacht, wähle -lieber ein Markenprodukt. Versuche eine SD-Karte unter 100 MB/s zu bekommen, -z.B. SanDisk Karten mit 120 MB/s haben auch schon Probleme verursacht, da sie -die von uns verwendete Schnittstelle nicht mehr unterstützen.

    • GPS-Modul: Bevorzuge die Variante mit großer Antenne -(Link1, -Link2). Die Antennen -haben unterschiedliche Qualität und Kabellänge, bei Ersatzbedarf gibt es auch -günstige Weiterverkäufer:innen der Antennen in Deutschland.

    • Displaykabel: Hier solltest du auf keinen Fall sparen. Kaufe ein -LifY11Y-Kabel in hoher Qualität, oder die Verbindung zum Display könnte -darunter leiden und nur unzuverlässig funktionieren. Zwei Meter Länge sind -genug für große Fahrräder und ein paar extra Versuche bis das Crimpen klappt. -Cat5 oder Cat6 Netzwerkkabel könnten zwar elektronisch auch funktionieren, -sind aber in der Regeln nicht so flexibel und fühlen sich nicht so gut an.

    • JSN-SR04T: Hier musst du auf die richtige Version achten. Es gibt eine -ganze Menge Varianten, von denen viele nicht funktionieren. Wir haben auf -dieser Seite dokumentiert, welche wir -gefunden haben und wie gut die jeweils funktionieren.

    • Einige Bauteile können in größeren Mengen zu wesentlich günstigeren -Preisen gekauft werden. Bildet Sammelbestellungen um viel Geld zu sparen!

    • Von besonders günstigen Teile kannst du gern etwas mehr bestellen, als -Ersatz, falls etwas verloren oder kaputt geht (Widerstände, Schrauben und -Muttern, Crimp-Kontakte, Kabel und Litze, …)

    • Gehäuse müssen in PETG 3D-gedruckt werden. Es -gibt viele Versionen für verschiedene Zwecke und von verschiedenen Leuten. -Die Community pflegt aktiv ein bestimmtes Gehäuse für jede PCB-Version. -Schau’ dich im -Gehäuse-Repository -auf Github um. Du kannst dein Gehäuse selbst drucken, andere Mitglieder der -Community darum bitten, oder fertige Drucke anhand der Designdateien von -einem 3D-Druck-Service bestellen (das ist aber in der Regel relativ teuer).

    • PCB: Du benötigst ein PCB der passenden Version, speziell anhand der -Designdateien hergestellt. Dies sollte am besten -ebenfalls in großen Mengen bestellt werden, da der Stückpreis dann stark -sinkt. Frag’ auf jeden Fall im Slack nach, ob irgendwer noch welche auf Lager -hat, bevor du neue anfertigen lässt!

    Bauteile

    MengeBauteilLinks
    Module
    1ESP32-WROOM Development Board (Hinweis beachten)aliexpress.com - Wanzai Store (Variante ESP-32 30P)
    aliexpress.com - Win win. (Variante ESP-32 30P)
    aliexpress.com - KEWEITE Store (Variante ESP-32)
    10.96-Zoll OLED Displayaliexpress.com
    1USB-C Lademodulaliexpress.com 1
    aliexpress.com 2
    1SD-Karten-Modulaliexpress.com -androegg.de[forenthread]
    1Buck-Boost Modul for LiPo, 3.3V (Spannungsregler)Derzeit ist kein zuverlässiger Händler für dieses Modul bekannt. Module mit Beschriftung ``A1731i`` auf dem sechsbeinigen Bauteil **funktionieren NICHT**.
    118650 LiIon-Akku (mit Lötfahnen)akkuteile.de
    nkon.nl
    1SD-Karte, 16 GB / 32 GB (Hinweis beachten)amazon.de
    google Suche
    1GPS-NEO-6M Modul (Hinweis beachten)aliexpress.com 1
    aliexpress.com 2
    aliexpress.com 3
    aliexpress.com 4
    2JSN-SR04T Sensormodule (Hinweis beachten)EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
    EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
    androegg.de (JSN-SR04T-v3.0)
    Kleinteile
    112mm Drucktasteraliexpress.com -aliexpress.com
    1Miniatur-Kippschalterreichelt.de
    aliexpress.com
    ca. 2mDisplaykabel (Hinweis beachten)automation24.de
    Steckverbinder
    15 (+10 Ersatz)JST-XH Crimp-Kontakte (BXH-001T-P0.6)reichelt.de
    farnell.com
    3JST-XH Gehäuse 2-polig (XHP-2)reichelt.de
    2JST-XH Platinenstecker 2-polig 90°reichelt.de
    1JST-XH Gehäuse 4-polig (XHP-4)reichelt.de
    1JST-XH Gehäuse 5-polig (XHP-5)reichelt.de
    1JST-XH Platinenstecker 2-polig (B2B-XH-A)reichelt.de
    1JST-XH Platinenstecker 5-polig (B5B-XH-A)reichelt.de
    1Batteriekabel (gerade, 2-polig)reichelt.de
    1Platinenstecker für Batteriekabel (gerade, 2-polig, mit rot-schwarzen Kabeln, 2.54mm RM)pollin.de 1
    pollin.de 2
    1Winkelstiftleiste (mind. 10-polig, 2.54mm RM)reichelt.de
    1Stiftleiste gerade (mind. 11-polig, 2.54mm RM)reichelt.de
    2SMD-Buchsenleisten (15-polige, 2.54mm SMD, wechselseitig, BL LP 5 SMD)
    (15-polige Variante ist selten; 16-polige kann gekürzt werden)
    fischerelektronik.de
    Elektronische Bauelemente
    1Widerstand (THT) 10 kΩ, 250 mW, 5 %reichelt.de
    1Widerstand (THT) 150 kΩ, 250 mW, 5 %reichelt.de
    1Widerstand (THT) 300 kΩ, 250 mW, 5 %reichelt.de
    2Widerstand (THT) 1.1 kΩ, 250 mW, 5 %reichelt.de
    1Keramikkondensator 100 nF, 10 %reichelt.de
    2Elektrolytkondensator, radial, 22 µF, 10 V, niedrige ESRreichelt.de
    1Schottky-Diode, 60 V, 5 A, DO-201ADreichelt.de
    1Rückstellende Sicherung, max. 40 A - 30 V, 6.6 sec
    Typ PFRA, radiale Bauform
    reichelt.de
    Mechanische Bauteile
    4Neodym-Magnete, 20x10x2mmamazon.de -supermagnete.de (teuer, stark)
    4Neodym-Magnete, 3x3x3mmamazon.de -supermagnete.de
    28M3x8mm Zylinderschraube mit Innensechskant (DIN912). (1x GPS, 8x für zwei Gehäuseöffnungen, 3x Platine, 5x Deckel, 3x Display, 6x 2 Gepäckträgerhalterungen, 2x für Kabelzugentlastung), je nach Variante können weniger Schrauben reichen.
    1M3x30mm Zylinderschraube mit Innensechskant (DIN912) (für den Locking Pin)
    10M3 Mutter (DIN934) (je 4x für zwei Gehäuseöffnungen, 2x für Kabelzugentlastung, je nach Variante können weniger Muttern reichen.)
    18Gewindeeinsatz / Einpressmutter M3x5.7 (1x GPS, 5x Deckel, 3x Platine, 3x Display, 6x für 2 Gepäckträgerhalterungen, je nach Variante können weniger Muttern reichen.)amazon.de 1
    amazon.de 2
    4Kabelbinder (2x Batterie, 2x Displayhalterung
    2Kabelbinder (Sattelhalterung)
    Spezialanfertigungen
    1PCB v00.03.12github.com
    13D-Druck: Hauptgehäuse, Displaygehäuse, Halterung(en)Link

    Werkzeuge

    Diese Werkzeuge werden benötigt, um den Sensor zusammenzubauen. Das -spezialisierteste Werkzeug ist die Crimpzange, welche dein lokaler Hackspace / -Maker Space / Fab Lab sicherlich rumliegen hat. Eventuell musst du also nicht -jedes dieser Werkzeuge kaufen, wenn du eines ausleihen kannst.

    • Crimpzange für JST-XH Steckverbinder (andere Marken oder Zangentypen, die mit diesen Verbindern kompatibel sind, funktionieren auch, z.B. Engineer PA-09).
    • Ein guter, regelbarer Lötkolben oder eine Lötstation, mit entsprechender Lösung zur Entlüftung
    • Pinzetten
    • Seitenschneider (z.B. Knipex Super Knips)
    • Abisolierzange, (z.B. Knipex, Jokari- mit diesen beiden Zangen kann man auch denn Innenleiter der Ultraschallsensoren abisolieren)
    • Innensechskantschraubendreher 2,5mm für M3 (“Inbussschlüssel” oder Schraubendreher)
    • Persönliche Schutzausrüstung: Schutzbrille, eventuell Handschuhe, …
    • ESD-Schutzausrüstung (nicht zwingend notwendig, aber nutze sie, wenn du sie hast)

    Verbrauchsgüter

    Die meisten dieser Artikel gibt’s in jedem Elektroniklabor, wenn du also in -einem Maker Space oder ähnlichem arbeitest, kannst du sicher kleine Mengen -hiervon bekommen ohne die große Packung kaufen zu müssen.

    • Gutes Lötzinn, bleifrei
    • Enlötlitze
    • Isolierklebeband, bevorzugt Kapton-Band
    • Schrumpfschlauch (optional)
    • Etwa 25cm dünne (0.25 mm2 / 23 AWG) Litze

    3 - Platine

    Die Hauptplatine des OpenBikeSensor Classic verbindet alle Module und elektronisch Einzelbauteile miteinander. Hier beschreiben wir, wie du eine solche Platine bekommst.

    Ein sehr wichtiger Bestandteil des Gerätes ist die Platine, auch -„PCB” (englisch printed circuit board) genannt. Der schwierige -Teil hieran ist das „printed” – ein PCB ist ein professionell -hergestelltes Bauteil das schwierig selbst zu erstellen ist. Hier sind deine -Optionen:

    • Das PCB anhand der Designdateien von einem Platinenhersteller anfertigen -lassen. Je nachdem wo, in welcher Qualität und wie viele Platinen du -bestellst wird dies erstaunlich wenig bis sehr viel kosten.
    • Finde heraus, ob jemensch anders schon Platinen anhand der gleichen Dateien -hat herstellen lassen. Eventuell hat er:sie noch Exemplare übrig, frag am -besten in der Community nach.
    • Bastel dir selbst eine Platine, ganz im DIY-Stil. Da unseren Platinen jedoch -Durchkontaktierungen und beidseitige Leiterbahnen benötigen, ist das -besonders schwierig. Je nach Ausrüstung und Erfahrung ist es aber machbar. -Besonders viel günstiger als bestellen ist es allerdings vermutlich nicht.
    • Benutze keine Platine. Du kannst einen kompatiblen Sensor ganz ohne Platine -zusammenbauen, indem du die Komponenten mit Kabeln aneinander lötests. -Allerdings haben wir hierfür keine Anleitung und das Gehäuse wird auch nicht -passen. Orientiere dich am Schaltplan, den Rest musst du selbst herausfinden.

    PCB Layout-Parameter

    Wenn du dich für einen Hersteller entscheidest, solltest du sicherstellen, dass -folgende Layoutparameter unterstützt sind. In der Regel listet jeder Hersteller -auf der Website diese Informationen auf, und die Minimal- und Maximalgrößen -dürfen nicht unter- bzw. überschritten werden, sonst könnte die Herstellung -fehlschlagen.

    Wir verwenden in unseren Designs:

    • TODO: Via size, minimum trace width, milling path restrictions

    Gerber-Dateien

    TODO: Wo sind die Dateien zu finden?

    4 - Gehäuse

    In das Gehäuse des OpenBikeSensor Classic werden die elektronischen Komponenten eingebaut. Es wird im 3D-Druck-Verfahren selbst gefertigt.

    OpenBikeSensor Gehäusebausatz (alte Version)

    Es gibt viele Möglichkeiten, ein Gehäuse für deinen OpenBikeSensor zu bekommen. -Unter Umständen findest du in der Community hilfreiche Bastler:innen, die dir -ein Gehäuse herstellen – hierzu fragst du am besten im Forum nach.

    Eine andere Möglichkeit ist, einen lokalen Maker- oder Hackspace zu finden, in -dem 3D-Drucker und Know-How zur Verfügung stehen. Hierfür haben wir eine -Anleitung mit allen Details für den Druck von -OpenBikeSensor-Gehäuseteilen geschrieben.

    Natürlich kannst du die Elektronik auch in eine alte Plastikdose stecken und -Löcher hineinbohren für Sensoren und Kabel. Das mag wesentlich einfacher sein -und zum Ziel führen, ist aber im Betrieb eher unpraktisch. Du musst dir eine -Möglichkeit ausdenken, das ganze an dein Rad anzubringen und evtl. auch wieder -abnehmbar zu machen, um das Gerät zu laden oder zu warten. Es ist also -natürlich möglich, aber am Ende schöner und praktiabler ist der 3D-Druck – es -lohnt sich!

    Falls das Selbstdrucken dir zu aufwendig erscheint, oder du einfach keinen -Zugang zu einem 3D-Drucker in deiner Nähe hast, sind vielleicht auch -3D-Druck-Dienstleister eine Option für dich. Diese drucken Teile nach deinen -Dateien Anweisungen als Auftragsarbeit. Preisgünstige Anbieter nehmen für ein -komplettes OpenBikeSensor-Gehäuse ca. 20-30 €. Wenn du dich mit anderen zu -Erfahrungen hiermit austauschen möchtest, ist das Forum der richtige Ort!

    4.1 - Gehäusedruck

    In dieser Anleitung geht es darum, ein komplettes Gehäuse mit Halterungen -selbst zu drucken und herzustellen. Der Druck eines kompletten -OpenBikeSensor-Gehäusesatzes, oder auch nur von Teilen davon, ist problemlos -möglich, vorausgesetzt du hast einen 3D-Drucker zur Verfügung.

    Der 3D-Druck kostet ca. 5 € Material (Filamentkosten können variieren), -Verschleiß, Stromkosten und vor allem Zeit, ca. 10-20h Druckzeit muss man schon -einplanen.

    Drucker und Slicer

    Der Ultimaker 3 hat ein Displaygehäuse mit Zugentlastung fertig gedruckt.

    Für den Beispieldruck in dieser Anleitung verwenden wir einen Ultimaker 3. -Dieser hat zwei Extruder, sodass mit zwei Filamenten gleichzeitig gedruckt -werden kann. Das vereinfacht den Druck des Sensorgehäuses und des Deckels, da -für die Logos eine zusätzliche Farbe verwendet werden kann. Bei einem Drucker -mit nur einem Extruder muss während des Drucks das Filament gewechselt werden. -Hierfür gibt es verschiedene Strategien, die je nach Drucker, Firmware und -Slicer variieren. Alternativ können alle Teile auch einfach ohne Logo mit nur -einem Filament gedruckt werden.

    Wichtig ist die Slicer-Software, die den Druck für den jeweiligen Drucker -aufbereitet. Für den Ultimaker (und viele andere Drucker) kann Cura von der -offiziellen Website -heruntergeladen und kostenlos verwendet werden (für Linux, Windows und macOS). -Eine starke Alternative ist der Prusa -Slicer. Die Wahl des Slicers hängt von -persönlicher Präferenz und den unterstützten Druckern ab, sowie in -Spezialfällen den unterstützten Features. Beide Slicer eignen sich für den -Druck von OpenBikeSensor-Gehäuseteilen.

    Material und Farben

    Das empfohlene Material für den Druck der Gehäuseteile ist PETG, das Material -mit den meisten Vorteile für unser Projekt:

    • hohe Schlagfestigkeit und dennoch flexibel – wichtig für den Einsatz am Fahrrad
    • hydrophob, wasserabweisend, witterungsbeständig – wichtig für Außeneinsatz
    • geruchsneutrales Drucken – erleichtert das Drucken auch zu Hause
    • niedrige Viskosität (Zähigkeit)
    • verfügbar in vielen verschiedenen Farben, sogar transparent

    Nachteilig ist allerdings die UV Beständigkeit, die nicht so hoch ist wie bei -ABS oder ASA. Doch die Vorteile überwiegen diese Einschränkung.

    Beispiel eines gedruckten Gehäuses mit Logos

    Druckvorbereitung

    Alle Dateien für das OpenBikeSensor Projekt wie Software, Firmware, Dokumentation und auch die 3D-Druckdateien liegen auf GitHub. Das Repository für die Gehäusedaten ist:

    Die Gehäuselemente werden unterschieden in die Bestandteile

    • Hauptgehäuse (MainCase)
    • Displaygehäuse (DisplayCase)
    • Halterungen (Mounting)

    Ein ZIP-Archiv mit allen aktuellen Dateien, sowohl dem Quelltext als auch den -exportierten STL-Dateien für den 3D-Druck können von GitHub direkt -heruntergeladen werden:

    Im Archiv befindet sich ein Ordner export/ mit den obigen Kategorien, und -darin sind jeweils die STL-Dateien für den Slicer zu finden.

    Allgemeines Vorgehen

    Der Import einer STL-Datei in eine Slicer Software (wie z.B. Cura) ist der -erste Schritt um ein 3D Objekt zu drucken. Im Slicer wird das 3D-Objekt so auf -die Druckplatte gelegt, sodass es möglichst wenig Überhänge gibt:

    1. So sollte es aussehen, kann aber in dieser Lage so nicht gedruckt werden2. Drucken mit dem Gesicht nach unten

    Die STL-Dateien werden in der Regel so generiert, dass sie nach dem importieren -bereits in der empfohlenen Lage auf dem Druckbett liegen. Auf Support kannst du -dann in der Regel verzichten, denn bei der Modellierung wird bereits die -supportfreie Druckbarkeit beachtet. Du kannst dich natürlich auch anders -entscheiden und die Objekte drehen, sollte dein Drucker oder Slicer sonst keine -guten Ergebnisse liefern.

    Als nächstes werden der richtige Drucker, das Filament und die -Druckeinstellungen (Infull, Support, Geschwindigkeit, Schichtdicke, …) -gewählt. Hier gilt, dass du dich am besten an den Vorgaben der Hersteller (von -Drucker und Filament) orientierst, aber auch immer ein bisschen experimentierst -und die für dich und deinen Anwendungsfall richtigen Einstellungen findest. -Informationsmaterial, Anleitungen und Tutorials gibt es massenweise im Netz.

    1. Cura view auf main case im Vorbereitungsmode2. Einstellung auf PETG und 2 Extruder3. Settings für Druckdichte (Infill), Support, Düsendurchmesser4. starte Slicing

    Beim eigentlichen “Slicen” erstellt Cura nun eine GCODE-Datei, die alle Befehle -für den speziellen Drucker und das Material enthält (z.B. Bewegungen, -Temperaturen, etc.).

    1. Nachdem alle Einstellungen erfolgt sind, wird das Slicing gestartet 2. Slicing information gibt es im Preview, mit den beiden Schiebern unten und rechts kann man jede einzelne Bahn des Extruders verfolgen

    Die GCODE-Datei wird nun auf den 3D-Drucker übertragen. Je nach Druckermodell -geschieht dies über WLAN, mithilfe einer SD-Karte oder eines USB-Sticks, oder -der Drucker ist direkt (per USB) am PC angeschlossen. Das genaue Verfahren ist -im Handbuch des Druckers vermutlich beschrieben.

    Im Menü des Druckers wird die erstellte GCODE-Datei für den Druck ausgewählt -und der Druck gestartet. Ab hier übernimmt der Roboter die Arbeit für uns, und -wenn wir alles richtig eingestellt haben, ist in einigen Minuten bis Stunden -ein neues Gehäuseteil fertig.

    Hauptgehäuse

    Das Hauptgehäuse enthält den Großteil der Elektronik (PCB, Sensorboards, -SD-Karte, GPS, Hauptschalter, Ladeelektronik) sowie die zwei Abstandssensoren, -die GPS-Antenne und die Batterie.

    Sowohl das Hauptteil als auch der Deckel können mit einem Logo gedruckt werden. -Dies ist ein wenig mehr Aufwand, lohnt sich aber optisch sehr, und es hilft -erfahrungsgemäß auch dabei, auf der Straße auf das Gerät angesprochen zu werden -und dem Projekt mehr Aufmerksamkeit zu generieren. Details zum Druck des Logos findest du hier: Logo-Druck (mehrfarbig).

    Die Teile zum Drucken:

    Die ersten zwei Teile gibt es jeweils auch mit OpenBikeSensor-Logo. Für jedes -Bauteil sind hierfür vier Dateien verfügbar. Das Logo kann invertiert oder -normal gedruckt werden, und für den Zweifarben-Druck sind pro Bauteil zwei -Dateien nötig (main und highlight), die die in der jeweiligen Farbe zu -druckenden Bestandteile repräsentieren. Hier sind demnach alle acht Dateien für das -OBS-Logo.

    Das Bauteil StandardMountAdapter gehört zwar eigentlich zu den Halterungen, -wird aber fest am Hauptgehäuse angebracht und bildet eine Hälfte des -Befestigungsmechanismus. Es gehört also auch irgendwie zum Hauptgehäuse.

    Das Bauteil AttachmentCover verschließt die Öffnung des Standardgehäuses, -an der nicht die Halteklammer montiert wird. Dieses Teil wird nicht benötigt, -wenn das Gehäuse ohne zweite Öffnung verwendet wird.

    Die Bauteile des Hauptgehäuses auf dem Druckbett

    Fahrradhalterung

    Zwei Halterungen, das SeatPostMount und eine alte Variante des TopTubeMount.

    Es gibt verschiedene Möglichkeiten, den OBS Sensor am Fahrrad zu montieren. Wie die Halterungen angebracht werden und aussehen, ist in der Montageanleitung zu sehen.

    1. Standard: Sattelhalterung, an der Sattelstange hinter -dem/der Fahrer:in montiert.
    2. Oberrohr-Halterung: Wenn die Sattelhalterungen nicht -verwendbar sind, kann die Montage weiter vorne an der Querstange erfolgen.
    3. Gepäckträgerhalterung: Dreiteilig, wird mit etwas Rundstab oder -Alu-Rundprofil verbunden. Kann auf, unter oder hinter dem Gepäckträger -montiert werden.

    Außerdem nötig ist ein Sicherungsstift (LockingPin). Das Display wird mit der -dazugehörigen Schiene (Mounting/HandlebarRail) am Lenker befestigt.

    Lage dreier Halterungen und des Sicherungspin auf dem Druckbett (die -verlängerte Variante kann parametrisch mit OpenSCAD erstellt werden). Der -LockingPin sollte jedoch lieber stehend gedruckt werden.

    Displaygehäuse (Anzeige und Knopf)

    Im Displaygehäuse sind nur das Display und der Knopf verbaut. Die nötigen Bauteile sind:

    In die Vertiefung der zwei Gehäusehälften werden zwei Magnete eingelegt, die -das Display während der Fahrt an der Schiene (HandlebarRail, siehe -“Fahrradhalterung” oben) halten.

    Fertiges Displaygehäuse (alte Version)

    Materialverbrauch und Zeitbedarf

    Nach dem Slicen wird angezeigt, wie lange der Druckvorgang dauern wird und wie -viel Material für den Druck benötigt wird. Abhängig von den Einstellungen kann -die Druckdauer sehr unterschiedlich sein. Oft geht mit mehr -Druckgeschwindigkeit ein Qualitätsverlust einher, sodass die beiden -gegeneinander abgewogen werden müssen.

    Üblich für den Druck eines ganzen Gehäuses ist daher je nach Drucker etwa 10 -Stunden in Summe. Die Kosten des Filaments belaufen sich auf ca. 3 €, wer -Verschleiß und Stromkosten einrechnet kommt auf etwa 5 € Gesamtkosten.

    Troubleshooting

    Lage der Druckteile und Überhänge

    Beim Druck der Gehäuseteile ist die Lage des Teiles wichtig, denn Überhänge -sollten vermieden werden, sodass der Drucker nicht in der luft drucken muss. -Das Design der Modelle ist bereits darauf ausgelegt, möglichst gut druckbar zu -sein, die Positionierung auf dem Druckbett ist daher auch besonders wichtig.

    Nach dem Laden der STL-Dateien in Cura werden in der Vorschau die Überhänge in -rot angezeigt. Am Beispiel des Deckels (Bilder 1 und 2) ist es sehr -offensichtlich das die Lage eine wesentliche Rolle spielt, wie herum das Teil -auf die Druckerplatte gelegt werden soll.

    Aber selbst bei einer optimalen Lage wie im Beispiel des Sensorgehäuses zeigt -Cura wo sich trotzdem noch Überhänge bilden. Manche Überhänge wie -Schraubenlöcher sind unkritisch da der Drucker das selbst überbrücken kann -(bridging). Doch wenn der Übergang zu groß wird können sich viele Fäden -ziehen. Um das zu vermeiden kann die Supportfunktion eingeschalten werden, der -Drucker erstellt dann leichte Stützstrukturen, die nach dem Druck wieder -entfernt werden.

    1. Schlechte Positionierung erzeugt Überhänge (rot)2. Richtiges Positionieren ist wichtig3. In der Vorschau werden bereits in rot Überhänge angezeigt4. Support einschalten5. Die zusätzliche Supportstruktur ist nach dem Slicing in der Vorschau sichtbar

    Fehlerhafte Drucke

    Einige Fehler traten während der Drucke auf:

    Support fehlt, Düse vom 2. Extruder verstopft

    Brüchige Verbindung, vermutlich Druckdichte (Infill) zu gering

    Weitere Anleitungen

    • Detaillierte Anleitung für den Zusammenbau des gesamten -OpenBikeSensors beschreibt den Einbau der elektronischen Komponenten in die -beiden Gehäuse.
    • Die Montage des Sensors am Fahrrad wird mit -verschiedenen Halterungen und für das Displaygehäuse gezeigt.

    4.2 - Gehäusebauteile

    Hier möchten wir eine Übersicht über alle verfügbaren Gehäusebauteile geben. -Die Links führen jeweils zur Quelldatei (OpenSCAD) und zum STL-Export für den -3D-Druck. Alle Dateien lassen sich auch auf einmal herunterladen, direkt von -Github in der neuesten Version als ZIP-Archiv. Darin finden sich im Ordner -export alle Dateien für den 3D-Druck:

    Eine detaillierte Anleitung zum Gehäusedruck gibt es hier.

    Hauptgehäuse

    BildBauteilname & BeschreibungLinks
    MainCase/MainCase
    Das Hauptgehäuse, in dem die Elektronik untergebracht ist.
    OpenSCAD, -STL
    MainCase/MainCaseLid
    Der Deckel für das Hauptgehäuse, mit Batteriehalterung.
    OpenSCAD, -STL
    MainCase/UsbCover
    Ein kleiner Deckel für die Öffnung des USB-C Ladesteckers im Hauptgehäuse.
    OpenSCAD, -STL
    MainCase/GpsAntennaLid
    Ein kleiner Deckel für die GPS-Antenne im Hauptgehäuse.
    OpenSCAD, -STL

    Displaygehäuse

    BildBauteilname & BeschreibungLinks
    DisplayCase/DisplayCableStrainRelief
    Zugsicherung für das Displaykabel im Displaygehäuse (2x drucken).
    OpenSCAD, -STL
    DisplayCase/DisplayCaseBottom
    Die untere Hälfte des Displaygehäuses.
    OpenSCAD, -STL
    DisplayCase/DisplayCaseTop
    Die obere Hälfte des Displaygehäuses.
    OpenSCAD, -STL

    Halterungen

    Die verschiedenen Halterungen und ihre Montage werden in der Montageanleitung beschrieben.

    BildBauteilname & BeschreibungLinks
    Mounting/AttachmentCover
    Eine Abdeckung für ungenutzte Montagepunkte am Hauptgehäuse (z. B. für kombinierte Back Rider und Top Rider Gehäuse).
    OpenSCAD, -STL
    Mounting/BikeRackMountCenter
    Das Mittelstück für die Gepäckträgerhalterung in Quermontage.
    OpenSCAD, -STL
    Mounting/BikeRackMountCenterLongitudinal
    Das Mittelstück für die Gepäckträgerhalterung in Längsmontage (ungewöhnlich).
    OpenSCAD, -STL
    Mounting/BikeRackMountSide
    Ein Seitenstück der Gepäckträgerhalterung (2x drucken).
    OpenSCAD, -STL
    Mounting/HandlebarRail
    Die Schiene für die Befestigung des Displays am Lenker (Version für Kabelbinderbefestigung).
    OpenSCAD, -STL
    Mounting/HandlebarRailOring
    Die Schiene für die Befestigung des Displays am Lenker (Version für O-Ring-Befestigung).
    OpenSCAD, -STL
    Mounting/LockingPin
    Der Befestigungsstift für das Hauptgehäuse.
    OpenSCAD, -STL
    Mounting/SeatPostMount
    Die Sattelstützenhalterung.
    OpenSCAD, -STL
    Mounting/StandardMountAdapter
    Wird am Hauptgehäuse montiert und ermöglicht das Aufschieben auf die Schienen der Halterungen. Wirkt ebenfalls als Zugsicherung für das Displaykabel am Hauptgehäuse.
    OpenSCAD, -STL
    Mounting/TopTubeMount
    Die Halterung für das Oberrohr.
    OpenSCAD, -STL

    4.3 - Gehäusevarianten

    Top Rider / Back Rider

    Das Hauptgehäuse kann als “Top Rider” oder “Back Rider” konfiguriert werden, -oder beides gleichzeitig. Dies definiert, welche Montagepunkte verfügbar sind.

    Ein “Top Rider” Hauptgehäuse hat den Montagepunkt unten (wenn am Rad montiert), -wohingegen ein “Back Rider” ihn vorn hat. Alte Modelle des OpenBikeSensors -waren somit alle “Back Rider”, denn sie wurden immer an der Sattelstütze -montiert, horizontal dahinter hängend.

    Da viele Radfahrende ihre Räder so einstellen, dass hier nicht genug Platz für -einen OpenBikeSensor bleibt, wurde die Variante “Top Rider” mit entsprechenden -Halterungen eingeführt. Top Rider OBS sitzen auf dem Oberrohr, dem -Gepäckträger, oder überall wo unter ihnen Platz für eine Halterung ist. Der -nach unten zeigende Montagepunkt macht das wesentlich stabiler als eine -Halterung, die “um die Ecke” gehen muss, um eine Schiene anzubieten, die nach -hinten zeigt.

    Die Montagepunkte am Hauptgehäuse.

    Ein Gehäuse kann sowohl Top Rider als auch Back Rider gleichzeitig sein. Auf -jeden der Montagepunkte passt der StandardMountAdapter (siehe -Gehäusebauteile). Ein ungenutzter Montagepunkt -sollte mit dem AttachmentCover abgedeckt werden, um die Löcher zu schließen.

    Die Parametrierung erfolgt über die OpenSCAD-Variablen

    MainCase_back_rider
    -MainCase_top_rider
    -MainCase_back_rider_cable
    -MainCase_top_rider_cable
    -

    Ein Adapter (Mounting/BackRiderTopRiderAdapter) ist verfügbar für (ältere) -Geräte, die nur Back Rider sind, aber auf einer Top Rider Halterung angebracht -werden sollen. Das Gegenteil davon haben wir (noch) nicht entworfen.

    OpenSCAD Schnellstart

    OpenSCAD ermöglicht die parametrische Erstellung von 3D-Modellen mit Code. Den -Code haben wir geschrieben, die Parameter kannst du ändern. Damit gibt es jede -Menge Anpassungsmöglichkeiten für jeden Anwendungsfall.

    Die STL-Dateien werden anhand der SCAD-Dateien erzeugt, die alle im -GitHub-Repository -liegen. Am besten benutzt du git, um dir eine Kopie herunterzuladen -(clone), und dann kannst du die Parameter ändern:

    git clone --recurse-submodules https://github.com/openbikesensor/OpenBikeSensor3dPrintableCase
    -cd OpenBikeSensor3dPrintableCase
    -

    Jetzt kannst du die Datei variables.scad anpassen und deine gewünschten Werte -setzen (z. B. MainCase_back_rider, siehe oben).

    Die einzelnen Bauteile aus dem Ordner src/ kannst du dann mit dem Programm -OpenSCAD (das du direkt von seiner Website -herunterladen oder mit deinem -Paketmanager installieren kannst) anschauen. Einzelne Bauteile kannst du darin -auch rendern (F6) und danach als STL exportieren (F7).

    Wenn du alle Teile neu generieren möchtest, kannst du auch in deinem Terminal -make eingeben. Dies erzeugt alle geänderten Bauteile neu, möchtest du alle -neu erstellen, hilft vorher ein make clean. Diese Bauteile werden dann nach -export/... exportiert und überschreiben die dort vorhandenen STL-Dateien. Es -dauert jedoch eine Weile die ganzen Geometrien zu berechnen, erwarte etwa 2-20 -Minuten, je nachdem wie schnell dein Rechner ist.

    4.4 - Logo-Druck (mehrfarbig)

    Ein Hauptgehäuse mit eingedrucktem Logo.

    Logo-Dateien

    Statt der Bauteile MainCase und MainCaseLid werden entsprechende Bauteile -gedruckt, die geometrisch identisch sind, aber das Logo enthalten.

    Je nach Logo und Filamentwahl kann es sinnvoll sein, das Logo zu invertieren.

    • Normal: Das Logo hat eine andere Farbe als der Rest des Bauteils.
    • Invertiert: Die Grundfläche, auf der das Logo gedruckt wird, hat eine -andere Farbe als der Rest des Bauteils. Das Logo hat die gleiche Farbe wie -die Wände und das Innere des Bauteils.

    Je nach Drucktechnik sind pro Bauteil eine oder zwei Dateien notwendig, nämlich -das Logo an sich, und das Bauteil, aus dem das Logo herausgeschnitten wurde.

    • Main: Der Hauptteil des Bauteils ohne Logo, bzw. bei invertierten Logo -der Hauptteil mit Logo, aber ohne Grundfläche.
    • Highlight: Das Logo, das herausgeschnitten wurde, bzw. bei invertierten -Logo die Grundfläche ohne Logo.

    Bezeichnungen der vier Dateien für den Logo-Druck des Hauptgehäuses (nur -das Gehäuse, nicht der Deckel).

    Jede dieser vier Dateien gibt es für das Hauptgehäuses und seinen Deckel, -insgesamt pro Logo also acht Dateien. Die vorgenerierten STL-Dateien für das -OpenBikeSensor-Logo werden ebenfalls auf GitHub veröffentlicht und liegen dort -im Verzeichnis -export/logo/OpenBikeSensor/.

    OpenSCAD Logo Generator

    Die Anleitung hierfür folgt demnächst. Möchtest du jetzt schon dein eigenes -Logo auf einen OpenBikeSensor drucken? Bestimmt wird dir im Forum geholfen!

    Mehrfarbendruck

    Zu diesem Thema haben wir noch keine ausführliche Dokumentation, aber es gibt -einen Diskussionsfaden im Forum. Vielleicht hilft dir das schon weiter, -ansonsten kannst du gern dort deine Fragen und Ideen einbringen:

    https://forum.openbikesensor.org/t/mehrfarbiger-gehaeusedruck/111

    5 - Bauanleitung (OpenBikeSensor Classic 1.0.0)

    Sobald der Bausatz für den OpenBikeSensor Classic zusammengestellt ist, kann anhand dieser Anleitung der Bau begonnen werden. Der Zusammenbau besteht aus einer Menge Lötarbeit, sowie dem Test der Elektronik und dem Einbau in das Gehäuse.

    Dies ist die Anleitung zum Aufbau des OpenBikeSensor Classic. Die aktuelle -Version dieser Bauanleitung setzt die Hauptplatine der Version 1.0.0 voraus, -sowie die Verwendung der auf dieser Website dokumentierten Bau- und -Gehäuseteile. Auch die benötigten Verbrauchsgüter und Werkzeuge sind bei der -Bauteileliste beschrieben. Hast du einen älteren -Bausatz mit der Platinenversion 00.03.12 kannst du diesen entweder -mit einer Platine Version 1.0.0 upgraden und der Bauanleitung 1.0.0 folgen -(alle Bauteile sind gleich), oder du kannst. -hier die Anleitung für die 0.03.12 Platine finden

    Die beschriebene Vorgehensweise ist nur eine Möglichkeit, zu einem -funktionierenden Modell zu kommen. Wenn du alternative Wege gehen möchtest, -kannst du das natürlich tun. Solltest du einen massentauglichen besseren oder -einfacheren Weg für einen der Schritte finden, freuen wir uns über -Änderungsvorschläge -oder eine kurze Nachricht.

    Ein fertig gebauter OpenBikeSensor der Version 1.0.0

    Voraussetzungen und Hinweise

    Achtung, bitte lies die folgenden Hinweise gut durch, bevor du mit dem Aufbau -anfängst.

    • Diese Anleitung setzt voraus, dass die Grundtechniken wie Löten, das -Abisolieren von Kabeln und das Crimpen von JST-Verbindern bereits bekannt -sind. Für letztere empfehlen wir das -JST-Crimp-Tutorial, auch für -die anderen Techniken findest du Anleitungen und Tipps im Internet.

    • Gehe bewusst und gewissenhaft mit deinen Werkzeugen um. An scharfen -Werkzeugen wie einem Cuttermesser oder einem Seitenschneider kannst du dich -schneiden. Das vordere Ende des Lötkolbens kann bis zu 450°C heiß werden. -Berühre daher immer nur das dafür vorgesehen Griffstück. Sollte er dir -wegrutschen oder herunterfallen weiche daher lieber aus, anstatt ihn -aufzufangen.

    • Die Dämpfe, die beim Löten durch das Verbrennen des Flussmittels (Flux) -entstehen, können gesundheitsschädlich sein. Atme sie daher nicht direkt ein. -Du hast bei dir daheim oder in deinem Makerspace eine Lötdampfabsaugung? Dann -nutze sie! Gerade bleifreies Lötzinn enthält mehr Flussmittel und ist daher -während des Lötens auch deutlich gesundheitsschädlicher. Solltest du keine -Absaugung haben ist daher bleihaltiges Zinn empfehlenswerter. Dieses solltest -du allerdings wiederum nicht in den Mund nehmen und dir nach dem Löten die -Hände waschen.

    • Bei einem der Bauteile handelt es sich um eine LiPo[^1]-Batterie. Diese -Batterien sind zwar heute weit verbreitet, können allerdings bei falscher -Handhabung in Brand geraten. Solltest du nicht vertraut mit LiPos oder dir -noch unsicher sein, lies bitte den Abschnitt in der Anleitung zur Vorbereitung und zum Umgang mit den Akkus -sehr aufmerksam. Außerdem empfehlen wir, die Zelle aus einer -vertrauenswürdigen Quelle zu beschaffen und nicht die billigste Zelle aus -China zu bestellen.

    • Es handelt sich beim OpenBikeSensor um ein frei verfügbares Design, und nicht -um ein fertiges Gerät. Alles, was wir dir mit den Bauteillisten, -Schaltungsentwürfen und Anleitungen zeigen, sind Vorschläge und kann Fehler -enthalten. Bist du dir an einer Stelle nicht sicher oder du glaubst einen -Fehler gefunden zu haben, dann melde dich in der Community. Außerdem sind wir nicht für Fehler verantwortlich -die du während des Aufbaus machst. Sollte etwas schief gehen und du brauchst -Hilfe kannst du dich natürlich trotzdem an uns wenden.

    Buchsenleisten

    Stecke die Buchsenleisten auf den ESP32, um den Abstand später genau passend zu -haben. Positioniere den ESP32 mit den Buchsenleisten auf der Hauptplatine. -Achte auf eine gute Ausrichtung. Es hilft, wenn dir jemand den ESP32 festhält, -damit er nicht verrutscht.

    Löte einen der Pins in einer Ecke fest. Prüfe die Ausrichtung noch einmal, -jetzt kannst du noch nacharbeiten. Löte dann den diagonal gegenüberliegenden -Pin an, und prüfe erneut die Ausrichtung.

    Löte nun alle Pins an den Außenseiten der Buchsenleisten, dann ziehe den ESP32 -vorsichtig ab – er wird erst gegen Ende wieder gebraucht.

    Falls du wechselseitige Buchsenleisten verwendest, löte nun auch innen alle -Pins an.

    Bauteile bereitlegenBuchsenleistung an ESP gesteckt und auf dem Board positioniert. -Erste Ecke löten und Positionierung kontrollieren. -In finaler Positionierung die verbleibenden äußeren Pins löten.Ausrichten und auf der gegenüberliegenden Seite ebenfalls fixieren -Innere Pins festlöten

    Spannungsregler (rot)

    Dieses Modul wird auf der Rückseite der Hauptplatine in SMD-Bauweise verlötet, -also ohne durchgesteckte Stifte oder Beine. Die halbrunden Pads an den -Außenseiten des Moduls werden direkt auf die Pads der Hauptplatine gelötet.

    Löte zunächst ein Pad an. Prüfe, dass das Lötzinn beide Pads gut benetzt. Achte -auf gute Ausrichtung, erst dann löte die anderen Pads ebenso.

    Die zwei direkt benachbarten Pads dürfen verbunden bleiben, sollte dir das -passieren.

    Eines der Pads mit Lötzinn benetzen. -Lötzinn erhitzen, und das Modul positionieren.Wenn fertig positioniert restliche Pins verlööten.Verlötet

    USB-C-Lademodul (blau)

    Das Lademodul ist ein blaues Modul mit einer USB-C Buchse darauf.

    Trenne von einer geraden Stiftleiste zwei einzelne Stifte und zwei Stiftpaare ab.

    Platziere das Modul auf der Unterseite der Hauptplatine. Stecke die Stifte in -die entsprechenden Löcher, sodass das schwarze Plastikteil sichtbar ist. Prüfe, -dass das Modul flach und ohne Lücke auf der Hauptplatine aufliegt, sonst -passt am Ende das Ladekabel nicht.

    Drehe nun die Hauptplatine samt Modul und Stiften um. Achte darauf, dass -keine Stifte herausfallen. Löte die Stifte auf der Oberseite der Hauptplatine fest.

    Drehe nun alles wieder um, und entferne die schwarzen Plastikteile von den -Stiften, indem du sie mit einer Pinzette oder Zange nach oben ziehst. Löte alle -Stifte an das Lademodul, dann kürze alle überstehenden Stifte mit dem -Seitenschneider.

    Mit stiftleisten fixierenMit Verpackungsmaterial (z.B. aus der ESP32 Verpackung) fixieren und Platine umdrehenPins auf der Platinenoberseite verlötenPlastikteile von den Pins abziehen -Pins mit dem blauen Modul verlöten

    Kleine elektronische Bauteile

    Widerstände

    Ordne zunächst alle Widerstände richtig zu, indem du die Farbcodes abliest oder -mit einem Multimeter misst:

    BauteilWertFarbcode 4 RingeFarbcode 5 RingeSMD Code
    R1, R21,2 kΩ
    braun, rot, rot, gold
    braun, rot, schwarz, braun, braun
    122 / 1201
    R310 kΩ
    braun, schwarz, orange, gold
    braun, schwarz, schwarz, rot, braun
    103 / 1002
    R4150 kΩ
    braun, grün, gelb, gold
    braun, grün, schwarz, orange, braun
    154 / 1503
    R5300 kΩ
    orange, schwarz, gelb, gold
    orange, schwarz, schwarz, orange, braun
    304 / 3003

    Nachdem du alle Widerstande zugeordnet hast, platziere sie an den dafür -vorgesehenen Stellen auf der Vorderseite der Hautplatine. Stecke die Beinchen -jeweils durch die beiden Löcher und biege sie etwa 30° nach außen, sodass die -Widerstände nicht mehr herausfallen. Drehe die Platine um und löte alle Beine -auf der Rückseite fest. Danach schneide den überstehenden Draht ab.

    Du kannst auch SMD-Widerstände verwenden, falls du solche hast. In diesem Fall -gehen wir davon aus, dass du auch weißt, wie du sie anbringst.

    Die Widerstände platzieren.Auf der Rückseite durch Verbiegen fixieren.Verlöten.

    Kondensatoren

    Identifiziere zunächst alle Kondensatoren und ordne sie korrekt zu. C1 ist -ein 100 nF großer Keramikkondensator, der ist in der Regel blau oder -hellbraun und hat manchmal die Aufschrift 104 (verwechsle ihn nicht mit der -Sicherung, die normalerweise gelb ist). C2 und C3 sind -Elektrolytkondensator mit 22 µF Kapazität, diese sind normalerweise -schwarz mit heller Aufschrift, zylinderförmig und haben zwei unterschiedlich -lange Beine auf der gleichen Seite.

    Bei C2 und C3 musst du auf die Polung auf Platine und Kondensator achten! -Ein Plus-Symbol auf der Platine zeigt die Seite, auf die das längere Bein -gehört. Die andere Seite ist auf der Platine ausgefüllt, am Kondensator ist -dort ein heller Streifen auf den Hauptkörper aufgedruckt, und das Bein ist -etwas kürzer.

    Stecke alle Kondensatoren, genau wie zuvor die Widerstände, von der Vorderseite -ein und biege die Beine etwas um. Dann drehe die Platine erneut um und löte die -Beine auf der Rückseite fest, und schneide dann den überstehenden Draht ab.

    Die KondensatorenC1 und C2 platzieren.Prüfen: Passt C2 unter den ESP? Falls nicht: Hinreichend viel Beinchen nach oben überstehen lassen, um C2 liegend zu montieren.C3 Montieren. Wie bei C2 prüfen, ob er unter den ESP passt.

    Sicherung

    Die Sicherung F1 ist in der Regel gelb, flach und hat 2 Beine. Der Körper -ist rund oder rechteckig. Die Sicherung sieht so ähnlich aus wie ein -Keramikkondensator, also verwechsle sie nicht mit C1.

    Die Polung der Sicherung ist egal. Die kleinen Biegungen in den Beinchen sorgen -für den richtigen Abstand zur Platine, da die Sicherung nicht direkt darauf -aufsitzen darf um korrekt zu funktionieren.

    Die Sicherung wie die bisherigen Bauteile eingebaut.

    Batteriestecker

    Der Batteriestecker wird üblicherweise als Kombination mit dem Kabel zusammen -geliefert. Du solltest sie zunächst zusammengesteckt lassen um die richtige -Polung herauszufinden.

    Hast du ein rote-schwarzes Batteriekabel solltest du für rot an Plus und -schwarz an Minus verwenden. Ist dein Batteriekabel braun-schwarz, nimm -braun an Plus und schwarz an Minus. Bei anderen Farben musst du dich -selbst entscheiden.

    Kürze das Batteriekabel auf 12 cm.

    Finde heraus, wie herum dein Stecker auf die Platine (bei J1 bzw. “Battery”) -gelötet werden muss, damit die Farbzuordnung mit der Platinenbedruckung -übereinstimmt. Löse dann das Kabel vom Stecker.

    Zwei unterschiedliche Ausrichtungen des Batteriesteckers. Die korrekte -Ausrichtung ist vom gelieferten Stecker und Kabel abhängig.

    Stecke den Stecker auf die Platine, drehe sie um und löte auf der Rückseite -einen der Pins fest. Prüfe nun, ob der Stecker gut und gerade auf der Platine -sitzt, ansonsten kannst du nacharbeiten. Löte dann die andere Seite fest.

    Diode

    Die Diode ist das größte der einzelnen Elemente, mit rundem schwarzen Körper -und ziemlich dicken Beinen, die an beiden Seiten heraustreten. Ein Ende des -Diodenkörpers ist mit einem hellen Kreis markiert.

    Bei der Diode musst du dringend die Polung beachten. Die Diode “steht” auf -dem Kreis auf dem PCB, aber der weiße Ring auf der Diode dabei zeigt nach oben. -Auf der Platine ist die richtige Polung auch als Piktogramm abgebildet.

    Biege die Beine der Diode um und stecke sie an die richtige Stelle. Kürze die -Enden vor dem Löten bereits, um beim Löten weniger Metall aufheizen zu müssen.

    Eigentlich sollen Halbleiter nur kurz gelötet werden, aber dieses ist ein sehr -großes Bauteil, und auch erstaunlich robust. Arbeite zügig, aber erwarte dass -es eine Weile dauert, bis das Bauteil und die Pads auf Temperatur gebracht sind -und das Lötzinn schmilzt.

    Kürze die überstehenden Enden nach dem Löten noch einmal auf ihre endgültige -Länge.

    Die Diode in ihrer korrekten Position. Achte darauf, dass der weiße Ring -nach oben zeigt, und die Diode auf der Platine auf dem weißen Kreis steht.

    Verbinder für Taster und Display

    Die weißen Buchsen für die Steckverbinder zum Ein- und Ausschalter (J2) sowie -zum Display (J3) werden nebeneinander oben auf die Hauptplatine aufgelötet.

    Löte wie beim Batteriestecker immer erst ein Bein fest, und prüfe danach, dass -die Buchse fest und vollständig auf der Hauptplatine aufsitzt. Löte danach erst -die anderen Beine an.

    Die beiden Stecker werden wie auf der Platine aufgedruckt platziert und -sollten flach und fest auf der Platine aufsitzen.

    Sensorboards

    Vorbereitung

    Die erste Option ist die bevorzugte. Dafür wird die JST-Buchse auf dem -Sensorboard durch eine abgewinkelte JST-Buchse ersetzt. Ziehe hierfür das weiße -Kunststoffteil der Buchse von den Metallstiften. Versehe diese mit ein wenig -Lötzinn, sodass es wieder leichter fließt, und löte sie dann aus, indem du sie -einzeln mit einer Pinzette herausziehst. Reinige anschließend die inneren zwei -Löcher mit einer Entlötsaugpumpe oder etwas Entlötlitze, sodass sie nicht mehr -verstopft sind. Löte dann die gewinkelte Buchse so ein, dass sie von der -Winkelstiftleiste weg zeigt.

    Die zweite Option ist der Einsatz einer Winkelstiftleiste anstelle der -richtigen JST-Buchse. Löte wie oben beschrieben die vorhandene gerade -JST-Buchse aus der Modulplatine aus, und ersetze sie durch eine -Winkelstiftleiste mit 2 Stiften. Führe dabei das kurze Ende nur so weit ins -Sensorboard ein, dass die Spitze der Stifte gerade so auf der anderen Seite -herausschaut. Diese Option solltest du nur wählen, wenn du keine gewinkelten -JST-Buchsen zur Hand hast.

    Die letzte Option ist ein wenig riskant und nicht besonders stabil, hat -aber auch schon oft und erstaunlich gut funktioniert. Dafür ziehe den weißen -Kunststoff der bestehenden JST-Buchse ab, und biege die zurückbleibenden -Metallstifte vorsichtig um, sodass sie weg von der vierpoligen Stifteleiste -“nach oben” zeigen. Dabei sollte die Biegung in etwa 2mm Abstand von der -Modulplatine anfangen. Am besten geht das mit einer stabilen Pinzette und einer -Flachzange. Die Stifte können dabei brechen, dann musst du das kreativ -reparieren. Auf die gebogenen Stifte lässt sich ein JST-Stecker aufstecken, -aber nicht arretieren. Wir hatten jedoch bisher keine Probleme mit dieser -Variante im Betrieb.

    Einbau

    Stecke beide Sensorboards an die vorgesehenen Plätze, achte dabei auf die -Beschriftung (+3V3, TRIG, ECHO, GND). Die Boards stehen sich “gegenüber” und -dürfen einander nicht berühren, die JST-Buchsen sind außen. Wenn die -Platzierung der Boards klar ist, lege das innere Board wieder beiseite.

    Fixiere zunächst das äußere Board. Hierfür kannst du die Hauptplatine mit dem -gestecktem Board auf den Kopf drehen, es steht so ganz gut von selbst.

    Löte nur einen Pin an, danach prüfe wie üblich die Ausrichtung. In der Regel -ist das Board beim ersten Versuch noch nicht senkrecht, und liegt auch nicht -auf voller Länge auf dem PCB auf, sondern hat “Luft” darunter. Dies kannst du -gut korrigieren, indem du die Hauptplatine mit Board in eine Hand nimmst, -sodass du mit dem Finger oder Daumen die Ausrichtung des Boards korrigieren -kannst. Mit der anderen Hand kannst du jetzt noch den Lötkolben führen. Da der -eine Pin bereits verlötet ist, benötigst du kein dritte Hand für das Lötzinn. -Passe so die Ausrichtung so lange an, bis sie aus allen Richtungen gut -aussieht.

    Erst dann werden die drei verbleibenden Pins verlötet. Platziere das zweite -Sensorboard auf dieselbe Weise, und kürze am Ende alle Stifte.

    Sensorboardplatzierung von oben.C1 und C2 platzieren.

    SD-Karten-Modul und GPS-Modul

    Trenne von einer Winkelstiftleiste eine Gruppe von 6 Stiften ab. Stecke sie -genau wie in der Abbildung gezeigt in das SD-Karten-Modul ein. Die korrekte -Ausrichtung ist wichtig, es gibt viele Möglichkeiten die Stiftleiste zu stecken -und die meisten davon passen am Ende nicht.

    • Die Stiftleiste wird von der Oberseite der Modulplatine aufgesteckt.
    • Die Stifte haben direkt oberhalb der Platine ihre Biegung.
    • Dann erst kommt die schwarze Kunststoffleiste.
    • Die lange, gerade Seite der Pins zeigt vom Modul weg.

    Verlöte die Winkelstiftleiste mit dem SD-Modul und kürze die überstehenden Pins -auf der Rückseite.

    Auch auf das GPS-Modul muss eine Winkelstiftleiste gelötet werden.

    • Die Stiftleiste wird mit der langen Seite in das GPS board gesteckt.
    • Die Stiftleiste steckt auf der Bestückungsseite des GPS Boards.
    • Die kurze Seite der Stiftleiste zeigt im rechten Winkel nach unten.

    Stecke die Module auf das PCB und achte dabei erneut auf die Ausrichtung. Die -Oberseiten beider Modulplatinen müssen zur Mitte der -OpenBikeSensor-Hauptplatine zeigen. Beachte auch das Foto unten.

    Verlöte wie gewohnt erst einen der Pins auf der Rückseite. Prüfe, dass das -Modul wirklich senkrecht auf der Hauptplatine steht und auch auf ganzer -Länge mit der Unterkante auf der Platine aufliegt, korrigiere dies bei Bedarf. -Erst dann löte die restlichen Pins und kürze sie.

    Die 6-polige Winkelstiftleiste muss von oben ins SD-Modul eingesetzt -werden, sodass die langen Enden der Stifte vom Modul weg zeigen und die -schwarzen Plastikteile einige Millimeter über die Platine hinausragen.

    Hier werden die zwei Module auf der Hauptplatine platziert. Die Oberseite -des Moduls zeigt in Richtung der Buchsenleiste für den ESP32.


    Ein/Aus-Schalter

    Schneide dir zwei kurze Stück Kabel von etwa 10cm Länge zurecht. Die eine Seite -wird jeweils mit einem Crimp versehen. Falls dein Batteriekabel über 20cm lang -ist, kannst du das Batteriekabel schon mal auf 12cm kürzen und die entstehenden -Abschnitte für dein Schalterkabel verwenden.

    Isoliere die andere Seite beider Kabel ca. 5mm weit ab und verdrille die Enden. -Nimm etwas Lötzinn und lasse es auf die freiliegenden Litzen fließen (dies wird -“verzinnen” genannt). Dadurch lässt sich die Litze wie ein solider Draht biegen.

    Biege die Enden in eine U-Form um. So lassen sie sich leicht in die Ösen des -Schalters einführen und halten sich selbst dort fest, bis du sie festgelötet -hast. Achte darauf nur kurz zu löten, sonst schmilzt der Kunststoff im Stecker.

    Verdrille nun die zwei Kabel zu einem, und führe dann die zwei Crimps in -das Steckergehäuse ein. Die Verdrillung wird sich ein wenig wieder lockern, -aber es sollte nun wie ein Kabel wirken, und keine große Schlaufe mehr bilden.

    Schalter mit Kabel und Stecker, noch unverdrillt..

    Ultraschallsensor-Kabel kürzen und crimpen

    Kürze langen schwarzen Kabel der Sensoren auf etwa 10cm, da die langen Kabel -nicht in das Gehäuse passen und auch die Plastikeinfassung der bestehenden -Stecker zu starr und zu dick für das Gehäuse ist.

    Entferne etwa 2cm der schwarzen Außenisolierung des Kabels. Schiebe die -Schirmung zur Seite und verdrille die einzelnen Leiter miteinander. Dies ist -einer der zwei Leiter, die gecript werden müssen. Isoliere vom inneren Leiter -nur etwa 1mm ab.

    Dann werden beide Leiter gecrimpt. Der Crimpkontakt muss für optimale -Verbindung den inneren Leiter und seine Isolierung greifen. Kürze die -Schirmung, sodass alle Adern gleich lang sind, dann crimpe sie alle gemeinsam. -Hier gibt es keine Isolierung, aber die Schirmung insgesamt ist stark genug um -auch mechanisch zu halten.

    Entferne, falls vorhanden, einzelne abstehende Leiter der Schirmung die nicht -im Crimp gesichert sind, sodass diese keinen Kurzschluss verursachen können.

    Führe die Crimpkontakte in das Steckergehäuse ein. Achte dabei auf die korrekte -Polung. Falls die Sensorboards modifiziert und mit gewinkelten -JST-Platinensteckern ausgestattet wurden (siehe Sensorboards » -Vorbereitung), wurde die Polung der Buchsen vertauscht und du musst deinen -Stecker ebenfalls anders herum polen.

    Sensor mit gekürztem Kabel und SteckerDetailaufnahme Stecker und Schirmung (ohne Winkelstecker-Modifikation)

    Batteriekabel anlöten

    Kürze das Batteriekabel auf ca. 12cm und isoliere etwa 5mm der Enden ab.

    Identifiziere die Polung der Batterie, der Pluspol ist auf der Seite mit -Einkerbung im Akku-Gehäuse, und in der Regel auch mit einem Plus auf dem -Aufdruck markiert. Im Zweifel miss mit dem Multimeter nach.

    Es empfiehlt sich, den Akku bereits in den Gehäusedeckel einzulegen, sodass er -bei der Arbeit nicht wegrollt. Statte beide Lötfahnen an ihrem Ende zunächst -mit einem großzügigen Lötpunkt aus. Lasse die Stellen wieder abkühlen, dann -nimm das Kabelende in die eine Hand und den Lötkolben in die andere, erhitze -den Lötpunkt von Neuem und führe das Kabelende seitlich in diesen ein, wenn das -Lötzinn flüssig geworden ist. Die Kabel sollen von der Lötfahne in die Mitte -der Batterie führen. Löte nicht zu lange an der gleichen Stelle, wenn etwas -nicht klappt, lasse das ganze lieber eine Minute lang abkühlen, bevor du es -erneut versuchst.

    Die Batteriekontakte werden nun mit Isolierband (wenn möglich Kapton-Tape) -gründlich isoliert und umwickelt, sodass die Pole und Lötfahnen komplett -bedeckt und die Kabel auch mechanisch fixiert sind.

    Befestige dann die Batterie mit einem kleinen Kabelbinder im Deckel des -Gehäuses. Stecke sie noch nicht ein.

    Akku mit Kabel und Stecker (Polung beachten!)Kontakte isolieren

    Gehäuse vorbereiten

    Gewindeeinsätze

    Im Haupt- sowie im Displaygehäuse gibt es einige Löcher, in die Gewindeeinsätze -(“heat-set inserts”) hinein gehören. Dort greifen später die Schrauben, die das -ganze Gerät zusammenhalten. Die Gewinde müssen an folgende Stellen:

    • 3 Stück in Hauptgehäuse für das PCB (mit Montagelöchern der Platine vergleichen)
    • 5 Stück in Hauptgehäuse für Hauptdeckel
    • 1 Stück in Hauptgehäuse beim GPS-Deckel
    • 3 Stück in Displaygehäuse

    Stelle deinen Lötkolben auf ca. 180-220°C ein und reinige die Spitze gründlich, -sodass kein Lot mehr daran hängt. Alternativ kannst du eine eigene Spitze für -diese Aufgabe verwenden, und danach wieder wechseln.

    Finde eines der vorgesehenen Löcher, nimm ein Gewinde und drücke es so weit es -geht von Hand in das Loch hinein. Halte das Gewinde bei Bedarf mit einer -Pinzette fest, während du den Lötkolben auflegst und leichten Druck ausübst. -Versuche, das Gewinde so senkrecht wie möglich und behutsam versinken lassen.

    Das Gewinde sollte lieber etwas zu tief sitzen, als über den Rand überzustehen, -um die Gehäuseteile bündig miteinander verbinden zu können. Die Gewinde, mit -denen das PCB befestigt wird, sollten allerdings auch nicht zu tief versinken, -sonst bildet sich eine Ausbuchtung auf der Außenseite.

    Vorsicht: Die Gewindeeinsätze sind noch lange nach dem Einsetzen heiß und -kühlen erst langsam ab. Lege das Gehäuseteil am besten einige Minuten zur -Seite, wenn du alle Gewinde darin platziert hast.

    Magnete

    Setze die kleinen Würfelmagnete in USB-Abdeckung ein. Wenn deine Abdeckung mit anderen -OpenBikeSensoren kompatibel sein soll, solltest du jetzt die Polung von einer Vorlage übernehmen.

    Setze zunächst die zwei Magnete in Abdeckung selbst ein. Die Magnete haben nur -in einer Achse Anziehungskraft, sie dürfen also nicht seitlich eingesetzt -werden. Es empfiehlt sich, die vier Magnete “als Stange” zu halten, um ein -Verdrehen zu vermeiden. Alternativ kannst du mit einem permanenten Marker die -richtige Seite markieren.

    Um die zwei Gegenstücke einzubauen, setze je einen Magneten auf einen der -Magnete in der Abdeckung. Stecke dann die Abdeckung ins Hauptgehäuse, und -drücke damit den einzelnen Magneten in sein vorgesehenes Loch. So stellst du -sicher, dass die Magneten einander anziehen.

    Sollten die Magnete nicht von selbst in ihrem Loch stecken bleiben, kannst du -sie auch mit etwas Sekunden- oder Alleskleber fixieren.

    Einpressgewinde in Displaygehäuse einschmelzen

    Hauptgehäuse mit Einpressgewinde (ältere Version mit zwei Mutternn für GPS)

    USB-Abdeckung mit Magneten

    Displayeinheit

    In diesem Abschnitt baust du das Display mit Knopf und Kabel in sein Gehäuse -ein.

    Verwende folgende Tabelle als Vorschlag für die Zuordnung der Leiter im -Displaykabel zu ihren Anschlüssen, oder tausche die Farben durch deine eigene -Zuordnung aus, falls dein Kabel andere Leitungsfarben verwendet.

    FarbeOBS-SeiteDisplayseiteButton
    blauSDASDA
    schwarzGNDGND
    grauBUT-Pin 1
    weißSCLSCK-
    braun+3V3-Pin 2
    kurzes Kabel (siehe unten)-VDDPin 2

    Kabel vorbereiten

    Entferne auf beiden Seiten des langen Displaykabel die Isolierung, auf der -einen Seite ca. 5-7cm lang (dies ist die Seite für das Hauptgerät) und auf der -anderen nur ca. 3cm. Die lange Seite wird vollständig gecrimpt, auf der -kurzen Seite crimpe nur drei Leiter, nämlich die für GND, SDA, SCL -(oder laut Farbtabelle den schwarzen, blauen und weißen Leiter). Die zwei -restlichen Leiter, +3V3 (braun) und BUT (grau) werden angelötet und dafür -ca. 5mm lang abisoliert.

    Bereite ein kleines Kabelstück von ca. 3cm Länge vor, und crimpe auch hier eine -Seite und isoliere die andere ab.

    Verzinne alle Kabelenden die zum Löten vorgesehen sind (drei Stück).

    Knopf

    Schraube den Knopf in das Gehäuseoberteil des Displays hinein. Wenn die Mutter -nicht das Gewinde greifen kann (den Knopf gibt es in verschiedenen Längen) -kannst du auch etwas Heißkleber verwenden.

    Löte die drei Leiter an die zwei Seiten des Buttons an. Dabei kommen das kleine -Kabel mit +3V3 (braun) zusammen auf eine Seite und BUT (grau) allein auf -die andere. Auch hier empfiehlt sich, wie beim Schalter, wenn du zuerst die -abisolierten und verzinnten Enden zu einer U-Form biegst und in die Ösen -einhängst, um dann nur kurz löten zu müssen, damit der Kunststoffkörper des -Knopfes nicht schmilzt. Wenn du mehrfach löten musst, lass den Taster zwischendurch -abkühlen.

    Stecker

    Ziehe am Displaymodul die schwarzen Plastikteile von der Stiftleiste ab und -kürze die vier Stifte um jeweils ca. 2mm.

    Entferne vom 4-poligen JST-Steckergehäuse die Arretierung (auf der einen Seite -leicht hervorstehende Plastikflügel), zum Beispiel mit einem Cuttermesser oder -Seitenschneider. Nur so passt der Stecker am Ende in das kleine Displaygehäuse.

    Stecke die 4 gecrimpten Kabelenden (drei vom langen Displaykabel und eines vom -kurzen Kabelstück) in das Steckergehäuse. Die Zuordnung kannst du anhand der -Tabelle und der Beschriftung auf der Displayplatine machen, oder du kompierst -die abgebildete Reihenfolge.

    Führe die 5 gecrimpten Kabelenden am langen abisolierten Ende des Kabels in das -5-polige JST-Steckergehäuse ein. Die Zuordnung kannst du wieder anhand der -Tabelle und der Beschriftung auf der Hautplatine machen, oder erneut die -abgebildete Reihenfolge kopieren.

    Zusammenbau

    Entferne die Schutzfolie vom Display. Sollte dein Display nicht ins Gehäuse -passen, kannst du mit einem Seitenschneider die Ecken der Platine etwas -bearbeiten, bis es passt.

    Stecke den 4-poligen Stecker auf die gekürzten Pins am Display und setze -dieses in das Gehäuseoberteil ein. Kürze bei Bedarf die Pins weiter, bis der -Stecker ganz auf der Displayplatine aufliegt, damit er ins Displaygehäuse -passt.

    Setze zwei rechteckige Magnete in die Seitentasche ein. Wenn dein Display -mit anderen OpenBikeSensoren kompatibel sein soll, solltest du jetzt die -Polarität von einer Vorlage übernehmen. Manchmal sind die Magnete etwas lose -und klappern, fixiere sie dann mit Kleber oder umwickele sie mit Klebeband.

    Setze die Gehäuseteile zusammen und drehe die drei Schrauben hinein, die sie -zusammenhalten.

    Stecke die beiden Hälften der Zugentlastung in die Öffnung der Unterseite -aus der das Kabel herauskommt. Setze erst die eine Seite ein, und dann die -zweite etwas angewinkelt, bevor du sie beide zusammendrückst, sodass sie das -Kabel am nicht abisolierten Teil greifen. Falls der zweite Teil sich nicht -hineinhebeln lässt kannst du die angewinkelten unteren Ecken etwas mit einem -Seitenschneider weiter abrunden, sodass die Halterung leichter hinein geht.

    Schraube mit je zwei Schrauben und Sechskantmuttern die zwei Hälften -zusammen. Achte darauf, dass die sechseckige Fixierung auf jeweils einer Seite -der Zugentlastung für die Mutter vorgesehen ist.

    Das untere Teil des Displaygehäuses mit ZugentlastungKabel durch Unterteil geführtButton in Displayoberteil eingeschraubtOBS-Seite: Alle 5 Adern crimpenOBS-Seite in Stecker einführenZwei Kabel an Button löten (Pin 2)Display-Seite: Button und Stecker fertigVerschiedene Displays vom gleichen Lieferanten -Wenn nötig, Display mit Seitenschneider stutzen -Display in Gehäuse einpassen, ohne GewaltMagnete passend einlegenDas Display mit verschraubtem GehäuseZugsicherung fixieren

    Firmware installieren

    Zunächst muss die OpenBikeSensor-Firmware auf den ESP32 installiert werden. -Dieser Vorgang heißt auf Englisch “to flash” oder eingedeutscht “flashen”.

    Schließe dafür den ESP32 mit einem Mikro-USB Kabel direkt an einen Computer an. -Benutze dann eine dieser Methoden, um die Firmware darauf zu installieren:

    Elektronik testen

    Vor dem Einbau ins Gehäuse sollte die Elektronik getestet werden. Führe -zunächst einen Sichttest der gelöteten Stellen durch, bevor du das erste Mal die -Batterie und/oder ein Ladekabel anschließt.

    • Sind alle Lötpunkte gut verbunden?
    • Siehst du eine kalte Lötstelle irgendwo?
    • Findest du auf der Platine heruntergetropftes Lötzinn oder einen Drahtrest, -der einen Kurzschluss verursachen könnte?
    • Sind irgendwo versehentlich benachbarte Pins miteinander verbunden worden -(häufig bei den Kondensatoren der Fall)?
    • Sind alle Module senkrecht und stabil eingebaut?

    Löte bei Bedarf die fehlerhaften Stellen nach.

    Für den Test der Elektronik solltest du einen vollständig geladenen Akku -verwenden. In Workshops ist meist einer vorbereitet, hast du nur den neuen und -ungeladenen Akku, so kannst du ihn mit deinem OpenBikeSensor jetzt aufladen:

    1. Ziehe alle Stecker aus der Platine und entferne den ESP32.
    2. Stecke den Hauptschalter ein.
    3. Stecke das Batteriekabel polungsrichtig ein
    4. Schließe ein normales USB-C Ladegerät (5 V) an das Lademodul an.
      • Einige Geräte funktionieren nur nach Anschluss an ein Ladegerät.
      • Ein Handyladeadapter funktioniert eigentlich immer, neuere oder -leistungsfähigere USB-C Netzteile manchmal nicht.
    5. Während des Ladevorgangs leuchtet die LED am Lademodul rot, wenn der Akku -voll ist blau.

    Wenn du einen vollen Akku hast, beginne mit dem Test der Elektronik:

    1. Ziehe den Akku zunächst wieder ab. Verbinde nur das Display und den -Hauptschalter und stecke den ESP32 auf seine Buchsenleisten. Achte dabei -darauf, dass der USB-Port des ESP32 in die auf der Platine markierte -Richtung zeigt.
    2. Achte darauf, dass der Schalter ausgeschaltet ist.
    3. Stecke die Batterie jetzt polungsrichtig ein.
    4. Schalte den Hauptschalter ein.
      • Nach etwa einer Sekunde sollte der Startbildschirm auf dem Display -erscheinen.
      • Wenn das nicht passiert, schalte das Gerät wieder aus. Sofern nichts -stinkt oder gar raucht, kannst du alle Verbindungen prüfen und es noch -einmal versuchen.
      • Wenn dein Display funktioniert und ein OpenBikeSensor-Logo sowie etwas -Text anzeigt, schalte das Gerät aus und fahre mit dem nächsten Testschritt -fort.
    5. Stecke die SD-Karte in die Halterung. Starte das Gerät und warte, bis auf -dem Display “SD OK” erscheint.
      • Kommt kein “SD OK” sondern ein “SD Error” und/oder ein Zähler, der 10 -Sekunden lang zählt, so wurde deine SD-Karte nicht erkannt. Prüfe in -diesem Fall die Verbindungen zwischen dem ESP32 und dem SD-Modul auf -Leitfähigkeit, nimm dafür den -Schaltplan -zu Hilfe.
      • Wenn deine SD-Karte funktioniert, schalte das Gerät aus und fahre mit dem -nächsten Testschritt fort.
    6. Stecke die GPS-Antenne an das GPS-Modul an. Sei vorsichtig mit dem kleinen -Stecker und der Buchse, sie können leicht verbiegen. Starte das Gerät und -lasse es eine Weile unter freiem Himmel liegen. Es kann bis zu 20 Minuten -dauern, bis ein GPS-Signal gefunden wurde. Keine Sorge, das ist nicht jedes -Mal so. Wenn das GPS-Signal gefunden wird, schaltet das Gerät vom -Startbildschirm in den Messmodus und zeigt die Abstände links und rechts an -(ohne Sensoren natürlich nicht). In diesem Fall fahre mit dem nächsten -Testschritt fort.
    7. Stecke die Ultraschallsensoren an ihre Module an. Starte das Gerät, -überspringe bei Bedarf mit dem Knopf das Suchen des GPS-Signals, und prüfe, -dass die Sensoren plausible Abstände messen.

    Wenn alle Komponenten korrekt funktionieren, kannst du das Gerät ausschalten, -alle Verbindungen wieder trennen, und mit dem Einbau ins Gehäuse beginnen. Hast -du einen Fehler gefunden, der sich nicht durch nachlöten reparieren lässt, -hilft dir vielleicht eine der Anleitung auf der Fehlersuche-Seite weiter.

    Zusammenbau

    • Kabel und Halterung

      • Die vier Sechskantmuttern in die Wand des Gehäuses einsetzen (bei Gehäuse -mit zwei Halterungen sind es acht Sechskantmuttern).
      • Sind die Sechskantlöcher eng, die Muttern mit der längeren M3 Schraube -von der Außenseite in die Öffnung ziehen.
      • Ist ein Sechskantloch auch dafür zu eng, vorsichtig mit dem Lötkolben -nachdrücken, und die Mutter von der Außenseite mit der längeren Schraube führen. -Vermeide dabei, mit dem Lötkolben das Plastik zu berühren.
      • Falls du ein Gehäuse mit mehreren Montageöffnungen baust, entscheide dich, an -welcher Öffnung du die Halteklammer installieren willst. Diese Öffnung -führt auch später das Kabel. Die andere Öffnung wird mit dem Deckel -(AttachmentCover) verschlossen.
    • PCB im Hauptgehäuse platzieren

      • Zunächst die SD-Karte einlegen, den ESP abziehen.
      • Gesamtes Board in leichtem Winkel herabsenken, auf Ausrichtung der USB-C -Ladebuchse achten. Bei Wiederzusammenbau am Displaykabel vorbei navigieren.
      • Bei Bedarf Unreinheiten des Gehäuses (vom 3D-Druck) entfernen, wenn das PCB -daran hängen bleibt.
      • Mit 3 Stück M3x6 oder M3x8 im Gehäuse verschrauben.
      • Nun kann der ESP wieder aufgesteckt werden. Dabei die Richtung der -USB-Markierung mit Mikro-USB-Buchse dem ESP32 abgleichen, -und sicherstellen, dass die Pins nicht um ein oder zwei Löcher verrutscht -eingesteckt werden.
      • Muss der ESP wieder abgezogen werden, um die Platinenschraube darunter wieder -zu lösen, kann man einen Inbus als “Enterhaken” verwenden, um den ESP zu lockern
    • Displaykabel in Gehäuse einstecken

      • Führe das Displaykabel mit dem Stecker voran von außen in das Hauptgehäuse hinein -(Falls in Schritt 16 nicht geschehen). -Entscheide dich, ob du -eine Top-Rider oder Back-Rider Variante -bauen möchtest, und führe das freie Ende des Kabels durch die entsprechende -Öffnung im Hauptgehäuse. Möchtest du beide Halterungen montieren und dir damit -beide Varianten ermöglichen, kannst du dir die Öffnung frei aussuchen.
      • Die Halterung mit Zugentlastung anbringen und damit das Kabel fixieren. -Noch nicht festziehen, nur sicherstellen, dass die Muttern nicht mehr -herausfallen.
      • Das Kabel sollte außen um die Elektronik herumgeführt werden, nicht -zwischen dem GPS- und SD-Karten-Modul hindurch. Im neuen Gehäuse sollte -dort genug Platz sein.
      • Jetzt zeigt sich auch, warum ca. 5cm Abisolierung hier sinnvoll ist, denn -ohne Isolierung ist das Kabel flexibler.
      • Stecker einsetzen (z.B. mit Pinzette)
      • Kabel so weit aus der Zugsicherung herausziehen, bis kein überschüssiges -Kabel im Innenraum des Gehäuses ist, aber das Kabel nicht straff liegt.
      • Schrauben der Zugsicherung bzw. Halterung nun fest anziehen.
    • GPS-Antenne einsetzen

      • Kabel der Antenne mit kleinem Stecker durch das kleine Loch fädeln.
      • GPS-Antenne mit Schirmung nach unten und Keramik nach oben in die -quadratische Aussparung einsetzen.
      • Den Antennenstecker auf das GPS-Board aufstecken. Der Stecker ist sehr -filigran und schwer zu stecken, es geht gut ihn mit den Fingern zu -platzieren und mit einer Pinzette den Stecker und die GPS-Modulplatine -zusammenzudrücken. Dabei auf richtigen Sitz achten um den Stecker nicht zu -beschädigen.
      • Den GPS-Deckel über die Antenne schieben und mit einer M3x6 oder M3x8 -Schraube fixieren.
      • Falls das Antennenkabel nicht reicht, kann die GPS-Antenne mithilfe eines -hinreichend langen Antennenkabels mit IPEX/U.FL Stecker verlängert werden. -Hierzu:
        • Den Metallschild des GPS-Moduls ablöten.
        • Das neue Kabel vorsichtig durch Rollen unter Cuttermesser auf etwa -5-7mm abisolieren.
        • Die Schirmung zurückschieben.
        • Noch vorsichtiger die innere Isolierung durch ganz sanftes Rollen -mit dem Cuttermesser abisolieren.
        • Das kurze Kabel ab- und das neue, längere anlöten.
        • Den Metallschild des Moduls wieder in ursprünglicher Ausrichtung -auflöten.
    • Schalter in Gehäuse einsetzen

      • Einschaltrichtung mit “I/O” Aufdruck des Gehäuses vergleichen.
      • Möglichst mit der mitgelieferten Unterlegscheibe und Mutter fixieren.
      • Schalterkabel verdrillen, falls nicht bereits geschehen..
      • Kabel entlang der Gehäusewand zur Buchse führen und dort einstecken.
    • Sensoren einbauen

      • Auf der Rückseite des Sensors gibt es einen Pfeil, der mit “UP” die -Richtung markiert, wo später oben sein soll.
      • Einen Sensor ins Hauptgehäuse einbauen, den anderen in den Deckel.
      • Sensoren einstecken. Den Sensor im Gehäuse an das ihm naheliegendste -Sensorboard anschließen, den Sensor vom Deckel in das entferntere (Anschluss über dem ESP32).
    • Akku einbauen

      • Akku im Deckel mit Kabelbinder fixieren (falls in Schritt 14 noch nicht erledigt)
      • Einstecken. Polung beachten!
      • Möglicherweise überstehendes Kabel möglichst auf der Seite des GPS -verstauen. Die Adern verdrillen und parallel legen.
    • Konfiguration des Sensors:

      • Die Anzeige kann im Konfigurationsmodus auf den Simple-Mode gestellt werden.
      • Außerdem kann die Breite des Lenkers und WLAN eingestellt werden.
      • Bei einem Reboot des Sensors wird nun auf der Sensor-Anzeige der Simple-Mode mit dem Abstand des linken Sensors angezeigt - abzüglich der Breite des Lenkers.
      • Alternativ im Profimodus weiterfahren.
    • Montage und Testfahrt mit dem Fahrrad.

    Akku und Ultraschallsensor an Deckel montieren ('Up'-Pfeil beachten)Ultraschallsensoren einsteckenLadebuchse (USB-C) ohne Gewalt in die Aussparung einfädelnPCB festschraubenHalterung und Zugentlastung festschraubenGPS-Deckel festschraubenDeckel festschraubenFertig!

    5.1 - Bauanleitung für den OpenBikeSensor v00.03.12

    Dies ist die Anleitung zum Aufbau des OpenBikeSensors v00.03.12 in der -Standardvariante. Andere Versionen können über das Dokumentationsmenü -aufgerufen werden.

    Die beschriebene Vorgehensweise ist nur eine Möglichkeit, zu einem -funktionierenden Modell zu kommen. Wenn du alternative Wege gehen möchtest, -kannst du das natürlich tun. Solltest du einen massentauglichen besseren oder -einfacheren Weg für einen der Schritte finden, freuen wir uns über -Änderungsvorschläge -oder eine kurze Nachricht.

    Ein fertig gebauter OpenBikeSensor der Version v00.03.12

    Voraussetzungen

    Diese Anleitung setzt voraus, dass die Grundtechniken wie Löten, das -Abisolieren von Kabeln und das Crimpen von JST-Verbindern bereits bekannt sind. -Für letzteres empfehlen wir das -JST-Crimp-Tutorial.

    Wenn du unsicher bist, wo -du ein Bauteil auf dem Board unterbringen sollst, kannst du die -interaktive Stückliste (BOM) verwenden, um dir -anzeigen zu lassen, wo ein Bauteil eingesetzt werden kann.

    Schritt 1: Buchsenleisten

    • Falls nur Buchsenleisten mit 16 Pins vorhanden sind, müssen diese auf 15 Pins gekürzt werden:
      • Mit dem Seitenschneider kürzen.
      • Mit dem Cuttermesser oder Schleifpapier nacharbeiten, um keine scharfe Kante zu hinterlassen.
    • Buchsenleisten auf ESP32 stecken, um den Abstand später genau passend zu haben.
      • Auf die Richtung der Pins (Kontaktbeine an der Buchsenleiste) achten!
      • Die Pads (Lötstellen auf der Platine) sind nicht symmetrisch, auf je einer -Seite ist nur jeder zweite Pin mit Pad versehen.
    • Buchsenleisten mit gestecktem ESP32 positionieren. Auf gute zentrierte Ausrichtung achten.
    • Einen Eck-Pin festlöten. Dabei den ESP32 gut festhalten, evtl. zu zweit arbeiten.
    • Ausrichtung prüfen, wenn der ESP32 verrutscht ist, nacharbeiten.
    • Diagonal gegenüberliegenden Pin anlöten. Ausrichtung erneut prüfen.
    • Alle äußeren Verbindungen verlöten.
    • Den ESP32 vorsichtig abziehen, sodass die Pins dabei nicht verbiegen.
    • Die inneren Kontakte anlöten.
    Bauteile bereitlegenBuchsenleite wenn nötig auf 15 Pins zuschneiden -Buchsenleisten auf ESP32 aufstecken -Gemeinsam auf dem PCB platzieren. Ausrichtung der abwechselnden Pins (innen) prüfen.Zunächst an einem Eckpunkt fixierenAusrichten und auf der gegenüberliegenden Seite ebenfalls fixieren -Alle äußeren Pins festlöten (beidseitig)Alle äußeren Pins festgelötet -Dann den ESP32 entfernen und die Innenseite verlöten

    Schritt 2: Spannungsregler (rot)

    • Wir verwenden Stiftleisten, um den Spannungsregler richtig zu positionieren. Verlötet -werden diese nicht, sondern später wieder herausgezogen und beim Lademodul -benutzt.
      • Bei Bedarf kann die beim SD-Karten-Modul mitgelieferte 6-polige Stiftleiste -verwendet werden, diese wird nicht für die SD-Karte gebraucht.
      • Stifte von der Leiste abtrennen: 1x1 und 1x2 Stifte.
      • Spannungsregler mit Stiften in zwei gegenüber liegenden Lötstellen platzieren.
      • Stifte nicht verlöten!
    • Das ausgerichtete Modul an den anderen beiden SMD-Pads verlöten.
      • Die Außenseite der Modulplatine hat ein halbrudes Loch mit Kontaktfläche.
      • Diese wird mit Lötzinn verbunden zum Pad auf der OBS-Hauptplatine darunter.
      • Auf guten Fluss des Lötzinns zum unteren Pad achten.
    • Die Ausrichtungsstifte abziehen und die restlichen Kontakte ebenfalls in -SMD-Bauweise verlöten.
    Stiftleisten ablängen -Bauteile bereitlegenBoard platzieren und mit Stiften ausrichten, anderes Pad wie SMD verlötenFreie Kontakte löten -Stifte entfernen und restliche Kontakte löten

    Schritt 3: USB-C-Lademodul (blau)

    • Für das blaue Lademodul 2x2 Stifte und 2x1 Stift vorbereiten (siehe oben).
    • Modul auf PCB auflegen
    • Die Stifte und Stiftpaare einstecken und evtl. fixieren.
    • Aufpassen, dass das Modul flach auf dem PCB aufliegt, sodass später die -Ausrichtung der USB-Ladebuchse korrekt ist.
    • Die Stifte von der anderen Seite verlöten.
    • Die schwarzen Plastikteile entfernen und die Oberseite ebenfalls verlöten.
    • Alle überstehenden Stifte mit dem Seitenschneider kürzen.
    Bauteile bereitlegenLademodul und Stifte platziertAuf Oberseite verlötenAlle Stifte auf Oberseite verlötet -Schwarze Plastikteile von Stiftleiste entfernenSchwarze Plastikteile von Stiftleiste entfernt -Oberseite verlötenStifte kürzen

    Schritt 4: Widerstände

    • Widerstände richtig zuordnen (Farbcodes z.B. via kiloohm.info decodieren oder mit einem Multimeter messen):
      • R1: 10 kΩ (braun - schwarz - orange - gold)
      • R2: 150 kΩ (braun - grün - gelb - gold)
      • R3: 300 kΩ (orange - schwarz - gelb - gold)
      • R6, R7: 1,1 kΩ (braun - braun - rot - gold) oder 1 kΩ (braun - schwarz - rot - gold)
      • Leider enthält die Platine einen Fehler, und R7 kann nicht wie vorgesehen platziert werden, sonst ist der Widerstand dem einen Sensorboard im Weg.
      • Statt auf der Oberseite verlöten wir den Widerstand auf der Unterseite.
      • Die Beinchen werden dabei nicht durch die Löcher gesteckt. Wir behandeln den Widerstand wie ein SMD-Bauteil.
      • Pads identifizieren. Eines der Pads auf der Platinenunterseite mit etwas -Lötzinn benetzen. Sehr wenig Zinn verwenden, sonst sickert es durch das -Loch durch und bildet auf der Rückseite eine Perle, die dann im Weg ist.
      • Zinn wieder verflüssigen, Widerstand mit einem Bein darin fixieren. Der -Widerstand liegt flach auf der Unterseite der Platine auf, mit nicht -gebogenen Beinen.
      • Anderes Bein mit Lötzinn auf anderes Pad löten.
      • Beine kürzen.
      • Falls doch Lötzinn zur Oberseite der Platine durchgesickert ist, mit -Entlötlitze reduzieren.
    • Falls ein SMD-Widerstand für R6 verwendet werden soll:
      • Einen Lötpunkt auf ein Pad setzen.
      • Widerstand flach auf das PCB legen, Lötpunkt erneut schmelzen und -das Bauteil mit der Pinzette darauf schieben.
      • Andere Seite normal festlöten.
      • R7 nicht so verbauen (s.o.)
    • Normale THT-Widerstände (R1, R2, R3, R6) stecken, verlöten, Beine kürzen.
    R7: Eines der Pads verzinnenR7: Den Widerstand wie ein SMD-Bauteil einseitig anlötenR7: Die zweite Seite verlötenR7: Fertig montiert -Ein Widerstand (R6) platziertAuf der Rückseite verlötenBeine kürzen. Widerstände R1-R3 ebenso montieren.

    Schritt 5: Kondensatoren

    • Kondensatoren identifizieren und richtig zuordnen
      • C1: 100 nF (in der Regel blau, manchmal Aufschrift 104)
      • C2, C3: 22 µF Elektrolytkondensator (i.d.R. schwarz mit heller Aufschrift, zylinderförmig, unterschiedlich lange Beine)
    • Bei C2 und C3: Polung auf Platine und Kondensator beachten!
      • Plus: Langer Pin
      • Minus: Kurzer Pin, mit Streifen markierte Seite, auf PCB ausgefüllte Hälfte
    • Kondensatoren C1 bis C3 stecken, zum Fixieren die Beine umbiegen
    • Auf Rückseite verlöten und überstehenden Draht abkneifen
    Die KondensatorenKondensatoren platzieren, auf Polung achten!Auf der Rückseite umbiegen und verlötenDrähte kürzen -Widerstände und Kondensatoren fertig platziert

    Schritt 6: Lötpunkt / Brücke

    • JP1 (mittig auf der Platine) mit einem Lötpunkt versehen und damit überbrücken
    • Erstes Bild im nächsten Schritt zeigt das Ergebnis

    Schritt 7: Stromversorgung

    • Sicherung (in der Regel dunkelgelb, flach mit 2 Beinen, rund oder rechteckig)
      • Position: F1
      • Die Polung ist egal
      • Die kleinen Biegungen in den Beinchen sorgen für den richtigen Abstand.
      • Einstecken, senkrecht verlöten, Beine abkneifen.
    • Batteriestecker
      • Stecker und Kabel zusammenstecken
      • Beschriftung auf der Platine beachten (Rot: „Plus“, Schwarz: „Minus“)
      • Auf der Rückseite einen Pin anlöten.
      • Das Kabel abziehen.
      • Auf guten Sitz des Steckers achten. Wenn der Stecker noch nicht flach und -senkrecht auf der Platine aufsitzt, die Lötstelle noch einmal heiß machen -und den Stecker an seinen Platz drücken.
      • Den zweiten Pin festlöten.
    • Diode
      • Polung beachten: Die Diode “steht” auf dem Kreis auf dem PCB, aber der -weiße Ring auf der Diode dabei zeigt nach oben.
      • Diode umbiegen und aufstecken
      • Enden vor dem Löten etwas kürzen, um beim Löten weniger Metall aufheizen zu -müssen
      • Verlöten: Eigentlich sollen Halbleiter nur kurz gelötet werden, aber dieses -ist ein sehr großes Bauteil, und auch erstaunlich robust. Arbeite zügig, -aber erwarte dass es eine Weile dauert, bis das Bauteil und die Pads auf -Temperatur gebracht sind und das Lötzinn schmilzt.
      • Die überstehenden Enden nachkürzen.
    Die fertig platzierten Bauteile (oben links)

    Schritt 8: Verbinder für Taster und Display

    • J5 (Displaykabel)
      • 5-Pin-Konnektor gemäß Markierung auf Platine aufsetzen
      • Die Aussparungen zeigen in Richtung der Mitte der Platine.
      • Einen Pin von unten verlöten.
      • Ausrichtung prüfen und evtl. korrigieren (Hinweise hierzu siehe -Batteriestecker).
      • Restliche Pins verlöten.
    • J6 (Schalter Ein/Aus)
      • 2-Pin-Connector so aufsetzen, dass er möglichst wenig über den Rand der -Platine übersteht und verlöten.
      • Polung egal.
      • Wie oben verlöten.
    5-poligen Stecker richtigherum aufsteckenAuf der Rückseite verlöten, auf guten Sitz achten2-poligen Stecker ebenso montieren

    Schritt 9: Sensorboards

    Vorbereitung

    • Option 1: (bevorzugt, benötigt gewinkelte 2-polige JST-Stecker)
      • Die JST-Stecker aus dem Sensorboard auslöten. Hierfür:
        • Das weiße Kunststoffteil abziehen.
        • Die zurückbleibenden Metallstifte mit etwas mehr Lötzinn versehen und -herausziehen.
        • Das innere Paar Löcher von Lötzinn befreien (Entlötsaugpumpe oder -Entlötlitze).
      • Gewinkelte JST-Stecker stattdessen einlöten.
      • Das Kabel, wenn eingesteckt, sollte weg von den 4 Pins des Boards zeigen -(nach oben, wenn montiert).
    • Option 2 (Winkelstiftleiste):
      • Die JST-Stecker aus dem Sensorboard auslöten (siehe oben).
      • Durch eine 2-polige Winkelstiftleiste ersetzen.
      • Dabei das kurze Ende nur so weit ins Sensorboard einführen, dass die Spitze -der Stifte gerade so auf der anderen Seite herausschaut und dann verlöten.
    • Option 3 (Kontakte biegen):
      • Den weißen Kunststoff vom JST-Stecker abziehen
      • Die zurückbleibenden Metallstifte vorsichtig umbiegen, sodass sie weg von -der vierpoligen Stifteleiste “nach oben” zeigen, dabei die Biegung in etwa -2 mm Abstand vom Board anfangen.
      • Die Stifte können dabei brechen, dann muss kreativ repariert werden. ;)
      • Hier lässt sich ein JST-Stecker einstecken, aber nicht arretieren. Wir -hatten jedoch bisher keine Probleme mit dieser Variante im Betrieb.
    Ein einzelnes Sensorboard -Das weiße Kunststoffteil entfernenKontakte des alten Steckers auslöten, neuen Stecker einlöten

    Einbau

    • Beide Sensorboards stecken, dabei Beschriftung (+3V3, TRIG, ECHO, GND) -beachten. Die Boards stehen sich “gegenüber” und dürfen einander nicht -berühren. Wenn die Platzierung der Boards klar ist, das inner Board wieder -beiseite legen.
    • Das erste Board fixieren. Hierfür kann das PCB mit gestecktem Board auf den -Kopf gedreht werden, es steht so ganz gut.
    • Nur einen Pin anlöten. Danach die Ausrichtung prüfen. In der Regel ist das -Board hier noch nicht senkrecht, und liegt auch nicht auf voller Länge auf -dem PCB auf, sondern hat “Luft” darunter.
    • Das PCB und Board in eine Hand nehmen, sodass mit dem Finger oder Daumen die -Ausrichtung des Boards korrigiert werden kann. Mit der anderen Hand kann der -Lötkolben geführt werden. Da der eine Pin bereits verlötet ist benötigen wir -keine weitere Hand für das Lötzinn. So kann die Ausrichtung leicht angepasst -werden, bis sie aus allen Richtungen gut aussieht.
    • Erst dann werden die drei verbleibenden Pins verlötet.
    • Das zweite Board genauso einlöten.
    • Überstehende Stifte kürzen.
    Sensorboards platzieren (schief aufgestellt für Übersicht, bitte gerade löten)Auf der Rückseite verlöten, Beine kürzen

    Schritt 10: SD-Karten-Modul

    • Gewinkelte Stiftleiste mit 6 Pins vorbereiten.
    • Gewinkelte Stiftleiste genau wie in der Abbildung gezeigt in SD-Karten-Modul -stecken. Die Ausrichtung ist wichtig, es gibt acht Möglichkeiten die Stiftleiste zu -stecken, sieben davon funktionieren nicht.
      • Die Stiftleiste wird von der Oberseite der Modulplatine aufgesteckt.
      • Die Stifte haben direkt oberhalb der Platine ihre Biegung.
      • Dann erst kommt die schwarze Kunststoffleiste.
      • Die lange, gerade Seite der Pins zeigt vom Modul weg.
    • Stiftleiste mit dem Modul verlöten und überstehende Pins abkneifen.
    • Modul auf das PCB stecken (Ausrichtung und Beschriftung beachten).
    • Verlöten und Stifte kürzen.
    SD-Karten Modul und Stiftleiste -Stiftleiste in Modul einstecken (Richtung beachten) -Stiftleiste in Modul verlöten (Richtung beachten)Modul platzierenAuf der Rückseite anlöten und kürzen

    Schritt 11: GPS-Modul

    • Gewinkelte Stiftleiste mit 4 Pins vorbereiten.
    • Stiftleiste in PCB einlöten:
      • Von der Unterseite stecken.
      • Langes Ende der Pins steht seitlich heraus.
    • Eng anliegend verlöten, Stifte kürzen.
    • GPS-Modul aufstecken, sodass es in der Aussparung des PCB liegt.
    • Einen Pin verlöten, Ausrichtung korrigieren wie bei Sensorboards
    • Restliche Pins Verlöten und Stifte kürzen.
    4-polige Winkelstiftleiste abkürzen und stecken (Richtung beachten)Auf der Oberseite verlötenGPS-Modul senkrecht aufstecken und verlöten

    Schritt 12: Ein/Aus-Schalter

    • Zwei Stück Kabel, ca. 10 cm lang, abtrennen.
    • Einseitig crimpen und in 2-fach JST Steckergehäuse einführen.
    • Andere Kabelenden an den Schalter löten.
      • Etwa 5 mm des Kabels abisolieren.
      • Drahtenden verdrillen und verzinnen.
      • Zu einem “U” oder “Z” biegen und in die Öse an den Schalterpins einführen.
      • Nur kurz löten, sonst schmilzt der Kunststoff im Stecker.
    Schalter mit Kabel und Stecker

    Schritt 13: Ultraschallsensor-Kabel kürzen und crimpen

    • Die langen schwarzen Kabel der Sensoren auf etwa 10 cm kürzen, da die langen -Kabel nicht in das Gehäuse passen und auch die Plastikeinfassung der -bestehenden Stecker zu starr und zu dick für das Gehäuse ist.
    • Empfehlung: Schrumpfschlauch (sofern vorhanden, optional) direkt nach dem -Kürzen auf das schwarze Sensorkabel aufziehen, noch bevor es abisoliert und -gecrimpt wird.
    • Abisolieren:
      • Etwa 2 cm des Kabels abisolieren.
      • Die Schirmung zur Seite schieben und alle Leiter miteinander verdrillen (dies ist einer der zwei Leiter, die gecript werden müssen).
      • Den inneren Leiter etwa 1 mm abisolieren.
    • Crimpen:
      • Beide Leiter werden gecript.
      • Der Crimpkontakt muss für optimale Verbindung den inneren Leiter und seine Isolierung greifen.
      • Die Schirmung auf dir gleiche Länge kürzen und gemeinsam crimpen. Eventuell -einzelne abstehende Leiter entfernen, sodass diese keinen Kurzschluss -verursachen.
    • Stecken:
    • Zum Schluss Schrumpfschlauch (falls vorhanden) erhitzen und befestigen, dabei -etwa 3-5 mm vom Stecker entfernt positionieren um ein Biegen in Steckernähe -beim Einstecken zu ermöglichen.
      • Hinweis: Dieser Schritt kann auch erst nach dem Testen der Eletronik -gemacht werden, wenn sichergestellt ist, dass der Sensor korrekt funktioniert.
    Sensor mit gekürztem Kabel und SteckerDetailaufnahme Stecker und Schirmung

    Schritt 14: Batteriekabel anlöten

    • Die Akkus müssen mit Lötfahnen ausgestattet sein. Akkus ohne Lötfahnen dürfen -nicht gelötet werden!
    • Das Batteriekabel (rot und schwarz) auf ca. 12 cm kürzen und neu auf ca. 5 mm -abisolieren.
    • Die Polung der Batterie identifizieren. Der Pluspol ist auf der Seite mit -Einkerbung im Akku-Gehäuse, und in der Regel auch mit einem Plus auf dem -Aufdruck markiert. Im Zweifel mit dem Multimeter nachmessen.
    • Es empfiehlt sich, den Akku bereits in den Gehäusedeckel einzulegen, sodass -er nicht wegrollt.
    • Jede Seite zunächst mit einem großzügigen Lötpunkt ausstatten. Dann den -Lötpunkt erneut erhitzen und das Kabelende seitlich ins Lötzinn einführen. -Die Kabel sollen von der Lötfahne in die Mitte der Batterie führen.
    • Die Batteriekontakte mit Isolierband (wenn möglich Kapton-Tape) isolieren und -einfach umwickeln, sodass die Pole und Lötfahnen komplett bedeckt sind und -die Kabel mechanisch fixiert werden.
    • Die Batterie mit einem kleinen Kabelbinder im Deckel befestigen.
    Akku mit Kabel und Stecker (Polung beachten!)Kontakte isolieren

    Schritt 15: Gehäuse vorbereiten

    • Einpressgewinde (“heat-set inserts”) einbauen:
      • Den Lötkolben auf ca. 180-220°C einstellen, gut reinigen (kein Lot an der -Spitze). Nach Möglichkeit eigene Spitze für diese Aufgabe verwenden, und -danach wieder wechseln.
      • Einpressgewinde so weit wie möglich von Hand in das vorgesehene Loch drücken.
      • Lötkolben auflegen, nur sehr leichten Druck ausüben.
      • Gewinde so senkrecht wie möglich und behutsam versinken lassen.
      • Das Gewinde sollte lieber etwas zu tief sitzen, als über den Rand -überzustehen, um die Gehäuseteile bündig miteinander verbinden zu können.
      • Die Gewinde, mit denen das PCB befestigt wird, nicht zu tief versenken, sonst -bildet sich eine Ausbuchtung auf der Außenseite.
      • Vorsicht: Die Einpressgewinde sind noch lange nach dem Einsetzen heiß -und kühlen erst langsam ab. Gehäuse am besten einige Minuten zur Seite legen.
    • Einpressgewinde hier platzieren:
      • 3 Stück in Hauptgehäuse für das PCB (mit Montagelöchern der Platine vergleichen)
      • 5 Stück in Hauptgehäuse für Hauptdeckel
      • 1 Stück in Hauptgehäuse beim GPS-Deckel
      • 3 Stück in Displaygehäuse
    • Kleine Würfelmagnete in USB-Abdeckung einsetzen
      • Wenn Kompatibilität mit anderen OBS gewünscht ist, muss auf gleiche Polung -geachtet werden, da sonst die Abdeckungen nicht austauschbar sind.
      • Erst Magnete in Abdeckung einsetzen.
      • Dann einen Magnet auf einen der eingesetzten platzieren und die -Abdeckung ins Hauptgehäuse stecken, dabei den einzelnen Magneten ins -Hauptgehäuse eindrücken. Mit der anderen Seite wiederholen.
    Einpressgewinde in Displaygehäuse einschmelzenHauptgehäuse mit EinpressgewindeUSB-Abdeckung mit Magneten

    Schritt 16: Display-Kabel

    • Zugentlastung in Displaygehäuse-Unterteil einsetzen:
      • Erste Hälfte der Zugentlastung einsetzen.
      • Zweite Hälfte von außen angewinkelt eindrücken, bei Bedarf die unteren -Ecken mit dem Seitenschneider leicht abrunden, damit sie sich leichter in -die vorgesehene Position stecken lässt.
    • Kabel durch Displaygehäuse-Unterteil und Zugentlastung führen.
    • Button in Gehäuseoberteil einschrauben.
    • Stecker OBS-Seite
      • Das andere Kabelende durch das Displaygehäuse-Unterteil stecken.
      • Die Außenisolierung kann gut auf ca. 5 cm abisoliert werden.
      • Die einzelnen Litzen nur 1-2 mm abisolieren und alle 5 Litzen crimpen. -Für stabilen Halt müssen die äußeren Flügel des Crimpkontakts die -Isolierung der jeweiligen Litze greifen.
      • Gecrimpte Kabelenden in das JST-Gehäuse (5-polig) einführen. -OBS-PCB und Display sind beschriftet. Zuordnung der Farben zu Beschriftung notieren. -Unten gibt es eine Verkabelungstabelle mit Farbvorschlag.
    • Stecker Display-Seite
      • Vom JST-Gehäuse (4-polig) die Arretierung (auf der einen Seite leicht -hervorstehende Plastikflügel) entfernen, also eben abschneiden (Cuttermesser -oder Seitenschneider).
      • Nur 3 Kabel crimpen: GND, SDA, SCL. Die Außenisolierung auf -ca. 2 cm abisolieren.
      • BUT an eine Seite des Buttons löten.
      • Kleines Kabelstück (ca. 3 cm):
        • vorbereiten, einseitig crimpen
        • mit +3V3 zusammen an andere Buttonseite löten
        • Crimpkontakt entspricht jetzt +3V3 bzw. VDD (am Display)
      • Gecrimpte Kabelenden in das JST-Gehäuse (4-polig) einführen.
    OBS-SeiteDisplayseiteButtonVorschlag Farbe
    SDASDAblau
    GNDGNDschwarz
    BUT-Pin 1grau
    SCLSCK-weiß
    +3V3-Pin 2braun
    -VDDPin 2(kurzes Stück Kabel)
    Das untere Teil des Displaygehäuses mit ZugentlastungKabel durch Unterteil geführtButton in Displayoberteil eingeschraubtOBS-Seite: Alle 5 Adern crimpenOBS-Seite in Stecker einführenZwei Kabel an Button löten (Pin 2)Display-Seite: Button und Stecker fertig

    Schritt 17: Display-Zusammenbau

    • 0,96-Zoll OLED-Displayboard vorbereiten
      • Die OLED-Boards haben teils etwas unterschiedliche Größen
        • Platine des Displays nach Bedarf etwas zurechtschneiden, insbesondere an den Ecken (Seitenschneider)
        • Je nach Genauigkeit des 3D-Drucks das Gehäuse etwas weiter ausfräsen
      • Schutzfolie von Display abziehen
      • Plastikteile an Steckkontakten entfernen und Pins um etwa 2 mm kürzen.
    • Display in Gehäuseoberteil (das mit dem Button) einsetzen.
    • Stecker auf die gekürzten Pins aufstecken (Polung beachten). Gegebenenfalls die Pins weiter kürzen, -bis der Stecker ganz auf dem Board aufliegt, damit er ins Displaygehäuse passt.
    • Magnete in die Seitentasche einsetzen.
      • Wenn Kompatibilität mit anderen OBS gewünscht ist, muss auf gleiche Polung -geachtet werden, da sonst die Halterungen nicht austauschbar sind.
      • Je nach Genauigkeit des 3D-Drucks können die Magnete lose sein und etwas klappern. -Die Magnete dann ggf. mit etwas Kleber fixieren oder mit einem Klebestreifen einwickeln.
    • Gehäuseunterteil aufsetzen und mit Schrauben fixieren.
    • Zugentlastung mit M3x8 Schrauben und Sechskantmuttern fixieren, dabei auf -sechseckige Fixierung auf jeweils einer Seite der Zugentlastung achten.
    Verschiedene Displays vom gleichen Lieferanten -Wenn nötig, Display mit Seitenschneider stutzen -Display in Gehäuse einpassen, ohne GewaltMagnete passend einlegenDas Display mit verschraubtem GehäuseZugsicherung fixieren

    Schritt 18: ESP32 flashen

    Zunächst muss die OpenBikeSensor-Firmware auf den ESP32 geflashed werden. -Am schnellsten sollte dies mit dem Chrome-Browser über diese Webseite gehen:

    Folge alternativ der Anleitung für dein Betriebssystem.

    Schritt 19: Elektronik testen

    Vor dem Einbau ins Gehäuse testen wir die Elektronik in dieser Reihenfolge:

    1. Ausschalten
    2. Batteriekabel polungsrichtig einstecken.
    3. Laden: Normales USB-C Ladegerät (5 V) anschließen
      • Einige Geräte funktionieren nur nach Anschluss an ein Ladegerät
      • Bei vollem Akku leuchtet das Modul blau, sonst rot.
    4. USB-C Kabel abstecken.
    5. Einschalten per Kippschalter (ohne dabei den Knopf am Display zu drücken)
      • Boot-Screen sollte auf dem Display erscheinen. Wenn nicht, nochmal aus- und, sofern nichts stinkt oder gar raucht, wieder einschalten.
    6. Bei angeschlossener GPS-Antenne GPS-Funktion im Freien testen
      • Nach einigen Minuten: GPS-Board blinkt, Boot-Screen wechselt zu Sensor-Anzeige. Werden 0 Satelliten angezeigt, wird trotzdem weitergesucht, was zu Beginn wegen des Downloads des Almanachs sehr lange dauern kann. 15 Minuten sind beim ersten Einschalten nicht ungewöhnlich.
      • Alternativ kann durch einen Druck auf den Taster vom Boot-Screen zur Sensor-Anzeige gewechelt werden.
    7. Sensoren-Funktion testen:
      • Sensoren mit den Sensor-Boards verbinden
        • Die Polung beachten. Siehe hierzu auch Schritt 13.
      • Zur Sensor-Anzeige wechseln, auf welcher in der Fußzeile die Roh-Werte, der Abstände (ohne Lenkerabstand) der Ultraschall-Sensoren, live angezeigt werden (Option “raw details” in der Konfiguration).
      • Hinweis: Der linke Sensor wird am äußeren, dem Loch zugewandten Sensor-Board angeschlossen.
    Die Elektronik funktioniert

    Schritt 21: Zusammenbau

    Vor dem Zusammenbau sicherstellen, dass die Firmware auf dem ESP32 aufgespielt ist, -dann muss dieser später nicht mehr ausgebaut werden.

    • Kabel und Halterung
      • Die vier Sechskantmuttern in die Wand des Gehäuses einsetzen (bei Gehäuse -mit zwei Halterungen sind es acht Sechskantmuttern).
      • Sind die Sechskantlöcher eng, die Muttern mit der längeren M3 Schraube -von der Außenseite in die Öffnung ziehen.
      • Ist ein Sechskantloch auch dafür zu eng, vorsichtig mit dem Lötkolben -nachdrücken, und die Mutter von der Außenseite mit der längeren Schraube führen. -Vermeide dabei, mit dem Lötkolben das Plastik zu berühren.
      • Falls du ein Gehäuse mit mehreren Montageöffnungen baust, entscheide dich, an -welcher Öffnung du die Halteklammer installieren willst. Diese Öffnung -führt auch später das Kabel. Die andere Öffnung wird mit dem Deckel -(AttachmentCover) verschlossen.
    • PCB im Hauptgehäuse platzieren
      • Zunächst die SD-Karte einlegen und den ESP32 aufstecken, dabei auf die -Polung achten (USB-Markierung mit Mikro-USB-Stecker auf ESP32 abgleichen) -und sicherstellen, dass die Pins nicht um ein oder zwei Löcher verrutscht -eingesteckt werden.
      • Gesamtes Board in leichtem Winkel herabsenken, auf Ausrichtung der USB-C -Ladebuchse achten. Bei Wiederzusammenbau am Displaykabel vorbei navigieren.
      • Bei Bedarf Unreinheiten des Gehäuses (vom 3D-Druck) entfernen, wenn das PCB -daran hängen bleibt.
      • Mit 3 Stück M3x6 oder M3x8 im Gehäuse verschrauben.
    • Displaykabel in Gehäuse einstecken
      • Führe das Displaykabel mit dem Stecker voran von außen in das Hauptgehäuse hinein -(falls in Schritt 16 nicht geschehen).
      • Die Halterung mit Zugentlastung anbringen und damit das Kabel fixieren. -Noch nicht festziehen, nur sicherstellen dass die Muttern nicht mehr -herausfallen.
      • Das Kabel sollte außen um die Elektronik herumgeführt werden, nicht -zwischen dem GPS- und SD-Karten-Modul hindurch. Im neuen Gehäuse sollte -dort genug Platz sein.
      • Jetzt zeigt sich auch, warum ca. 5 cm Abisolierung hier sinnvoll ist, denn -ohne Isolierung ist das Kabel flexibler.
      • Stecker einsetzen (z.B. mit Pinzette)
      • Kabel so weit aus der Zugsicherung herausziehen, bis kein überschüssiges -Kabel im Innenraum des Gehäuses ist, aber das Kabel nicht straff liegt.
      • Schrauben der Zugsicherung bzw. Halterung nun fest anziehen.
    • GPS-Antenne einsetzen
      • Kabel der Antenne mit kleinem Stecker durch das kleine Loch fädeln.
      • GPS-Antenne mit Schirmung nach unten und Keramik nach oben in die -quadratische Aussparung einsetzen.
      • Den Antennenstecker auf das GPS-Board aufstecken. Der Stecker ist sehr -filigran und schwer zu stecken, es geht gut ihn mit den Fingern zu -platzieren und mit einer Pinzette den Stecker und die GPS-Modulplatine -zusammenzudrücken. Dabei auf richtigen Sitz achten um den Stecker nicht zu -beschädigen.
      • Den GPS-Deckel über die Antenne schieben und mit einer M3x6 oder M3x8 -Schraube fixieren.
      • Falls das Antennenkabel nicht reicht, kann die GPS-Antenne mithilfe eines -hinreichend langen Antennenkabels mit IPEX/U.FL Stecker verlängert werden. -Hierzu:
        • Den Metallschild des GPS-Moduls ablöten.
        • Das neue Kabel vorsichtig durch Rollen unter Cuttermesser auf etwa -5-7 mm abisolieren.
        • Die Schirmung zurückschieben.
        • Noch vorsichtiger die innere Isolierung durch ganz sanftes Rollen -mit dem Cuttermesser abisolieren.
        • Das kurze Kabel ab- und das neue, längere anlöten.
        • Den Metallschild des Moduls wieder in ursprünglicher Ausrichtung -auflöten.
    • Schalter in Gehäuse einsetzen
      • Einschaltrichtung mit “I/O” Aufdruck des Gehäuses vergleichen.
      • Möglichst mit der mitgelieferten Unterlegscheibe und Mutter fixieren.
      • Schalterkabel verdrillen.
      • Kabel entlang der Gehäusewand zur Buchse führen und dort einstecken.
    • Sensoren einbauen
      • Auf der Rückseite des Sensors gibt es einen Pfeil, der mit “UP” die -Richtung markiert, wo später oben sein soll.
      • Einen Sensor ins Hauptgehäuse einbauen, den anderen in den Deckel.
      • Sensoren einstecken. Den Sensor im Gehäuse an das ihm naheliegendste -Sensorboard anschließen, den Sensor vom Deckel in das entferntere (Anschluss über dem ESP32).
    • Akku einbauen
      • Akku im Deckel mit Kabelbinder fixieren (falls in Schritt 14 noch nicht erledigt)
      • Einstecken. Polung beachten!
      • Möglicherweise überstehendes Kabel möglichst auf der Seite des GPS -verstauen. Beide Adern verdrillen und parallel legen.
    • Konfiguration des Sensors:
      • Die Anzeige kann im Konfigurationsmodus auf den Simple-Mode gestellt werden.
      • Außerdem kann die Breite des Lenkers und WLAN eingestellt werden.
      • Bei einem Reboot des Sensors wird nun auf der Sensor-Anzeige der Simple-Mode mit dem Abstand des linken Sensors angezeigt - abzüglich der Breite des Lenkers.
    • Montage und Testfahrt mit dem Fahrrad.
    Akku und Ultraschallsensor an Deckel montieren ('Up'-Pfeil beachten)Ultraschallsensoren einsteckenLadebuchse (USB-C) ohne Gewalt in die Aussparung einfädelnPCB festschraubenHalterung und Zugentlastung festschraubenGPS-Deckel festschraubenDeckel festschraubenFertig!

    6 - Fehlersuche

    Dieser Bereich enthält Anleitungen und Links zu Informationen, die bei bekannten Schwierigkeiten und Problemen Abhilfe schaffen könnten.

    Solltest du einem Problem begegnen, das hier noch nicht aufgeführt ist, könnte -eine Suche im Forum helfen. Findest -du auch dort nichts, ist die Kategorie Hilfe & -Support der richtige Ort, eine -Frage zu stellen und Unterstützung zu bekommen.

    Displaymeldung SD Error

    Es wird eine SD-Karte im Format FAT32 benötigt - Neuere SD-Karten kommen manchmal mit dem exFAT Dateisystem und müssen entsprechend umformatiert werden - unter Windows: Rechtsklick->Formatieren.

    Sind mehrere OpenBikeSensoren zur Hand, kann eine SD-Karte aus einem funktionierenden Sensor zum Testen verwendet werden - Funktioniert ein OpenBikeSensor auch mit der als funktionierend bekannten SD-Karte nicht, gibt es ein Problem mit dem SD-Karten Board oder dessen Verlötung. Funktioniert es mit der SD-Karte des anderen OpenBikeSensors, gibt es ein Problem mit der SD-Karte.

    Konnte die SD-Karte als Fehlerquelle ausgeschlossen werden, sollten die Lötstellen des SD-Boards (und die korresppondierenden Lötstellen an der ESP32 Sockelleiste) geprüft werden. Die Datenleitungen SD_CD/CS, SD_CLK/CLK, SD_DAT0/MISO und SD_CMD/MOSI liegen auf den Pins am ESP, die mit D5,D18,D19 und D23 beschriftet sind und können mit einem Multimeter durchgepiepst werden.

    In manchen Fällen kann es auch vorkommen, dass eine SD-Karte verwendet wird, die den alten SD-Standard nicht unterstützt, der vom OpenBikeSensor genutzt wird. Liegt keine “als funktionierend bekannte” SD-Karte vor, kann man das am einfachsten durch Einsatz einer möglichst alten (aber noch funktionierenden) SD-Karte prüfen, - z.B. aus einem alten Handy, MP3-Player, Raspberry Pi…, da ältere SD-Karten den Standard mith höherer Wahrscheinlichkeit unterstützen. Die SD-Karte muss natürlich auch FAT32 formatiert werden, um vom OpenBikeSensor genutzt zu werden.

    GPS

    Denke daran, dass das GPS Modul nur ein paar Euro kostet - im Notfall ist ein Tausch des GPS-Moduls also kein finanzieller Beinbruch.

    Ultraschallsensoren

    Phantommessungen

    Wenn die Kabel falsch herum gekrimpt sind, kommt es oft zu Störugen am Ultraschallsensor - diese äußern sich durch häufige Messwerte auch wenn gar kein Objekt Ultraschall reflektieren kann.

    Mögliche Ursachen:

    • Bei den Kabeln der Ultraschallsensoren sollte die Schirmung auf dem Pin des Ultraschallboards liegen, der weiter entfernt von dem großen viereckigen Metallbauteil liegt. Bei manchen Boards ist dieser auch mit “-” beschriftet.
    • Wenn Batterie - oder Schalterkabel große Leiterschleifen in der Nähe der Sensorboards bilden, kommt es oft zu Störungen der Ultraschallsensoren. Verdrille Batterie- und Schalterkabel, um diese Leiterschleifen zu vermeiden.

    Keine Messung

    • Werden keine Ultraschallmesswerte angezeigt, auch wenn z.B. gegen eine Wand gemessen wird gibt es mehrere mögliche Ursachen:
      • Bei Fehlern beim Krimpen haben die Sensoren manchmal keinen Kontakt am Krimp, neu Krimpen kann hier helfen.
      • Bei Fehlern beim Verlöten des Ultraschallboards ist ggf das gesamte Board nicht aktiv (Lötstellen Prüfen)
      • Wenn nur ein Ultraschallsensor funktioniert, lässt sich durch tausch der Transducer prüfen, ob der Fehler durch das Ultraschallboard verursacht wird (Der Fehler bleibt auf der gleichen Seite) oder durch den Ultraschallsensor selbst (der Fehler wandert mit dem Ultraschallsensor auf die andere Seite).

    Falls die oberen beiden Ursachen ausgeschlossen werden können hilft manchmal die Anleitung zur Kalibrierung

    - \ No newline at end of file diff --git a/docs/classic/about/_print/index.html b/docs/classic/about/_print/index.html deleted file mode 100644 index e0f4e905..00000000 --- a/docs/classic/about/_print/index.html +++ /dev/null @@ -1,51 +0,0 @@ -Überblick | OpenBikeSensor - - - -

    Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

    Zur Standardansicht zurückkehren.

    Überblick

    Der OpenBikeSensor Classic ist das Originalgerät, das seit 2018 in ehrenamtlicher Arbeit von vielen Beteiligten als Open Hardware Design entworfen und entwickelt wird.

      Die Classic Variante des OpenBikeSensors ist ein eigenständiges Design, das -alle benötigten Funktionalitäten zum Aufzeichnen von Überholabständen vereint. -Es wird in Handarbeit aus kommerziell verfügbaren Modulen (wie einem -GPS-Empfänger und Ultraschallsensoren) zusammengebaut. Das Ergebnis ist ein -robustes Gerät das leicht und ohne weitere Voraussetzungen bedient und gut -verliehen werden kann.

      Dieser Bereich der Dokumentation enthält die Bauteileliste, Bauanleitung, Links -zum Gehäuse und Hilfen beim Beschaffen der Teile.

      • Die Bauteileliste enthält alle benötigten elektronischen -Module und Einzelkomponenten, die mechanischen Bauteile wie Schrauben -und Muttern sowie jeglichen “Kleinkram” wie Kabel und Befestigungen.
      • Das Gehäuse wird im 3D-Druck-Verfahren hergestellt.
      • Die Hauptplatine wurde speziell für den -OpenBikeSensor entworfen und kann als Spezialanfertigung bei einem -Platinenhersteller anhand der bereitgestellten Designdateienen bestellt -werden.
      • Die Bauanleitung beschreibt, wie die -Bauteile auf der Hauptplatine installiert und das ganze ins Gehäuse -eingesetzt werden.

      Muss ich den OpenBikeSensor selbst bauen?

      Ja! Es gibt den OpenBikeSensor nicht als fertiges Gerät zu kaufen. Stattdessen -baust du ihn dir selbst zusammen.

      Du brauchst auch keine Angst zu haben, damit loszulegen – selbst wenn nicht -immer sofort offensichtlich ist, wie alles funktioniert, so ist es trotzdem -auch für Anfänger:innen möglich, erfolgreich einen Sensor anhand dieser -Anleitungen zu bauen. Und wenn das mal nicht klappt, gibt es genug Leute die -dir gern weiterhelfen, und ihr Wissen teilen.

      Vielleicht kannst du dich auch mit einigen Anderen in deiner Gegend -zusammentun. Schau in der Community vorbei oder -auf die Karte der Initiativen, und finde -Gleichgesinnte, mit denen du zusammen arbeiten und lernen kannst.

      Das Gerät besteht aus vielen Einzelteilen aus verschiedenen Quellen besteht. -Sammelbestellungen sind eine gute Möglichkeit, die Komplexität aufzuteilen und -für jede:n Einzelne:n zu verringern. Dabei sparen wir alle Geld, denn in Menge -bestellt sind viele Teile günstiger. Auch solche Sammelbestellungen werden in -der Community organsiert.

      OpenBikeSensor Classic Bausatz (alte Version)

      Hinweis für den Bau großer Stückzahlen

      Leider hatten wir in der Verangenheit immer wieder Probleme damit, dass die aus -China gelieferten fertigen Module nicht oder nur teilweise den Spezifikationen -entsprachen. Auch die Abmaße von Teilen ändern sich manchmal, z.B. bekamen wir -vom Lieferanten plötzlich größere Displays als üblich.

      Wenn du mehrere Geräte vom Typ OpenBikeSensor Classic herstellen möchtest, -empfiehlt es sich daher, zunächst einen Probelauf zu machen. So stellst du -sicher, dass die gelieferten Teile alle korrekt angekommen sind und den -Anforderungen entsprechen. Löte dafür einen der Bausätze vollständig zusammen -und baue ihn auch in das Gehäuse ein.

      Wenn du auf diese Weise bemerkst, dass Lieferanten plötzlich andere Teile -liefern, sprich es auf jeden Fall in der Community an. Vielleicht muss die Lieferantenliste angepasst werden, oder es gibt eine -einfache Änderung am Gehäuse, um auch mit den neuen Teilen kompatibel zu -werden. Der:die nächste freut sich!

      Alternativen

      Aufgrund der Vielfalt in dem Projekt und der unterschiedlichen Anforderungen -der Beteiligten gibt es auch eine Vielzahl Varianten für fast jedes Teil. Der -Einfachheit halber pflegen wir jedoch hier auf der Website, in den Anleitungen -und Bestelllisten, nur eine “Standard-Variante”. Diese ist zur Zeit:

      • PCB Version 00.03.12
      • Hauptgehäuse (ehem. “Vertical Case”)
      • Displaygehäuse (ehem. “SlideOnDisplay”)
      • eine Halterung nach jeweiligen Anforderungen

      Alternativen, wie alte Versionen oder andere Gehäuse, verlinken Aktive im Forum -oder auf GitHub. Dort kannst du dich gern umschauen, falls du eine Anpassung -wünscht und diese nicht selbst erfinden möchtest – vielleicht hat das ja schon -irgendwer getan.

      - \ No newline at end of file diff --git a/docs/classic/about/index.html b/docs/classic/about/index.html index 8536de2d..5ce9603b 100644 --- a/docs/classic/about/index.html +++ b/docs/classic/about/index.html @@ -1,11 +1,9 @@ -Überblick | OpenBikeSensorÜberblick | OpenBikeSensor + - - - -

      Überblick

      Der OpenBikeSensor Classic ist das Originalgerät, das seit 2018 in ehrenamtlicher Arbeit von vielen Beteiligten als Open Hardware Design entworfen und entwickelt wird.

      Die Classic Variante des OpenBikeSensors ist ein eigenständiges Design, das +">

      Überblick

      Der OpenBikeSensor Classic ist das Originalgerät, das seit 2018 in ehrenamtlicher Arbeit von vielen Beteiligten als Open Hardware Design entworfen und entwickelt wird.

      Die Classic Variante des OpenBikeSensors ist ein eigenständiges Design, das alle benötigten Funktionalitäten zum Aufzeichnen von Überholabständen vereint. Es wird in Handarbeit aus kommerziell verfügbaren Modulen (wie einem GPS-Empfänger und Ultraschallsensoren) zusammengebaut. Das Ergebnis ist ein @@ -15,23 +13,23 @@ Module und Einzelkomponenten, die mechanischen Bauteile wie Schrauben und Muttern sowie jeglichen “Kleinkram” wie Kabel und Befestigungen.

    • Das Gehäuse wird im 3D-Druck-Verfahren hergestellt.
    • Die Hauptplatine wurde speziell für den OpenBikeSensor entworfen und kann als Spezialanfertigung bei einem -Platinenhersteller anhand der bereitgestellten Designdateienen bestellt +Platinenhersteller anhand der bereitgestellten Designdateien bestellt werden.
    • Die Bauanleitung beschreibt, wie die Bauteile auf der Hauptplatine installiert und das ganze ins Gehäuse eingesetzt werden.
    • Muss ich den OpenBikeSensor selbst bauen?

      Ja! Es gibt den OpenBikeSensor nicht als fertiges Gerät zu kaufen. Stattdessen baust du ihn dir selbst zusammen.

      Du brauchst auch keine Angst zu haben, damit loszulegen – selbst wenn nicht immer sofort offensichtlich ist, wie alles funktioniert, so ist es trotzdem auch für Anfänger:innen möglich, erfolgreich einen Sensor anhand dieser -Anleitungen zu bauen. Und wenn das mal nicht klappt, gibt es genug Leute die +Anleitungen zu bauen. Und wenn das mal nicht klappt, gibt es genug Leute, die dir gern weiterhelfen, und ihr Wissen teilen.

      Vielleicht kannst du dich auch mit einigen Anderen in deiner Gegend zusammentun. Schau in der Community vorbei oder auf die Karte der Initiativen, und finde -Gleichgesinnte, mit denen du zusammen arbeiten und lernen kannst.

      Das Gerät besteht aus vielen Einzelteilen aus verschiedenen Quellen besteht. +Gleichgesinnte, mit denen du zusammen arbeiten und lernen kannst.

      Das Gerät besteht aus vielen Einzelteilen aus verschiedenen Quellen. Sammelbestellungen sind eine gute Möglichkeit, die Komplexität aufzuteilen und für jede:n Einzelne:n zu verringern. Dabei sparen wir alle Geld, denn in Menge bestellt sind viele Teile günstiger. Auch solche Sammelbestellungen werden in -der Community organsiert.

      OpenBikeSensor Classic Bausatz (alte Version)

      Hinweis für den Bau großer Stückzahlen

      Leider hatten wir in der Verangenheit immer wieder Probleme damit, dass die aus -China gelieferten fertigen Module nicht oder nur teilweise den Spezifikationen +der Community organsiert.

      OpenBikeSensor Classic Bausatz (alte Version)

      Hinweis für den Bau großer Stückzahlen

      Leider hatten wir in der Vergangenheit immer wieder Probleme damit, dass die aus +China gelieferten fertigen Module nicht, oder nur teilweise den Spezifikationen entsprachen. Auch die Abmaße von Teilen ändern sich manchmal, z.B. bekamen wir vom Lieferanten plötzlich größere Displays als üblich.

      Wenn du mehrere Geräte vom Typ OpenBikeSensor Classic herstellen möchtest, empfiehlt es sich daher, zunächst einen Probelauf zu machen. So stellst du @@ -45,6 +43,5 @@ Einfachheit halber pflegen wir jedoch hier auf der Website, in den Anleitungen und Bestelllisten, nur eine “Standard-Variante”. Diese ist zur Zeit:

      • PCB Version 00.03.12
      • Hauptgehäuse (ehem. “Vertical Case”)
      • Displaygehäuse (ehem. “SlideOnDisplay”)
      • eine Halterung nach jeweiligen Anforderungen

      Alternativen, wie alte Versionen oder andere Gehäuse, verlinken Aktive im Forum oder auf GitHub. Dort kannst du dich gern umschauen, falls du eine Anpassung -wünscht und diese nicht selbst erfinden möchtest – vielleicht hat das ja schon -irgendwer getan.


      Zuletzt geändert 16.12.2023: Add new images and link v00.03.12 and v1.0.0 build manuals. (4895f5c)
      Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
      Druckansicht dieses Kapitels
      - \ No newline at end of file +wünschst und diese nicht selbst erfinden möchtest – vielleicht hat das ja schon +irgendwer getan.


      Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
      \ No newline at end of file diff --git a/docs/classic/build-instructions/_print/index.html b/docs/classic/build-instructions/_print/index.html deleted file mode 100644 index 03a90523..00000000 --- a/docs/classic/build-instructions/_print/index.html +++ /dev/null @@ -1,587 +0,0 @@ -Bauanleitung (OpenBikeSensor Classic 1.0.0) | OpenBikeSensor - - - -

      Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

      Zur Standardansicht zurückkehren.

      Bauanleitung (OpenBikeSensor Classic 1.0.0)

      Sobald der Bausatz für den OpenBikeSensor Classic zusammengestellt ist, kann anhand dieser Anleitung der Bau begonnen werden. Der Zusammenbau besteht aus einer Menge Lötarbeit, sowie dem Test der Elektronik und dem Einbau in das Gehäuse.

      Dies ist die Anleitung zum Aufbau des OpenBikeSensor Classic. Die aktuelle -Version dieser Bauanleitung setzt die Hauptplatine der Version 1.0.0 voraus, -sowie die Verwendung der auf dieser Website dokumentierten Bau- und -Gehäuseteile. Auch die benötigten Verbrauchsgüter und Werkzeuge sind bei der -Bauteileliste beschrieben. Hast du einen älteren -Bausatz mit der Platinenversion 00.03.12 kannst du diesen entweder -mit einer Platine Version 1.0.0 upgraden und der Bauanleitung 1.0.0 folgen -(alle Bauteile sind gleich), oder du kannst. -hier die Anleitung für die 0.03.12 Platine finden

      Die beschriebene Vorgehensweise ist nur eine Möglichkeit, zu einem -funktionierenden Modell zu kommen. Wenn du alternative Wege gehen möchtest, -kannst du das natürlich tun. Solltest du einen massentauglichen besseren oder -einfacheren Weg für einen der Schritte finden, freuen wir uns über -Änderungsvorschläge -oder eine kurze Nachricht.

      Ein fertig gebauter OpenBikeSensor der Version 1.0.0

      Voraussetzungen und Hinweise

      Achtung, bitte lies die folgenden Hinweise gut durch, bevor du mit dem Aufbau -anfängst.

      • Diese Anleitung setzt voraus, dass die Grundtechniken wie Löten, das -Abisolieren von Kabeln und das Crimpen von JST-Verbindern bereits bekannt -sind. Für letztere empfehlen wir das -JST-Crimp-Tutorial, auch für -die anderen Techniken findest du Anleitungen und Tipps im Internet.

      • Gehe bewusst und gewissenhaft mit deinen Werkzeugen um. An scharfen -Werkzeugen wie einem Cuttermesser oder einem Seitenschneider kannst du dich -schneiden. Das vordere Ende des Lötkolbens kann bis zu 450°C heiß werden. -Berühre daher immer nur das dafür vorgesehen Griffstück. Sollte er dir -wegrutschen oder herunterfallen weiche daher lieber aus, anstatt ihn -aufzufangen.

      • Die Dämpfe, die beim Löten durch das Verbrennen des Flussmittels (Flux) -entstehen, können gesundheitsschädlich sein. Atme sie daher nicht direkt ein. -Du hast bei dir daheim oder in deinem Makerspace eine Lötdampfabsaugung? Dann -nutze sie! Gerade bleifreies Lötzinn enthält mehr Flussmittel und ist daher -während des Lötens auch deutlich gesundheitsschädlicher. Solltest du keine -Absaugung haben ist daher bleihaltiges Zinn empfehlenswerter. Dieses solltest -du allerdings wiederum nicht in den Mund nehmen und dir nach dem Löten die -Hände waschen.

      • Bei einem der Bauteile handelt es sich um eine LiPo[^1]-Batterie. Diese -Batterien sind zwar heute weit verbreitet, können allerdings bei falscher -Handhabung in Brand geraten. Solltest du nicht vertraut mit LiPos oder dir -noch unsicher sein, lies bitte den Abschnitt in der Anleitung zur Vorbereitung und zum Umgang mit den Akkus -sehr aufmerksam. Außerdem empfehlen wir, die Zelle aus einer -vertrauenswürdigen Quelle zu beschaffen und nicht die billigste Zelle aus -China zu bestellen.

      • Es handelt sich beim OpenBikeSensor um ein frei verfügbares Design, und nicht -um ein fertiges Gerät. Alles, was wir dir mit den Bauteillisten, -Schaltungsentwürfen und Anleitungen zeigen, sind Vorschläge und kann Fehler -enthalten. Bist du dir an einer Stelle nicht sicher oder du glaubst einen -Fehler gefunden zu haben, dann melde dich in der Community. Außerdem sind wir nicht für Fehler verantwortlich -die du während des Aufbaus machst. Sollte etwas schief gehen und du brauchst -Hilfe kannst du dich natürlich trotzdem an uns wenden.

      Buchsenleisten

      Stecke die Buchsenleisten auf den ESP32, um den Abstand später genau passend zu -haben. Positioniere den ESP32 mit den Buchsenleisten auf der Hauptplatine. -Achte auf eine gute Ausrichtung. Es hilft, wenn dir jemand den ESP32 festhält, -damit er nicht verrutscht.

      Löte einen der Pins in einer Ecke fest. Prüfe die Ausrichtung noch einmal, -jetzt kannst du noch nacharbeiten. Löte dann den diagonal gegenüberliegenden -Pin an, und prüfe erneut die Ausrichtung.

      Löte nun alle Pins an den Außenseiten der Buchsenleisten, dann ziehe den ESP32 -vorsichtig ab – er wird erst gegen Ende wieder gebraucht.

      Falls du wechselseitige Buchsenleisten verwendest, löte nun auch innen alle -Pins an.

      Bauteile bereitlegenBuchsenleistung an ESP gesteckt und auf dem Board positioniert. -Erste Ecke löten und Positionierung kontrollieren. -In finaler Positionierung die verbleibenden äußeren Pins löten.Ausrichten und auf der gegenüberliegenden Seite ebenfalls fixieren -Innere Pins festlöten

      Spannungsregler (rot)

      Dieses Modul wird auf der Rückseite der Hauptplatine in SMD-Bauweise verlötet, -also ohne durchgesteckte Stifte oder Beine. Die halbrunden Pads an den -Außenseiten des Moduls werden direkt auf die Pads der Hauptplatine gelötet.

      Löte zunächst ein Pad an. Prüfe, dass das Lötzinn beide Pads gut benetzt. Achte -auf gute Ausrichtung, erst dann löte die anderen Pads ebenso.

      Die zwei direkt benachbarten Pads dürfen verbunden bleiben, sollte dir das -passieren.

      Eines der Pads mit Lötzinn benetzen. -Lötzinn erhitzen, und das Modul positionieren.Wenn fertig positioniert restliche Pins verlööten.Verlötet

      USB-C-Lademodul (blau)

      Das Lademodul ist ein blaues Modul mit einer USB-C Buchse darauf.

      Trenne von einer geraden Stiftleiste zwei einzelne Stifte und zwei Stiftpaare ab.

      Platziere das Modul auf der Unterseite der Hauptplatine. Stecke die Stifte in -die entsprechenden Löcher, sodass das schwarze Plastikteil sichtbar ist. Prüfe, -dass das Modul flach und ohne Lücke auf der Hauptplatine aufliegt, sonst -passt am Ende das Ladekabel nicht.

      Drehe nun die Hauptplatine samt Modul und Stiften um. Achte darauf, dass -keine Stifte herausfallen. Löte die Stifte auf der Oberseite der Hauptplatine fest.

      Drehe nun alles wieder um, und entferne die schwarzen Plastikteile von den -Stiften, indem du sie mit einer Pinzette oder Zange nach oben ziehst. Löte alle -Stifte an das Lademodul, dann kürze alle überstehenden Stifte mit dem -Seitenschneider.

      Mit stiftleisten fixierenMit Verpackungsmaterial (z.B. aus der ESP32 Verpackung) fixieren und Platine umdrehenPins auf der Platinenoberseite verlötenPlastikteile von den Pins abziehen -Pins mit dem blauen Modul verlöten

      Kleine elektronische Bauteile

      Widerstände

      Ordne zunächst alle Widerstände richtig zu, indem du die Farbcodes abliest oder -mit einem Multimeter misst:

      BauteilWertFarbcode 4 RingeFarbcode 5 RingeSMD Code
      R1, R21,2 kΩ
      braun, rot, rot, gold
      braun, rot, schwarz, braun, braun
      122 / 1201
      R310 kΩ
      braun, schwarz, orange, gold
      braun, schwarz, schwarz, rot, braun
      103 / 1002
      R4150 kΩ
      braun, grün, gelb, gold
      braun, grün, schwarz, orange, braun
      154 / 1503
      R5300 kΩ
      orange, schwarz, gelb, gold
      orange, schwarz, schwarz, orange, braun
      304 / 3003

      Nachdem du alle Widerstande zugeordnet hast, platziere sie an den dafür -vorgesehenen Stellen auf der Vorderseite der Hautplatine. Stecke die Beinchen -jeweils durch die beiden Löcher und biege sie etwa 30° nach außen, sodass die -Widerstände nicht mehr herausfallen. Drehe die Platine um und löte alle Beine -auf der Rückseite fest. Danach schneide den überstehenden Draht ab.

      Du kannst auch SMD-Widerstände verwenden, falls du solche hast. In diesem Fall -gehen wir davon aus, dass du auch weißt, wie du sie anbringst.

      Die Widerstände platzieren.Auf der Rückseite durch Verbiegen fixieren.Verlöten.

      Kondensatoren

      Identifiziere zunächst alle Kondensatoren und ordne sie korrekt zu. C1 ist -ein 100 nF großer Keramikkondensator, der ist in der Regel blau oder -hellbraun und hat manchmal die Aufschrift 104 (verwechsle ihn nicht mit der -Sicherung, die normalerweise gelb ist). C2 und C3 sind -Elektrolytkondensator mit 22 µF Kapazität, diese sind normalerweise -schwarz mit heller Aufschrift, zylinderförmig und haben zwei unterschiedlich -lange Beine auf der gleichen Seite.

      Bei C2 und C3 musst du auf die Polung auf Platine und Kondensator achten! -Ein Plus-Symbol auf der Platine zeigt die Seite, auf die das längere Bein -gehört. Die andere Seite ist auf der Platine ausgefüllt, am Kondensator ist -dort ein heller Streifen auf den Hauptkörper aufgedruckt, und das Bein ist -etwas kürzer.

      Stecke alle Kondensatoren, genau wie zuvor die Widerstände, von der Vorderseite -ein und biege die Beine etwas um. Dann drehe die Platine erneut um und löte die -Beine auf der Rückseite fest, und schneide dann den überstehenden Draht ab.

      Die KondensatorenC1 und C2 platzieren.Prüfen: Passt C2 unter den ESP? Falls nicht: Hinreichend viel Beinchen nach oben überstehen lassen, um C2 liegend zu montieren.C3 Montieren. Wie bei C2 prüfen, ob er unter den ESP passt.

      Sicherung

      Die Sicherung F1 ist in der Regel gelb, flach und hat 2 Beine. Der Körper -ist rund oder rechteckig. Die Sicherung sieht so ähnlich aus wie ein -Keramikkondensator, also verwechsle sie nicht mit C1.

      Die Polung der Sicherung ist egal. Die kleinen Biegungen in den Beinchen sorgen -für den richtigen Abstand zur Platine, da die Sicherung nicht direkt darauf -aufsitzen darf um korrekt zu funktionieren.

      Die Sicherung wie die bisherigen Bauteile eingebaut.

      Batteriestecker

      Der Batteriestecker wird üblicherweise als Kombination mit dem Kabel zusammen -geliefert. Du solltest sie zunächst zusammengesteckt lassen um die richtige -Polung herauszufinden.

      Hast du ein rote-schwarzes Batteriekabel solltest du für rot an Plus und -schwarz an Minus verwenden. Ist dein Batteriekabel braun-schwarz, nimm -braun an Plus und schwarz an Minus. Bei anderen Farben musst du dich -selbst entscheiden.

      Kürze das Batteriekabel auf 12 cm.

      Finde heraus, wie herum dein Stecker auf die Platine (bei J1 bzw. “Battery”) -gelötet werden muss, damit die Farbzuordnung mit der Platinenbedruckung -übereinstimmt. Löse dann das Kabel vom Stecker.

      Zwei unterschiedliche Ausrichtungen des Batteriesteckers. Die korrekte -Ausrichtung ist vom gelieferten Stecker und Kabel abhängig.

      Stecke den Stecker auf die Platine, drehe sie um und löte auf der Rückseite -einen der Pins fest. Prüfe nun, ob der Stecker gut und gerade auf der Platine -sitzt, ansonsten kannst du nacharbeiten. Löte dann die andere Seite fest.

      Diode

      Die Diode ist das größte der einzelnen Elemente, mit rundem schwarzen Körper -und ziemlich dicken Beinen, die an beiden Seiten heraustreten. Ein Ende des -Diodenkörpers ist mit einem hellen Kreis markiert.

      Bei der Diode musst du dringend die Polung beachten. Die Diode “steht” auf -dem Kreis auf dem PCB, aber der weiße Ring auf der Diode dabei zeigt nach oben. -Auf der Platine ist die richtige Polung auch als Piktogramm abgebildet.

      Biege die Beine der Diode um und stecke sie an die richtige Stelle. Kürze die -Enden vor dem Löten bereits, um beim Löten weniger Metall aufheizen zu müssen.

      Eigentlich sollen Halbleiter nur kurz gelötet werden, aber dieses ist ein sehr -großes Bauteil, und auch erstaunlich robust. Arbeite zügig, aber erwarte dass -es eine Weile dauert, bis das Bauteil und die Pads auf Temperatur gebracht sind -und das Lötzinn schmilzt.

      Kürze die überstehenden Enden nach dem Löten noch einmal auf ihre endgültige -Länge.

      Die Diode in ihrer korrekten Position. Achte darauf, dass der weiße Ring -nach oben zeigt, und die Diode auf der Platine auf dem weißen Kreis steht.

      Verbinder für Taster und Display

      Die weißen Buchsen für die Steckverbinder zum Ein- und Ausschalter (J2) sowie -zum Display (J3) werden nebeneinander oben auf die Hauptplatine aufgelötet.

      Löte wie beim Batteriestecker immer erst ein Bein fest, und prüfe danach, dass -die Buchse fest und vollständig auf der Hauptplatine aufsitzt. Löte danach erst -die anderen Beine an.

      Die beiden Stecker werden wie auf der Platine aufgedruckt platziert und -sollten flach und fest auf der Platine aufsitzen.

      Sensorboards

      Vorbereitung

      Die erste Option ist die bevorzugte. Dafür wird die JST-Buchse auf dem -Sensorboard durch eine abgewinkelte JST-Buchse ersetzt. Ziehe hierfür das weiße -Kunststoffteil der Buchse von den Metallstiften. Versehe diese mit ein wenig -Lötzinn, sodass es wieder leichter fließt, und löte sie dann aus, indem du sie -einzeln mit einer Pinzette herausziehst. Reinige anschließend die inneren zwei -Löcher mit einer Entlötsaugpumpe oder etwas Entlötlitze, sodass sie nicht mehr -verstopft sind. Löte dann die gewinkelte Buchse so ein, dass sie von der -Winkelstiftleiste weg zeigt.

      Die zweite Option ist der Einsatz einer Winkelstiftleiste anstelle der -richtigen JST-Buchse. Löte wie oben beschrieben die vorhandene gerade -JST-Buchse aus der Modulplatine aus, und ersetze sie durch eine -Winkelstiftleiste mit 2 Stiften. Führe dabei das kurze Ende nur so weit ins -Sensorboard ein, dass die Spitze der Stifte gerade so auf der anderen Seite -herausschaut. Diese Option solltest du nur wählen, wenn du keine gewinkelten -JST-Buchsen zur Hand hast.

      Die letzte Option ist ein wenig riskant und nicht besonders stabil, hat -aber auch schon oft und erstaunlich gut funktioniert. Dafür ziehe den weißen -Kunststoff der bestehenden JST-Buchse ab, und biege die zurückbleibenden -Metallstifte vorsichtig um, sodass sie weg von der vierpoligen Stifteleiste -“nach oben” zeigen. Dabei sollte die Biegung in etwa 2mm Abstand von der -Modulplatine anfangen. Am besten geht das mit einer stabilen Pinzette und einer -Flachzange. Die Stifte können dabei brechen, dann musst du das kreativ -reparieren. Auf die gebogenen Stifte lässt sich ein JST-Stecker aufstecken, -aber nicht arretieren. Wir hatten jedoch bisher keine Probleme mit dieser -Variante im Betrieb.

      Einbau

      Stecke beide Sensorboards an die vorgesehenen Plätze, achte dabei auf die -Beschriftung (+3V3, TRIG, ECHO, GND). Die Boards stehen sich “gegenüber” und -dürfen einander nicht berühren, die JST-Buchsen sind außen. Wenn die -Platzierung der Boards klar ist, lege das innere Board wieder beiseite.

      Fixiere zunächst das äußere Board. Hierfür kannst du die Hauptplatine mit dem -gestecktem Board auf den Kopf drehen, es steht so ganz gut von selbst.

      Löte nur einen Pin an, danach prüfe wie üblich die Ausrichtung. In der Regel -ist das Board beim ersten Versuch noch nicht senkrecht, und liegt auch nicht -auf voller Länge auf dem PCB auf, sondern hat “Luft” darunter. Dies kannst du -gut korrigieren, indem du die Hauptplatine mit Board in eine Hand nimmst, -sodass du mit dem Finger oder Daumen die Ausrichtung des Boards korrigieren -kannst. Mit der anderen Hand kannst du jetzt noch den Lötkolben führen. Da der -eine Pin bereits verlötet ist, benötigst du kein dritte Hand für das Lötzinn. -Passe so die Ausrichtung so lange an, bis sie aus allen Richtungen gut -aussieht.

      Erst dann werden die drei verbleibenden Pins verlötet. Platziere das zweite -Sensorboard auf dieselbe Weise, und kürze am Ende alle Stifte.

      Sensorboardplatzierung von oben.C1 und C2 platzieren.

      SD-Karten-Modul und GPS-Modul

      Trenne von einer Winkelstiftleiste eine Gruppe von 6 Stiften ab. Stecke sie -genau wie in der Abbildung gezeigt in das SD-Karten-Modul ein. Die korrekte -Ausrichtung ist wichtig, es gibt viele Möglichkeiten die Stiftleiste zu stecken -und die meisten davon passen am Ende nicht.

      • Die Stiftleiste wird von der Oberseite der Modulplatine aufgesteckt.
      • Die Stifte haben direkt oberhalb der Platine ihre Biegung.
      • Dann erst kommt die schwarze Kunststoffleiste.
      • Die lange, gerade Seite der Pins zeigt vom Modul weg.

      Verlöte die Winkelstiftleiste mit dem SD-Modul und kürze die überstehenden Pins -auf der Rückseite.

      Auch auf das GPS-Modul muss eine Winkelstiftleiste gelötet werden.

      • Die Stiftleiste wird mit der langen Seite in das GPS board gesteckt.
      • Die Stiftleiste steckt auf der Bestückungsseite des GPS Boards.
      • Die kurze Seite der Stiftleiste zeigt im rechten Winkel nach unten.

      Stecke die Module auf das PCB und achte dabei erneut auf die Ausrichtung. Die -Oberseiten beider Modulplatinen müssen zur Mitte der -OpenBikeSensor-Hauptplatine zeigen. Beachte auch das Foto unten.

      Verlöte wie gewohnt erst einen der Pins auf der Rückseite. Prüfe, dass das -Modul wirklich senkrecht auf der Hauptplatine steht und auch auf ganzer -Länge mit der Unterkante auf der Platine aufliegt, korrigiere dies bei Bedarf. -Erst dann löte die restlichen Pins und kürze sie.

      Die 6-polige Winkelstiftleiste muss von oben ins SD-Modul eingesetzt -werden, sodass die langen Enden der Stifte vom Modul weg zeigen und die -schwarzen Plastikteile einige Millimeter über die Platine hinausragen.

      Hier werden die zwei Module auf der Hauptplatine platziert. Die Oberseite -des Moduls zeigt in Richtung der Buchsenleiste für den ESP32.


      Ein/Aus-Schalter

      Schneide dir zwei kurze Stück Kabel von etwa 10cm Länge zurecht. Die eine Seite -wird jeweils mit einem Crimp versehen. Falls dein Batteriekabel über 20cm lang -ist, kannst du das Batteriekabel schon mal auf 12cm kürzen und die entstehenden -Abschnitte für dein Schalterkabel verwenden.

      Isoliere die andere Seite beider Kabel ca. 5mm weit ab und verdrille die Enden. -Nimm etwas Lötzinn und lasse es auf die freiliegenden Litzen fließen (dies wird -“verzinnen” genannt). Dadurch lässt sich die Litze wie ein solider Draht biegen.

      Biege die Enden in eine U-Form um. So lassen sie sich leicht in die Ösen des -Schalters einführen und halten sich selbst dort fest, bis du sie festgelötet -hast. Achte darauf nur kurz zu löten, sonst schmilzt der Kunststoff im Stecker.

      Verdrille nun die zwei Kabel zu einem, und führe dann die zwei Crimps in -das Steckergehäuse ein. Die Verdrillung wird sich ein wenig wieder lockern, -aber es sollte nun wie ein Kabel wirken, und keine große Schlaufe mehr bilden.

      Schalter mit Kabel und Stecker, noch unverdrillt..

      Ultraschallsensor-Kabel kürzen und crimpen

      Kürze langen schwarzen Kabel der Sensoren auf etwa 10cm, da die langen Kabel -nicht in das Gehäuse passen und auch die Plastikeinfassung der bestehenden -Stecker zu starr und zu dick für das Gehäuse ist.

      Entferne etwa 2cm der schwarzen Außenisolierung des Kabels. Schiebe die -Schirmung zur Seite und verdrille die einzelnen Leiter miteinander. Dies ist -einer der zwei Leiter, die gecript werden müssen. Isoliere vom inneren Leiter -nur etwa 1mm ab.

      Dann werden beide Leiter gecrimpt. Der Crimpkontakt muss für optimale -Verbindung den inneren Leiter und seine Isolierung greifen. Kürze die -Schirmung, sodass alle Adern gleich lang sind, dann crimpe sie alle gemeinsam. -Hier gibt es keine Isolierung, aber die Schirmung insgesamt ist stark genug um -auch mechanisch zu halten.

      Entferne, falls vorhanden, einzelne abstehende Leiter der Schirmung die nicht -im Crimp gesichert sind, sodass diese keinen Kurzschluss verursachen können.

      Führe die Crimpkontakte in das Steckergehäuse ein. Achte dabei auf die korrekte -Polung. Falls die Sensorboards modifiziert und mit gewinkelten -JST-Platinensteckern ausgestattet wurden (siehe Sensorboards » -Vorbereitung), wurde die Polung der Buchsen vertauscht und du musst deinen -Stecker ebenfalls anders herum polen.

      Sensor mit gekürztem Kabel und SteckerDetailaufnahme Stecker und Schirmung (ohne Winkelstecker-Modifikation)

      Batteriekabel anlöten

      Kürze das Batteriekabel auf ca. 12cm und isoliere etwa 5mm der Enden ab.

      Identifiziere die Polung der Batterie, der Pluspol ist auf der Seite mit -Einkerbung im Akku-Gehäuse, und in der Regel auch mit einem Plus auf dem -Aufdruck markiert. Im Zweifel miss mit dem Multimeter nach.

      Es empfiehlt sich, den Akku bereits in den Gehäusedeckel einzulegen, sodass er -bei der Arbeit nicht wegrollt. Statte beide Lötfahnen an ihrem Ende zunächst -mit einem großzügigen Lötpunkt aus. Lasse die Stellen wieder abkühlen, dann -nimm das Kabelende in die eine Hand und den Lötkolben in die andere, erhitze -den Lötpunkt von Neuem und führe das Kabelende seitlich in diesen ein, wenn das -Lötzinn flüssig geworden ist. Die Kabel sollen von der Lötfahne in die Mitte -der Batterie führen. Löte nicht zu lange an der gleichen Stelle, wenn etwas -nicht klappt, lasse das ganze lieber eine Minute lang abkühlen, bevor du es -erneut versuchst.

      Die Batteriekontakte werden nun mit Isolierband (wenn möglich Kapton-Tape) -gründlich isoliert und umwickelt, sodass die Pole und Lötfahnen komplett -bedeckt und die Kabel auch mechanisch fixiert sind.

      Befestige dann die Batterie mit einem kleinen Kabelbinder im Deckel des -Gehäuses. Stecke sie noch nicht ein.

      Akku mit Kabel und Stecker (Polung beachten!)Kontakte isolieren

      Gehäuse vorbereiten

      Gewindeeinsätze

      Im Haupt- sowie im Displaygehäuse gibt es einige Löcher, in die Gewindeeinsätze -(“heat-set inserts”) hinein gehören. Dort greifen später die Schrauben, die das -ganze Gerät zusammenhalten. Die Gewinde müssen an folgende Stellen:

      • 3 Stück in Hauptgehäuse für das PCB (mit Montagelöchern der Platine vergleichen)
      • 5 Stück in Hauptgehäuse für Hauptdeckel
      • 1 Stück in Hauptgehäuse beim GPS-Deckel
      • 3 Stück in Displaygehäuse

      Stelle deinen Lötkolben auf ca. 180-220°C ein und reinige die Spitze gründlich, -sodass kein Lot mehr daran hängt. Alternativ kannst du eine eigene Spitze für -diese Aufgabe verwenden, und danach wieder wechseln.

      Finde eines der vorgesehenen Löcher, nimm ein Gewinde und drücke es so weit es -geht von Hand in das Loch hinein. Halte das Gewinde bei Bedarf mit einer -Pinzette fest, während du den Lötkolben auflegst und leichten Druck ausübst. -Versuche, das Gewinde so senkrecht wie möglich und behutsam versinken lassen.

      Das Gewinde sollte lieber etwas zu tief sitzen, als über den Rand überzustehen, -um die Gehäuseteile bündig miteinander verbinden zu können. Die Gewinde, mit -denen das PCB befestigt wird, sollten allerdings auch nicht zu tief versinken, -sonst bildet sich eine Ausbuchtung auf der Außenseite.

      Vorsicht: Die Gewindeeinsätze sind noch lange nach dem Einsetzen heiß und -kühlen erst langsam ab. Lege das Gehäuseteil am besten einige Minuten zur -Seite, wenn du alle Gewinde darin platziert hast.

      Magnete

      Setze die kleinen Würfelmagnete in USB-Abdeckung ein. Wenn deine Abdeckung mit anderen -OpenBikeSensoren kompatibel sein soll, solltest du jetzt die Polung von einer Vorlage übernehmen.

      Setze zunächst die zwei Magnete in Abdeckung selbst ein. Die Magnete haben nur -in einer Achse Anziehungskraft, sie dürfen also nicht seitlich eingesetzt -werden. Es empfiehlt sich, die vier Magnete “als Stange” zu halten, um ein -Verdrehen zu vermeiden. Alternativ kannst du mit einem permanenten Marker die -richtige Seite markieren.

      Um die zwei Gegenstücke einzubauen, setze je einen Magneten auf einen der -Magnete in der Abdeckung. Stecke dann die Abdeckung ins Hauptgehäuse, und -drücke damit den einzelnen Magneten in sein vorgesehenes Loch. So stellst du -sicher, dass die Magneten einander anziehen.

      Sollten die Magnete nicht von selbst in ihrem Loch stecken bleiben, kannst du -sie auch mit etwas Sekunden- oder Alleskleber fixieren.

      Einpressgewinde in Displaygehäuse einschmelzen

      Hauptgehäuse mit Einpressgewinde (ältere Version mit zwei Mutternn für GPS)

      USB-Abdeckung mit Magneten

      Displayeinheit

      In diesem Abschnitt baust du das Display mit Knopf und Kabel in sein Gehäuse -ein.

      Verwende folgende Tabelle als Vorschlag für die Zuordnung der Leiter im -Displaykabel zu ihren Anschlüssen, oder tausche die Farben durch deine eigene -Zuordnung aus, falls dein Kabel andere Leitungsfarben verwendet.

      FarbeOBS-SeiteDisplayseiteButton
      blauSDASDA
      schwarzGNDGND
      grauBUT-Pin 1
      weißSCLSCK-
      braun+3V3-Pin 2
      kurzes Kabel (siehe unten)-VDDPin 2

      Kabel vorbereiten

      Entferne auf beiden Seiten des langen Displaykabel die Isolierung, auf der -einen Seite ca. 5-7cm lang (dies ist die Seite für das Hauptgerät) und auf der -anderen nur ca. 3cm. Die lange Seite wird vollständig gecrimpt, auf der -kurzen Seite crimpe nur drei Leiter, nämlich die für GND, SDA, SCL -(oder laut Farbtabelle den schwarzen, blauen und weißen Leiter). Die zwei -restlichen Leiter, +3V3 (braun) und BUT (grau) werden angelötet und dafür -ca. 5mm lang abisoliert.

      Bereite ein kleines Kabelstück von ca. 3cm Länge vor, und crimpe auch hier eine -Seite und isoliere die andere ab.

      Verzinne alle Kabelenden die zum Löten vorgesehen sind (drei Stück).

      Knopf

      Schraube den Knopf in das Gehäuseoberteil des Displays hinein. Wenn die Mutter -nicht das Gewinde greifen kann (den Knopf gibt es in verschiedenen Längen) -kannst du auch etwas Heißkleber verwenden.

      Löte die drei Leiter an die zwei Seiten des Buttons an. Dabei kommen das kleine -Kabel mit +3V3 (braun) zusammen auf eine Seite und BUT (grau) allein auf -die andere. Auch hier empfiehlt sich, wie beim Schalter, wenn du zuerst die -abisolierten und verzinnten Enden zu einer U-Form biegst und in die Ösen -einhängst, um dann nur kurz löten zu müssen, damit der Kunststoffkörper des -Knopfes nicht schmilzt. Wenn du mehrfach löten musst, lass den Taster zwischendurch -abkühlen.

      Stecker

      Ziehe am Displaymodul die schwarzen Plastikteile von der Stiftleiste ab und -kürze die vier Stifte um jeweils ca. 2mm.

      Entferne vom 4-poligen JST-Steckergehäuse die Arretierung (auf der einen Seite -leicht hervorstehende Plastikflügel), zum Beispiel mit einem Cuttermesser oder -Seitenschneider. Nur so passt der Stecker am Ende in das kleine Displaygehäuse.

      Stecke die 4 gecrimpten Kabelenden (drei vom langen Displaykabel und eines vom -kurzen Kabelstück) in das Steckergehäuse. Die Zuordnung kannst du anhand der -Tabelle und der Beschriftung auf der Displayplatine machen, oder du kompierst -die abgebildete Reihenfolge.

      Führe die 5 gecrimpten Kabelenden am langen abisolierten Ende des Kabels in das -5-polige JST-Steckergehäuse ein. Die Zuordnung kannst du wieder anhand der -Tabelle und der Beschriftung auf der Hautplatine machen, oder erneut die -abgebildete Reihenfolge kopieren.

      Zusammenbau

      Entferne die Schutzfolie vom Display. Sollte dein Display nicht ins Gehäuse -passen, kannst du mit einem Seitenschneider die Ecken der Platine etwas -bearbeiten, bis es passt.

      Stecke den 4-poligen Stecker auf die gekürzten Pins am Display und setze -dieses in das Gehäuseoberteil ein. Kürze bei Bedarf die Pins weiter, bis der -Stecker ganz auf der Displayplatine aufliegt, damit er ins Displaygehäuse -passt.

      Setze zwei rechteckige Magnete in die Seitentasche ein. Wenn dein Display -mit anderen OpenBikeSensoren kompatibel sein soll, solltest du jetzt die -Polarität von einer Vorlage übernehmen. Manchmal sind die Magnete etwas lose -und klappern, fixiere sie dann mit Kleber oder umwickele sie mit Klebeband.

      Setze die Gehäuseteile zusammen und drehe die drei Schrauben hinein, die sie -zusammenhalten.

      Stecke die beiden Hälften der Zugentlastung in die Öffnung der Unterseite -aus der das Kabel herauskommt. Setze erst die eine Seite ein, und dann die -zweite etwas angewinkelt, bevor du sie beide zusammendrückst, sodass sie das -Kabel am nicht abisolierten Teil greifen. Falls der zweite Teil sich nicht -hineinhebeln lässt kannst du die angewinkelten unteren Ecken etwas mit einem -Seitenschneider weiter abrunden, sodass die Halterung leichter hinein geht.

      Schraube mit je zwei Schrauben und Sechskantmuttern die zwei Hälften -zusammen. Achte darauf, dass die sechseckige Fixierung auf jeweils einer Seite -der Zugentlastung für die Mutter vorgesehen ist.

      Das untere Teil des Displaygehäuses mit ZugentlastungKabel durch Unterteil geführtButton in Displayoberteil eingeschraubtOBS-Seite: Alle 5 Adern crimpenOBS-Seite in Stecker einführenZwei Kabel an Button löten (Pin 2)Display-Seite: Button und Stecker fertigVerschiedene Displays vom gleichen Lieferanten -Wenn nötig, Display mit Seitenschneider stutzen -Display in Gehäuse einpassen, ohne GewaltMagnete passend einlegenDas Display mit verschraubtem GehäuseZugsicherung fixieren

      Firmware installieren

      Zunächst muss die OpenBikeSensor-Firmware auf den ESP32 installiert werden. -Dieser Vorgang heißt auf Englisch “to flash” oder eingedeutscht “flashen”.

      Schließe dafür den ESP32 mit einem Mikro-USB Kabel direkt an einen Computer an. -Benutze dann eine dieser Methoden, um die Firmware darauf zu installieren:

      Elektronik testen

      Vor dem Einbau ins Gehäuse sollte die Elektronik getestet werden. Führe -zunächst einen Sichttest der gelöteten Stellen durch, bevor du das erste Mal die -Batterie und/oder ein Ladekabel anschließt.

      • Sind alle Lötpunkte gut verbunden?
      • Siehst du eine kalte Lötstelle irgendwo?
      • Findest du auf der Platine heruntergetropftes Lötzinn oder einen Drahtrest, -der einen Kurzschluss verursachen könnte?
      • Sind irgendwo versehentlich benachbarte Pins miteinander verbunden worden -(häufig bei den Kondensatoren der Fall)?
      • Sind alle Module senkrecht und stabil eingebaut?

      Löte bei Bedarf die fehlerhaften Stellen nach.

      Für den Test der Elektronik solltest du einen vollständig geladenen Akku -verwenden. In Workshops ist meist einer vorbereitet, hast du nur den neuen und -ungeladenen Akku, so kannst du ihn mit deinem OpenBikeSensor jetzt aufladen:

      1. Ziehe alle Stecker aus der Platine und entferne den ESP32.
      2. Stecke den Hauptschalter ein.
      3. Stecke das Batteriekabel polungsrichtig ein
      4. Schließe ein normales USB-C Ladegerät (5 V) an das Lademodul an.
        • Einige Geräte funktionieren nur nach Anschluss an ein Ladegerät.
        • Ein Handyladeadapter funktioniert eigentlich immer, neuere oder -leistungsfähigere USB-C Netzteile manchmal nicht.
      5. Während des Ladevorgangs leuchtet die LED am Lademodul rot, wenn der Akku -voll ist blau.

      Wenn du einen vollen Akku hast, beginne mit dem Test der Elektronik:

      1. Ziehe den Akku zunächst wieder ab. Verbinde nur das Display und den -Hauptschalter und stecke den ESP32 auf seine Buchsenleisten. Achte dabei -darauf, dass der USB-Port des ESP32 in die auf der Platine markierte -Richtung zeigt.
      2. Achte darauf, dass der Schalter ausgeschaltet ist.
      3. Stecke die Batterie jetzt polungsrichtig ein.
      4. Schalte den Hauptschalter ein.
        • Nach etwa einer Sekunde sollte der Startbildschirm auf dem Display -erscheinen.
        • Wenn das nicht passiert, schalte das Gerät wieder aus. Sofern nichts -stinkt oder gar raucht, kannst du alle Verbindungen prüfen und es noch -einmal versuchen.
        • Wenn dein Display funktioniert und ein OpenBikeSensor-Logo sowie etwas -Text anzeigt, schalte das Gerät aus und fahre mit dem nächsten Testschritt -fort.
      5. Stecke die SD-Karte in die Halterung. Starte das Gerät und warte, bis auf -dem Display “SD OK” erscheint.
        • Kommt kein “SD OK” sondern ein “SD Error” und/oder ein Zähler, der 10 -Sekunden lang zählt, so wurde deine SD-Karte nicht erkannt. Prüfe in -diesem Fall die Verbindungen zwischen dem ESP32 und dem SD-Modul auf -Leitfähigkeit, nimm dafür den -Schaltplan -zu Hilfe.
        • Wenn deine SD-Karte funktioniert, schalte das Gerät aus und fahre mit dem -nächsten Testschritt fort.
      6. Stecke die GPS-Antenne an das GPS-Modul an. Sei vorsichtig mit dem kleinen -Stecker und der Buchse, sie können leicht verbiegen. Starte das Gerät und -lasse es eine Weile unter freiem Himmel liegen. Es kann bis zu 20 Minuten -dauern, bis ein GPS-Signal gefunden wurde. Keine Sorge, das ist nicht jedes -Mal so. Wenn das GPS-Signal gefunden wird, schaltet das Gerät vom -Startbildschirm in den Messmodus und zeigt die Abstände links und rechts an -(ohne Sensoren natürlich nicht). In diesem Fall fahre mit dem nächsten -Testschritt fort.
      7. Stecke die Ultraschallsensoren an ihre Module an. Starte das Gerät, -überspringe bei Bedarf mit dem Knopf das Suchen des GPS-Signals, und prüfe, -dass die Sensoren plausible Abstände messen.

      Wenn alle Komponenten korrekt funktionieren, kannst du das Gerät ausschalten, -alle Verbindungen wieder trennen, und mit dem Einbau ins Gehäuse beginnen. Hast -du einen Fehler gefunden, der sich nicht durch nachlöten reparieren lässt, -hilft dir vielleicht eine der Anleitung auf der Fehlersuche-Seite weiter.

      Zusammenbau

      • Kabel und Halterung

        • Die vier Sechskantmuttern in die Wand des Gehäuses einsetzen (bei Gehäuse -mit zwei Halterungen sind es acht Sechskantmuttern).
        • Sind die Sechskantlöcher eng, die Muttern mit der längeren M3 Schraube -von der Außenseite in die Öffnung ziehen.
        • Ist ein Sechskantloch auch dafür zu eng, vorsichtig mit dem Lötkolben -nachdrücken, und die Mutter von der Außenseite mit der längeren Schraube führen. -Vermeide dabei, mit dem Lötkolben das Plastik zu berühren.
        • Falls du ein Gehäuse mit mehreren Montageöffnungen baust, entscheide dich, an -welcher Öffnung du die Halteklammer installieren willst. Diese Öffnung -führt auch später das Kabel. Die andere Öffnung wird mit dem Deckel -(AttachmentCover) verschlossen.
      • PCB im Hauptgehäuse platzieren

        • Zunächst die SD-Karte einlegen, den ESP abziehen.
        • Gesamtes Board in leichtem Winkel herabsenken, auf Ausrichtung der USB-C -Ladebuchse achten. Bei Wiederzusammenbau am Displaykabel vorbei navigieren.
        • Bei Bedarf Unreinheiten des Gehäuses (vom 3D-Druck) entfernen, wenn das PCB -daran hängen bleibt.
        • Mit 3 Stück M3x6 oder M3x8 im Gehäuse verschrauben.
        • Nun kann der ESP wieder aufgesteckt werden. Dabei die Richtung der -USB-Markierung mit Mikro-USB-Buchse dem ESP32 abgleichen, -und sicherstellen, dass die Pins nicht um ein oder zwei Löcher verrutscht -eingesteckt werden.
        • Muss der ESP wieder abgezogen werden, um die Platinenschraube darunter wieder -zu lösen, kann man einen Inbus als “Enterhaken” verwenden, um den ESP zu lockern
      • Displaykabel in Gehäuse einstecken

        • Führe das Displaykabel mit dem Stecker voran von außen in das Hauptgehäuse hinein -(Falls in Schritt 16 nicht geschehen). -Entscheide dich, ob du -eine Top-Rider oder Back-Rider Variante -bauen möchtest, und führe das freie Ende des Kabels durch die entsprechende -Öffnung im Hauptgehäuse. Möchtest du beide Halterungen montieren und dir damit -beide Varianten ermöglichen, kannst du dir die Öffnung frei aussuchen.
        • Die Halterung mit Zugentlastung anbringen und damit das Kabel fixieren. -Noch nicht festziehen, nur sicherstellen, dass die Muttern nicht mehr -herausfallen.
        • Das Kabel sollte außen um die Elektronik herumgeführt werden, nicht -zwischen dem GPS- und SD-Karten-Modul hindurch. Im neuen Gehäuse sollte -dort genug Platz sein.
        • Jetzt zeigt sich auch, warum ca. 5cm Abisolierung hier sinnvoll ist, denn -ohne Isolierung ist das Kabel flexibler.
        • Stecker einsetzen (z.B. mit Pinzette)
        • Kabel so weit aus der Zugsicherung herausziehen, bis kein überschüssiges -Kabel im Innenraum des Gehäuses ist, aber das Kabel nicht straff liegt.
        • Schrauben der Zugsicherung bzw. Halterung nun fest anziehen.
      • GPS-Antenne einsetzen

        • Kabel der Antenne mit kleinem Stecker durch das kleine Loch fädeln.
        • GPS-Antenne mit Schirmung nach unten und Keramik nach oben in die -quadratische Aussparung einsetzen.
        • Den Antennenstecker auf das GPS-Board aufstecken. Der Stecker ist sehr -filigran und schwer zu stecken, es geht gut ihn mit den Fingern zu -platzieren und mit einer Pinzette den Stecker und die GPS-Modulplatine -zusammenzudrücken. Dabei auf richtigen Sitz achten um den Stecker nicht zu -beschädigen.
        • Den GPS-Deckel über die Antenne schieben und mit einer M3x6 oder M3x8 -Schraube fixieren.
        • Falls das Antennenkabel nicht reicht, kann die GPS-Antenne mithilfe eines -hinreichend langen Antennenkabels mit IPEX/U.FL Stecker verlängert werden. -Hierzu:
          • Den Metallschild des GPS-Moduls ablöten.
          • Das neue Kabel vorsichtig durch Rollen unter Cuttermesser auf etwa -5-7mm abisolieren.
          • Die Schirmung zurückschieben.
          • Noch vorsichtiger die innere Isolierung durch ganz sanftes Rollen -mit dem Cuttermesser abisolieren.
          • Das kurze Kabel ab- und das neue, längere anlöten.
          • Den Metallschild des Moduls wieder in ursprünglicher Ausrichtung -auflöten.
      • Schalter in Gehäuse einsetzen

        • Einschaltrichtung mit “I/O” Aufdruck des Gehäuses vergleichen.
        • Möglichst mit der mitgelieferten Unterlegscheibe und Mutter fixieren.
        • Schalterkabel verdrillen, falls nicht bereits geschehen..
        • Kabel entlang der Gehäusewand zur Buchse führen und dort einstecken.
      • Sensoren einbauen

        • Auf der Rückseite des Sensors gibt es einen Pfeil, der mit “UP” die -Richtung markiert, wo später oben sein soll.
        • Einen Sensor ins Hauptgehäuse einbauen, den anderen in den Deckel.
        • Sensoren einstecken. Den Sensor im Gehäuse an das ihm naheliegendste -Sensorboard anschließen, den Sensor vom Deckel in das entferntere (Anschluss über dem ESP32).
      • Akku einbauen

        • Akku im Deckel mit Kabelbinder fixieren (falls in Schritt 14 noch nicht erledigt)
        • Einstecken. Polung beachten!
        • Möglicherweise überstehendes Kabel möglichst auf der Seite des GPS -verstauen. Die Adern verdrillen und parallel legen.
      • Konfiguration des Sensors:

        • Die Anzeige kann im Konfigurationsmodus auf den Simple-Mode gestellt werden.
        • Außerdem kann die Breite des Lenkers und WLAN eingestellt werden.
        • Bei einem Reboot des Sensors wird nun auf der Sensor-Anzeige der Simple-Mode mit dem Abstand des linken Sensors angezeigt - abzüglich der Breite des Lenkers.
        • Alternativ im Profimodus weiterfahren.
      • Montage und Testfahrt mit dem Fahrrad.

      Akku und Ultraschallsensor an Deckel montieren ('Up'-Pfeil beachten)Ultraschallsensoren einsteckenLadebuchse (USB-C) ohne Gewalt in die Aussparung einfädelnPCB festschraubenHalterung und Zugentlastung festschraubenGPS-Deckel festschraubenDeckel festschraubenFertig!

      1 - Bauanleitung für den OpenBikeSensor v00.03.12

      Dies ist die Anleitung zum Aufbau des OpenBikeSensors v00.03.12 in der -Standardvariante. Andere Versionen können über das Dokumentationsmenü -aufgerufen werden.

      Die beschriebene Vorgehensweise ist nur eine Möglichkeit, zu einem -funktionierenden Modell zu kommen. Wenn du alternative Wege gehen möchtest, -kannst du das natürlich tun. Solltest du einen massentauglichen besseren oder -einfacheren Weg für einen der Schritte finden, freuen wir uns über -Änderungsvorschläge -oder eine kurze Nachricht.

      Ein fertig gebauter OpenBikeSensor der Version v00.03.12

      Voraussetzungen

      Diese Anleitung setzt voraus, dass die Grundtechniken wie Löten, das -Abisolieren von Kabeln und das Crimpen von JST-Verbindern bereits bekannt sind. -Für letzteres empfehlen wir das -JST-Crimp-Tutorial.

      Wenn du unsicher bist, wo -du ein Bauteil auf dem Board unterbringen sollst, kannst du die -interaktive Stückliste (BOM) verwenden, um dir -anzeigen zu lassen, wo ein Bauteil eingesetzt werden kann.

      Schritt 1: Buchsenleisten

      • Falls nur Buchsenleisten mit 16 Pins vorhanden sind, müssen diese auf 15 Pins gekürzt werden:
        • Mit dem Seitenschneider kürzen.
        • Mit dem Cuttermesser oder Schleifpapier nacharbeiten, um keine scharfe Kante zu hinterlassen.
      • Buchsenleisten auf ESP32 stecken, um den Abstand später genau passend zu haben.
        • Auf die Richtung der Pins (Kontaktbeine an der Buchsenleiste) achten!
        • Die Pads (Lötstellen auf der Platine) sind nicht symmetrisch, auf je einer -Seite ist nur jeder zweite Pin mit Pad versehen.
      • Buchsenleisten mit gestecktem ESP32 positionieren. Auf gute zentrierte Ausrichtung achten.
      • Einen Eck-Pin festlöten. Dabei den ESP32 gut festhalten, evtl. zu zweit arbeiten.
      • Ausrichtung prüfen, wenn der ESP32 verrutscht ist, nacharbeiten.
      • Diagonal gegenüberliegenden Pin anlöten. Ausrichtung erneut prüfen.
      • Alle äußeren Verbindungen verlöten.
      • Den ESP32 vorsichtig abziehen, sodass die Pins dabei nicht verbiegen.
      • Die inneren Kontakte anlöten.
      Bauteile bereitlegenBuchsenleite wenn nötig auf 15 Pins zuschneiden -Buchsenleisten auf ESP32 aufstecken -Gemeinsam auf dem PCB platzieren. Ausrichtung der abwechselnden Pins (innen) prüfen.Zunächst an einem Eckpunkt fixierenAusrichten und auf der gegenüberliegenden Seite ebenfalls fixieren -Alle äußeren Pins festlöten (beidseitig)Alle äußeren Pins festgelötet -Dann den ESP32 entfernen und die Innenseite verlöten

      Schritt 2: Spannungsregler (rot)

      • Wir verwenden Stiftleisten, um den Spannungsregler richtig zu positionieren. Verlötet -werden diese nicht, sondern später wieder herausgezogen und beim Lademodul -benutzt.
        • Bei Bedarf kann die beim SD-Karten-Modul mitgelieferte 6-polige Stiftleiste -verwendet werden, diese wird nicht für die SD-Karte gebraucht.
        • Stifte von der Leiste abtrennen: 1x1 und 1x2 Stifte.
        • Spannungsregler mit Stiften in zwei gegenüber liegenden Lötstellen platzieren.
        • Stifte nicht verlöten!
      • Das ausgerichtete Modul an den anderen beiden SMD-Pads verlöten.
        • Die Außenseite der Modulplatine hat ein halbrudes Loch mit Kontaktfläche.
        • Diese wird mit Lötzinn verbunden zum Pad auf der OBS-Hauptplatine darunter.
        • Auf guten Fluss des Lötzinns zum unteren Pad achten.
      • Die Ausrichtungsstifte abziehen und die restlichen Kontakte ebenfalls in -SMD-Bauweise verlöten.
      Stiftleisten ablängen -Bauteile bereitlegenBoard platzieren und mit Stiften ausrichten, anderes Pad wie SMD verlötenFreie Kontakte löten -Stifte entfernen und restliche Kontakte löten

      Schritt 3: USB-C-Lademodul (blau)

      • Für das blaue Lademodul 2x2 Stifte und 2x1 Stift vorbereiten (siehe oben).
      • Modul auf PCB auflegen
      • Die Stifte und Stiftpaare einstecken und evtl. fixieren.
      • Aufpassen, dass das Modul flach auf dem PCB aufliegt, sodass später die -Ausrichtung der USB-Ladebuchse korrekt ist.
      • Die Stifte von der anderen Seite verlöten.
      • Die schwarzen Plastikteile entfernen und die Oberseite ebenfalls verlöten.
      • Alle überstehenden Stifte mit dem Seitenschneider kürzen.
      Bauteile bereitlegenLademodul und Stifte platziertAuf Oberseite verlötenAlle Stifte auf Oberseite verlötet -Schwarze Plastikteile von Stiftleiste entfernenSchwarze Plastikteile von Stiftleiste entfernt -Oberseite verlötenStifte kürzen

      Schritt 4: Widerstände

      • Widerstände richtig zuordnen (Farbcodes z.B. via kiloohm.info decodieren oder mit einem Multimeter messen):
        • R1: 10 kΩ (braun - schwarz - orange - gold)
        • R2: 150 kΩ (braun - grün - gelb - gold)
        • R3: 300 kΩ (orange - schwarz - gelb - gold)
        • R6, R7: 1,1 kΩ (braun - braun - rot - gold) oder 1 kΩ (braun - schwarz - rot - gold)
        • Leider enthält die Platine einen Fehler, und R7 kann nicht wie vorgesehen platziert werden, sonst ist der Widerstand dem einen Sensorboard im Weg.
        • Statt auf der Oberseite verlöten wir den Widerstand auf der Unterseite.
        • Die Beinchen werden dabei nicht durch die Löcher gesteckt. Wir behandeln den Widerstand wie ein SMD-Bauteil.
        • Pads identifizieren. Eines der Pads auf der Platinenunterseite mit etwas -Lötzinn benetzen. Sehr wenig Zinn verwenden, sonst sickert es durch das -Loch durch und bildet auf der Rückseite eine Perle, die dann im Weg ist.
        • Zinn wieder verflüssigen, Widerstand mit einem Bein darin fixieren. Der -Widerstand liegt flach auf der Unterseite der Platine auf, mit nicht -gebogenen Beinen.
        • Anderes Bein mit Lötzinn auf anderes Pad löten.
        • Beine kürzen.
        • Falls doch Lötzinn zur Oberseite der Platine durchgesickert ist, mit -Entlötlitze reduzieren.
      • Falls ein SMD-Widerstand für R6 verwendet werden soll:
        • Einen Lötpunkt auf ein Pad setzen.
        • Widerstand flach auf das PCB legen, Lötpunkt erneut schmelzen und -das Bauteil mit der Pinzette darauf schieben.
        • Andere Seite normal festlöten.
        • R7 nicht so verbauen (s.o.)
      • Normale THT-Widerstände (R1, R2, R3, R6) stecken, verlöten, Beine kürzen.
      R7: Eines der Pads verzinnenR7: Den Widerstand wie ein SMD-Bauteil einseitig anlötenR7: Die zweite Seite verlötenR7: Fertig montiert -Ein Widerstand (R6) platziertAuf der Rückseite verlötenBeine kürzen. Widerstände R1-R3 ebenso montieren.

      Schritt 5: Kondensatoren

      • Kondensatoren identifizieren und richtig zuordnen
        • C1: 100 nF (in der Regel blau, manchmal Aufschrift 104)
        • C2, C3: 22 µF Elektrolytkondensator (i.d.R. schwarz mit heller Aufschrift, zylinderförmig, unterschiedlich lange Beine)
      • Bei C2 und C3: Polung auf Platine und Kondensator beachten!
        • Plus: Langer Pin
        • Minus: Kurzer Pin, mit Streifen markierte Seite, auf PCB ausgefüllte Hälfte
      • Kondensatoren C1 bis C3 stecken, zum Fixieren die Beine umbiegen
      • Auf Rückseite verlöten und überstehenden Draht abkneifen
      Die KondensatorenKondensatoren platzieren, auf Polung achten!Auf der Rückseite umbiegen und verlötenDrähte kürzen -Widerstände und Kondensatoren fertig platziert

      Schritt 6: Lötpunkt / Brücke

      • JP1 (mittig auf der Platine) mit einem Lötpunkt versehen und damit überbrücken
      • Erstes Bild im nächsten Schritt zeigt das Ergebnis

      Schritt 7: Stromversorgung

      • Sicherung (in der Regel dunkelgelb, flach mit 2 Beinen, rund oder rechteckig)
        • Position: F1
        • Die Polung ist egal
        • Die kleinen Biegungen in den Beinchen sorgen für den richtigen Abstand.
        • Einstecken, senkrecht verlöten, Beine abkneifen.
      • Batteriestecker
        • Stecker und Kabel zusammenstecken
        • Beschriftung auf der Platine beachten (Rot: „Plus“, Schwarz: „Minus“)
        • Auf der Rückseite einen Pin anlöten.
        • Das Kabel abziehen.
        • Auf guten Sitz des Steckers achten. Wenn der Stecker noch nicht flach und -senkrecht auf der Platine aufsitzt, die Lötstelle noch einmal heiß machen -und den Stecker an seinen Platz drücken.
        • Den zweiten Pin festlöten.
      • Diode
        • Polung beachten: Die Diode “steht” auf dem Kreis auf dem PCB, aber der -weiße Ring auf der Diode dabei zeigt nach oben.
        • Diode umbiegen und aufstecken
        • Enden vor dem Löten etwas kürzen, um beim Löten weniger Metall aufheizen zu -müssen
        • Verlöten: Eigentlich sollen Halbleiter nur kurz gelötet werden, aber dieses -ist ein sehr großes Bauteil, und auch erstaunlich robust. Arbeite zügig, -aber erwarte dass es eine Weile dauert, bis das Bauteil und die Pads auf -Temperatur gebracht sind und das Lötzinn schmilzt.
        • Die überstehenden Enden nachkürzen.
      Die fertig platzierten Bauteile (oben links)

      Schritt 8: Verbinder für Taster und Display

      • J5 (Displaykabel)
        • 5-Pin-Konnektor gemäß Markierung auf Platine aufsetzen
        • Die Aussparungen zeigen in Richtung der Mitte der Platine.
        • Einen Pin von unten verlöten.
        • Ausrichtung prüfen und evtl. korrigieren (Hinweise hierzu siehe -Batteriestecker).
        • Restliche Pins verlöten.
      • J6 (Schalter Ein/Aus)
        • 2-Pin-Connector so aufsetzen, dass er möglichst wenig über den Rand der -Platine übersteht und verlöten.
        • Polung egal.
        • Wie oben verlöten.
      5-poligen Stecker richtigherum aufsteckenAuf der Rückseite verlöten, auf guten Sitz achten2-poligen Stecker ebenso montieren

      Schritt 9: Sensorboards

      Vorbereitung

      • Option 1: (bevorzugt, benötigt gewinkelte 2-polige JST-Stecker)
        • Die JST-Stecker aus dem Sensorboard auslöten. Hierfür:
          • Das weiße Kunststoffteil abziehen.
          • Die zurückbleibenden Metallstifte mit etwas mehr Lötzinn versehen und -herausziehen.
          • Das innere Paar Löcher von Lötzinn befreien (Entlötsaugpumpe oder -Entlötlitze).
        • Gewinkelte JST-Stecker stattdessen einlöten.
        • Das Kabel, wenn eingesteckt, sollte weg von den 4 Pins des Boards zeigen -(nach oben, wenn montiert).
      • Option 2 (Winkelstiftleiste):
        • Die JST-Stecker aus dem Sensorboard auslöten (siehe oben).
        • Durch eine 2-polige Winkelstiftleiste ersetzen.
        • Dabei das kurze Ende nur so weit ins Sensorboard einführen, dass die Spitze -der Stifte gerade so auf der anderen Seite herausschaut und dann verlöten.
      • Option 3 (Kontakte biegen):
        • Den weißen Kunststoff vom JST-Stecker abziehen
        • Die zurückbleibenden Metallstifte vorsichtig umbiegen, sodass sie weg von -der vierpoligen Stifteleiste “nach oben” zeigen, dabei die Biegung in etwa -2 mm Abstand vom Board anfangen.
        • Die Stifte können dabei brechen, dann muss kreativ repariert werden. ;)
        • Hier lässt sich ein JST-Stecker einstecken, aber nicht arretieren. Wir -hatten jedoch bisher keine Probleme mit dieser Variante im Betrieb.
      Ein einzelnes Sensorboard -Das weiße Kunststoffteil entfernenKontakte des alten Steckers auslöten, neuen Stecker einlöten

      Einbau

      • Beide Sensorboards stecken, dabei Beschriftung (+3V3, TRIG, ECHO, GND) -beachten. Die Boards stehen sich “gegenüber” und dürfen einander nicht -berühren. Wenn die Platzierung der Boards klar ist, das inner Board wieder -beiseite legen.
      • Das erste Board fixieren. Hierfür kann das PCB mit gestecktem Board auf den -Kopf gedreht werden, es steht so ganz gut.
      • Nur einen Pin anlöten. Danach die Ausrichtung prüfen. In der Regel ist das -Board hier noch nicht senkrecht, und liegt auch nicht auf voller Länge auf -dem PCB auf, sondern hat “Luft” darunter.
      • Das PCB und Board in eine Hand nehmen, sodass mit dem Finger oder Daumen die -Ausrichtung des Boards korrigiert werden kann. Mit der anderen Hand kann der -Lötkolben geführt werden. Da der eine Pin bereits verlötet ist benötigen wir -keine weitere Hand für das Lötzinn. So kann die Ausrichtung leicht angepasst -werden, bis sie aus allen Richtungen gut aussieht.
      • Erst dann werden die drei verbleibenden Pins verlötet.
      • Das zweite Board genauso einlöten.
      • Überstehende Stifte kürzen.
      Sensorboards platzieren (schief aufgestellt für Übersicht, bitte gerade löten)Auf der Rückseite verlöten, Beine kürzen

      Schritt 10: SD-Karten-Modul

      • Gewinkelte Stiftleiste mit 6 Pins vorbereiten.
      • Gewinkelte Stiftleiste genau wie in der Abbildung gezeigt in SD-Karten-Modul -stecken. Die Ausrichtung ist wichtig, es gibt acht Möglichkeiten die Stiftleiste zu -stecken, sieben davon funktionieren nicht.
        • Die Stiftleiste wird von der Oberseite der Modulplatine aufgesteckt.
        • Die Stifte haben direkt oberhalb der Platine ihre Biegung.
        • Dann erst kommt die schwarze Kunststoffleiste.
        • Die lange, gerade Seite der Pins zeigt vom Modul weg.
      • Stiftleiste mit dem Modul verlöten und überstehende Pins abkneifen.
      • Modul auf das PCB stecken (Ausrichtung und Beschriftung beachten).
      • Verlöten und Stifte kürzen.
      SD-Karten Modul und Stiftleiste -Stiftleiste in Modul einstecken (Richtung beachten) -Stiftleiste in Modul verlöten (Richtung beachten)Modul platzierenAuf der Rückseite anlöten und kürzen

      Schritt 11: GPS-Modul

      • Gewinkelte Stiftleiste mit 4 Pins vorbereiten.
      • Stiftleiste in PCB einlöten:
        • Von der Unterseite stecken.
        • Langes Ende der Pins steht seitlich heraus.
      • Eng anliegend verlöten, Stifte kürzen.
      • GPS-Modul aufstecken, sodass es in der Aussparung des PCB liegt.
      • Einen Pin verlöten, Ausrichtung korrigieren wie bei Sensorboards
      • Restliche Pins Verlöten und Stifte kürzen.
      4-polige Winkelstiftleiste abkürzen und stecken (Richtung beachten)Auf der Oberseite verlötenGPS-Modul senkrecht aufstecken und verlöten

      Schritt 12: Ein/Aus-Schalter

      • Zwei Stück Kabel, ca. 10 cm lang, abtrennen.
      • Einseitig crimpen und in 2-fach JST Steckergehäuse einführen.
      • Andere Kabelenden an den Schalter löten.
        • Etwa 5 mm des Kabels abisolieren.
        • Drahtenden verdrillen und verzinnen.
        • Zu einem “U” oder “Z” biegen und in die Öse an den Schalterpins einführen.
        • Nur kurz löten, sonst schmilzt der Kunststoff im Stecker.
      Schalter mit Kabel und Stecker

      Schritt 13: Ultraschallsensor-Kabel kürzen und crimpen

      • Die langen schwarzen Kabel der Sensoren auf etwa 10 cm kürzen, da die langen -Kabel nicht in das Gehäuse passen und auch die Plastikeinfassung der -bestehenden Stecker zu starr und zu dick für das Gehäuse ist.
      • Empfehlung: Schrumpfschlauch (sofern vorhanden, optional) direkt nach dem -Kürzen auf das schwarze Sensorkabel aufziehen, noch bevor es abisoliert und -gecrimpt wird.
      • Abisolieren:
        • Etwa 2 cm des Kabels abisolieren.
        • Die Schirmung zur Seite schieben und alle Leiter miteinander verdrillen (dies ist einer der zwei Leiter, die gecript werden müssen).
        • Den inneren Leiter etwa 1 mm abisolieren.
      • Crimpen:
        • Beide Leiter werden gecript.
        • Der Crimpkontakt muss für optimale Verbindung den inneren Leiter und seine Isolierung greifen.
        • Die Schirmung auf dir gleiche Länge kürzen und gemeinsam crimpen. Eventuell -einzelne abstehende Leiter entfernen, sodass diese keinen Kurzschluss -verursachen.
      • Stecken:
      • Zum Schluss Schrumpfschlauch (falls vorhanden) erhitzen und befestigen, dabei -etwa 3-5 mm vom Stecker entfernt positionieren um ein Biegen in Steckernähe -beim Einstecken zu ermöglichen.
        • Hinweis: Dieser Schritt kann auch erst nach dem Testen der Eletronik -gemacht werden, wenn sichergestellt ist, dass der Sensor korrekt funktioniert.
      Sensor mit gekürztem Kabel und SteckerDetailaufnahme Stecker und Schirmung

      Schritt 14: Batteriekabel anlöten

      • Die Akkus müssen mit Lötfahnen ausgestattet sein. Akkus ohne Lötfahnen dürfen -nicht gelötet werden!
      • Das Batteriekabel (rot und schwarz) auf ca. 12 cm kürzen und neu auf ca. 5 mm -abisolieren.
      • Die Polung der Batterie identifizieren. Der Pluspol ist auf der Seite mit -Einkerbung im Akku-Gehäuse, und in der Regel auch mit einem Plus auf dem -Aufdruck markiert. Im Zweifel mit dem Multimeter nachmessen.
      • Es empfiehlt sich, den Akku bereits in den Gehäusedeckel einzulegen, sodass -er nicht wegrollt.
      • Jede Seite zunächst mit einem großzügigen Lötpunkt ausstatten. Dann den -Lötpunkt erneut erhitzen und das Kabelende seitlich ins Lötzinn einführen. -Die Kabel sollen von der Lötfahne in die Mitte der Batterie führen.
      • Die Batteriekontakte mit Isolierband (wenn möglich Kapton-Tape) isolieren und -einfach umwickeln, sodass die Pole und Lötfahnen komplett bedeckt sind und -die Kabel mechanisch fixiert werden.
      • Die Batterie mit einem kleinen Kabelbinder im Deckel befestigen.
      Akku mit Kabel und Stecker (Polung beachten!)Kontakte isolieren

      Schritt 15: Gehäuse vorbereiten

      • Einpressgewinde (“heat-set inserts”) einbauen:
        • Den Lötkolben auf ca. 180-220°C einstellen, gut reinigen (kein Lot an der -Spitze). Nach Möglichkeit eigene Spitze für diese Aufgabe verwenden, und -danach wieder wechseln.
        • Einpressgewinde so weit wie möglich von Hand in das vorgesehene Loch drücken.
        • Lötkolben auflegen, nur sehr leichten Druck ausüben.
        • Gewinde so senkrecht wie möglich und behutsam versinken lassen.
        • Das Gewinde sollte lieber etwas zu tief sitzen, als über den Rand -überzustehen, um die Gehäuseteile bündig miteinander verbinden zu können.
        • Die Gewinde, mit denen das PCB befestigt wird, nicht zu tief versenken, sonst -bildet sich eine Ausbuchtung auf der Außenseite.
        • Vorsicht: Die Einpressgewinde sind noch lange nach dem Einsetzen heiß -und kühlen erst langsam ab. Gehäuse am besten einige Minuten zur Seite legen.
      • Einpressgewinde hier platzieren:
        • 3 Stück in Hauptgehäuse für das PCB (mit Montagelöchern der Platine vergleichen)
        • 5 Stück in Hauptgehäuse für Hauptdeckel
        • 1 Stück in Hauptgehäuse beim GPS-Deckel
        • 3 Stück in Displaygehäuse
      • Kleine Würfelmagnete in USB-Abdeckung einsetzen
        • Wenn Kompatibilität mit anderen OBS gewünscht ist, muss auf gleiche Polung -geachtet werden, da sonst die Abdeckungen nicht austauschbar sind.
        • Erst Magnete in Abdeckung einsetzen.
        • Dann einen Magnet auf einen der eingesetzten platzieren und die -Abdeckung ins Hauptgehäuse stecken, dabei den einzelnen Magneten ins -Hauptgehäuse eindrücken. Mit der anderen Seite wiederholen.
      Einpressgewinde in Displaygehäuse einschmelzenHauptgehäuse mit EinpressgewindeUSB-Abdeckung mit Magneten

      Schritt 16: Display-Kabel

      • Zugentlastung in Displaygehäuse-Unterteil einsetzen:
        • Erste Hälfte der Zugentlastung einsetzen.
        • Zweite Hälfte von außen angewinkelt eindrücken, bei Bedarf die unteren -Ecken mit dem Seitenschneider leicht abrunden, damit sie sich leichter in -die vorgesehene Position stecken lässt.
      • Kabel durch Displaygehäuse-Unterteil und Zugentlastung führen.
      • Button in Gehäuseoberteil einschrauben.
      • Stecker OBS-Seite
        • Das andere Kabelende durch das Displaygehäuse-Unterteil stecken.
        • Die Außenisolierung kann gut auf ca. 5 cm abisoliert werden.
        • Die einzelnen Litzen nur 1-2 mm abisolieren und alle 5 Litzen crimpen. -Für stabilen Halt müssen die äußeren Flügel des Crimpkontakts die -Isolierung der jeweiligen Litze greifen.
        • Gecrimpte Kabelenden in das JST-Gehäuse (5-polig) einführen. -OBS-PCB und Display sind beschriftet. Zuordnung der Farben zu Beschriftung notieren. -Unten gibt es eine Verkabelungstabelle mit Farbvorschlag.
      • Stecker Display-Seite
        • Vom JST-Gehäuse (4-polig) die Arretierung (auf der einen Seite leicht -hervorstehende Plastikflügel) entfernen, also eben abschneiden (Cuttermesser -oder Seitenschneider).
        • Nur 3 Kabel crimpen: GND, SDA, SCL. Die Außenisolierung auf -ca. 2 cm abisolieren.
        • BUT an eine Seite des Buttons löten.
        • Kleines Kabelstück (ca. 3 cm):
          • vorbereiten, einseitig crimpen
          • mit +3V3 zusammen an andere Buttonseite löten
          • Crimpkontakt entspricht jetzt +3V3 bzw. VDD (am Display)
        • Gecrimpte Kabelenden in das JST-Gehäuse (4-polig) einführen.
      OBS-SeiteDisplayseiteButtonVorschlag Farbe
      SDASDAblau
      GNDGNDschwarz
      BUT-Pin 1grau
      SCLSCK-weiß
      +3V3-Pin 2braun
      -VDDPin 2(kurzes Stück Kabel)
      Das untere Teil des Displaygehäuses mit ZugentlastungKabel durch Unterteil geführtButton in Displayoberteil eingeschraubtOBS-Seite: Alle 5 Adern crimpenOBS-Seite in Stecker einführenZwei Kabel an Button löten (Pin 2)Display-Seite: Button und Stecker fertig

      Schritt 17: Display-Zusammenbau

      • 0,96-Zoll OLED-Displayboard vorbereiten
        • Die OLED-Boards haben teils etwas unterschiedliche Größen
          • Platine des Displays nach Bedarf etwas zurechtschneiden, insbesondere an den Ecken (Seitenschneider)
          • Je nach Genauigkeit des 3D-Drucks das Gehäuse etwas weiter ausfräsen
        • Schutzfolie von Display abziehen
        • Plastikteile an Steckkontakten entfernen und Pins um etwa 2 mm kürzen.
      • Display in Gehäuseoberteil (das mit dem Button) einsetzen.
      • Stecker auf die gekürzten Pins aufstecken (Polung beachten). Gegebenenfalls die Pins weiter kürzen, -bis der Stecker ganz auf dem Board aufliegt, damit er ins Displaygehäuse passt.
      • Magnete in die Seitentasche einsetzen.
        • Wenn Kompatibilität mit anderen OBS gewünscht ist, muss auf gleiche Polung -geachtet werden, da sonst die Halterungen nicht austauschbar sind.
        • Je nach Genauigkeit des 3D-Drucks können die Magnete lose sein und etwas klappern. -Die Magnete dann ggf. mit etwas Kleber fixieren oder mit einem Klebestreifen einwickeln.
      • Gehäuseunterteil aufsetzen und mit Schrauben fixieren.
      • Zugentlastung mit M3x8 Schrauben und Sechskantmuttern fixieren, dabei auf -sechseckige Fixierung auf jeweils einer Seite der Zugentlastung achten.
      Verschiedene Displays vom gleichen Lieferanten -Wenn nötig, Display mit Seitenschneider stutzen -Display in Gehäuse einpassen, ohne GewaltMagnete passend einlegenDas Display mit verschraubtem GehäuseZugsicherung fixieren

      Schritt 18: ESP32 flashen

      Zunächst muss die OpenBikeSensor-Firmware auf den ESP32 geflashed werden. -Am schnellsten sollte dies mit dem Chrome-Browser über diese Webseite gehen:

      Folge alternativ der Anleitung für dein Betriebssystem.

      Schritt 19: Elektronik testen

      Vor dem Einbau ins Gehäuse testen wir die Elektronik in dieser Reihenfolge:

      1. Ausschalten
      2. Batteriekabel polungsrichtig einstecken.
      3. Laden: Normales USB-C Ladegerät (5 V) anschließen
        • Einige Geräte funktionieren nur nach Anschluss an ein Ladegerät
        • Bei vollem Akku leuchtet das Modul blau, sonst rot.
      4. USB-C Kabel abstecken.
      5. Einschalten per Kippschalter (ohne dabei den Knopf am Display zu drücken)
        • Boot-Screen sollte auf dem Display erscheinen. Wenn nicht, nochmal aus- und, sofern nichts stinkt oder gar raucht, wieder einschalten.
      6. Bei angeschlossener GPS-Antenne GPS-Funktion im Freien testen
        • Nach einigen Minuten: GPS-Board blinkt, Boot-Screen wechselt zu Sensor-Anzeige. Werden 0 Satelliten angezeigt, wird trotzdem weitergesucht, was zu Beginn wegen des Downloads des Almanachs sehr lange dauern kann. 15 Minuten sind beim ersten Einschalten nicht ungewöhnlich.
        • Alternativ kann durch einen Druck auf den Taster vom Boot-Screen zur Sensor-Anzeige gewechelt werden.
      7. Sensoren-Funktion testen:
        • Sensoren mit den Sensor-Boards verbinden
          • Die Polung beachten. Siehe hierzu auch Schritt 13.
        • Zur Sensor-Anzeige wechseln, auf welcher in der Fußzeile die Roh-Werte, der Abstände (ohne Lenkerabstand) der Ultraschall-Sensoren, live angezeigt werden (Option “raw details” in der Konfiguration).
        • Hinweis: Der linke Sensor wird am äußeren, dem Loch zugewandten Sensor-Board angeschlossen.
      Die Elektronik funktioniert

      Schritt 21: Zusammenbau

      Vor dem Zusammenbau sicherstellen, dass die Firmware auf dem ESP32 aufgespielt ist, -dann muss dieser später nicht mehr ausgebaut werden.

      • Kabel und Halterung
        • Die vier Sechskantmuttern in die Wand des Gehäuses einsetzen (bei Gehäuse -mit zwei Halterungen sind es acht Sechskantmuttern).
        • Sind die Sechskantlöcher eng, die Muttern mit der längeren M3 Schraube -von der Außenseite in die Öffnung ziehen.
        • Ist ein Sechskantloch auch dafür zu eng, vorsichtig mit dem Lötkolben -nachdrücken, und die Mutter von der Außenseite mit der längeren Schraube führen. -Vermeide dabei, mit dem Lötkolben das Plastik zu berühren.
        • Falls du ein Gehäuse mit mehreren Montageöffnungen baust, entscheide dich, an -welcher Öffnung du die Halteklammer installieren willst. Diese Öffnung -führt auch später das Kabel. Die andere Öffnung wird mit dem Deckel -(AttachmentCover) verschlossen.
      • PCB im Hauptgehäuse platzieren
        • Zunächst die SD-Karte einlegen und den ESP32 aufstecken, dabei auf die -Polung achten (USB-Markierung mit Mikro-USB-Stecker auf ESP32 abgleichen) -und sicherstellen, dass die Pins nicht um ein oder zwei Löcher verrutscht -eingesteckt werden.
        • Gesamtes Board in leichtem Winkel herabsenken, auf Ausrichtung der USB-C -Ladebuchse achten. Bei Wiederzusammenbau am Displaykabel vorbei navigieren.
        • Bei Bedarf Unreinheiten des Gehäuses (vom 3D-Druck) entfernen, wenn das PCB -daran hängen bleibt.
        • Mit 3 Stück M3x6 oder M3x8 im Gehäuse verschrauben.
      • Displaykabel in Gehäuse einstecken
        • Führe das Displaykabel mit dem Stecker voran von außen in das Hauptgehäuse hinein -(falls in Schritt 16 nicht geschehen).
        • Die Halterung mit Zugentlastung anbringen und damit das Kabel fixieren. -Noch nicht festziehen, nur sicherstellen dass die Muttern nicht mehr -herausfallen.
        • Das Kabel sollte außen um die Elektronik herumgeführt werden, nicht -zwischen dem GPS- und SD-Karten-Modul hindurch. Im neuen Gehäuse sollte -dort genug Platz sein.
        • Jetzt zeigt sich auch, warum ca. 5 cm Abisolierung hier sinnvoll ist, denn -ohne Isolierung ist das Kabel flexibler.
        • Stecker einsetzen (z.B. mit Pinzette)
        • Kabel so weit aus der Zugsicherung herausziehen, bis kein überschüssiges -Kabel im Innenraum des Gehäuses ist, aber das Kabel nicht straff liegt.
        • Schrauben der Zugsicherung bzw. Halterung nun fest anziehen.
      • GPS-Antenne einsetzen
        • Kabel der Antenne mit kleinem Stecker durch das kleine Loch fädeln.
        • GPS-Antenne mit Schirmung nach unten und Keramik nach oben in die -quadratische Aussparung einsetzen.
        • Den Antennenstecker auf das GPS-Board aufstecken. Der Stecker ist sehr -filigran und schwer zu stecken, es geht gut ihn mit den Fingern zu -platzieren und mit einer Pinzette den Stecker und die GPS-Modulplatine -zusammenzudrücken. Dabei auf richtigen Sitz achten um den Stecker nicht zu -beschädigen.
        • Den GPS-Deckel über die Antenne schieben und mit einer M3x6 oder M3x8 -Schraube fixieren.
        • Falls das Antennenkabel nicht reicht, kann die GPS-Antenne mithilfe eines -hinreichend langen Antennenkabels mit IPEX/U.FL Stecker verlängert werden. -Hierzu:
          • Den Metallschild des GPS-Moduls ablöten.
          • Das neue Kabel vorsichtig durch Rollen unter Cuttermesser auf etwa -5-7 mm abisolieren.
          • Die Schirmung zurückschieben.
          • Noch vorsichtiger die innere Isolierung durch ganz sanftes Rollen -mit dem Cuttermesser abisolieren.
          • Das kurze Kabel ab- und das neue, längere anlöten.
          • Den Metallschild des Moduls wieder in ursprünglicher Ausrichtung -auflöten.
      • Schalter in Gehäuse einsetzen
        • Einschaltrichtung mit “I/O” Aufdruck des Gehäuses vergleichen.
        • Möglichst mit der mitgelieferten Unterlegscheibe und Mutter fixieren.
        • Schalterkabel verdrillen.
        • Kabel entlang der Gehäusewand zur Buchse führen und dort einstecken.
      • Sensoren einbauen
        • Auf der Rückseite des Sensors gibt es einen Pfeil, der mit “UP” die -Richtung markiert, wo später oben sein soll.
        • Einen Sensor ins Hauptgehäuse einbauen, den anderen in den Deckel.
        • Sensoren einstecken. Den Sensor im Gehäuse an das ihm naheliegendste -Sensorboard anschließen, den Sensor vom Deckel in das entferntere (Anschluss über dem ESP32).
      • Akku einbauen
        • Akku im Deckel mit Kabelbinder fixieren (falls in Schritt 14 noch nicht erledigt)
        • Einstecken. Polung beachten!
        • Möglicherweise überstehendes Kabel möglichst auf der Seite des GPS -verstauen. Beide Adern verdrillen und parallel legen.
      • Konfiguration des Sensors:
        • Die Anzeige kann im Konfigurationsmodus auf den Simple-Mode gestellt werden.
        • Außerdem kann die Breite des Lenkers und WLAN eingestellt werden.
        • Bei einem Reboot des Sensors wird nun auf der Sensor-Anzeige der Simple-Mode mit dem Abstand des linken Sensors angezeigt - abzüglich der Breite des Lenkers.
      • Montage und Testfahrt mit dem Fahrrad.
      Akku und Ultraschallsensor an Deckel montieren ('Up'-Pfeil beachten)Ultraschallsensoren einsteckenLadebuchse (USB-C) ohne Gewalt in die Aussparung einfädelnPCB festschraubenHalterung und Zugentlastung festschraubenGPS-Deckel festschraubenDeckel festschraubenFertig!
      - \ No newline at end of file diff --git a/docs/classic/build-instructions/index.html b/docs/classic/build-instructions/index.html index fc983546..8f11e384 100644 --- a/docs/classic/build-instructions/index.html +++ b/docs/classic/build-instructions/index.html @@ -1,11 +1,9 @@ -Bauanleitung (OpenBikeSensor Classic 1.0.0) | OpenBikeSensorBauanleitung (OpenBikeSensor Classic 1.0.0) | OpenBikeSensor + - - - -

      Bauanleitung (OpenBikeSensor Classic 1.0.0)

      Sobald der Bausatz für den OpenBikeSensor Classic zusammengestellt ist, kann anhand dieser Anleitung der Bau begonnen werden. Der Zusammenbau besteht aus einer Menge Lötarbeit, sowie dem Test der Elektronik und dem Einbau in das Gehäuse.
      - \ No newline at end of file +weiterführende Anleitungen zu Themen wie Montage, Konfiguration und Aufzeichnung.


      Bauanleitung für den OpenBikeSensor v00.03.12

      Zuletzt geändert 20.01.2024: Small fixes. (df948e6)

      Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
      \ No newline at end of file diff --git a/docs/classic/build-instructions/v00.03.12/_print/index.html b/docs/classic/build-instructions/v00.03.12/_print/index.html deleted file mode 100644 index dab2146c..00000000 --- a/docs/classic/build-instructions/v00.03.12/_print/index.html +++ /dev/null @@ -1,204 +0,0 @@ -Bauanleitung für den OpenBikeSensor v00.03.12 | OpenBikeSensor - - - -

      Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

      Zur Standardansicht zurückkehren.

      Bauanleitung für den OpenBikeSensor v00.03.12

        Dies ist die Anleitung zum Aufbau des OpenBikeSensors v00.03.12 in der -Standardvariante. Andere Versionen können über das Dokumentationsmenü -aufgerufen werden.

        Die beschriebene Vorgehensweise ist nur eine Möglichkeit, zu einem -funktionierenden Modell zu kommen. Wenn du alternative Wege gehen möchtest, -kannst du das natürlich tun. Solltest du einen massentauglichen besseren oder -einfacheren Weg für einen der Schritte finden, freuen wir uns über -Änderungsvorschläge -oder eine kurze Nachricht.

        Ein fertig gebauter OpenBikeSensor der Version v00.03.12

        Voraussetzungen

        Diese Anleitung setzt voraus, dass die Grundtechniken wie Löten, das -Abisolieren von Kabeln und das Crimpen von JST-Verbindern bereits bekannt sind. -Für letzteres empfehlen wir das -JST-Crimp-Tutorial.

        Wenn du unsicher bist, wo -du ein Bauteil auf dem Board unterbringen sollst, kannst du die -interaktive Stückliste (BOM) verwenden, um dir -anzeigen zu lassen, wo ein Bauteil eingesetzt werden kann.

        Schritt 1: Buchsenleisten

        • Falls nur Buchsenleisten mit 16 Pins vorhanden sind, müssen diese auf 15 Pins gekürzt werden:
          • Mit dem Seitenschneider kürzen.
          • Mit dem Cuttermesser oder Schleifpapier nacharbeiten, um keine scharfe Kante zu hinterlassen.
        • Buchsenleisten auf ESP32 stecken, um den Abstand später genau passend zu haben.
          • Auf die Richtung der Pins (Kontaktbeine an der Buchsenleiste) achten!
          • Die Pads (Lötstellen auf der Platine) sind nicht symmetrisch, auf je einer -Seite ist nur jeder zweite Pin mit Pad versehen.
        • Buchsenleisten mit gestecktem ESP32 positionieren. Auf gute zentrierte Ausrichtung achten.
        • Einen Eck-Pin festlöten. Dabei den ESP32 gut festhalten, evtl. zu zweit arbeiten.
        • Ausrichtung prüfen, wenn der ESP32 verrutscht ist, nacharbeiten.
        • Diagonal gegenüberliegenden Pin anlöten. Ausrichtung erneut prüfen.
        • Alle äußeren Verbindungen verlöten.
        • Den ESP32 vorsichtig abziehen, sodass die Pins dabei nicht verbiegen.
        • Die inneren Kontakte anlöten.
        Bauteile bereitlegenBuchsenleite wenn nötig auf 15 Pins zuschneiden -Buchsenleisten auf ESP32 aufstecken -Gemeinsam auf dem PCB platzieren. Ausrichtung der abwechselnden Pins (innen) prüfen.Zunächst an einem Eckpunkt fixierenAusrichten und auf der gegenüberliegenden Seite ebenfalls fixieren -Alle äußeren Pins festlöten (beidseitig)Alle äußeren Pins festgelötet -Dann den ESP32 entfernen und die Innenseite verlöten

        Schritt 2: Spannungsregler (rot)

        • Wir verwenden Stiftleisten, um den Spannungsregler richtig zu positionieren. Verlötet -werden diese nicht, sondern später wieder herausgezogen und beim Lademodul -benutzt.
          • Bei Bedarf kann die beim SD-Karten-Modul mitgelieferte 6-polige Stiftleiste -verwendet werden, diese wird nicht für die SD-Karte gebraucht.
          • Stifte von der Leiste abtrennen: 1x1 und 1x2 Stifte.
          • Spannungsregler mit Stiften in zwei gegenüber liegenden Lötstellen platzieren.
          • Stifte nicht verlöten!
        • Das ausgerichtete Modul an den anderen beiden SMD-Pads verlöten.
          • Die Außenseite der Modulplatine hat ein halbrudes Loch mit Kontaktfläche.
          • Diese wird mit Lötzinn verbunden zum Pad auf der OBS-Hauptplatine darunter.
          • Auf guten Fluss des Lötzinns zum unteren Pad achten.
        • Die Ausrichtungsstifte abziehen und die restlichen Kontakte ebenfalls in -SMD-Bauweise verlöten.
        Stiftleisten ablängen -Bauteile bereitlegenBoard platzieren und mit Stiften ausrichten, anderes Pad wie SMD verlötenFreie Kontakte löten -Stifte entfernen und restliche Kontakte löten

        Schritt 3: USB-C-Lademodul (blau)

        • Für das blaue Lademodul 2x2 Stifte und 2x1 Stift vorbereiten (siehe oben).
        • Modul auf PCB auflegen
        • Die Stifte und Stiftpaare einstecken und evtl. fixieren.
        • Aufpassen, dass das Modul flach auf dem PCB aufliegt, sodass später die -Ausrichtung der USB-Ladebuchse korrekt ist.
        • Die Stifte von der anderen Seite verlöten.
        • Die schwarzen Plastikteile entfernen und die Oberseite ebenfalls verlöten.
        • Alle überstehenden Stifte mit dem Seitenschneider kürzen.
        Bauteile bereitlegenLademodul und Stifte platziertAuf Oberseite verlötenAlle Stifte auf Oberseite verlötet -Schwarze Plastikteile von Stiftleiste entfernenSchwarze Plastikteile von Stiftleiste entfernt -Oberseite verlötenStifte kürzen

        Schritt 4: Widerstände

        • Widerstände richtig zuordnen (Farbcodes z.B. via kiloohm.info decodieren oder mit einem Multimeter messen):
          • R1: 10 kΩ (braun - schwarz - orange - gold)
          • R2: 150 kΩ (braun - grün - gelb - gold)
          • R3: 300 kΩ (orange - schwarz - gelb - gold)
          • R6, R7: 1,1 kΩ (braun - braun - rot - gold) oder 1 kΩ (braun - schwarz - rot - gold)
          • Leider enthält die Platine einen Fehler, und R7 kann nicht wie vorgesehen platziert werden, sonst ist der Widerstand dem einen Sensorboard im Weg.
          • Statt auf der Oberseite verlöten wir den Widerstand auf der Unterseite.
          • Die Beinchen werden dabei nicht durch die Löcher gesteckt. Wir behandeln den Widerstand wie ein SMD-Bauteil.
          • Pads identifizieren. Eines der Pads auf der Platinenunterseite mit etwas -Lötzinn benetzen. Sehr wenig Zinn verwenden, sonst sickert es durch das -Loch durch und bildet auf der Rückseite eine Perle, die dann im Weg ist.
          • Zinn wieder verflüssigen, Widerstand mit einem Bein darin fixieren. Der -Widerstand liegt flach auf der Unterseite der Platine auf, mit nicht -gebogenen Beinen.
          • Anderes Bein mit Lötzinn auf anderes Pad löten.
          • Beine kürzen.
          • Falls doch Lötzinn zur Oberseite der Platine durchgesickert ist, mit -Entlötlitze reduzieren.
        • Falls ein SMD-Widerstand für R6 verwendet werden soll:
          • Einen Lötpunkt auf ein Pad setzen.
          • Widerstand flach auf das PCB legen, Lötpunkt erneut schmelzen und -das Bauteil mit der Pinzette darauf schieben.
          • Andere Seite normal festlöten.
          • R7 nicht so verbauen (s.o.)
        • Normale THT-Widerstände (R1, R2, R3, R6) stecken, verlöten, Beine kürzen.
        R7: Eines der Pads verzinnenR7: Den Widerstand wie ein SMD-Bauteil einseitig anlötenR7: Die zweite Seite verlötenR7: Fertig montiert -Ein Widerstand (R6) platziertAuf der Rückseite verlötenBeine kürzen. Widerstände R1-R3 ebenso montieren.

        Schritt 5: Kondensatoren

        • Kondensatoren identifizieren und richtig zuordnen
          • C1: 100 nF (in der Regel blau, manchmal Aufschrift 104)
          • C2, C3: 22 µF Elektrolytkondensator (i.d.R. schwarz mit heller Aufschrift, zylinderförmig, unterschiedlich lange Beine)
        • Bei C2 und C3: Polung auf Platine und Kondensator beachten!
          • Plus: Langer Pin
          • Minus: Kurzer Pin, mit Streifen markierte Seite, auf PCB ausgefüllte Hälfte
        • Kondensatoren C1 bis C3 stecken, zum Fixieren die Beine umbiegen
        • Auf Rückseite verlöten und überstehenden Draht abkneifen
        Die KondensatorenKondensatoren platzieren, auf Polung achten!Auf der Rückseite umbiegen und verlötenDrähte kürzen -Widerstände und Kondensatoren fertig platziert

        Schritt 6: Lötpunkt / Brücke

        • JP1 (mittig auf der Platine) mit einem Lötpunkt versehen und damit überbrücken
        • Erstes Bild im nächsten Schritt zeigt das Ergebnis

        Schritt 7: Stromversorgung

        • Sicherung (in der Regel dunkelgelb, flach mit 2 Beinen, rund oder rechteckig)
          • Position: F1
          • Die Polung ist egal
          • Die kleinen Biegungen in den Beinchen sorgen für den richtigen Abstand.
          • Einstecken, senkrecht verlöten, Beine abkneifen.
        • Batteriestecker
          • Stecker und Kabel zusammenstecken
          • Beschriftung auf der Platine beachten (Rot: „Plus“, Schwarz: „Minus“)
          • Auf der Rückseite einen Pin anlöten.
          • Das Kabel abziehen.
          • Auf guten Sitz des Steckers achten. Wenn der Stecker noch nicht flach und -senkrecht auf der Platine aufsitzt, die Lötstelle noch einmal heiß machen -und den Stecker an seinen Platz drücken.
          • Den zweiten Pin festlöten.
        • Diode
          • Polung beachten: Die Diode “steht” auf dem Kreis auf dem PCB, aber der -weiße Ring auf der Diode dabei zeigt nach oben.
          • Diode umbiegen und aufstecken
          • Enden vor dem Löten etwas kürzen, um beim Löten weniger Metall aufheizen zu -müssen
          • Verlöten: Eigentlich sollen Halbleiter nur kurz gelötet werden, aber dieses -ist ein sehr großes Bauteil, und auch erstaunlich robust. Arbeite zügig, -aber erwarte dass es eine Weile dauert, bis das Bauteil und die Pads auf -Temperatur gebracht sind und das Lötzinn schmilzt.
          • Die überstehenden Enden nachkürzen.
        Die fertig platzierten Bauteile (oben links)

        Schritt 8: Verbinder für Taster und Display

        • J5 (Displaykabel)
          • 5-Pin-Konnektor gemäß Markierung auf Platine aufsetzen
          • Die Aussparungen zeigen in Richtung der Mitte der Platine.
          • Einen Pin von unten verlöten.
          • Ausrichtung prüfen und evtl. korrigieren (Hinweise hierzu siehe -Batteriestecker).
          • Restliche Pins verlöten.
        • J6 (Schalter Ein/Aus)
          • 2-Pin-Connector so aufsetzen, dass er möglichst wenig über den Rand der -Platine übersteht und verlöten.
          • Polung egal.
          • Wie oben verlöten.
        5-poligen Stecker richtigherum aufsteckenAuf der Rückseite verlöten, auf guten Sitz achten2-poligen Stecker ebenso montieren

        Schritt 9: Sensorboards

        Vorbereitung

        • Option 1: (bevorzugt, benötigt gewinkelte 2-polige JST-Stecker)
          • Die JST-Stecker aus dem Sensorboard auslöten. Hierfür:
            • Das weiße Kunststoffteil abziehen.
            • Die zurückbleibenden Metallstifte mit etwas mehr Lötzinn versehen und -herausziehen.
            • Das innere Paar Löcher von Lötzinn befreien (Entlötsaugpumpe oder -Entlötlitze).
          • Gewinkelte JST-Stecker stattdessen einlöten.
          • Das Kabel, wenn eingesteckt, sollte weg von den 4 Pins des Boards zeigen -(nach oben, wenn montiert).
        • Option 2 (Winkelstiftleiste):
          • Die JST-Stecker aus dem Sensorboard auslöten (siehe oben).
          • Durch eine 2-polige Winkelstiftleiste ersetzen.
          • Dabei das kurze Ende nur so weit ins Sensorboard einführen, dass die Spitze -der Stifte gerade so auf der anderen Seite herausschaut und dann verlöten.
        • Option 3 (Kontakte biegen):
          • Den weißen Kunststoff vom JST-Stecker abziehen
          • Die zurückbleibenden Metallstifte vorsichtig umbiegen, sodass sie weg von -der vierpoligen Stifteleiste “nach oben” zeigen, dabei die Biegung in etwa -2 mm Abstand vom Board anfangen.
          • Die Stifte können dabei brechen, dann muss kreativ repariert werden. ;)
          • Hier lässt sich ein JST-Stecker einstecken, aber nicht arretieren. Wir -hatten jedoch bisher keine Probleme mit dieser Variante im Betrieb.
        Ein einzelnes Sensorboard -Das weiße Kunststoffteil entfernenKontakte des alten Steckers auslöten, neuen Stecker einlöten

        Einbau

        • Beide Sensorboards stecken, dabei Beschriftung (+3V3, TRIG, ECHO, GND) -beachten. Die Boards stehen sich “gegenüber” und dürfen einander nicht -berühren. Wenn die Platzierung der Boards klar ist, das inner Board wieder -beiseite legen.
        • Das erste Board fixieren. Hierfür kann das PCB mit gestecktem Board auf den -Kopf gedreht werden, es steht so ganz gut.
        • Nur einen Pin anlöten. Danach die Ausrichtung prüfen. In der Regel ist das -Board hier noch nicht senkrecht, und liegt auch nicht auf voller Länge auf -dem PCB auf, sondern hat “Luft” darunter.
        • Das PCB und Board in eine Hand nehmen, sodass mit dem Finger oder Daumen die -Ausrichtung des Boards korrigiert werden kann. Mit der anderen Hand kann der -Lötkolben geführt werden. Da der eine Pin bereits verlötet ist benötigen wir -keine weitere Hand für das Lötzinn. So kann die Ausrichtung leicht angepasst -werden, bis sie aus allen Richtungen gut aussieht.
        • Erst dann werden die drei verbleibenden Pins verlötet.
        • Das zweite Board genauso einlöten.
        • Überstehende Stifte kürzen.
        Sensorboards platzieren (schief aufgestellt für Übersicht, bitte gerade löten)Auf der Rückseite verlöten, Beine kürzen

        Schritt 10: SD-Karten-Modul

        • Gewinkelte Stiftleiste mit 6 Pins vorbereiten.
        • Gewinkelte Stiftleiste genau wie in der Abbildung gezeigt in SD-Karten-Modul -stecken. Die Ausrichtung ist wichtig, es gibt acht Möglichkeiten die Stiftleiste zu -stecken, sieben davon funktionieren nicht.
          • Die Stiftleiste wird von der Oberseite der Modulplatine aufgesteckt.
          • Die Stifte haben direkt oberhalb der Platine ihre Biegung.
          • Dann erst kommt die schwarze Kunststoffleiste.
          • Die lange, gerade Seite der Pins zeigt vom Modul weg.
        • Stiftleiste mit dem Modul verlöten und überstehende Pins abkneifen.
        • Modul auf das PCB stecken (Ausrichtung und Beschriftung beachten).
        • Verlöten und Stifte kürzen.
        SD-Karten Modul und Stiftleiste -Stiftleiste in Modul einstecken (Richtung beachten) -Stiftleiste in Modul verlöten (Richtung beachten)Modul platzierenAuf der Rückseite anlöten und kürzen

        Schritt 11: GPS-Modul

        • Gewinkelte Stiftleiste mit 4 Pins vorbereiten.
        • Stiftleiste in PCB einlöten:
          • Von der Unterseite stecken.
          • Langes Ende der Pins steht seitlich heraus.
        • Eng anliegend verlöten, Stifte kürzen.
        • GPS-Modul aufstecken, sodass es in der Aussparung des PCB liegt.
        • Einen Pin verlöten, Ausrichtung korrigieren wie bei Sensorboards
        • Restliche Pins Verlöten und Stifte kürzen.
        4-polige Winkelstiftleiste abkürzen und stecken (Richtung beachten)Auf der Oberseite verlötenGPS-Modul senkrecht aufstecken und verlöten

        Schritt 12: Ein/Aus-Schalter

        • Zwei Stück Kabel, ca. 10 cm lang, abtrennen.
        • Einseitig crimpen und in 2-fach JST Steckergehäuse einführen.
        • Andere Kabelenden an den Schalter löten.
          • Etwa 5 mm des Kabels abisolieren.
          • Drahtenden verdrillen und verzinnen.
          • Zu einem “U” oder “Z” biegen und in die Öse an den Schalterpins einführen.
          • Nur kurz löten, sonst schmilzt der Kunststoff im Stecker.
        Schalter mit Kabel und Stecker

        Schritt 13: Ultraschallsensor-Kabel kürzen und crimpen

        • Die langen schwarzen Kabel der Sensoren auf etwa 10 cm kürzen, da die langen -Kabel nicht in das Gehäuse passen und auch die Plastikeinfassung der -bestehenden Stecker zu starr und zu dick für das Gehäuse ist.
        • Empfehlung: Schrumpfschlauch (sofern vorhanden, optional) direkt nach dem -Kürzen auf das schwarze Sensorkabel aufziehen, noch bevor es abisoliert und -gecrimpt wird.
        • Abisolieren:
          • Etwa 2 cm des Kabels abisolieren.
          • Die Schirmung zur Seite schieben und alle Leiter miteinander verdrillen (dies ist einer der zwei Leiter, die gecript werden müssen).
          • Den inneren Leiter etwa 1 mm abisolieren.
        • Crimpen:
          • Beide Leiter werden gecript.
          • Der Crimpkontakt muss für optimale Verbindung den inneren Leiter und seine Isolierung greifen.
          • Die Schirmung auf dir gleiche Länge kürzen und gemeinsam crimpen. Eventuell -einzelne abstehende Leiter entfernen, sodass diese keinen Kurzschluss -verursachen.
        • Stecken:
        • Zum Schluss Schrumpfschlauch (falls vorhanden) erhitzen und befestigen, dabei -etwa 3-5 mm vom Stecker entfernt positionieren um ein Biegen in Steckernähe -beim Einstecken zu ermöglichen.
          • Hinweis: Dieser Schritt kann auch erst nach dem Testen der Eletronik -gemacht werden, wenn sichergestellt ist, dass der Sensor korrekt funktioniert.
        Sensor mit gekürztem Kabel und SteckerDetailaufnahme Stecker und Schirmung

        Schritt 14: Batteriekabel anlöten

        • Die Akkus müssen mit Lötfahnen ausgestattet sein. Akkus ohne Lötfahnen dürfen -nicht gelötet werden!
        • Das Batteriekabel (rot und schwarz) auf ca. 12 cm kürzen und neu auf ca. 5 mm -abisolieren.
        • Die Polung der Batterie identifizieren. Der Pluspol ist auf der Seite mit -Einkerbung im Akku-Gehäuse, und in der Regel auch mit einem Plus auf dem -Aufdruck markiert. Im Zweifel mit dem Multimeter nachmessen.
        • Es empfiehlt sich, den Akku bereits in den Gehäusedeckel einzulegen, sodass -er nicht wegrollt.
        • Jede Seite zunächst mit einem großzügigen Lötpunkt ausstatten. Dann den -Lötpunkt erneut erhitzen und das Kabelende seitlich ins Lötzinn einführen. -Die Kabel sollen von der Lötfahne in die Mitte der Batterie führen.
        • Die Batteriekontakte mit Isolierband (wenn möglich Kapton-Tape) isolieren und -einfach umwickeln, sodass die Pole und Lötfahnen komplett bedeckt sind und -die Kabel mechanisch fixiert werden.
        • Die Batterie mit einem kleinen Kabelbinder im Deckel befestigen.
        Akku mit Kabel und Stecker (Polung beachten!)Kontakte isolieren

        Schritt 15: Gehäuse vorbereiten

        • Einpressgewinde (“heat-set inserts”) einbauen:
          • Den Lötkolben auf ca. 180-220°C einstellen, gut reinigen (kein Lot an der -Spitze). Nach Möglichkeit eigene Spitze für diese Aufgabe verwenden, und -danach wieder wechseln.
          • Einpressgewinde so weit wie möglich von Hand in das vorgesehene Loch drücken.
          • Lötkolben auflegen, nur sehr leichten Druck ausüben.
          • Gewinde so senkrecht wie möglich und behutsam versinken lassen.
          • Das Gewinde sollte lieber etwas zu tief sitzen, als über den Rand -überzustehen, um die Gehäuseteile bündig miteinander verbinden zu können.
          • Die Gewinde, mit denen das PCB befestigt wird, nicht zu tief versenken, sonst -bildet sich eine Ausbuchtung auf der Außenseite.
          • Vorsicht: Die Einpressgewinde sind noch lange nach dem Einsetzen heiß -und kühlen erst langsam ab. Gehäuse am besten einige Minuten zur Seite legen.
        • Einpressgewinde hier platzieren:
          • 3 Stück in Hauptgehäuse für das PCB (mit Montagelöchern der Platine vergleichen)
          • 5 Stück in Hauptgehäuse für Hauptdeckel
          • 1 Stück in Hauptgehäuse beim GPS-Deckel
          • 3 Stück in Displaygehäuse
        • Kleine Würfelmagnete in USB-Abdeckung einsetzen
          • Wenn Kompatibilität mit anderen OBS gewünscht ist, muss auf gleiche Polung -geachtet werden, da sonst die Abdeckungen nicht austauschbar sind.
          • Erst Magnete in Abdeckung einsetzen.
          • Dann einen Magnet auf einen der eingesetzten platzieren und die -Abdeckung ins Hauptgehäuse stecken, dabei den einzelnen Magneten ins -Hauptgehäuse eindrücken. Mit der anderen Seite wiederholen.
        Einpressgewinde in Displaygehäuse einschmelzenHauptgehäuse mit EinpressgewindeUSB-Abdeckung mit Magneten

        Schritt 16: Display-Kabel

        • Zugentlastung in Displaygehäuse-Unterteil einsetzen:
          • Erste Hälfte der Zugentlastung einsetzen.
          • Zweite Hälfte von außen angewinkelt eindrücken, bei Bedarf die unteren -Ecken mit dem Seitenschneider leicht abrunden, damit sie sich leichter in -die vorgesehene Position stecken lässt.
        • Kabel durch Displaygehäuse-Unterteil und Zugentlastung führen.
        • Button in Gehäuseoberteil einschrauben.
        • Stecker OBS-Seite
          • Das andere Kabelende durch das Displaygehäuse-Unterteil stecken.
          • Die Außenisolierung kann gut auf ca. 5 cm abisoliert werden.
          • Die einzelnen Litzen nur 1-2 mm abisolieren und alle 5 Litzen crimpen. -Für stabilen Halt müssen die äußeren Flügel des Crimpkontakts die -Isolierung der jeweiligen Litze greifen.
          • Gecrimpte Kabelenden in das JST-Gehäuse (5-polig) einführen. -OBS-PCB und Display sind beschriftet. Zuordnung der Farben zu Beschriftung notieren. -Unten gibt es eine Verkabelungstabelle mit Farbvorschlag.
        • Stecker Display-Seite
          • Vom JST-Gehäuse (4-polig) die Arretierung (auf der einen Seite leicht -hervorstehende Plastikflügel) entfernen, also eben abschneiden (Cuttermesser -oder Seitenschneider).
          • Nur 3 Kabel crimpen: GND, SDA, SCL. Die Außenisolierung auf -ca. 2 cm abisolieren.
          • BUT an eine Seite des Buttons löten.
          • Kleines Kabelstück (ca. 3 cm):
            • vorbereiten, einseitig crimpen
            • mit +3V3 zusammen an andere Buttonseite löten
            • Crimpkontakt entspricht jetzt +3V3 bzw. VDD (am Display)
          • Gecrimpte Kabelenden in das JST-Gehäuse (4-polig) einführen.
        OBS-SeiteDisplayseiteButtonVorschlag Farbe
        SDASDAblau
        GNDGNDschwarz
        BUT-Pin 1grau
        SCLSCK-weiß
        +3V3-Pin 2braun
        -VDDPin 2(kurzes Stück Kabel)
        Das untere Teil des Displaygehäuses mit ZugentlastungKabel durch Unterteil geführtButton in Displayoberteil eingeschraubtOBS-Seite: Alle 5 Adern crimpenOBS-Seite in Stecker einführenZwei Kabel an Button löten (Pin 2)Display-Seite: Button und Stecker fertig

        Schritt 17: Display-Zusammenbau

        • 0,96-Zoll OLED-Displayboard vorbereiten
          • Die OLED-Boards haben teils etwas unterschiedliche Größen
            • Platine des Displays nach Bedarf etwas zurechtschneiden, insbesondere an den Ecken (Seitenschneider)
            • Je nach Genauigkeit des 3D-Drucks das Gehäuse etwas weiter ausfräsen
          • Schutzfolie von Display abziehen
          • Plastikteile an Steckkontakten entfernen und Pins um etwa 2 mm kürzen.
        • Display in Gehäuseoberteil (das mit dem Button) einsetzen.
        • Stecker auf die gekürzten Pins aufstecken (Polung beachten). Gegebenenfalls die Pins weiter kürzen, -bis der Stecker ganz auf dem Board aufliegt, damit er ins Displaygehäuse passt.
        • Magnete in die Seitentasche einsetzen.
          • Wenn Kompatibilität mit anderen OBS gewünscht ist, muss auf gleiche Polung -geachtet werden, da sonst die Halterungen nicht austauschbar sind.
          • Je nach Genauigkeit des 3D-Drucks können die Magnete lose sein und etwas klappern. -Die Magnete dann ggf. mit etwas Kleber fixieren oder mit einem Klebestreifen einwickeln.
        • Gehäuseunterteil aufsetzen und mit Schrauben fixieren.
        • Zugentlastung mit M3x8 Schrauben und Sechskantmuttern fixieren, dabei auf -sechseckige Fixierung auf jeweils einer Seite der Zugentlastung achten.
        Verschiedene Displays vom gleichen Lieferanten -Wenn nötig, Display mit Seitenschneider stutzen -Display in Gehäuse einpassen, ohne GewaltMagnete passend einlegenDas Display mit verschraubtem GehäuseZugsicherung fixieren

        Schritt 18: ESP32 flashen

        Zunächst muss die OpenBikeSensor-Firmware auf den ESP32 geflashed werden. -Am schnellsten sollte dies mit dem Chrome-Browser über diese Webseite gehen:

        Folge alternativ der Anleitung für dein Betriebssystem.

        Schritt 19: Elektronik testen

        Vor dem Einbau ins Gehäuse testen wir die Elektronik in dieser Reihenfolge:

        1. Ausschalten
        2. Batteriekabel polungsrichtig einstecken.
        3. Laden: Normales USB-C Ladegerät (5 V) anschließen
          • Einige Geräte funktionieren nur nach Anschluss an ein Ladegerät
          • Bei vollem Akku leuchtet das Modul blau, sonst rot.
        4. USB-C Kabel abstecken.
        5. Einschalten per Kippschalter (ohne dabei den Knopf am Display zu drücken)
          • Boot-Screen sollte auf dem Display erscheinen. Wenn nicht, nochmal aus- und, sofern nichts stinkt oder gar raucht, wieder einschalten.
        6. Bei angeschlossener GPS-Antenne GPS-Funktion im Freien testen
          • Nach einigen Minuten: GPS-Board blinkt, Boot-Screen wechselt zu Sensor-Anzeige. Werden 0 Satelliten angezeigt, wird trotzdem weitergesucht, was zu Beginn wegen des Downloads des Almanachs sehr lange dauern kann. 15 Minuten sind beim ersten Einschalten nicht ungewöhnlich.
          • Alternativ kann durch einen Druck auf den Taster vom Boot-Screen zur Sensor-Anzeige gewechelt werden.
        7. Sensoren-Funktion testen:
          • Sensoren mit den Sensor-Boards verbinden
            • Die Polung beachten. Siehe hierzu auch Schritt 13.
          • Zur Sensor-Anzeige wechseln, auf welcher in der Fußzeile die Roh-Werte, der Abstände (ohne Lenkerabstand) der Ultraschall-Sensoren, live angezeigt werden (Option “raw details” in der Konfiguration).
          • Hinweis: Der linke Sensor wird am äußeren, dem Loch zugewandten Sensor-Board angeschlossen.
        Die Elektronik funktioniert

        Schritt 21: Zusammenbau

        Vor dem Zusammenbau sicherstellen, dass die Firmware auf dem ESP32 aufgespielt ist, -dann muss dieser später nicht mehr ausgebaut werden.

        • Kabel und Halterung
          • Die vier Sechskantmuttern in die Wand des Gehäuses einsetzen (bei Gehäuse -mit zwei Halterungen sind es acht Sechskantmuttern).
          • Sind die Sechskantlöcher eng, die Muttern mit der längeren M3 Schraube -von der Außenseite in die Öffnung ziehen.
          • Ist ein Sechskantloch auch dafür zu eng, vorsichtig mit dem Lötkolben -nachdrücken, und die Mutter von der Außenseite mit der längeren Schraube führen. -Vermeide dabei, mit dem Lötkolben das Plastik zu berühren.
          • Falls du ein Gehäuse mit mehreren Montageöffnungen baust, entscheide dich, an -welcher Öffnung du die Halteklammer installieren willst. Diese Öffnung -führt auch später das Kabel. Die andere Öffnung wird mit dem Deckel -(AttachmentCover) verschlossen.
        • PCB im Hauptgehäuse platzieren
          • Zunächst die SD-Karte einlegen und den ESP32 aufstecken, dabei auf die -Polung achten (USB-Markierung mit Mikro-USB-Stecker auf ESP32 abgleichen) -und sicherstellen, dass die Pins nicht um ein oder zwei Löcher verrutscht -eingesteckt werden.
          • Gesamtes Board in leichtem Winkel herabsenken, auf Ausrichtung der USB-C -Ladebuchse achten. Bei Wiederzusammenbau am Displaykabel vorbei navigieren.
          • Bei Bedarf Unreinheiten des Gehäuses (vom 3D-Druck) entfernen, wenn das PCB -daran hängen bleibt.
          • Mit 3 Stück M3x6 oder M3x8 im Gehäuse verschrauben.
        • Displaykabel in Gehäuse einstecken
          • Führe das Displaykabel mit dem Stecker voran von außen in das Hauptgehäuse hinein -(falls in Schritt 16 nicht geschehen).
          • Die Halterung mit Zugentlastung anbringen und damit das Kabel fixieren. -Noch nicht festziehen, nur sicherstellen dass die Muttern nicht mehr -herausfallen.
          • Das Kabel sollte außen um die Elektronik herumgeführt werden, nicht -zwischen dem GPS- und SD-Karten-Modul hindurch. Im neuen Gehäuse sollte -dort genug Platz sein.
          • Jetzt zeigt sich auch, warum ca. 5 cm Abisolierung hier sinnvoll ist, denn -ohne Isolierung ist das Kabel flexibler.
          • Stecker einsetzen (z.B. mit Pinzette)
          • Kabel so weit aus der Zugsicherung herausziehen, bis kein überschüssiges -Kabel im Innenraum des Gehäuses ist, aber das Kabel nicht straff liegt.
          • Schrauben der Zugsicherung bzw. Halterung nun fest anziehen.
        • GPS-Antenne einsetzen
          • Kabel der Antenne mit kleinem Stecker durch das kleine Loch fädeln.
          • GPS-Antenne mit Schirmung nach unten und Keramik nach oben in die -quadratische Aussparung einsetzen.
          • Den Antennenstecker auf das GPS-Board aufstecken. Der Stecker ist sehr -filigran und schwer zu stecken, es geht gut ihn mit den Fingern zu -platzieren und mit einer Pinzette den Stecker und die GPS-Modulplatine -zusammenzudrücken. Dabei auf richtigen Sitz achten um den Stecker nicht zu -beschädigen.
          • Den GPS-Deckel über die Antenne schieben und mit einer M3x6 oder M3x8 -Schraube fixieren.
          • Falls das Antennenkabel nicht reicht, kann die GPS-Antenne mithilfe eines -hinreichend langen Antennenkabels mit IPEX/U.FL Stecker verlängert werden. -Hierzu:
            • Den Metallschild des GPS-Moduls ablöten.
            • Das neue Kabel vorsichtig durch Rollen unter Cuttermesser auf etwa -5-7 mm abisolieren.
            • Die Schirmung zurückschieben.
            • Noch vorsichtiger die innere Isolierung durch ganz sanftes Rollen -mit dem Cuttermesser abisolieren.
            • Das kurze Kabel ab- und das neue, längere anlöten.
            • Den Metallschild des Moduls wieder in ursprünglicher Ausrichtung -auflöten.
        • Schalter in Gehäuse einsetzen
          • Einschaltrichtung mit “I/O” Aufdruck des Gehäuses vergleichen.
          • Möglichst mit der mitgelieferten Unterlegscheibe und Mutter fixieren.
          • Schalterkabel verdrillen.
          • Kabel entlang der Gehäusewand zur Buchse führen und dort einstecken.
        • Sensoren einbauen
          • Auf der Rückseite des Sensors gibt es einen Pfeil, der mit “UP” die -Richtung markiert, wo später oben sein soll.
          • Einen Sensor ins Hauptgehäuse einbauen, den anderen in den Deckel.
          • Sensoren einstecken. Den Sensor im Gehäuse an das ihm naheliegendste -Sensorboard anschließen, den Sensor vom Deckel in das entferntere (Anschluss über dem ESP32).
        • Akku einbauen
          • Akku im Deckel mit Kabelbinder fixieren (falls in Schritt 14 noch nicht erledigt)
          • Einstecken. Polung beachten!
          • Möglicherweise überstehendes Kabel möglichst auf der Seite des GPS -verstauen. Beide Adern verdrillen und parallel legen.
        • Konfiguration des Sensors:
          • Die Anzeige kann im Konfigurationsmodus auf den Simple-Mode gestellt werden.
          • Außerdem kann die Breite des Lenkers und WLAN eingestellt werden.
          • Bei einem Reboot des Sensors wird nun auf der Sensor-Anzeige der Simple-Mode mit dem Abstand des linken Sensors angezeigt - abzüglich der Breite des Lenkers.
        • Montage und Testfahrt mit dem Fahrrad.
        Akku und Ultraschallsensor an Deckel montieren ('Up'-Pfeil beachten)Ultraschallsensoren einsteckenLadebuchse (USB-C) ohne Gewalt in die Aussparung einfädelnPCB festschraubenHalterung und Zugentlastung festschraubenGPS-Deckel festschraubenDeckel festschraubenFertig!
        - \ No newline at end of file diff --git a/docs/classic/build-instructions/v00.03.12/index.html b/docs/classic/build-instructions/v00.03.12/index.html index 50fd3f52..9effd80c 100644 --- a/docs/classic/build-instructions/v00.03.12/index.html +++ b/docs/classic/build-instructions/v00.03.12/index.html @@ -1,8 +1,6 @@ -Bauanleitung für den OpenBikeSensor v00.03.12 | OpenBikeSensor - - - -

        Bauanleitung für den OpenBikeSensor v00.03.12

        Zuletzt geändert 16.12.2023: more rework of solder manual (88f0f59)

        Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
        \ No newline at end of file diff --git a/docs/classic/case/_print/index.html b/docs/classic/case/_print/index.html deleted file mode 100644 index b0447c86..00000000 --- a/docs/classic/case/_print/index.html +++ /dev/null @@ -1,210 +0,0 @@ -Gehäuse | OpenBikeSensor - - - -

        Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

        Zur Standardansicht zurückkehren.

        Gehäuse

        In das Gehäuse des OpenBikeSensor Classic werden die elektronischen Komponenten eingebaut. Es wird im 3D-Druck-Verfahren selbst gefertigt.

        OpenBikeSensor Gehäusebausatz (alte Version)

        Es gibt viele Möglichkeiten, ein Gehäuse für deinen OpenBikeSensor zu bekommen. -Unter Umständen findest du in der Community hilfreiche Bastler:innen, die dir -ein Gehäuse herstellen – hierzu fragst du am besten im Forum nach.

        Eine andere Möglichkeit ist, einen lokalen Maker- oder Hackspace zu finden, in -dem 3D-Drucker und Know-How zur Verfügung stehen. Hierfür haben wir eine -Anleitung mit allen Details für den Druck von -OpenBikeSensor-Gehäuseteilen geschrieben.

        Natürlich kannst du die Elektronik auch in eine alte Plastikdose stecken und -Löcher hineinbohren für Sensoren und Kabel. Das mag wesentlich einfacher sein -und zum Ziel führen, ist aber im Betrieb eher unpraktisch. Du musst dir eine -Möglichkeit ausdenken, das ganze an dein Rad anzubringen und evtl. auch wieder -abnehmbar zu machen, um das Gerät zu laden oder zu warten. Es ist also -natürlich möglich, aber am Ende schöner und praktiabler ist der 3D-Druck – es -lohnt sich!

        Falls das Selbstdrucken dir zu aufwendig erscheint, oder du einfach keinen -Zugang zu einem 3D-Drucker in deiner Nähe hast, sind vielleicht auch -3D-Druck-Dienstleister eine Option für dich. Diese drucken Teile nach deinen -Dateien Anweisungen als Auftragsarbeit. Preisgünstige Anbieter nehmen für ein -komplettes OpenBikeSensor-Gehäuse ca. 20-30 €. Wenn du dich mit anderen zu -Erfahrungen hiermit austauschen möchtest, ist das Forum der richtige Ort!

        1 - Gehäusedruck

        In dieser Anleitung geht es darum, ein komplettes Gehäuse mit Halterungen -selbst zu drucken und herzustellen. Der Druck eines kompletten -OpenBikeSensor-Gehäusesatzes, oder auch nur von Teilen davon, ist problemlos -möglich, vorausgesetzt du hast einen 3D-Drucker zur Verfügung.

        Der 3D-Druck kostet ca. 5 € Material (Filamentkosten können variieren), -Verschleiß, Stromkosten und vor allem Zeit, ca. 10-20h Druckzeit muss man schon -einplanen.

        Drucker und Slicer

        Der Ultimaker 3 hat ein Displaygehäuse mit Zugentlastung fertig gedruckt.

        Für den Beispieldruck in dieser Anleitung verwenden wir einen Ultimaker 3. -Dieser hat zwei Extruder, sodass mit zwei Filamenten gleichzeitig gedruckt -werden kann. Das vereinfacht den Druck des Sensorgehäuses und des Deckels, da -für die Logos eine zusätzliche Farbe verwendet werden kann. Bei einem Drucker -mit nur einem Extruder muss während des Drucks das Filament gewechselt werden. -Hierfür gibt es verschiedene Strategien, die je nach Drucker, Firmware und -Slicer variieren. Alternativ können alle Teile auch einfach ohne Logo mit nur -einem Filament gedruckt werden.

        Wichtig ist die Slicer-Software, die den Druck für den jeweiligen Drucker -aufbereitet. Für den Ultimaker (und viele andere Drucker) kann Cura von der -offiziellen Website -heruntergeladen und kostenlos verwendet werden (für Linux, Windows und macOS). -Eine starke Alternative ist der Prusa -Slicer. Die Wahl des Slicers hängt von -persönlicher Präferenz und den unterstützten Druckern ab, sowie in -Spezialfällen den unterstützten Features. Beide Slicer eignen sich für den -Druck von OpenBikeSensor-Gehäuseteilen.

        Material und Farben

        Das empfohlene Material für den Druck der Gehäuseteile ist PETG, das Material -mit den meisten Vorteile für unser Projekt:

        • hohe Schlagfestigkeit und dennoch flexibel – wichtig für den Einsatz am Fahrrad
        • hydrophob, wasserabweisend, witterungsbeständig – wichtig für Außeneinsatz
        • geruchsneutrales Drucken – erleichtert das Drucken auch zu Hause
        • niedrige Viskosität (Zähigkeit)
        • verfügbar in vielen verschiedenen Farben, sogar transparent

        Nachteilig ist allerdings die UV Beständigkeit, die nicht so hoch ist wie bei -ABS oder ASA. Doch die Vorteile überwiegen diese Einschränkung.

        Beispiel eines gedruckten Gehäuses mit Logos

        Druckvorbereitung

        Alle Dateien für das OpenBikeSensor Projekt wie Software, Firmware, Dokumentation und auch die 3D-Druckdateien liegen auf GitHub. Das Repository für die Gehäusedaten ist:

        Die Gehäuselemente werden unterschieden in die Bestandteile

        • Hauptgehäuse (MainCase)
        • Displaygehäuse (DisplayCase)
        • Halterungen (Mounting)

        Ein ZIP-Archiv mit allen aktuellen Dateien, sowohl dem Quelltext als auch den -exportierten STL-Dateien für den 3D-Druck können von GitHub direkt -heruntergeladen werden:

        Im Archiv befindet sich ein Ordner export/ mit den obigen Kategorien, und -darin sind jeweils die STL-Dateien für den Slicer zu finden.

        Allgemeines Vorgehen

        Der Import einer STL-Datei in eine Slicer Software (wie z.B. Cura) ist der -erste Schritt um ein 3D Objekt zu drucken. Im Slicer wird das 3D-Objekt so auf -die Druckplatte gelegt, sodass es möglichst wenig Überhänge gibt:

        1. So sollte es aussehen, kann aber in dieser Lage so nicht gedruckt werden2. Drucken mit dem Gesicht nach unten

        Die STL-Dateien werden in der Regel so generiert, dass sie nach dem importieren -bereits in der empfohlenen Lage auf dem Druckbett liegen. Auf Support kannst du -dann in der Regel verzichten, denn bei der Modellierung wird bereits die -supportfreie Druckbarkeit beachtet. Du kannst dich natürlich auch anders -entscheiden und die Objekte drehen, sollte dein Drucker oder Slicer sonst keine -guten Ergebnisse liefern.

        Als nächstes werden der richtige Drucker, das Filament und die -Druckeinstellungen (Infull, Support, Geschwindigkeit, Schichtdicke, …) -gewählt. Hier gilt, dass du dich am besten an den Vorgaben der Hersteller (von -Drucker und Filament) orientierst, aber auch immer ein bisschen experimentierst -und die für dich und deinen Anwendungsfall richtigen Einstellungen findest. -Informationsmaterial, Anleitungen und Tutorials gibt es massenweise im Netz.

        1. Cura view auf main case im Vorbereitungsmode2. Einstellung auf PETG und 2 Extruder3. Settings für Druckdichte (Infill), Support, Düsendurchmesser4. starte Slicing

        Beim eigentlichen “Slicen” erstellt Cura nun eine GCODE-Datei, die alle Befehle -für den speziellen Drucker und das Material enthält (z.B. Bewegungen, -Temperaturen, etc.).

        1. Nachdem alle Einstellungen erfolgt sind, wird das Slicing gestartet 2. Slicing information gibt es im Preview, mit den beiden Schiebern unten und rechts kann man jede einzelne Bahn des Extruders verfolgen

        Die GCODE-Datei wird nun auf den 3D-Drucker übertragen. Je nach Druckermodell -geschieht dies über WLAN, mithilfe einer SD-Karte oder eines USB-Sticks, oder -der Drucker ist direkt (per USB) am PC angeschlossen. Das genaue Verfahren ist -im Handbuch des Druckers vermutlich beschrieben.

        Im Menü des Druckers wird die erstellte GCODE-Datei für den Druck ausgewählt -und der Druck gestartet. Ab hier übernimmt der Roboter die Arbeit für uns, und -wenn wir alles richtig eingestellt haben, ist in einigen Minuten bis Stunden -ein neues Gehäuseteil fertig.

        Hauptgehäuse

        Das Hauptgehäuse enthält den Großteil der Elektronik (PCB, Sensorboards, -SD-Karte, GPS, Hauptschalter, Ladeelektronik) sowie die zwei Abstandssensoren, -die GPS-Antenne und die Batterie.

        Sowohl das Hauptteil als auch der Deckel können mit einem Logo gedruckt werden. -Dies ist ein wenig mehr Aufwand, lohnt sich aber optisch sehr, und es hilft -erfahrungsgemäß auch dabei, auf der Straße auf das Gerät angesprochen zu werden -und dem Projekt mehr Aufmerksamkeit zu generieren. Details zum Druck des Logos findest du hier: Logo-Druck (mehrfarbig).

        Die Teile zum Drucken:

        Die ersten zwei Teile gibt es jeweils auch mit OpenBikeSensor-Logo. Für jedes -Bauteil sind hierfür vier Dateien verfügbar. Das Logo kann invertiert oder -normal gedruckt werden, und für den Zweifarben-Druck sind pro Bauteil zwei -Dateien nötig (main und highlight), die die in der jeweiligen Farbe zu -druckenden Bestandteile repräsentieren. Hier sind demnach alle acht Dateien für das -OBS-Logo.

        Das Bauteil StandardMountAdapter gehört zwar eigentlich zu den Halterungen, -wird aber fest am Hauptgehäuse angebracht und bildet eine Hälfte des -Befestigungsmechanismus. Es gehört also auch irgendwie zum Hauptgehäuse.

        Das Bauteil AttachmentCover verschließt die Öffnung des Standardgehäuses, -an der nicht die Halteklammer montiert wird. Dieses Teil wird nicht benötigt, -wenn das Gehäuse ohne zweite Öffnung verwendet wird.

        Die Bauteile des Hauptgehäuses auf dem Druckbett

        Fahrradhalterung

        Zwei Halterungen, das SeatPostMount und eine alte Variante des TopTubeMount.

        Es gibt verschiedene Möglichkeiten, den OBS Sensor am Fahrrad zu montieren. Wie die Halterungen angebracht werden und aussehen, ist in der Montageanleitung zu sehen.

        1. Standard: Sattelhalterung, an der Sattelstange hinter -dem/der Fahrer:in montiert.
        2. Oberrohr-Halterung: Wenn die Sattelhalterungen nicht -verwendbar sind, kann die Montage weiter vorne an der Querstange erfolgen.
        3. Gepäckträgerhalterung: Dreiteilig, wird mit etwas Rundstab oder -Alu-Rundprofil verbunden. Kann auf, unter oder hinter dem Gepäckträger -montiert werden.

        Außerdem nötig ist ein Sicherungsstift (LockingPin). Das Display wird mit der -dazugehörigen Schiene (Mounting/HandlebarRail) am Lenker befestigt.

        Lage dreier Halterungen und des Sicherungspin auf dem Druckbett (die -verlängerte Variante kann parametrisch mit OpenSCAD erstellt werden). Der -LockingPin sollte jedoch lieber stehend gedruckt werden.

        Displaygehäuse (Anzeige und Knopf)

        Im Displaygehäuse sind nur das Display und der Knopf verbaut. Die nötigen Bauteile sind:

        In die Vertiefung der zwei Gehäusehälften werden zwei Magnete eingelegt, die -das Display während der Fahrt an der Schiene (HandlebarRail, siehe -“Fahrradhalterung” oben) halten.

        Fertiges Displaygehäuse (alte Version)

        Materialverbrauch und Zeitbedarf

        Nach dem Slicen wird angezeigt, wie lange der Druckvorgang dauern wird und wie -viel Material für den Druck benötigt wird. Abhängig von den Einstellungen kann -die Druckdauer sehr unterschiedlich sein. Oft geht mit mehr -Druckgeschwindigkeit ein Qualitätsverlust einher, sodass die beiden -gegeneinander abgewogen werden müssen.

        Üblich für den Druck eines ganzen Gehäuses ist daher je nach Drucker etwa 10 -Stunden in Summe. Die Kosten des Filaments belaufen sich auf ca. 3 €, wer -Verschleiß und Stromkosten einrechnet kommt auf etwa 5 € Gesamtkosten.

        Troubleshooting

        Lage der Druckteile und Überhänge

        Beim Druck der Gehäuseteile ist die Lage des Teiles wichtig, denn Überhänge -sollten vermieden werden, sodass der Drucker nicht in der luft drucken muss. -Das Design der Modelle ist bereits darauf ausgelegt, möglichst gut druckbar zu -sein, die Positionierung auf dem Druckbett ist daher auch besonders wichtig.

        Nach dem Laden der STL-Dateien in Cura werden in der Vorschau die Überhänge in -rot angezeigt. Am Beispiel des Deckels (Bilder 1 und 2) ist es sehr -offensichtlich das die Lage eine wesentliche Rolle spielt, wie herum das Teil -auf die Druckerplatte gelegt werden soll.

        Aber selbst bei einer optimalen Lage wie im Beispiel des Sensorgehäuses zeigt -Cura wo sich trotzdem noch Überhänge bilden. Manche Überhänge wie -Schraubenlöcher sind unkritisch da der Drucker das selbst überbrücken kann -(bridging). Doch wenn der Übergang zu groß wird können sich viele Fäden -ziehen. Um das zu vermeiden kann die Supportfunktion eingeschalten werden, der -Drucker erstellt dann leichte Stützstrukturen, die nach dem Druck wieder -entfernt werden.

        1. Schlechte Positionierung erzeugt Überhänge (rot)2. Richtiges Positionieren ist wichtig3. In der Vorschau werden bereits in rot Überhänge angezeigt4. Support einschalten5. Die zusätzliche Supportstruktur ist nach dem Slicing in der Vorschau sichtbar

        Fehlerhafte Drucke

        Einige Fehler traten während der Drucke auf:

        Support fehlt, Düse vom 2. Extruder verstopft

        Brüchige Verbindung, vermutlich Druckdichte (Infill) zu gering

        Weitere Anleitungen

        • Detaillierte Anleitung für den Zusammenbau des gesamten -OpenBikeSensors beschreibt den Einbau der elektronischen Komponenten in die -beiden Gehäuse.
        • Die Montage des Sensors am Fahrrad wird mit -verschiedenen Halterungen und für das Displaygehäuse gezeigt.

        2 - Gehäusebauteile

        Hier möchten wir eine Übersicht über alle verfügbaren Gehäusebauteile geben. -Die Links führen jeweils zur Quelldatei (OpenSCAD) und zum STL-Export für den -3D-Druck. Alle Dateien lassen sich auch auf einmal herunterladen, direkt von -Github in der neuesten Version als ZIP-Archiv. Darin finden sich im Ordner -export alle Dateien für den 3D-Druck:

        Eine detaillierte Anleitung zum Gehäusedruck gibt es hier.

        Hauptgehäuse

        BildBauteilname & BeschreibungLinks
        MainCase/MainCase
        Das Hauptgehäuse, in dem die Elektronik untergebracht ist.
        OpenSCAD, -STL
        MainCase/MainCaseLid
        Der Deckel für das Hauptgehäuse, mit Batteriehalterung.
        OpenSCAD, -STL
        MainCase/UsbCover
        Ein kleiner Deckel für die Öffnung des USB-C Ladesteckers im Hauptgehäuse.
        OpenSCAD, -STL
        MainCase/GpsAntennaLid
        Ein kleiner Deckel für die GPS-Antenne im Hauptgehäuse.
        OpenSCAD, -STL

        Displaygehäuse

        BildBauteilname & BeschreibungLinks
        DisplayCase/DisplayCableStrainRelief
        Zugsicherung für das Displaykabel im Displaygehäuse (2x drucken).
        OpenSCAD, -STL
        DisplayCase/DisplayCaseBottom
        Die untere Hälfte des Displaygehäuses.
        OpenSCAD, -STL
        DisplayCase/DisplayCaseTop
        Die obere Hälfte des Displaygehäuses.
        OpenSCAD, -STL

        Halterungen

        Die verschiedenen Halterungen und ihre Montage werden in der Montageanleitung beschrieben.

        BildBauteilname & BeschreibungLinks
        Mounting/AttachmentCover
        Eine Abdeckung für ungenutzte Montagepunkte am Hauptgehäuse (z. B. für kombinierte Back Rider und Top Rider Gehäuse).
        OpenSCAD, -STL
        Mounting/BikeRackMountCenter
        Das Mittelstück für die Gepäckträgerhalterung in Quermontage.
        OpenSCAD, -STL
        Mounting/BikeRackMountCenterLongitudinal
        Das Mittelstück für die Gepäckträgerhalterung in Längsmontage (ungewöhnlich).
        OpenSCAD, -STL
        Mounting/BikeRackMountSide
        Ein Seitenstück der Gepäckträgerhalterung (2x drucken).
        OpenSCAD, -STL
        Mounting/HandlebarRail
        Die Schiene für die Befestigung des Displays am Lenker (Version für Kabelbinderbefestigung).
        OpenSCAD, -STL
        Mounting/HandlebarRailOring
        Die Schiene für die Befestigung des Displays am Lenker (Version für O-Ring-Befestigung).
        OpenSCAD, -STL
        Mounting/LockingPin
        Der Befestigungsstift für das Hauptgehäuse.
        OpenSCAD, -STL
        Mounting/SeatPostMount
        Die Sattelstützenhalterung.
        OpenSCAD, -STL
        Mounting/StandardMountAdapter
        Wird am Hauptgehäuse montiert und ermöglicht das Aufschieben auf die Schienen der Halterungen. Wirkt ebenfalls als Zugsicherung für das Displaykabel am Hauptgehäuse.
        OpenSCAD, -STL
        Mounting/TopTubeMount
        Die Halterung für das Oberrohr.
        OpenSCAD, -STL

        3 - Gehäusevarianten

        Top Rider / Back Rider

        Das Hauptgehäuse kann als “Top Rider” oder “Back Rider” konfiguriert werden, -oder beides gleichzeitig. Dies definiert, welche Montagepunkte verfügbar sind.

        Ein “Top Rider” Hauptgehäuse hat den Montagepunkt unten (wenn am Rad montiert), -wohingegen ein “Back Rider” ihn vorn hat. Alte Modelle des OpenBikeSensors -waren somit alle “Back Rider”, denn sie wurden immer an der Sattelstütze -montiert, horizontal dahinter hängend.

        Da viele Radfahrende ihre Räder so einstellen, dass hier nicht genug Platz für -einen OpenBikeSensor bleibt, wurde die Variante “Top Rider” mit entsprechenden -Halterungen eingeführt. Top Rider OBS sitzen auf dem Oberrohr, dem -Gepäckträger, oder überall wo unter ihnen Platz für eine Halterung ist. Der -nach unten zeigende Montagepunkt macht das wesentlich stabiler als eine -Halterung, die “um die Ecke” gehen muss, um eine Schiene anzubieten, die nach -hinten zeigt.

        Die Montagepunkte am Hauptgehäuse.

        Ein Gehäuse kann sowohl Top Rider als auch Back Rider gleichzeitig sein. Auf -jeden der Montagepunkte passt der StandardMountAdapter (siehe -Gehäusebauteile). Ein ungenutzter Montagepunkt -sollte mit dem AttachmentCover abgedeckt werden, um die Löcher zu schließen.

        Die Parametrierung erfolgt über die OpenSCAD-Variablen

        MainCase_back_rider
        -MainCase_top_rider
        -MainCase_back_rider_cable
        -MainCase_top_rider_cable
        -

        Ein Adapter (Mounting/BackRiderTopRiderAdapter) ist verfügbar für (ältere) -Geräte, die nur Back Rider sind, aber auf einer Top Rider Halterung angebracht -werden sollen. Das Gegenteil davon haben wir (noch) nicht entworfen.

        OpenSCAD Schnellstart

        OpenSCAD ermöglicht die parametrische Erstellung von 3D-Modellen mit Code. Den -Code haben wir geschrieben, die Parameter kannst du ändern. Damit gibt es jede -Menge Anpassungsmöglichkeiten für jeden Anwendungsfall.

        Die STL-Dateien werden anhand der SCAD-Dateien erzeugt, die alle im -GitHub-Repository -liegen. Am besten benutzt du git, um dir eine Kopie herunterzuladen -(clone), und dann kannst du die Parameter ändern:

        git clone --recurse-submodules https://github.com/openbikesensor/OpenBikeSensor3dPrintableCase
        -cd OpenBikeSensor3dPrintableCase
        -

        Jetzt kannst du die Datei variables.scad anpassen und deine gewünschten Werte -setzen (z. B. MainCase_back_rider, siehe oben).

        Die einzelnen Bauteile aus dem Ordner src/ kannst du dann mit dem Programm -OpenSCAD (das du direkt von seiner Website -herunterladen oder mit deinem -Paketmanager installieren kannst) anschauen. Einzelne Bauteile kannst du darin -auch rendern (F6) und danach als STL exportieren (F7).

        Wenn du alle Teile neu generieren möchtest, kannst du auch in deinem Terminal -make eingeben. Dies erzeugt alle geänderten Bauteile neu, möchtest du alle -neu erstellen, hilft vorher ein make clean. Diese Bauteile werden dann nach -export/... exportiert und überschreiben die dort vorhandenen STL-Dateien. Es -dauert jedoch eine Weile die ganzen Geometrien zu berechnen, erwarte etwa 2-20 -Minuten, je nachdem wie schnell dein Rechner ist.

        4 - Logo-Druck (mehrfarbig)

        Ein Hauptgehäuse mit eingedrucktem Logo.

        Logo-Dateien

        Statt der Bauteile MainCase und MainCaseLid werden entsprechende Bauteile -gedruckt, die geometrisch identisch sind, aber das Logo enthalten.

        Je nach Logo und Filamentwahl kann es sinnvoll sein, das Logo zu invertieren.

        • Normal: Das Logo hat eine andere Farbe als der Rest des Bauteils.
        • Invertiert: Die Grundfläche, auf der das Logo gedruckt wird, hat eine -andere Farbe als der Rest des Bauteils. Das Logo hat die gleiche Farbe wie -die Wände und das Innere des Bauteils.

        Je nach Drucktechnik sind pro Bauteil eine oder zwei Dateien notwendig, nämlich -das Logo an sich, und das Bauteil, aus dem das Logo herausgeschnitten wurde.

        • Main: Der Hauptteil des Bauteils ohne Logo, bzw. bei invertierten Logo -der Hauptteil mit Logo, aber ohne Grundfläche.
        • Highlight: Das Logo, das herausgeschnitten wurde, bzw. bei invertierten -Logo die Grundfläche ohne Logo.

        Bezeichnungen der vier Dateien für den Logo-Druck des Hauptgehäuses (nur -das Gehäuse, nicht der Deckel).

        Jede dieser vier Dateien gibt es für das Hauptgehäuses und seinen Deckel, -insgesamt pro Logo also acht Dateien. Die vorgenerierten STL-Dateien für das -OpenBikeSensor-Logo werden ebenfalls auf GitHub veröffentlicht und liegen dort -im Verzeichnis -export/logo/OpenBikeSensor/.

        OpenSCAD Logo Generator

        Die Anleitung hierfür folgt demnächst. Möchtest du jetzt schon dein eigenes -Logo auf einen OpenBikeSensor drucken? Bestimmt wird dir im Forum geholfen!

        Mehrfarbendruck

        Zu diesem Thema haben wir noch keine ausführliche Dokumentation, aber es gibt -einen Diskussionsfaden im Forum. Vielleicht hilft dir das schon weiter, -ansonsten kannst du gern dort deine Fragen und Ideen einbringen:

        https://forum.openbikesensor.org/t/mehrfarbiger-gehaeusedruck/111

        - \ No newline at end of file diff --git a/docs/classic/case/color-prints/_print/index.html b/docs/classic/case/color-prints/_print/index.html deleted file mode 100644 index affa7910..00000000 --- a/docs/classic/case/color-prints/_print/index.html +++ /dev/null @@ -1,21 +0,0 @@ -Logo-Druck (mehrfarbig) | OpenBikeSensor - - - -

        Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

        Zur Standardansicht zurückkehren.

        Logo-Druck (mehrfarbig)

          Ein Hauptgehäuse mit eingedrucktem Logo.

          Logo-Dateien

          Statt der Bauteile MainCase und MainCaseLid werden entsprechende Bauteile -gedruckt, die geometrisch identisch sind, aber das Logo enthalten.

          Je nach Logo und Filamentwahl kann es sinnvoll sein, das Logo zu invertieren.

          • Normal: Das Logo hat eine andere Farbe als der Rest des Bauteils.
          • Invertiert: Die Grundfläche, auf der das Logo gedruckt wird, hat eine -andere Farbe als der Rest des Bauteils. Das Logo hat die gleiche Farbe wie -die Wände und das Innere des Bauteils.

          Je nach Drucktechnik sind pro Bauteil eine oder zwei Dateien notwendig, nämlich -das Logo an sich, und das Bauteil, aus dem das Logo herausgeschnitten wurde.

          • Main: Der Hauptteil des Bauteils ohne Logo, bzw. bei invertierten Logo -der Hauptteil mit Logo, aber ohne Grundfläche.
          • Highlight: Das Logo, das herausgeschnitten wurde, bzw. bei invertierten -Logo die Grundfläche ohne Logo.

          Bezeichnungen der vier Dateien für den Logo-Druck des Hauptgehäuses (nur -das Gehäuse, nicht der Deckel).

          Jede dieser vier Dateien gibt es für das Hauptgehäuses und seinen Deckel, -insgesamt pro Logo also acht Dateien. Die vorgenerierten STL-Dateien für das -OpenBikeSensor-Logo werden ebenfalls auf GitHub veröffentlicht und liegen dort -im Verzeichnis -export/logo/OpenBikeSensor/.

          OpenSCAD Logo Generator

          Die Anleitung hierfür folgt demnächst. Möchtest du jetzt schon dein eigenes -Logo auf einen OpenBikeSensor drucken? Bestimmt wird dir im Forum geholfen!

          Mehrfarbendruck

          Zu diesem Thema haben wir noch keine ausführliche Dokumentation, aber es gibt -einen Diskussionsfaden im Forum. Vielleicht hilft dir das schon weiter, -ansonsten kannst du gern dort deine Fragen und Ideen einbringen:

          https://forum.openbikesensor.org/t/mehrfarbiger-gehaeusedruck/111

          - \ No newline at end of file diff --git a/docs/classic/case/color-prints/index.html b/docs/classic/case/color-prints/index.html index 63d7371d..234d7ba5 100644 --- a/docs/classic/case/color-prints/index.html +++ b/docs/classic/case/color-prints/index.html @@ -1,20 +1,17 @@ -Logo-Druck (mehrfarbig) | OpenBikeSensor - - - -

          Logo-Druck (mehrfarbig)

          Ein Hauptgehäuse mit eingedrucktem Logo.

          Logo-Dateien

          Statt der Bauteile MainCase und MainCaseLid werden entsprechende Bauteile +Logo-Druck (mehrfarbig) | OpenBikeSensor +

          Logo-Druck (mehrfarbig)

          Ein Hauptgehäuse mit eingedrucktem Logo.

          Logo-Dateien

          Statt der Bauteile MainCase und MainCaseLid werden entsprechende Bauteile gedruckt, die geometrisch identisch sind, aber das Logo enthalten.

          Je nach Logo und Filamentwahl kann es sinnvoll sein, das Logo zu invertieren.

          • Normal: Das Logo hat eine andere Farbe als der Rest des Bauteils.
          • Invertiert: Die Grundfläche, auf der das Logo gedruckt wird, hat eine andere Farbe als der Rest des Bauteils. Das Logo hat die gleiche Farbe wie die Wände und das Innere des Bauteils.

          Je nach Drucktechnik sind pro Bauteil eine oder zwei Dateien notwendig, nämlich -das Logo an sich, und das Bauteil, aus dem das Logo herausgeschnitten wurde.

          • Main: Der Hauptteil des Bauteils ohne Logo, bzw. bei invertierten Logo -der Hauptteil mit Logo, aber ohne Grundfläche.
          • Highlight: Das Logo, das herausgeschnitten wurde, bzw. bei invertierten +das Logo an sich, und das Bauteil, aus dem das Logo herausgeschnitten wurde.

            • Main: Der Hauptteil des Bauteils ohne Logo, bzw. bei invertiertem Logo +der Hauptteil mit Logo, aber ohne Grundfläche.
            • Highlight: Das Logo, das herausgeschnitten wurde, bzw. bei invertiertem Logo die Grundfläche ohne Logo.

            Bezeichnungen der vier Dateien für den Logo-Druck des Hauptgehäuses (nur -das Gehäuse, nicht der Deckel).

            Jede dieser vier Dateien gibt es für das Hauptgehäuses und seinen Deckel, -insgesamt pro Logo also acht Dateien. Die vorgenerierten STL-Dateien für das +das Gehäuse, nicht der Deckel).

          Jede dieser vier Dateien gibt es für das Hauptgehäuse und seinen Deckel, +insgesamt pro Logo also acht Dateien. Die vor generierten STL-Dateien für das OpenBikeSensor-Logo werden ebenfalls auf GitHub veröffentlicht und liegen dort im Verzeichnis export/logo/OpenBikeSensor/.

          OpenSCAD Logo Generator

          Die Anleitung hierfür folgt demnächst. Möchtest du jetzt schon dein eigenes Logo auf einen OpenBikeSensor drucken? Bestimmt wird dir im Forum geholfen!

          Mehrfarbendruck

          Zu diesem Thema haben wir noch keine ausführliche Dokumentation, aber es gibt einen Diskussionsfaden im Forum. Vielleicht hilft dir das schon weiter, -ansonsten kannst du gern dort deine Fragen und Ideen einbringen:

          https://forum.openbikesensor.org/t/mehrfarbiger-gehaeusedruck/111


          Zuletzt geändert 06.02.2023: Move /docs/hardware section to /docs/classic in preparation for variants (b18fbb9)
          Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
          Druckansicht dieses Kapitels
          - \ No newline at end of file +ansonsten kannst du gern dort deine Fragen und Ideen einbringen:

          https://forum.openbikesensor.org/t/mehrfarbiger-gehaeusedruck/111

          Zuletzt geändert 20.01.2024: Fixed spelling, wording and updated number formatting (fce216f)

          Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
          \ No newline at end of file diff --git a/docs/classic/case/index.html b/docs/classic/case/index.html index 38e3e686..503273f0 100644 --- a/docs/classic/case/index.html +++ b/docs/classic/case/index.html @@ -1,25 +1,22 @@ -Gehäuse | OpenBikeSensorGehäuse | OpenBikeSensor + - - - -

          Gehäuse

          In das Gehäuse des OpenBikeSensor Classic werden die elektronischen Komponenten eingebaut. Es wird im 3D-Druck-Verfahren selbst gefertigt.

          OpenBikeSensor Gehäusebausatz (alte Version)

          Es gibt viele Möglichkeiten, ein Gehäuse für deinen OpenBikeSensor zu bekommen. +">

          +

          Gehäuse

          In das Gehäuse des OpenBikeSensor Classic werden die elektronischen Komponenten eingebaut. Es wird im 3D-Druck-Verfahren selbst gefertigt.

          OpenBikeSensor Gehäusebausatz (alte Version)

          Es gibt viele Möglichkeiten, ein Gehäuse für deinen OpenBikeSensor zu bekommen. Unter Umständen findest du in der Community hilfreiche Bastler:innen, die dir -ein Gehäuse herstellen – hierzu fragst du am besten im Forum nach.

          Eine andere Möglichkeit ist, einen lokalen Maker- oder Hackspace zu finden, in +ein Gehäuse herstellen – Frage hierzu am besten im Forum nach.

          Eine andere Möglichkeit ist, einen lokalen Maker- oder Hackspace zu finden, in dem 3D-Drucker und Know-How zur Verfügung stehen. Hierfür haben wir eine Anleitung mit allen Details für den Druck von OpenBikeSensor-Gehäuseteilen geschrieben.

          Natürlich kannst du die Elektronik auch in eine alte Plastikdose stecken und Löcher hineinbohren für Sensoren und Kabel. Das mag wesentlich einfacher sein und zum Ziel führen, ist aber im Betrieb eher unpraktisch. Du musst dir eine -Möglichkeit ausdenken, das ganze an dein Rad anzubringen und evtl. auch wieder +Möglichkeit ausdenken, das Ganze an dein Rad anzubringen und evtl. auch wieder abnehmbar zu machen, um das Gerät zu laden oder zu warten. Es ist also -natürlich möglich, aber am Ende schöner und praktiabler ist der 3D-Druck – es +natürlich möglich, aber am Ende ist der 3D-Druck schöner und praktikabler – es lohnt sich!

          Falls das Selbstdrucken dir zu aufwendig erscheint, oder du einfach keinen Zugang zu einem 3D-Drucker in deiner Nähe hast, sind vielleicht auch 3D-Druck-Dienstleister eine Option für dich. Diese drucken Teile nach deinen -Dateien Anweisungen als Auftragsarbeit. Preisgünstige Anbieter nehmen für ein +Dateien als Auftragsarbeit. Preisgünstige Anbieter nehmen für ein komplettes OpenBikeSensor-Gehäuse ca. 20-30 €. Wenn du dich mit anderen zu -Erfahrungen hiermit austauschen möchtest, ist das Forum der richtige Ort!

          Zuletzt geändert 07.02.2023: Page descriptions (f08cbaa)
          Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
          Druckansicht dieses Kapitels
          - \ No newline at end of file +Erfahrungen hiermit austauschen möchtest, ist das Forum der richtige Ort!


          Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
          \ No newline at end of file diff --git a/docs/classic/case/parts/index.html b/docs/classic/case/parts/index.html index 9d55455a..3ae279cd 100644 --- a/docs/classic/case/parts/index.html +++ b/docs/classic/case/parts/index.html @@ -1,17 +1,15 @@ -Gehäusebauteile | OpenBikeSensor - - - -

          Gehäusebauteile

          Hier möchten wir eine Übersicht über alle verfügbaren Gehäusebauteile geben. +Gehäusebauteile | OpenBikeSensor +

          Gehäusebauteile

          Hier möchten wir eine Übersicht über alle verfügbaren Gehäusebauteile geben. Die Links führen jeweils zur Quelldatei (OpenSCAD) und zum STL-Export für den 3D-Druck. Alle Dateien lassen sich auch auf einmal herunterladen, direkt von -Github in der neuesten Version als ZIP-Archiv. Darin finden sich im Ordner -export alle Dateien für den 3D-Druck:

          \ No newline at end of file diff --git a/docs/classic/case/printing/_print/index.html b/docs/classic/case/printing/_print/index.html deleted file mode 100644 index caad3fff..00000000 --- a/docs/classic/case/printing/_print/index.html +++ /dev/null @@ -1,114 +0,0 @@ -Gehäusedruck | OpenBikeSensor - - - -

          Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

          Zur Standardansicht zurückkehren.

          Gehäusedruck

            In dieser Anleitung geht es darum, ein komplettes Gehäuse mit Halterungen -selbst zu drucken und herzustellen. Der Druck eines kompletten -OpenBikeSensor-Gehäusesatzes, oder auch nur von Teilen davon, ist problemlos -möglich, vorausgesetzt du hast einen 3D-Drucker zur Verfügung.

            Der 3D-Druck kostet ca. 5 € Material (Filamentkosten können variieren), -Verschleiß, Stromkosten und vor allem Zeit, ca. 10-20h Druckzeit muss man schon -einplanen.

            Drucker und Slicer

            Der Ultimaker 3 hat ein Displaygehäuse mit Zugentlastung fertig gedruckt.

            Für den Beispieldruck in dieser Anleitung verwenden wir einen Ultimaker 3. -Dieser hat zwei Extruder, sodass mit zwei Filamenten gleichzeitig gedruckt -werden kann. Das vereinfacht den Druck des Sensorgehäuses und des Deckels, da -für die Logos eine zusätzliche Farbe verwendet werden kann. Bei einem Drucker -mit nur einem Extruder muss während des Drucks das Filament gewechselt werden. -Hierfür gibt es verschiedene Strategien, die je nach Drucker, Firmware und -Slicer variieren. Alternativ können alle Teile auch einfach ohne Logo mit nur -einem Filament gedruckt werden.

            Wichtig ist die Slicer-Software, die den Druck für den jeweiligen Drucker -aufbereitet. Für den Ultimaker (und viele andere Drucker) kann Cura von der -offiziellen Website -heruntergeladen und kostenlos verwendet werden (für Linux, Windows und macOS). -Eine starke Alternative ist der Prusa -Slicer. Die Wahl des Slicers hängt von -persönlicher Präferenz und den unterstützten Druckern ab, sowie in -Spezialfällen den unterstützten Features. Beide Slicer eignen sich für den -Druck von OpenBikeSensor-Gehäuseteilen.

            Material und Farben

            Das empfohlene Material für den Druck der Gehäuseteile ist PETG, das Material -mit den meisten Vorteile für unser Projekt:

            • hohe Schlagfestigkeit und dennoch flexibel – wichtig für den Einsatz am Fahrrad
            • hydrophob, wasserabweisend, witterungsbeständig – wichtig für Außeneinsatz
            • geruchsneutrales Drucken – erleichtert das Drucken auch zu Hause
            • niedrige Viskosität (Zähigkeit)
            • verfügbar in vielen verschiedenen Farben, sogar transparent

            Nachteilig ist allerdings die UV Beständigkeit, die nicht so hoch ist wie bei -ABS oder ASA. Doch die Vorteile überwiegen diese Einschränkung.

            Beispiel eines gedruckten Gehäuses mit Logos

            Druckvorbereitung

            Alle Dateien für das OpenBikeSensor Projekt wie Software, Firmware, Dokumentation und auch die 3D-Druckdateien liegen auf GitHub. Das Repository für die Gehäusedaten ist:

            Die Gehäuselemente werden unterschieden in die Bestandteile

            • Hauptgehäuse (MainCase)
            • Displaygehäuse (DisplayCase)
            • Halterungen (Mounting)

            Ein ZIP-Archiv mit allen aktuellen Dateien, sowohl dem Quelltext als auch den -exportierten STL-Dateien für den 3D-Druck können von GitHub direkt -heruntergeladen werden:

            Im Archiv befindet sich ein Ordner export/ mit den obigen Kategorien, und -darin sind jeweils die STL-Dateien für den Slicer zu finden.

            Allgemeines Vorgehen

            Der Import einer STL-Datei in eine Slicer Software (wie z.B. Cura) ist der -erste Schritt um ein 3D Objekt zu drucken. Im Slicer wird das 3D-Objekt so auf -die Druckplatte gelegt, sodass es möglichst wenig Überhänge gibt:

            1. So sollte es aussehen, kann aber in dieser Lage so nicht gedruckt werden2. Drucken mit dem Gesicht nach unten

            Die STL-Dateien werden in der Regel so generiert, dass sie nach dem importieren -bereits in der empfohlenen Lage auf dem Druckbett liegen. Auf Support kannst du -dann in der Regel verzichten, denn bei der Modellierung wird bereits die -supportfreie Druckbarkeit beachtet. Du kannst dich natürlich auch anders -entscheiden und die Objekte drehen, sollte dein Drucker oder Slicer sonst keine -guten Ergebnisse liefern.

            Als nächstes werden der richtige Drucker, das Filament und die -Druckeinstellungen (Infull, Support, Geschwindigkeit, Schichtdicke, …) -gewählt. Hier gilt, dass du dich am besten an den Vorgaben der Hersteller (von -Drucker und Filament) orientierst, aber auch immer ein bisschen experimentierst -und die für dich und deinen Anwendungsfall richtigen Einstellungen findest. -Informationsmaterial, Anleitungen und Tutorials gibt es massenweise im Netz.

            1. Cura view auf main case im Vorbereitungsmode2. Einstellung auf PETG und 2 Extruder3. Settings für Druckdichte (Infill), Support, Düsendurchmesser4. starte Slicing

            Beim eigentlichen “Slicen” erstellt Cura nun eine GCODE-Datei, die alle Befehle -für den speziellen Drucker und das Material enthält (z.B. Bewegungen, -Temperaturen, etc.).

            1. Nachdem alle Einstellungen erfolgt sind, wird das Slicing gestartet 2. Slicing information gibt es im Preview, mit den beiden Schiebern unten und rechts kann man jede einzelne Bahn des Extruders verfolgen

            Die GCODE-Datei wird nun auf den 3D-Drucker übertragen. Je nach Druckermodell -geschieht dies über WLAN, mithilfe einer SD-Karte oder eines USB-Sticks, oder -der Drucker ist direkt (per USB) am PC angeschlossen. Das genaue Verfahren ist -im Handbuch des Druckers vermutlich beschrieben.

            Im Menü des Druckers wird die erstellte GCODE-Datei für den Druck ausgewählt -und der Druck gestartet. Ab hier übernimmt der Roboter die Arbeit für uns, und -wenn wir alles richtig eingestellt haben, ist in einigen Minuten bis Stunden -ein neues Gehäuseteil fertig.

            Hauptgehäuse

            Das Hauptgehäuse enthält den Großteil der Elektronik (PCB, Sensorboards, -SD-Karte, GPS, Hauptschalter, Ladeelektronik) sowie die zwei Abstandssensoren, -die GPS-Antenne und die Batterie.

            Sowohl das Hauptteil als auch der Deckel können mit einem Logo gedruckt werden. -Dies ist ein wenig mehr Aufwand, lohnt sich aber optisch sehr, und es hilft -erfahrungsgemäß auch dabei, auf der Straße auf das Gerät angesprochen zu werden -und dem Projekt mehr Aufmerksamkeit zu generieren. Details zum Druck des Logos findest du hier: Logo-Druck (mehrfarbig).

            Die Teile zum Drucken:

            Die ersten zwei Teile gibt es jeweils auch mit OpenBikeSensor-Logo. Für jedes -Bauteil sind hierfür vier Dateien verfügbar. Das Logo kann invertiert oder -normal gedruckt werden, und für den Zweifarben-Druck sind pro Bauteil zwei -Dateien nötig (main und highlight), die die in der jeweiligen Farbe zu -druckenden Bestandteile repräsentieren. Hier sind demnach alle acht Dateien für das -OBS-Logo.

            Das Bauteil StandardMountAdapter gehört zwar eigentlich zu den Halterungen, -wird aber fest am Hauptgehäuse angebracht und bildet eine Hälfte des -Befestigungsmechanismus. Es gehört also auch irgendwie zum Hauptgehäuse.

            Das Bauteil AttachmentCover verschließt die Öffnung des Standardgehäuses, -an der nicht die Halteklammer montiert wird. Dieses Teil wird nicht benötigt, -wenn das Gehäuse ohne zweite Öffnung verwendet wird.

            Die Bauteile des Hauptgehäuses auf dem Druckbett

            Fahrradhalterung

            Zwei Halterungen, das SeatPostMount und eine alte Variante des TopTubeMount.

            Es gibt verschiedene Möglichkeiten, den OBS Sensor am Fahrrad zu montieren. Wie die Halterungen angebracht werden und aussehen, ist in der Montageanleitung zu sehen.

            1. Standard: Sattelhalterung, an der Sattelstange hinter -dem/der Fahrer:in montiert.
            2. Oberrohr-Halterung: Wenn die Sattelhalterungen nicht -verwendbar sind, kann die Montage weiter vorne an der Querstange erfolgen.
            3. Gepäckträgerhalterung: Dreiteilig, wird mit etwas Rundstab oder -Alu-Rundprofil verbunden. Kann auf, unter oder hinter dem Gepäckträger -montiert werden.

            Außerdem nötig ist ein Sicherungsstift (LockingPin). Das Display wird mit der -dazugehörigen Schiene (Mounting/HandlebarRail) am Lenker befestigt.

            Lage dreier Halterungen und des Sicherungspin auf dem Druckbett (die -verlängerte Variante kann parametrisch mit OpenSCAD erstellt werden). Der -LockingPin sollte jedoch lieber stehend gedruckt werden.

            Displaygehäuse (Anzeige und Knopf)

            Im Displaygehäuse sind nur das Display und der Knopf verbaut. Die nötigen Bauteile sind:

            In die Vertiefung der zwei Gehäusehälften werden zwei Magnete eingelegt, die -das Display während der Fahrt an der Schiene (HandlebarRail, siehe -“Fahrradhalterung” oben) halten.

            Fertiges Displaygehäuse (alte Version)

            Materialverbrauch und Zeitbedarf

            Nach dem Slicen wird angezeigt, wie lange der Druckvorgang dauern wird und wie -viel Material für den Druck benötigt wird. Abhängig von den Einstellungen kann -die Druckdauer sehr unterschiedlich sein. Oft geht mit mehr -Druckgeschwindigkeit ein Qualitätsverlust einher, sodass die beiden -gegeneinander abgewogen werden müssen.

            Üblich für den Druck eines ganzen Gehäuses ist daher je nach Drucker etwa 10 -Stunden in Summe. Die Kosten des Filaments belaufen sich auf ca. 3 €, wer -Verschleiß und Stromkosten einrechnet kommt auf etwa 5 € Gesamtkosten.

            Troubleshooting

            Lage der Druckteile und Überhänge

            Beim Druck der Gehäuseteile ist die Lage des Teiles wichtig, denn Überhänge -sollten vermieden werden, sodass der Drucker nicht in der luft drucken muss. -Das Design der Modelle ist bereits darauf ausgelegt, möglichst gut druckbar zu -sein, die Positionierung auf dem Druckbett ist daher auch besonders wichtig.

            Nach dem Laden der STL-Dateien in Cura werden in der Vorschau die Überhänge in -rot angezeigt. Am Beispiel des Deckels (Bilder 1 und 2) ist es sehr -offensichtlich das die Lage eine wesentliche Rolle spielt, wie herum das Teil -auf die Druckerplatte gelegt werden soll.

            Aber selbst bei einer optimalen Lage wie im Beispiel des Sensorgehäuses zeigt -Cura wo sich trotzdem noch Überhänge bilden. Manche Überhänge wie -Schraubenlöcher sind unkritisch da der Drucker das selbst überbrücken kann -(bridging). Doch wenn der Übergang zu groß wird können sich viele Fäden -ziehen. Um das zu vermeiden kann die Supportfunktion eingeschalten werden, der -Drucker erstellt dann leichte Stützstrukturen, die nach dem Druck wieder -entfernt werden.

            1. Schlechte Positionierung erzeugt Überhänge (rot)2. Richtiges Positionieren ist wichtig3. In der Vorschau werden bereits in rot Überhänge angezeigt4. Support einschalten5. Die zusätzliche Supportstruktur ist nach dem Slicing in der Vorschau sichtbar

            Fehlerhafte Drucke

            Einige Fehler traten während der Drucke auf:

            Support fehlt, Düse vom 2. Extruder verstopft

            Brüchige Verbindung, vermutlich Druckdichte (Infill) zu gering

            Weitere Anleitungen

            • Detaillierte Anleitung für den Zusammenbau des gesamten -OpenBikeSensors beschreibt den Einbau der elektronischen Komponenten in die -beiden Gehäuse.
            • Die Montage des Sensors am Fahrrad wird mit -verschiedenen Halterungen und für das Displaygehäuse gezeigt.
            - \ No newline at end of file diff --git a/docs/classic/case/printing/index.html b/docs/classic/case/printing/index.html index 8968a558..9e4633c6 100644 --- a/docs/classic/case/printing/index.html +++ b/docs/classic/case/printing/index.html @@ -1,21 +1,19 @@ -Gehäusedruck | OpenBikeSensor - - - -

            Gehäusedruck

            In dieser Anleitung geht es darum, ein komplettes Gehäuse mit Halterungen +Gehäusedruck | OpenBikeSensor +

            Gehäusedruck

            In dieser Anleitung geht es darum, ein komplettes Gehäuse mit Halterungen selbst zu drucken und herzustellen. Der Druck eines kompletten OpenBikeSensor-Gehäusesatzes, oder auch nur von Teilen davon, ist problemlos möglich, vorausgesetzt du hast einen 3D-Drucker zur Verfügung.

            Der 3D-Druck kostet ca. 5 € Material (Filamentkosten können variieren), Verschleiß, Stromkosten und vor allem Zeit, ca. 10-20h Druckzeit muss man schon einplanen.

            Drucker und Slicer

            Der Ultimaker 3 hat ein Displaygehäuse mit Zugentlastung fertig gedruckt.

            Für den Beispieldruck in dieser Anleitung verwenden wir einen Ultimaker 3. Dieser hat zwei Extruder, sodass mit zwei Filamenten gleichzeitig gedruckt @@ -33,41 +31,43 @@ persönlicher Präferenz und den unterstützten Druckern ab, sowie in Spezialfällen den unterstützten Features. Beide Slicer eignen sich für den Druck von OpenBikeSensor-Gehäuseteilen.

            Material und Farben

            Das empfohlene Material für den Druck der Gehäuseteile ist PETG, das Material -mit den meisten Vorteile für unser Projekt:

            • hohe Schlagfestigkeit und dennoch flexibel – wichtig für den Einsatz am Fahrrad
            • hydrophob, wasserabweisend, witterungsbeständig – wichtig für Außeneinsatz
            • geruchsneutrales Drucken – erleichtert das Drucken auch zu Hause
            • niedrige Viskosität (Zähigkeit)
            • verfügbar in vielen verschiedenen Farben, sogar transparent

            Nachteilig ist allerdings die UV Beständigkeit, die nicht so hoch ist wie bei -ABS oder ASA. Doch die Vorteile überwiegen diese Einschränkung.

            Beispiel eines gedruckten Gehäuses mit Logos

            Druckvorbereitung

            Alle Dateien für das OpenBikeSensor Projekt wie Software, Firmware, Dokumentation und auch die 3D-Druckdateien liegen auf GitHub. Das Repository für die Gehäusedaten ist:

            Die Gehäuselemente werden unterschieden in die Bestandteile

            • Hauptgehäuse (MainCase)
            • Displaygehäuse (DisplayCase)
            • Halterungen (Mounting)

            Ein ZIP-Archiv mit allen aktuellen Dateien, sowohl dem Quelltext als auch den +mit den meisten Vorteilen für unser Projekt:

            • hohe Schlagfestigkeit und dennoch flexibel – wichtig für den Einsatz am Fahrrad
            • hydrophob, wasserabweisend, witterungsbeständig – wichtig für Außeneinsatz
            • geruchsneutrales Drucken – erleichtert das Drucken auch zu Hause
            • niedrige Viskosität (Zähigkeit)
            • verfügbar in vielen verschiedenen Farben, sogar transparent

            Nachteilig ist allerdings die UV Beständigkeit, die nicht so hoch ist wie bei +ABS oder ASA. Doch die Vorteile überwiegen diese Einschränkung.

            Beispiel eines gedruckten Gehäuses mit Logos

            Druckvorbereitung

            Alle Dateien für das OpenBikeSensor Projekt wie Software, Firmware, Dokumentation und auch die 3D-Druckdateien liegen auf GitHub. +Das Repository für die Gehäusedaten ist: openbikesensor/OpenBikeSensor3dPrintableCase

            Die Gehäuseelemente werden unterschieden in die Bestandteile

            • Hauptgehäuse (MainCase)
            • Displaygehäuse (DisplayCase)
            • Halterungen (Mounting)

            Ein ZIP-Archiv mit allen aktuellen Dateien, sowohl dem Quelltext als auch den exportierten STL-Dateien für den 3D-Druck können von GitHub direkt -heruntergeladen werden:

            Im Archiv befindet sich ein Ordner export/ mit den obigen Kategorien, und -darin sind jeweils die STL-Dateien für den Slicer zu finden.

            Allgemeines Vorgehen

            Der Import einer STL-Datei in eine Slicer Software (wie z.B. Cura) ist der erste Schritt um ein 3D Objekt zu drucken. Im Slicer wird das 3D-Objekt so auf -die Druckplatte gelegt, sodass es möglichst wenig Überhänge gibt:

            1. So sollte es aussehen, kann aber in dieser Lage so nicht gedruckt werden2. Drucken mit dem Gesicht nach unten

            Die STL-Dateien werden in der Regel so generiert, dass sie nach dem importieren +die Druckplatte gelegt, sodass es möglichst wenig Überhänge gibt:

            1. So sollte es aussehen, kann aber in dieser Lage so nicht gedruckt werden2. Drucken mit dem Gesicht nach unten

            Die STL-Dateien werden in der Regel so generiert, dass sie nach dem Importieren bereits in der empfohlenen Lage auf dem Druckbett liegen. Auf Support kannst du dann in der Regel verzichten, denn bei der Modellierung wird bereits die supportfreie Druckbarkeit beachtet. Du kannst dich natürlich auch anders entscheiden und die Objekte drehen, sollte dein Drucker oder Slicer sonst keine -guten Ergebnisse liefern.

            Als nächstes werden der richtige Drucker, das Filament und die +guten Ergebnisse liefern.

            Als Nächstes werden der richtige Drucker, das Filament und die Druckeinstellungen (Infull, Support, Geschwindigkeit, Schichtdicke, …) gewählt. Hier gilt, dass du dich am besten an den Vorgaben der Hersteller (von Drucker und Filament) orientierst, aber auch immer ein bisschen experimentierst und die für dich und deinen Anwendungsfall richtigen Einstellungen findest. Informationsmaterial, Anleitungen und Tutorials gibt es massenweise im Netz.

            1. Cura view auf main case im Vorbereitungsmode2. Einstellung auf PETG und 2 Extruder3. Settings für Druckdichte (Infill), Support, Düsendurchmesser4. starte Slicing

            Beim eigentlichen “Slicen” erstellt Cura nun eine GCODE-Datei, die alle Befehle für den speziellen Drucker und das Material enthält (z.B. Bewegungen, -Temperaturen, etc.).

            1. Nachdem alle Einstellungen erfolgt sind, wird das Slicing gestartet 2. Slicing information gibt es im Preview, mit den beiden Schiebern unten und rechts kann man jede einzelne Bahn des Extruders verfolgen

            Die GCODE-Datei wird nun auf den 3D-Drucker übertragen. Je nach Druckermodell +Temperaturen, etc.).

            1. Nachdem alle Einstellungen erfolgt sind, wird das Slicing gestartet2. Slicing information gibt es im Preview, mit den beiden Schiebern unten und rechts kann man jede einzelne Bahn des Extruders verfolgen

            Die GCODE-Datei wird nun auf den 3D-Drucker übertragen. Je nach Druckermodell geschieht dies über WLAN, mithilfe einer SD-Karte oder eines USB-Sticks, oder der Drucker ist direkt (per USB) am PC angeschlossen. Das genaue Verfahren ist -im Handbuch des Druckers vermutlich beschrieben.

            Im Menü des Druckers wird die erstellte GCODE-Datei für den Druck ausgewählt -und der Druck gestartet. Ab hier übernimmt der Roboter die Arbeit für uns, und +im Handbuch des Druckers beschrieben.

            Im Menü des Druckers wird die erstellte GCODE-Datei für den Druck ausgewählt +und der Druck gestartet. Ab hier übernimmt der Roboter die Arbeit für uns und wenn wir alles richtig eingestellt haben, ist in einigen Minuten bis Stunden ein neues Gehäuseteil fertig.

            Hauptgehäuse

            Das Hauptgehäuse enthält den Großteil der Elektronik (PCB, Sensorboards, SD-Karte, GPS, Hauptschalter, Ladeelektronik) sowie die zwei Abstandssensoren, -die GPS-Antenne und die Batterie.

            Sowohl das Hauptteil als auch der Deckel können mit einem Logo gedruckt werden. +die GPS-Antenne und die Batterie.

            Sowohl das Hauptgehäuse als auch der Deckel können mit einem Logo gedruckt werden. Dies ist ein wenig mehr Aufwand, lohnt sich aber optisch sehr, und es hilft erfahrungsgemäß auch dabei, auf der Straße auf das Gerät angesprochen zu werden -und dem Projekt mehr Aufmerksamkeit zu generieren. Details zum Druck des Logos findest du hier: Logo-Druck (mehrfarbig).

            Displaygehäuse (Anzeige und Knopf)

            Im Displaygehäuse sind nur das Display und der Knopf verbaut. Die nötigen Bauteile sind:

            In die Vertiefung der zwei Gehäusehälften werden zwei Magnete eingelegt, die das Display während der Fahrt an der Schiene (HandlebarRail, siehe “Fahrradhalterung” oben) halten.

            Fertiges Displaygehäuse (alte Version)

            Materialverbrauch und Zeitbedarf

            Nach dem Slicen wird angezeigt, wie lange der Druckvorgang dauern wird und wie viel Material für den Druck benötigt wird. Abhängig von den Einstellungen kann -die Druckdauer sehr unterschiedlich sein. Oft geht mit mehr -Druckgeschwindigkeit ein Qualitätsverlust einher, sodass die beiden +die Druckdauer sehr unterschiedlich sein. Oft geht mit höherer +Druckgeschwindigkeit ein Qualitätsverlust einher, sodass beide gegeneinander abgewogen werden müssen.

            Üblich für den Druck eines ganzen Gehäuses ist daher je nach Drucker etwa 10 Stunden in Summe. Die Kosten des Filaments belaufen sich auf ca. 3 €, wer -Verschleiß und Stromkosten einrechnet kommt auf etwa 5 € Gesamtkosten.

            Troubleshooting

            Lage der Druckteile und Überhänge

            Beim Druck der Gehäuseteile ist die Lage des Teiles wichtig, denn Überhänge +Verschleiß und Stromkosten einrechnet, kommt auf etwa 5 € Gesamtkosten.

            Troubleshooting

            Lage der Druckteile und Überhänge

            Beim Druck der Gehäuseteile ist die Lage des Teiles wichtig, denn Überhänge sollten vermieden werden, sodass der Drucker nicht in der luft drucken muss. Das Design der Modelle ist bereits darauf ausgelegt, möglichst gut druckbar zu sein, die Positionierung auf dem Druckbett ist daher auch besonders wichtig.

            Nach dem Laden der STL-Dateien in Cura werden in der Vorschau die Überhänge in -rot angezeigt. Am Beispiel des Deckels (Bilder 1 und 2) ist es sehr -offensichtlich das die Lage eine wesentliche Rolle spielt, wie herum das Teil -auf die Druckerplatte gelegt werden soll.

            Aber selbst bei einer optimalen Lage wie im Beispiel des Sensorgehäuses zeigt +Rot angezeigt. Am Beispiel des Deckels (Bilder 1 und 2) ist es sehr +offensichtlich, dass die Lage eine wesentliche Rolle spielt, und zeigt, mit welcher Seite +das Teil auf die Druckerplatte gelegt werden soll.

            Aber selbst bei einer optimalen Lage wie im Beispiel des Sensorgehäuses zeigt Cura wo sich trotzdem noch Überhänge bilden. Manche Überhänge wie -Schraubenlöcher sind unkritisch da der Drucker das selbst überbrücken kann -(bridging). Doch wenn der Übergang zu groß wird können sich viele Fäden -ziehen. Um das zu vermeiden kann die Supportfunktion eingeschalten werden, der +Schraubenlöcher sind unkritisch, da der Drucker das selbst überbrücken kann +(bridging). Wenn der Übergang aber zu groß wird, können sich viele Fäden +ziehen. Um das zu vermeiden, kann die Supportfunktion eingeschalten werden, der Drucker erstellt dann leichte Stützstrukturen, die nach dem Druck wieder -entfernt werden.

            1. Schlechte Positionierung erzeugt Überhänge (rot)2. Richtiges Positionieren ist wichtig3. In der Vorschau werden bereits in rot Überhänge angezeigt4. Support einschalten5. Die zusätzliche Supportstruktur ist nach dem Slicing in der Vorschau sichtbar

            Fehlerhafte Drucke

            Einige Fehler traten während der Drucke auf:

            Support fehlt, Düse vom 2. Extruder verstopft

            Brüchige Verbindung, vermutlich Druckdichte (Infill) zu gering

            Weitere Anleitungen

            • Detaillierte Anleitung für den Zusammenbau des gesamten +entfernt werden.

              1. Schlechte Positionierung erzeugt Überhänge (rot)2. Richtiges Positionieren ist wichtig3. In der Vorschau werden bereits in Rot Überhänge angezeigt4. Support einschalten5. Die zusätzliche Supportstruktur ist nach dem Slicing in der Vorschau sichtbar

              Fehlerhafte Drucke

              Einige Fehler traten während der Drucke auf:

              Support fehlt, Düse vom 2. Extruder verstopft

              Brüchige Verbindung, vermutlich Druckdichte (Infill) zu gering

              Weitere Anleitungen

              • Detaillierte Anleitung für den Zusammenbau des gesamten OpenBikeSensors beschreibt den Einbau der elektronischen Komponenten in die beiden Gehäuse.
              • Die Montage des Sensors am Fahrrad wird mit -verschiedenen Halterungen und für das Displaygehäuse gezeigt.

              Zuletzt geändert 06.02.2023: Move /docs/hardware section to /docs/classic in preparation for variants (b18fbb9)
              Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
              Druckansicht dieses Kapitels
            - \ No newline at end of file +verschiedenen Halterungen und für das Displaygehäuse gezeigt.
            Zuletzt geändert 20.01.2024: Small fixes. (df948e6)

            Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
            \ No newline at end of file diff --git a/docs/classic/case/variants/_print/index.html b/docs/classic/case/variants/_print/index.html deleted file mode 100644 index d70395d9..00000000 --- a/docs/classic/case/variants/_print/index.html +++ /dev/null @@ -1,47 +0,0 @@ -Gehäusevarianten | OpenBikeSensor - - - -

            Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

            Zur Standardansicht zurückkehren.

            Gehäusevarianten

              Top Rider / Back Rider

              Das Hauptgehäuse kann als “Top Rider” oder “Back Rider” konfiguriert werden, -oder beides gleichzeitig. Dies definiert, welche Montagepunkte verfügbar sind.

              Ein “Top Rider” Hauptgehäuse hat den Montagepunkt unten (wenn am Rad montiert), -wohingegen ein “Back Rider” ihn vorn hat. Alte Modelle des OpenBikeSensors -waren somit alle “Back Rider”, denn sie wurden immer an der Sattelstütze -montiert, horizontal dahinter hängend.

              Da viele Radfahrende ihre Räder so einstellen, dass hier nicht genug Platz für -einen OpenBikeSensor bleibt, wurde die Variante “Top Rider” mit entsprechenden -Halterungen eingeführt. Top Rider OBS sitzen auf dem Oberrohr, dem -Gepäckträger, oder überall wo unter ihnen Platz für eine Halterung ist. Der -nach unten zeigende Montagepunkt macht das wesentlich stabiler als eine -Halterung, die “um die Ecke” gehen muss, um eine Schiene anzubieten, die nach -hinten zeigt.

              Die Montagepunkte am Hauptgehäuse.

              Ein Gehäuse kann sowohl Top Rider als auch Back Rider gleichzeitig sein. Auf -jeden der Montagepunkte passt der StandardMountAdapter (siehe -Gehäusebauteile). Ein ungenutzter Montagepunkt -sollte mit dem AttachmentCover abgedeckt werden, um die Löcher zu schließen.

              Die Parametrierung erfolgt über die OpenSCAD-Variablen

              MainCase_back_rider
              -MainCase_top_rider
              -MainCase_back_rider_cable
              -MainCase_top_rider_cable
              -

              Ein Adapter (Mounting/BackRiderTopRiderAdapter) ist verfügbar für (ältere) -Geräte, die nur Back Rider sind, aber auf einer Top Rider Halterung angebracht -werden sollen. Das Gegenteil davon haben wir (noch) nicht entworfen.

              OpenSCAD Schnellstart

              OpenSCAD ermöglicht die parametrische Erstellung von 3D-Modellen mit Code. Den -Code haben wir geschrieben, die Parameter kannst du ändern. Damit gibt es jede -Menge Anpassungsmöglichkeiten für jeden Anwendungsfall.

              Die STL-Dateien werden anhand der SCAD-Dateien erzeugt, die alle im -GitHub-Repository -liegen. Am besten benutzt du git, um dir eine Kopie herunterzuladen -(clone), und dann kannst du die Parameter ändern:

              git clone --recurse-submodules https://github.com/openbikesensor/OpenBikeSensor3dPrintableCase
              -cd OpenBikeSensor3dPrintableCase
              -

              Jetzt kannst du die Datei variables.scad anpassen und deine gewünschten Werte -setzen (z. B. MainCase_back_rider, siehe oben).

              Die einzelnen Bauteile aus dem Ordner src/ kannst du dann mit dem Programm -OpenSCAD (das du direkt von seiner Website -herunterladen oder mit deinem -Paketmanager installieren kannst) anschauen. Einzelne Bauteile kannst du darin -auch rendern (F6) und danach als STL exportieren (F7).

              Wenn du alle Teile neu generieren möchtest, kannst du auch in deinem Terminal -make eingeben. Dies erzeugt alle geänderten Bauteile neu, möchtest du alle -neu erstellen, hilft vorher ein make clean. Diese Bauteile werden dann nach -export/... exportiert und überschreiben die dort vorhandenen STL-Dateien. Es -dauert jedoch eine Weile die ganzen Geometrien zu berechnen, erwarte etwa 2-20 -Minuten, je nachdem wie schnell dein Rechner ist.

              - \ No newline at end of file diff --git a/docs/classic/case/variants/index.html b/docs/classic/case/variants/index.html index c4d8616d..9014febc 100644 --- a/docs/classic/case/variants/index.html +++ b/docs/classic/case/variants/index.html @@ -1,8 +1,6 @@ -Gehäusevarianten | OpenBikeSensor - - - -

              Gehäusevarianten

              Top Rider / Back Rider

              Das Hauptgehäuse kann als “Top Rider” oder “Back Rider” konfiguriert werden, +Gehäusevarianten | OpenBikeSensor +

              Gehäusevarianten

              Top Rider / Back Rider

              Das Hauptgehäuse kann als “Top Rider” oder “Back Rider” konfiguriert werden, oder beides gleichzeitig. Dies definiert, welche Montagepunkte verfügbar sind.

              Ein “Top Rider” Hauptgehäuse hat den Montagepunkt unten (wenn am Rad montiert), wohingegen ein “Back Rider” ihn vorn hat. Alte Modelle des OpenBikeSensors waren somit alle “Back Rider”, denn sie wurden immer an der Sattelstütze @@ -15,7 +13,7 @@ hinten zeigt.

              Die Montagepunkte am Hauptgehäuse.

              Ein Gehäuse kann sowohl Top Rider als auch Back Rider gleichzeitig sein. Auf jeden der Montagepunkte passt der StandardMountAdapter (siehe Gehäusebauteile). Ein ungenutzter Montagepunkt -sollte mit dem AttachmentCover abgedeckt werden, um die Löcher zu schließen.

              Die Parametrierung erfolgt über die OpenSCAD-Variablen

              MainCase_back_rider
              +sollte mit dem AttachmentCover abgedeckt werden, um das Loch zu schließen.

              Die Parametrierung erfolgt über die OpenSCAD-Variablen

              MainCase_back_rider
               MainCase_top_rider
               MainCase_back_rider_cable
               MainCase_top_rider_cable
              @@ -26,11 +24,11 @@
               Menge Anpassungsmöglichkeiten für jeden Anwendungsfall.

              Die STL-Dateien werden anhand der SCAD-Dateien erzeugt, die alle im GitHub-Repository liegen. Am besten benutzt du git, um dir eine Kopie herunterzuladen -(clone), und dann kannst du die Parameter ändern:

              git clone --recurse-submodules https://github.com/openbikesensor/OpenBikeSensor3dPrintableCase
              +(clone), dann kannst du die Parameter ändern:

              git clone --recurse-submodules https://github.com/openbikesensor/OpenBikeSensor3dPrintableCase
               cd OpenBikeSensor3dPrintableCase
               

              Jetzt kannst du die Datei variables.scad anpassen und deine gewünschten Werte setzen (z. B. MainCase_back_rider, siehe oben).

              Die einzelnen Bauteile aus dem Ordner src/ kannst du dann mit dem Programm @@ -38,9 +36,8 @@ herunterladen oder mit deinem Paketmanager installieren kannst) anschauen. Einzelne Bauteile kannst du darin auch rendern (F6) und danach als STL exportieren (F7).

              Wenn du alle Teile neu generieren möchtest, kannst du auch in deinem Terminal -make eingeben. Dies erzeugt alle geänderten Bauteile neu, möchtest du alle +make eingeben. Dies erzeugt alle geänderten Bauteile neu. Möchtest du alle neu erstellen, hilft vorher ein make clean. Diese Bauteile werden dann nach export/... exportiert und überschreiben die dort vorhandenen STL-Dateien. Es dauert jedoch eine Weile die ganzen Geometrien zu berechnen, erwarte etwa 2-20 -Minuten, je nachdem wie schnell dein Rechner ist.


              Zuletzt geändert 06.02.2023: Move /docs/hardware section to /docs/classic in preparation for variants (b18fbb9)
              Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
              Druckansicht dieses Kapitels
              - \ No newline at end of file +Minuten, je nachdem wie schnell dein Rechner ist.


              Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
              \ No newline at end of file diff --git a/docs/classic/general/collective-order/index.html b/docs/classic/general/collective-order/index.html index 16535507..14b87d51 100644 --- a/docs/classic/general/collective-order/index.html +++ b/docs/classic/general/collective-order/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/other/collective-order/ \ No newline at end of file +https://www.openbikesensor.org/docs/other/collective-order/ + \ No newline at end of file diff --git a/docs/classic/index.html b/docs/classic/index.html index 8d366186..e75b7667 100644 --- a/docs/classic/index.html +++ b/docs/classic/index.html @@ -1,6 +1,3 @@ -OpenBikeSensor Classic | OpenBikeSensor - - - -

              OpenBikeSensor Classic


              Überblick

              Der OpenBikeSensor Classic ist das Originalgerät, das seit 2018 in ehrenamtlicher Arbeit von vielen Beteiligten als Open Hardware Design entworfen und entwickelt wird.

              Bauteile

              Diese Seite listet alle Bauteile auf, die bestellt oder hergestellt werden müssen, um einen OpenBikeSensor Classic zusammenzubauen.

              Platine

              Die Hauptplatine des OpenBikeSensor Classic verbindet alle Module und elektronisch Einzelbauteile miteinander. Hier beschreiben wir, wie du eine solche Platine bekommst.

              Gehäuse

              In das Gehäuse des OpenBikeSensor Classic werden die elektronischen Komponenten eingebaut. Es wird im 3D-Druck-Verfahren selbst gefertigt.

              Bauanleitung (OpenBikeSensor Classic 1.0.0)

              Sobald der Bausatz für den OpenBikeSensor Classic zusammengestellt ist, kann anhand dieser Anleitung der Bau begonnen werden. Der Zusammenbau besteht aus einer Menge Lötarbeit, sowie dem Test der Elektronik und dem Einbau in das Gehäuse.

              Fehlersuche

              Dieser Bereich enthält Anleitungen und Links zu Informationen, die bei bekannten Schwierigkeiten und Problemen Abhilfe schaffen könnten.

              Zuletzt geändert 06.02.2023: Fix menu for classic (9fbbdaa)
              Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
              Druckansicht dieses Kapitels
              - \ No newline at end of file +OpenBikeSensor Classic | OpenBikeSensor +
              +

              OpenBikeSensor Classic


              Überblick

              Der OpenBikeSensor Classic ist das Originalgerät, das seit 2018 in ehrenamtlicher Arbeit von vielen Beteiligten als Open Hardware Design entworfen und entwickelt wird.

              Bauteile

              Diese Seite listet alle Bauteile auf, die bestellt oder hergestellt werden müssen, um einen OpenBikeSensor Classic zusammenzubauen.

              Platine

              Die Hauptplatine des OpenBikeSensor Classic verbindet alle Module und elektronisch Einzelbauteile miteinander. Hier beschreiben wir, wie du eine solche Platine bekommst.

              Gehäuse

              In das Gehäuse des OpenBikeSensor Classic werden die elektronischen Komponenten eingebaut. Es wird im 3D-Druck-Verfahren selbst gefertigt.

              Bauanleitung (OpenBikeSensor Classic 1.0.0)

              Sobald der Bausatz für den OpenBikeSensor Classic zusammengestellt ist, kann anhand dieser Anleitung der Bau begonnen werden. Der Zusammenbau besteht aus einer Menge Lötarbeit, sowie dem Test der Elektronik und dem Einbau in das Gehäuse.

              Fehlersuche

              Dieser Bereich enthält Anleitungen und Links zu Informationen, die bei bekannten Schwierigkeiten und Problemen Abhilfe schaffen könnten.

              Zuletzt geändert 06.02.2023: Fix menu for classic (9fbbdaa)

              Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
              \ No newline at end of file diff --git a/docs/classic/parts/_print/index.html b/docs/classic/parts/_print/index.html deleted file mode 100644 index 5e90f13a..00000000 --- a/docs/classic/parts/_print/index.html +++ /dev/null @@ -1,58 +0,0 @@ -Bauteile | OpenBikeSensor - - - -

              Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

              Zur Standardansicht zurückkehren.

              Bauteile

              Diese Seite listet alle Bauteile auf, die bestellt oder hergestellt werden müssen, um einen OpenBikeSensor Classic zusammenzubauen.

                Bei manchen Komponenten funktionieren die Links auf die Produkte nicht mehr. Wir arbeiten zurzeit daran, bei neuen Lieferanten testzubestellen. Wenn du gerade bestellst, kannst du @gluap im Forum kontaktieren, um bei der Testbestellung dieser Komponenten mitzumachen.

                Bitte lies diese Seite sorgfältig durch, und auch den Abschnitt “Notizen”, denn -bei einige Teilen musst du aufpassen, das richtige zu erwischen.

                Einige Links könnten in der Zukunft kaputt gehen, wir werden dann versuchen -neue zu finden und Verkäufer:innen zu verlinken, mit denen wir gute Erfahrungen -gemacht haben.

                Diese Liste kann natürlich fehlerhaft oder veraltet sein. Bitte vergleiche die -Designdateien (Platine, Schaltplan, Gehäusedesign, …) mit deiner Bestellung, -um eventuelle Unterschiede festzustellen. Insbesondere wenn du größere Mengen -einkaufen möchtest (z.B. für Sammelbestellungen), oder die Bauteile aus China -geliefert werden und einige Wochen Lieferzeit haben, solltest du alles doppelt -überprüfen.

                Hinweise

                • ESP32 Development Board: Von diesem Modul existieren einige verschiedene -Versionen. Du brauchst die Variante mit 30 Pins. Diese wird oft unter der -Bezeichnung “ESP32 DEVKIT v1” verkauft.

                • SD-Karte: Billige SD-Karten haben schon öfters Probleme verursacht, wähle -lieber ein Markenprodukt. Versuche eine SD-Karte unter 100 MB/s zu bekommen, -z.B. SanDisk Karten mit 120 MB/s haben auch schon Probleme verursacht, da sie -die von uns verwendete Schnittstelle nicht mehr unterstützen.

                • GPS-Modul: Bevorzuge die Variante mit großer Antenne -(Link1, -Link2). Die Antennen -haben unterschiedliche Qualität und Kabellänge, bei Ersatzbedarf gibt es auch -günstige Weiterverkäufer:innen der Antennen in Deutschland.

                • Displaykabel: Hier solltest du auf keinen Fall sparen. Kaufe ein -LifY11Y-Kabel in hoher Qualität, oder die Verbindung zum Display könnte -darunter leiden und nur unzuverlässig funktionieren. Zwei Meter Länge sind -genug für große Fahrräder und ein paar extra Versuche bis das Crimpen klappt. -Cat5 oder Cat6 Netzwerkkabel könnten zwar elektronisch auch funktionieren, -sind aber in der Regeln nicht so flexibel und fühlen sich nicht so gut an.

                • JSN-SR04T: Hier musst du auf die richtige Version achten. Es gibt eine -ganze Menge Varianten, von denen viele nicht funktionieren. Wir haben auf -dieser Seite dokumentiert, welche wir -gefunden haben und wie gut die jeweils funktionieren.

                • Einige Bauteile können in größeren Mengen zu wesentlich günstigeren -Preisen gekauft werden. Bildet Sammelbestellungen um viel Geld zu sparen!

                • Von besonders günstigen Teile kannst du gern etwas mehr bestellen, als -Ersatz, falls etwas verloren oder kaputt geht (Widerstände, Schrauben und -Muttern, Crimp-Kontakte, Kabel und Litze, …)

                • Gehäuse müssen in PETG 3D-gedruckt werden. Es -gibt viele Versionen für verschiedene Zwecke und von verschiedenen Leuten. -Die Community pflegt aktiv ein bestimmtes Gehäuse für jede PCB-Version. -Schau’ dich im -Gehäuse-Repository -auf Github um. Du kannst dein Gehäuse selbst drucken, andere Mitglieder der -Community darum bitten, oder fertige Drucke anhand der Designdateien von -einem 3D-Druck-Service bestellen (das ist aber in der Regel relativ teuer).

                • PCB: Du benötigst ein PCB der passenden Version, speziell anhand der -Designdateien hergestellt. Dies sollte am besten -ebenfalls in großen Mengen bestellt werden, da der Stückpreis dann stark -sinkt. Frag’ auf jeden Fall im Slack nach, ob irgendwer noch welche auf Lager -hat, bevor du neue anfertigen lässt!

                Bauteile

                MengeBauteilLinks
                Module
                1ESP32-WROOM Development Board (Hinweis beachten)aliexpress.com - Wanzai Store (Variante ESP-32 30P)
                aliexpress.com - Win win. (Variante ESP-32 30P)
                aliexpress.com - KEWEITE Store (Variante ESP-32)
                10.96-Zoll OLED Displayaliexpress.com
                1USB-C Lademodulaliexpress.com 1
                aliexpress.com 2
                1SD-Karten-Modulaliexpress.com -androegg.de[forenthread]
                1Buck-Boost Modul for LiPo, 3.3V (Spannungsregler)Derzeit ist kein zuverlässiger Händler für dieses Modul bekannt. Module mit Beschriftung ``A1731i`` auf dem sechsbeinigen Bauteil **funktionieren NICHT**.
                118650 LiIon-Akku (mit Lötfahnen)akkuteile.de
                nkon.nl
                1SD-Karte, 16 GB / 32 GB (Hinweis beachten)amazon.de
                google Suche
                1GPS-NEO-6M Modul (Hinweis beachten)aliexpress.com 1
                aliexpress.com 2
                aliexpress.com 3
                aliexpress.com 4
                2JSN-SR04T Sensormodule (Hinweis beachten)EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
                EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
                androegg.de (JSN-SR04T-v3.0)
                Kleinteile
                112mm Drucktasteraliexpress.com -aliexpress.com
                1Miniatur-Kippschalterreichelt.de
                aliexpress.com
                ca. 2mDisplaykabel (Hinweis beachten)automation24.de
                Steckverbinder
                15 (+10 Ersatz)JST-XH Crimp-Kontakte (BXH-001T-P0.6)reichelt.de
                farnell.com
                3JST-XH Gehäuse 2-polig (XHP-2)reichelt.de
                2JST-XH Platinenstecker 2-polig 90°reichelt.de
                1JST-XH Gehäuse 4-polig (XHP-4)reichelt.de
                1JST-XH Gehäuse 5-polig (XHP-5)reichelt.de
                1JST-XH Platinenstecker 2-polig (B2B-XH-A)reichelt.de
                1JST-XH Platinenstecker 5-polig (B5B-XH-A)reichelt.de
                1Batteriekabel (gerade, 2-polig)reichelt.de
                1Platinenstecker für Batteriekabel (gerade, 2-polig, mit rot-schwarzen Kabeln, 2.54mm RM)pollin.de 1
                pollin.de 2
                1Winkelstiftleiste (mind. 10-polig, 2.54mm RM)reichelt.de
                1Stiftleiste gerade (mind. 11-polig, 2.54mm RM)reichelt.de
                2SMD-Buchsenleisten (15-polige, 2.54mm SMD, wechselseitig, BL LP 5 SMD)
                (15-polige Variante ist selten; 16-polige kann gekürzt werden)
                fischerelektronik.de
                Elektronische Bauelemente
                1Widerstand (THT) 10 kΩ, 250 mW, 5 %reichelt.de
                1Widerstand (THT) 150 kΩ, 250 mW, 5 %reichelt.de
                1Widerstand (THT) 300 kΩ, 250 mW, 5 %reichelt.de
                2Widerstand (THT) 1.1 kΩ, 250 mW, 5 %reichelt.de
                1Keramikkondensator 100 nF, 10 %reichelt.de
                2Elektrolytkondensator, radial, 22 µF, 10 V, niedrige ESRreichelt.de
                1Schottky-Diode, 60 V, 5 A, DO-201ADreichelt.de
                1Rückstellende Sicherung, max. 40 A - 30 V, 6.6 sec
                Typ PFRA, radiale Bauform
                reichelt.de
                Mechanische Bauteile
                4Neodym-Magnete, 20x10x2mmamazon.de -supermagnete.de (teuer, stark)
                4Neodym-Magnete, 3x3x3mmamazon.de -supermagnete.de
                28M3x8mm Zylinderschraube mit Innensechskant (DIN912). (1x GPS, 8x für zwei Gehäuseöffnungen, 3x Platine, 5x Deckel, 3x Display, 6x 2 Gepäckträgerhalterungen, 2x für Kabelzugentlastung), je nach Variante können weniger Schrauben reichen.
                1M3x30mm Zylinderschraube mit Innensechskant (DIN912) (für den Locking Pin)
                10M3 Mutter (DIN934) (je 4x für zwei Gehäuseöffnungen, 2x für Kabelzugentlastung, je nach Variante können weniger Muttern reichen.)
                18Gewindeeinsatz / Einpressmutter M3x5.7 (1x GPS, 5x Deckel, 3x Platine, 3x Display, 6x für 2 Gepäckträgerhalterungen, je nach Variante können weniger Muttern reichen.)amazon.de 1
                amazon.de 2
                4Kabelbinder (2x Batterie, 2x Displayhalterung
                2Kabelbinder (Sattelhalterung)
                Spezialanfertigungen
                1PCB v00.03.12github.com
                13D-Druck: Hauptgehäuse, Displaygehäuse, Halterung(en)Link

                Werkzeuge

                Diese Werkzeuge werden benötigt, um den Sensor zusammenzubauen. Das -spezialisierteste Werkzeug ist die Crimpzange, welche dein lokaler Hackspace / -Maker Space / Fab Lab sicherlich rumliegen hat. Eventuell musst du also nicht -jedes dieser Werkzeuge kaufen, wenn du eines ausleihen kannst.

                • Crimpzange für JST-XH Steckverbinder (andere Marken oder Zangentypen, die mit diesen Verbindern kompatibel sind, funktionieren auch, z.B. Engineer PA-09).
                • Ein guter, regelbarer Lötkolben oder eine Lötstation, mit entsprechender Lösung zur Entlüftung
                • Pinzetten
                • Seitenschneider (z.B. Knipex Super Knips)
                • Abisolierzange, (z.B. Knipex, Jokari- mit diesen beiden Zangen kann man auch denn Innenleiter der Ultraschallsensoren abisolieren)
                • Innensechskantschraubendreher 2,5mm für M3 (“Inbussschlüssel” oder Schraubendreher)
                • Persönliche Schutzausrüstung: Schutzbrille, eventuell Handschuhe, …
                • ESD-Schutzausrüstung (nicht zwingend notwendig, aber nutze sie, wenn du sie hast)

                Verbrauchsgüter

                Die meisten dieser Artikel gibt’s in jedem Elektroniklabor, wenn du also in -einem Maker Space oder ähnlichem arbeitest, kannst du sicher kleine Mengen -hiervon bekommen ohne die große Packung kaufen zu müssen.

                • Gutes Lötzinn, bleifrei
                • Enlötlitze
                • Isolierklebeband, bevorzugt Kapton-Band
                • Schrumpfschlauch (optional)
                • Etwa 25cm dünne (0.25 mm2 / 23 AWG) Litze
                - \ No newline at end of file diff --git a/docs/classic/parts/index.html b/docs/classic/parts/index.html index 5304166b..f817ab93 100644 --- a/docs/classic/parts/index.html +++ b/docs/classic/parts/index.html @@ -1,12 +1,11 @@ -Bauteile | OpenBikeSensorBauteile | OpenBikeSensor + - - - -

                Bauteile

                Diese Seite listet alle Bauteile auf, die bestellt oder hergestellt werden müssen, um einen OpenBikeSensor Classic zusammenzubauen.

                Bei manchen Komponenten funktionieren die Links auf die Produkte nicht mehr. Wir arbeiten zurzeit daran, bei neuen Lieferanten testzubestellen. Wenn du gerade bestellst, kannst du @gluap im Forum kontaktieren, um bei der Testbestellung dieser Komponenten mitzumachen.

                Bitte lies diese Seite sorgfältig durch, und auch den Abschnitt “Notizen”, denn -bei einige Teilen musst du aufpassen, das richtige zu erwischen.

                Einige Links könnten in der Zukunft kaputt gehen, wir werden dann versuchen +">

                Bauteile

                Diese Seite listet alle Bauteile auf, die bestellt oder hergestellt werden müssen, um einen OpenBikeSensor Classic zusammenzubauen.

                Bei manchen Komponenten funktionieren die Links auf die Produkte nicht mehr. Wir arbeiten zurzeit daran, welche bei neuen Lieferanten bestellen. +Wenn du gerade bestellst, kannst du @gluap im Forum kontaktieren, um bei der Testbestellung dieser Komponenten mitzumachen.

                Bitte lies diese Seite sorgfältig durch, und auch den Abschnitt “Notizen”, denn +bei einige Teilen musst du aufpassen, das richtige zu erwischen.

                Einige Links könnten in der Zukunft kaputtgehen, wir werden dann versuchen neue zu finden und Verkäufer:innen zu verlinken, mit denen wir gute Erfahrungen gemacht haben.

                Diese Liste kann natürlich fehlerhaft oder veraltet sein. Bitte vergleiche die Designdateien (Platine, Schaltplan, Gehäusedesign, …) mit deiner Bestellung, @@ -17,7 +16,7 @@ Versionen. Du brauchst die Variante mit 30 Pins. Diese wird oft unter der Bezeichnung “ESP32 DEVKIT v1” verkauft.

              • SD-Karte: Billige SD-Karten haben schon öfters Probleme verursacht, wähle lieber ein Markenprodukt. Versuche eine SD-Karte unter 100 MB/s zu bekommen, -z.B. SanDisk Karten mit 120 MB/s haben auch schon Probleme verursacht, da sie +uns haben bspw. SanDisk Karten mit 120 MB/s schon Probleme verursacht, da sie die von uns verwendete Schnittstelle nicht mehr unterstützen.

              • GPS-Modul: Bevorzuge die Variante mit großer Antenne (Link1, Link2). Die Antennen @@ -27,31 +26,30 @@ darunter leiden und nur unzuverlässig funktionieren. Zwei Meter Länge sind genug für große Fahrräder und ein paar extra Versuche bis das Crimpen klappt. Cat5 oder Cat6 Netzwerkkabel könnten zwar elektronisch auch funktionieren, -sind aber in der Regeln nicht so flexibel und fühlen sich nicht so gut an.

              • JSN-SR04T: Hier musst du auf die richtige Version achten. Es gibt eine +sind aber in der Regel nicht so flexibel und fühlen sich nicht so gut an.

              • JSN-SR04T: Hier musst du auf die richtige Version achten. Es gibt eine ganze Menge Varianten, von denen viele nicht funktionieren. Wir haben auf dieser Seite dokumentiert, welche wir gefunden haben und wie gut die jeweils funktionieren.

              • Einige Bauteile können in größeren Mengen zu wesentlich günstigeren -Preisen gekauft werden. Bildet Sammelbestellungen um viel Geld zu sparen!

              • Von besonders günstigen Teile kannst du gern etwas mehr bestellen, als -Ersatz, falls etwas verloren oder kaputt geht (Widerstände, Schrauben und +Preisen gekauft werden. Bildet Sammelbestellungen, um viel Geld zu sparen!

              • Von besonders günstigen Teile kannst du gern etwas mehr bestellen, als +Ersatz, falls etwas verloren oder kaputtgeht (Widerstände, Schrauben und Muttern, Crimp-Kontakte, Kabel und Litze, …)

              • Gehäuse müssen in PETG 3D-gedruckt werden. Es gibt viele Versionen für verschiedene Zwecke und von verschiedenen Leuten. Die Community pflegt aktiv ein bestimmtes Gehäuse für jede PCB-Version. Schau’ dich im Gehäuse-Repository -auf Github um. Du kannst dein Gehäuse selbst drucken, andere Mitglieder der +auf GitHub um. Du kannst dein Gehäuse selbst drucken, andere Mitglieder der Community darum bitten, oder fertige Drucke anhand der Designdateien von einem 3D-Druck-Service bestellen (das ist aber in der Regel relativ teuer).

              • PCB: Du benötigst ein PCB der passenden Version, speziell anhand der Designdateien hergestellt. Dies sollte am besten ebenfalls in großen Mengen bestellt werden, da der Stückpreis dann stark sinkt. Frag’ auf jeden Fall im Slack nach, ob irgendwer noch welche auf Lager hat, bevor du neue anfertigen lässt!

              • Bauteile

                MengeBauteilLinks
                Module
                1ESP32-WROOM Development Board (Hinweis beachten)aliexpress.com - Wanzai Store (Variante ESP-32 30P)
                aliexpress.com - Win win. (Variante ESP-32 30P)
                aliexpress.com - KEWEITE Store (Variante ESP-32)
                10.96-Zoll OLED Displayaliexpress.com
                1USB-C Lademodulaliexpress.com 1
                aliexpress.com 2
                1SD-Karten-Modulaliexpress.com -androegg.de[forenthread]
                1Buck-Boost Modul for LiPo, 3.3V (Spannungsregler)Derzeit ist kein zuverlässiger Händler für dieses Modul bekannt. Module mit Beschriftung ``A1731i`` auf dem sechsbeinigen Bauteil **funktionieren NICHT**.
                118650 LiIon-Akku (mit Lötfahnen)akkuteile.de
                nkon.nl
                1SD-Karte, 16 GB / 32 GB (Hinweis beachten)amazon.de
                google Suche
                1GPS-NEO-6M Modul (Hinweis beachten)aliexpress.com 1
                aliexpress.com 2
                aliexpress.com 3
                aliexpress.com 4
                2JSN-SR04T Sensormodule (Hinweis beachten)EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
                EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
                androegg.de (JSN-SR04T-v3.0)
                Kleinteile
                112mm Drucktasteraliexpress.com -aliexpress.com
                1Miniatur-Kippschalterreichelt.de
                aliexpress.com
                ca. 2mDisplaykabel (Hinweis beachten)automation24.de
                Steckverbinder
                15 (+10 Ersatz)JST-XH Crimp-Kontakte (BXH-001T-P0.6)reichelt.de
                farnell.com
                3JST-XH Gehäuse 2-polig (XHP-2)reichelt.de
                2JST-XH Platinenstecker 2-polig 90°reichelt.de
                1JST-XH Gehäuse 4-polig (XHP-4)reichelt.de
                1JST-XH Gehäuse 5-polig (XHP-5)reichelt.de
                1JST-XH Platinenstecker 2-polig (B2B-XH-A)reichelt.de
                1JST-XH Platinenstecker 5-polig (B5B-XH-A)reichelt.de
                1Batteriekabel (gerade, 2-polig)reichelt.de
                1Platinenstecker für Batteriekabel (gerade, 2-polig, mit rot-schwarzen Kabeln, 2.54mm RM)pollin.de 1
                pollin.de 2
                1Winkelstiftleiste (mind. 10-polig, 2.54mm RM)reichelt.de
                1Stiftleiste gerade (mind. 11-polig, 2.54mm RM)reichelt.de
                2SMD-Buchsenleisten (15-polige, 2.54mm SMD, wechselseitig, BL LP 5 SMD)
                (15-polige Variante ist selten; 16-polige kann gekürzt werden)
                fischerelektronik.de
                Elektronische Bauelemente
                1Widerstand (THT) 10 kΩ, 250 mW, 5 %reichelt.de
                1Widerstand (THT) 150 kΩ, 250 mW, 5 %reichelt.de
                1Widerstand (THT) 300 kΩ, 250 mW, 5 %reichelt.de
                2Widerstand (THT) 1.1 kΩ, 250 mW, 5 %reichelt.de
                1Keramikkondensator 100 nF, 10 %reichelt.de
                2Elektrolytkondensator, radial, 22 µF, 10 V, niedrige ESRreichelt.de
                1Schottky-Diode, 60 V, 5 A, DO-201ADreichelt.de
                1Rückstellende Sicherung, max. 40 A - 30 V, 6.6 sec
                Typ PFRA, radiale Bauform
                reichelt.de
                Mechanische Bauteile
                4Neodym-Magnete, 20x10x2mmamazon.de -supermagnete.de (teuer, stark)
                4Neodym-Magnete, 3x3x3mmamazon.de -supermagnete.de
                28M3x8mm Zylinderschraube mit Innensechskant (DIN912). (1x GPS, 8x für zwei Gehäuseöffnungen, 3x Platine, 5x Deckel, 3x Display, 6x 2 Gepäckträgerhalterungen, 2x für Kabelzugentlastung), je nach Variante können weniger Schrauben reichen.
                1M3x30mm Zylinderschraube mit Innensechskant (DIN912) (für den Locking Pin)
                10M3 Mutter (DIN934) (je 4x für zwei Gehäuseöffnungen, 2x für Kabelzugentlastung, je nach Variante können weniger Muttern reichen.)
                18Gewindeeinsatz / Einpressmutter M3x5.7 (1x GPS, 5x Deckel, 3x Platine, 3x Display, 6x für 2 Gepäckträgerhalterungen, je nach Variante können weniger Muttern reichen.)amazon.de 1
                amazon.de 2
                4Kabelbinder (2x Batterie, 2x Displayhalterung
                2Kabelbinder (Sattelhalterung)
                Spezialanfertigungen
                1PCB v00.03.12github.com
                13D-Druck: Hauptgehäuse, Displaygehäuse, Halterung(en)Link

                Werkzeuge

                Diese Werkzeuge werden benötigt, um den Sensor zusammenzubauen. Das +androegg.de[forenthread]1Buck-Boost Modul for LiPo, 3.3V (Spannungsregler)Derzeit ist kein zuverlässiger Händler für dieses Modul bekannt. Module mit Beschriftung `A1731i` auf dem sechsbeinigen Bauteil **funktionieren NICHT**.118650 LiIon-Akku (mit Lötfahnen)akkuteile.de
                nkon.nl1SD-Karte, 16 GB / 32 GB (Hinweis beachten)amazon.de
                google Suche1GPS-NEO-6M Modul (Hinweis beachten)aliexpress.com 1
                aliexpress.com 2
                aliexpress.com 3
                aliexpress.com 42JSN-SR04T Sensormodule (Hinweis beachten)EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
                EC-Buying, aliexpress.com (JSN-SR04T-v3.0)
                androegg.de (JSN-SR04T-v3.0)Kleinteile112 mm Drucktasteraliexpress.com +aliexpress.com1Miniatur-Kippschalterreichelt.de
                aliexpress.comca. 2mDisplaykabel (Hinweis beachten)automation24.deSteckverbinder15 (+10 Ersatz)JST-XH Crimp-Kontakte (BXH-001T-P0.6)reichelt.de
                farnell.com3JST-XH Gehäuse 2-polig (XHP-2)reichelt.de2JST-XH Platinenstecker 2-polig 90°reichelt.de1JST-XH Gehäuse 4-polig (XHP-4)reichelt.de1JST-XH Gehäuse 5-polig (XHP-5)reichelt.de1JST-XH Platinenstecker 2-polig (B2B-XH-A)reichelt.de1JST-XH Platinenstecker 5-polig (B5B-XH-A)reichelt.de1Batteriekabel (gerade, 2-polig)reichelt.de1Platinenstecker für Batteriekabel (gerade, 2-polig, mit rot-schwarzen Kabeln, 2.54 mm RM)pollin.de 1
                pollin.de 21Winkelstiftleiste (mind. 10-polig, 2.54 mm RM)reichelt.de1Stiftleiste gerade (mind. 11-polig, 2.54 mm RM)reichelt.de2SMD-Buchsenleisten (15-polige, 2.54 mm SMD, wechselseitig, BL LP 5 SMD)
                (15-polige Variante ist selten; 16-polige kann gekürzt werden)fischerelektronik.deElektronische Bauelemente1Widerstand (THT) 10 kΩ, 250 mW, 5 %reichelt.de1Widerstand (THT) 150 kΩ, 250 mW, 5 %reichelt.de1Widerstand (THT) 300 kΩ, 250 mW, 5 %reichelt.de2Widerstand (THT) 1.1 kΩ, 250 mW, 5 %reichelt.de1Keramikkondensator 100 nF, 10 %reichelt.de2Elektrolytkondensator, radial, 22 µF, 10 V, niedrige ESRreichelt.de1Schottky-Diode, 60 V, 5 A, DO-201ADreichelt.de1Rückstellende Sicherung, max. 40 A - 30 V, 6.6 sec
                Typ PFRA, radiale Bauformreichelt.deMechanische Bauteile4Neodym-Magnete, 20x10x2 mmamazon.de +supermagnete.de (teuer, stark)4Neodym-Magnete, 3x3x3 mmamazon.de +supermagnete.de28M3x8 mm Zylinderschraube mit Innensechskant (DIN912). (1x GPS, 8x für zwei Gehäuseöffnungen, 3x Platine, 5x Deckel, 3x Display, 6x 2 Gepäckträgerhalterungen, 2x für Kabelzugentlastung), je nach Variante können weniger Schrauben reichen.1M3x30 mm Zylinderschraube mit Innensechskant (DIN912) (für den Locking Pin)10M3 Mutter (DIN934) (je 4x für zwei Gehäuseöffnungen, 2x für Kabelzugentlastung, je nach Variante können weniger Muttern reichen.)18Gewindeeinsatz / Einpressmutter M3x5.7 (1x GPS, 5x Deckel, 3x Platine, 3x Display, 6x für 2 Gepäckträgerhalterungen, je nach Variante können weniger Muttern reichen.)amazon.de 1
                amazon.de 24Kabelbinder (2x Batterie, 2x Displayhalterung2Kabelbinder (Sattelhalterung)Spezialanfertigungen1PCB v00.03.12github.com13D-Druck: Hauptgehäuse, Displaygehäuse, Halterung(en)Link

                Werkzeuge

                Diese Werkzeuge werden benötigt, um den Sensor zusammenzubauen. Das spezialisierteste Werkzeug ist die Crimpzange, welche dein lokaler Hackspace / -Maker Space / Fab Lab sicherlich rumliegen hat. Eventuell musst du also nicht -jedes dieser Werkzeuge kaufen, wenn du eines ausleihen kannst.

                • Crimpzange für JST-XH Steckverbinder (andere Marken oder Zangentypen, die mit diesen Verbindern kompatibel sind, funktionieren auch, z.B. Engineer PA-09).
                • Ein guter, regelbarer Lötkolben oder eine Lötstation, mit entsprechender Lösung zur Entlüftung
                • Pinzetten
                • Seitenschneider (z.B. Knipex Super Knips)
                • Abisolierzange, (z.B. Knipex, Jokari- mit diesen beiden Zangen kann man auch denn Innenleiter der Ultraschallsensoren abisolieren)
                • Innensechskantschraubendreher 2,5mm für M3 (“Inbussschlüssel” oder Schraubendreher)
                • Persönliche Schutzausrüstung: Schutzbrille, eventuell Handschuhe, …
                • ESD-Schutzausrüstung (nicht zwingend notwendig, aber nutze sie, wenn du sie hast)

                Verbrauchsgüter

                Die meisten dieser Artikel gibt’s in jedem Elektroniklabor, wenn du also in +Maker Space / Fab Lab sicherlich herumliegen hat. Eventuell musst du also nicht +jedes dieser Werkzeuge kaufen, wenn du eines ausleihen kannst.

                • Crimpzange für JST-XH Steckverbinder (andere Marken oder Zangentypen, die mit diesen Verbindern kompatibel sind, funktionieren auch, z.B. Engineer PA-09).
                • Ein guter, regelbarer Lötkolben oder eine Lötstation, mit entsprechender Lösung zur Entlüftung
                • Pinzetten
                • Seitenschneider (z.B. Knipex Super Knips)
                • Abisolierzange, (z.B. Knipex, Jokari- mit diesen beiden Zangen kann man auch denn Innenleiter der Ultraschallsensoren abisolieren)
                • Innensechskantschraubendreher 2,5 mm für M3 (“Inbusschlüssel” oder Schraubendreher)
                • Persönliche Schutzausrüstung: Schutzbrille, eventuell Handschuhe, …
                • ESD-Schutzausrüstung (nicht zwingend notwendig, aber nutze sie, wenn du sie hast)

                Verbrauchsgüter

                Die meisten dieser Artikel gibt’s in jedem Elektroniklabor, wenn du also in einem Maker Space oder ähnlichem arbeitest, kannst du sicher kleine Mengen -hiervon bekommen ohne die große Packung kaufen zu müssen.

                • Gutes Lötzinn, bleifrei
                • Enlötlitze
                • Isolierklebeband, bevorzugt Kapton-Band
                • Schrumpfschlauch (optional)
                • Etwa 25cm dünne (0.25 mm2 / 23 AWG) Litze

                Zuletzt geändert 07.02.2023: Page descriptions (f08cbaa)
                Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                Druckansicht dieses Kapitels
                - \ No newline at end of file +hiervon bekommen ohne die große Packung kaufen zu müssen.

                • Gutes Lötzinn, bleifrei
                • Entlötlitze
                • Isolierklebeband, bevorzugt Kapton-Band
                • Schrumpfschlauch (optional)
                • Etwa 25 cm dünne (0.25 mm2 / 23 AWG) Litze

                Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                \ No newline at end of file diff --git a/docs/classic/pcb/_print/index.html b/docs/classic/pcb/_print/index.html deleted file mode 100644 index 80ed9c9a..00000000 --- a/docs/classic/pcb/_print/index.html +++ /dev/null @@ -1,28 +0,0 @@ -Platine | OpenBikeSensor - - - -

                Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

                Zur Standardansicht zurückkehren.

                Platine

                Die Hauptplatine des OpenBikeSensor Classic verbindet alle Module und elektronisch Einzelbauteile miteinander. Hier beschreiben wir, wie du eine solche Platine bekommst.

                  Ein sehr wichtiger Bestandteil des Gerätes ist die Platine, auch -„PCB” (englisch printed circuit board) genannt. Der schwierige -Teil hieran ist das „printed” – ein PCB ist ein professionell -hergestelltes Bauteil das schwierig selbst zu erstellen ist. Hier sind deine -Optionen:

                  • Das PCB anhand der Designdateien von einem Platinenhersteller anfertigen -lassen. Je nachdem wo, in welcher Qualität und wie viele Platinen du -bestellst wird dies erstaunlich wenig bis sehr viel kosten.
                  • Finde heraus, ob jemensch anders schon Platinen anhand der gleichen Dateien -hat herstellen lassen. Eventuell hat er:sie noch Exemplare übrig, frag am -besten in der Community nach.
                  • Bastel dir selbst eine Platine, ganz im DIY-Stil. Da unseren Platinen jedoch -Durchkontaktierungen und beidseitige Leiterbahnen benötigen, ist das -besonders schwierig. Je nach Ausrüstung und Erfahrung ist es aber machbar. -Besonders viel günstiger als bestellen ist es allerdings vermutlich nicht.
                  • Benutze keine Platine. Du kannst einen kompatiblen Sensor ganz ohne Platine -zusammenbauen, indem du die Komponenten mit Kabeln aneinander lötests. -Allerdings haben wir hierfür keine Anleitung und das Gehäuse wird auch nicht -passen. Orientiere dich am Schaltplan, den Rest musst du selbst herausfinden.

                  PCB Layout-Parameter

                  Wenn du dich für einen Hersteller entscheidest, solltest du sicherstellen, dass -folgende Layoutparameter unterstützt sind. In der Regel listet jeder Hersteller -auf der Website diese Informationen auf, und die Minimal- und Maximalgrößen -dürfen nicht unter- bzw. überschritten werden, sonst könnte die Herstellung -fehlschlagen.

                  Wir verwenden in unseren Designs:

                  • TODO: Via size, minimum trace width, milling path restrictions

                  Gerber-Dateien

                  TODO: Wo sind die Dateien zu finden?

                  - \ No newline at end of file diff --git a/docs/classic/pcb/index.html b/docs/classic/pcb/index.html index 548e41fa..c947145e 100644 --- a/docs/classic/pcb/index.html +++ b/docs/classic/pcb/index.html @@ -1,27 +1,24 @@ -Platine | OpenBikeSensorPlatine | OpenBikeSensor + - - - -

                  Platine

                  Die Hauptplatine des OpenBikeSensor Classic verbindet alle Module und elektronisch Einzelbauteile miteinander. Hier beschreiben wir, wie du eine solche Platine bekommst.

                  Ein sehr wichtiger Bestandteil des Gerätes ist die Platine, auch +">

                  Platine

                  Die Hauptplatine des OpenBikeSensor Classic verbindet alle Module und elektronisch Einzelbauteile miteinander. Hier beschreiben wir, wie du eine solche Platine bekommst.

                  Ein sehr wichtiger Bestandteil des Gerätes ist die Platine, auch „PCB” (englisch printed circuit board) genannt. Der schwierige Teil hieran ist das „printed” – ein PCB ist ein professionell -hergestelltes Bauteil das schwierig selbst zu erstellen ist. Hier sind deine +hergestelltes Bauteil, das schwierig selbst zu erstellen ist. Hier sind deine Optionen:

                  • Das PCB anhand der Designdateien von einem Platinenhersteller anfertigen lassen. Je nachdem wo, in welcher Qualität und wie viele Platinen du -bestellst wird dies erstaunlich wenig bis sehr viel kosten.
                  • Finde heraus, ob jemensch anders schon Platinen anhand der gleichen Dateien +bestellst, wird dies erstaunlich wenig bis sehr viel kosten.
                  • Finde heraus, ob jemensch anders schon Platinen anhand der gleichen Dateien hat herstellen lassen. Eventuell hat er:sie noch Exemplare übrig, frag am besten in der Community nach.
                  • Bastel dir selbst eine Platine, ganz im DIY-Stil. Da unseren Platinen jedoch Durchkontaktierungen und beidseitige Leiterbahnen benötigen, ist das besonders schwierig. Je nach Ausrüstung und Erfahrung ist es aber machbar. Besonders viel günstiger als bestellen ist es allerdings vermutlich nicht.
                  • Benutze keine Platine. Du kannst einen kompatiblen Sensor ganz ohne Platine -zusammenbauen, indem du die Komponenten mit Kabeln aneinander lötests. -Allerdings haben wir hierfür keine Anleitung und das Gehäuse wird auch nicht +zusammenbauen, indem du die Komponenten mit Kabeln aneinander lötest. +Allerdings haben wir hierfür keine Anleitung und das Gehäuse wird wahrscheinlich auch nicht passen. Orientiere dich am Schaltplan, den Rest musst du selbst herausfinden.

                  PCB Layout-Parameter

                  Wenn du dich für einen Hersteller entscheidest, solltest du sicherstellen, dass folgende Layoutparameter unterstützt sind. In der Regel listet jeder Hersteller auf der Website diese Informationen auf, und die Minimal- und Maximalgrößen dürfen nicht unter- bzw. überschritten werden, sonst könnte die Herstellung -fehlschlagen.

                  Wir verwenden in unseren Designs:

                  • TODO: Via size, minimum trace width, milling path restrictions

                  Gerber-Dateien

                  TODO: Wo sind die Dateien zu finden?


                  Zuletzt geändert 07.02.2023: Page descriptions (f08cbaa)
                  Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                  Druckansicht dieses Kapitels
                  - \ No newline at end of file +fehlschlagen.

                  Wir verwenden in unseren Designs:

                  • TODO: Via size, minimum trace width, milling path restrictions

                  Gerber-Dateien

                  TODO: Wo sind die Dateien zu finden?

                  Zuletzt geändert 20.01.2024: Small fixes. (df948e6)

                  Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                  \ No newline at end of file diff --git a/docs/classic/troubleshooting/_print/index.html b/docs/classic/troubleshooting/_print/index.html deleted file mode 100644 index a8e13ede..00000000 --- a/docs/classic/troubleshooting/_print/index.html +++ /dev/null @@ -1,14 +0,0 @@ -Fehlersuche | OpenBikeSensor - - - -

                  Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

                  Zur Standardansicht zurückkehren.

                  Fehlersuche

                  Dieser Bereich enthält Anleitungen und Links zu Informationen, die bei bekannten Schwierigkeiten und Problemen Abhilfe schaffen könnten.

                    Solltest du einem Problem begegnen, das hier noch nicht aufgeführt ist, könnte -eine Suche im Forum helfen. Findest -du auch dort nichts, ist die Kategorie Hilfe & -Support der richtige Ort, eine -Frage zu stellen und Unterstützung zu bekommen.

                    Displaymeldung SD Error

                    Es wird eine SD-Karte im Format FAT32 benötigt - Neuere SD-Karten kommen manchmal mit dem exFAT Dateisystem und müssen entsprechend umformatiert werden - unter Windows: Rechtsklick->Formatieren.

                    Sind mehrere OpenBikeSensoren zur Hand, kann eine SD-Karte aus einem funktionierenden Sensor zum Testen verwendet werden - Funktioniert ein OpenBikeSensor auch mit der als funktionierend bekannten SD-Karte nicht, gibt es ein Problem mit dem SD-Karten Board oder dessen Verlötung. Funktioniert es mit der SD-Karte des anderen OpenBikeSensors, gibt es ein Problem mit der SD-Karte.

                    Konnte die SD-Karte als Fehlerquelle ausgeschlossen werden, sollten die Lötstellen des SD-Boards (und die korresppondierenden Lötstellen an der ESP32 Sockelleiste) geprüft werden. Die Datenleitungen SD_CD/CS, SD_CLK/CLK, SD_DAT0/MISO und SD_CMD/MOSI liegen auf den Pins am ESP, die mit D5,D18,D19 und D23 beschriftet sind und können mit einem Multimeter durchgepiepst werden.

                    In manchen Fällen kann es auch vorkommen, dass eine SD-Karte verwendet wird, die den alten SD-Standard nicht unterstützt, der vom OpenBikeSensor genutzt wird. Liegt keine “als funktionierend bekannte” SD-Karte vor, kann man das am einfachsten durch Einsatz einer möglichst alten (aber noch funktionierenden) SD-Karte prüfen, - z.B. aus einem alten Handy, MP3-Player, Raspberry Pi…, da ältere SD-Karten den Standard mith höherer Wahrscheinlichkeit unterstützen. Die SD-Karte muss natürlich auch FAT32 formatiert werden, um vom OpenBikeSensor genutzt zu werden.

                    GPS

                    Denke daran, dass das GPS Modul nur ein paar Euro kostet - im Notfall ist ein Tausch des GPS-Moduls also kein finanzieller Beinbruch.

                    Ultraschallsensoren

                    Phantommessungen

                    Wenn die Kabel falsch herum gekrimpt sind, kommt es oft zu Störugen am Ultraschallsensor - diese äußern sich durch häufige Messwerte auch wenn gar kein Objekt Ultraschall reflektieren kann.

                    Mögliche Ursachen:

                    • Bei den Kabeln der Ultraschallsensoren sollte die Schirmung auf dem Pin des Ultraschallboards liegen, der weiter entfernt von dem großen viereckigen Metallbauteil liegt. Bei manchen Boards ist dieser auch mit “-” beschriftet.
                    • Wenn Batterie - oder Schalterkabel große Leiterschleifen in der Nähe der Sensorboards bilden, kommt es oft zu Störungen der Ultraschallsensoren. Verdrille Batterie- und Schalterkabel, um diese Leiterschleifen zu vermeiden.

                    Keine Messung

                    • Werden keine Ultraschallmesswerte angezeigt, auch wenn z.B. gegen eine Wand gemessen wird gibt es mehrere mögliche Ursachen:
                      • Bei Fehlern beim Krimpen haben die Sensoren manchmal keinen Kontakt am Krimp, neu Krimpen kann hier helfen.
                      • Bei Fehlern beim Verlöten des Ultraschallboards ist ggf das gesamte Board nicht aktiv (Lötstellen Prüfen)
                      • Wenn nur ein Ultraschallsensor funktioniert, lässt sich durch tausch der Transducer prüfen, ob der Fehler durch das Ultraschallboard verursacht wird (Der Fehler bleibt auf der gleichen Seite) oder durch den Ultraschallsensor selbst (der Fehler wandert mit dem Ultraschallsensor auf die andere Seite).

                    Falls die oberen beiden Ursachen ausgeschlossen werden können hilft manchmal die Anleitung zur Kalibrierung

                    - \ No newline at end of file diff --git a/docs/classic/troubleshooting/index.html b/docs/classic/troubleshooting/index.html index f7babea1..02cced05 100644 --- a/docs/classic/troubleshooting/index.html +++ b/docs/classic/troubleshooting/index.html @@ -1,13 +1,14 @@ -Fehlersuche | OpenBikeSensor - - - -

                    Fehlersuche

                    Dieser Bereich enthält Anleitungen und Links zu Informationen, die bei bekannten Schwierigkeiten und Problemen Abhilfe schaffen könnten.

                    Solltest du einem Problem begegnen, das hier noch nicht aufgeführt ist, könnte +Fehlersuche | OpenBikeSensor +

                    Fehlersuche

                    Dieser Bereich enthält Anleitungen und Links zu Informationen, die bei bekannten Schwierigkeiten und Problemen Abhilfe schaffen könnten.

                    Solltest du einem Problem begegnen, das hier noch nicht aufgeführt ist, könnte eine Suche im Forum helfen. Findest du auch dort nichts, ist die Kategorie Hilfe & Support der richtige Ort, eine -Frage zu stellen und Unterstützung zu bekommen.

                    Displaymeldung SD Error

                    Es wird eine SD-Karte im Format FAT32 benötigt - Neuere SD-Karten kommen manchmal mit dem exFAT Dateisystem und müssen entsprechend umformatiert werden - unter Windows: Rechtsklick->Formatieren.

                    Sind mehrere OpenBikeSensoren zur Hand, kann eine SD-Karte aus einem funktionierenden Sensor zum Testen verwendet werden - Funktioniert ein OpenBikeSensor auch mit der als funktionierend bekannten SD-Karte nicht, gibt es ein Problem mit dem SD-Karten Board oder dessen Verlötung. Funktioniert es mit der SD-Karte des anderen OpenBikeSensors, gibt es ein Problem mit der SD-Karte.

                    Konnte die SD-Karte als Fehlerquelle ausgeschlossen werden, sollten die Lötstellen des SD-Boards (und die korresppondierenden Lötstellen an der ESP32 Sockelleiste) geprüft werden. Die Datenleitungen SD_CD/CS, SD_CLK/CLK, SD_DAT0/MISO und SD_CMD/MOSI liegen auf den Pins am ESP, die mit D5,D18,D19 und D23 beschriftet sind und können mit einem Multimeter durchgepiepst werden.

                    In manchen Fällen kann es auch vorkommen, dass eine SD-Karte verwendet wird, die den alten SD-Standard nicht unterstützt, der vom OpenBikeSensor genutzt wird. Liegt keine “als funktionierend bekannte” SD-Karte vor, kann man das am einfachsten durch Einsatz einer möglichst alten (aber noch funktionierenden) SD-Karte prüfen, - z.B. aus einem alten Handy, MP3-Player, Raspberry Pi…, da ältere SD-Karten den Standard mith höherer Wahrscheinlichkeit unterstützen. Die SD-Karte muss natürlich auch FAT32 formatiert werden, um vom OpenBikeSensor genutzt zu werden.

                    GPS

                    Denke daran, dass das GPS Modul nur ein paar Euro kostet - im Notfall ist ein Tausch des GPS-Moduls also kein finanzieller Beinbruch.

                    Ultraschallsensoren

                    Phantommessungen

                    Wenn die Kabel falsch herum gekrimpt sind, kommt es oft zu Störugen am Ultraschallsensor - diese äußern sich durch häufige Messwerte auch wenn gar kein Objekt Ultraschall reflektieren kann.

                    Mögliche Ursachen:

                    • Bei den Kabeln der Ultraschallsensoren sollte die Schirmung auf dem Pin des Ultraschallboards liegen, der weiter entfernt von dem großen viereckigen Metallbauteil liegt. Bei manchen Boards ist dieser auch mit “-” beschriftet.
                    • Wenn Batterie - oder Schalterkabel große Leiterschleifen in der Nähe der Sensorboards bilden, kommt es oft zu Störungen der Ultraschallsensoren. Verdrille Batterie- und Schalterkabel, um diese Leiterschleifen zu vermeiden.

                    Keine Messung

                    • Werden keine Ultraschallmesswerte angezeigt, auch wenn z.B. gegen eine Wand gemessen wird gibt es mehrere mögliche Ursachen:
                      • Bei Fehlern beim Krimpen haben die Sensoren manchmal keinen Kontakt am Krimp, neu Krimpen kann hier helfen.
                      • Bei Fehlern beim Verlöten des Ultraschallboards ist ggf das gesamte Board nicht aktiv (Lötstellen Prüfen)
                      • Wenn nur ein Ultraschallsensor funktioniert, lässt sich durch tausch der Transducer prüfen, ob der Fehler durch das Ultraschallboard verursacht wird (Der Fehler bleibt auf der gleichen Seite) oder durch den Ultraschallsensor selbst (der Fehler wandert mit dem Ultraschallsensor auf die andere Seite).

                    Falls die oberen beiden Ursachen ausgeschlossen werden können hilft manchmal die Anleitung zur Kalibrierung


                    Zuletzt geändert 07.02.2023: Page descriptions (f08cbaa)
                    Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                    Druckansicht dieses Kapitels
                    - \ No newline at end of file +Frage zu stellen und Unterstützung zu bekommen.

                    Displaymeldung SD Error

                    Es wird eine SD-Karte im Format FAT32 benötigt - neuere SD-Karten kommen manchmal mit dem exFAT Dateisystem und müssen entsprechend umformatiert werden - unter Windows: Rechtsklick->Formatieren.

                    Sind mehrere OpenBikeSensoren zur Hand, kann eine SD-Karte aus einem funktionierenden Sensor zum Testen verwendet werden - funktioniert ein OpenBikeSensor auch mit der als funktionierend bekannten SD-Karte nicht, gibt es ein Problem mit dem SD-Karten Board oder dessen Verlötung. +Funktioniert es mit der SD-Karte des anderen OpenBikeSensors, gibt es ein Problem mit der SD-Karte.

                    Konnte die SD-Karte als Fehlerquelle ausgeschlossen werden, sollten die Lötstellen des SD-Boards (und die korrespondierenden Lötstellen an der ESP32 Sockelleiste) geprüft werden. +Die Datenleitungen SD_CD/CS, SD_CLK/CLK, SD_DAT0/MISO und SD_CMD/MOSI liegen auf den Pins am ESP, die mit D5,D18,D19 und D23 beschriftet sind und können mit einem Multimeter durchgepiepst werden.

                    In manchen Fällen kann es auch vorkommen, dass eine SD-Karte verwendet wird, die den alten SD-Standard nicht mehr unterstützt, der vom OpenBikeSensor genutzt wird. +Liegt keine “als funktionierend bekannte” SD-Karte vor, kann man das am einfachsten durch Einsatz einer möglichst alten (aber noch funktionierenden) SD-Karte prüfen, - z.B. aus einem alten Handy, MP3-Player, Raspberry Pi…, da ältere SD-Karten den Standard mit höherer Wahrscheinlichkeit unterstützen. +Die SD-Karte muss natürlich auch FAT32 formatiert werden, um vom OpenBikeSensor genutzt zu werden.

                    GPS

                    Denke daran, dass das GPS Modul nur ein paar Euro kostet - im Notfall ist ein Tausch des GPS-Moduls also kein finanzieller Beinbruch.

                    Ultraschallsensoren

                    Phantom Messungen

                    Wenn die Kabel falsch herum gecrimpt sind, kommt es oft zu Störungen am Ultraschallsensor - diese äußern sich durch häufige Messwerte, auch wenn gar kein Objekt Ultraschall reflektieren kann.

                    Mögliche Ursachen:

                    • Bei den Kabeln der Ultraschallsensoren sollte die Schirmung auf dem Pin des Ultraschallboards liegen, der weiter entfernt von dem großen viereckigen Metallbauteil liegt. Bei manchen Boards ist dieser auch mit “-” beschriftet.
                    • Wenn Batterie- oder Schalter-Kabel große Leiterschleifen in der Nähe der Sensorboards bilden, kommt es oft zu Störungen der Ultraschallsensoren. Verdrille Batterie- und Schalter-Kabel, um diese Leiterschleifen zu vermeiden.

                    Keine Messung

                    • Werden keine Ultraschallmesswerte angezeigt, auch wenn z.B. gegen eine Wand gemessen wird, gibt es mehrere mögliche Ursachen:
                      • Bei Fehlern beim Crimpen haben die Sensoren manchmal keinen Kontakt am Crimp, neu Crimpen kann hier helfen.
                      • Bei Fehlern beim Verlöten des Ultraschallboards ist ggf das gesamte Board nicht aktiv (Lötstellen Prüfen).
                      • Wenn nur ein Ultraschallsensor funktioniert, lässt sich durch tausch der Transducer prüfen, ob der Fehler durch das Ultraschallboard verursacht wird (Der Fehler bleibt auf der gleichen Seite) oder durch den Ultraschallsensor selbst (der Fehler wandert mit dem Ultraschallsensor auf die andere Seite).

                    Falls die oberen beiden Ursachen ausgeschlossen werden können, hilft manchmal die Anleitung zur Kalibrierung


                    Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                    \ No newline at end of file diff --git a/docs/firmware/_print/index.html b/docs/firmware/_print/index.html deleted file mode 100644 index 9ee6e025..00000000 --- a/docs/firmware/_print/index.html +++ /dev/null @@ -1,158 +0,0 @@ -Firmware | OpenBikeSensor - - - -

                    Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

                    Zur Standardansicht zurückkehren.

                    Firmware

                    Firmware ist die Bezeichung für Software, die auf eingebetteten Systemen wie -dem ESP32 und anderen Mikroprozessoren läuft, und dort für die Funktionalität -der Hardware verantwortlich ist. Beim OpenBikeSensor ist dies also ein Programm -das wir selbst schreiben, mit dem der ESP32 bespielt wird, und das sich um die -Aufzeichnung der zu messenden Daten, die Anzeige im Display und die ganze -Konfigurationsoberfläche kümmert.

                    Die Firmware wird, wie alle Softwareteile, unter Open Source Lizenz auf GitHub -entwickelt: https://github.com/openbikesensor/OpenBikeSensorFirmware. Für die -Weiterentwicklung sind alle eingeladen, die sich für -Mikroprozessorprogrammierung interessieren.

                    Featurewünsche oder Fehlerberichte sammeln wir im Issue -Tracker auf -GitHub.

                    Installation / Flashen

                    Ein etwas komplizierter Schritt beim Aufbau des Sensors, den alle Bastler:innen -mindestens einmal mit ihrem neuen Gerät durchlaufen müssen, ist die initiale -Installation der Firmware auf dem ESP32. Dies wird auch als “Flashen” (engl. -to flash) bezeichnet.

                    Hierfür muss das Mikroprozessor-Board aus dem OpenBikeSensor ausgebaut und mit -einem USB-Kabel an einen Computer angeschlossen werden. Die Anleitungen für das -Übertragen der Firmware auf den Mikroprozessor unterscheidet sich stark nach -Betriebssystem des Computers, daher haben wir sie hier getrennt aufgeführt:

                    Versionsupgrade

                    Eine neue Version der Firmware kann direkt über die Bedienoberfläche -eingespielt werden. Hierfür gibt es entsprechende Menüpunkte im Hauptmenü. Ein -Auseinanderbauen des Geräts und der Anschluss an einen Computer sind dafür -nicht mehr nötig.

                    GGF musst du zunächst das “Flashtool” (über die OpenBikeSensor Oberfläche) installieren. -Danach kannst du, wenn dein OpenBikeSensor in einem internetfähigen WLAN eingebucht -ist über das Wlan-Menü deines OpenBikeSensors Firmwareupdates anstoßen.

                    Bauen und Flashen der Firmware aus dem gihub-Repository

                    mit VisualStudio Code und PlatformIO

                    Zunächst VS Code und darin die Erweiterung PlatformIO -installieren.

                    Danach den gewünschten Stand der OBS-Firmware aus dem github-Repository klonen und das Verzeichnis in VS Code öffnen. Dann mit dem Upload-Befehl (Pfeil nach rechts in der Fußzeile von VS Code) oder per pio run -t upload in der PlatformIO CLI auf den ESP32 flashen.

                    1 - Flashen mit platformio

                    Hast du git und python3 installiert, kannst du mit folgenden Kommandos die OpenBikeSensor Firmware bauen und flashen.

                    Vorbereiten des Firmwareverzeichnisses:

                    # Git-Repo klonen
                    -git clone https://github.com/openbikesensor/OpenBikeSensorFirmware.git
                    -cd OpenBikeSensorFirmware
                    -# Platformio in einem virtuellen Python Environment installieren
                    -python3 -m venv venv
                    -venv/bin/pip install platformio
                    -

                    Flashen

                    Nun kannst du den ESP (nicht den OpenBikeSensor) per USB-Kabel mit deinem Rechner verbinden und mit folgendem Kommando die Firmware flashen. (je nach systemkonfiguration benötigtst du dafür evtl. root-rechte). GGF ist es dafür nötig den boot-Knopf am ESP zu drücken.

                    platformio run -t upload
                    -

                    Nach dem Flashen

                    Es empfiehlt sich, dich in den Konfigurationsmodus zu begeben, um

                    • Dein internetfähiges WLAN im OpenBikeSensor zu konfigurieren.
                    • Das Flashtool zu installieren.
                    • Noch einmal ein Firmwareupdate aus dem Internet zu installieren.
                    • Deinen API-Key für Datenuploads einzurichten.

                    2 - Flashen unter Linux

                    Alternative 1: Installation via Browser

                    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google Chrome oder Chromium zu öffnen und der Schritt-Für-Schritt Anleitung dort zu folgen. Funktioniert das für dich nicht, probiere eine der anderen Alternativen.

                    Alternative 2:

                    In der Allgemeinen Installationsanleitung wird der betriebssystemunabhängige Weg über Visual Studio Code und Platformio geschildert.

                    Alternative 3: Installation mit esptool

                    Vorbereitung

                    Lade das neueste Release-Archiv -der OBS-Firmware von GitHub herunter.

                    Du benötigst die ZIP-Datei mit dem Namen obs-v9.9.9.9999-initial-flash.zip (v9.9.9.9999 steht für die Versionsnummer). -Entpacke die Dateien in einem temporären Verzeichnis, sie heißen 0x??????.bin. Die Zahlen sind die Basisadresse, an die -die Daten geflasht werden sollen.

                    Installation

                    Installiere das Programm esptool, falls es noch nicht installiert ist. Es ist in den -meisten Linux-Distributionen verfügbar.

                    Debian GNU/Linux, Ubuntu

                    und davon abgeleitete Distributionen, wie z. B. Linux Mint

                    sudo apt install esptool
                    -

                    Fedora

                    sudo dnf install esptool
                    -

                    Alternative Installation

                    Sollte Deine Linux Distribution dieses Paket nicht enthalten, dann kannst du versuchen es so zu installieren.

                    • lege ein Verzeichnis an, in dem das Tool installiert werden soll, und wechsle in dieses Verzeichnis
                    mkdir ~/esptool
                    -cd ~/esptool
                    -
                    • für die Installation gib nacheinander folgende Befehle ein
                    python3 -m venv venv
                    -. venv/bin/activate
                    -pip install esptool
                    -
                    • nun lass dir die Version anzeigen
                    esptool.py version
                    -
                    • war die Installation erfolgreich, dann wird die Versionsnummer angezeigt (diese kann bei dir abweichend sein)
                    esptool.py v3.2
                    -3.2
                    -

                    Gerätenamen herausfinden

                    Stelle sicher, dass du den Gerätenamen für das USB-Gerät kennst. Sehr wahrscheinlich wird es /dev/ttyUSB0 sein – -dieser Name wird auch im weiteren Beispiel verwendet.

                    Herausfinden kannst du den Namen mit folgenden Schritten:

                    • den OpenBikeSensor noch nicht mit dem Computer verbinden
                    • in einem Terminal eingeben und ausführen
                    ls -1d /dev/ttyUSB*
                    -
                    • wenn kein solches USB-Gerät an deinem Computer angeschlossen ist, wird ein Fehler angezeigt, anderenfalls eine Liste -der vorhandenen /dev/ttyUSB Geräte, z. B.
                    /dev/ttyUSB0
                    -/dev/ttyUSB1
                    -
                    • nun den OpenBikeSensor anschließen, einige Sekunden warten und nochmal im Terminal eingeben und ausführen
                    ls -1d /dev/ttyUSB*
                    -
                    • nun sollte in der Liste der Geräte ein Eintrag dazugekommen sein, dies ist der Gerätename für deinen OpenBikeSensor
                    /dev/ttyUSB0
                    -/dev/ttyUSB1
                    -/dev/ttyUSB2  <-- neu hinzugekommen
                    -

                    Flashen

                    Führe im selben Verzeichnis, in das du die ZIP-Datei entpackt hast, folgenden Befehl aus:

                    esptool \
                    -    --chip esp32 \
                    -    --port /dev/ttyUSB0 \
                    -    --baud 921600 \
                    -    --before default_reset \
                    -    --after hard_reset \
                    -    write_flash -z \
                    -    --flash_mode dio \
                    -    --flash_freq 40m \
                    -    --flash_size detect \
                    -    0x1000 0x01000.bin \
                    -    0x8000 0x08000.bin \
                    -    0xe000 0x0e000.bin \
                    -    0x10000 0x10000.bin
                    -
                    cd ~/esptool
                    -. venv/bin/activate
                    -

                    Und das Kommando esptool durch esptool.py ersetzen.

                    • python3 esptool.py ...
                    • python esptool.py ...
                    • python3 /absoluter/pfad/zu/esptool.py ... (Pfad beim Paketmanager recherchieren)
                    • python /absoluter/pfad/zu/esptool.py ... (s. o.)
                    • python3 -m esptool ...
                    • python -m esptool ...

                    Führt auch keiner dieser Aufrufe zum Erfolg, melde dich im Forum (https://forum.openbikesensor.org), wir finden gemeinsam eine Lösung.

                    Versionsupdates

                    Versionsupdates können in weiterer Folge über die Weboberfläche des OpenBikeSensors erfolgen und nicht mehr durch den oben angeführten, doch recht komplizierten Vorgang.

                    Jetzt ist dein OpenBikeSensor einsatzbereit und du kannst mit der Konfiguration fortfahren!

                    Bei Problemen

                    Wenn du keine Schreibberechtigung hast, kannst du den Dateimodus des Geräts ändern (oder das Kommando als root ausführen):

                    sudo chmod 0x666 /dev/ttyUSB0
                    -

                    Wenn du öfter mit dem ESP32 arbeitest, installiere dir entsprechende udev-Regeln.

                    Sollte alles fehlschlagen, und du noch Fragen haben oder weitere Infos suchen, findest -du in der Community immer Hilfe.

                    3 - Flashen unter Windows

                    Installation via Browser

                    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google chrome zu öffnen und der Schritt-Für-Schritt anleitung dort zu folgen. Funktioniert das für dich nicht, folge den Schritten unten.

                    Firmware herunterladen

                    Lade das neueste -Release-Archiv -der OBS-Firmware von GitHub herunter.

                    Du benötigst die größere ZIP-Datei mit dem Namen -obs-v9.9.9.9999-initial-flash.zip. Entpacke die Dateien in einen temporären -Ordner, sie heißen 0x??????.bin. Die Zahlen sind die Basisadresse, an die die -Daten geflasht werden sollen. Mach dir keine Gedanken darüber, was das bedeutet, -dies wird in den nächsten Schritten Sinn ergeben.

                    Flash Tools herunterladen

                    Lade die “Flash Download Tools” für -ESP32 (und einige -verwandte Chips) vom Hersteller ESPRESSIF herunter und extrahieren das Archiv -in einen speziellen temporären Ordner.

                    Es erfolgt keine Installation, vielmehr wird das Tool direkt aus dem Ordner -heraus gestartet.

                    Treiber installieren

                    Du musst wahrscheinlich einen sogenannten USB-to-UART (seriellen) Treiber -installieren, damit Windows mit dem Chip auf dem ESP-Entwicklungsboard -kommunizieren kann. Da es sich um einen generischen Treiber handelt, hast du -diesen möglicherweise bereits schon bei anderen Projekten installiert? Im -Zweifelsfall lade und installiere sicherheitshalber den Treiber von der -Herstellerseite, Silicon Labs. Eventuell kann es sich auch lohnen, auf die -neueste Version zu aktualisieren. Der Treiber ist im Paket für die CP210x-Chips -enthalten. Du findest ihn auf dieser -Seite, er -heißt “CP210x Universal Windows Driver”. Folge den dort gegebenen Anweisungen.

                    Sollte der Link nicht mehr funktionieren, verwende Google, um eine -aktualisierte Version zu erhalten, aber achte wie gewohnt darauf, dass du auf -einer vertrauenswürdigen Seite landest.

                    Flash Tool Bedienung

                    Trenne alle USB-Geräte vom Computer, die du gerade nicht benötigst. Der -Anschluss könnte ansonsten bei der Auswahl des richtigen (zu flashenden) -Gerätes verwechselt werden.

                    Verbinde nun das ESP32 Board über USB-Kabel. Du kannst das Entwicklungsboard -hierfür aus dem OpenBikeSensor ausbauen, oder nur die Stromzufuhr der Batterie -mit dem Schalter trennen (normal ausschalten) und das USB-Kabel durch die -Öffnung hinter der GPS-Antenne führen und in das eingebauten Board einstecken.

                    Windows sollte bestätigen, dass ein neues Gerät erkannt wurde. Manche Kabel -funktionieren nicht, wenn dein Gerät nicht erkannt wird, probiere es mit einem -anderen.

                    Starte die ausführbare Datei flash_download_tool_3.X.X.exe im Ordner des -Flash Download Tools. Das dauert ein wenig – nur Geduld. Es öffnet zuerst ein -Konsolenfenster und schließlich eine einfache Benutzeroberfläche.

                    Wähle Entwicklermodus - ESP32 DownloadTool in der Benutzeroberfläche (der -Factory-Modus kann verwendet werden, wenn mehrere ESPs gleichzeitig geflasht -werden sollen – in diesem Fall kann man auch mehrere ESPs gleichzeitig -verbinden).

                    Eine korrekte Konfiguration der ESP32 Flash Download Tools (klicken zum Vergrößern)

                    Jetzt musst du dem Tool mitteilen, was geflasht werden soll. Oben im Dialog -gibt es mehrere Zeilen, beginnend mit Kontrollkästchen, einem Textbereich, -einen Knopf mit drei Punkten, einem @-Zeichen und einem weiteren Textbereich.

                    Wähle für jede der 4 Dateien, die wir flashen müssen, die drei Punkte aus, die -eine Dateiauswahl ermöglichen, in der du jeweils eine der 4 *.bin-Dateien der -Firmware auswählst. Die Reihenfolge ist nicht wichtig, aber du musst die -Adresse der Datei in das rechteste Textfeld eingeben. Die Adresse steht jeweils -im Dateinamen, z. B. 0x01000. Die Kästchen wechselt auf grünen Hintergrund, -was eine positive Plausibilitätsprüfung des Flash-Tools bedeutet.

                    Aktivieren nun die Kontrollkästchen, die sich vor den soeben vorgenommenen Eingaben befinden. -Alle anderen Werte bleiben auf ihren Standardeinstellungen:

                    • SPI SPEED: 40MHz
                    • SPI MODE: DIO (ändert sich gleich automatisch)
                    • FLASH SIZE: 32Mbit
                    • SpiAutoSet: nicht ausgewählt
                    • DoNotChgBin: ausgewählt

                    Unten siehst du eine Dropdown-Box mit der Beschriftung COM. Hier musst du den -richtigen COM-Port für den Flash-Vorgang auswählen. Wenn du dir nicht sicher -bist, belasse den Standardwert und versuchen einen anderen Wert, wenn der -Vorgang fehlschlägt. Stelle sicher, dass keine anderen Geräte angeschlossen -sind!

                    Drücke nun Start. Danach solltest du etwa Folgendes sehen: „Flashing in Progress“

                    Wenn alles richtig läuft, erhältst du einen Fortschrittsbalken mit einer -abschließenden Erfolgsmeldung. Ziehe danach das USB-Kabel ab. Das ESP32 kann -dann in das OpenBikeSensor-Gehäuse eingebaut werden (falls noch nicht -geschehen).

                    Versionsupdates können in weiterer Folge über die Weboberfläche des -OpenBikeSensors erfolgen und nicht mehr durch den oben angeführten, doch recht -komplizierten Vorgang.

                    Jetzt ist dein OpenBikeSensor einsatzbereit und du kannst mit der -Konfiguration -fortfahren!

                    Bei Problemen

                    Wenn du eine rote Fehlermeldung erhältst, überprüfe ob die USB-Verbindung -korrekt ist und der richtige COM-Port ausgewählt wurde. Wenn alles fehlschlägt, -und du hast Fragen oder weitere Infos suchst, findest du in der Community immer Hilfe.

                    4 - Flashen unter macOS

                    Installation via Browser

                    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google Chrome zu öffnen und der Schritt-Für-Schritt anleitung dort zu folgen. Funktioniert das für dich nicht, folge den Schritten unten.

                    Vorbereitung

                    Lade das neueste -Release-Archiv -der OBS-Firmware von GitHub herunter.

                    Du benötigst die größere ZIP-Datei mit dem Namen -obs-v9.9.9.9999-initial-flash.zip. Entpacke die Dateien in einen temporären -Ordner, sie heißen 0x??????.bin. Die Zahlen sind die Basisadresse, an die die -Daten geflasht werden sollen.

                    Installiere das Programm esptool, falls es noch nicht installiert ist. Über -Homebrew kannst du es so bekommen:

                    brew install esptool
                    -

                    Stelle sicher, dass du den Gerätenamen für das USB-Gerät kennst. Dies ist -normalerweise /dev/tty.usbserial-0001 – dies wird auch im Beispiel unten -angenommen. Auf macOS kannst du deine aktuellen USB-Geräte mit ioreg -p IOUSB -w0 -l auflisten. Suche im Zweifelsfall nach einem USB-zu-UART-USB-Gerät.

                    Flashen

                    Führe im selben Verzeichnis, in das du die ZIP-Datei entpackt hast, folgenden Befehl aus:

                    esptool.py \
                    -    --chip esp32 \
                    -    --port /dev/tty.usbserial-0001 \
                    -    --baud 921600 \
                    -    --before default_reset \
                    -    --after hard_reset \
                    -    write_flash -z \
                    -    --flash_mode dio \
                    -    --flash_freq 40m \
                    -    --flash_size detect \
                    -    0x1000 0x01000.bin \
                    -    0x8000 0x08000.bin \
                    -    0xe000 0x0e000.bin \
                    -    0x10000 0x10000.bin
                    -

                    Bei Problemen

                    Wenn du keine Schreibberechtigung hast, kannst du den Dateimodus des Geräts -ändern (oder das Kommando als root ausführen):

                    sudo chmod 0x777 /dev/tty.usbserial-0001
                    -

                    Sollte alles fehlschlagen, und du noch Fragen haben oder weitere Infos suchen, findest -du in der Community immer Hilfe.

                    - \ No newline at end of file diff --git a/docs/firmware/flash-linux/index.html b/docs/firmware/flash-linux/index.html index fee1679b..8056c1a1 100644 --- a/docs/firmware/flash-linux/index.html +++ b/docs/firmware/flash-linux/index.html @@ -1,20 +1,19 @@ -Flashen unter Linux | OpenBikeSensorFlashen unter Linux | OpenBikeSensor + - - - -

                    Flashen unter Linux

                    Alternative 1: Installation via Browser

                    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google Chrome oder Chromium zu öffnen und der Schritt-Für-Schritt Anleitung dort zu folgen. Funktioniert das für dich nicht, probiere eine der anderen Alternativen.

                    Alternative 2:

                    In der Allgemeinen Installationsanleitung wird der betriebssystemunabhängige Weg über Visual Studio Code und Platformio geschildert.

                    Alternative 3: Installation mit esptool

                    Vorbereitung

                    Lade das neueste Release-Archiv +Alternative 3: Installation mit esptool Vorbereitung Lade das neueste Release-Archiv der OBS-Firmware von GitHub herunter.">

                    Flashen unter Linux

                    Alternative 1: Installation via Browser

                    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den Web-Installer in Google Chrome oder Chromium zu öffnen und der Schritt-Für-Schritt Anleitung dort zu folgen. +Funktioniert das für dich nicht, probiere eine der Alternativen.

                    Alternative 2:

                    In der Allgemeinen Installationsanleitung wird der betriebssystemunabhängige Weg über Visual Studio Code und Platformio geschildert.

                    Alternative 3: Installation mit esptool

                    Vorbereitung

                    Lade das neueste Release-Archiv der OBS-Firmware von GitHub herunter.

                    Du benötigst die ZIP-Datei mit dem Namen obs-v9.9.9.9999-initial-flash.zip (v9.9.9.9999 steht für die Versionsnummer). Entpacke die Dateien in einem temporären Verzeichnis, sie heißen 0x??????.bin. Die Zahlen sind die Basisadresse, an die die Daten geflasht werden sollen.

                    Installation

                    Installiere das Programm esptool, falls es noch nicht installiert ist. Es ist in den meisten Linux-Distributionen verfügbar.

                    Debian GNU/Linux, Ubuntu

                    und davon abgeleitete Distributionen, wie z. B. Linux Mint

                    sudo apt install esptool
                     

                    Fedora

                    sudo dnf install esptool
                    -

                    Alternative Installation

                    Sollte Deine Linux Distribution dieses Paket nicht enthalten, dann kannst du versuchen es so zu installieren.

                    • lege ein Verzeichnis an, in dem das Tool installiert werden soll, und wechsle in dieses Verzeichnis
                    mkdir ~/esptool
                    +

                    Alternative Installation

                    Sollte Deine Linux Distribution dieses Paket nicht enthalten, dann kannst Du versuchen es so zu installieren.

                    • lege ein Verzeichnis an, in dem das Tool installiert werden soll, und wechsle in dieses Verzeichnis
                    mkdir ~/esptool
                     cd ~/esptool
                     
                    • für die Installation gib nacheinander folgende Befehle ein
                    python3 -m venv venv
                     . venv/bin/activate
                    @@ -47,8 +46,7 @@
                         0x10000 0x10000.bin
                     
                    cd ~/esptool
                     . venv/bin/activate
                    -

                    Und das Kommando esptool durch esptool.py ersetzen.

                    Und das Kommando esptool durch esptool.py ersetzen.

                    • python3 esptool.py ...
                    • python esptool.py ...
                    • python3 /absoluter/pfad/zu/esptool.py ... (Pfad beim Paketmanager recherchieren)
                    • python /absoluter/pfad/zu/esptool.py ... (s. o.)
                    • python3 -m esptool ...
                    • python -m esptool ...

                    Führt auch keiner dieser Aufrufe zum Erfolg, melde dich im Forum (https://forum.openbikesensor.org), wir finden gemeinsam eine Lösung.

                    Versionsupdates

                    Versionsupdates können in weiterer Folge über die Weboberfläche des OpenBikeSensors erfolgen und nicht mehr durch den oben angeführten, doch recht komplizierten Vorgang.

                    Jetzt ist dein OpenBikeSensor einsatzbereit und du kannst mit der Konfiguration fortfahren!

                    Bei Problemen

                    Wenn du keine Schreibberechtigung hast, kannst du den Dateimodus des Geräts ändern (oder das Kommando als root ausführen):

                    sudo chmod 0x666 /dev/ttyUSB0
                    -

                    Wenn du öfter mit dem ESP32 arbeitest, installiere dir entsprechende udev-Regeln.

                    Sollte alles fehlschlagen, und du noch Fragen haben oder weitere Infos suchen, findest -du in der Community immer Hilfe.

                    - \ No newline at end of file +

                    Wenn du öfter mit dem ESP32 arbeitest, installiere dir entsprechende udev-Regeln.

                    Sollte alles fehlschlagen, und du noch Fragen haben oder weitere Informationen suchen, findest +du in der Community immer Hilfe.

                    \ No newline at end of file diff --git a/docs/firmware/flash-macos/index.html b/docs/firmware/flash-macos/index.html index a1d6ceea..362daf39 100644 --- a/docs/firmware/flash-macos/index.html +++ b/docs/firmware/flash-macos/index.html @@ -1,14 +1,13 @@ -Flashen unter macOS | OpenBikeSensorFlashen unter macOS | OpenBikeSensor + - - - -

                    Flashen unter macOS

                    Installation via Browser

                    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google Chrome zu öffnen und der Schritt-Für-Schritt anleitung dort zu folgen. Funktioniert das für dich nicht, folge den Schritten unten.

                    Vorbereitung

                    Lade das neueste +Du benötigst die größere ZIP-Datei mit dem Namen obs-v9.9.9.9999-initial-flash.zip. Entpacke die Dateien in einen temporären Ordner, sie heißen 0x??????.bin. Die Zahlen sind die Basisadresse, an die die Daten geflasht werden sollen.">

                    Flashen unter macOS

                    Installation via Browser

                    Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den Web-Installer in Google Chrome zu öffnen und der Schritt-Für-Schritt anleitung dort zu folgen. +Funktioniert das für dich nicht, folge den Schritten unten.

                    Vorbereitung

                    Lade das neueste Release-Archiv der OBS-Firmware von GitHub herunter.

                    Du benötigst die größere ZIP-Datei mit dem Namen obs-v9.9.9.9999-initial-flash.zip. Entpacke die Dateien in einen temporären @@ -33,6 +32,5 @@ 0x10000 0x10000.bin

                    Bei Problemen

                    Wenn du keine Schreibberechtigung hast, kannst du den Dateimodus des Geräts ändern (oder das Kommando als root ausführen):

                    sudo chmod 0x777 /dev/tty.usbserial-0001
                    -

                    Sollte alles fehlschlagen, und du noch Fragen haben oder weitere Infos suchen, findest -du in der Community immer Hilfe.

                    - \ No newline at end of file +

                    Sollte alles fehlschlagen, und du noch Fragen haben oder weitere Informationen suchen, findest +du in der Community immer Hilfe.

                    Zuletzt geändert 20.01.2024: Fixed spelling, wording and updated number formatting (fce216f)
                    \ No newline at end of file diff --git a/docs/firmware/flash-python/index.html b/docs/firmware/flash-python/index.html index 23a7de65..b9638c6c 100644 --- a/docs/firmware/flash-python/index.html +++ b/docs/firmware/flash-python/index.html @@ -1,16 +1,14 @@ -Flashen mit platformio | OpenBikeSensor - - - -

                    Flashen mit platformio

                    Hast du git und python3 installiert, kannst du mit folgenden Kommandos die OpenBikeSensor Firmware bauen und flashen.

                    Vorbereiten des Firmwareverzeichnisses:

                    # Git-Repo klonen
                    +Flashen mit platformio | OpenBikeSensor
                    +

                    Flashen mit platformio

                    Hast du git und python3 installiert, kannst du mit folgenden Kommandos die OpenBikeSensor Firmware bauen und flashen.

                    Vorbereiten des Firmwareverzeichnisses:

                    # Git-Repo klonen
                     git clone https://github.com/openbikesensor/OpenBikeSensorFirmware.git
                     cd OpenBikeSensorFirmware
                     # Platformio in einem virtuellen Python Environment installieren
                     python3 -m venv venv
                     venv/bin/pip install platformio
                    -

                    Flashen

                    Nun kannst du den ESP (nicht den OpenBikeSensor) per USB-Kabel mit deinem Rechner verbinden und mit folgendem Kommando die Firmware flashen. (je nach systemkonfiguration benötigtst du dafür evtl. root-rechte). GGF ist es dafür nötig den boot-Knopf am ESP zu drücken.

                    platformio run -t upload
                    -

                    Nach dem Flashen

                    Es empfiehlt sich, dich in den Konfigurationsmodus zu begeben, um

                    • Dein internetfähiges WLAN im OpenBikeSensor zu konfigurieren.
                    • Das Flashtool zu installieren.
                    • Noch einmal ein Firmwareupdate aus dem Internet zu installieren.
                    • Deinen API-Key für Datenuploads einzurichten.
                    - \ No newline at end of file +

                    Flashen

                    Nun kannst du den ESP (nicht den OpenBikeSensor) per USB-Kabel mit deinem Rechner verbinden und mit folgendem Kommando die Firmware flashen (je nach Systemkonfiguration benötigst du dafür root-rechte). +Ggf. ist es dafür nötig den boot-Knopf am ESP zu drücken.

                    platformio run -t upload
                    +

                    Nach dem Flashen

                    Es empfiehlt sich, dich in den Konfigurationsmodus zu begeben, um

                    • Dein internetfähiges WLAN im OpenBikeSensor zu konfigurieren.
                    • Das Flashtool zu installieren.
                    • Noch einmal ein Firmwareupdate aus dem Internet zu installieren.
                    • Deinen API-Key für Datenuploads einzurichten.
                    Zuletzt geändert 20.01.2024: Small fixes. (df948e6)
                    \ No newline at end of file diff --git a/docs/firmware/flash-windows/_print/index.html b/docs/firmware/flash-windows/_print/index.html deleted file mode 100644 index 4da57b52..00000000 --- a/docs/firmware/flash-windows/_print/index.html +++ /dev/null @@ -1,61 +0,0 @@ -Flashen unter Windows | OpenBikeSensor - - - -

                    Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

                    Zur Standardansicht zurückkehren.

                    Flashen unter Windows

                      Installation via Browser

                      Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google chrome zu öffnen und der Schritt-Für-Schritt anleitung dort zu folgen. Funktioniert das für dich nicht, folge den Schritten unten.

                      Firmware herunterladen

                      Lade das neueste -Release-Archiv -der OBS-Firmware von GitHub herunter.

                      Du benötigst die größere ZIP-Datei mit dem Namen -obs-v9.9.9.9999-initial-flash.zip. Entpacke die Dateien in einen temporären -Ordner, sie heißen 0x??????.bin. Die Zahlen sind die Basisadresse, an die die -Daten geflasht werden sollen. Mach dir keine Gedanken darüber, was das bedeutet, -dies wird in den nächsten Schritten Sinn ergeben.

                      Flash Tools herunterladen

                      Lade die “Flash Download Tools” für -ESP32 (und einige -verwandte Chips) vom Hersteller ESPRESSIF herunter und extrahieren das Archiv -in einen speziellen temporären Ordner.

                      Es erfolgt keine Installation, vielmehr wird das Tool direkt aus dem Ordner -heraus gestartet.

                      Treiber installieren

                      Du musst wahrscheinlich einen sogenannten USB-to-UART (seriellen) Treiber -installieren, damit Windows mit dem Chip auf dem ESP-Entwicklungsboard -kommunizieren kann. Da es sich um einen generischen Treiber handelt, hast du -diesen möglicherweise bereits schon bei anderen Projekten installiert? Im -Zweifelsfall lade und installiere sicherheitshalber den Treiber von der -Herstellerseite, Silicon Labs. Eventuell kann es sich auch lohnen, auf die -neueste Version zu aktualisieren. Der Treiber ist im Paket für die CP210x-Chips -enthalten. Du findest ihn auf dieser -Seite, er -heißt “CP210x Universal Windows Driver”. Folge den dort gegebenen Anweisungen.

                      Sollte der Link nicht mehr funktionieren, verwende Google, um eine -aktualisierte Version zu erhalten, aber achte wie gewohnt darauf, dass du auf -einer vertrauenswürdigen Seite landest.

                      Flash Tool Bedienung

                      Trenne alle USB-Geräte vom Computer, die du gerade nicht benötigst. Der -Anschluss könnte ansonsten bei der Auswahl des richtigen (zu flashenden) -Gerätes verwechselt werden.

                      Verbinde nun das ESP32 Board über USB-Kabel. Du kannst das Entwicklungsboard -hierfür aus dem OpenBikeSensor ausbauen, oder nur die Stromzufuhr der Batterie -mit dem Schalter trennen (normal ausschalten) und das USB-Kabel durch die -Öffnung hinter der GPS-Antenne führen und in das eingebauten Board einstecken.

                      Windows sollte bestätigen, dass ein neues Gerät erkannt wurde. Manche Kabel -funktionieren nicht, wenn dein Gerät nicht erkannt wird, probiere es mit einem -anderen.

                      Starte die ausführbare Datei flash_download_tool_3.X.X.exe im Ordner des -Flash Download Tools. Das dauert ein wenig – nur Geduld. Es öffnet zuerst ein -Konsolenfenster und schließlich eine einfache Benutzeroberfläche.

                      Wähle Entwicklermodus - ESP32 DownloadTool in der Benutzeroberfläche (der -Factory-Modus kann verwendet werden, wenn mehrere ESPs gleichzeitig geflasht -werden sollen – in diesem Fall kann man auch mehrere ESPs gleichzeitig -verbinden).

                      Eine korrekte Konfiguration der ESP32 Flash Download Tools (klicken zum Vergrößern)

                      Jetzt musst du dem Tool mitteilen, was geflasht werden soll. Oben im Dialog -gibt es mehrere Zeilen, beginnend mit Kontrollkästchen, einem Textbereich, -einen Knopf mit drei Punkten, einem @-Zeichen und einem weiteren Textbereich.

                      Wähle für jede der 4 Dateien, die wir flashen müssen, die drei Punkte aus, die -eine Dateiauswahl ermöglichen, in der du jeweils eine der 4 *.bin-Dateien der -Firmware auswählst. Die Reihenfolge ist nicht wichtig, aber du musst die -Adresse der Datei in das rechteste Textfeld eingeben. Die Adresse steht jeweils -im Dateinamen, z. B. 0x01000. Die Kästchen wechselt auf grünen Hintergrund, -was eine positive Plausibilitätsprüfung des Flash-Tools bedeutet.

                      Aktivieren nun die Kontrollkästchen, die sich vor den soeben vorgenommenen Eingaben befinden. -Alle anderen Werte bleiben auf ihren Standardeinstellungen:

                      • SPI SPEED: 40MHz
                      • SPI MODE: DIO (ändert sich gleich automatisch)
                      • FLASH SIZE: 32Mbit
                      • SpiAutoSet: nicht ausgewählt
                      • DoNotChgBin: ausgewählt

                      Unten siehst du eine Dropdown-Box mit der Beschriftung COM. Hier musst du den -richtigen COM-Port für den Flash-Vorgang auswählen. Wenn du dir nicht sicher -bist, belasse den Standardwert und versuchen einen anderen Wert, wenn der -Vorgang fehlschlägt. Stelle sicher, dass keine anderen Geräte angeschlossen -sind!

                      Drücke nun Start. Danach solltest du etwa Folgendes sehen: „Flashing in Progress“

                      Wenn alles richtig läuft, erhältst du einen Fortschrittsbalken mit einer -abschließenden Erfolgsmeldung. Ziehe danach das USB-Kabel ab. Das ESP32 kann -dann in das OpenBikeSensor-Gehäuse eingebaut werden (falls noch nicht -geschehen).

                      Versionsupdates können in weiterer Folge über die Weboberfläche des -OpenBikeSensors erfolgen und nicht mehr durch den oben angeführten, doch recht -komplizierten Vorgang.

                      Jetzt ist dein OpenBikeSensor einsatzbereit und du kannst mit der -Konfiguration -fortfahren!

                      Bei Problemen

                      Wenn du eine rote Fehlermeldung erhältst, überprüfe ob die USB-Verbindung -korrekt ist und der richtige COM-Port ausgewählt wurde. Wenn alles fehlschlägt, -und du hast Fragen oder weitere Infos suchst, findest du in der Community immer Hilfe.

                      - \ No newline at end of file diff --git a/docs/firmware/flash-windows/index.html b/docs/firmware/flash-windows/index.html index 6c0e7c8d..d04462c7 100644 --- a/docs/firmware/flash-windows/index.html +++ b/docs/firmware/flash-windows/index.html @@ -1,8 +1,7 @@ -Flashen unter Windows | OpenBikeSensor - - - -

                      Flashen unter Windows

                      Installation via Browser

                      Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den webinstaller in Google chrome zu öffnen und der Schritt-Für-Schritt anleitung dort zu folgen. Funktioniert das für dich nicht, folge den Schritten unten.

                      Firmware herunterladen

                      Lade das neueste +Flashen unter Windows | OpenBikeSensor +

                      Flashen unter Windows

                      Installation via Browser

                      Der einfachste Weg, deinen OpenBikeSensor zu flashen, ist den Web-Installer in Google chrome zu öffnen und der Schritt-Für-Schritt anleitung dort zu folgen. +Funktioniert das für dich nicht, folge den Schritten unten.

                      Firmware herunterladen

                      Lade das neueste Release-Archiv der OBS-Firmware von GitHub herunter.

                      Du benötigst die größere ZIP-Datei mit dem Namen obs-v9.9.9.9999-initial-flash.zip. Entpacke die Dateien in einen temporären @@ -15,7 +14,7 @@ heraus gestartet.

                      Treiber installieren

                      Du musst wahrscheinlich einen sogenannten USB-to-UART (seriellen) Treiber installieren, damit Windows mit dem Chip auf dem ESP-Entwicklungsboard kommunizieren kann. Da es sich um einen generischen Treiber handelt, hast du -diesen möglicherweise bereits schon bei anderen Projekten installiert? Im +diesen möglicherweise schon bei anderen Projekten installiert? Im Zweifelsfall lade und installiere sicherheitshalber den Treiber von der Herstellerseite, Silicon Labs. Eventuell kann es sich auch lohnen, auf die neueste Version zu aktualisieren. Der Treiber ist im Paket für die CP210x-Chips @@ -54,7 +53,6 @@ OpenBikeSensors erfolgen und nicht mehr durch den oben angeführten, doch recht komplizierten Vorgang.

                      Jetzt ist dein OpenBikeSensor einsatzbereit und du kannst mit der Konfiguration -fortfahren!

                      Bei Problemen

                      Wenn du eine rote Fehlermeldung erhältst, überprüfe ob die USB-Verbindung +fortfahren!

                      Bei Problemen

                      Wenn du eine rote Fehlermeldung erhältst, überprüfe, ob die USB-Verbindung korrekt ist und der richtige COM-Port ausgewählt wurde. Wenn alles fehlschlägt, -und du hast Fragen oder weitere Infos suchst, findest du in der Community immer Hilfe.


                      Zuletzt geändert 16.12.2023: add references to install.openbikesensor.org, add manual on command-line flashing using platformio. (3bfe2b6)
                      Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                      Druckansicht dieses Kapitels
                      - \ No newline at end of file +und du hast Fragen oder weitere Informationen suchst, findest du in der Community immer Hilfe.


                      Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                      \ No newline at end of file diff --git a/docs/firmware/index.html b/docs/firmware/index.html index 2c221dee..3510ad5b 100644 --- a/docs/firmware/index.html +++ b/docs/firmware/index.html @@ -1,14 +1,12 @@ -Firmware | OpenBikeSensor - - - -

                      Firmware

                      Firmware ist die Bezeichung für Software, die auf eingebetteten Systemen wie +Firmware | OpenBikeSensor +

                      Firmware

                      Firmware ist die Bezeichnung für Software, die auf eingebetteten Systemen wie dem ESP32 und anderen Mikroprozessoren läuft, und dort für die Funktionalität der Hardware verantwortlich ist. Beim OpenBikeSensor ist dies also ein Programm das wir selbst schreiben, mit dem der ESP32 bespielt wird, und das sich um die Aufzeichnung der zu messenden Daten, die Anzeige im Display und die ganze -Konfigurationsoberfläche kümmert.

                      Die Firmware wird, wie alle Softwareteile, unter Open Source Lizenz auf GitHub -entwickelt: https://github.com/openbikesensor/OpenBikeSensorFirmware. Für die +Konfigurationsoberfläche kümmert.

                      Die Firmware wird, wie alle Softwareteile, unter Open-Source-Lizenz auf GitHub +entwickelt: openbikesensor/OpenBikeSensorFirmware. Für die Weiterentwicklung sind alle eingeladen, die sich für Mikroprozessorprogrammierung interessieren.

                      Featurewünsche oder Fehlerberichte sammeln wir im Issue Tracker auf @@ -23,6 +21,5 @@ Auseinanderbauen des Geräts und der Anschluss an einen Computer sind dafür nicht mehr nötig.

                      GGF musst du zunächst das “Flashtool” (über die OpenBikeSensor Oberfläche) installieren. Danach kannst du, wenn dein OpenBikeSensor in einem internetfähigen WLAN eingebucht -ist über das Wlan-Menü deines OpenBikeSensors Firmwareupdates anstoßen.

                      Bauen und Flashen der Firmware aus dem gihub-Repository

                      mit VisualStudio Code und PlatformIO

                      Zunächst VS Code und darin die Erweiterung PlatformIO -installieren.

                      Danach den gewünschten Stand der OBS-Firmware aus dem github-Repository klonen und das Verzeichnis in VS Code öffnen. Dann mit dem Upload-Befehl (Pfeil nach rechts in der Fußzeile von VS Code) oder per pio run -t upload in der PlatformIO CLI auf den ESP32 flashen.

                      Zuletzt geändert 16.12.2023: add references to install.openbikesensor.org, add manual on command-line flashing using platformio. (3bfe2b6)
                      Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                      Druckansicht dieses Kapitels
                      - \ No newline at end of file +ist über das Wlan-Menü deines OpenBikeSensors Firmwareupdates anstoßen.

                      Bauen und Flashen der Firmware aus dem GitHub-Repository

                      mit VisualStudio Code und PlatformIO

                      Zunächst VS Code und darin die Erweiterung PlatformIO +installieren.

                      Danach den gewünschten Stand der OBS-Firmware aus dem github-Repository klonen und das Verzeichnis in VS Code öffnen. Dann mit dem Upload-Befehl (Pfeil nach rechts in der Fußzeile von VS Code) oder per pio run -t upload in der PlatformIO CLI auf den ESP32 flashen.


                      Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                      \ No newline at end of file diff --git a/docs/hardware/general/case/index.html b/docs/hardware/general/case/index.html index 93a93d98..2ec096b6 100644 --- a/docs/hardware/general/case/index.html +++ b/docs/hardware/general/case/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/case/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/case/ + \ No newline at end of file diff --git a/docs/hardware/general/pcb/index.html b/docs/hardware/general/pcb/index.html index 9c0fd2a7..c23f15e5 100644 --- a/docs/hardware/general/pcb/index.html +++ b/docs/hardware/general/pcb/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/pcb/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/pcb/ + \ No newline at end of file diff --git a/docs/hardware/index.html b/docs/hardware/index.html index d333f6c1..4fa9c829 100644 --- a/docs/hardware/index.html +++ b/docs/hardware/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/ + \ No newline at end of file diff --git a/docs/hardware/v00.03.12/build-instructions/index.html b/docs/hardware/v00.03.12/build-instructions/index.html index 99ee36fa..8493c18a 100644 --- a/docs/hardware/v00.03.12/build-instructions/index.html +++ b/docs/hardware/v00.03.12/build-instructions/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/build-instructions/v00.03.12/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/build-instructions/v00.03.12/ + \ No newline at end of file diff --git a/docs/hardware/v00.03.12/parts/index.html b/docs/hardware/v00.03.12/parts/index.html index 6d56aa2f..851e9a88 100644 --- a/docs/hardware/v00.03.12/parts/index.html +++ b/docs/hardware/v00.03.12/parts/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/classic/parts/ \ No newline at end of file +https://www.openbikesensor.org/docs/classic/parts/ + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 02fcb2ed..6348ddef 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,6 +1,3 @@ -OpenBikeSensor Dokumentation | OpenBikeSensor - - - -
                      - \ No newline at end of file +OpenBikeSensor Dokumentation | OpenBikeSensor +
                      \ No newline at end of file diff --git a/docs/other/_print/index.html b/docs/other/_print/index.html deleted file mode 100644 index c276f21d..00000000 --- a/docs/other/_print/index.html +++ /dev/null @@ -1,74 +0,0 @@ -Verschiedenes | OpenBikeSensor - - - -

                      Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

                      Zur Standardansicht zurückkehren.

                      Verschiedenes

                      In diesem Bereich der Dokumentation sammeln sich Artikel, die sonst nirgendwo so richtig hinpassen.

                      1 - Hinweise für Sammelbestellungen

                      Diese Seite soll einige Informationen bereitstellen, die wir bei früheren -Sammelbestellungen gesammelt haben.

                      Überprüfe alles noch einmal

                      Bitte beachte, dass sich das Projekt noch in der Entwicklung befindet, d.h. -Änderungen in Hardware oder Design sind zu jeder Zeit möglich. Bevor du Teile -bestellst, speziell bei größeren Mengen, überprüfe bitte dass das zugrundeliegende -Design und die Teileliste zusammenpassen. Und nicht das Eine neuer ist als -das Andere. Wenn du mehrere Gehäuse drucken willst: Starte den Seriendruck -erst, nachdem du ein Gerät fertig gelötet und zusammengeschraubt hast - so -weißt du, dass alles passt.

                      Ultraschallsensor-Boards

                      Die sensibelsten Teile des OBS sind die beiden Ultraschallsensoren. -Es gibt verschiedene Modelle auf dem Markt, aber viele werden unter der gleichen -Bezeichnung verkauft, JSN-SR04T.

                      AJ-SR04M

                      • Eigenschaften:
                        • Betriebsmodus wird über Widerstand R19 gesteuert
                        • 8 MHz Schwingquarz
                        • Betriebsspannung: 3V bis 5,5V
                      • Datenblatt

                      AJ-SR04M: generelles Aussehen

                      AJ-SR04M: das Modell von der Sammelbestellung im February 2021

                      JSN-SR04T

                      • Eigenschaften:
                        • vermutlich kein Widerstand um den Betriebsmodus zu ändern
                        • quer liegender IC an der Anschlussseite
                        • 11.0592 MHz Schwingquarz
                        • Betriebsspannung: 5V
                      • Das Datenblatt, das oft auf Chinesischen Seiten erwähnt wird ist JSN-SR04T一体化超声波测距说明书.pdf (Englische Übersetzung).

                      JSN-SR04T: Vorderseite (1)

                      JSN-SR04T: Vorderseite (2)

                      JSN-SR04T: Rückseite (1)

                      JSN-SR04T: Rückseite (2)

                      JSN-SR04T-2.0

                      • Eigenschaften:
                        • Betriebsmodus wird über Widerstand R27 gesteuert
                        • 8 MHz Schwingquarz
                        • Betriebsspannung: 3,3V bis 5,5V
                      • Datenblatt

                      JSN-SR04T-2.0

                      JSN-SR04T-V3.0

                      • Eigenschaften:
                        • der Widerstand “mode” und die Überbrückungen “M1” und “M2” steuern den Betriebsmodus
                        • 8 MHz Schwingquarz
                        • Betriebsspannung: 3,3V bis 5,5V
                      • Dokumentation

                      JSN-SR04T-v3.0

                      SR04M-2

                      Nach ersten Tests scheint, dass dieses Modell nicht im OpenBikeSensor Abstandsmesser funktioniert.

                      • Eigenschaften:
                        • unbekannt

                      SR04M-2

                      2 - Privatsphäre-Zonen

                      Privatsphäre-Zonen sind ein wichtiges Konzept im OpenBikeSensor-Ökosystem. Sie werden im OpenBikeSensor selbst, als auch im Datenportal verwendet, um Deinen Standort in bestimmten Bereichen zu verbergen.

                      Dies ist eine Funktion zum Schutz der Privatsphäre. Da hochgeladene Daten im Datenportal (Open Data Repository) veröffentlicht werden können, ist es für den Benutzer möglich Privatsphäre-Zonen zu konfigurieren, um die eigene Privatsphäre zu verbergen. Im schlimmsten Fall könnte ein böswilliger Akteur anhand der Daten herausfinden, wo Du wohnst, arbeitest oder Dich häufig aufhälst.

                      So funktionieren Privatsphäre-Zonen

                      Eine Privatsphäre-Zone kann entweder im Sensorgerät selbst konfiguriert werden - wodurch sich die Aufzeichnungsaktivität ändert - oder später im Datenportal, wo die Privatsphäre-Zone dann zum Filtern von Daten vor der Veröffentlichung verwendet wird. Je nachdem, wie man den Sensor verwendet und wie groß die Bedenken sind, kann man eine oder auch beide Optionen wählen.

                      Eine Privatsphäre-Zone ist ein kreisförmiger Bereich, der durch einen Mittelpunkt und einen Radius definiert ist. Damit können Daten maskiert werden. Du kannst mehrere dieser Zonen an relevanten Orten einrichten, damit böswillige Akteure nicht erkennen können, wo deine Spuren beginnen und enden:

                      • Das Zuhause
                      • Der Arbeitsplatz, Schule, Uni
                      • Wohnungen von Freunden
                      • Jeder Ort, an dem Du Dich mit dem Fahrrad regelmäßig aufhältst

                      Aufzeichnungsalternativen

                      Es gibt 4 Alternativen für den OpenBikeSensor um persöhnliche Daten zu schützen:

                      1. Privatsphäre-Zonen im OBS einrichten
                      2. Privatsphäre-Zonen im Datenportal einrichten
                      3. die Track daten auf eigenem PC privatisieren bevor sie ins Portal hochgeldaen werden
                      4. Keine Daten hochladen

                      Welchen Modus kannst Du auswählen

                      1. Wenn Du Privatsphäre-Zonen Einstellungen im OBS vornimmst und aktivierst, werden in diesen Bereichen keine Daten aufgezeichnet, sind also für niemanden zugänglich. Auch nicht für Dich, wenn Du z.B. die SD-Karte aus dem Sensor nimmst und die Dateien auf einen Computer überträgst.

                      2. Wenn Du Deine eigenen Daten haben möchtest, diese aber nicht veröffentlicht werden sollen, kannst Du die Privatsphäre-Zonen stattdessen im Datenportal einrichten. Das bedeutet zwar, dass man darauf vertrauen muß, dass die Software des Datenportals ihre Aufgabe ordnungsgemäß erfüllt (und niemand kann garantieren, dass dies der Fall ist, aber wir versprechen, dass wir unser Bestes geben), aber Du kannst dann die unmaskierten Daten selbst vom Portal herunterladen.

                      3. Eine dritte Möglichkeit besteht darin, die Daten nicht direkt vom OBS in das Datenportal hochzuladen, sondern die Track-Dateien erst einmal auf Deinen Computer zu verschieben. Dann kannst Du mit einem eigenen Skript die Daten privatisieren, bevor sie von Deinem Computer aus in das Datenportal hochladen werden.

                      4. Die sicherste Option ist natürlich, die Daten überhaupt nicht hochzuladen. Aber wozu bauen wir dann einen OpenBikeSensor und ein Auswerte Software?

                      Ein weiterer Unterschied zwischen der Konfiguration der Privatsphäre-Zonen im OpenBikeSensor und im Datenportal ist, dass der OpenBikeSensor die Datenschutzeinstellungen nicht rückwirkend anwendet. Wenn Du also einen Ort vergessen oder nicht den richtigen Aufzeichnungsmodus gewählt hast, bevor Du losgefahren bist, sind die Daten bereits im Track gespeichert.

                      Das Datenportal hingegen wendet die Privatsphäre-Zonen bei jeder Änderung auf alle vergangenen (und zukünftigen) Tracks an.

                      Allerdings ist zu bedenken, dass, sobald die Daten im Open-Data-Repository veröffentlicht sind, jeder bereits eine Kopie heruntergeladen haben könnte, und man diese nicht mehr zurücknehmen kann. Also die Einstellungen immer überprüfen, bevor man sie veröffentlicht!

                      Privacy in the OBS ecosystem

                      Warum Privatsphäre-Zonen verschoben werden können

                      Wenn Du mehrere Tracks mit anonymisierten Daten veröffentlichst, könnte jeder die private Sphäre aus den veröffentlichten Daten rekonstruieren. Die Tracks, die von und zu einem privaten Ort innerhalb der Privatsphäre führen, werden zwar an der Grenze der Zone abgeschnitten, aber wenn Du mit dem Fahrrad in verschiedene Richtungen fährst, weg von Deinem privaten Punkt, ist es möglich, den Kreis, der zum Abschneiden der Spuren definiert wurde, mathematisch zu finden.

                      Daher ist es nicht ratsam, den Mittelpunkt der Privatsphäre genau auf die Stelle zu legen, von der Du nicht willst, dass andere sie kennen. Im OpenBikeSensor hast Du die Möglichkeit, Deine Privatsphäre manuell in eine beliebige Richtung zu verschieben. Du solltest dies nur einmal für jede Zone tun. Man kann auch ein beliebiges externes Kartentool verwenden und manuell Zentralkoordinaten für eine Privatsphäre finden, die sinnvoll erscheint, aber nicht genau der privater Standort ist.

                      Im Datenportal kannst Du den Kreis manuell so auf der Karte platzieren, dass er Deine privaten Standorte enthält. Oder Du gibst den tatsächlichen privaten Standort an und lässt die App einen zufälligen Offset wählen. Auf beiden Wegen kannst Du die verschobene Zone vor dem Speichern visuell überprüfen.

                      Übrigens: Aus demselben Grund wie oben solltest Du den Versatz Deiner Privatsphäre-Zonen nicht zu oft ändern. Andernfalls ist es möglich, viele Kreise aus den Daten zu rekonstruieren, die alle den privaten Standort enthalten. Dies würde den Zweck der Verschiebung der Privatsphäre zunichte machen, da es die Größe des Bereichs, der wahrscheinlich den privaten Standort enthält, verringert. Das wäre kontraproduktiv, es verringert die Sicherheit, anstatt sie zu erhöhen!

                      3 - Offline-Visualisierung

                      Dieser Artikel beschreibt das Vorgehen, um offline, also ohne ein voll -funktionsfähiges Portal, eine Visualisierung bestehender Trackdateien -vorzunehmen.

                      Dieses Vorgehen ist veraltet. Es funktioniert noch, aber in nächster Zeit wird -mehr Energie in die Weiterentwicklung des Portals gesteckt, da hier durch die -leistungsstärkere Architektur viel mehr Möglichkeiten zur Datenverarbeitung und -Visualisierung bestehen. Dennoch lässt sich mit diesem Vorgehen einiges -erreichen, wenn gerade kein Portal zur Hand ist, oder ein tieferer Einblick -erwünscht ist, als es das stark verarbeitende Portal erlaubt.

                      Diese Anleitung sollte mit höchstens kleinen Anpassungen auf allen -Linux-Distributionen und unter macOS funktionieren, sofern Python 3.8 oder -höher verfügbar ist. Hat deine Distribution nur ältere Versionen, schau’ doch -mal ob -Anaconda/Conda -dir hier aushelfen kann, lokal eine andere Version zu installieren. Prüfe deine -Python-Version vorab mit dem Kommando python3 -V.

                      Dieser Artikel beschreibt nur die Grundlagen, damit auch Anfänger:innen sich -ihre Daten anzeigen können. Weitere Features und Details sind direkt im -Repository -dokumentiert.

                      Code holen und installieren

                      Im Terminal am gewünschten Zielort das Git-Repository -OpenBikeSensor-Scripts -clonen:

                      git clone https://github.com/openbikesensor/OpenBikeSensor-Scripts obs-scripts
                      -

                      Zum Wechseln in das neue Verzeichnis:

                      cd obs-scripts
                      -

                      Ab sofort müssen alle Kommandos von diesem Verzeichnis aus ausgeführt werden.

                      Erstellen einer virtuellen Python-Umgebung zur Installation der Abhängigkeiten -und der Kommandozeilentools:

                      python3 -m venv env
                      -source env/bin/activate
                      -

                      Bitte achte darauf, bei Änderungen am Code das Verzeichnis env zu ignorieren -und nicht mit zu committen. Du kannst es auch woanders erstellen (z. B. in -deinem Home-Verzeichnis). Den zweiten Befehl von oben (source ...) musst du -jedes Mal ausführen, nachdem du mit einem neuen Terminal in dieses Verzeichnis -wechselst, bevor du die OBS-Skripte nutzen kannst.

                      Installation des obs-face Pakets und dessen Abhängigkeiten:

                      pip install -e .
                      -

                      Es dauert eine Weile, bis alles installiert ist. Bei Erfolg erscheint -Successfully installed … in einer der letzten Zeilen (evtl. gefolgt von -einer Warnung, die du aber ignorieren kannst), bei Misserfolg eine -Fehlermeldung. Wenn du hier Hilfe brauchst, poste die Fehlermeldung im Forum, -dort gibt es immer Unterstützung.

                      Vorbereiten der Dateien

                      Du brauchst nun geschachtelte Ordner innerhalb des Ordners obs-scripts. Diese -erstellst du mit mkdir oder mkdir -p, oder einfach mit der graphischen -Bedienoberfläche deines Betriebssystems.

                      Wir benötigen folgende Struktur:

                      data
                      -└── input
                      -    ├── user1
                      -    │   ├── track1.csv
                      -    │   └── track2.csv
                      -    └── user2
                      -        ├── track1.csv
                      -        └── track2.csv
                      -

                      Also ein Verzeichnis data in obs-scripts, darin wiederum ein Verzeichnis -input, in welchem für jede:n Benutzer:in ein eigener Ordner liegt, der alle -Tracks enthält. Es ist okay, wenn das nur ein Ordner ist, aber wenn du von -mehreren Personen die Tracks einsammelst, kannst du sie hiermit unterscheiden.

                      Datenverarbeitung

                      Auf der Kommandozeile, mit aktivierter Python-Umgebung, kannst du nun folgendes -ausführen:

                      obs-face -ACV
                      -

                      Dies dauert eine Weile, denn es werden OpenStreetMap-Daten heruntergeladen, und -dann alle Tracks aus data/input eingelesen und verarbeitet. Du kannst die -Ausgabe dieses Kommandos auf Plausibilität prüfen, um zu sehen ob alle deine -Tracks erkannt und eingelesen wurden.

                      Visualisierung

                      Für die folgenden Kommands wechseln wir zunächst ins Unterverzeichnis visualization:

                      cd visualization
                      -

                      Nun erstellen wir einen symbolischen Link zwischen der Ausgabe der Verarbeitung -und dem Visualisierungscode:

                      ln -s ../data/visualization json
                      -

                      Mit Python starten wir einen kleinen Webserver, der es uns erlaubt, das -Ergebnis im Browser zu sehen:

                      python -m http.server
                      -

                      Nun kannst du in deinem Browser eine dieser Seiten besuchen:

                      - \ No newline at end of file diff --git a/docs/other/collective-order/_print/index.html b/docs/other/collective-order/_print/index.html deleted file mode 100644 index b0aa14f7..00000000 --- a/docs/other/collective-order/_print/index.html +++ /dev/null @@ -1,19 +0,0 @@ -Hinweise für Sammelbestellungen | OpenBikeSensor - - - -

                      Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

                      Zur Standardansicht zurückkehren.

                      Hinweise für Sammelbestellungen

                        Diese Seite soll einige Informationen bereitstellen, die wir bei früheren -Sammelbestellungen gesammelt haben.

                        Überprüfe alles noch einmal

                        Bitte beachte, dass sich das Projekt noch in der Entwicklung befindet, d.h. -Änderungen in Hardware oder Design sind zu jeder Zeit möglich. Bevor du Teile -bestellst, speziell bei größeren Mengen, überprüfe bitte dass das zugrundeliegende -Design und die Teileliste zusammenpassen. Und nicht das Eine neuer ist als -das Andere. Wenn du mehrere Gehäuse drucken willst: Starte den Seriendruck -erst, nachdem du ein Gerät fertig gelötet und zusammengeschraubt hast - so -weißt du, dass alles passt.

                        Ultraschallsensor-Boards

                        Die sensibelsten Teile des OBS sind die beiden Ultraschallsensoren. -Es gibt verschiedene Modelle auf dem Markt, aber viele werden unter der gleichen -Bezeichnung verkauft, JSN-SR04T.

                        AJ-SR04M

                        • Eigenschaften:
                          • Betriebsmodus wird über Widerstand R19 gesteuert
                          • 8 MHz Schwingquarz
                          • Betriebsspannung: 3V bis 5,5V
                        • Datenblatt

                        AJ-SR04M: generelles Aussehen

                        AJ-SR04M: das Modell von der Sammelbestellung im February 2021

                        JSN-SR04T

                        • Eigenschaften:
                          • vermutlich kein Widerstand um den Betriebsmodus zu ändern
                          • quer liegender IC an der Anschlussseite
                          • 11.0592 MHz Schwingquarz
                          • Betriebsspannung: 5V
                        • Das Datenblatt, das oft auf Chinesischen Seiten erwähnt wird ist JSN-SR04T一体化超声波测距说明书.pdf (Englische Übersetzung).

                        JSN-SR04T: Vorderseite (1)

                        JSN-SR04T: Vorderseite (2)

                        JSN-SR04T: Rückseite (1)

                        JSN-SR04T: Rückseite (2)

                        JSN-SR04T-2.0

                        • Eigenschaften:
                          • Betriebsmodus wird über Widerstand R27 gesteuert
                          • 8 MHz Schwingquarz
                          • Betriebsspannung: 3,3V bis 5,5V
                        • Datenblatt

                        JSN-SR04T-2.0

                        JSN-SR04T-V3.0

                        • Eigenschaften:
                          • der Widerstand “mode” und die Überbrückungen “M1” und “M2” steuern den Betriebsmodus
                          • 8 MHz Schwingquarz
                          • Betriebsspannung: 3,3V bis 5,5V
                        • Dokumentation

                        JSN-SR04T-v3.0

                        SR04M-2

                        Nach ersten Tests scheint, dass dieses Modell nicht im OpenBikeSensor Abstandsmesser funktioniert.

                        • Eigenschaften:
                          • unbekannt

                        SR04M-2

                        - \ No newline at end of file diff --git a/docs/other/collective-order/index.html b/docs/other/collective-order/index.html index 6c7b1871..6ec6aa4b 100644 --- a/docs/other/collective-order/index.html +++ b/docs/other/collective-order/index.html @@ -1,18 +1,15 @@ -Hinweise für Sammelbestellungen | OpenBikeSensor - - - -

                        Hinweise für Sammelbestellungen

                        \ No newline at end of file diff --git a/docs/other/index.html b/docs/other/index.html index 8fad83a6..0a36fd44 100644 --- a/docs/other/index.html +++ b/docs/other/index.html @@ -1,6 +1,3 @@ -Verschiedenes | OpenBikeSensor - - - -
                        - \ No newline at end of file +Verschiedenes | OpenBikeSensor +
                        \ No newline at end of file diff --git a/docs/other/privacy-zones/index.html b/docs/other/privacy-zones/index.html index 63e750dd..4b62599b 100644 --- a/docs/other/privacy-zones/index.html +++ b/docs/other/privacy-zones/index.html @@ -1,9 +1,20 @@ -Privatsphäre-Zonen | OpenBikeSensor - - - -

                        Privatsphäre-Zonen

                        Privatsphäre-Zonen sind ein wichtiges Konzept im OpenBikeSensor-Ökosystem. Sie werden im OpenBikeSensor selbst, als auch im Datenportal verwendet, um Deinen Standort in bestimmten Bereichen zu verbergen.

                        Dies ist eine Funktion zum Schutz der Privatsphäre. Da hochgeladene Daten im Datenportal (Open Data Repository) veröffentlicht werden können, ist es für den Benutzer möglich Privatsphäre-Zonen zu konfigurieren, um die eigene Privatsphäre zu verbergen. Im schlimmsten Fall könnte ein böswilliger Akteur anhand der Daten herausfinden, wo Du wohnst, arbeitest oder Dich häufig aufhälst.

                        So funktionieren Privatsphäre-Zonen

                        Eine Privatsphäre-Zone kann entweder im Sensorgerät selbst konfiguriert werden - wodurch sich die Aufzeichnungsaktivität ändert - oder später im Datenportal, wo die Privatsphäre-Zone dann zum Filtern von Daten vor der Veröffentlichung verwendet wird. Je nachdem, wie man den Sensor verwendet und wie groß die Bedenken sind, kann man eine oder auch beide Optionen wählen.

                        Eine Privatsphäre-Zone ist ein kreisförmiger Bereich, der durch einen Mittelpunkt und einen Radius definiert ist. Damit können Daten maskiert werden. Du kannst mehrere dieser Zonen an relevanten Orten einrichten, damit böswillige Akteure nicht erkennen können, wo deine Spuren beginnen und enden:

                        • Das Zuhause
                        • Der Arbeitsplatz, Schule, Uni
                        • Wohnungen von Freunden
                        • Jeder Ort, an dem Du Dich mit dem Fahrrad regelmäßig aufhältst

                        Aufzeichnungsalternativen

                        Es gibt 4 Alternativen für den OpenBikeSensor um persöhnliche Daten zu schützen:

                        1. Privatsphäre-Zonen im OBS einrichten
                        2. Privatsphäre-Zonen im Datenportal einrichten
                        3. die Track daten auf eigenem PC privatisieren bevor sie ins Portal hochgeldaen werden
                        4. Keine Daten hochladen

                        Welchen Modus kannst Du auswählen

                        1. Wenn Du Privatsphäre-Zonen Einstellungen im OBS vornimmst und aktivierst, werden in diesen Bereichen keine Daten aufgezeichnet, sind also für niemanden zugänglich. Auch nicht für Dich, wenn Du z.B. die SD-Karte aus dem Sensor nimmst und die Dateien auf einen Computer überträgst.

                        2. Wenn Du Deine eigenen Daten haben möchtest, diese aber nicht veröffentlicht werden sollen, kannst Du die Privatsphäre-Zonen stattdessen im Datenportal einrichten. Das bedeutet zwar, dass man darauf vertrauen muß, dass die Software des Datenportals ihre Aufgabe ordnungsgemäß erfüllt (und niemand kann garantieren, dass dies der Fall ist, aber wir versprechen, dass wir unser Bestes geben), aber Du kannst dann die unmaskierten Daten selbst vom Portal herunterladen.

                        3. Eine dritte Möglichkeit besteht darin, die Daten nicht direkt vom OBS in das Datenportal hochzuladen, sondern die Track-Dateien erst einmal auf Deinen Computer zu verschieben. Dann kannst Du mit einem eigenen Skript die Daten privatisieren, bevor sie von Deinem Computer aus in das Datenportal hochladen werden.

                        4. Die sicherste Option ist natürlich, die Daten überhaupt nicht hochzuladen. Aber wozu bauen wir dann einen OpenBikeSensor und ein Auswerte Software?

                        Ein weiterer Unterschied zwischen der Konfiguration der Privatsphäre-Zonen im OpenBikeSensor und im Datenportal ist, dass der OpenBikeSensor die Datenschutzeinstellungen nicht rückwirkend anwendet. Wenn Du also einen Ort vergessen oder nicht den richtigen Aufzeichnungsmodus gewählt hast, bevor Du losgefahren bist, sind die Daten bereits im Track gespeichert.

                        Das Datenportal hingegen wendet die Privatsphäre-Zonen bei jeder Änderung auf alle vergangenen (und zukünftigen) Tracks an.

                        Allerdings ist zu bedenken, dass, sobald die Daten im Open-Data-Repository veröffentlicht sind, jeder bereits eine Kopie heruntergeladen haben könnte, und man diese nicht mehr zurücknehmen kann. Also die Einstellungen immer überprüfen, bevor man sie veröffentlicht!

                        Privacy in the OBS ecosystem

                        Warum Privatsphäre-Zonen verschoben werden können

                        Wenn Du mehrere Tracks mit anonymisierten Daten veröffentlichst, könnte jeder die private Sphäre aus den veröffentlichten Daten rekonstruieren. Die Tracks, die von und zu einem privaten Ort innerhalb der Privatsphäre führen, werden zwar an der Grenze der Zone abgeschnitten, aber wenn Du mit dem Fahrrad in verschiedene Richtungen fährst, weg von Deinem privaten Punkt, ist es möglich, den Kreis, der zum Abschneiden der Spuren definiert wurde, mathematisch zu finden.

                        Daher ist es nicht ratsam, den Mittelpunkt der Privatsphäre genau auf die Stelle zu legen, von der Du nicht willst, dass andere sie kennen. Im OpenBikeSensor hast Du die Möglichkeit, Deine Privatsphäre manuell in eine beliebige Richtung zu verschieben. Du solltest dies nur einmal für jede Zone tun. Man kann auch ein beliebiges externes Kartentool verwenden und manuell Zentralkoordinaten für eine Privatsphäre finden, die sinnvoll erscheint, aber nicht genau der privater Standort ist.

                        Im Datenportal kannst Du den Kreis manuell so auf der Karte platzieren, dass er Deine privaten Standorte enthält. Oder Du gibst den tatsächlichen privaten Standort an und lässt die App einen zufälligen Offset wählen. Auf beiden Wegen kannst Du die verschobene Zone vor dem Speichern visuell überprüfen.

                        Übrigens: Aus demselben Grund wie oben solltest Du den Versatz Deiner Privatsphäre-Zonen nicht zu oft ändern. Andernfalls ist es möglich, viele Kreise aus den Daten zu rekonstruieren, die alle den privaten Standort enthalten. Dies würde den Zweck der Verschiebung der Privatsphäre zunichte machen, da es die Größe des Bereichs, der wahrscheinlich den privaten Standort enthält, verringert. Das wäre kontraproduktiv, es verringert die Sicherheit, anstatt sie zu erhöhen!

                        - \ No newline at end of file +Privatsphäre-Zonen | OpenBikeSensor +

                        Privatsphäre-Zonen

                        Privatsphäre-Zonen sind ein wichtiges Konzept im OpenBikeSensor-Ökosystem. Sie werden im OpenBikeSensor selbst, als auch im Datenportal verwendet, um Deinen Standort in bestimmten Bereichen zu verbergen.

                        Dies ist eine Funktion zum Schutz der Privatsphäre. +Da hochgeladene Daten im Datenportal (Open Data Repository) veröffentlicht werden können, ist es für den Benutzer möglich Privatsphäre-Zonen zu konfigurieren, um die eigene Privatsphäre zu verbergen. +Im schlimmsten Fall könnte ein böswilliger Akteur anhand der Daten herausfinden, wo Du wohnst, arbeitest oder Dich häufig aufhälst.

                        So funktionieren Privatsphäre-Zonen

                        Eine Privatsphäre-Zone kann entweder im Sensorgerät selbst konfiguriert werden - wodurch sich die Aufzeichnungsaktivität ändert - oder später im Datenportal, wo die Privatsphäre-Zone dann zum Filtern von Daten vor der Veröffentlichung verwendet wird. +Je nachdem, wie man den Sensor verwendet und wie groß die Bedenken sind, kann man eine oder auch beide Optionen wählen.

                        Eine Privatsphäre-Zone ist ein kreisförmiger Bereich, der durch einen Mittelpunkt und einen Radius definiert ist, damit können Daten maskiert werden. +Du kannst mehrere dieser Zonen an relevanten Orten einrichten, damit böswillige Akteure nicht erkennen können, wo deine Spuren beginnen und enden:

                        • Das Zuhause
                        • Der Arbeitsplatz, Schule, Uni
                        • Wohnungen von Freunden
                        • Jeder Ort, an dem Du Dich mit dem Fahrrad regelmäßig aufhältst

                        Aufzeichnungsalternativen

                        Es gibt 4 Alternativen für den OpenBikeSensor, um persönliche Daten zu schützen:

                        1. Privatsphäre-Zonen im OBS einrichten
                        2. Privatsphäre-Zonen im Datenportal einrichten
                        3. die Track daten auf eigenem PC privatisieren bevor sie ins Portal hochgeladen werden
                        4. Keine Daten hochladen

                        Welchen Modus kannst Du auswählen

                        1. Wenn Du Privatsphäre-Zonen Einstellungen im OBS vornimmst und aktivierst, werden in diesen Bereichen keine Daten aufgezeichnet, sind also für niemanden zugänglich. +Auch nicht für Dich, wenn Du z.B. die SD-Karte aus dem Sensor nimmst und die Dateien auf einen Computer überträgst.

                        2. Wenn Du Deine eigenen Daten haben möchtest, diese aber nicht veröffentlicht werden sollen, kannst Du die Privatsphäre-Zonen stattdessen im Datenportal einrichten. +Das bedeutet zwar, dass man darauf vertrauen muss, dass die Software des Datenportals ihre Aufgabe ordnungsgemäß erfüllt (und niemand kann garantieren, dass dies der Fall ist, aber wir versprechen, dass wir unser Bestes geben), aber Du kannst die unmaskierten Daten selbst vom Portal herunterladen.

                        3. Eine dritte Möglichkeit besteht darin, die Daten nicht direkt vom OBS in das Datenportal hochzuladen, sondern die Track-Dateien erst einmal auf Deinen Computer zu verschieben. +Dann kannst Du mit einem eigenen Skript die Daten privatisieren, bevor sie von Deinem Computer aus in das Datenportal hochladen werden.

                        4. Die sicherste Option ist natürlich, die Daten überhaupt nicht hochzuladen. Aber wozu bauen wir dann einen OpenBikeSensor und eine Auswerte-Software?

                        Ein weiterer Unterschied zwischen der Konfiguration der Privatsphäre-Zonen im OpenBikeSensor und im Datenportal ist, dass der OpenBikeSensor die Datenschutzeinstellungen nicht rückwirkend anwendet. +Wenn Du also einen Ort vergessen oder nicht den richtigen Aufzeichnungsmodus gewählt hast, bevor Du losgefahren bist, sind die Daten bereits im Track gespeichert.

                        Das Datenportal hingegen wendet die Privatsphäre-Zonen bei jeder Änderung auf alle vergangenen (und zukünftigen) Tracks an.

                        Allerdings ist zu bedenken, dass, sobald die Daten im Open-Data-Repository veröffentlicht sind, jeder bereits eine Kopie heruntergeladen haben könnte, und man diese nicht mehr zurücknehmen kann. +Also die Einstellungen immer überprüfen, bevor man sie veröffentlicht!

                        Privatsphäre-Zonen im OBS Ökosystem

                        Warum Privatsphäre-Zonen verschoben werden können

                        Wenn Du mehrere Tracks mit anonymisierten Daten veröffentlichst, könnte jeder die private Sphäre aus den veröffentlichten Daten rekonstruieren. +Die Tracks, die von und zu einem privaten Ort innerhalb der Privatsphäre führen, werden zwar an der Grenze der Zone abgeschnitten, aber wenn Du mit dem Fahrrad in verschiedene Richtungen fährst, weg von Deinem privaten Punkt, ist es möglich, den Kreis, der zum Abschneiden der Spuren definiert wurde, mathematisch zu finden.

                        Daher ist es nicht ratsam, den Mittelpunkt der Privatsphäre genau auf die Stelle zu legen, von der Du nicht willst, dass andere sie kennen. +Im OpenBikeSensor hast Du die Möglichkeit, Deine Privatsphäre manuell in eine beliebige Richtung zu verschieben, Du solltest dies nur einmal für jede Zone tun. +Man kann auch ein beliebiges externes Kartentool verwenden und manuell Zentralkoordinaten für eine Privatsphäre finden, die sinnvoll erscheint, aber nicht genau Dein privater Standort ist.

                        Im Datenportal kannst Du den Kreis manuell so auf der Karte platzieren, dass er Deine privaten Standorte enthält. Oder Du gibst den tatsächlichen privaten Standort an und lässt die App einen zufälligen Offset wählen. +Auf beiden Wegen kannst Du die verschobene Zone vor dem Speichern visuell überprüfen.

                        Übrigens: Aus demselben Grund wie oben solltest Du den Versatz Deiner Privatsphäre-Zonen nicht zu oft ändern. Andernfalls ist es möglich, viele Kreise aus den Daten zu rekonstruieren, die alle den privaten Standort enthalten. +Dies würde den Zweck der Verschiebung der Privatsphäre zunichtemachen, da es die Größe des Bereichs, der wahrscheinlich den privaten Standort enthält, verringert. Das wäre kontraproduktiv, es verringert die Sicherheit, anstatt sie zu erhöhen!

                        \ No newline at end of file diff --git a/docs/other/visualization/_print/index.html b/docs/other/visualization/_print/index.html deleted file mode 100644 index 2e31a699..00000000 --- a/docs/other/visualization/_print/index.html +++ /dev/null @@ -1,62 +0,0 @@ -Offline-Visualisierung | OpenBikeSensor - - - -

                        Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

                        Zur Standardansicht zurückkehren.

                        Offline-Visualisierung

                          Dieser Artikel beschreibt das Vorgehen, um offline, also ohne ein voll -funktionsfähiges Portal, eine Visualisierung bestehender Trackdateien -vorzunehmen.

                          Dieses Vorgehen ist veraltet. Es funktioniert noch, aber in nächster Zeit wird -mehr Energie in die Weiterentwicklung des Portals gesteckt, da hier durch die -leistungsstärkere Architektur viel mehr Möglichkeiten zur Datenverarbeitung und -Visualisierung bestehen. Dennoch lässt sich mit diesem Vorgehen einiges -erreichen, wenn gerade kein Portal zur Hand ist, oder ein tieferer Einblick -erwünscht ist, als es das stark verarbeitende Portal erlaubt.

                          Diese Anleitung sollte mit höchstens kleinen Anpassungen auf allen -Linux-Distributionen und unter macOS funktionieren, sofern Python 3.8 oder -höher verfügbar ist. Hat deine Distribution nur ältere Versionen, schau’ doch -mal ob -Anaconda/Conda -dir hier aushelfen kann, lokal eine andere Version zu installieren. Prüfe deine -Python-Version vorab mit dem Kommando python3 -V.

                          Dieser Artikel beschreibt nur die Grundlagen, damit auch Anfänger:innen sich -ihre Daten anzeigen können. Weitere Features und Details sind direkt im -Repository -dokumentiert.

                          Code holen und installieren

                          Im Terminal am gewünschten Zielort das Git-Repository -OpenBikeSensor-Scripts -clonen:

                          git clone https://github.com/openbikesensor/OpenBikeSensor-Scripts obs-scripts
                          -

                          Zum Wechseln in das neue Verzeichnis:

                          cd obs-scripts
                          -

                          Ab sofort müssen alle Kommandos von diesem Verzeichnis aus ausgeführt werden.

                          Erstellen einer virtuellen Python-Umgebung zur Installation der Abhängigkeiten -und der Kommandozeilentools:

                          python3 -m venv env
                          -source env/bin/activate
                          -

                          Bitte achte darauf, bei Änderungen am Code das Verzeichnis env zu ignorieren -und nicht mit zu committen. Du kannst es auch woanders erstellen (z. B. in -deinem Home-Verzeichnis). Den zweiten Befehl von oben (source ...) musst du -jedes Mal ausführen, nachdem du mit einem neuen Terminal in dieses Verzeichnis -wechselst, bevor du die OBS-Skripte nutzen kannst.

                          Installation des obs-face Pakets und dessen Abhängigkeiten:

                          pip install -e .
                          -

                          Es dauert eine Weile, bis alles installiert ist. Bei Erfolg erscheint -Successfully installed … in einer der letzten Zeilen (evtl. gefolgt von -einer Warnung, die du aber ignorieren kannst), bei Misserfolg eine -Fehlermeldung. Wenn du hier Hilfe brauchst, poste die Fehlermeldung im Forum, -dort gibt es immer Unterstützung.

                          Vorbereiten der Dateien

                          Du brauchst nun geschachtelte Ordner innerhalb des Ordners obs-scripts. Diese -erstellst du mit mkdir oder mkdir -p, oder einfach mit der graphischen -Bedienoberfläche deines Betriebssystems.

                          Wir benötigen folgende Struktur:

                          data
                          -└── input
                          -    ├── user1
                          -    │   ├── track1.csv
                          -    │   └── track2.csv
                          -    └── user2
                          -        ├── track1.csv
                          -        └── track2.csv
                          -

                          Also ein Verzeichnis data in obs-scripts, darin wiederum ein Verzeichnis -input, in welchem für jede:n Benutzer:in ein eigener Ordner liegt, der alle -Tracks enthält. Es ist okay, wenn das nur ein Ordner ist, aber wenn du von -mehreren Personen die Tracks einsammelst, kannst du sie hiermit unterscheiden.

                          Datenverarbeitung

                          Auf der Kommandozeile, mit aktivierter Python-Umgebung, kannst du nun folgendes -ausführen:

                          obs-face -ACV
                          -

                          Dies dauert eine Weile, denn es werden OpenStreetMap-Daten heruntergeladen, und -dann alle Tracks aus data/input eingelesen und verarbeitet. Du kannst die -Ausgabe dieses Kommandos auf Plausibilität prüfen, um zu sehen ob alle deine -Tracks erkannt und eingelesen wurden.

                          Visualisierung

                          Für die folgenden Kommands wechseln wir zunächst ins Unterverzeichnis visualization:

                          cd visualization
                          -

                          Nun erstellen wir einen symbolischen Link zwischen der Ausgabe der Verarbeitung -und dem Visualisierungscode:

                          ln -s ../data/visualization json
                          -

                          Mit Python starten wir einen kleinen Webserver, der es uns erlaubt, das -Ergebnis im Browser zu sehen:

                          python -m http.server
                          -

                          Nun kannst du in deinem Browser eine dieser Seiten besuchen:

                          - \ No newline at end of file diff --git a/docs/other/visualization/index.html b/docs/other/visualization/index.html index 123be441..1c147833 100644 --- a/docs/other/visualization/index.html +++ b/docs/other/visualization/index.html @@ -1,8 +1,6 @@ -Offline-Visualisierung | OpenBikeSensor - - - -

                          Offline-Visualisierung

                          Dieser Artikel beschreibt das Vorgehen, um offline, also ohne ein voll +Offline-Visualisierung | OpenBikeSensor +

                          Offline-Visualisierung

                          Dieser Artikel beschreibt das Vorgehen, um offline, also ohne ein voll funktionsfähiges Portal, eine Visualisierung bestehender Trackdateien vorzunehmen.

                          Dieses Vorgehen ist veraltet. Es funktioniert noch, aber in nächster Zeit wird mehr Energie in die Weiterentwicklung des Portals gesteckt, da hier durch die @@ -52,10 +50,9 @@

                          Dies dauert eine Weile, denn es werden OpenStreetMap-Daten heruntergeladen, und dann alle Tracks aus data/input eingelesen und verarbeitet. Du kannst die Ausgabe dieses Kommandos auf Plausibilität prüfen, um zu sehen ob alle deine -Tracks erkannt und eingelesen wurden.

                          Visualisierung

                          Für die folgenden Kommands wechseln wir zunächst ins Unterverzeichnis visualization:

                          cd visualization
                          +Tracks erkannt und eingelesen wurden.

                          Visualisierung

                          Für die folgenden Befehle wechseln wir zunächst ins Unterverzeichnis visualization:

                          cd visualization
                           

                          Nun erstellen wir einen symbolischen Link zwischen der Ausgabe der Verarbeitung und dem Visualisierungscode:

                          ln -s ../data/visualization json
                           

                          Mit Python starten wir einen kleinen Webserver, der es uns erlaubt, das Ergebnis im Browser zu sehen:

                          python -m http.server
                          -

                          Nun kannst du in deinem Browser eine dieser Seiten besuchen:


                          Zuletzt geändert 06.02.2023: Rename "Software" section to "Verschiedenes" and move privacy zones and collective orders there (ba812fe)
                          Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                          Druckansicht dieses Kapitels
                          - \ No newline at end of file +

                          Nun kannst du in deinem Browser eine dieser Seiten besuchen:

                          Zuletzt geändert 20.01.2024: Small fixes. (df948e6)

                          Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                          \ No newline at end of file diff --git a/docs/user-guide/_print/index.html b/docs/user-guide/_print/index.html deleted file mode 100644 index 2400d5e1..00000000 --- a/docs/user-guide/_print/index.html +++ /dev/null @@ -1,226 +0,0 @@ -Bedienungsanleitung | OpenBikeSensor - - - -

                          Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

                          Zur Standardansicht zurückkehren.

                          Bedienungsanleitung

                          Dieser Abschnitt hilft dir bei der Benutzung deines OpenBikeSensors (OBS). -Betrachte es wie ein Handbuch, das einem Gerät beiliegt, nur dass wir es nicht -ausdrucken müssen. Egal ob du deinen Sensor selbst zusammengebaut oder einen -vorgefertigten Sensor von jemand anderem bekommen hast, diese Anleitung -beschreibt, wie du wichtige Daten mit deinem neuen Gerät sammeln kannst.

                          Falls du noch keinen OBS besitzt, schau in den Abschnitt “Hardware”. Dort -findest du Anleitungen zum Selberbau.

                          1 - Schnellstart-Anleitung

                          Diese Anleitung geht davon aus, dass du einen funktionierenden -OpenBikeSensor Classic hast.

                          Sobald du einen OpenBikeSensor hast, solltest du ein paar Dinge damit tun:

                          Funktionsprüfung

                          Beim ersten Einschalten generiert der OpenBikeSensor ein Zertifikat, der erste Start kann deshalb etwas länger dauern. Das wird währenddessen auch auf dem Display angezeigt.

                          Ab dem zweiten Einschalten sollte auf dem Display das OpenBikeSensor Logo angezeigt -werden und auf der rechten Seite ein paar Startmeldungen durchlaufen. Normalerweise steht -dort:

                          • Versionsnummer
                          • Batteriespannung (wird diese nicht angezeigt, könnte es sein, dass es ein problem mit dem Spannungsteiler gibt, mit dem die Batteriespannung gemessen wird.)
                          • config...
                          • <35|-|35> (Die konfigurierte linke und rechte Lenkerbreite, hier 35cm)
                          • SD... OK
                          • Start GPS OK
                          • CSV file... OK
                          • Wait for GPS (Sobald das GPS-Datum gefunden wurde durch die aktuelle Uhrzeit ersetzt)
                          • 0Sats sn:98 (Anzahl der bereits gefundenen Satteliten, SNR)

                          GPS testen

                          Lege dein Gerät unter freiem Himmel hin und schalte es ein. Nach ein paar -Minuten sollte es von der Ansicht mit OpenBikeSensor Logo im Display -von allein in die Messansicht (ohne OpenBikeSensor Logo im Display) wechseln. -Geschieht dies nicht oder regelmäßig erst nach 10 oder mehr Minuten, sind -probleme am GPS-Modul oder der Antenne wahrscheinlich. In der Troubleshooting-Sektion findest du ein -paar Links zur weiteren Diagnose.

                          Ultraschallsensor testen

                          Um sicherzugehen, dass dein Gerät voll funktionsfähig ist, führe vor -der ersten Montage und danach regelmäßig (z.B. jedes mal nach dem Aufladen -des Akkus oder wöchentlich) folgenden Test durch:

                          Halte dein Gerät im Freien eingeschaltet mit der linken Seite zum Himmel und -der rechten Seite nach unten in die Luft. Nachdem die Haltezeit für den -linksseitigen Messwert abgelaufen ist, sollte kein Messwert mehr angezeigt. -Hast du noch keinen GPS-Empfang und möchtest nicht warten, bis das GPS Empfang -hat, kannst du durch kurzes Drücken auf den Knopf am Display in die Messansicht -kommen.

                          Werden trotzdem gelegentlich Messwerte angezeigt (und du befindest dich unter -freiem Himmel, also nicht unter einem Baum/ einer Brücke), gibt es ein Problem -mit dem Ultraschallsensor. In der Troubleshooting-Sektion -findest du weitere Informationen.

                          Halte das Gerät nun mit der linken Seite in Richtung einer Wand, und gehe -langsam auf die Wand zu. Du solltest etwa ab 2.50m Abstand von der Wand im -Display eine abnehmende Distanz sehen. Siehst du keine Abstandsanzeige oder -erst bei deutlich unter 2,50 m Findest du in der Troubleshooting-Sektion -weitere Informationen.

                          Wenn du den Sensor in der Ansicht mit allen Messwerten -benutzt, kannst du die gleiche Funktionsprüfung auch für den rechtsseitigen -Sensor durchführen.

                          Inbetriebnahme

                          1. Befestige die Halterung für den OpenBikeSensor und die Lenkerhalterung für -das Display. Dies funktioniert je nach Modell unterschiedlich. Siehe auch -Montageanleitung.
                          2. Miss den Abstand vom Rand der Lenkstange zur Mitte des Fahrrads auf beiden -Seiten. Zieh jeweils die Hälfte der Breite des OpenBikeSensors ab, und gib -dies in den Einstellungen entsprechend als Abstands-Offset an. Wie du in den -Konfigurationsmodus kommst, siehst du in der Konfigurationsanleitung.
                          3. Richte deine Privatsphäre-Zonen ein. Mit einer Karten-App auf einem -Smartphone lässt sich dein aktueller Standort bestimmen, den du dann -eintippen kannst.
                          4. Prüfe, ob deine SD-Karte funktioniert und am besten auch leer ist. Der -OpenBikeSensor erwartet eine Fat32 Partition, SD-Karten werden üblicherweise -mit einer Fat32 Partition ausgeliefert, so dass sie im OpenBikeSensor direkt -Benutzt werden können. Neuere SD-Karten sind gelegentlich mit exFAT -formatiert und müssen auf FAT32 umformatiert werden.
                          5. Lade den Akku des Gerätes mit einem USB-C Kabel und einem normalen -USB-Ladegerät auf. Die LED am Lademodul leuchtet rot während des Ladens und -wird blau, wenn der Akku voll ist. Achtung: Lade an einem USB-A-Port auf, -mit einem beidseitigen USB-C-Kabel oder einem Netzteil, das direkt in einen -USB-C-Stecker mündet funktioniert das Laden meist nicht, da das Lademodul -nicht USB-C-korrekt Ladespannung anfordert.
                          6. Schalte das Gerät ein. Warte bis GPS-Koordinaten vorhanden sind. Dies kann -eine Weile dauern. Am schnellsten geht es, wenn das Geräte in Ruhe im Freien -liegt und nicht bewegt wird.
                          7. Montiere den Sensor am Fahrrad und fahre los. Bitte achte auf den Verkehr um -dich herum und lass dich nicht durch das Gerät ablenken.
                          8. Wenn dich ein Fahrzeug überholt (egal ob LKW, PKW, Bus, …) drück kurz auf -den Knopf. Es ist wichtig, dass auch Überholvorgänge mit ausreichend -Seitenabstand so markiert werden, um keine verzerrte Statistik zu erzeugen. -Versuche also, wirklich alle Überholvorgänge zu markieren.
                          9. Nach deiner Fahrt schalte das Gerät aus. Dafür halte den Knopf am Display -gedrückt, während du den Strom abstellst. Nur so wird sichergestellt, dass -keine Daten verloren gehen.
                          10. Du kannst deine Daten in ein Portal -hochladen, indem du einen Account erstellst, den API-Key von den -Profileinstellungen in die Konfiguration des OpenBikeSensors kopierst, und -im Konfigurationsmodus auf “Upload tracks” drückst, oder den Knopf am -Display gedrückt hältst. Für letzteres muss das Gerät in einem WLAN mit -Internetzugang sein.

                          2 - Montage des Sensors am Fahrrad

                          Überblick

                          Diese Montageanleitung beschreibt die Möglichkeiten, wie ein OpenBikeSensor am -Fahrrad befestigt werden kann. Zur Auswahl stehen einige verschiedene Modelle, -um an möglichst vielen Fahrrädern eine einfache und sichere Montage zu -ermöglichen.

                          • Sattelstützen-Halterung (Seat post mount), für die Montage unter dem -Sattel, an der Sattelstütze.
                          • Oberrohr-Halterung (Top tube mount) sitzt auf dem Oberrohr des Rahmens.
                          • Gepäckträger-Halterung (Bike rack mount) ist am Gepäckträger befestigt.

                          Für die Befestigung des Displays am Lenker wird die Displayhalterung -verwendet, die universell ist.

                          Die meisten Halterungen werden mit Kabelbindern befestigt. Sie bleiben -dauerhaft am Rad, das Gerät lässt sich davon jedoch abnehmen, um nicht im Regen -zu stehen oder gestohlen zu werden.

                          Kompatibilität

                          • Bei der Sattelstützenhalterung zeigt die Schiene zum Aufschieben des -Hauptgehäuses nach hinten. Hierfür passt ein OpenBikeSensor Hauptgehäuse der -Variante “Back Rider” (das ist das Standardmodell) am besten, mit dem “Top -Rider” an dieser Halterung stünde das Gehäuse senkrecht und so wäre das Logo -verdreht.
                          • Die Halterungen für Oberrohr und Gepäckträger haben die Schiene oben, hierfür -ist ein “Top rider” Hauptgehäuse nötig, oder ein Adapter der einen “Back -rider” zu einem “Top rider” macht. Alternativ fährt der OpenBikeSensor -senkrecht, was für die Messergebnisse keinen Unterschied macht, aber nicht so -ästhetisch ist und zu einem um 90° gedrehten Logo führt.
                          • Die Varianten “Back rider” und “Top Rider” werden in der Gehäusedokumentation erläutert.
                          • Alle Halterungen haben die gleiche Schiene, die mit dem -StandardMountAdapter kompatibel ist. Dieser wird an der passenden Stelle am -Hauptgehäuse fest angeschraubt.
                          • Für das Displaygehäuse gibt es nur eine Halterung.

                          Halterungen für das Hauptgehäuse

                          Sattelstützen-Halterung

                          Diese Halterung wird mittels zweier Kabelbindern (max 8mm breit) an der -Sattelstütze befestigt. Zur Verdrehsicherung kann ein Stück Isolierband oder -Fahrradschlauch zwischen Sattelstütze und Halterung befestigt werden.

                          Sattelstützenhalterung mit Kabelbindern an der Sattelstütze

                          Gepäckträger-Halterung

                          Die Gepäckträger-Halterung besteht aus mehreren Teilen:

                          • 2 Seitenteile
                          • 1 Mittelteil, das es in längs- und Quervariante gibt
                          • 2 Stück Rundholz oder Aluminium-Rohr mit Durchmesser 10 mm, je nach -Größe des Gepäckträgers ca. 12-16 cm lang.

                          Die Rundstäbe verbinden die drei 3D-gedruckten Teile und lassen sich auf die -benötigte Breite des Gepäckträgers anpassen. Seiten- und Mittelteile können -mithilfe von Einschmelzmuttern und M3x8 Schrauben auf die Stäbe geklemmt oder -für dauerhafte Montage mit den Stäben verklebt werden.

                          Die Seitenteile werden mit Kabelbindern befestigt. Es gibt viele Möglichkeiten, -diese Konstruktion am Fahrrad anzubringen:

                          Option 1, unterhalb der Gepäckauflagefläche, hängendOption 2, vorn auf dem Gepäckträger, vor dem BügelOption 3, unterhalb der Gepäckauflagefläche, auf den zweiten Längsrohren aufliegendOption 4, unterhalb des Rücklichts

                          Die gewählte Option hängt stark vom Gepäckträger, dem Fahrrad, und der -gewünschten Nutzung ab. Nicht jede Montageart erlaubt die volle Nutzung des -Gepäckträgers und schränkt z. B. die Nutzbarkeit der Gepäckauflagefläche oder -die Anbringung von Satteltaschen ein. Ob die Nutzbarkeit eingeschränkt wird -hängt je nach Montageoption außerdem davon ab, ob ein Sensor angebracht ist -oder nicht. Insgesamt ist die Wahl der Montageart also sehr individuell.

                          Ein alternatives Mittelteil ermöglicht auch eine Montage in Längsrichtung -(nicht gezeigt), bei der die “Seitenteile” auf zwei parallelen, quer zur -Fahrtrichtung verlaufenden Stangen aufliegen.

                          Oberrohr-Halterung

                          Die Oberrohrhalterung ist eine modifizierte Sattelstützenhalterung, die einen -breiteren Radius zum Rohr hat und nicht angewinkelt ist. Bei horizontaler -Montage zeigt die Schiene nach oben, also ist ein Top Rider Hauptgehäuse -nötig.

                          Die Oberrohrhalterung sollte nur verwendet werden, wenn durch die Haltung -des/der Fahrer:in keine Beeinträchtigung der Messergebnisse vorliegt, z. B. -indem Arme oder Beine in den Bereich der Sensoren gelangen.

                          Displayhalterung

                          Das Display wird am Lenker in der Nähe des linken oder rechten Handgriffes -befestigt. Die ehemals verfügbaren Halterungen zum Anschrauben haben sich nicht -bewährt, weil sie häufig gebrochen sind. Stattdessen wird nur noch eine -Displayhalterung angeboten, diese wird mit zwei Kabelbindern oder alternativ mit -einer Schlauchschelle befestigt. Auch hier hilft ein Stück Klebeband oder alter -Fahrradschlauch gegen Verdrehen oder Verrutschen.

                          Eine Halterung sollte reichen! Die mittlere, weiße Halterung zeigt das -aktuelle Modell mit Kabelbinder.

                          Optimal ist es, wenn der Druckknopf in direkter Reichweite des Daumens liegt, -um beim Drücken die Hand nicht vom Lenker nehmen zu müssen -(Verkehrssicherheit).

                          Befestigung des Geräts

                          Zunächst muss der Sicherungsstift vorbereitet werden. Dafür wird in das -3D-gedruckte Bauteil ein Schraube (M3x16 bis M3x20) eingeschraubt. Diese sollte -fest darin sitzen, wenn sie nicht gut greift hilft ein wenig Sekundenkleber.

                          Dann wird das Gerät seitlich auf die Halterungsschiene geschoben und mit den -Sicherungsstift gesichert. Der Stift wird dafür um 180° im Loch gedreht.

                          Gerät von der Seite einschieben

                          Sicherungsstift einstecken und drehen

                          Es gibt Geräte mit sehr unterschiedlichen Kabellängen. Für große Tiefeinsteiger -werden bis zu 1,8m Kabel benötigt. Das Kabel muss auf jeden Fall so verlegt -werden, dass es während der Fahrt die Sicherheit nicht beeinträchtigt. Es kann -durch Umwickeln, wiederverwendbare Kabelbinder, Klebeband oder geeignete -Kabelclips gesichert werden.

                          Kabel um Rahmen gewickelt

                          Das Display wird von links auf die Halterung geschoben und hält sich selbst mit -den darin enthaltenen Magneten fest.

                          Display auf die Halterung schieben

                          3 - Einstellungen

                          Diese Seite beschreibt, wie du an deinem OpenBikeSensor Classic die -Einstellungen änderst.

                          Wenn du deinen OpenBikeSensor zum ersten mal benutzt, solltest du zunächst -einige wichtige Einstellungen anpassen. Mehr dazu unten bei “Wichtige -Einstellungen”.

                          Konfigurationsmodus

                          Zuerst musst du den OpenBikeSensor in den Konfigurationsmodus bringen. Schalte -das Gerät dafür aus, halte den Knopf am Display gedrückt, und schalte es wieder -ein. Nach einigen Sekunden kannst du den Knopf loslassen.

                          Wenn du zuvor ein WLAN konfiguriert hast, wählt sich der Sensor nun in dieses -WLAN ein. Ansonsten, oder falls dieses WLAN nicht verfügbar ist, startet das -Gerät im “Access Point” Modus, in dem es selbst ein WLAN aufmacht, dessen Namen -mit “OpenBikeSensor” beginnt. In diesem Fall ist das WLAN-Passwort -12345678.

                          Nimm nun ein Smartphone oder einen Computer zur Hand, und gehe mit diesem in -das gleiche Netz wie der OpenBikeSensor – entweder dein konfiguriertes -WLAN/Heimnetz, oder das WLAN das der OpenBikeSensor geöffnet hat. Öffne einen -Browser (z. B. Firefox) und gib dort in die Adressleiste die IP-Adresse ein, -die im Display des Gerätes steht.

                          Es sollte sich nun die Login-Seite des OpenBikeSensors öffnen. Auf einem -Smartphone muss du möglicherweise die mobilen Daten deaktivieren, damit das -funktioniert.

                          Login in das Konfigurationsmenü

                          Zugang zum Konfigurationsmenü ist durch eine verschlüsselte Verbindung und eine PIN gesichert.

                          Die verschlüsselte Verbindung benutzt du durch Klick auf go to https. Dein -Browser wird dir nun eine Zertifikatswarnung anzeigen, die du ignorieren darfst -(das solltest du normalerweise im Internet auf jeden Fall vermeiden – hier ist -es okay). Alternativ kannst du eine unverschlüsselte Verbindung benutzen, indem -du enable unencrypted access anklickst. Dies solltest du nur in sicheren -Drahtlosnetzen verwenden, zum Beispiel in deinem eigenen Heimnetz.

                          Nach Auswahl des Konfigurationsmodus wird im Browser ein Nutzername und ein -Passwort verlangt. Der Benutzername ist egal, du kannst also zum Beispiel -obs eintippen, das Feld darf nur nicht leer bleiben. Das Passwort wird im -Display des Geräts angezeigt, es ist ein bis zu sechsstelliger Zahlencode.

                          Wichtige Einstellungen

                          Zum direkten Nutzen eines neuen OpenBikeSensors solltest du mindestens 3 -Einstellungen vornehmen:

                          • Lenkerbreite
                            • Miss den horizontalen Abstand deines linken und rechten Lenkerrands bis zur -Radmitte. Ein symmetrischer Lenker hat zum Beispiel 75cm Breite, das heißt -37.5cm auf jeder Seite. Ein asymmetrisches Fahrrad hat eventuell -unterschiedliche Werte.
                            • Ziehe von beiden Werten (links und rechts) jeweils 2.5cm ab, um die Breite -des Sensors (5cm) zu korrigieren. Unser obiger Beispiellenker hat dann -einen Offset-Wert von je 35cm.
                            • Diese Werte, in Zentimetern, trage unter General bei Offset Sensor Left -und Offset Sensor Right ein.
                            • Speichern nicht vergessen.
                            • Nun kann das Gerät den tatsächlichen Abstand zum Fahrrad ermitteln, nachdem -es den Abstand vom Sensor aus gemessen hat.
                          • WLAN-Einstellungen zum Hochladen der Daten
                            • Um deine Fahrten hochzuladen musst du dem OpenBikeSensor beibringen, ins -Internet zu kommen.
                            • Trage dafür den Namen und das Passwort deines WLANs unter Wifi bei SSID -und Password ein. Achte auf korrekte Schreibweise inklusive Groß- und -Kleinschreibung bei beiden Einträgen.
                            • Speichern nicht vergessen.
                            • Beim nächsten Start in den Konfigurationsmodus wird das Gerät sich mit -diesem WLAN verbinden, und nur ein eigenes WLAN aufmachen, falls das nicht -klappt. Im Display kannst du sehen, in welchem WLAN das Gerät eingewählt -ist.
                          • API-Schlüssel
                            • Du wirst deine Fahrten vermutlich in ein regionales oder projektbezogenes -Portal hochladen wollen. Eine Liste verfügbarer Portale befindet sich im -Forum.
                            • Erstelle einen Account auf dem ausgewählten Portal. Logge dich dort ein und -navigiere über dein Profilsymbol zur Einstellungsseite. Dort findest du -deinen “API-Schlüssel” (oder Englisch “API Key”).
                            • Kopiere diesen Schlüssel und füge ihn unter General im Bereich Upload -User Data wieder ein.
                            • Kopiere ebenfalls die “API URL” aus deinem Profil und füge sie ebenfalls -hier ein.
                            • Speichern nicht vergessen.

                          Mit diesen Einstellungen kannst du nun Fahrten korrekt aufzeichnen und dann -hochladen.

                          Alle Einstellungen

                          Eine sinnvolle Konfiguration ist voreingestellt und sollte nur bei Bedarf -verändert werden. Hier erklären wir die einzelnen Einstellungen im Detail.

                          General

                          • Sensor

                            Bestimmt die Differenz zwischen dem Ende des Lenkers und der Außenkante des -OpenBikeSensors. Diese Werte werden automatisch von der aktuellen Messung -subtrahiert. Zusätzlich kannst du die linke und rechte Messung „vertauschen“, -falls du das Gerät am Fahrrad umgekehrt montierst.

                          • GPS

                            Du kannst festlegen, auf welche Weise das Gerät einen gültigen GPS-Fix -bestätigt und die Messungen beginnt. Typischerweise wird es den regulären -Betrieb aufnehmen, sobald es Kontakt zu 4 GPS-Satelliten hat.

                          • Generic Display

                            • drehen des Displays, falls du es über Kopf montiert hast
                            • invertieren der hellen / dunklen Bereiche des Displays, was bei hellem Sonnenlicht helfen kann
                          • Measurement Display

                            Hier gibt es mehrere Optionen dafür, verschiedene Werte auf dem Display anzuzeigen:

                            • „simple Mode“ – nur die Anzeige der Abstandsmessung nach links
                            • Anzeige von linker / rechter Abstandsmessung
                            • show satellite – Anzeige der Anzahl der vom Gerät erkannten GPS-Satelliten (mehr Satelliten – genauere Positionsbestimmung)
                            • show velocity – Anzeige der aktuellen Geschwindigkeit (recht ungenau aufgrund der langsamen GPS-Messintervalle)
                            • show confirmation stats – zählt Tastendruck und bestätigte Erkennung von Überholvorgängen
                            • show nerd details for distance sensors – Anzeige der Sensor-Rohdaten und Anzahl der Messereignisse innerhalb einer Sekunde (hilfreich bei der Fehlersuche)
                          • Privacy Options

                            Um deine Privatsphäre zu wahren, kannst du dem Gerät mitteilen, dass es die -Aufzeichnung in der Nähe deiner Wohnung oder einer anderen Privatsphäre-Zone -unterdrücken soll. Es ist möglich hier generell keine Aufzeichnung zu machen, -oder nur den GPS-Track zu unterdrücken, aber immer noch alle bestätigten -Überholvorgänge zu speichern.

                            Mehr Infos zu Privatsphäre-Zonen gibt es auf dieser Seite.

                          • Upload User Data

                            Einrichtung der Portalverbindung zum Hochladen der aufgezeichneten -Streckendaten. Wie diese korrekt eingerichtet wird, ist oben bei “Wichtige -Einstellungen” beschrieben.

                          • Operation

                            • Enable Bluetooth – aktivieren, wenn du den OpenBikeSensor mit einer kompatiblen Smartphone App, wie z.B. SimRa, verbinden willst
                            • SimRa Mode – aktivieren, wenn du den OpenBikeSensor mit der SimRa App verbinden willst

                          Privacy Zones

                          Hier kannst du einzelne Privatzonen mit jeweils eigenem Mittelpunkt und Radius -festlegen. In den Privatsphäre-Optionen unter General entscheidest du, wie -sich der OpenBikeSensor innerhalb dieser Privatsphäre-Zone verhalten soll.

                          WiFi Settings

                          Der OpenBikeSensor kann sich mit einem verfügbaren WLAN verbinden, wenn du hier -dessen Zugangsdaten angibst. Dies ist notwendig für den Upload zum Portal und -außerdem praktisch, wenn du bei der Konfiguration des Sensors mit deinem -eigenen WLAN verbunden bleiben möchtest.

                          Backup & Restore

                          Hier kannst du Einstellungen des OpenBikeSensors auf deinem PC oder mobilen -Gerät sichern. Zum Wiederherstellen aus einer gespeicherten Konfiguration wähle -im Menü-Dialog die entsprechende Datei aus.

                          Verwende diese Option vor einem Firmware-Update um sicherzustellen, dass du -deine Einstellungen wiederherstellen kannst, falls beim Update etwas -schiefgeht.

                          Update Firmware

                          Hier kannst du ein Update für die Firmware hochladen. Die neueste Version findest du immer -auf GitHub.

                          Nach einem erfolgreichen Update wird der OpenBikeSensor automatisch neu -gestartet.

                          Reboot

                          Mit dieser Option startet das Gerät wieder in den regulären Messmodus und -verlässt die Einstellungen.

                          4 - Aufzeichnung einer Messfahrt

                          Vorbereitung

                          Grundsätzlich muss vor Beginn einer Messfahrt der Ladezustand des Akkus geprüft -werden. Dazu das Gerät einschalten und die Spannungsanzeige im Display oben -rechts ablesen. Sie muss größer als 3,6 V sein. Bei Bedarf vor der Messfahrt -mittels USB-C Ladekabel nachladen.

                          Das Gerät im Freien platzieren, einschalten und auf den korrekten GPS-Empfang -warten. Dies kann eine Weile dauern, auch mal bis zu 10 Minuten. Wir arbeiten -daran, dass dies in Zukunft eventuell schneller klappt.

                          Bei empfangenen GPS Signal erscheint die reguläre Distanzanzeige für den linken -Überholabstand. Die korrekte Funktion kann gegen eine Wand überprüft werden:

                          • Linken Sensor ins Freie ohne Hindernisse richten. Die Anzeige sollte --- cm zeigen.
                          • Linken Sensor gegen eine Wand gerichtet (max. 2,50 m Abstand). Die Anzeige -sollte den Abstand, minus der halben Lenkerbreite (also bei -Standardeinstellung minus 35cm) anzeigen.

                          Gerät am Fahrrad befestigen, wie unter „Montage“ beschrieben, und Messfahrt -beginnen. Die gefahrene Strecke (Track) wird aufgezeichnet.

                          Datenschutz für Privatzonen

                          Um in den veröffentlichten Aufzeichnungen den eigenen Wohnort unkenntlich zu -halten, wird empfohlen, die Messfahrt entfernt vom Wohnort zu starten und zu -beenden.

                          Überholvorgänge markieren

                          Prinzipiell werden kontinuierlich die Abstände links und rechts gemessen und -auf einer SD-Karte gespeichert. Darin sind alle Hindernisse innerhalb des -maximalen Messbereiches (285 cm) enthalten, auch Häuser, Masten, Radfahrer, -Fußgänger usw., die nicht dem Messzweck dienen. Nähert sich ein KFZ von -hinten, muss der Knopf am Display gedrückt werden, um den Überholvorgang zu -erfassen. Bitte achte dabei auf deine eigene Sicherheit: Es ist nicht notwendig, -während des Überholvorgangs selbst auf den Button zu drücken. Es ist ausreichend, -dies innerhalb von ca. 5 Sekunden nach der ersten Erfassung des Seitenabstands zu tun.

                          Das Display bestätigt den Überholvorgang:

                          • durch kurzes Invertieren der Anzeige
                          • durch Hochzählen der Anzeige „press“
                          • durch Hochzählen der Anzeige „conf“, falls dabei ein Objekt auf der linken Seite erkannt wurde

                          Beenden der Messfahrt

                          Bei gedrücktem Knopf das Gerät ausschalten. Nur so werden alle Messungen zuverlässig gespeichert.

                          Die Aufzeichnung erfolgt in einer CSV-Datei mit einem Dateinamen, der von -Datum, Uhrzeit und der Geräte-ID abhängt, also zum Beispiel -2021-01-20T13.32.52-4495.obsdata.csv.

                          5 - Tracks hochladen

                          Voraussetzungen

                          Damit Tracks hochgeladen werden können, müssen mindestens die unter “Wichtige -Einstellungen” aufgeführten Einstellungen vorgenommen worden sein. Das sind -die Einrichtung der WLAN-Verbindung sowie des API-Zugangs zum Portal.

                          Mit WLAN verbinden

                          Halte den Knopf des OpenBikeSensors gedrückt und schalte ihn dann ein. Nun wird -sich das Gerät in dein konfiguriertes WLAN einwählen. Sofern das klappt zeigt -der OpenBikeSensor den Namen des WLANs und die IP-Adresse im Display an.

                          Kommt keine Verbindung zustande, macht der OpenBikeSensor nach 10 Sekunden einen -eigenen AccessPoint auf. Ein Hochladen der Tracks ist im AccessPoint-Modus -nicht möglich, da dann keine Verbindung zum Internet besteht. Verbinde dich -dann mit diesem Netzwerk wie unter Einstellungen beschrieben und stelle die WLAN-Details richtig ein.

                          Upload starten

                          Wenn der OpenBikeSensor mit einem WLAN verbunden ist, kann der Upload gestartet -werden, indem der Knopf gedrückt und gehalten wird, bis der Upload startet.

                          Alternativ kann der Upload auch aus dem Konfigurationsmenü vom Handy oder PC -aus gestartet werden.

                          6 - OpenBikeSensor mit der SimRa-App betreiben

                          Es ist möglich, den OpenBikeSensor per Bluetooth mit der SimRa App zu verbinden. SimRa steht für “Sicherheit im Radverkehr” und ist eine App, die beim Radfahren aktiviert ist und über die Sensoren des Smartphones herauszufinden versucht, wann es gefährliche Situationen gab, die man anschließend beschreiben und bewerten kann. Durch die Kopplung mit dem OpenBikeSensor bekommt die SimRa App zusätzlich die Überholabstände.

                          SimRa App installieren

                          OpenBikeSensor konfigurieren

                          In der Konfigurationsoberfläche des OpenBikeSensor aktiviert man im Untermenü “General” ganz unten Bluetooth im Bereich “Operation”:

                          Bluetooth-Einstellungen im OpenBikeSensor

                          SimRa Mode: Normalerweise wählt sich der OpenBikeSensor in ein WLAN ein bzw. -stellt einen WLAN-Hotspot zur Verfügung, wenn er ohne angeschlossenes Display -eingeschaltet wird. Aktiviert man den “SimRa Mode”, dann passiert das nicht.

                          Wenn “SimRa Mode” aktiviert wird, dann startet der OpenBikeSensor nicht im -Server Modus, wenn das Display nicht angeschlossen ist.

                          Nach dem Speichern kann man das Gerät neustarten.

                          SimRa App einrichten

                          Bluetooth muss natürlich auf dem Smartphone aktiviert sein.

                          Android

                          1. App starten.

                          2. In die Einstellungen gehen und unten OpenBikeSensor aktivieren:

                          3. OpenBikeSensor Einstellungen öffnen. Verfügbare Geräte werden gesucht.

                          4. Auf den Eintrag mit “OpenBikeSensor xxx” drücken und anschließend auf “Verbinden” drücken.

                          5. Der jeweils gemessene Wert sollte jetzt angezeigt werden.

                          6. Jetzt muss man noch einstellen, wie breit der Lenker des Fahrrad (von der -Mitte) ist.

                          7. Optional kann aktiviert werden, dass ein Foto mit dem Smartphone gemacht -werden soll, wenn der Überholabstand unterschritten wird. Dazu muss das -Smartphone natürlich entsprechend am Fahrrad befestigt und ausgerichtet -sein.

                          In der SimRa App wird nun links unten ein blaues Bluetooth Symbol angezeigt, -wenn Bluetooth aktiviert ist und ein grünes Symbol, wenn der OpenBikeSensor -verbunden werden konnte.

                          - \ No newline at end of file diff --git a/docs/user-guide/configuration/_print/index.html b/docs/user-guide/configuration/_print/index.html deleted file mode 100644 index 865afb34..00000000 --- a/docs/user-guide/configuration/_print/index.html +++ /dev/null @@ -1,75 +0,0 @@ -Einstellungen | OpenBikeSensor - - - -

                          Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. -Druckvorgang starten.

                          Zur Standardansicht zurückkehren.

                          Einstellungen

                            Diese Seite beschreibt, wie du an deinem OpenBikeSensor Classic die -Einstellungen änderst.

                            Wenn du deinen OpenBikeSensor zum ersten mal benutzt, solltest du zunächst -einige wichtige Einstellungen anpassen. Mehr dazu unten bei “Wichtige -Einstellungen”.

                            Konfigurationsmodus

                            Zuerst musst du den OpenBikeSensor in den Konfigurationsmodus bringen. Schalte -das Gerät dafür aus, halte den Knopf am Display gedrückt, und schalte es wieder -ein. Nach einigen Sekunden kannst du den Knopf loslassen.

                            Wenn du zuvor ein WLAN konfiguriert hast, wählt sich der Sensor nun in dieses -WLAN ein. Ansonsten, oder falls dieses WLAN nicht verfügbar ist, startet das -Gerät im “Access Point” Modus, in dem es selbst ein WLAN aufmacht, dessen Namen -mit “OpenBikeSensor” beginnt. In diesem Fall ist das WLAN-Passwort -12345678.

                            Nimm nun ein Smartphone oder einen Computer zur Hand, und gehe mit diesem in -das gleiche Netz wie der OpenBikeSensor – entweder dein konfiguriertes -WLAN/Heimnetz, oder das WLAN das der OpenBikeSensor geöffnet hat. Öffne einen -Browser (z. B. Firefox) und gib dort in die Adressleiste die IP-Adresse ein, -die im Display des Gerätes steht.

                            Es sollte sich nun die Login-Seite des OpenBikeSensors öffnen. Auf einem -Smartphone muss du möglicherweise die mobilen Daten deaktivieren, damit das -funktioniert.

                            Login in das Konfigurationsmenü

                            Zugang zum Konfigurationsmenü ist durch eine verschlüsselte Verbindung und eine PIN gesichert.

                            Die verschlüsselte Verbindung benutzt du durch Klick auf go to https. Dein -Browser wird dir nun eine Zertifikatswarnung anzeigen, die du ignorieren darfst -(das solltest du normalerweise im Internet auf jeden Fall vermeiden – hier ist -es okay). Alternativ kannst du eine unverschlüsselte Verbindung benutzen, indem -du enable unencrypted access anklickst. Dies solltest du nur in sicheren -Drahtlosnetzen verwenden, zum Beispiel in deinem eigenen Heimnetz.

                            Nach Auswahl des Konfigurationsmodus wird im Browser ein Nutzername und ein -Passwort verlangt. Der Benutzername ist egal, du kannst also zum Beispiel -obs eintippen, das Feld darf nur nicht leer bleiben. Das Passwort wird im -Display des Geräts angezeigt, es ist ein bis zu sechsstelliger Zahlencode.

                            Wichtige Einstellungen

                            Zum direkten Nutzen eines neuen OpenBikeSensors solltest du mindestens 3 -Einstellungen vornehmen:

                            • Lenkerbreite
                              • Miss den horizontalen Abstand deines linken und rechten Lenkerrands bis zur -Radmitte. Ein symmetrischer Lenker hat zum Beispiel 75cm Breite, das heißt -37.5cm auf jeder Seite. Ein asymmetrisches Fahrrad hat eventuell -unterschiedliche Werte.
                              • Ziehe von beiden Werten (links und rechts) jeweils 2.5cm ab, um die Breite -des Sensors (5cm) zu korrigieren. Unser obiger Beispiellenker hat dann -einen Offset-Wert von je 35cm.
                              • Diese Werte, in Zentimetern, trage unter General bei Offset Sensor Left -und Offset Sensor Right ein.
                              • Speichern nicht vergessen.
                              • Nun kann das Gerät den tatsächlichen Abstand zum Fahrrad ermitteln, nachdem -es den Abstand vom Sensor aus gemessen hat.
                            • WLAN-Einstellungen zum Hochladen der Daten
                              • Um deine Fahrten hochzuladen musst du dem OpenBikeSensor beibringen, ins -Internet zu kommen.
                              • Trage dafür den Namen und das Passwort deines WLANs unter Wifi bei SSID -und Password ein. Achte auf korrekte Schreibweise inklusive Groß- und -Kleinschreibung bei beiden Einträgen.
                              • Speichern nicht vergessen.
                              • Beim nächsten Start in den Konfigurationsmodus wird das Gerät sich mit -diesem WLAN verbinden, und nur ein eigenes WLAN aufmachen, falls das nicht -klappt. Im Display kannst du sehen, in welchem WLAN das Gerät eingewählt -ist.
                            • API-Schlüssel
                              • Du wirst deine Fahrten vermutlich in ein regionales oder projektbezogenes -Portal hochladen wollen. Eine Liste verfügbarer Portale befindet sich im -Forum.
                              • Erstelle einen Account auf dem ausgewählten Portal. Logge dich dort ein und -navigiere über dein Profilsymbol zur Einstellungsseite. Dort findest du -deinen “API-Schlüssel” (oder Englisch “API Key”).
                              • Kopiere diesen Schlüssel und füge ihn unter General im Bereich Upload -User Data wieder ein.
                              • Kopiere ebenfalls die “API URL” aus deinem Profil und füge sie ebenfalls -hier ein.
                              • Speichern nicht vergessen.

                            Mit diesen Einstellungen kannst du nun Fahrten korrekt aufzeichnen und dann -hochladen.

                            Alle Einstellungen

                            Eine sinnvolle Konfiguration ist voreingestellt und sollte nur bei Bedarf -verändert werden. Hier erklären wir die einzelnen Einstellungen im Detail.

                            General

                            • Sensor

                              Bestimmt die Differenz zwischen dem Ende des Lenkers und der Außenkante des -OpenBikeSensors. Diese Werte werden automatisch von der aktuellen Messung -subtrahiert. Zusätzlich kannst du die linke und rechte Messung „vertauschen“, -falls du das Gerät am Fahrrad umgekehrt montierst.

                            • GPS

                              Du kannst festlegen, auf welche Weise das Gerät einen gültigen GPS-Fix -bestätigt und die Messungen beginnt. Typischerweise wird es den regulären -Betrieb aufnehmen, sobald es Kontakt zu 4 GPS-Satelliten hat.

                            • Generic Display

                              • drehen des Displays, falls du es über Kopf montiert hast
                              • invertieren der hellen / dunklen Bereiche des Displays, was bei hellem Sonnenlicht helfen kann
                            • Measurement Display

                              Hier gibt es mehrere Optionen dafür, verschiedene Werte auf dem Display anzuzeigen:

                              • „simple Mode“ – nur die Anzeige der Abstandsmessung nach links
                              • Anzeige von linker / rechter Abstandsmessung
                              • show satellite – Anzeige der Anzahl der vom Gerät erkannten GPS-Satelliten (mehr Satelliten – genauere Positionsbestimmung)
                              • show velocity – Anzeige der aktuellen Geschwindigkeit (recht ungenau aufgrund der langsamen GPS-Messintervalle)
                              • show confirmation stats – zählt Tastendruck und bestätigte Erkennung von Überholvorgängen
                              • show nerd details for distance sensors – Anzeige der Sensor-Rohdaten und Anzahl der Messereignisse innerhalb einer Sekunde (hilfreich bei der Fehlersuche)
                            • Privacy Options

                              Um deine Privatsphäre zu wahren, kannst du dem Gerät mitteilen, dass es die -Aufzeichnung in der Nähe deiner Wohnung oder einer anderen Privatsphäre-Zone -unterdrücken soll. Es ist möglich hier generell keine Aufzeichnung zu machen, -oder nur den GPS-Track zu unterdrücken, aber immer noch alle bestätigten -Überholvorgänge zu speichern.

                              Mehr Infos zu Privatsphäre-Zonen gibt es auf dieser Seite.

                            • Upload User Data

                              Einrichtung der Portalverbindung zum Hochladen der aufgezeichneten -Streckendaten. Wie diese korrekt eingerichtet wird, ist oben bei “Wichtige -Einstellungen” beschrieben.

                            • Operation

                              • Enable Bluetooth – aktivieren, wenn du den OpenBikeSensor mit einer kompatiblen Smartphone App, wie z.B. SimRa, verbinden willst
                              • SimRa Mode – aktivieren, wenn du den OpenBikeSensor mit der SimRa App verbinden willst

                            Privacy Zones

                            Hier kannst du einzelne Privatzonen mit jeweils eigenem Mittelpunkt und Radius -festlegen. In den Privatsphäre-Optionen unter General entscheidest du, wie -sich der OpenBikeSensor innerhalb dieser Privatsphäre-Zone verhalten soll.

                            WiFi Settings

                            Der OpenBikeSensor kann sich mit einem verfügbaren WLAN verbinden, wenn du hier -dessen Zugangsdaten angibst. Dies ist notwendig für den Upload zum Portal und -außerdem praktisch, wenn du bei der Konfiguration des Sensors mit deinem -eigenen WLAN verbunden bleiben möchtest.

                            Backup & Restore

                            Hier kannst du Einstellungen des OpenBikeSensors auf deinem PC oder mobilen -Gerät sichern. Zum Wiederherstellen aus einer gespeicherten Konfiguration wähle -im Menü-Dialog die entsprechende Datei aus.

                            Verwende diese Option vor einem Firmware-Update um sicherzustellen, dass du -deine Einstellungen wiederherstellen kannst, falls beim Update etwas -schiefgeht.

                            Update Firmware

                            Hier kannst du ein Update für die Firmware hochladen. Die neueste Version findest du immer -auf GitHub.

                            Nach einem erfolgreichen Update wird der OpenBikeSensor automatisch neu -gestartet.

                            Reboot

                            Mit dieser Option startet das Gerät wieder in den regulären Messmodus und -verlässt die Einstellungen.

                            - \ No newline at end of file diff --git a/docs/user-guide/configuration/index.html b/docs/user-guide/configuration/index.html index cb8ad2dc..54df9081 100644 --- a/docs/user-guide/configuration/index.html +++ b/docs/user-guide/configuration/index.html @@ -1,9 +1,7 @@ -Einstellungen | OpenBikeSensor - - - -

                            Einstellungen

                            Diese Seite beschreibt, wie du an deinem OpenBikeSensor Classic die -Einstellungen änderst.

                            Wenn du deinen OpenBikeSensor zum ersten mal benutzt, solltest du zunächst +Einstellungen | OpenBikeSensor +

                            Einstellungen

                            Diese Seite beschreibt, wie du an deinem OpenBikeSensor Classic die +Einstellungen änderst.

                            Wenn du deinen OpenBikeSensor zum ersten Mal benutzt, solltest du zunächst einige wichtige Einstellungen anpassen. Mehr dazu unten bei “Wichtige Einstellungen”.

                            Konfigurationsmodus

                            Zuerst musst du den OpenBikeSensor in den Konfigurationsmodus bringen. Schalte das Gerät dafür aus, halte den Knopf am Display gedrückt, und schalte es wieder @@ -16,7 +14,7 @@ WLAN/Heimnetz, oder das WLAN das der OpenBikeSensor geöffnet hat. Öffne einen Browser (z. B. Firefox) und gib dort in die Adressleiste die IP-Adresse ein, die im Display des Gerätes steht.

                            Es sollte sich nun die Login-Seite des OpenBikeSensors öffnen. Auf einem -Smartphone muss du möglicherweise die mobilen Daten deaktivieren, damit das +Smartphone musst Du möglicherweise die mobilen Daten deaktivieren, damit das funktioniert.

                            Login in das Konfigurationsmenü

                            Zugang zum Konfigurationsmenü ist durch eine verschlüsselte Verbindung und eine PIN gesichert.

                            Die verschlüsselte Verbindung benutzt du durch Klick auf go to https. Dein Browser wird dir nun eine Zertifikatswarnung anzeigen, die du ignorieren darfst (das solltest du normalerweise im Internet auf jeden Fall vermeiden – hier ist @@ -26,18 +24,18 @@ Passwort verlangt. Der Benutzername ist egal, du kannst also zum Beispiel obs eintippen, das Feld darf nur nicht leer bleiben. Das Passwort wird im Display des Geräts angezeigt, es ist ein bis zu sechsstelliger Zahlencode.

                            Wichtige Einstellungen

                            Zum direkten Nutzen eines neuen OpenBikeSensors solltest du mindestens 3 -Einstellungen vornehmen:

                            • Lenkerbreite
                              • Miss den horizontalen Abstand deines linken und rechten Lenkerrands bis zur -Radmitte. Ein symmetrischer Lenker hat zum Beispiel 75cm Breite, das heißt -37.5cm auf jeder Seite. Ein asymmetrisches Fahrrad hat eventuell -unterschiedliche Werte.
                              • Ziehe von beiden Werten (links und rechts) jeweils 2.5cm ab, um die Breite -des Sensors (5cm) zu korrigieren. Unser obiger Beispiellenker hat dann -einen Offset-Wert von je 35cm.
                              • Diese Werte, in Zentimetern, trage unter General bei Offset Sensor Left +Einstellungen vornehmen:

                                • Lenkerbreite
                                  • Miss den horizontalen Abstand deines linken und rechten Lenker-Endes bis zur +Radmitte. Ein symmetrischer Lenker hat zum Beispiel 75 cm Breite, das heißt +37.5 cm auf jeder Seite. Ein asymmetrisches Fahrrad hat eventuell +unterschiedliche Werte.
                                  • Ziehe von beiden Werten (links und rechts) jeweils 2.5 cm ab, um die Breite +des Sensors (5 cm) zu korrigieren. Unser obiger Beispiellenker hat dann +einen Offset-Wert von je 35 cm.
                                  • Diese Werte, in Zentimetern, trage unter General bei Offset Sensor Left und Offset Sensor Right ein.
                                  • Speichern nicht vergessen.
                                  • Nun kann das Gerät den tatsächlichen Abstand zum Fahrrad ermitteln, nachdem -es den Abstand vom Sensor aus gemessen hat.
                                • WLAN-Einstellungen zum Hochladen der Daten
                                  • Um deine Fahrten hochzuladen musst du dem OpenBikeSensor beibringen, ins +es den Abstand vom Sensor aus gemessen hat.
                                • WLAN-Einstellungen zum Hochladen der Daten
                                  • Um deine Fahrten hochzuladen, musst du dem OpenBikeSensor beibringen, ins Internet zu kommen.
                                  • Trage dafür den Namen und das Passwort deines WLANs unter Wifi bei SSID und Password ein. Achte auf korrekte Schreibweise inklusive Groß- und Kleinschreibung bei beiden Einträgen.
                                  • Speichern nicht vergessen.
                                  • Beim nächsten Start in den Konfigurationsmodus wird das Gerät sich mit -diesem WLAN verbinden, und nur ein eigenes WLAN aufmachen, falls das nicht +diesem WLAN verbinden und nur ein eigenes WLAN aufmachen, falls das nicht klappt. Im Display kannst du sehen, in welchem WLAN das Gerät eingewählt ist.
                                • API-Schlüssel

                                  Privacy Zones

                                  Hier kannst du einzelne Privatzonen mit jeweils eigenem Mittelpunkt und Radius +Einstellungen” beschrieben.

                                • Operation

                                  • Enable Bluetooth – aktivieren, wenn du den OpenBikeSensor mit einer kompatiblen Smartphone-App, wie z.B. SimRa, verbinden willst
                                  • SimRa Mode – aktivieren, wenn du den OpenBikeSensor mit der SimRa App verbinden willst

                                Privacy Zones

                                Hier kannst du einzelne Privatzonen mit jeweils eigenem Mittelpunkt und Radius festlegen. In den Privatsphäre-Optionen unter General entscheidest du, wie sich der OpenBikeSensor innerhalb dieser Privatsphäre-Zone verhalten soll.

                                WiFi Settings

                                Der OpenBikeSensor kann sich mit einem verfügbaren WLAN verbinden, wenn du hier dessen Zugangsdaten angibst. Dies ist notwendig für den Upload zum Portal und außerdem praktisch, wenn du bei der Konfiguration des Sensors mit deinem eigenen WLAN verbunden bleiben möchtest.

                                Backup & Restore

                                Hier kannst du Einstellungen des OpenBikeSensors auf deinem PC oder mobilen Gerät sichern. Zum Wiederherstellen aus einer gespeicherten Konfiguration wähle -im Menü-Dialog die entsprechende Datei aus.

                                Verwende diese Option vor einem Firmware-Update um sicherzustellen, dass du +im Menü-Dialog die entsprechende Datei aus.

                                Verwende diese Option vor einem Firmware-Update, um sicherzustellen, dass du deine Einstellungen wiederherstellen kannst, falls beim Update etwas schiefgeht.

                                Update Firmware

                                Hier kannst du ein Update für die Firmware hochladen. Die neueste Version findest du immer auf GitHub.

                                Nach einem erfolgreichen Update wird der OpenBikeSensor automatisch neu gestartet.

                                Reboot

                                Mit dieser Option startet das Gerät wieder in den regulären Messmodus und -verlässt die Einstellungen.


                                Zuletzt geändert 04.02.2023: Simplify obs-classic configuration page (in preparation for variants) (cbfbde3)
                                Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                                Druckansicht dieses Kapitels
                            - \ No newline at end of file +verlässt die Einstellungen.

                            Zuletzt geändert 20.01.2024: Small fixes. (df948e6)

                            Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                            \ No newline at end of file diff --git a/docs/user-guide/index.html b/docs/user-guide/index.html index 186f012b..1f718393 100644 --- a/docs/user-guide/index.html +++ b/docs/user-guide/index.html @@ -1,11 +1,8 @@ -Bedienungsanleitung | OpenBikeSensor - - - -

                            Bedienungsanleitung

                            Dieser Abschnitt hilft dir bei der Benutzung deines OpenBikeSensors (OBS). +Bedienungsanleitung | OpenBikeSensor +

                            +

                            Bedienungsanleitung

                            Dieser Abschnitt hilft dir bei der Benutzung deines OpenBikeSensors (OBS). Betrachte es wie ein Handbuch, das einem Gerät beiliegt, nur dass wir es nicht ausdrucken müssen. Egal ob du deinen Sensor selbst zusammengebaut oder einen vorgefertigten Sensor von jemand anderem bekommen hast, diese Anleitung beschreibt, wie du wichtige Daten mit deinem neuen Gerät sammeln kannst.

                            Falls du noch keinen OBS besitzt, schau in den Abschnitt “Hardware”. Dort -findest du Anleitungen zum Selberbau.

                            Zuletzt geändert 06.02.2023: Move items from docs directly into main menu (b12bd51)
                            Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                            Druckansicht dieses Kapitels
                            - \ No newline at end of file +findest du Anleitungen zum Selberbau.


                            Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum.
                            \ No newline at end of file diff --git a/docs/user-guide/mounting/index.html b/docs/user-guide/mounting/index.html index 45c1b7aa..3cdbad3c 100644 --- a/docs/user-guide/mounting/index.html +++ b/docs/user-guide/mounting/index.html @@ -1,11 +1,9 @@ -Montage des Sensors am Fahrrad | OpenBikeSensor - - - -

                            Montage des Sensors am Fahrrad

                            \ No newline at end of file diff --git a/docs/user-guide/quickstart/index.html b/docs/user-guide/quickstart/index.html index 626948e8..0e384bcc 100644 --- a/docs/user-guide/quickstart/index.html +++ b/docs/user-guide/quickstart/index.html @@ -1,26 +1,24 @@ -Schnellstart-Anleitung | OpenBikeSensorSchnellstart-Anleitung | OpenBikeSensor + - - - -

                            Schnellstart-Anleitung

                            Diese Anleitung geht davon aus, dass du einen funktionierenden +Ab dem zweiten Einschalten sollte auf dem Display das OpenBikeSensor Logo angezeigt werden und auf der rechten Seite ein paar Startmeldungen durchlaufen.">

                            Schnellstart-Anleitung

                            Diese Anleitung geht davon aus, dass du einen funktionierenden OpenBikeSensor Classic hast.

                            Sobald du einen OpenBikeSensor hast, solltest du ein paar Dinge damit tun:

                            Funktionsprüfung

                            Beim ersten Einschalten generiert der OpenBikeSensor ein Zertifikat, der erste Start kann deshalb etwas länger dauern. Das wird währenddessen auch auf dem Display angezeigt.

                            Ab dem zweiten Einschalten sollte auf dem Display das OpenBikeSensor Logo angezeigt werden und auf der rechten Seite ein paar Startmeldungen durchlaufen. Normalerweise steht -dort:

                            • Versionsnummer
                            • Batteriespannung (wird diese nicht angezeigt, könnte es sein, dass es ein problem mit dem Spannungsteiler gibt, mit dem die Batteriespannung gemessen wird.)
                            • config...
                            • <35|-|35> (Die konfigurierte linke und rechte Lenkerbreite, hier 35cm)
                            • SD... OK
                            • Start GPS OK
                            • CSV file... OK
                            • Wait for GPS (Sobald das GPS-Datum gefunden wurde durch die aktuelle Uhrzeit ersetzt)
                            • 0Sats sn:98 (Anzahl der bereits gefundenen Satteliten, SNR)

                            GPS testen

                            Lege dein Gerät unter freiem Himmel hin und schalte es ein. Nach ein paar +dort:

                            • Versionsnummer
                            • Batteriespannung (wird diese nicht angezeigt, könnte es sein, dass es ein problem mit dem Spannungsteiler gibt, mit dem die Batteriespannung gemessen wird.)
                            • config...
                            • <35|-|35> (Die konfigurierte linke und rechte Lenkerbreite, hier 35 cm)
                            • SD... OK
                            • Start GPS OK
                            • CSV file... OK
                            • Wait for GPS (Sobald das GPS-Datum gefunden wurde, wird es durch die aktuelle Uhrzeit ersetzt)
                            • 0Sats sn:98 (Anzahl der bereits gefundenen Satelliten, SNR)

                            GPS testen

                            Lege dein Gerät unter freiem Himmel hin und schalte es ein. Nach ein paar Minuten sollte es von der Ansicht mit OpenBikeSensor Logo im Display von allein in die Messansicht (ohne OpenBikeSensor Logo im Display) wechseln. Geschieht dies nicht oder regelmäßig erst nach 10 oder mehr Minuten, sind probleme am GPS-Modul oder der Antenne wahrscheinlich. In der Troubleshooting-Sektion findest du ein paar Links zur weiteren Diagnose.

                            Ultraschallsensor testen

                            Um sicherzugehen, dass dein Gerät voll funktionsfähig ist, führe vor -der ersten Montage und danach regelmäßig (z.B. jedes mal nach dem Aufladen +der ersten Montage und danach regelmäßig (z.B. jedes Mal nach dem Aufladen des Akkus oder wöchentlich) folgenden Test durch:

                            Halte dein Gerät im Freien eingeschaltet mit der linken Seite zum Himmel und der rechten Seite nach unten in die Luft. Nachdem die Haltezeit für den linksseitigen Messwert abgelaufen ist, sollte kein Messwert mehr angezeigt. @@ -30,9 +28,9 @@ freiem Himmel, also nicht unter einem Baum/ einer Brücke), gibt es ein Problem mit dem Ultraschallsensor. In der Troubleshooting-Sektion findest du weitere Informationen.

                            Halte das Gerät nun mit der linken Seite in Richtung einer Wand, und gehe -langsam auf die Wand zu. Du solltest etwa ab 2.50m Abstand von der Wand im +langsam auf die Wand zu. Du solltest etwa ab 2,50 m Abstand von der Wand im Display eine abnehmende Distanz sehen. Siehst du keine Abstandsanzeige oder -erst bei deutlich unter 2,50 m Findest du in der Troubleshooting-Sektion +erst bei deutlich unter 2,50 m Findest du in der Troubleshooting-Sektion weitere Informationen.

                            Wenn du den Sensor in der Ansicht mit allen Messwerten benutzt, kannst du die gleiche Funktionsprüfung auch für den rechtsseitigen Sensor durchführen.

                            Inbetriebnahme

                            1. Befestige die Halterung für den OpenBikeSensor und die Lenkerhalterung für @@ -43,16 +41,16 @@ Konfigurationsmodus kommst, siehst du in der Konfigurationsanleitung.
                            2. Richte deine Privatsphäre-Zonen ein. Mit einer Karten-App auf einem Smartphone lässt sich dein aktueller Standort bestimmen, den du dann eintippen kannst.
                            3. Prüfe, ob deine SD-Karte funktioniert und am besten auch leer ist. Der -OpenBikeSensor erwartet eine Fat32 Partition, SD-Karten werden üblicherweise -mit einer Fat32 Partition ausgeliefert, so dass sie im OpenBikeSensor direkt -Benutzt werden können. Neuere SD-Karten sind gelegentlich mit exFAT +OpenBikeSensor erwartet eine FAT32 Partition, SD-Karten werden üblicherweise +mit einer FAT32 Partition ausgeliefert, sodass sie im OpenBikeSensor direkt +benutzt werden können. Neuere SD-Karten sind gelegentlich mit exFAT formatiert und müssen auf FAT32 umformatiert werden.
                            4. Lade den Akku des Gerätes mit einem USB-C Kabel und einem normalen -USB-Ladegerät auf. Die LED am Lademodul leuchtet rot während des Ladens und +USB-Ladegerät auf. Die LED am Lademodul leuchtet während des Ladens rot und wird blau, wenn der Akku voll ist. Achtung: Lade an einem USB-A-Port auf, mit einem beidseitigen USB-C-Kabel oder einem Netzteil, das direkt in einen -USB-C-Stecker mündet funktioniert das Laden meist nicht, da das Lademodul -nicht USB-C-korrekt Ladespannung anfordert.
                            5. Schalte das Gerät ein. Warte bis GPS-Koordinaten vorhanden sind. Dies kann -eine Weile dauern. Am schnellsten geht es, wenn das Geräte in Ruhe im Freien +USB-C-Stecker mündet, funktioniert das Laden meist nicht da das Lademodul +nicht USB-C konform Ladespannung anfordert.
                            6. Schalte das Gerät ein. Warte bis GPS-Koordinaten vorhanden sind, dies kann +eine Weile dauern. Am schnellsten geht es, wenn das Gerät in Ruhe im Freien liegt und nicht bewegt wird.
                            7. Montiere den Sensor am Fahrrad und fahre los. Bitte achte auf den Verkehr um dich herum und lass dich nicht durch das Gerät ablenken.
                            8. Wenn dich ein Fahrzeug überholt (egal ob LKW, PKW, Bus, …) drück kurz auf den Knopf. Es ist wichtig, dass auch Überholvorgänge mit ausreichend @@ -64,5 +62,4 @@ Profileinstellungen in die Konfiguration des OpenBikeSensors kopierst, und im Konfigurationsmodus auf “Upload tracks” drückst, oder den Knopf am Display gedrückt hältst. Für letzteres muss das Gerät in einem WLAN mit -Internetzugang sein.
                            Zuletzt geändert 16.12.2023: fix links broken by merge. (b78b0fc)
                            - \ No newline at end of file +Internetzugang sein.
                            Zuletzt geändert 20.01.2024: Small fixes. (df948e6)
                            \ No newline at end of file diff --git a/docs/user-guide/recording/index.html b/docs/user-guide/recording/index.html index 370a8c9b..68b93094 100644 --- a/docs/user-guide/recording/index.html +++ b/docs/user-guide/recording/index.html @@ -1,11 +1,9 @@ -Aufzeichnung einer Messfahrt | OpenBikeSensor - - - -

                            Aufzeichnung einer Messfahrt

                            Vorbereitung

                            Grundsätzlich muss vor Beginn einer Messfahrt der Ladezustand des Akkus geprüft +Aufzeichnung einer Messfahrt | OpenBikeSensor +

                            Aufzeichnung einer Messfahrt

                            Vorbereitung

                            Grundsätzlich muss vor Beginn einer Messfahrt der Ladezustand des Akkus geprüft werden. Dazu das Gerät einschalten und die Spannungsanzeige im Display oben rechts ablesen. Sie muss größer als 3,6 V sein. Bei Bedarf vor der Messfahrt mittels USB-C Ladekabel nachladen.

                            Das Gerät im Freien platzieren, einschalten und auf den korrekten GPS-Empfang @@ -13,17 +11,16 @@ daran, dass dies in Zukunft eventuell schneller klappt.

                            Bei empfangenen GPS Signal erscheint die reguläre Distanzanzeige für den linken Überholabstand. Die korrekte Funktion kann gegen eine Wand überprüft werden:

                            • Linken Sensor ins Freie ohne Hindernisse richten. Die Anzeige sollte --- cm zeigen.
                            • Linken Sensor gegen eine Wand gerichtet (max. 2,50 m Abstand). Die Anzeige sollte den Abstand, minus der halben Lenkerbreite (also bei -Standardeinstellung minus 35cm) anzeigen.

                            Gerät am Fahrrad befestigen, wie unter „Montage“ beschrieben, und Messfahrt +Standardeinstellung minus 35 cm) anzeigen.

                            Gerät am Fahrrad befestigen, wie unter „Montage“ beschrieben, und Messfahrt beginnen. Die gefahrene Strecke (Track) wird aufgezeichnet.

                            Datenschutz für Privatzonen

                            Um in den veröffentlichten Aufzeichnungen den eigenen Wohnort unkenntlich zu halten, wird empfohlen, die Messfahrt entfernt vom Wohnort zu starten und zu beenden.

                            Überholvorgänge markieren

                            Prinzipiell werden kontinuierlich die Abstände links und rechts gemessen und auf einer SD-Karte gespeichert. Darin sind alle Hindernisse innerhalb des -maximalen Messbereiches (285 cm) enthalten, auch Häuser, Masten, Radfahrer, -Fußgänger usw., die nicht dem Messzweck dienen. Nähert sich ein KFZ von +maximalen Messbereiches (285 cm) enthalten, auch Häuser, Masten, Radfahrer, +Fußgänger usw., die nicht dem Messzweck dienen. Nähert sich ein Kfz von hinten, muss der Knopf am Display gedrückt werden, um den Überholvorgang zu erfassen. Bitte achte dabei auf deine eigene Sicherheit: Es ist nicht notwendig, während des Überholvorgangs selbst auf den Button zu drücken. Es ist ausreichend, dies innerhalb von ca. 5 Sekunden nach der ersten Erfassung des Seitenabstands zu tun.

                            Das Display bestätigt den Überholvorgang:

                            • durch kurzes Invertieren der Anzeige
                            • durch Hochzählen der Anzeige „press“
                            • durch Hochzählen der Anzeige „conf“, falls dabei ein Objekt auf der linken Seite erkannt wurde

                            Beenden der Messfahrt

                            Bei gedrücktem Knopf das Gerät ausschalten. Nur so werden alle Messungen zuverlässig gespeichert.

                            Die Aufzeichnung erfolgt in einer CSV-Datei mit einem Dateinamen, der von Datum, Uhrzeit und der Geräte-ID abhängt, also zum Beispiel -2021-01-20T13.32.52-4495.obsdata.csv.

                            Zuletzt geändert 06.06.2021: Update recording.de.md (6185b90)
                            - \ No newline at end of file +2021-01-20T13.32.52-4495.obsdata.csv.

                            \ No newline at end of file diff --git a/docs/user-guide/simra/index.html b/docs/user-guide/simra/index.html index 255720fc..bebe1a5c 100644 --- a/docs/user-guide/simra/index.html +++ b/docs/user-guide/simra/index.html @@ -1,18 +1,17 @@ -OpenBikeSensor mit der SimRa-App betreiben | OpenBikeSensor - - - -

                            OpenBikeSensor mit der SimRa-App betreiben

                            Es ist möglich, den OpenBikeSensor per Bluetooth mit der SimRa App zu verbinden. SimRa steht für “Sicherheit im Radverkehr” und ist eine App, die beim Radfahren aktiviert ist und über die Sensoren des Smartphones herauszufinden versucht, wann es gefährliche Situationen gab, die man anschließend beschreiben und bewerten kann. Durch die Kopplung mit dem OpenBikeSensor bekommt die SimRa App zusätzlich die Überholabstände.

                            SimRa App installieren

                            OpenBikeSensor konfigurieren

                            In der Konfigurationsoberfläche des OpenBikeSensor aktiviert man im Untermenü “General” ganz unten Bluetooth im Bereich “Operation”:

                            Bluetooth-Einstellungen im OpenBikeSensor

                            SimRa Mode: Normalerweise wählt sich der OpenBikeSensor in ein WLAN ein bzw. +OpenBikeSensor mit der SimRa-App betreiben | OpenBikeSensor +

                            OpenBikeSensor mit der SimRa-App betreiben

                            Es ist möglich, den OpenBikeSensor per Bluetooth mit der SimRa App zu verbinden. +SimRa steht für “Sicherheit im Radverkehr” und ist eine App, die beim Radfahren aktiviert ist und über die Sensoren des Smartphones herauszufinden versucht, wann es gefährliche Situationen gab, die man anschließend beschreiben und bewerten kann. +Durch die Kopplung mit dem OpenBikeSensor bekommt die SimRa App zusätzlich die Überholabstände.

                            SimRa App installieren

                            OpenBikeSensor konfigurieren

                            In der Konfigurationsoberfläche des OpenBikeSensor aktiviert man im Untermenü “General” ganz unten im Bereich “Operation” Bluetooth:

                            Bluetooth-Einstellungen im OpenBikeSensor

                            SimRa Mode: Normalerweise wählt sich der OpenBikeSensor in ein WLAN ein bzw. stellt einen WLAN-Hotspot zur Verfügung, wenn er ohne angeschlossenes Display eingeschaltet wird. Aktiviert man den “SimRa Mode”, dann passiert das nicht.

                            Wenn “SimRa Mode” aktiviert wird, dann startet der OpenBikeSensor nicht im -Server Modus, wenn das Display nicht angeschlossen ist.

                            Nach dem Speichern kann man das Gerät neustarten.

                            SimRa App einrichten

                            Bluetooth muss natürlich auf dem Smartphone aktiviert sein.

                            Android

                            1. App starten.

                            2. In die Einstellungen gehen und unten OpenBikeSensor aktivieren:

                            3. OpenBikeSensor Einstellungen öffnen. Verfügbare Geräte werden gesucht.

                            4. Auf den Eintrag mit “OpenBikeSensor xxx” drücken und anschließend auf “Verbinden” drücken.

                            5. Der jeweils gemessene Wert sollte jetzt angezeigt werden.

                            6. Jetzt muss man noch einstellen, wie breit der Lenker des Fahrrad (von der +Server Modus, wenn das Display nicht angeschlossen ist.

                              Nach dem Speichern kann man das Gerät neu starten.

                              SimRa App einrichten

                              Bluetooth muss natürlich auf dem Smartphone aktiviert sein.

                              Android

                              1. App starten.

                              2. In die Einstellungen gehen und unten OpenBikeSensor aktivieren:

                              3. OpenBikeSensor Einstellungen öffnen. Verfügbare Geräte werden gesucht.

                              4. Auf den Eintrag mit “OpenBikeSensor xxx” drücken und anschließend auf “Verbinden” drücken.

                              5. Der jeweils gemessene Wert sollte jetzt angezeigt werden.

                              6. Jetzt muss man noch einstellen, wie breit der Lenker des Fahrrad (von der Mitte) ist.

                              7. Optional kann aktiviert werden, dass ein Foto mit dem Smartphone gemacht werden soll, wenn der Überholabstand unterschritten wird. Dazu muss das Smartphone natürlich entsprechend am Fahrrad befestigt und ausgerichtet sein.

                              In der SimRa App wird nun links unten ein blaues Bluetooth Symbol angezeigt, wenn Bluetooth aktiviert ist und ein grünes Symbol, wenn der OpenBikeSensor -verbunden werden konnte.

                            - \ No newline at end of file +verbunden werden konnte.

                            \ No newline at end of file diff --git a/docs/user-guide/track-upload/index.html b/docs/user-guide/track-upload/index.html index 7fbfe63a..024d0e74 100644 --- a/docs/user-guide/track-upload/index.html +++ b/docs/user-guide/track-upload/index.html @@ -1,21 +1,18 @@ -Tracks hochladen | OpenBikeSensor - - - -

                            Tracks hochladen

                            Voraussetzungen

                            Damit Tracks hochgeladen werden können, müssen mindestens die unter “Wichtige +Tracks hochladen | OpenBikeSensor +

                            Tracks hochladen

                            Voraussetzungen

                            Damit Tracks hochgeladen werden können, müssen mindestens die unter “Wichtige Einstellungen” aufgeführten Einstellungen vorgenommen worden sein. Das sind die Einrichtung der WLAN-Verbindung sowie des API-Zugangs zum Portal.

                            Mit WLAN verbinden

                            Halte den Knopf des OpenBikeSensors gedrückt und schalte ihn dann ein. Nun wird -sich das Gerät in dein konfiguriertes WLAN einwählen. Sofern das klappt zeigt +sich das Gerät in dein konfiguriertes WLAN einwählen. Sofern das klappt, zeigt der OpenBikeSensor den Namen des WLANs und die IP-Adresse im Display an.

                            Kommt keine Verbindung zustande, macht der OpenBikeSensor nach 10 Sekunden einen eigenen AccessPoint auf. Ein Hochladen der Tracks ist im AccessPoint-Modus nicht möglich, da dann keine Verbindung zum Internet besteht. Verbinde dich dann mit diesem Netzwerk wie unter Einstellungen beschrieben und stelle die WLAN-Details richtig ein.

                            Upload starten

                            Wenn der OpenBikeSensor mit einem WLAN verbunden ist, kann der Upload gestartet werden, indem der Knopf gedrückt und gehalten wird, bis der Upload startet.

                            Alternativ kann der Upload auch aus dem Konfigurationsmenü vom Handy oder PC -aus gestartet werden.

                            Zuletzt geändert 06.02.2023: Cleanup track upload page (0a75cd8)
                            - \ No newline at end of file +aus gestartet werden.

                            \ No newline at end of file diff --git a/en/map/index.html b/en/map/index.html index b61007f7..ddf62a86 100644 --- a/en/map/index.html +++ b/en/map/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/map.en/ \ No newline at end of file +https://www.openbikesensor.org/map.en/ + \ No newline at end of file diff --git a/ev/index.html b/ev/index.html index 79b7a462..e83143cc 100644 --- a/ev/index.html +++ b/ev/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/verein/ \ No newline at end of file +https://www.openbikesensor.org/verein/ + \ No newline at end of file diff --git a/faq/_print/index.html b/faq/_print/index.html deleted file mode 100644 index 1c20511b..00000000 --- a/faq/_print/index.html +++ /dev/null @@ -1,71 +0,0 @@ -FAQ | OpenBikeSensor - - - -

                            Häufig gestellte Fragen (FAQ)

                            Hier sammeln wir Fragen und Antworten, die uns häufig erreichen. Wenn dich -etwas rund um das Projekt interessiert, schau doch mal ob deine Frage schon -beantwortet ist. Ansonsten freuen wir uns natürlich jederzeit, wenn du -zu uns Kontakt aufnimmst.

                            Die Fragen in diesem Bereich sind nach Themengebiet sortiert. Wir sortieren -nicht in Unterseiten, das heißt mit der Suchfunktion deines Browsers (Strg+F) -kannst du hier in der Seite nach Themen suchen, die dich interessieren.

                            Bau und Beschaffung

                            Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen?

                            Ja. Natürlich hilft es, so etwas schon einmal gemacht zu haben. Aber mit -genügend Zeit sollten es alle hinbekommen, ganz egal ob groß oder klein, jung -oder alt. Natürlich muss gelötet, gebastelt und gecrimpt werden, und auch -einige Schritte mit dem Computer sind nötig. Das meiste haben wir detailliert -beschrieben, und wenn du irgendwo stecken bleibst, kannst du immer in der -Community nach Hilfe fragen.

                            Wenn du dir noch nicht ganz zutraust, das ganze Gerät allein zu basteln, such -dir doch Hilfe. In den meisten Regionen gibt es Maker-Spaces, Hackspaces, -Fab-Labs oder sonstige Orte, an denen Menschen zusammenkommen, die Erfahrung -mit diesen Themen haben oder erlangen wollten. Dort bist du sicherlich -willkommen!

                            Ich brauche eine Platine (PCB), woher bekomme ich die?

                            Wir veröffentlichen auf -Github die -CAD-Zeichnungen für die Platinen. Du kannst dir von dort die benötigten Dateien -herunterladen und bei einem Platinenhersteller deiner Wahl bestellen.

                            Platinen sind aber auch immer Bestandteil unserer Sammelbestellungen, denn -solche Spezialanfertigungen sind natürlich in Menge gefertigt wesentlich -günstiger. Unser Hersteller in China bietet uns die fertigen PCBs in Menge für -etwa 0,50 € pro Stück an. In Deutschland gefertigt und damit schneller und -umweltschonender geliefert kosten Platinen 3 bis 5 € pro Stück, dies ist für -mittelgroße Bestellungen natürlich auch eine gute Option.

                            » Dokumentation zum PCB (Englisch)

                            Was kostet ein Überholabstandsmesser?

                            Die Teile für einen Bausatz können einzeln oder in größeren Mengen gekauft -werden, wobei letzteres natürlich pro Bausatz günstiger ist. Unser -Erfahrungswert der Sammelbestellungen ist, dass die Gesamtkosten pro Bausatz -sich in einer Größenordnung von 60-80 € bewegen, inkl. fertig gedrucktem -Gehäuse (etwa 15 €).

                            In diesem Preis sind eventuelle Preisschwankungen sowie defekt oder falsch -gelieferte Bauteile bereits eingerechnet. Mit Glück und auf eigenes Risiko -kannst du die Teile eventuell etwas günstiger finden.

                            Woher bekomme ich den Überholabstandsmesser?

                            Wir entwickeln in ehrenamtlicher Arbeit diese Gerät, aber wir verkaufen es -nicht. Die Pläne sind frei im Internet verfügbar, sodass jede:r es selbst -nachbauen kann. Kapazitäten zum (kommerziellen) Angebot fertiger Geräte haben -wir aber keine.

                            Über das Forum organisiert die Community regelmäßig -Sammelbestellungen, sodass nicht jede:r alle Einzelteile bestellen muss. Das -macht es günstiger und bequemer, einen Bausatz zu erhalten. Zusammenbauen musst -du den dann aber selbst.

                            Wenn du dich an einer Sammelbestellung beteiligen möchtest, oder dir sogar -vorstellen könntest eine zu organisieren (eine Bauteileliste mit Hinweisen und Bestell-Links haben wir), melde -dich bitte im Forum der Community.

                            Daten

                            Welche Daten werden aufgezeichnet?

                            Der Überholabstandsmesser ermittelt eine ganze Menge Daten, die in der Datei zu -jeder Fahrt gespeichert werden:

                            • Datum und Uhrzeiten
                            • GPS-Koordinaten
                            • GPS-Zustand, inkl. Genauigkeit und weiteren Zusatzinfos
                            • Rohdaten der Einzelmessungen beider Sensoren
                            • Gemessener Mindestabstand links und rechts
                            • Bestätigungen durch den Knopf am Lenker
                            • Batteriezustand
                            • ID des Gerätes, Firmwareversion, sowie einige Einstellungen und Eigenschaften des Gerätes

                            Die veränderlichen Werte werden etwa im Sekundentakt aufgezeichnet, auch wenn -gerade nichts gemessen oder kein Überholvorgang bestätigt wird. Dies erlaubt -die spätere Auswertung und Weiterentwicklung der Auswertungsalgorithmen.

                            Wie werden die Daten verarbeitet?

                            Der Überholabstandsmesser lädt ganze Fahrten als einzelne Dateien ins Portal -hoch. Diese werden importiert, jedoch nur zur Einzelanzeige der jeweiligen -Fahrt.

                            Später werden wir durch verschiedene Verarbeitungsalgorithmen abgeleitete -Datensätze aus mehreren Fahrten erstellen. Diese werden wir so weit es geht -anonymisieren, um keine Rückschlüsse auf personenbezogene und sensible -Informationen zu erlauben.

                            Die anonymisierten Datenpools sollen dann in eine große gemeinsame Datenbank -mit freier und offener Lizenz zusammenfließen.

                            Wie werden die Daten ausgewertet?

                            Noch nicht automatisch.

                            Es gibt eine Sammlung von -Skripten, die die -Auswertung ermöglichen. Diese ordnen die Messwerte Straßenabschnitten aus -OpenStreetMap zu und erlauben eine Visualisierung.

                            Diese Art der Auswertung muss momentan noch manuell gemacht werden. Eine -Integration in das Portal ist -geplant und in Arbeit, aber noch nicht verfügbar.

                            Warum sollte es mehrere Portale geben?

                            Wir wollen Dezentralität der gemessenen Daten ermöglichen. Auf die Portale -werden sehr sensible Daten hochgeladen. Durch die freie Wahl des Portals, und -damit der Betreiber:in, können alle Nutzer:innen selbst entscheiden, wem sie -diese Daten anvertrauen möchten.

                            In der Portalsoftware wird dann aus den sensiblen Daten ein öffentlicher -Datenpool abgeleitet. Dieser wird durch das Portal veröffentlicht und fließt in -die globale Datenbank ein.

                            Die Betreiber:innen einzelner Porale können außerdem Nebenabsprachen mit ihren -Nutzenden treffen, welche über das beschriebene Vorgehen zur Nutzung der -hochgeladenen Daten hinausgehen. Dies ist zum Beispiel bei einigen -Forschungsprojekten der Fall.

                            Hinweis: Dies alles ist Konzeption und Zukunftsmusik. Auf dem Weg der -Umsetzung sind noch viele Schritte zu tun.

                            Wie funktionieren Privacy Zones?

                            Diese Zonen erlauben das Anonymisieren deiner Aufzeichnungen innerhalb -bestimmter geografischer Bereiche, zum Beispiel damit nicht öffentlich ist, wo -du wohnst.

                            Du kannst sie im Überholabstandsmesser konfigurieren und auswählen, wie sich -das Gerät innerhalb dieser Zonen verhalten soll. In Zukunft wird es auch -möglich sein, im Portal solche Zonen zu verwalten und die Anonymisierung dort -durchführen zu lassen.

                            Zur Theorie und zum Konzept haben wir einen Artikel als Teil -der Dokumentation verfasst.

                            - \ No newline at end of file diff --git a/faq/build/_print/index.html b/faq/build/_print/index.html deleted file mode 100644 index 64b8ce48..00000000 --- a/faq/build/_print/index.html +++ /dev/null @@ -1,37 +0,0 @@ -Bau und Beschaffung | OpenBikeSensor - - - -

                            Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen?

                            Ja. Natürlich hilft es, so etwas schon einmal gemacht zu haben. Aber mit -genügend Zeit sollten es alle hinbekommen, ganz egal ob groß oder klein, jung -oder alt. Natürlich muss gelötet, gebastelt und gecrimpt werden, und auch -einige Schritte mit dem Computer sind nötig. Das meiste haben wir detailliert -beschrieben, und wenn du irgendwo stecken bleibst, kannst du immer in der -Community nach Hilfe fragen.

                            Wenn du dir noch nicht ganz zutraust, das ganze Gerät allein zu basteln, such -dir doch Hilfe. In den meisten Regionen gibt es Maker-Spaces, Hackspaces, -Fab-Labs oder sonstige Orte, an denen Menschen zusammenkommen, die Erfahrung -mit diesen Themen haben oder erlangen wollten. Dort bist du sicherlich -willkommen!

                            Ich brauche eine Platine (PCB), woher bekomme ich die?

                            Wir veröffentlichen auf -Github die -CAD-Zeichnungen für die Platinen. Du kannst dir von dort die benötigten Dateien -herunterladen und bei einem Platinenhersteller deiner Wahl bestellen.

                            Platinen sind aber auch immer Bestandteil unserer Sammelbestellungen, denn -solche Spezialanfertigungen sind natürlich in Menge gefertigt wesentlich -günstiger. Unser Hersteller in China bietet uns die fertigen PCBs in Menge für -etwa 0,50 € pro Stück an. In Deutschland gefertigt und damit schneller und -umweltschonender geliefert kosten Platinen 3 bis 5 € pro Stück, dies ist für -mittelgroße Bestellungen natürlich auch eine gute Option.

                            » Dokumentation zum PCB (Englisch)

                            Was kostet ein Überholabstandsmesser?

                            Die Teile für einen Bausatz können einzeln oder in größeren Mengen gekauft -werden, wobei letzteres natürlich pro Bausatz günstiger ist. Unser -Erfahrungswert der Sammelbestellungen ist, dass die Gesamtkosten pro Bausatz -sich in einer Größenordnung von 60-80 € bewegen, inkl. fertig gedrucktem -Gehäuse (etwa 15 €).

                            In diesem Preis sind eventuelle Preisschwankungen sowie defekt oder falsch -gelieferte Bauteile bereits eingerechnet. Mit Glück und auf eigenes Risiko -kannst du die Teile eventuell etwas günstiger finden.

                            Woher bekomme ich den Überholabstandsmesser?

                            Wir entwickeln in ehrenamtlicher Arbeit diese Gerät, aber wir verkaufen es -nicht. Die Pläne sind frei im Internet verfügbar, sodass jede:r es selbst -nachbauen kann. Kapazitäten zum (kommerziellen) Angebot fertiger Geräte haben -wir aber keine.

                            Über das Forum organisiert die Community regelmäßig -Sammelbestellungen, sodass nicht jede:r alle Einzelteile bestellen muss. Das -macht es günstiger und bequemer, einen Bausatz zu erhalten. Zusammenbauen musst -du den dann aber selbst.

                            Wenn du dich an einer Sammelbestellung beteiligen möchtest, oder dir sogar -vorstellen könntest eine zu organisieren (eine Bauteileliste mit Hinweisen und Bestell-Links haben wir), melde -dich bitte im Forum der Community.

                            - \ No newline at end of file diff --git a/faq/build/ich-bin-neuling/index.html b/faq/build/ich-bin-neuling/index.html index 8177f77d..8e47b555 100644 --- a/faq/build/ich-bin-neuling/index.html +++ b/faq/build/ich-bin-neuling/index.html @@ -1,23 +1,19 @@ -Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen? +<!doctype html><html itemscope itemtype=http://schema.org/WebPage lang=de class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen? | OpenBikeSensor - - - -

                            -Zurück zur FAQ

                            Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen?

                            Ja. Natürlich hilft es, so etwas schon einmal gemacht zu haben. Aber mit +"> +

                            +Zurück zur FAQ

                            Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen?

                            Ja! Natürlich hilft es, so etwas schon einmal gemacht zu haben. Aber mit genügend Zeit sollten es alle hinbekommen, ganz egal ob groß oder klein, jung oder alt. Natürlich muss gelötet, gebastelt und gecrimpt werden, und auch einige Schritte mit dem Computer sind nötig. Das meiste haben wir detailliert -beschrieben, und wenn du irgendwo stecken bleibst, kannst du immer in der +beschrieben und wenn du irgendwo stecken bleibst, kannst du immer in der Community nach Hilfe fragen.

                            Wenn du dir noch nicht ganz zutraust, das ganze Gerät allein zu basteln, such -dir doch Hilfe. In den meisten Regionen gibt es Maker-Spaces, Hackspaces, +dir am besten Hilfe. In den meisten Regionen gibt es Maker-Spaces, Hackspaces, Fab-Labs oder sonstige Orte, an denen Menschen zusammenkommen, die Erfahrung mit diesen Themen haben oder erlangen wollten. Dort bist du sicherlich -willkommen!

                            - \ No newline at end of file +willkommen!

                            \ No newline at end of file diff --git a/faq/build/index.html b/faq/build/index.html index 64d726a2..ba100a22 100644 --- a/faq/build/index.html +++ b/faq/build/index.html @@ -1,31 +1,28 @@ -Bau und Beschaffung | OpenBikeSensor - - - -

                            Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen?

                            Ja. Natürlich hilft es, so etwas schon einmal gemacht zu haben. Aber mit +Bau und Beschaffung | OpenBikeSensor +

                            Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen?

                            Ja! Natürlich hilft es, so etwas schon einmal gemacht zu haben. Aber mit genügend Zeit sollten es alle hinbekommen, ganz egal ob groß oder klein, jung oder alt. Natürlich muss gelötet, gebastelt und gecrimpt werden, und auch einige Schritte mit dem Computer sind nötig. Das meiste haben wir detailliert -beschrieben, und wenn du irgendwo stecken bleibst, kannst du immer in der +beschrieben und wenn du irgendwo stecken bleibst, kannst du immer in der Community nach Hilfe fragen.

                            Wenn du dir noch nicht ganz zutraust, das ganze Gerät allein zu basteln, such -dir doch Hilfe. In den meisten Regionen gibt es Maker-Spaces, Hackspaces, +dir am besten Hilfe. In den meisten Regionen gibt es Maker-Spaces, Hackspaces, Fab-Labs oder sonstige Orte, an denen Menschen zusammenkommen, die Erfahrung mit diesen Themen haben oder erlangen wollten. Dort bist du sicherlich willkommen!

                            Ich brauche eine Platine (PCB), woher bekomme ich die?

                            Wir veröffentlichen auf -Github die +GitHub die CAD-Zeichnungen für die Platinen. Du kannst dir von dort die benötigten Dateien herunterladen und bei einem Platinenhersteller deiner Wahl bestellen.

                            Platinen sind aber auch immer Bestandteil unserer Sammelbestellungen, denn solche Spezialanfertigungen sind natürlich in Menge gefertigt wesentlich günstiger. Unser Hersteller in China bietet uns die fertigen PCBs in Menge für -etwa 0,50 € pro Stück an. In Deutschland gefertigt und damit schneller und -umweltschonender geliefert kosten Platinen 3 bis 5 € pro Stück, dies ist für +etwa 0,50 € pro Stück an. In Deutschland gefertigt und damit schneller und +umweltschonender geliefert kosten Platinen 3 bis 5 € pro Stück, dies ist für mittelgroße Bestellungen natürlich auch eine gute Option.

                            » Dokumentation zum PCB (Englisch)

                            Was kostet ein Überholabstandsmesser?

                            Die Teile für einen Bausatz können einzeln oder in größeren Mengen gekauft werden, wobei letzteres natürlich pro Bausatz günstiger ist. Unser Erfahrungswert der Sammelbestellungen ist, dass die Gesamtkosten pro Bausatz -sich in einer Größenordnung von 60-80 € bewegen, inkl. fertig gedrucktem -Gehäuse (etwa 15 €).

                            In diesem Preis sind eventuelle Preisschwankungen sowie defekt oder falsch +sich in einer Größenordnung von 60-80 € bewegen, inkl. fertig gedrucktem +Gehäuse (etwa 15 €).

                            In diesem Preis sind eventuelle Preisschwankungen sowie defekt oder falsch gelieferte Bauteile bereits eingerechnet. Mit Glück und auf eigenes Risiko -kannst du die Teile eventuell etwas günstiger finden.

                            Woher bekomme ich den Überholabstandsmesser?

                            Wir entwickeln in ehrenamtlicher Arbeit diese Gerät, aber wir verkaufen es +kannst du die Teile eventuell etwas günstiger finden.

                            Woher bekomme ich den Überholabstandsmesser?

                            Wir entwickeln in ehrenamtlicher Arbeit dieses Gerät, aber wir verkaufen es nicht. Die Pläne sind frei im Internet verfügbar, sodass jede:r es selbst nachbauen kann. Kapazitäten zum (kommerziellen) Angebot fertiger Geräte haben wir aber keine.

                            Über das Forum organisiert die Community regelmäßig @@ -33,5 +30,4 @@ macht es günstiger und bequemer, einen Bausatz zu erhalten. Zusammenbauen musst du den dann aber selbst.

                            Wenn du dich an einer Sammelbestellung beteiligen möchtest, oder dir sogar vorstellen könntest eine zu organisieren (eine Bauteileliste mit Hinweisen und Bestell-Links haben wir), melde -dich bitte im Forum der Community.

                            - \ No newline at end of file +dich bitte im Forum der Community.

                            \ No newline at end of file diff --git a/faq/build/was-kostet-ein-ueberholabstandsmesser/index.html b/faq/build/was-kostet-ein-ueberholabstandsmesser/index.html index fd297c21..fe95711a 100644 --- a/faq/build/was-kostet-ein-ueberholabstandsmesser/index.html +++ b/faq/build/was-kostet-ein-ueberholabstandsmesser/index.html @@ -1,20 +1,16 @@ -Was kostet ein Überholabstandsmesser? +<!doctype html><html itemscope itemtype=http://schema.org/WebPage lang=de class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Was kostet ein Überholabstandsmesser? | OpenBikeSensor - - - -

                            +"> +

                            Zurück zur FAQ

                            Was kostet ein Überholabstandsmesser?

                            Die Teile für einen Bausatz können einzeln oder in größeren Mengen gekauft werden, wobei letzteres natürlich pro Bausatz günstiger ist. Unser Erfahrungswert der Sammelbestellungen ist, dass die Gesamtkosten pro Bausatz -sich in einer Größenordnung von 60-80 € bewegen, inkl. fertig gedrucktem -Gehäuse (etwa 15 €).

                            In diesem Preis sind eventuelle Preisschwankungen sowie defekt oder falsch +sich in einer Größenordnung von 60-80 € bewegen, inkl. fertig gedrucktem +Gehäuse (etwa 15 €).

                            In diesem Preis sind eventuelle Preisschwankungen sowie defekt oder falsch gelieferte Bauteile bereits eingerechnet. Mit Glück und auf eigenes Risiko -kannst du die Teile eventuell etwas günstiger finden.

                            - \ No newline at end of file +kannst du die Teile eventuell etwas günstiger finden.

                            \ No newline at end of file diff --git a/faq/build/woher-bekomme-ich-den-ueberholabstandsmesser/index.html b/faq/build/woher-bekomme-ich-den-ueberholabstandsmesser/index.html index 2469f543..ebfbd020 100644 --- a/faq/build/woher-bekomme-ich-den-ueberholabstandsmesser/index.html +++ b/faq/build/woher-bekomme-ich-den-ueberholabstandsmesser/index.html @@ -1,19 +1,16 @@ -Woher bekomme ich den Überholabstandsmesser? +<!doctype html><html itemscope itemtype=http://schema.org/WebPage lang=de class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Woher bekomme ich den Überholabstandsmesser? | OpenBikeSensor + - - - -

                            -Zurück zur FAQ

                            Woher bekomme ich den Überholabstandsmesser?

                            Wir entwickeln in ehrenamtlicher Arbeit diese Gerät, aber wir verkaufen es +Wenn du dich an einer Sammelbestellung beteiligen möchtest, oder dir sogar vorstellen könntest eine zu organisieren (eine Bauteileliste mit Hinweisen und Bestell-Links haben wir), melde dich bitte im Forum der Community.">

                            +Zurück zur FAQ

                            Woher bekomme ich den Überholabstandsmesser?

                            Wir entwickeln in ehrenamtlicher Arbeit dieses Gerät, aber wir verkaufen es nicht. Die Pläne sind frei im Internet verfügbar, sodass jede:r es selbst nachbauen kann. Kapazitäten zum (kommerziellen) Angebot fertiger Geräte haben wir aber keine.

                            Über das Forum organisiert die Community regelmäßig @@ -21,5 +18,4 @@ macht es günstiger und bequemer, einen Bausatz zu erhalten. Zusammenbauen musst du den dann aber selbst.

                            Wenn du dich an einer Sammelbestellung beteiligen möchtest, oder dir sogar vorstellen könntest eine zu organisieren (eine Bauteileliste mit Hinweisen und Bestell-Links haben wir), melde -dich bitte im Forum der Community.

                            - \ No newline at end of file +dich bitte im Forum der Community.

                            \ No newline at end of file diff --git a/faq/build/woher-bekomme-ich-eine-platine/index.html b/faq/build/woher-bekomme-ich-eine-platine/index.html index d004444a..e62a7758 100644 --- a/faq/build/woher-bekomme-ich-eine-platine/index.html +++ b/faq/build/woher-bekomme-ich-eine-platine/index.html @@ -1,22 +1,18 @@ -Ich brauche eine Platine (PCB), woher bekomme ich die? +<!doctype html><html itemscope itemtype=http://schema.org/WebPage lang=de class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Ich brauche eine Platine (PCB), woher bekomme ich die? | OpenBikeSensor - - - -

                            +"> +

                            Zurück zur FAQ

                            Ich brauche eine Platine (PCB), woher bekomme ich die?

                            Wir veröffentlichen auf -Github die +GitHub die CAD-Zeichnungen für die Platinen. Du kannst dir von dort die benötigten Dateien herunterladen und bei einem Platinenhersteller deiner Wahl bestellen.

                            Platinen sind aber auch immer Bestandteil unserer Sammelbestellungen, denn solche Spezialanfertigungen sind natürlich in Menge gefertigt wesentlich günstiger. Unser Hersteller in China bietet uns die fertigen PCBs in Menge für -etwa 0,50 € pro Stück an. In Deutschland gefertigt und damit schneller und -umweltschonender geliefert kosten Platinen 3 bis 5 € pro Stück, dies ist für -mittelgroße Bestellungen natürlich auch eine gute Option.

                            » Dokumentation zum PCB (Englisch)

                            - \ No newline at end of file +etwa 0,50 € pro Stück an. In Deutschland gefertigt und damit schneller und +umweltschonender geliefert kosten Platinen 3 bis 5 € pro Stück, dies ist für +mittelgroße Bestellungen natürlich auch eine gute Option.

                            » Dokumentation zum PCB (Englisch)

                            \ No newline at end of file diff --git a/faq/data/_print/index.html b/faq/data/_print/index.html deleted file mode 100644 index 41b4a81c..00000000 --- a/faq/data/_print/index.html +++ /dev/null @@ -1,35 +0,0 @@ -Daten | OpenBikeSensor - - - -

                            Welche Daten werden aufgezeichnet?

                            Der Überholabstandsmesser ermittelt eine ganze Menge Daten, die in der Datei zu -jeder Fahrt gespeichert werden:

                            • Datum und Uhrzeiten
                            • GPS-Koordinaten
                            • GPS-Zustand, inkl. Genauigkeit und weiteren Zusatzinfos
                            • Rohdaten der Einzelmessungen beider Sensoren
                            • Gemessener Mindestabstand links und rechts
                            • Bestätigungen durch den Knopf am Lenker
                            • Batteriezustand
                            • ID des Gerätes, Firmwareversion, sowie einige Einstellungen und Eigenschaften des Gerätes

                            Die veränderlichen Werte werden etwa im Sekundentakt aufgezeichnet, auch wenn -gerade nichts gemessen oder kein Überholvorgang bestätigt wird. Dies erlaubt -die spätere Auswertung und Weiterentwicklung der Auswertungsalgorithmen.

                            Wie werden die Daten verarbeitet?

                            Der Überholabstandsmesser lädt ganze Fahrten als einzelne Dateien ins Portal -hoch. Diese werden importiert, jedoch nur zur Einzelanzeige der jeweiligen -Fahrt.

                            Später werden wir durch verschiedene Verarbeitungsalgorithmen abgeleitete -Datensätze aus mehreren Fahrten erstellen. Diese werden wir so weit es geht -anonymisieren, um keine Rückschlüsse auf personenbezogene und sensible -Informationen zu erlauben.

                            Die anonymisierten Datenpools sollen dann in eine große gemeinsame Datenbank -mit freier und offener Lizenz zusammenfließen.

                            Wie werden die Daten ausgewertet?

                            Noch nicht automatisch.

                            Es gibt eine Sammlung von -Skripten, die die -Auswertung ermöglichen. Diese ordnen die Messwerte Straßenabschnitten aus -OpenStreetMap zu und erlauben eine Visualisierung.

                            Diese Art der Auswertung muss momentan noch manuell gemacht werden. Eine -Integration in das Portal ist -geplant und in Arbeit, aber noch nicht verfügbar.

                            Warum sollte es mehrere Portale geben?

                            Wir wollen Dezentralität der gemessenen Daten ermöglichen. Auf die Portale -werden sehr sensible Daten hochgeladen. Durch die freie Wahl des Portals, und -damit der Betreiber:in, können alle Nutzer:innen selbst entscheiden, wem sie -diese Daten anvertrauen möchten.

                            In der Portalsoftware wird dann aus den sensiblen Daten ein öffentlicher -Datenpool abgeleitet. Dieser wird durch das Portal veröffentlicht und fließt in -die globale Datenbank ein.

                            Die Betreiber:innen einzelner Porale können außerdem Nebenabsprachen mit ihren -Nutzenden treffen, welche über das beschriebene Vorgehen zur Nutzung der -hochgeladenen Daten hinausgehen. Dies ist zum Beispiel bei einigen -Forschungsprojekten der Fall.

                            Hinweis: Dies alles ist Konzeption und Zukunftsmusik. Auf dem Weg der -Umsetzung sind noch viele Schritte zu tun.

                            Wie funktionieren Privacy Zones?

                            Diese Zonen erlauben das Anonymisieren deiner Aufzeichnungen innerhalb -bestimmter geografischer Bereiche, zum Beispiel damit nicht öffentlich ist, wo -du wohnst.

                            Du kannst sie im Überholabstandsmesser konfigurieren und auswählen, wie sich -das Gerät innerhalb dieser Zonen verhalten soll. In Zukunft wird es auch -möglich sein, im Portal solche Zonen zu verwalten und die Anonymisierung dort -durchführen zu lassen.

                            Zur Theorie und zum Konzept haben wir einen Artikel als Teil -der Dokumentation verfasst.

                            - \ No newline at end of file diff --git a/faq/data/index.html b/faq/data/index.html index 0eff51a2..a6d60d78 100644 --- a/faq/data/index.html +++ b/faq/data/index.html @@ -1,8 +1,5 @@ -Daten | OpenBikeSensor - - - -

                            Welche Daten werden aufgezeichnet?

                            Der Überholabstandsmesser ermittelt eine ganze Menge Daten, die in der Datei zu +Daten | OpenBikeSensor +

                            Welche Daten werden aufgezeichnet?

                            Der Überholabstandsmesser ermittelt eine ganze Menge Daten, die in der Datei zu jeder Fahrt gespeichert werden:

                            • Datum und Uhrzeiten
                            • GPS-Koordinaten
                            • GPS-Zustand, inkl. Genauigkeit und weiteren Zusatzinfos
                            • Rohdaten der Einzelmessungen beider Sensoren
                            • Gemessener Mindestabstand links und rechts
                            • Bestätigungen durch den Knopf am Lenker
                            • Batteriezustand
                            • ID des Gerätes, Firmwareversion, sowie einige Einstellungen und Eigenschaften des Gerätes

                            Die veränderlichen Werte werden etwa im Sekundentakt aufgezeichnet, auch wenn gerade nichts gemessen oder kein Überholvorgang bestätigt wird. Dies erlaubt die spätere Auswertung und Weiterentwicklung der Auswertungsalgorithmen.

                            Wie werden die Daten verarbeitet?

                            Der Überholabstandsmesser lädt ganze Fahrten als einzelne Dateien ins Portal @@ -21,7 +18,7 @@ damit der Betreiber:in, können alle Nutzer:innen selbst entscheiden, wem sie diese Daten anvertrauen möchten.

                            In der Portalsoftware wird dann aus den sensiblen Daten ein öffentlicher Datenpool abgeleitet. Dieser wird durch das Portal veröffentlicht und fließt in -die globale Datenbank ein.

                            Die Betreiber:innen einzelner Porale können außerdem Nebenabsprachen mit ihren +die globale Datenbank ein.

                            Die Betreiber:innen einzelner Portale können außerdem Nebenabsprachen mit ihren Nutzenden treffen, welche über das beschriebene Vorgehen zur Nutzung der hochgeladenen Daten hinausgehen. Dies ist zum Beispiel bei einigen Forschungsprojekten der Fall.

                            Hinweis: Dies alles ist Konzeption und Zukunftsmusik. Auf dem Weg der @@ -31,5 +28,4 @@ das Gerät innerhalb dieser Zonen verhalten soll. In Zukunft wird es auch möglich sein, im Portal solche Zonen zu verwalten und die Anonymisierung dort durchführen zu lassen.

                            Zur Theorie und zum Konzept haben wir einen Artikel als Teil -der Dokumentation verfasst.

                            - \ No newline at end of file +der Dokumentation verfasst.

                            \ No newline at end of file diff --git a/faq/data/warum-sollte-es-mehrere-portale-geben/index.html b/faq/data/warum-sollte-es-mehrere-portale-geben/index.html index 13a32dd0..43d3747e 100644 --- a/faq/data/warum-sollte-es-mehrere-portale-geben/index.html +++ b/faq/data/warum-sollte-es-mehrere-portale-geben/index.html @@ -1,26 +1,22 @@ -Warum sollte es mehrere Portale geben? +<!doctype html><html itemscope itemtype=http://schema.org/WebPage lang=de class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Warum sollte es mehrere Portale geben? | OpenBikeSensor + - - - -

                            +Die Betreiber:innen einzelner Portale können außerdem Nebenabsprachen mit ihren Nutzenden treffen, welche über das beschriebene Vorgehen zur Nutzung der hochgeladenen Daten hinausgehen.">

                            Zurück zur FAQ

                            Warum sollte es mehrere Portale geben?

                            Wir wollen Dezentralität der gemessenen Daten ermöglichen. Auf die Portale werden sehr sensible Daten hochgeladen. Durch die freie Wahl des Portals, und damit der Betreiber:in, können alle Nutzer:innen selbst entscheiden, wem sie diese Daten anvertrauen möchten.

                            In der Portalsoftware wird dann aus den sensiblen Daten ein öffentlicher Datenpool abgeleitet. Dieser wird durch das Portal veröffentlicht und fließt in -die globale Datenbank ein.

                            Die Betreiber:innen einzelner Porale können außerdem Nebenabsprachen mit ihren +die globale Datenbank ein.

                            Die Betreiber:innen einzelner Portale können außerdem Nebenabsprachen mit ihren Nutzenden treffen, welche über das beschriebene Vorgehen zur Nutzung der hochgeladenen Daten hinausgehen. Dies ist zum Beispiel bei einigen Forschungsprojekten der Fall.

                            Hinweis: Dies alles ist Konzeption und Zukunftsmusik. Auf dem Weg der -Umsetzung sind noch viele Schritte zu tun.

                            - \ No newline at end of file +Umsetzung sind noch viele Schritte zu tun.

                            \ No newline at end of file diff --git a/faq/data/welche-daten-werden-aufgezeichnet/index.html b/faq/data/welche-daten-werden-aufgezeichnet/index.html index b1df55cb..ec3febe6 100644 --- a/faq/data/welche-daten-werden-aufgezeichnet/index.html +++ b/faq/data/welche-daten-werden-aufgezeichnet/index.html @@ -1,17 +1,13 @@ -Welche Daten werden aufgezeichnet? +<!doctype html><html itemscope itemtype=http://schema.org/WebPage lang=de class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Welche Daten werden aufgezeichnet? | OpenBikeSensor + - - - -

                            +Datum und Uhrzeiten GPS-Koordinaten GPS-Zustand, inkl. Genauigkeit und weiteren Zusatzinfos Rohdaten der Einzelmessungen beider Sensoren Gemessener Mindestabstand links und rechts Bestätigungen durch den Knopf am Lenker Batteriezustand ID des Gerätes, Firmwareversion, sowie einige Einstellungen und Eigenschaften des Gerätes Die veränderlichen Werte werden etwa im Sekundentakt aufgezeichnet, auch wenn gerade nichts gemessen oder kein Überholvorgang bestätigt wird.">

                            Zurück zur FAQ

                            Welche Daten werden aufgezeichnet?

                            Der Überholabstandsmesser ermittelt eine ganze Menge Daten, die in der Datei zu jeder Fahrt gespeichert werden:

                            • Datum und Uhrzeiten
                            • GPS-Koordinaten
                            • GPS-Zustand, inkl. Genauigkeit und weiteren Zusatzinfos
                            • Rohdaten der Einzelmessungen beider Sensoren
                            • Gemessener Mindestabstand links und rechts
                            • Bestätigungen durch den Knopf am Lenker
                            • Batteriezustand
                            • ID des Gerätes, Firmwareversion, sowie einige Einstellungen und Eigenschaften des Gerätes

                            Die veränderlichen Werte werden etwa im Sekundentakt aufgezeichnet, auch wenn gerade nichts gemessen oder kein Überholvorgang bestätigt wird. Dies erlaubt -die spätere Auswertung und Weiterentwicklung der Auswertungsalgorithmen.

                            - \ No newline at end of file +die spätere Auswertung und Weiterentwicklung der Auswertungsalgorithmen.

                            \ No newline at end of file diff --git a/faq/data/wie-funktionieren-privacy-zones/index.html b/faq/data/wie-funktionieren-privacy-zones/index.html index 1b211a0a..08c5f63f 100644 --- a/faq/data/wie-funktionieren-privacy-zones/index.html +++ b/faq/data/wie-funktionieren-privacy-zones/index.html @@ -1,23 +1,19 @@ -Wie funktionieren Privacy Zones? +<!doctype html><html itemscope itemtype=http://schema.org/WebPage lang=de class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Wie funktionieren Privacy Zones? | OpenBikeSensor + - - - -

                            +Zur Theorie und zum Konzept haben wir einen Artikel als Teil der Dokumentation verfasst.">

                            Zurück zur FAQ

                            Wie funktionieren Privacy Zones?

                            Diese Zonen erlauben das Anonymisieren deiner Aufzeichnungen innerhalb bestimmter geografischer Bereiche, zum Beispiel damit nicht öffentlich ist, wo du wohnst.

                            Du kannst sie im Überholabstandsmesser konfigurieren und auswählen, wie sich das Gerät innerhalb dieser Zonen verhalten soll. In Zukunft wird es auch möglich sein, im Portal solche Zonen zu verwalten und die Anonymisierung dort durchführen zu lassen.

                            Zur Theorie und zum Konzept haben wir einen Artikel als Teil -der Dokumentation verfasst.

                            - \ No newline at end of file +der Dokumentation verfasst.

                            \ No newline at end of file diff --git a/faq/data/wie-werden-die-daten-ausgewertet/index.html b/faq/data/wie-werden-die-daten-ausgewertet/index.html index a6b30689..fcd45ee8 100644 --- a/faq/data/wie-werden-die-daten-ausgewertet/index.html +++ b/faq/data/wie-werden-die-daten-ausgewertet/index.html @@ -1,22 +1,18 @@ -Wie werden die Daten ausgewertet? +<!doctype html><html itemscope itemtype=http://schema.org/WebPage lang=de class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Wie werden die Daten ausgewertet? | OpenBikeSensor + - - - -

                            +Diese Art der Auswertung muss momentan noch manuell gemacht werden. Eine Integration in das Portal ist geplant und in Arbeit, aber noch nicht verfügbar.">

                            Zurück zur FAQ

                            Wie werden die Daten ausgewertet?

                            Noch nicht automatisch.

                            Es gibt eine Sammlung von Skripten, die die Auswertung ermöglichen. Diese ordnen die Messwerte Straßenabschnitten aus OpenStreetMap zu und erlauben eine Visualisierung.

                            Diese Art der Auswertung muss momentan noch manuell gemacht werden. Eine Integration in das Portal ist -geplant und in Arbeit, aber noch nicht verfügbar.

                            - \ No newline at end of file +geplant und in Arbeit, aber noch nicht verfügbar.

                            \ No newline at end of file diff --git a/faq/data/wie-werden-die-daten-verarbeitet/index.html b/faq/data/wie-werden-die-daten-verarbeitet/index.html index 52df6f26..561c76fe 100644 --- a/faq/data/wie-werden-die-daten-verarbeitet/index.html +++ b/faq/data/wie-werden-die-daten-verarbeitet/index.html @@ -1,23 +1,19 @@ -Wie werden die Daten verarbeitet? +<!doctype html><html itemscope itemtype=http://schema.org/WebPage lang=de class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Wie werden die Daten verarbeitet? | OpenBikeSensor + - - - -

                            +Die anonymisierten Datenpools sollen dann in eine große gemeinsame Datenbank mit freier und offener Lizenz zusammenfließen.">

                            Zurück zur FAQ

                            Wie werden die Daten verarbeitet?

                            Der Überholabstandsmesser lädt ganze Fahrten als einzelne Dateien ins Portal hoch. Diese werden importiert, jedoch nur zur Einzelanzeige der jeweiligen Fahrt.

                            Später werden wir durch verschiedene Verarbeitungsalgorithmen abgeleitete Datensätze aus mehreren Fahrten erstellen. Diese werden wir so weit es geht anonymisieren, um keine Rückschlüsse auf personenbezogene und sensible Informationen zu erlauben.

                            Die anonymisierten Datenpools sollen dann in eine große gemeinsame Datenbank -mit freier und offener Lizenz zusammenfließen.

                            - \ No newline at end of file +mit freier und offener Lizenz zusammenfließen.

                            \ No newline at end of file diff --git a/faq/index.html b/faq/index.html index e658e4d1..e94477c7 100644 --- a/faq/index.html +++ b/faq/index.html @@ -1,36 +1,33 @@ -FAQ | OpenBikeSensor - - - -

                            Häufig gestellte Fragen (FAQ)

                            Hier sammeln wir Fragen und Antworten, die uns häufig erreichen. Wenn dich -etwas rund um das Projekt interessiert, schau doch mal ob deine Frage schon +FAQ | OpenBikeSensor +

                            Häufig gestellte Fragen (FAQ)

                            Hier sammeln wir Fragen und Antworten, die uns häufig erreichen. Wenn dich +etwas rund um das Projekt interessiert, schau doch mal, ob deine Frage schon beantwortet ist. Ansonsten freuen wir uns natürlich jederzeit, wenn du zu uns Kontakt aufnimmst.

                            Die Fragen in diesem Bereich sind nach Themengebiet sortiert. Wir sortieren nicht in Unterseiten, das heißt mit der Suchfunktion deines Browsers (Strg+F) -kannst du hier in der Seite nach Themen suchen, die dich interessieren.

                            Bau und Beschaffung

                            Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen?

                            Ja. Natürlich hilft es, so etwas schon einmal gemacht zu haben. Aber mit +kannst du hier in der Seite nach Themen suchen, die dich interessieren.

                            Bau und Beschaffung

                            Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen Überholabstandsmesser bauen?

                            Ja! Natürlich hilft es, so etwas schon einmal gemacht zu haben. Aber mit genügend Zeit sollten es alle hinbekommen, ganz egal ob groß oder klein, jung oder alt. Natürlich muss gelötet, gebastelt und gecrimpt werden, und auch einige Schritte mit dem Computer sind nötig. Das meiste haben wir detailliert -beschrieben, und wenn du irgendwo stecken bleibst, kannst du immer in der +beschrieben und wenn du irgendwo stecken bleibst, kannst du immer in der Community nach Hilfe fragen.

                            Wenn du dir noch nicht ganz zutraust, das ganze Gerät allein zu basteln, such -dir doch Hilfe. In den meisten Regionen gibt es Maker-Spaces, Hackspaces, +dir am besten Hilfe. In den meisten Regionen gibt es Maker-Spaces, Hackspaces, Fab-Labs oder sonstige Orte, an denen Menschen zusammenkommen, die Erfahrung mit diesen Themen haben oder erlangen wollten. Dort bist du sicherlich willkommen!

                            Ich brauche eine Platine (PCB), woher bekomme ich die?

                            Wir veröffentlichen auf -Github die +GitHub die CAD-Zeichnungen für die Platinen. Du kannst dir von dort die benötigten Dateien herunterladen und bei einem Platinenhersteller deiner Wahl bestellen.

                            Platinen sind aber auch immer Bestandteil unserer Sammelbestellungen, denn solche Spezialanfertigungen sind natürlich in Menge gefertigt wesentlich günstiger. Unser Hersteller in China bietet uns die fertigen PCBs in Menge für -etwa 0,50 € pro Stück an. In Deutschland gefertigt und damit schneller und -umweltschonender geliefert kosten Platinen 3 bis 5 € pro Stück, dies ist für +etwa 0,50 € pro Stück an. In Deutschland gefertigt und damit schneller und +umweltschonender geliefert kosten Platinen 3 bis 5 € pro Stück, dies ist für mittelgroße Bestellungen natürlich auch eine gute Option.

                            » Dokumentation zum PCB (Englisch)

                            Was kostet ein Überholabstandsmesser?

                            Die Teile für einen Bausatz können einzeln oder in größeren Mengen gekauft werden, wobei letzteres natürlich pro Bausatz günstiger ist. Unser Erfahrungswert der Sammelbestellungen ist, dass die Gesamtkosten pro Bausatz -sich in einer Größenordnung von 60-80 € bewegen, inkl. fertig gedrucktem -Gehäuse (etwa 15 €).

                            In diesem Preis sind eventuelle Preisschwankungen sowie defekt oder falsch +sich in einer Größenordnung von 60-80 € bewegen, inkl. fertig gedrucktem +Gehäuse (etwa 15 €).

                            In diesem Preis sind eventuelle Preisschwankungen sowie defekt oder falsch gelieferte Bauteile bereits eingerechnet. Mit Glück und auf eigenes Risiko -kannst du die Teile eventuell etwas günstiger finden.

                            Woher bekomme ich den Überholabstandsmesser?

                            Wir entwickeln in ehrenamtlicher Arbeit diese Gerät, aber wir verkaufen es +kannst du die Teile eventuell etwas günstiger finden.

                            Woher bekomme ich den Überholabstandsmesser?

                            Wir entwickeln in ehrenamtlicher Arbeit dieses Gerät, aber wir verkaufen es nicht. Die Pläne sind frei im Internet verfügbar, sodass jede:r es selbst nachbauen kann. Kapazitäten zum (kommerziellen) Angebot fertiger Geräte haben wir aber keine.

                            Über das Forum organisiert die Community regelmäßig @@ -57,7 +54,7 @@ damit der Betreiber:in, können alle Nutzer:innen selbst entscheiden, wem sie diese Daten anvertrauen möchten.

                            In der Portalsoftware wird dann aus den sensiblen Daten ein öffentlicher Datenpool abgeleitet. Dieser wird durch das Portal veröffentlicht und fließt in -die globale Datenbank ein.

                            Die Betreiber:innen einzelner Porale können außerdem Nebenabsprachen mit ihren +die globale Datenbank ein.

                            Die Betreiber:innen einzelner Portale können außerdem Nebenabsprachen mit ihren Nutzenden treffen, welche über das beschriebene Vorgehen zur Nutzung der hochgeladenen Daten hinausgehen. Dies ist zum Beispiel bei einigen Forschungsprojekten der Fall.

                            Hinweis: Dies alles ist Konzeption und Zukunftsmusik. Auf dem Weg der @@ -67,5 +64,4 @@ das Gerät innerhalb dieser Zonen verhalten soll. In Zukunft wird es auch möglich sein, im Portal solche Zonen zu verwalten und die Anonymisierung dort durchführen zu lassen.

                            Zur Theorie und zum Konzept haben wir einen Artikel als Teil -der Dokumentation verfasst.

                            - \ No newline at end of file +der Dokumentation verfasst.

                            \ No newline at end of file diff --git a/favicons/android-144x144.png b/favicons/android-144x144.png old mode 100755 new mode 100644 diff --git a/favicons/android-192x192.png b/favicons/android-192x192.png old mode 100755 new mode 100644 diff --git a/favicons/android-36x36.png b/favicons/android-36x36.png old mode 100755 new mode 100644 diff --git a/favicons/android-48x48.png b/favicons/android-48x48.png old mode 100755 new mode 100644 diff --git a/favicons/android-72x72.png b/favicons/android-72x72.png old mode 100755 new mode 100644 diff --git a/favicons/android-96x96.png b/favicons/android-96x96.png old mode 100755 new mode 100644 diff --git a/favicons/apple-touch-icon-180x180.png b/favicons/apple-touch-icon-180x180.png old mode 100755 new mode 100644 diff --git a/favicons/favicon-16x16.png b/favicons/favicon-16x16.png old mode 100755 new mode 100644 diff --git a/favicons/favicon-32x32.png b/favicons/favicon-32x32.png old mode 100755 new mode 100644 diff --git a/favicons/favicon.ico b/favicons/favicon.ico old mode 100755 new mode 100644 diff --git a/favicons/pwa-192x192.png b/favicons/pwa-192x192.png old mode 100755 new mode 100644 diff --git a/favicons/pwa-512x512.png b/favicons/pwa-512x512.png old mode 100755 new mode 100644 diff --git a/favicons/tile150x150.png b/favicons/tile150x150.png old mode 100755 new mode 100644 diff --git a/favicons/tile310x150.png b/favicons/tile310x150.png old mode 100755 new mode 100644 diff --git a/favicons/tile310x310.png b/favicons/tile310x310.png old mode 100755 new mode 100644 diff --git a/favicons/tile70x70.png b/favicons/tile70x70.png old mode 100755 new mode 100644 diff --git a/flash/index.html b/flash/index.html index e047017c..f13b5809 100644 --- a/flash/index.html +++ b/flash/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/firmware/ \ No newline at end of file +https://www.openbikesensor.org/docs/firmware/ + \ No newline at end of file diff --git a/index.html b/index.html index 6670ee46..46bd1828 100644 --- a/index.html +++ b/index.html @@ -1,29 +1,43 @@ -OpenBikeSensor - - - -

                            OpenBikeSensor

                            Überholabstandsmessung für Radfahrende

                            Open Innovation, Open Source, Open Data, Open Science

                            Forum - Matrix - Github - Dokumentation - Unterstützen

                            Fragen und Diskutieren

                            Komm in unser Discourse-Forum, und diskutiere mit den anderen Interessierten +OpenBikeSensor +

                            OpenBikeSensor

                            Überholabstandsmessung für Radfahrende

                            Open Innovation, Open Source, Open Data, Open Science

                            Forum +Matrix logo Matrix + GitHub + Dokumentation + Unterstützen

                            Fragen und Diskutieren

                            Komm in unser Discourse-Forum, und diskutiere mit den anderen Interessierten und Aktiven. Hier findet fast alles einen Platz: Unterstützung bei Problemen, -Lokalgruppen, Forschungs­projekte, Events, Entwicklungsthemen, und vieles mehr.

                            Zum Forum

                            Bauen & Daten sammeln -

                            Bau Dir Deinen eigenen Überholabstandsmesser. Wir unterstützen Dich dabei. Am +Lokalgruppen, Forschungs­projekte, Events, Entwicklungsthemen, und vieles mehr.

                            Zum Forum

                            Bauen & Daten sammeln

                            Bau Dir Deinen eigenen Überholabstandsmesser. Wir unterstützen Dich dabei. Am besten schließt Du Dich einer der Sammelbestellungen und einem unserer Regio-Teams an.

                            Zur Bauanleitung

                            Weiterentwickeln

                            Was wir erstellen ist quelloffen, auf GitHub veröffentlichen wir den kompletten Code. Hier findest Du auch alle Pläne und Anleitungen sowie die Software zur -Visualisierung der gesammelten Daten.

                            Zu den GitHub-Repositories

                            -

                            OpenBikeSensor – OpenCitizenScience

                            Wir sind eine Gruppe von aktiven Alltagsradler:innen und möchten Radfahren sicherer und populärer machen. Überall!

                            Wie oft passiert es uns, dass uns ein Auto beinahe vom Sattel holt? Was wir alle kennen, überprüfen wir nun wissenschaftlich. Dazu haben wir einen Sensor entwickelt, der den Abstand misst und Überholmanöver Geodaten zuordnet. Wo ist es sicher? Wo nicht? Welche Uhrzeit? Welche Strecken? Der Sensor soll helfen, das zu erkennen und zu belegen.

                            Play content from youtube.com
                            YouTube Thumbnail

                            Teil der Lösung

                            Unser Ziel ist, Schwachstellen und Verbesserungspotenzial in der Verkehrsinfrastruktur aufzuzeigen und diese in Kooperation mit Stadtplaner:innen zu beheben. Zudem wollen wir die gesellschaftliche Wirkung von Kampagnen wie beispielsweise #AnderthalbMeter (in Städten) messen. Um statistisch verlässliche Open Data zu erhalten, ist es wichtig, dass möglichst viele Alltagsradler:innen mit unseren Sensoren offene Daten erfassen. Mit den von allen gesammelten Daten wiederum lassen sich individuelle Auswertungen vornehmen; von Initiativen, Kommunen und von Euch (Open Citizen Science).

                            Zentrales Hilfsmittel und Namensgeber des OpenBikeSensors ist unser Überholabstandsmesser, ein kleines technisches Gerät am Fahrrad. Während der Fahrt misst es den Abstand nach links und rechts (minus Lenkerbreite) und zeichnet die Fahrt via GPS auf. Überholmanöver kann die:der Radler:in per Taste am Lenker bestätigen. Nicht aufgezeichnet werden Fahrzeug- oder Personendaten der Überholenden. Uns geht es hauptsächlich um die Seitenabstände zu anderen Verkehrsteilnehmer:innen.

                            Wir wünschen uns, dass unser Sensor von vielen genutzt und weiterentwickelt wird. Die Anleitung zum Selberbauen und Montieren ist für alle als Open Source verfügbar – hier auf unserer Website und quelloffen via Github. Wir entwickeln für die offenen Daten zudem Visualisierungskonzepte (inklusive Visualisierungssoftware) und werten die Ergebnisse gemeinsam mit Forschungspartner:innen aus.

                            Uns geht es jedoch nicht nur um die Technik. Ergänzend entwickeln wir gemeinsam mit zivilgesellschaftlichen Organisationen und Kommunen regionale Aktionen, Kampagnen und Verkehrskonzepte. Wir gestalten Gesellschaft und leisten so einen Beitrag für mehr Lebensqualität in den Städten und auf dem Land.

                            Es wäre toll, wenn schon bald viele mitmachen, und wir so zusammen Bewegung in die Sache bringen.

                            Klingt interessant? Hier kannst du Teil der Community werden.

                            -

                            Visualisierung

                            Ein wichtiger Bestandteil des Projektes ist die Auswertbarkeit der gesammelten Daten. Daher arbeiten wir fleißig daran, die in den jeweiligen “Tracks” gespeicherten Werte zu extrahieren und visuell aufzubereiten.

                            Hier zeigen wir nur ein Beispiel einer Auswertung von einigen Überholvorgängen in Stuttgart. Es handelt sich dabei um einen erfahrenen Radfahrer, der routiniert und selbstbewusst im Straßenverkehr unterwegs ist. Natürlich wurde auch er sehr oft mit weniger als 1,5m Abstand überholt. Der Überholabstandsmesser erfasste sogar Messwerte unter 50 cm.

                            Ein anderes Beispiel zeigt einen einzelnen Überholvorgang, von dem auch eine Videoaufzeichnung vorhanden war. Wir blenden dazu einige GPS-Informationen ein, sowie den gemessenen Seitenabstand im jeweiligen Moment des Videos. Die Gefahrensituation für den:die Radfahrer:in wird dadurch nachempfindbar.

                            Play content from youtube.com
                            YouTube Thumbnail

                            Wer noch Ideen zur Visualisierung, Automatisierung, Programmierung, Auswertung, etc. hat oder einfach am Projekt interessiert ist und mitgestalten will, ist herzlich in die Community eingeladen.

                            -

                            Sei treibende Kraft

                            Es gibt viele Arten, wie Du das OpenCitizenScience-Projekt OpenBikeSensor unterstützen kannst, auch wenn Du nicht selbst aktiv werden möchtest.

                            Weitersagen heißt Unterstützen

                            Erzähle Freund:innen, Verwandten, Kolleg:innen und Geschäftspatner:innen von uns.

                            Folge uns via Twitter @OpenBikeSensor und werde Teil unserer Twitterei.

                            Spenden – jeder Beitrag zählt

                            Die Arbeit rund um den OpenBikeSensor ist sehr zeitaufwändig und kostspielig. -Der OpenBikeSensor e. V. nimmt gern Spenden +Visualisierung der gesammelten Daten.

                            Zu den GitHub-Repositories

                            OpenBikeSensor – OpenCitizenScience

                            Wir sind eine Gruppe von aktiven Alltagsradler:innen und möchten Radfahren sicherer und populärer machen. Überall! +Wie oft passiert es uns, dass uns ein Auto beinahe vom Sattel holt? Was wir alle kennen, überprüfen wir nun wissenschaftlich. Dazu haben wir einen Sensor entwickelt, der den Abstand misst und Überholmanöver Geodaten zuordnet. Wo ist es sicher? Wo nicht? Welche Uhrzeit? Welche Strecken? Der Sensor soll helfen, das zu erkennen und zu belegen. +
                            Play content from youtube.com
                            YouTube Thumbnail

                            Teil der Lösung

                            Unser Ziel ist, Schwachstellen und Verbesserungspotenzial in der Verkehrsinfrastruktur aufzuzeigen und diese in Kooperation mit Stadtplaner:innen zu beheben. Zudem wollen wir die gesellschaftliche Wirkung von Kampagnen wie beispielsweise #AnderthalbMeter (in Städten) messen. Um statistisch verlässliche Open Data zu erhalten, ist es wichtig, dass möglichst viele Alltagsradler:innen mit unseren Sensoren offene Daten erfassen. Mit den von allen gesammelten Daten wiederum lassen sich individuelle Auswertungen vornehmen; von Initiativen, Kommunen und von Euch (Open Citizen Science). +Zentrales Hilfsmittel und Namensgeber des OpenBikeSensors ist unser Überholabstandsmesser, ein kleines technisches Gerät am Fahrrad. Während der Fahrt misst es den Abstand nach links und rechts (minus Lenkerbreite) und zeichnet die Fahrt via GPS auf. Überholmanöver kann die:der Radler:in per Taste am Lenker bestätigen. Nicht aufgezeichnet werden Fahrzeug- oder Personendaten der Überholenden. Uns geht es hauptsächlich um die Seitenabstände zu anderen Verkehrsteilnehmer:innen. +Wir wünschen uns, dass unser Sensor von vielen genutzt und weiterentwickelt wird. Die Anleitung zum Selberbauen und Montieren ist für alle als Open Source verfügbar – hier auf unserer Website und quelloffen via GitHub. Wir entwickeln für die offenen Daten zudem Visualisierungskonzepte (inklusive Visualisierungssoftware) und werten die Ergebnisse gemeinsam mit Forschungspartner:innen aus. +Uns geht es jedoch nicht nur um die Technik. Ergänzend entwickeln wir gemeinsam mit zivilgesellschaftlichen Organisationen und Kommunen regionale Aktionen, Kampagnen und Verkehrskonzepte. Wir gestalten Gesellschaft und leisten so einen Beitrag für mehr Lebensqualität in den Städten und auf dem Land. +Es wäre toll, wenn schon bald viele mitmachen, und wir so zusammen Bewegung in die Sache bringen. +Klingt interessant? Hier kannst Du Teil der Community werden.

                            Visualisierung

                            Ein wichtiger Bestandteil des Projektes ist die Auswertbarkeit der gesammelten Daten. Daher arbeiten wir fleißig daran, die in den jeweiligen "Tracks" gespeicherten Werte zu extrahieren und visuell aufzubereiten. +Hier zeigen wir nur ein Beispiel einer Auswertung von einigen Überholvorgängen in Stuttgart. Es handelt sich dabei um einen erfahrenen Radfahrer, der routiniert und selbstbewusst im Straßenverkehr unterwegs ist. Natürlich wurde auch er sehr oft mit weniger als 1,5 m Abstand überholt. Der Überholabstandsmesser erfasste sogar Messwerte unter 50 cm.
                            Ein anderes Beispiel zeigt einen einzelnen Überholvorgang, von dem auch eine Videoaufzeichnung vorhanden war. Wir blenden dazu einige GPS-Informationen ein, sowie den gemessenen Seitenabstand im jeweiligen Moment des Videos. Die Gefahrensituation für den:die Radfahrer:in wird dadurch nachempfindbar. +
                            Play content from youtube.com
                            YouTube Thumbnail
                            +Wer noch Ideen zur Visualisierung, Automatisierung, Programmierung, Auswertung, etc. hat oder einfach am Projekt interessiert ist und mitgestalten will, ist herzlich in die Community eingeladen.

                            Sei treibende Kraft

                            Es gibt viele Arten, wie Du das OpenCitizenScience-Projekt OpenBikeSensor unterstützen kannst, auch wenn Du nicht selbst aktiv werden möchtest. +### Weitersagen heißt Unterstützen +Erzähle Freund:innen, Verwandten, Kolleg:innen und Geschäftspartner:innen von uns. +Folge uns via Twitter @OpenBikeSensor und werde Teil unserer Twitterei. +### Spenden – jeder Beitrag zählt +Die Arbeit rund um den OpenBikeSensor ist sehr zeitaufwändig und kostspielig. +Der [OpenBikeSensor e. V.](/verein/) nimmt gern Spenden entgegen, die in die Arbeit der Community fließen und künftige Projekte -unterstützen.

                            Bis 200 € reicht der Kontoauszug, um Spenden steuerlich absetzen zu können. -Dafür unbedingt den Verwendungszweck so ausfüllen:

                            +unterstützen.
                            +Bis 200 € reicht der Kontoauszug, um Spenden steuerlich absetzen zu können.
                            +Dafür unbedingt den Verwendungszweck so ausfüllen:
                             IBAN: DE40 4306 0967 1294 8595 00 (GLS)
                             Kontoinhaber: OpenBikeSensor e. V.
                             Verwendungszweck: Spende OpenBikeSensor
                            -

                            Hier ein paar Beispiele, was wir mit euren Spenden alles erreichen können:

                            • Wir kaufen mit Mengenrabatt und reduzierten Versandkosten neue Hardware und Bauteile ein. Diese bringen wir Euch dann zu Workshops mit, die wir hoffentlich bald wieder veranstalten können.
                            • Wir stellen Bausätze zusammen, damit Interessierte keine 6-8 Wochen auf Teile aus China warten müssen, sondern zügig loslegen können.
                            • Wir bauen Geräte, die wir für Aktionszeiträume an Engagierte ausleihen. Die Koordination übernehmen unsere Regio-Teams.
                            • Unsere Entwickler:innen können Hardware für Verbesserungen und Erweiterungen bestellen, ohne das Geld selbst vorschießen zu müssen.
                            • Wir finanzieren die IT-Infrastruktur für Ko-Kreation und Kollaboration unseres Netzwerks.

                            Die Ausgaben des Vereins werden transparent gegenüber der Community kommuniziert und mit allen abgestimmt. Mehr dazu findest du -auf den Unterseiten des Vereins.

                            - \ No newline at end of file +Hier ein paar Beispiele, was wir mit Euren Spenden alles erreichen können: +* Wir kaufen mit Mengenrabatt und reduzierten Versandkosten neue Hardware und Bauteile ein. Diese bringen wir Euch dann zu Workshops mit, welche wir veranstalten. +* Wir stellen Bausätze zusammen, damit Interessierte keine 6-8 Wochen auf Teile aus China warten müssen, sondern zügig loslegen können. +* Wir bauen Geräte, die wir für Aktionszeiträume an Engagierte ausleihen. Die Koordination übernehmen unsere Regio-Teams. +* Unsere Entwickler:innen können Hardware für Verbesserungen und Erweiterungen bestellen, ohne das Geld selbst vorschießen zu müssen. +* Wir finanzieren die IT-Infrastruktur für Ko-Kreation und Kollaboration unseres Netzwerks. +Die Ausgaben des Vereins werden transparent gegenüber der Community kommuniziert und mit allen abgestimmt. Mehr dazu findest Du +auf den Unterseiten [des Vereins](/verein/). \ No newline at end of file diff --git a/index.xml b/index.xml index a810e99c..aec4b298 100644 --- a/index.xml +++ b/index.xml @@ -1,4 +1,4 @@ -OpenBikeSensor – OpenBikeSensorhttps://www.openbikesensor.org/Recent content on OpenBikeSensorHugo -- gohugo.ioBlog: OpenBikeSensor mit Deutschem Fahrradpreis ausgezeichnethttps://www.openbikesensor.org/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/Thu, 17 Feb 2022 00:00:00 +0000https://www.openbikesensor.org/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/ +OpenBikeSensor – OpenBikeSensorhttps://www.openbikesensor.org/Recent content on OpenBikeSensorHugo -- gohugo.iodeBlog: OpenBikeSensor mit Deutschem Fahrradpreis ausgezeichnethttps://www.openbikesensor.org/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/Thu, 17 Feb 2022 00:00:00 +0000https://www.openbikesensor.org/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/ <p>Wir sind unglaublich stolz und froh, verkünden zu dürfen, beim diesjährigen Deutschen Fahrradpreis den ersten Preis in der Kategorie <em>Kommunikation und Service</em> gewonnen zu haben. Die Anerkennung bedeutet uns sehr viel, denn sie zeigt, wie wichtig und wertvoll die viele Arbeit ist, die wir bereits in dieses Projekt investiert haben.</p> <p>Auch freut uns die Bestätigung, die unserer Zusammenarbeit mit SimRa durch die gemeinsame Verleihung des Preises zuteil wird. Wir nehmen das als Zeichen, hier auf dem richtigen Weg zu sein. Besonders bei den hochkarätigen Mitbewerbern hätten wir eine solche Platzierung eigentlich für unmöglich gehalten.</p> <p>Wir haben schon viel Zeit in die Entwicklung und den Einsatz des OpenBikeSensors gesteckt, und sind noch lange nicht fertig. Natürlich werden wir das Preisgeld im Sinne des OpenBikeSensors verwenden. Die Community hat sich bereits getroffen und sich ausgetauscht über mögliche Projekte die, auch dank dieses Preises, dieses Jahr angegangen werden können. Unter anderem sind das:</p> @@ -9,8 +9,13 @@ <li>Weitere sinnvolle Nutzungsmöglichkeiten fallen uns sicher noch ein, und wenn du selbst Ideen hast, kannst du sie natürlich bei uns in der Community einbringen!</li> </ul> <h3 id="jetzt-mitmachen">Jetzt mitmachen!</h3> -<p>Auch du kannst Teil des OpenBikeSensor-Projekts werden! Es werden immer Menschen gebraucht, die ihre Zeit und ihre Fähigkeiten einbringen. Das sind nicht nur technische Themen (Entwicklung und Dokumentation), sondern auch die Organisation der Community, von Hardwarebestellungen, und nicht zu vergessen die Kommunikation mit Entscheidungsträger:innen der Lokalpolitik und Medienvertreter:innen. Melde dich gerne bei uns <a href="https://forum.openbikesensor.org">im Forum</a> oder schau dich auf dieser Website um, um mehr über das Projekt zu erfahren! <a href="https://www.openbikesensor.org/map">Auf der Karte</a> kannst du sehen, ob es in deiner Nähe schon Initativen gibt.</p> -<p>Besonders gefragt sind im Moment <strong>Python-, Embedded- oder Webentwickler:innen</strong> sowie <strong>Data Scientists</strong>. Wenn du dich hier auskennst und Interesse hast, deine Fähigkeiten im Sinne einer wissenschaftlichen Untersuchung der Verkehrswende einzusetzen, können wir auf jeden Fall deine Hilfe gebrauchen! Melde dich im Forum, bei Matrix, oder direkt auf Github, und hilf uns, die Auswertung der gesammelten Daten wieder einen großen Schritt voranzubringen!</p>Blog: Gründung des gemeinnützigen Vereins OpenBikeSensorhttps://www.openbikesensor.org/blog/2021/12/07/gr%C3%BCndung-des-gemeinn%C3%BCtzigen-vereins-openbikesensor/Tue, 07 Dec 2021 00:00:00 +0000https://www.openbikesensor.org/blog/2021/12/07/gr%C3%BCndung-des-gemeinn%C3%BCtzigen-vereins-openbikesensor/ +<p>Auch du kannst Teil des OpenBikeSensor-Projekts werden! +Es werden immer Menschen gebraucht, die ihre Zeit und ihre Fähigkeiten einbringen. +Das sind nicht nur technische Themen (Entwicklung und Dokumentation), sondern auch die Organisation der Community, von Hardwarebestellungen, und nicht zu vergessen die Kommunikation mit Entscheidungsträger:innen der Lokalpolitik und Medienvertreter:innen. +Melde dich gerne bei uns <a href="https://forum.openbikesensor.org">im Forum</a> oder schau dich auf dieser Website um, um mehr über das Projekt zu erfahren! <a href="https://www.openbikesensor.org/map">Auf der Karte</a> kannst du sehen, ob es in deiner Nähe schon Initativen gibt.</p> +<p>Besonders gefragt sind im Moment <strong>Python-, Embedded- oder Webentwickler:innen</strong> sowie <strong>Data Scientists</strong>. +Wenn du dich hier auskennst und Interesse hast, deine Fähigkeiten im Sinne einer wissenschaftlichen Untersuchung der Verkehrswende einzusetzen, können wir auf jeden Fall deine Hilfe gebrauchen! +Melde dich im Forum, bei Matrix, oder direkt auf GitHub, und hilf uns, die Auswertung der gesammelten Daten wieder einen großen Schritt voranzubringen!</p>Blog: Gründung des gemeinnützigen Vereins OpenBikeSensorhttps://www.openbikesensor.org/blog/2021/12/07/gr%C3%BCndung-des-gemeinn%C3%BCtzigen-vereins-openbikesensor/Tue, 07 Dec 2021 00:00:00 +0000https://www.openbikesensor.org/blog/2021/12/07/gr%C3%BCndung-des-gemeinn%C3%BCtzigen-vereins-openbikesensor/ <p>Nach etwas mehr als drei Stunden war es endlich geschafft: Die Satzung verabschiedet, ein Vorstand gewählt, wir hatten einen Verein gegründet.</p> <p>Gestern Abend, am 6. Dezember 2021, haben 16 Mitglieder der Community @@ -53,7 +58,7 @@ wofür eine Mitgliedschaft im Verein Voraussetzung ist, ist die Ernennung zum Vorstand. Ansonsten soll der Verein keineswegs die Arbeit der Community, wie sie bisher stattfand, einschränken. Entscheidungen werden weiter gemeinsam mit allen Interessierten gefällt, in formlosen Onlinetreffen und zwischendurch im -Forum, auf Github und via Chat, über Konsens- bzw. Widerstandsentscheide. Wenn +Forum, auf GitHub und via Chat, über Konsens- bzw. Widerstandsentscheide. Wenn du trotzdem Mitglied werden willst, um den Verein in seiner Arbeit zu unterstützen und einen finanziellen Beitrag zu leisten, kann die Aufnahme beim Vorstand beantragt werden. Wir werden in Kürze ein Antragsformular und eine diff --git a/js/deflate.js b/js/deflate.js new file mode 100644 index 00000000..b452c84e --- /dev/null +++ b/js/deflate.js @@ -0,0 +1,1652 @@ +/* Copyright (C) 1999 Masanao Izumo +* Version: 1.0.1 +* LastModified: Dec 25 1999 +*/ + +/* Interface: +* data = deflate(src); +*/ +const deflate = (function () { + /* constant parameters */ + var zip_WSIZE = 32768; // Sliding Window size + var zip_STORED_BLOCK = 0; + var zip_STATIC_TREES = 1; + var zip_DYN_TREES = 2; + + /* for deflate */ + var zip_DEFAULT_LEVEL = 6; + var zip_FULL_SEARCH = true; + var zip_INBUFSIZ = 32768; // Input buffer size + var zip_INBUF_EXTRA = 64; // Extra buffer + var zip_OUTBUFSIZ = 1024 * 8; + var zip_window_size = 2 * zip_WSIZE; + var zip_MIN_MATCH = 3; + var zip_MAX_MATCH = 258; + var zip_BITS = 16; + // for SMALL_MEM + var zip_LIT_BUFSIZE = 0x2000; + var zip_HASH_BITS = 13; + // for MEDIUM_MEM + // var zip_LIT_BUFSIZE = 0x4000; + // var zip_HASH_BITS = 14; + // for BIG_MEM + // var zip_LIT_BUFSIZE = 0x8000; + // var zip_HASH_BITS = 15; + //if(zip_LIT_BUFSIZE > zip_INBUFSIZ) + // alert("error: zip_INBUFSIZ is too small"); + //if((zip_WSIZE<<1) > (1< zip_BITS-1) + // alert("error: zip_HASH_BITS is too large"); + //if(zip_HASH_BITS < 8 || zip_MAX_MATCH != 258) + // alert("error: Code too clever"); + var zip_DIST_BUFSIZE = zip_LIT_BUFSIZE; + var zip_HASH_SIZE = 1 << zip_HASH_BITS; + var zip_HASH_MASK = zip_HASH_SIZE - 1; + var zip_WMASK = zip_WSIZE - 1; + var zip_NIL = 0; // Tail of hash chains + var zip_TOO_FAR = 4096; + var zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1; + var zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD; + var zip_SMALLEST = 1; + var zip_MAX_BITS = 15; + var zip_MAX_BL_BITS = 7; + var zip_LENGTH_CODES = 29; + var zip_LITERALS = 256; + var zip_END_BLOCK = 256; + var zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES; + var zip_D_CODES = 30; + var zip_BL_CODES = 19; + var zip_REP_3_6 = 16; + var zip_REPZ_3_10 = 17; + var zip_REPZ_11_138 = 18; + var zip_HEAP_SIZE = 2 * zip_L_CODES + 1; + var zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / + zip_MIN_MATCH); + + /* variables */ + var zip_free_queue; + var zip_qhead, zip_qtail; + var zip_initflag; + var zip_outbuf = null; + var zip_outcnt, zip_outoff; + var zip_complete; + var zip_window; + var zip_d_buf; + var zip_l_buf; + var zip_prev; + var zip_bi_buf; + var zip_bi_valid; + var zip_block_start; + var zip_ins_h; + var zip_hash_head; + var zip_prev_match; + var zip_match_available; + var zip_match_length; + var zip_prev_length; + var zip_strstart; + var zip_match_start; + var zip_eofile; + var zip_lookahead; + var zip_max_chain_length; + var zip_max_lazy_match; + var zip_compr_level; + var zip_good_match; + var zip_nice_match; + var zip_dyn_ltree; + var zip_dyn_dtree; + var zip_static_ltree; + var zip_static_dtree; + var zip_bl_tree; + var zip_l_desc; + var zip_d_desc; + var zip_bl_desc; + var zip_bl_count; + var zip_heap; + var zip_heap_len; + var zip_heap_max; + var zip_depth; + var zip_length_code; + var zip_dist_code; + var zip_base_length; + var zip_base_dist; + var zip_flag_buf; + var zip_last_lit; + var zip_last_dist; + var zip_last_flags; + var zip_flags; + var zip_flag_bit; + var zip_opt_len; + var zip_static_len; + var zip_deflate_data; + var zip_deflate_pos; + + /* objects (deflate) */ + + function zip_DeflateCT() { + this.fc = 0; // frequency count or bit string + this.dl = 0; // father node in Huffman tree or length of bit string + } + + function zip_DeflateTreeDesc() { + this.dyn_tree = null; // the dynamic tree + this.static_tree = null; // corresponding static tree or NULL + this.extra_bits = null; // extra bits for each code or NULL + this.extra_base = 0; // base index for extra_bits + this.elems = 0; // max number of elements in the tree + this.max_length = 0; // max bit length for the codes + this.max_code = 0; // largest code with non zero frequency + } + + /* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ + function zip_DeflateConfiguration(a, b, c, d) { + this.good_length = a; // reduce lazy search above this match length + this.max_lazy = b; // do not perform lazy search above this match length + this.nice_length = c; // quit search above this match length + this.max_chain = d; + } + + function zip_DeflateBuffer() { + this.next = null; + this.len = 0; + this.ptr = new Array(zip_OUTBUFSIZ); + this.off = 0; + } + + /* constant tables */ + var zip_extra_lbits = [ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; + var zip_extra_dbits = [ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; + var zip_extra_blbits = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]; + var zip_bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + var zip_configuration_table = [ + new zip_DeflateConfiguration(0, 0, 0, 0), + new zip_DeflateConfiguration(4, 4, 8, 4), + new zip_DeflateConfiguration(4, 5, 16, 8), + new zip_DeflateConfiguration(4, 6, 32, 32), + new zip_DeflateConfiguration(4, 4, 16, 16), + new zip_DeflateConfiguration(8, 16, 32, 32), + new zip_DeflateConfiguration(8, 16, 128, 128), + new zip_DeflateConfiguration(8, 32, 128, 256), + new zip_DeflateConfiguration(32, 128, 258, 1024), + new zip_DeflateConfiguration(32, 258, 258, 4096)]; + + + /* routines (deflate) */ + + function zip_deflate_start(level) { + var i; + + if (!level) + level = zip_DEFAULT_LEVEL; + else if (level < 1) + level = 1; + else if (level > 9) + level = 9; + + zip_compr_level = level; + zip_initflag = false; + zip_eofile = false; + if (zip_outbuf != null) + return; + + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = new Array(zip_OUTBUFSIZ); + zip_window = new Array(zip_window_size); + zip_d_buf = new Array(zip_DIST_BUFSIZE); + zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA); + zip_prev = new Array(1 << zip_BITS); + zip_dyn_ltree = new Array(zip_HEAP_SIZE); + for (i = 0; i < zip_HEAP_SIZE; i++) + zip_dyn_ltree[i] = new zip_DeflateCT(); + zip_dyn_dtree = new Array(2 * zip_D_CODES + 1); + for (i = 0; i < 2 * zip_D_CODES + 1; i++) + zip_dyn_dtree[i] = new zip_DeflateCT(); + zip_static_ltree = new Array(zip_L_CODES + 2); + for (i = 0; i < zip_L_CODES + 2; i++) + zip_static_ltree[i] = new zip_DeflateCT(); + zip_static_dtree = new Array(zip_D_CODES); + for (i = 0; i < zip_D_CODES; i++) + zip_static_dtree[i] = new zip_DeflateCT(); + zip_bl_tree = new Array(2 * zip_BL_CODES + 1); + for (i = 0; i < 2 * zip_BL_CODES + 1; i++) + zip_bl_tree[i] = new zip_DeflateCT(); + zip_l_desc = new zip_DeflateTreeDesc(); + zip_d_desc = new zip_DeflateTreeDesc(); + zip_bl_desc = new zip_DeflateTreeDesc(); + zip_bl_count = new Array(zip_MAX_BITS + 1); + zip_heap = new Array(2 * zip_L_CODES + 1); + zip_depth = new Array(2 * zip_L_CODES + 1); + zip_length_code = new Array(zip_MAX_MATCH - zip_MIN_MATCH + 1); + zip_dist_code = new Array(512); + zip_base_length = new Array(zip_LENGTH_CODES); + zip_base_dist = new Array(zip_D_CODES); + zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8)); + } + + function zip_deflate_end() { + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = null; + zip_window = null; + zip_d_buf = null; + zip_l_buf = null; + zip_prev = null; + zip_dyn_ltree = null; + zip_dyn_dtree = null; + zip_static_ltree = null; + zip_static_dtree = null; + zip_bl_tree = null; + zip_l_desc = null; + zip_d_desc = null; + zip_bl_desc = null; + zip_bl_count = null; + zip_heap = null; + zip_depth = null; + zip_length_code = null; + zip_dist_code = null; + zip_base_length = null; + zip_base_dist = null; + zip_flag_buf = null; + } + + function zip_reuse_queue(p) { + p.next = zip_free_queue; + zip_free_queue = p; + } + + function zip_new_queue() { + var p; + + if (zip_free_queue != null) { + p = zip_free_queue; + zip_free_queue = zip_free_queue.next; + } + else + p = new zip_DeflateBuffer(); + p.next = null; + p.len = p.off = 0; + + return p; + } + + function zip_head1(i) { + return zip_prev[zip_WSIZE + i]; + } + + function zip_head2(i, val) { + return zip_prev[zip_WSIZE + i] = val; + } + + /* put_byte is used for the compressed output, put_ubyte for the + * uncompressed output. However unlzw() uses window for its + * suffix table instead of its output buffer, so it does not use put_ubyte + * (to be cleaned up). + */ + function zip_put_byte(c) { + zip_outbuf[zip_outoff + zip_outcnt++] = c; + if (zip_outoff + zip_outcnt == zip_OUTBUFSIZ) + zip_qoutbuf(); + } + + /* Output a 16 bit value, lsb first */ + function zip_put_short(w) { + w &= 0xffff; + if (zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { + zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); + zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); + } else { + zip_put_byte(w & 0xff); + zip_put_byte(w >>> 8); + } + } + + /* ========================================================================== + * Insert string s in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of s are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ + function zip_INSERT_STRING() { + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) + ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) + & zip_HASH_MASK; + zip_hash_head = zip_head1(zip_ins_h); + zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; + zip_head2(zip_ins_h, zip_strstart); + } + + /* Send a code of the given tree. c and tree must not have side effects */ + function zip_SEND_CODE(c, tree) { + zip_send_bits(tree[c].fc, tree[c].dl); + } + + /* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. dist_code[256] and dist_code[257] are never + * used. + */ + function zip_D_CODE(dist) { + return (dist < 256 ? zip_dist_code[dist] + : zip_dist_code[256 + (dist >> 7)]) & 0xff; + } + + /* ========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ + function zip_SMALLER(tree, n, m) { + return tree[n].fc < tree[m].fc || + (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]); + } + + /* ========================================================================== + * read string data + */ + function zip_read_buff(buff, offset, n) { + var i; + for (i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) + buff[offset + i] = + zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff; + return i; + } + + /* ========================================================================== + * Initialize the "longest match" routines for a new file + */ + function zip_lm_init() { + var j; + + /* Initialize the hash table. */ + for (j = 0; j < zip_HASH_SIZE; j++) + // zip_head2(j, zip_NIL); + zip_prev[zip_WSIZE + j] = 0; + /* prev will be initialized on the fly */ + + /* Set the default configuration parameters: + */ + zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; + zip_good_match = zip_configuration_table[zip_compr_level].good_length; + if (!zip_FULL_SEARCH) + zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; + zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; + + zip_strstart = 0; + zip_block_start = 0; + + zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); + if (zip_lookahead <= 0) { + zip_eofile = true; + zip_lookahead = 0; + return; + } + zip_eofile = false; + /* Make sure that we always have enough lookahead. This is important + * if input comes from a device such as a tty. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + + /* If lookahead < MIN_MATCH, ins_h is garbage, but this is + * not important since only literal bytes will be emitted. + */ + zip_ins_h = 0; + for (j = 0; j < zip_MIN_MATCH - 1; j++) { + // UPDATE_HASH(ins_h, window[j]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK; + } + } + + /* ========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + */ + function zip_longest_match(cur_match) { + var chain_length = zip_max_chain_length; // max hash chain length + var scanp = zip_strstart; // current string + var matchp; // matched string + var len; // length of current match + var best_len = zip_prev_length; // best match length so far + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL); + + var strendp = zip_strstart + zip_MAX_MATCH; + var scan_end1 = zip_window[scanp + best_len - 1]; + var scan_end = zip_window[scanp + best_len]; + + /* Do not waste too much time if we already have a good match: */ + if (zip_prev_length >= zip_good_match) + chain_length >>= 2; + + // Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead"); + + do { + // Assert(cur_match < encoder->strstart, "no future"); + matchp = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2: + */ + if (zip_window[matchp + best_len] != scan_end || + zip_window[matchp + best_len - 1] != scan_end1 || + zip_window[matchp] != zip_window[scanp] || + zip_window[++matchp] != zip_window[scanp + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scanp += 2; + matchp++; + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + scanp < strendp); + + len = zip_MAX_MATCH - (strendp - scanp); + scanp = strendp - zip_MAX_MATCH; + + if (len > best_len) { + zip_match_start = cur_match; + best_len = len; + if (zip_FULL_SEARCH) { + if (len >= zip_MAX_MATCH) break; + } else { + if (len >= zip_nice_match) break; + } + + scan_end1 = zip_window[scanp + best_len - 1]; + scan_end = zip_window[scanp + best_len]; + } + } while ((cur_match = zip_prev[cur_match & zip_WMASK]) > limit + && --chain_length != 0); + + return best_len; + } + + /* ========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead, and sets eofile if end of input file. + * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0 + * OUT assertions: at least one byte has been read, or eofile is set; + * file reads are performed for at least two bytes (required for the + * translate_eol option). + */ + function zip_fill_window() { + var n, m; + + // Amount of free space at the end of the window. + var more = zip_window_size - zip_lookahead - zip_strstart; + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (more == -1) { + /* Very unlikely, but possible on 16 bit machine if strstart == 0 + * and lookahead == 1 (input done one byte at time) + */ + more--; + } else if (zip_strstart >= zip_WSIZE + zip_MAX_DIST) { + /* By the IN assertion, the window is not empty so we can't confuse + * more == 0 with more == 64K on a 16 bit machine. + */ + // Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM"); + + // System.arraycopy(window, WSIZE, window, 0, WSIZE); + for (n = 0; n < zip_WSIZE; n++) + zip_window[n] = zip_window[n + zip_WSIZE]; + + zip_match_start -= zip_WSIZE; + zip_strstart -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */ + zip_block_start -= zip_WSIZE; + + for (n = 0; n < zip_HASH_SIZE; n++) { + m = zip_head1(n); + zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + for (n = 0; n < zip_WSIZE; n++) { + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + m = zip_prev[n]; + zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + more += zip_WSIZE; + } + // At this point, more >= 2 + if (!zip_eofile) { + n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); + if (n <= 0) + zip_eofile = true; + else + zip_lookahead += n; + } + } + + /* ========================================================================== + * Processes a new input file and return its compressed length. This + * function does not perform lazy evaluationof matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ + function zip_deflate_fast() { + while (zip_lookahead != 0 && zip_qhead == null) { + var flush; // set if current block must be flushed + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (zip_hash_head != zip_NIL && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + } + if (zip_match_length >= zip_MIN_MATCH) { + // check_match(strstart, match_start, match_length); + + flush = zip_ct_tally(zip_strstart - zip_match_start, + zip_match_length - zip_MIN_MATCH); + zip_lookahead -= zip_match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (zip_match_length <= zip_max_lazy_match) { + zip_match_length--; // string at strstart already in hash table + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since + * the next lookahead bytes will be emitted as literals. + */ + } while (--zip_match_length != 0); + zip_strstart++; + } else { + zip_strstart += zip_match_length; + zip_match_length = 0; + zip_ins_h = zip_window[zip_strstart] & 0xff; + // UPDATE_HASH(ins_h, window[strstart + 1]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK; + + //#if MIN_MATCH != 3 + // Call UPDATE_HASH() MIN_MATCH-3 more times + //#endif + + } + } else { + /* No match, output a literal byte */ + flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff); + zip_lookahead--; + zip_strstart++; + } + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + } + + function zip_deflate_better() { + /* Process the input block. */ + while (zip_lookahead != 0 && zip_qhead == null) { + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + */ + zip_prev_length = zip_match_length; + zip_prev_match = zip_match_start; + zip_match_length = zip_MIN_MATCH - 1; + + if (zip_hash_head != zip_NIL && + zip_prev_length < zip_max_lazy_match && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + + /* Ignore a length 3 match if it is too distant: */ + if (zip_match_length == zip_MIN_MATCH && + zip_strstart - zip_match_start > zip_TOO_FAR) { + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + zip_match_length--; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (zip_prev_length >= zip_MIN_MATCH && + zip_match_length <= zip_prev_length) { + var flush; // set if current block must be flushed + + // check_match(strstart - 1, prev_match, prev_length); + flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, + zip_prev_length - zip_MIN_MATCH); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. + */ + zip_lookahead -= zip_prev_length - 1; + zip_prev_length -= 2; + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since the + * next lookahead bytes will always be emitted as literals. + */ + } while (--zip_prev_length != 0); + zip_match_available = 0; + zip_match_length = zip_MIN_MATCH - 1; + zip_strstart++; + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + } else if (zip_match_available != 0) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + if (zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + zip_strstart++; + zip_lookahead--; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + zip_match_available = 1; + zip_strstart++; + zip_lookahead--; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + } + + function zip_init_deflate() { + if (zip_eofile) + return; + zip_bi_buf = 0; + zip_bi_valid = 0; + zip_ct_init(); + zip_lm_init(); + + zip_qhead = null; + zip_outcnt = 0; + zip_outoff = 0; + + if (zip_compr_level <= 3) { + zip_prev_length = zip_MIN_MATCH - 1; + zip_match_length = 0; + } + else { + zip_match_length = zip_MIN_MATCH - 1; + zip_match_available = 0; + } + + zip_complete = false; + } + + /* ========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ + function zip_deflate_internal(buff, off, buff_size) { + var n; + + if (!zip_initflag) { + zip_init_deflate(); + zip_initflag = true; + if (zip_lookahead == 0) { // empty + zip_complete = true; + return 0; + } + } + + if ((n = zip_qcopy(buff, off, buff_size)) == buff_size) + return buff_size; + + if (zip_complete) + return n; + + if (zip_compr_level <= 3) // optimized for speed + zip_deflate_fast(); + else + zip_deflate_better(); + if (zip_lookahead == 0) { + if (zip_match_available != 0) + zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff); + zip_flush_block(1); + zip_complete = true; + } + return n + zip_qcopy(buff, n + off, buff_size - n); + } + + function zip_qcopy(buff, off, buff_size) { + var n, i, j; + + n = 0; + while (zip_qhead != null && n < buff_size) { + i = buff_size - n; + if (i > zip_qhead.len) + i = zip_qhead.len; + // System.arraycopy(qhead.ptr, qhead.off, buff, off + n, i); + for (j = 0; j < i; j++) + buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j]; + + zip_qhead.off += i; + zip_qhead.len -= i; + n += i; + if (zip_qhead.len == 0) { + var p; + p = zip_qhead; + zip_qhead = zip_qhead.next; + zip_reuse_queue(p); + } + } + + if (n == buff_size) + return n; + + if (zip_outoff < zip_outcnt) { + i = buff_size - n; + if (i > zip_outcnt - zip_outoff) + i = zip_outcnt - zip_outoff; + // System.arraycopy(outbuf, outoff, buff, off + n, i); + for (j = 0; j < i; j++) + buff[off + n + j] = zip_outbuf[zip_outoff + j]; + zip_outoff += i; + n += i; + if (zip_outcnt == zip_outoff) + zip_outcnt = zip_outoff = 0; + } + return n; + } + + /* ========================================================================== + * Allocate the match buffer, initialize the various tables and save the + * location of the internal file attribute (ascii/binary) and method + * (DEFLATE/STORE). + */ + function zip_ct_init() { + var n; // iterates over tree elements + var bits; // bit counter + var length; // length value + var code; // code value + var dist; // distance index + + if (zip_static_dtree[0].dl != 0) return; // ct_init already called + + zip_l_desc.dyn_tree = zip_dyn_ltree; + zip_l_desc.static_tree = zip_static_ltree; + zip_l_desc.extra_bits = zip_extra_lbits; + zip_l_desc.extra_base = zip_LITERALS + 1; + zip_l_desc.elems = zip_L_CODES; + zip_l_desc.max_length = zip_MAX_BITS; + zip_l_desc.max_code = 0; + + zip_d_desc.dyn_tree = zip_dyn_dtree; + zip_d_desc.static_tree = zip_static_dtree; + zip_d_desc.extra_bits = zip_extra_dbits; + zip_d_desc.extra_base = 0; + zip_d_desc.elems = zip_D_CODES; + zip_d_desc.max_length = zip_MAX_BITS; + zip_d_desc.max_code = 0; + + zip_bl_desc.dyn_tree = zip_bl_tree; + zip_bl_desc.static_tree = null; + zip_bl_desc.extra_bits = zip_extra_blbits; + zip_bl_desc.extra_base = 0; + zip_bl_desc.elems = zip_BL_CODES; + zip_bl_desc.max_length = zip_MAX_BL_BITS; + zip_bl_desc.max_code = 0; + + // Initialize the mapping length (0..255) -> length code (0..28) + length = 0; + for (code = 0; code < zip_LENGTH_CODES - 1; code++) { + zip_base_length[code] = length; + for (n = 0; n < (1 << zip_extra_lbits[code]); n++) + zip_length_code[length++] = code; + } + // Assert (length == 256, "ct_init: length != 256"); + + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + zip_length_code[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + zip_base_dist[code] = dist; + for (n = 0; n < (1 << zip_extra_dbits[code]); n++) { + zip_dist_code[dist++] = code; + } + } + // Assert (dist == 256, "ct_init: dist != 256"); + dist >>= 7; // from now on, all distances are divided by 128 + for (; code < zip_D_CODES; code++) { + zip_base_dist[code] = dist << 7; + for (n = 0; n < (1 << (zip_extra_dbits[code] - 7)); n++) + zip_dist_code[256 + dist++] = code; + } + // Assert (dist == 256, "ct_init: 256+dist != 512"); + + // Construct the codes of the static literal tree + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + n = 0; + while (n <= 143) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } + while (n <= 255) { zip_static_ltree[n++].dl = 9; zip_bl_count[9]++; } + while (n <= 279) { zip_static_ltree[n++].dl = 7; zip_bl_count[7]++; } + while (n <= 287) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); + + /* The static distance tree is trivial: */ + for (n = 0; n < zip_D_CODES; n++) { + zip_static_dtree[n].dl = 5; + zip_static_dtree[n].fc = zip_bi_reverse(n, 5); + } + + // Initialize the first block of the first file: + zip_init_block(); + } + + /* ========================================================================== + * Initialize a new block. + */ + function zip_init_block() { + var n; // iterates over tree elements + + // Initialize the trees. + for (n = 0; n < zip_L_CODES; n++) zip_dyn_ltree[n].fc = 0; + for (n = 0; n < zip_D_CODES; n++) zip_dyn_dtree[n].fc = 0; + for (n = 0; n < zip_BL_CODES; n++) zip_bl_tree[n].fc = 0; + + zip_dyn_ltree[zip_END_BLOCK].fc = 1; + zip_opt_len = zip_static_len = 0; + zip_last_lit = zip_last_dist = zip_last_flags = 0; + zip_flags = 0; + zip_flag_bit = 1; + } + + /* ========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ + function zip_pqdownheap( + tree, // the tree to restore + k) { // node to move down + var v = zip_heap[k]; + var j = k << 1; // left son of k + + while (j <= zip_heap_len) { + // Set j to the smallest of the two sons: + if (j < zip_heap_len && + zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) + j++; + + // Exit if v is smaller than both sons + if (zip_SMALLER(tree, v, zip_heap[j])) + break; + + // Exchange v with the smallest son + zip_heap[k] = zip_heap[j]; + k = j; + + // And continue down the tree, setting j to the left son of k + j <<= 1; + } + zip_heap[k] = v; + } + + /* ========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ + function zip_gen_bitlen(desc) { // the tree descriptor + var tree = desc.dyn_tree; + var extra = desc.extra_bits; + var base = desc.extra_base; + var max_code = desc.max_code; + var max_length = desc.max_length; + var stree = desc.static_tree; + var h; // heap index + var n, m; // iterate over the tree elements + var bits; // bit length + var xbits; // extra bits + var f; // frequency + var overflow = 0; // number of elements with bit length too large + + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap + + for (h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) { + n = zip_heap[h]; + bits = tree[tree[n].dl].dl + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n].dl = bits; + // We overwrite tree[n].dl which is no longer needed + + if (n > max_code) + continue; // not a leaf node + + zip_bl_count[bits]++; + xbits = 0; + if (n >= base) + xbits = extra[n - base]; + f = tree[n].fc; + zip_opt_len += f * (bits + xbits); + if (stree != null) + zip_static_len += f * (stree[n].dl + xbits); + } + if (overflow == 0) + return; + + // This happens for example on obj2 and pic of the Calgary corpus + + // Find the first bit length which could increase: + do { + bits = max_length - 1; + while (zip_bl_count[bits] == 0) + bits--; + zip_bl_count[bits]--; // move one leaf down the tree + zip_bl_count[bits + 1] += 2; // move one overflow item as its brother + zip_bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = zip_bl_count[bits]; + while (n != 0) { + m = zip_heap[--h]; + if (m > max_code) + continue; + if (tree[m].dl != bits) { + zip_opt_len += (bits - tree[m].dl) * tree[m].fc; + tree[m].fc = bits; + } + n--; + } + } + } + + /* ========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ + function zip_gen_codes(tree, // the tree to decorate + max_code) { // largest code with non zero frequency + var next_code = new Array(zip_MAX_BITS + 1); // next code value for each bit length + var code = 0; // running code value + var bits; // bit index + var n; // code index + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= zip_MAX_BITS; bits++) { + code = ((code + zip_bl_count[bits - 1]) << 1); + next_code[bits] = code; + } + + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + // Assert (code + encoder->bl_count[MAX_BITS]-1 == (1<> 1; n >= 1; n--) + zip_pqdownheap(tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + do { + n = zip_heap[zip_SMALLEST]; + zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; + zip_pqdownheap(tree, zip_SMALLEST); + + m = zip_heap[zip_SMALLEST]; // m = node of next least frequency + + // keep the nodes sorted by frequency + zip_heap[--zip_heap_max] = n; + zip_heap[--zip_heap_max] = m; + + // Create a new node father of n and m + tree[node].fc = tree[n].fc + tree[m].fc; + // depth[node] = (char)(MAX(depth[n], depth[m]) + 1); + if (zip_depth[n] > zip_depth[m] + 1) + zip_depth[node] = zip_depth[n]; + else + zip_depth[node] = zip_depth[m] + 1; + tree[n].dl = tree[m].dl = node; + + // and insert the new node in the heap + zip_heap[zip_SMALLEST] = node++; + zip_pqdownheap(tree, zip_SMALLEST); + + } while (zip_heap_len >= 2); + + zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + zip_gen_bitlen(desc); + + // The field len is now set, we can generate the bit codes + zip_gen_codes(tree, max_code); + } + + /* ========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. Updates opt_len to take into account the repeat + * counts. (The contribution of the bit length codes will be added later + * during the construction of bl_tree.) + */ + function zip_scan_tree(tree,// the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + tree[max_code + 1].dl = 0xffff; // guard + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) + continue; + else if (count < min_count) + zip_bl_tree[curlen].fc += count; + else if (curlen != 0) { + if (curlen != prevlen) + zip_bl_tree[curlen].fc++; + zip_bl_tree[zip_REP_3_6].fc++; + } else if (count <= 10) + zip_bl_tree[zip_REPZ_3_10].fc++; + else + zip_bl_tree[zip_REPZ_11_138].fc++; + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + + /* ========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ + function zip_send_tree(tree, // the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + /* tree[max_code+1].dl = -1; */ /* guard already set */ + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { zip_SEND_CODE(curlen, zip_bl_tree); } while (--count != 0); + } else if (curlen != 0) { + if (curlen != prevlen) { + zip_SEND_CODE(curlen, zip_bl_tree); + count--; + } + // Assert(count >= 3 && count <= 6, " 3_6?"); + zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); + zip_send_bits(count - 3, 2); + } else if (count <= 10) { + zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); + zip_send_bits(count - 3, 3); + } else { + zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); + zip_send_bits(count - 11, 7); + } + count = 0; + prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + + /* ========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ + function zip_build_bl_tree() { + var max_blindex; // index of last bit length code of non zero freq + + // Determine the bit length frequencies for literal and distance trees + zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); + zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); + + // Build the bit length tree: + zip_build_tree(zip_bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = zip_BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (zip_bl_tree[zip_bl_order[max_blindex]].dl != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + zip_opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + // Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + return max_blindex; + } + + /* ========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ + function zip_send_all_trees(lcodes, dcodes, blcodes) { // number of codes for each tree + var rank; // index in bl_order + + // Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + // Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + // Tracev((stderr, "\nbl counts: ")); + zip_send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt + zip_send_bits(dcodes - 1, 5); + zip_send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt + for (rank = 0; rank < blcodes; rank++) { + // Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3); + } + + // send the literal tree + zip_send_tree(zip_dyn_ltree, lcodes - 1); + + // send the distance tree + zip_send_tree(zip_dyn_dtree, dcodes - 1); + } + + /* ========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ + function zip_flush_block(eof) { // true if this is the last block for a file + var opt_lenb, static_lenb; // opt_len and static_len in bytes + var max_blindex; // index of last bit length code of non zero freq + var stored_len; // length of input block + + stored_len = zip_strstart - zip_block_start; + zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items + + // Construct the literal and distance trees + zip_build_tree(zip_l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + zip_build_tree(zip_d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = zip_build_bl_tree(); + + // Determine the best encoding. Compute first the block length in bytes + opt_lenb = (zip_opt_len + 3 + 7) >> 3; + static_lenb = (zip_static_len + 3 + 7) >> 3; + + // Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", + // opt_lenb, encoder->opt_len, + // static_lenb, encoder->static_len, stored_len, + // encoder->last_lit, encoder->last_dist)); + + if (static_lenb <= opt_lenb) + opt_lenb = static_lenb; + if (stored_len + 4 <= opt_lenb // 4: two words for the lengths + && zip_block_start >= 0) { + var i; + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + zip_send_bits((zip_STORED_BLOCK << 1) + eof, 3); /* send block type */ + zip_bi_windup(); /* align on byte boundary */ + zip_put_short(stored_len); + zip_put_short(~stored_len); + + // copy block + /* + p = &window[block_start]; + for(i = 0; i < stored_len; i++) + put_byte(p[i]); + */ + for (i = 0; i < stored_len; i++) + zip_put_byte(zip_window[zip_block_start + i]); + + } else if (static_lenb == opt_lenb) { + zip_send_bits((zip_STATIC_TREES << 1) + eof, 3); + zip_compress_block(zip_static_ltree, zip_static_dtree); + } else { + zip_send_bits((zip_DYN_TREES << 1) + eof, 3); + zip_send_all_trees(zip_l_desc.max_code + 1, + zip_d_desc.max_code + 1, + max_blindex + 1); + zip_compress_block(zip_dyn_ltree, zip_dyn_dtree); + } + + zip_init_block(); + + if (eof != 0) + zip_bi_windup(); + } + + /* ========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ + function zip_ct_tally( + dist, // distance of matched string + lc) { // match length-MIN_MATCH or unmatched char (if dist==0) + zip_l_buf[zip_last_lit++] = lc; + if (dist == 0) { + // lc is the unmatched char + zip_dyn_ltree[lc].fc++; + } else { + // Here, lc is the match length - MIN_MATCH + dist--; // dist = match distance - 1 + // Assert((ush)dist < (ush)MAX_DIST && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)D_CODE(dist) < (ush)D_CODES, "ct_tally: bad match"); + + zip_dyn_ltree[zip_length_code[lc] + zip_LITERALS + 1].fc++; + zip_dyn_dtree[zip_D_CODE(dist)].fc++; + + zip_d_buf[zip_last_dist++] = dist; + zip_flags |= zip_flag_bit; + } + zip_flag_bit <<= 1; + + // Output the flags if they fill a byte + if ((zip_last_lit & 7) == 0) { + zip_flag_buf[zip_last_flags++] = zip_flags; + zip_flags = 0; + zip_flag_bit = 1; + } + // Try to guess if it is profitable to stop the current block here + if (zip_compr_level > 2 && (zip_last_lit & 0xfff) == 0) { + // Compute an upper bound for the compressed length + var out_length = zip_last_lit * 8; + var in_length = zip_strstart - zip_block_start; + var dcode; + + for (dcode = 0; dcode < zip_D_CODES; dcode++) { + out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]); + } + out_length >>= 3; + // Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", + // encoder->last_lit, encoder->last_dist, in_length, out_length, + // 100L - out_length*100L/in_length)); + if (zip_last_dist < parseInt(zip_last_lit / 2) && + out_length < parseInt(in_length / 2)) + return true; + } + return (zip_last_lit == zip_LIT_BUFSIZE - 1 || + zip_last_dist == zip_DIST_BUFSIZE); + /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + } + + /* ========================================================================== + * Send the block data compressed using the given Huffman trees + */ + function zip_compress_block( + ltree, // literal tree + dtree) { // distance tree + var dist; // distance of matched string + var lc; // match length or unmatched char (if dist == 0) + var lx = 0; // running index in l_buf + var dx = 0; // running index in d_buf + var fx = 0; // running index in flag_buf + var flag = 0; // current flags + var code; // the code to send + var extra; // number of extra bits to send + + if (zip_last_lit != 0) do { + if ((lx & 7) == 0) + flag = zip_flag_buf[fx++]; + lc = zip_l_buf[lx++] & 0xff; + if ((flag & 1) == 0) { + zip_SEND_CODE(lc, ltree); /* send a literal byte */ + // Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + // Here, lc is the match length - MIN_MATCH + code = zip_length_code[lc]; + zip_SEND_CODE(code + zip_LITERALS + 1, ltree); // send the length code + extra = zip_extra_lbits[code]; + if (extra != 0) { + lc -= zip_base_length[code]; + zip_send_bits(lc, extra); // send the extra length bits + } + dist = zip_d_buf[dx++]; + // Here, dist is the match distance - 1 + code = zip_D_CODE(dist); + // Assert (code < D_CODES, "bad d_code"); + + zip_SEND_CODE(code, dtree); // send the distance code + extra = zip_extra_dbits[code]; + if (extra != 0) { + dist -= zip_base_dist[code]; + zip_send_bits(dist, extra); // send the extra distance bits + } + } // literal or match pair ? + flag >>= 1; + } while (lx < zip_last_lit); + + zip_SEND_CODE(zip_END_BLOCK, ltree); + } + + /* ========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ + var zip_Buf_size = 16; // bit size of bi_buf + function zip_send_bits( + value, // value to send + length) { // number of bits + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (zip_bi_valid > zip_Buf_size - length) { + zip_bi_buf |= (value << zip_bi_valid); + zip_put_short(zip_bi_buf); + zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid)); + zip_bi_valid += length - zip_Buf_size; + } else { + zip_bi_buf |= value << zip_bi_valid; + zip_bi_valid += length; + } + } + + /* ========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ + function zip_bi_reverse( + code, // the value to invert + len) { // its bit length + var res = 0; + do { + res |= code & 1; + code >>= 1; + res <<= 1; + } while (--len > 0); + return res >> 1; + } + + /* ========================================================================== + * Write out any remaining bits in an incomplete byte. + */ + function zip_bi_windup() { + if (zip_bi_valid > 8) { + zip_put_short(zip_bi_buf); + } else if (zip_bi_valid > 0) { + zip_put_byte(zip_bi_buf); + } + zip_bi_buf = 0; + zip_bi_valid = 0; + } + + function zip_qoutbuf() { + if (zip_outcnt != 0) { + var q, i; + q = zip_new_queue(); + if (zip_qhead == null) + zip_qhead = zip_qtail = q; + else + zip_qtail = zip_qtail.next = q; + q.len = zip_outcnt - zip_outoff; + // System.arraycopy(zip_outbuf, zip_outoff, q.ptr, 0, q.len); + for (i = 0; i < q.len; i++) + q.ptr[i] = zip_outbuf[zip_outoff + i]; + zip_outcnt = zip_outoff = 0; + } + } + + return function deflate(str, level) { + var i, j; + + zip_deflate_data = str; + zip_deflate_pos = 0; + if (typeof level == "undefined") + level = zip_DEFAULT_LEVEL; + zip_deflate_start(level); + + var buff = new Array(1024); + var aout = []; + while ((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { + var cbuf = new Array(i); + for (j = 0; j < i; j++) { + cbuf[j] = String.fromCharCode(buff[j]); + } + aout[aout.length] = cbuf.join(""); + } + zip_deflate_data = null; // G.C. + return aout.join(""); + }; +})(); \ No newline at end of file diff --git a/js/main.min.882ddf3c1b715325828aa45eb01fdf6897105754f96688c9e54ae2de32d79697.js b/js/main.min.882ddf3c1b715325828aa45eb01fdf6897105754f96688c9e54ae2de32d79697.js new file mode 100644 index 00000000..5cdbbc34 --- /dev/null +++ b/js/main.min.882ddf3c1b715325828aa45eb01fdf6897105754f96688c9e54ae2de32d79697.js @@ -0,0 +1 @@ +(function(e){"use strict";e(function(){e('[data-bs-toggle="tooltip"]').tooltip(),e('[data-bs-toggle="popover"]').popover(),e(".popover-dismiss").popover({trigger:"focus"})});function t(e){return e.offset().top+e.outerHeight()}e(function(){var n,o,i,s=e(".js-td-cover");if(!s.length)return;o=t(s),i=e(".js-navbar-scroll").offset().top,n=Math.ceil(e(".js-navbar-scroll").outerHeight()),o-i',t.href="#"+e.id,e.insertAdjacentElement("beforeend",t),e.addEventListener("mouseenter",function(){t.style.visibility="initial"}),e.addEventListener("mouseleave",function(){t.style.visibility="hidden"})}})})}(jQuery) \ No newline at end of file diff --git a/js/main.min.c0c90635faf9682faedfe4c162a15282f2be9fd51efc862779a00dc48ea92810.js b/js/main.min.c0c90635faf9682faedfe4c162a15282f2be9fd51efc862779a00dc48ea92810.js deleted file mode 100644 index 29fdb2a4..00000000 --- a/js/main.min.c0c90635faf9682faedfe4c162a15282f2be9fd51efc862779a00dc48ea92810.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){"use strict";e(function(){e('[data-toggle="tooltip"]').tooltip(),e('[data-toggle="popover"]').popover(),e(".popover-dismiss").popover({trigger:"focus"})});function t(e){return e.offset().top+e.outerHeight()}e(function(){var n,o,i,s=e(".js-td-cover");if(!s.length)return;o=t(s),i=e(".js-navbar-scroll").offset().top,n=Math.ceil(e(".js-navbar-scroll").outerHeight()),o-i',t.href="#"+e.id,e.insertAdjacentElement("beforeend",t),e.addEventListener("mouseenter",function(){t.style.visibility="initial"}),e.addEventListener("mouseleave",function(){t.style.visibility="hidden"})}})})}(jQuery) \ No newline at end of file diff --git a/js/obs.js b/js/obs.js index 169b840c..25555d5d 100644 --- a/js/obs.js +++ b/js/obs.js @@ -40,6 +40,7 @@ effect: "fade", captions: true, bullets: true + // height: '4:3', }); if (slider._attributes) { slider.addBulletNav(); diff --git a/js/prism.js b/js/prism.js index ae881ac8..15f0f782 100644 --- a/js/prism.js +++ b/js/prism.js @@ -1,21 +1,21 @@ -/* PrismJS 1.21.0 +/* PrismJS 1.28.0 https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+csharp+cpp+go+java+markdown+python+scss+sql+toml+yaml&plugins=toolbar+copy-to-clipboard */ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);k+=y.value.length,y=y.next){var b=y.value;if(t.length>n.length)return;if(!(b instanceof W)){var x=1;if(h&&y!=t.tail.prev){m.lastIndex=k;var w=m.exec(n);if(!w)break;var A=w.index+(f&&w[1]?w[1].length:0),P=w.index+w[0].length,S=k;for(S+=y.value.length;S<=A;)y=y.next,S+=y.value.length;if(S-=y.value.length,k=S,y.value instanceof W)continue;for(var E=y;E!==t.tail&&(Sl.reach&&(l.reach=j);var C=y.prev;L&&(C=I(t,C,L),k+=L.length),z(t,C,x);var _=new W(o,g?M.tokenize(O,g):O,v,O);y=I(t,C,_),N&&I(t,y,N),1"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var e=M.util.currentScript();function t(){M.manual||M.highlightAll()}if(e&&(M.filename=e.src,e.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var r=document.readyState;"loading"===r||"interactive"===r&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); -Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var t={};t[a]={pattern:RegExp("(<__[^]*?>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; -!function(e){var s=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+s.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+s.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+s.source+")*?(?=\\s*\\{)"),string:{pattern:s,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism); -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript; -!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\](?:\\\\)*)(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\2)[^\\])*\2/,lookbehind:!0,greedy:!0,inside:n}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}};for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],r=n.variable[1].inside,s=0;s>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean; -!function(s){function a(e,s){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface struct",i="add alias and ascending async await by descending from get global group into join let nameof not notnull on or orderby partial remove select set unmanaged value when where where",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(n+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(n+" "+r+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=e("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0},{pattern:RegExp(x),greedy:!0,alias:"character"}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|typeof|sizeof)\\s*\\(\\s*)(?:[^()\\s]|\\s(?!\\s*\\))|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>)(?:\\s*,\\s*(?:<<3>>|<<4>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source]),lookbehind:!0,inside:{keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/,/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",P=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,P]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var z=":[^}\r\n]+",S=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),j=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[S,z]),A=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[_]),2),F=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[A,z]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,z]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[j]),lookbehind:!0,greedy:!0,inside:U(j,S)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[F]),lookbehind:!0,greedy:!0,inside:U(F,A)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp; -!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/;e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),e.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)(?:[^;{}"'])+?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","operator",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); -Prism.languages.go=Prism.languages.extend("clike",{keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0}}),delete Prism.languages.go["class-name"]; -!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|record|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/\b[A-Z](?:\w*[a-z]\w*)?\b/;e.languages.java=e.languages.extend("clike",{"class-name":[a,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); -!function(d){function n(n){return n=n.replace(//g,function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?!\n|\r\n?))"}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var e="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|$)".replace(/__/g,function(){return e}),a="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";d.languages.markdown=d.languages.extend("markup",{}),d.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+a+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+a+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(e),inside:d.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(e),alias:"important",inside:d.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\r\n]+`/,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+?\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)| ?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(\[)[^\]]+(?=\]$)/,lookbehind:!0},content:{pattern:/(^!?\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),["url","bold","italic","strike"].forEach(function(e){["url","bold","italic","strike"].forEach(function(n){e!==n&&(d.languages.markdown[e].inside.content.inside[n]=d.languages.markdown[n])})}),d.hooks.add("after-tokenize",function(n){"markdown"!==n.language&&"md"!==n.language||!function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; -Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-]+(?:\([^()]+\)|[^(])*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()]|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}]+[:{][^}]+))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[\w-]|\$[-\w]+|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; -Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:S|ING)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+\.?\d*|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; -!function(e){function n(e){return e.replace(/__/g,function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"})}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^\\s*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^\\s*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:true|false)\b/,punctuation:/[.,=[\]{}]/}}(Prism); -!function(n){var t=/[*&][^\s[\]{},]+/,e=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+e.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+e.source+")?)";function a(n,t){t=(t||"").replace(/m/g,"")+"m";var e="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|]|}|\\s*#))".replace(/<>/g,function(){return r}).replace(/<>/g,function(){return n});return RegExp(e,t)}n.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return r})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)[^\r\n{[\\]},#\\s]+?(?=\\s*:\\s)".replace(/<>/g,function(){return r})),lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:a("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?)?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:a("true|false","i"),lookbehind:!0,alias:"important"},null:{pattern:a("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:a("(\"|')(?:(?!\\2)[^\\\\\r\n]|\\\\.)*\\2"),lookbehind:!0,greedy:!0},number:{pattern:a("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+\\.?\\d*|\\.?\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:e,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},n.languages.yml=n.languages.yaml}(Prism); -!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var i=[],l={},c=function(){};Prism.plugins.toolbar={};var e=Prism.plugins.toolbar.registerButton=function(e,n){var t;t="function"==typeof n?n:function(e){var t;return"function"==typeof n.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",function(){n.onClick.call(this,e)})):"string"==typeof n.url?(t=document.createElement("a")).href=n.url:t=document.createElement("span"),n.className&&t.classList.add(n.className),t.textContent=n.text,t},e in l?console.warn('There is a button with the key "'+e+'" registered already.'):i.push(l[e]=t)},t=Prism.plugins.toolbar.hook=function(a){var e=a.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&!e.parentNode.classList.contains("code-toolbar")){var t=document.createElement("div");t.classList.add("code-toolbar"),e.parentNode.insertBefore(t,e),t.appendChild(e);var r=document.createElement("div");r.classList.add("toolbar");var n=i,o=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);o&&(n=o.map(function(e){return l[e]||c})),n.forEach(function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),r.appendChild(n)}}),t.appendChild(r)}};e("label",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}}),Prism.hooks.add("complete",t)}}(); -!function(){if("undefined"!=typeof self&&self.Prism&&self.document)if(Prism.plugins.toolbar){var i=window.ClipboardJS||void 0;i||"function"!=typeof require||(i=require("clipboard"));var c=[];if(!i){var o=document.createElement("script"),t=document.querySelector("head");o.onload=function(){if(i=window.ClipboardJS)for(;c.length;)c.pop()()},o.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",t.appendChild(o)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(o){var t=document.createElement("button");t.textContent="Copy";var e=o.element;return i?n():c.push(n),t;function n(){var o=new i(t,{text:function(){return e.textContent}});o.on("success",function(){t.textContent="Copied!",r()}),o.on("error",function(){t.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){t.textContent="Copy"},5e3)}})}else console.warn("Copy to Clipboard plugin loaded before Toolbar plugin.")}(); +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=a.variable[1].inside,i=0;i>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); +Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]; +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); +!function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism); +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; +!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e=[],t={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var r;r="function"==typeof a?a:function(e){var t;return"function"==typeof a.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",(function(){a.onClick.call(this,e)}))):"string"==typeof a.url?(t=document.createElement("a")).href=a.url:t=document.createElement("span"),a.className&&t.classList.add(a.className),t.textContent=a.text,t},n in t?console.warn('There is a button with the key "'+n+'" registered already.'):e.push(t[n]=r)},r=Prism.plugins.toolbar.hook=function(a){var r=a.element.parentNode;if(r&&/pre/i.test(r.nodeName)&&!r.parentNode.classList.contains("code-toolbar")){var o=document.createElement("div");o.classList.add("code-toolbar"),r.parentNode.insertBefore(o,r),o.appendChild(r);var i=document.createElement("div");i.classList.add("toolbar");var l=e,d=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);d&&(l=d.map((function(e){return t[e]||n}))),l.forEach((function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),i.appendChild(n)}})),o.appendChild(i)}};a("label",(function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}})),Prism.hooks.add("complete",r)}}(); +!function(){function t(t){var e=document.createElement("textarea");e.value=t.getText(),e.style.top="0",e.style.left="0",e.style.position="fixed",document.body.appendChild(e),e.focus(),e.select();try{var o=document.execCommand("copy");setTimeout((function(){o?t.success():t.error()}),1)}catch(e){setTimeout((function(){t.error(e)}),1)}document.body.removeChild(e)}"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Prism.plugins.toolbar?Prism.plugins.toolbar.registerButton("copy-to-clipboard",(function(e){var o=e.element,n=function(t){var e={copy:"Copy","copy-error":"Press Ctrl+C to copy","copy-success":"Copied!","copy-timeout":5e3};for(var o in e){for(var n="data-prismjs-"+o,c=t;c&&!c.hasAttribute(n);)c=c.parentElement;c&&(e[o]=c.getAttribute(n))}return e}(o),c=document.createElement("button");c.className="copy-to-clipboard-button",c.setAttribute("type","button");var r=document.createElement("span");return c.appendChild(r),u("copy"),function(e,o){e.addEventListener("click",(function(){!function(e){navigator.clipboard?navigator.clipboard.writeText(e.getText()).then(e.success,(function(){t(e)})):t(e)}(o)}))}(c,{getText:function(){return o.textContent},success:function(){u("copy-success"),i()},error:function(){u("copy-error"),setTimeout((function(){!function(t){window.getSelection().selectAllChildren(t)}(o)}),1),i()}}),c;function i(){setTimeout((function(){u("copy")}),n["copy-timeout"])}function u(t){r.textContent=n[t],c.setAttribute("data-copy-state",t)}})):console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."))}(); diff --git a/js/swagger-ui-bundle.js b/js/swagger-ui-bundle.js deleted file mode 100644 index c48cc4cf..00000000 --- a/js/swagger-ui-bundle.js +++ /dev/null @@ -1,134 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(function(){try{return require("esprima")}catch(e){}}()):"function"==typeof define&&define.amd?define(["esprima"],t):"object"==typeof exports?exports.SwaggerUIBundle=t(function(){try{return require("esprima")}catch(e){}}()):e.SwaggerUIBundle=t(e.esprima)}(window,function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist",n(n.s=488)}([function(e,t,n){"use strict";e.exports=n(104)},function(e,t,n){e.exports=function(){"use strict";var e=Array.prototype.slice;function t(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function n(e){return a(e)?e:J(e)}function r(e){return s(e)?e:K(e)}function o(e){return u(e)?e:Y(e)}function i(e){return a(e)&&!c(e)?e:$(e)}function a(e){return!(!e||!e[p])}function s(e){return!(!e||!e[f])}function u(e){return!(!e||!e[h])}function c(e){return s(e)||u(e)}function l(e){return!(!e||!e[d])}t(r,n),t(o,n),t(i,n),n.isIterable=a,n.isKeyed=s,n.isIndexed=u,n.isAssociative=c,n.isOrdered=l,n.Keyed=r,n.Indexed=o,n.Set=i;var p="@@__IMMUTABLE_ITERABLE__@@",f="@@__IMMUTABLE_KEYED__@@",h="@@__IMMUTABLE_INDEXED__@@",d="@@__IMMUTABLE_ORDERED__@@",m=5,v=1<>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?C(e)+t:t}function O(){return!0}function A(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function T(e,t){return P(e,t,0)}function j(e,t){return P(e,t,t)}function P(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var I=0,M=1,N=2,R="function"==typeof Symbol&&Symbol.iterator,D="@@iterator",L=R||D;function U(e){this.next=e}function q(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function F(){return{value:void 0,done:!0}}function B(e){return!!H(e)}function z(e){return e&&"function"==typeof e.next}function V(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(R&&e[R]||e[D]);if("function"==typeof t)return t}function W(e){return e&&"number"==typeof e.length}function J(e){return null==e?ie():a(e)?e.toSeq():function(e){var t=ue(e)||"object"==typeof e&&new te(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}(e)}function K(e){return null==e?ie().toKeyedSeq():a(e)?s(e)?e.toSeq():e.fromEntrySeq():ae(e)}function Y(e){return null==e?ie():a(e)?s(e)?e.entrySeq():e.toIndexedSeq():se(e)}function $(e){return(null==e?ie():a(e)?s(e)?e.entrySeq():e:se(e)).toSetSeq()}U.prototype.toString=function(){return"[Iterator]"},U.KEYS=I,U.VALUES=M,U.ENTRIES=N,U.prototype.inspect=U.prototype.toSource=function(){return this.toString()},U.prototype[L]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return ce(this,e,t,!0)},J.prototype.__iterator=function(e,t){return le(this,e,t,!0)},t(K,J),K.prototype.toKeyedSeq=function(){return this},t(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString("Seq [","]")},Y.prototype.__iterate=function(e,t){return ce(this,e,t,!1)},Y.prototype.__iterator=function(e,t){return le(this,e,t,!1)},t($,J),$.of=function(){return $(arguments)},$.prototype.toSetSeq=function(){return this},J.isSeq=oe,J.Keyed=K,J.Set=$,J.Indexed=Y;var G,Z,X,Q="@@__IMMUTABLE_SEQ__@@";function ee(e){this._array=e,this.size=e.length}function te(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function ne(e){this._iterable=e,this.size=e.length||e.size}function re(e){this._iterator=e,this._iteratorCache=[]}function oe(e){return!(!e||!e[Q])}function ie(){return G||(G=new ee([]))}function ae(e){var t=Array.isArray(e)?new ee(e).fromEntrySeq():z(e)?new re(e).fromEntrySeq():B(e)?new ne(e).fromEntrySeq():"object"==typeof e?new te(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function se(e){var t=ue(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function ue(e){return W(e)?new ee(e):z(e)?new re(e):B(e)?new ne(e):void 0}function ce(e,t,n,r){var o=e._cache;if(o){for(var i=o.length-1,a=0;a<=i;a++){var s=o[n?i-a:a];if(!1===t(s[1],r?s[0]:a,e))return a+1}return a}return e.__iterateUncached(t,n)}function le(e,t,n,r){var o=e._cache;if(o){var i=o.length-1,a=0;return new U(function(){var e=o[n?i-a:a];return a++>i?{value:void 0,done:!0}:q(t,r?e[0]:a-1,e[1])})}return e.__iteratorUncached(t,n)}function pe(e,t){return t?function e(t,n,r,o){return Array.isArray(n)?t.call(o,r,Y(n).map(function(r,o){return e(t,r,o,n)})):he(n)?t.call(o,r,K(n).map(function(r,o){return e(t,r,o,n)})):n}(t,e,"",{"":e}):fe(e)}function fe(e){return Array.isArray(e)?Y(e).map(fe).toList():he(e)?K(e).map(fe).toMap():e}function he(e){return e&&(e.constructor===Object||void 0===e.constructor)}function de(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function me(e,t){if(e===t)return!0;if(!a(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||s(e)!==s(t)||u(e)!==u(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!c(e);if(l(e)){var r=e.entries();return t.every(function(e,t){var o=r.next().value;return o&&de(o[1],e)&&(n||de(o[0],t))})&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var i=e;e=t,t=i}var p=!0,f=t.__iterate(function(t,r){if(n?!e.has(t):o?!de(t,e.get(r,y)):!de(e.get(r,y),t))return p=!1,!1});return p&&e.size===f}function ve(e,t){if(!(this instanceof ve))return new ve(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(Z)return Z;Z=this}}function ge(e,t){if(!e)throw new Error(t)}function ye(e,t,n){if(!(this instanceof ye))return new ye(e,t,n);if(ge(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),tr?{value:void 0,done:!0}:q(e,o,n[t?r-o++:o++])})},t(te,K),te.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},te.prototype.has=function(e){return this._object.hasOwnProperty(e)},te.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,i=0;i<=o;i++){var a=r[t?o-i:i];if(!1===e(n[a],a,this))return i+1}return i},te.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,i=0;return new U(function(){var a=r[t?o-i:i];return i++>o?{value:void 0,done:!0}:q(e,a,n[a])})},te.prototype[d]=!0,t(ne,Y),ne.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=V(this._iterable),r=0;if(z(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},ne.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=V(this._iterable);if(!z(n))return new U(F);var r=0;return new U(function(){var t=n.next();return t.done?t:q(e,r++,t.value)})},t(re,Y),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,i=0;i=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return q(e,o,r[o++])})},t(ve,Y),ve.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},ve.prototype.get=function(e,t){return this.has(e)?this._value:t},ve.prototype.includes=function(e){return de(this._value,e)},ve.prototype.slice=function(e,t){var n=this.size;return A(e,t,n)?this:new ve(this._value,j(t,n)-T(e,n))},ve.prototype.reverse=function(){return this},ve.prototype.indexOf=function(e){return de(this._value,e)?0:-1},ve.prototype.lastIndexOf=function(e){return de(this._value,e)?this.size:-1},ve.prototype.__iterate=function(e,t){for(var n=0;n=0&&t=0&&nn?{value:void 0,done:!0}:q(e,i++,a)})},ye.prototype.equals=function(e){return e instanceof ye?this._start===e._start&&this._end===e._end&&this._step===e._step:me(this,e)},t(be,n),t(_e,be),t(we,be),t(xe,be),be.Keyed=_e,be.Indexed=we,be.Set=xe;var Ee="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function Se(e){return e>>>1&1073741824|3221225471&e}function Ce(e){if(!1===e||null==e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return Se(n)}if("string"===t)return e.length>Me?function(e){var t=De[e];return void 0===t&&(t=ke(e),Re===Ne&&(Re=0,De={}),Re++,De[e]=t),t}(e):ke(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return function(e){var t;if(je&&void 0!==(t=Oe.get(e)))return t;if(void 0!==(t=e[Ie]))return t;if(!Te){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Ie]))return t;if(void 0!==(t=function(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}(e)))return t}if(t=++Pe,1073741824&Pe&&(Pe=0),je)Oe.set(e,t);else{if(void 0!==Ae&&!1===Ae(e))throw new Error("Non-extensible objects are not allowed as keys.");if(Te)Object.defineProperty(e,Ie,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Ie]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[Ie]=t}}return t}(e);if("function"==typeof e.toString)return ke(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function ke(e){for(var t=0,n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}})},Ue.prototype.toString=function(){return this.__toString("Map {","}")},Ue.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},Ue.prototype.set=function(e,t){return Qe(this,e,t)},Ue.prototype.setIn=function(e,t){return this.updateIn(e,y,function(){return t})},Ue.prototype.remove=function(e){return Qe(this,e,y)},Ue.prototype.deleteIn=function(e){return this.updateIn(e,function(){return y})},Ue.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},Ue.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=function e(t,n,r,o){var i=t===y,a=n.next();if(a.done){var s=i?r:t,u=o(s);return u===s?t:u}ge(i||t&&t.set,"invalid keyPath");var c=a.value,l=i?y:t.get(c,y),p=e(l,n,r,o);return p===l?t:p===y?t.remove(c):(i?Xe():t).set(c,p)}(this,rn(e),t,n);return r===y?void 0:r},Ue.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Xe()},Ue.prototype.merge=function(){return rt(this,void 0,arguments)},Ue.prototype.mergeWith=function(t){var n=e.call(arguments,1);return rt(this,t,n)},Ue.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,Xe(),function(e){return"function"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]})},Ue.prototype.mergeDeep=function(){return rt(this,ot,arguments)},Ue.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return rt(this,it(t),n)},Ue.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,Xe(),function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]})},Ue.prototype.sort=function(e){return Tt(Jt(this,e))},Ue.prototype.sortBy=function(e,t){return Tt(Jt(this,t,e))},Ue.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},Ue.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new E)},Ue.prototype.asImmutable=function(){return this.__ensureOwner()},Ue.prototype.wasAltered=function(){return this.__altered},Ue.prototype.__iterator=function(e,t){return new Ye(this,e,t)},Ue.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate(function(t){return r++,e(t[1],t[0],n)},t),r},Ue.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Ze(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Ue.isMap=qe;var Fe,Be="@@__IMMUTABLE_MAP__@@",ze=Ue.prototype;function Ve(e,t){this.ownerID=e,this.entries=t}function He(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function We(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Je(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Ke(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function Ye(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&Ge(e._root)}function $e(e,t){return q(e,t[0],t[1])}function Ge(e,t){return{node:e,index:0,__prev:t}}function Ze(e,t,n,r){var o=Object.create(ze);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Xe(){return Fe||(Fe=Ze(0))}function Qe(e,t,n){var r,o;if(e._root){var i=w(b),a=w(_);if(r=et(e._root,e.__ownerID,0,void 0,t,n,i,a),!a.value)return e;o=e.size+(i.value?n===y?-1:1:0)}else{if(n===y)return e;o=1,r=new Ve(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?Ze(o,r):Xe()}function et(e,t,n,r,o,i,a,s){return e?e.update(t,n,r,o,i,a,s):i===y?e:(x(s),x(a),new Ke(t,r,[o,i]))}function tt(e){return e.constructor===Ke||e.constructor===Je}function nt(e,t,n,r,o){if(e.keyHash===r)return new Je(t,r,[e.entry,o]);var i,a=(0===n?e.keyHash:e.keyHash>>>n)&g,s=(0===n?r:r>>>n)&g;return new He(t,1<>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function ut(e,t,n,r){var o=r?e:S(e);return o[t]=n,o}ze[Be]=!0,ze.delete=ze.remove,ze.removeIn=ze.deleteIn,Ve.prototype.get=function(e,t,n,r){for(var o=this.entries,i=0,a=o.length;i=ct)return function(e,t,n,r){e||(e=new E);for(var o=new Ke(e,Ce(n),[n,r]),i=0;i>>e)&g),i=this.bitmap;return 0==(i&o)?r:this.nodes[st(i&o-1)].get(e+m,t,n,r)},He.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=Ce(r));var s=(0===t?n:n>>>t)&g,u=1<=lt)return function(e,t,n,r,o){for(var i=0,a=new Array(v),s=0;0!==n;s++,n>>>=1)a[s]=1&n?t[i++]:void 0;return a[r]=o,new We(e,i+1,a)}(e,f,c,s,d);if(l&&!d&&2===f.length&&tt(f[1^p]))return f[1^p];if(l&&d&&1===f.length&&tt(d))return d;var b=e&&e===this.ownerID,_=l?d?c:c^u:c|u,w=l?d?ut(f,p,d,b):function(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var o=new Array(r),i=0,a=0;a>>e)&g,i=this.nodes[o];return i?i.get(e+m,t,n,r):r},We.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=Ce(r));var s=(0===t?n:n>>>t)&g,u=o===y,c=this.nodes,l=c[s];if(u&&!l)return this;var p=et(l,e,t+m,n,r,o,i,a);if(p===l)return this;var f=this.count;if(l){if(!p&&--f0&&r=0&&e=e.size||t<0)return e.withMutations(function(e){t<0?kt(e,t).set(0,n):kt(e,0,t+1).set(t,n)});t+=e._origin;var r=e._tail,o=e._root,i=w(_);return t>=At(e._capacity)?r=Et(r,e.__ownerID,0,t,n,i):o=Et(o,e.__ownerID,e._level,t,n,i),i.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):wt(e._origin,e._capacity,e._level,o,r):e}(this,e,t)},ft.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},ft.prototype.insert=function(e,t){return this.splice(e,0,t)},ft.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=m,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):xt()},ft.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations(function(n){kt(n,0,t+e.length);for(var r=0;r>>t&g;if(r>=this.array.length)return new vt([],e);var o,i=0===r;if(t>0){var a=this.array[r];if((o=a&&a.removeBefore(e,t-m,n))===a&&i)return this}if(i&&!o)return this;var s=St(this,e);if(!i)for(var u=0;u>>t&g;if(o>=this.array.length)return this;if(t>0){var i=this.array[o];if((r=i&&i.removeAfter(e,t-m,n))===i&&o===this.array.length-1)return this}var a=St(this,e);return a.array.splice(o+1),r&&(a.array[o]=r),a};var gt,yt,bt={};function _t(e,t){var n=e._origin,r=e._capacity,o=At(r),i=e._tail;return a(e._root,e._level,0);function a(e,s,u){return 0===s?function(e,a){var s=a===o?i&&i.array:e&&e.array,u=a>n?0:n-a,c=r-a;return c>v&&(c=v),function(){if(u===c)return bt;var e=t?--c:u++;return s&&s[e]}}(e,u):function(e,o,i){var s,u=e&&e.array,c=i>n?0:n-i>>o,l=1+(r-i>>o);return l>v&&(l=v),function(){for(;;){if(s){var e=s();if(e!==bt)return e;s=null}if(c===l)return bt;var n=t?--l:c++;s=a(u&&u[n],o-m,i+(n<>>n&g,u=e&&s0){var c=e&&e.array[s],l=Et(c,t,n-m,r,o,i);return l===c?e:((a=St(e,t)).array[s]=l,a)}return u&&e.array[s]===o?e:(x(i),a=St(e,t),void 0===o&&s===a.array.length-1?a.array.pop():a.array[s]=o,a)}function St(e,t){return t&&e&&t===e.ownerID?e:new vt(e?e.array.slice():[],t)}function Ct(e,t){if(t>=At(e._capacity))return e._tail;if(t<1<0;)n=n.array[t>>>r&g],r-=m;return n}}function kt(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new E,o=e._origin,i=e._capacity,a=o+t,s=void 0===n?i:n<0?i+n:o+n;if(a===o&&s===i)return e;if(a>=s)return e.clear();for(var u=e._level,c=e._root,l=0;a+l<0;)c=new vt(c&&c.array.length?[void 0,c]:[],r),l+=1<<(u+=m);l&&(a+=l,o+=l,s+=l,i+=l);for(var p=At(i),f=At(s);f>=1<p?new vt([],r):h;if(h&&f>p&&am;y-=m){var b=p>>>y&g;v=v.array[b]=St(v.array[b],r)}v.array[p>>>m&g]=h}if(s=f)a-=f,s-=f,u=m,c=null,d=d&&d.removeBefore(r,0,a);else if(a>o||f>>u&g;if(_!==f>>>u&g)break;_&&(l+=(1<o&&(c=c.removeBefore(r,u,a-l)),c&&fi&&(i=c.size),a(u)||(c=c.map(function(e){return pe(e)})),r.push(c)}return i>e.size&&(e=e.setSize(i)),at(e,t,r)}function At(e){return e>>m<=v&&a.size>=2*i.size?(r=(o=a.filter(function(e,t){return void 0!==e&&s!==t})).toKeyedSeq().map(function(e){return e[0]}).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=i.remove(t),o=s===a.size-1?a.pop():a.set(s,void 0))}else if(u){if(n===a.get(s)[1])return e;r=i,o=a.set(s,[t,n])}else r=i.set(t,a.size),o=a.set(a.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Pt(r,o)}function Nt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Rt(e){this._iter=e,this.size=e.size}function Dt(e){this._iter=e,this.size=e.size}function Lt(e){this._iter=e,this.size=e.size}function Ut(e){var t=en(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=tn,t.__iterateUncached=function(t,n){var r=this;return e.__iterate(function(e,n){return!1!==t(n,e,r)},n)},t.__iteratorUncached=function(t,n){if(t===N){var r=e.__iterator(t,n);return new U(function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e})}return e.__iterator(t===M?I:M,n)},t}function qt(e,t,n){var r=en(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var i=e.get(r,y);return i===y?o:t.call(n,i,r,e)},r.__iterateUncached=function(r,o){var i=this;return e.__iterate(function(e,o,a){return!1!==r(t.call(n,e,o,a),o,i)},o)},r.__iteratorUncached=function(r,o){var i=e.__iterator(N,o);return new U(function(){var o=i.next();if(o.done)return o;var a=o.value,s=a[0];return q(r,s,t.call(n,a[1],s,e),o)})},r}function Ft(e,t){var n=en(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Ut(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=tn,n.__iterate=function(t,n){var r=this;return e.__iterate(function(e,n){return t(e,n,r)},!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function Bt(e,t,n,r){var o=en(e);return r&&(o.has=function(r){var o=e.get(r,y);return o!==y&&!!t.call(n,o,r,e)},o.get=function(r,o){var i=e.get(r,y);return i!==y&&t.call(n,i,r,e)?i:o}),o.__iterateUncached=function(o,i){var a=this,s=0;return e.__iterate(function(e,i,u){if(t.call(n,e,i,u))return s++,o(e,r?i:s-1,a)},i),s},o.__iteratorUncached=function(o,i){var a=e.__iterator(N,i),s=0;return new U(function(){for(;;){var i=a.next();if(i.done)return i;var u=i.value,c=u[0],l=u[1];if(t.call(n,l,c,e))return q(o,r?c:s++,l,i)}})},o}function zt(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),A(t,n,o))return e;var i=T(t,o),a=j(n,o);if(i!=i||a!=a)return zt(e.toSeq().cacheResult(),t,n,r);var s,u=a-i;u==u&&(s=u<0?0:u);var c=en(e);return c.size=0===s?s:e.size&&s||void 0,!r&&oe(e)&&s>=0&&(c.get=function(t,n){return(t=k(this,t))>=0&&ts)return{value:void 0,done:!0};var e=o.next();return r||t===M?e:q(t,u-1,t===I?void 0:e.value[1],e)})},c}function Vt(e,t,n,r){var o=en(e);return o.__iterateUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterate(o,i);var s=!0,u=0;return e.__iterate(function(e,i,c){if(!s||!(s=t.call(n,e,i,c)))return u++,o(e,r?i:u-1,a)}),u},o.__iteratorUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterator(o,i);var s=e.__iterator(N,i),u=!0,c=0;return new U(function(){var e,i,l;do{if((e=s.next()).done)return r||o===M?e:q(o,c++,o===I?void 0:e.value[1],e);var p=e.value;i=p[0],l=p[1],u&&(u=t.call(n,l,i,a))}while(u);return o===N?e:q(o,i,l,e)})},o}function Ht(e,t){var n=s(e),o=[e].concat(t).map(function(e){return a(e)?n&&(e=r(e)):e=n?ae(e):se(Array.isArray(e)?e:[e]),e}).filter(function(e){return 0!==e.size});if(0===o.length)return e;if(1===o.length){var i=o[0];if(i===e||n&&s(i)||u(e)&&u(i))return i}var c=new ee(o);return n?c=c.toKeyedSeq():u(e)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=o.reduce(function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}},0),c}function Wt(e,t,n){var r=en(e);return r.__iterateUncached=function(r,o){var i=0,s=!1;return function e(u,c){var l=this;u.__iterate(function(o,u){return(!t||c0}function $t(e,t,r){var o=en(e);return o.size=new ee(r).map(function(e){return e.size}).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(M,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var i=r.map(function(e){return e=n(e),V(o?e.reverse():e)}),a=0,s=!1;return new U(function(){var n;return s||(n=i.map(function(e){return e.next()}),s=n.some(function(e){return e.done})),s?{value:void 0,done:!0}:q(e,a++,t.apply(null,n.map(function(e){return e.value})))})},o}function Gt(e,t){return oe(e)?t:e.constructor(t)}function Zt(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function Xt(e){return Le(e.size),C(e)}function Qt(e){return s(e)?r:u(e)?o:i}function en(e){return Object.create((s(e)?K:u(e)?Y:$).prototype)}function tn(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function nn(e,t){return e>t?1:e=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):An(e,t)},En.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Le(e.size);var t=this.size,n=this._head;return e.reverse().forEach(function(e){t++,n={value:e,next:n}}),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):An(t,n)},En.prototype.pop=function(){return this.slice(1)},En.prototype.unshift=function(){return this.push.apply(this,arguments)},En.prototype.unshiftAll=function(e){return this.pushAll(e)},En.prototype.shift=function(){return this.pop.apply(this,arguments)},En.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Tn()},En.prototype.slice=function(e,t){if(A(e,t,this.size))return this;var n=T(e,this.size);if(j(t,this.size)!==this.size)return we.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):An(r,o)},En.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?An(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},En.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},En.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new U(function(){if(r){var t=r.value;return r=r.next,q(e,n++,t)}return{value:void 0,done:!0}})},En.isStack=Sn;var Cn,kn="@@__IMMUTABLE_STACK__@@",On=En.prototype;function An(e,t,n,r){var o=Object.create(On);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Tn(){return Cn||(Cn=An(0))}function jn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}On[kn]=!0,On.withMutations=ze.withMutations,On.asMutable=ze.asMutable,On.asImmutable=ze.asImmutable,On.wasAltered=ze.wasAltered,n.Iterator=U,jn(n,{toArray:function(){Le(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate(function(t,n){e[n]=t}),e},toIndexedSeq:function(){return new Rt(this)},toJS:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJS?e.toJS():e}).__toJS()},toJSON:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e}).__toJS()},toKeyedSeq:function(){return new Nt(this,!0)},toMap:function(){return Ue(this.toKeyedSeq())},toObject:function(){Le(this.size);var e={};return this.__iterate(function(t,n){e[n]=t}),e},toOrderedMap:function(){return Tt(this.toKeyedSeq())},toOrderedSet:function(){return gn(s(this)?this.valueSeq():this)},toSet:function(){return cn(s(this)?this.valueSeq():this)},toSetSeq:function(){return new Dt(this)},toSeq:function(){return u(this)?this.toIndexedSeq():s(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return En(s(this)?this.valueSeq():this)},toList:function(){return ft(s(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){var t=e.call(arguments,0);return Gt(this,Ht(this,t))},includes:function(e){return this.some(function(t){return de(t,e)})},entries:function(){return this.__iterator(N)},every:function(e,t){Le(this.size);var n=!0;return this.__iterate(function(r,o,i){if(!e.call(t,r,o,i))return n=!1,!1}),n},filter:function(e,t){return Gt(this,Bt(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Le(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Le(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate(function(r){n?n=!1:t+=e,t+=null!=r?r.toString():""}),t},keys:function(){return this.__iterator(I)},map:function(e,t){return Gt(this,qt(this,e,t))},reduce:function(e,t,n){var r,o;return Le(this.size),arguments.length<2?o=!0:r=t,this.__iterate(function(t,i,a){o?(o=!1,r=t):r=e.call(n,r,t,i,a)}),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Gt(this,Ft(this,!0))},slice:function(e,t){return Gt(this,zt(this,e,t,!0))},some:function(e,t){return!this.every(Rn(e),t)},sort:function(e){return Gt(this,Jt(this,e))},values:function(){return this.__iterator(M)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(e,t){return C(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return function(e,t,n){var r=Ue().asMutable();return e.__iterate(function(o,i){r.update(t.call(n,o,i,e),0,function(e){return e+1})}),r.asImmutable()}(this,e,t)},equals:function(e){return me(this,e)},entrySeq:function(){var e=this;if(e._cache)return new ee(e._cache);var t=e.toSeq().map(Nn).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(Rn(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate(function(n,o,i){if(e.call(t,n,o,i))return r=[o,n],!1}),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(O)},flatMap:function(e,t){return Gt(this,function(e,t,n){var r=Qt(e);return e.toSeq().map(function(o,i){return r(t.call(n,o,i,e))}).flatten(!0)}(this,e,t))},flatten:function(e){return Gt(this,Wt(this,e,!0))},fromEntrySeq:function(){return new Lt(this)},get:function(e,t){return this.find(function(t,n){return de(n,e)},void 0,t)},getIn:function(e,t){for(var n,r=this,o=rn(e);!(n=o.next()).done;){var i=n.value;if((r=r&&r.get?r.get(i,y):y)===y)return t}return r},groupBy:function(e,t){return function(e,t,n){var r=s(e),o=(l(e)?Tt():Ue()).asMutable();e.__iterate(function(i,a){o.update(t.call(n,i,a,e),function(e){return(e=e||[]).push(r?[a,i]:i),e})});var i=Qt(e);return o.map(function(t){return Gt(e,i(t))})}(this,e,t)},has:function(e){return this.get(e,y)!==y},hasIn:function(e){return this.getIn(e,y)!==y},isSubset:function(e){return e="function"==typeof e.includes?e:n(e),this.every(function(t){return e.includes(t)})},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey(function(t){return de(t,e)})},keySeq:function(){return this.toSeq().map(Mn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return Kt(this,e)},maxBy:function(e,t){return Kt(this,t,e)},min:function(e){return Kt(this,e?Dn(e):qn)},minBy:function(e,t){return Kt(this,t?Dn(t):qn,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return Gt(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return Gt(this,Vt(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(Rn(e),t)},sortBy:function(e,t){return Gt(this,Jt(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return Gt(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return Gt(this,function(e,t,n){var r=en(e);return r.__iterateUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterate(r,o);var a=0;return e.__iterate(function(e,o,s){return t.call(n,e,o,s)&&++a&&r(e,o,i)}),a},r.__iteratorUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterator(r,o);var a=e.__iterator(N,o),s=!0;return new U(function(){if(!s)return{value:void 0,done:!0};var e=a.next();if(e.done)return e;var o=e.value,u=o[0],c=o[1];return t.call(n,c,u,i)?r===N?e:q(r,u,c,e):(s=!1,{value:void 0,done:!0})})},r}(this,e,t))},takeUntil:function(e,t){return this.takeWhile(Rn(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(e){if(e.size===1/0)return 0;var t=l(e),n=s(e),r=t?1:0;return function(e,t){return t=Ee(t,3432918353),t=Ee(t<<15|t>>>-15,461845907),t=Ee(t<<13|t>>>-13,5),t=Ee((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Se((t=Ee(t^t>>>13,3266489909))^t>>>16)}(e.__iterate(n?t?function(e,t){r=31*r+Fn(Ce(e),Ce(t))|0}:function(e,t){r=r+Fn(Ce(e),Ce(t))|0}:t?function(e){r=31*r+Ce(e)|0}:function(e){r=r+Ce(e)|0}),r)}(this))}});var Pn=n.prototype;Pn[p]=!0,Pn[L]=Pn.values,Pn.__toJS=Pn.toArray,Pn.__toStringMapper=Ln,Pn.inspect=Pn.toSource=function(){return this.toString()},Pn.chain=Pn.flatMap,Pn.contains=Pn.includes,jn(r,{flip:function(){return Gt(this,Ut(this))},mapEntries:function(e,t){var n=this,r=0;return Gt(this,this.toSeq().map(function(o,i){return e.call(t,[i,o],r++,n)}).fromEntrySeq())},mapKeys:function(e,t){var n=this;return Gt(this,this.toSeq().flip().map(function(r,o){return e.call(t,r,o,n)}).flip())}});var In=r.prototype;function Mn(e,t){return t}function Nn(e,t){return[t,e]}function Rn(e){return function(){return!e.apply(this,arguments)}}function Dn(e){return function(){return-e.apply(this,arguments)}}function Ln(e){return"string"==typeof e?JSON.stringify(e):String(e)}function Un(){return S(arguments)}function qn(e,t){return et?-1:0}function Fn(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return In[f]=!0,In[L]=Pn.entries,In.__toJS=Pn.toObject,In.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+Ln(e)},jn(o,{toKeyedSeq:function(){return new Nt(this,!1)},filter:function(e,t){return Gt(this,Bt(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return Gt(this,Ft(this,!1))},slice:function(e,t){return Gt(this,zt(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=T(e,e<0?this.count():this.size);var r=this.slice(0,e);return Gt(this,1===n?r:r.concat(S(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return Gt(this,Wt(this,e,!1))},get:function(e,t){return(e=k(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find(function(t,n){return n===e},void 0,t)},has:function(e){return(e=k(this,e))>=0&&(void 0!==this.size?this.size===1/0||e5e3)return e.textContent;return function(e){for(var n,r,o,i,a,s=e.textContent,u=0,c=s[0],l=1,p=e.innerHTML="",f=0;r=n,n=f<7&&"\\"==n?1:l;){if(l=c,c=s[++u],i=p.length>1,!l||f>8&&"\n"==l||[/\S/.test(l),1,1,!/[$\w]/.test(l),("/"==n||"\n"==n)&&i,'"'==n&&i,"'"==n&&i,s[u-4]+r+n=="--\x3e",r+n=="*/"][f])for(p&&(e.appendChild(a=t.createElement("span")).setAttribute("style",["color: #555; font-weight: bold;","","","color: #555;",""][f?f<3?2:f>6?4:f>3?3:+/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(icrolight|odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/.test(p):0]),a.appendChild(t.createTextNode(p))),o=f&&f<7?f:o,p="",f=11;![1,/[\/{}[(\-+*=<>:;|\\.,?!&@~]/.test(l),/[\])]/.test(l),/[$\w]/.test(l),"/"==l&&o<2&&"<"!=n,'"'==l,"'"==l,l+c+s[u+1]+s[u+2]=="\x3c!--",l+c=="/*",l+c=="//","#"==l][--f];);p+=l}}(e)}function Q(e){var t;if([/filename\*=[^']+'\w*'"([^"]+)";?/i,/filename\*=[^']+'\w*'([^;]+);?/i,/filename="([^;]*);?"/i,/filename=([^;]*);?/i].some(function(n){return null!==(t=n.exec(e))}),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function ee(e){return t=e.replace(/\.[^.\/]*$/,""),b()(g()(t));var t}var te=function(e,t){if(e>t)return"Value must be less than Maximum"},ne=function(e,t){if(et)return"Value must be less than MaxLength"},pe=function(e,t){if(e.length2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,i=n.bypassRequiredCheck,a=void 0!==i&&i,s=[],u=e.get("required"),c=Object(P.a)(e,{isOAS3:o}),p=c.schema,h=c.parameterContentMediaType;if(!p)return s;var m=p.get("required"),v=p.get("maximum"),g=p.get("minimum"),y=p.get("type"),b=p.get("format"),_=p.get("maxLength"),w=p.get("minLength"),x=p.get("pattern");if(y&&(u||m||t)){var E="string"===y&&t,S="array"===y&&l()(t)&&t.length,C="array"===y&&d.a.List.isList(t)&&t.count(),k="array"===y&&"string"==typeof t&&t,O="file"===y&&t instanceof A.a.File,T="boolean"===y&&(t||!1===t),j="number"===y&&(t||0===t),I="integer"===y&&(t||0===t),M="object"===y&&"object"===f()(t)&&null!==t,N="object"===y&&"string"==typeof t&&t,R=[E,S,C,k,O,T,j,I,M,N],D=R.some(function(e){return!!e});if((u||m)&&!D&&!a)return s.push("Required field is not provided"),s;if("object"===y&&"string"==typeof t&&(null===h||"application/json"===h))try{JSON.parse(t)}catch(e){return s.push("Parameter string value must be valid JSON"),s}if(x){var L=fe(t,x);L&&s.push(L)}if(_||0===_){var U=le(t,_);U&&s.push(U)}if(w){var q=pe(t,w);q&&s.push(q)}if(v||0===v){var F=te(t,v);F&&s.push(F)}if(g||0===g){var B=ne(t,g);B&&s.push(B)}if("string"===y){var z;if(!(z="date-time"===b?ue(t):"uuid"===b?ce(t):se(t)))return s;s.push(z)}else if("boolean"===y){var V=ae(t);if(!V)return s;s.push(V)}else if("number"===y){var H=re(t);if(!H)return s;s.push(H)}else if("integer"===y){var W=oe(t);if(!W)return s;s.push(W)}else if("array"===y){var J;if(!C||!t.count())return s;J=p.getIn(["items","type"]),t.forEach(function(e,t){var n;"number"===J?n=re(e):"integer"===J?n=oe(e):"string"===J&&(n=se(e)),n&&s.push({index:t,error:n})})}else if("file"===y){var K=ie(t);if(!K)return s;s.push(K)}}return s},de=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(/xml/.test(t)){if(!e.xml||!e.xml.name){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var r=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=r[1]}return Object(k.memoizedCreateXMLExample)(e,n)}var i=Object(k.memoizedSampleFromSchema)(e,n);return"object"===f()(i)?o()(i,null,2):i},me=function(){var e={},t=A.a.location.search;if(!t)return{};if(""!=t){var n=t.substr(1).split("&");for(var r in n)n.hasOwnProperty(r)&&(r=n[r].split("="),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||"")}return e},ve=function(t){return(t instanceof e?t:new e(t.toString(),"utf-8")).toString("base64")},ge={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},ye=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},be=function(e,t,n){return!!E()(n,function(n){return C()(e[n],t[n])})};function _e(e){return"string"!=typeof e||""===e?"":Object(m.sanitizeUrl)(e)}function we(e){if(!d.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=e.find(function(e,t){return t.startsWith("2")&&u()(e.get("content")||{}).length>0}),n=e.get("default")||d.a.OrderedMap(),r=(n.get("content")||d.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var xe=function(e){return"string"==typeof e||e instanceof String?e.trim().replace(/\s/g,"%20"):""},Ee=function(e){return j()(xe(e).replace(/%20/g,"_"))},Se=function(e){return e.filter(function(e,t){return/^x-/.test(t)})},Ce=function(e){return e.filter(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)})};function ke(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==f()(e)||l()(e)||null===e||!t)return e;var r=a()({},e);return u()(r).forEach(function(e){e===t&&n(r[e],e)?delete r[e]:r[e]=ke(r[e],t,n)}),r}function Oe(e){if("string"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),"object"===f()(e)&&null!==e)try{return o()(e,null,2)}catch(t){return String(e)}return null==e?"":e.toString()}function Ae(e){return"number"==typeof e?e.toString():e}function Te(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,i=void 0===o||o;if(!d.a.Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var a=e.get("name"),s=e.get("in"),u=[];return e&&e.hashCode&&s&&a&&i&&u.push("".concat(s,".").concat(a,".hash-").concat(e.hashCode())),s&&a&&u.push("".concat(s,".").concat(a)),u.push(a),r?u:u[0]||""}function je(e,t){return Te(e,{returnAll:!0}).map(function(e){return t[e]}).filter(function(e){return void 0!==e})[0]}function Pe(){return Me(M()(32).toString("base64"))}function Ie(e){return Me(R()("sha256").update(e).digest("base64"))}function Me(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}}).call(this,n(64).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t,n){var r=n(54);function o(e,t){for(var n=0;n1?t-1:0),o=1;o2?n-2:0),i=2;i>",i={listOf:function(e){return c(e,"List",r.List.isList)},mapOf:function(e,t){return l(e,t,"Map",r.Map.isMap)},orderedMapOf:function(e,t){return l(e,t,"OrderedMap",r.OrderedMap.isOrderedMap)},setOf:function(e){return c(e,"Set",r.Set.isSet)},orderedSetOf:function(e){return c(e,"OrderedSet",r.OrderedSet.isOrderedSet)},stackOf:function(e){return c(e,"Stack",r.Stack.isStack)},iterableOf:function(e){return c(e,"Iterable",r.Iterable.isIterable)},recordOf:function(e){return s(function(t,n,o,i,s){for(var u=arguments.length,c=Array(u>5?u-5:0),l=5;l6?u-6:0),l=6;l5?c-5:0),p=5;p5?i-5:0),s=5;s key("+l[p]+")"].concat(a));if(h instanceof Error)return h}})).apply(void 0,i);var u})}function p(e){var t=void 0===arguments[1]?"Iterable":arguments[1],n=void 0===arguments[2]?r.Iterable.isIterable:arguments[2];return s(function(r,o,i,s,u){for(var c=arguments.length,l=Array(c>5?c-5:0),p=5;p4)}function u(e){var t=e.get("swagger");return"string"==typeof t&&t.startsWith("2.0")}function c(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?s(n.specSelectors.specJson())?a.a.createElement(e,o()({},r,n,{Ori:t})):a.a.createElement(t,r):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},function(e,t,n){"use strict"; -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,u=a(e),c=1;c0){var o=n.map(function(e){return console.error(e),e.line=e.fullPath?g(y,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",A()(e,"message",{enumerable:!0,value:e.message}),e});i.newThrownErrBatch(o)}return r.updateResolved(t)})}},_e=[],we=V()(k()(S.a.mark(function e(){var t,n,r,o,i,a,s,u,c,l,p,f,h,d,m,v,g;return S.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=_e.system){e.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),e.abrupt("return");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,i=o.resolveSubtree,a=o.AST,s=void 0===a?{}:a,u=t.specSelectors,c=t.specActions,i){e.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),e.abrupt("return");case 8:return l=s.getLineNumberForPath?s.getLineNumberForPath:function(){},p=u.specStr(),f=t.getConfigs(),h=f.modelPropertyMacro,d=f.parameterMacro,m=f.requestInterceptor,v=f.responseInterceptor,e.prev=11,e.next=14,_e.reduce(function(){var e=k()(S.a.mark(function e(t,o){var a,s,c,f,g,y,b;return S.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return a=e.sent,s=a.resultMap,c=a.specWithCurrentSubtrees,e.next=7,i(c,o,{baseDoc:u.url(),modelPropertyMacro:h,parameterMacro:d,requestInterceptor:m,responseInterceptor:v});case 7:return f=e.sent,g=f.errors,y=f.spec,r.allErrors().size&&n.clearBy(function(e){return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!e.get("fullPath").every(function(e,t){return e===o[t]||void 0===o[t]})}),j()(g)&&g.length>0&&(b=g.map(function(e){return e.line=e.fullPath?l(p,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",A()(e,"message",{enumerable:!0,value:e.message}),e}),n.newThrownErrBatch(b)),W()(s,o,y),W()(c,o,y),e.abrupt("return",{resultMap:s,specWithCurrentSubtrees:c});case 15:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),x.a.resolve({resultMap:(u.specResolvedSubtree([])||Object(R.Map)()).toJS(),specWithCurrentSubtrees:u.specJson().toJS()}));case 14:g=e.sent,delete _e.system,_e=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:c.updateResolvedSubtree([],g.resultMap);case 23:case"end":return e.stop()}},e,null,[[11,19]])})),35),xe=function(e){return function(t){_e.map(function(e){return e.join("@@")}).indexOf(e.join("@@"))>-1||(_e.push(e),_e.system=t,we())}};function Ee(e,t,n,r,o){return{type:X,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}}function Se(e,t,n,r){return{type:X,payload:{path:e,param:t,value:n,isXml:r}}}var Ce=function(e,t){return{type:le,payload:{path:e,value:t}}},ke=function(){return{type:le,payload:{path:[],value:Object(R.Map)()}}},Oe=function(e,t){return{type:ee,payload:{pathMethod:e,isOAS3:t}}},Ae=function(e,t,n,r){return{type:Q,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Te(e){return{type:se,payload:{pathMethod:e}}}function je(e,t){return{type:ue,payload:{path:e,value:t,key:"consumes_value"}}}function Pe(e,t){return{type:ue,payload:{path:e,value:t,key:"produces_value"}}}var Ie=function(e,t,n){return{payload:{path:e,method:t,res:n},type:te}},Me=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ne}},Ne=function(e,t,n){return{payload:{path:e,method:t,req:n},type:re}},Re=function(e){return{payload:e,type:oe}},De=function(e){return function(t){var n=t.fn,r=t.specActions,o=t.specSelectors,i=t.getConfigs,a=t.oas3Selectors,s=e.pathName,u=e.method,c=e.operation,l=i(),p=l.requestInterceptor,f=l.responseInterceptor,h=c.toJS();if(c&&c.get("parameters")&&c.get("parameters").filter(function(e){return e&&!0===e.get("allowEmptyValue")}).forEach(function(t){if(o.parameterInclusionSettingFor([s,u],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};var n=Object(J.C)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get("name")]="")}}),e.contextUrl=L()(o.url()).toString(),h&&h.operationId?e.operationId=h.operationId:h&&s&&u&&(e.operationId=n.opId(h,s,u)),o.isOAS3()){var d="".concat(s,":").concat(u);e.server=a.selectedServer(d)||a.selectedServer();var m=a.serverVariables({server:e.server,namespace:d}).toJS(),g=a.serverVariables({server:e.server}).toJS();e.serverVariables=_()(m).length?m:g,e.requestContentType=a.requestContentType(s,u),e.responseContentType=a.responseContentType(s,u)||"*/*";var b=a.requestBodyValue(s,u);Object(J.t)(b)?e.requestBody=JSON.parse(b):b&&b.toJS?e.requestBody=b.toJS():e.requestBody=b}var w=y()({},e);w=n.buildRequest(w),r.setRequest(e.pathName,e.method,w);e.requestInterceptor=function(t){var n=p.apply(this,[t]),o=y()({},n);return r.setMutatedRequest(e.pathName,e.method,o),n},e.responseInterceptor=f;var x=v()();return n.execute(e).then(function(t){t.duration=v()()-x,r.setResponse(e.pathName,e.method,t)}).catch(function(t){console.error(t),r.setResponse(e.pathName,e.method,{error:!0,err:q()(t)})})}},Le=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=d()(e,["path","method"]);return function(e){var o=e.fn.fetch,i=e.specSelectors,a=e.specActions,s=i.specJsonWithResolvedSubtrees().toJS(),u=i.operationScheme(t,n),c=i.contentTypeValues([t,n]).toJS(),l=c.requestContentType,p=c.responseContentType,f=/xml/i.test(l),h=i.parameterValues([t,n],f).toJS();return a.executeRequest(Y({},r,{fetch:o,spec:s,pathName:t,method:n,parameters:h,requestContentType:l,scheme:u,responseContentType:p}))}};function Ue(e,t){return{type:ie,payload:{path:e,method:t}}}function qe(e,t){return{type:ae,payload:{path:e,method:t}}}function Fe(e,t,n){return{type:pe,payload:{scheme:e,path:t,method:n}}}},function(e,t,n){var r=n(32),o=n(22),i=n(63),a=n(77),s=n(75),u=function(e,t,n){var c,l,p,f=e&u.F,h=e&u.G,d=e&u.S,m=e&u.P,v=e&u.B,g=e&u.W,y=h?o:o[t]||(o[t]={}),b=y.prototype,_=h?r:d?r[t]:(r[t]||{}).prototype;for(c in h&&(n=t),n)(l=!f&&_&&void 0!==_[c])&&s(y,c)||(p=l?_[c]:n[c],y[c]=h&&"function"!=typeof _[c]?n[c]:v&&l?i(p,r):g&&_[c]==p?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(p):m&&"function"==typeof p?i(Function.call,p):p,m&&((y.virtual||(y.virtual={}))[c]=p,e&u.R&&b&&!b[c]&&a(b,c,p)))};u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t,n){"use strict";var r=n(138),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],i=["scalar","sequence","mapping"];e.exports=function(e,t){var n,a;if(t=t||{},Object.keys(t).forEach(function(t){if(-1===o.indexOf(t))throw new r('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=(n=t.styleAliases||null,a={},null!==n&&Object.keys(n).forEach(function(e){n[e].forEach(function(t){a[String(t)]=e})}),a),-1===i.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var r=n(197)("wks"),o=n(199),i=n(41).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t,n){var r=n(214)("wks"),o=n(159),i=n(32).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t,n){var r=n(41),o=n(72),i=n(81),a=n(97),s=n(153),u=function(e,t,n){var c,l,p,f,h=e&u.F,d=e&u.G,m=e&u.S,v=e&u.P,g=e&u.B,y=d?r:m?r[t]||(r[t]={}):(r[t]||{}).prototype,b=d?o:o[t]||(o[t]={}),_=b.prototype||(b.prototype={});for(c in d&&(n=t),n)p=((l=!h&&y&&void 0!==y[c])?y:n)[c],f=g&&l?s(p,r):v&&"function"==typeof p?s(Function.call,p):p,y&&a(y,c,p,e&u.U),b[c]!=p&&i(b,c,f),v&&_[c]!=p&&(_[c]=p)};r.core=o,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){"use strict";var r=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=o},function(e,t,n){"use strict";var r=Object.prototype.hasOwnProperty;function o(e,t){return!!e&&r.call(e,t)}var i=/\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;function a(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function s(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var u=/&([a-z#][a-z0-9]{1,31});/gi,c=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,l=n(463);function p(e,t){var n=0;return o(l,t)?l[t]:35===t.charCodeAt(0)&&c.test(t)&&a(n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?s(n):e}var f=/[&<>"]/,h=/[&<>"]/g,d={"&":"&","<":"<",">":">",'"':"""};function m(e){return d[e]}t.assign=function(e){return[].slice.call(arguments,1).forEach(function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach(function(n){e[n]=t[n]})}}),e},t.isString=function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},t.has=o,t.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(i,"$1")},t.isValidEntityCode=a,t.fromCodePoint=s,t.replaceEntities=function(e){return e.indexOf("&")<0?e:e.replace(u,p)},t.escapeHtml=function(e){return f.test(e)?e.replace(h,m):e}},function(e,t,n){var r=n(55),o=n(771);e.exports=function(e,t){if(null==e)return{};var n,i,a=o(e,t);if(r){var s=r(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var r=n(35),o=n(99),i=n(73),a=/"/g,s=function(e,t,n,r){var o=String(i(e)),s="<"+t;return""!==n&&(s+=" "+n+'="'+String(r).replace(a,""")+'"'),s+">"+o+""};e.exports=function(e,t){var n={};n[e]=t(s),r(r.P+r.F*o(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",n)}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){"use strict";n.r(t),n.d(t,"NEW_THROWN_ERR",function(){return i}),n.d(t,"NEW_THROWN_ERR_BATCH",function(){return a}),n.d(t,"NEW_SPEC_ERR",function(){return s}),n.d(t,"NEW_SPEC_ERR_BATCH",function(){return u}),n.d(t,"NEW_AUTH_ERR",function(){return c}),n.d(t,"CLEAR",function(){return l}),n.d(t,"CLEAR_BY",function(){return p}),n.d(t,"newThrownErr",function(){return f}),n.d(t,"newThrownErrBatch",function(){return h}),n.d(t,"newSpecErr",function(){return d}),n.d(t,"newSpecErrBatch",function(){return m}),n.d(t,"newAuthErr",function(){return v}),n.d(t,"clear",function(){return g}),n.d(t,"clearBy",function(){return y});var r=n(119),o=n.n(r),i="err_new_thrown_err",a="err_new_thrown_err_batch",s="err_new_spec_err",u="err_new_spec_err_batch",c="err_new_auth_err",l="err_clear",p="err_clear_by";function f(e){return{type:i,payload:o()(e)}}function h(e){return{type:a,payload:e}}function d(e){return{type:s,payload:e}}function m(e){return{type:u,payload:e}}function v(e){return{type:c,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:l,payload:e}}function y(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:p,payload:e}}},function(e,t,n){var r=n(98);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){var r=n(43);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){var r=n(64),o=r.Buffer;function i(e,t){for(var n in e)t[n]=e[n]}function a(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(i(r,t),t.Buffer=a),i(o,a),a.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return o(e,t,n)},a.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=o(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},a.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return o(e)},a.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){var r=n(46),o=n(349),i=n(218),a=Object.defineProperty;t.f=n(50)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){e.exports=!n(82)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){var r=n(366),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();e.exports=i},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){"use strict";e.exports={debugTool:null}},function(e,t,n){e.exports=n(573)},function(e,t,n){e.exports=n(770)},function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=45)}([function(e,t){e.exports=n(17)},function(e,t){e.exports=n(14)},function(e,t){e.exports=n(26)},function(e,t){e.exports=n(16)},function(e,t){e.exports=n(123)},function(e,t){e.exports=n(60)},function(e,t){e.exports=n(61)},function(e,t){e.exports=n(55)},function(e,t){e.exports=n(2)},function(e,t){e.exports=n(54)},function(e,t){e.exports=n(94)},function(e,t){e.exports=n(28)},function(e,t){e.exports=n(930)},function(e,t){e.exports=n(12)},function(e,t){e.exports=n(192)},function(e,t){e.exports=n(936)},function(e,t){e.exports=n(93)},function(e,t){e.exports=n(193)},function(e,t){e.exports=n(939)},function(e,t){e.exports=n(943)},function(e,t){e.exports=n(944)},function(e,t){e.exports=n(92)},function(e,t){e.exports=n(13)},function(e,t){e.exports=n(146)},function(e,t){e.exports=n(4)},function(e,t){e.exports=n(5)},function(e,t){e.exports=n(946)},function(e,t){e.exports=n(421)},function(e,t){e.exports=n(949)},function(e,t){e.exports=n(52)},function(e,t){e.exports=n(64)},function(e,t){e.exports=n(283)},function(e,t){e.exports=n(272)},function(e,t){e.exports=n(950)},function(e,t){e.exports=n(145)},function(e,t){e.exports=n(951)},function(e,t){e.exports=n(959)},function(e,t){e.exports=n(960)},function(e,t){e.exports=n(961)},function(e,t){e.exports=n(40)},function(e,t){e.exports=n(264)},function(e,t){e.exports=n(37)},function(e,t){e.exports=n(964)},function(e,t){e.exports=n(965)},function(e,t){e.exports=n(966)},function(e,t,n){e.exports=n(50)},function(e,t){e.exports=n(967)},function(e,t){e.exports=n(968)},function(e,t){e.exports=n(969)},function(e,t){e.exports=n(970)},function(e,t,n){"use strict";n.r(t);var r={};n.r(r),n.d(r,"path",function(){return mn}),n.d(r,"query",function(){return vn}),n.d(r,"header",function(){return yn}),n.d(r,"cookie",function(){return bn});var o=n(9),i=n.n(o),a=n(10),s=n.n(a),u=n(5),c=n.n(u),l=n(6),p=n.n(l),f=n(7),h=n.n(f),d=n(0),m=n.n(d),v=n(8),g=n.n(v),y=(n(46),n(15)),b=n.n(y),_=n(20),w=n.n(_),x=n(12),E=n.n(x),S=n(4),C=n.n(S),k=n(22),O=n.n(k),A=n(11),T=n.n(A),j=n(2),P=n.n(j),I=n(1),M=n.n(I),N=n(17),R=n.n(N),D=(n(47),n(26)),L=n.n(D),U=n(23),q=n.n(U),F=n(31),B=n.n(F),z={serializeRes:J,mergeInQueryOrForm:Z};function V(e){return H.apply(this,arguments)}function H(){return(H=R()(C.a.mark(function e(t){var n,r,o,i,a,s=arguments;return C.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n=s.length>1&&void 0!==s[1]?s[1]:{},"object"===P()(t)&&(t=(n=t).url),n.headers=n.headers||{},z.mergeInQueryOrForm(n),n.headers&&m()(n.headers).forEach(function(e){var t=n.headers[e];"string"==typeof t&&(n.headers[e]=t.replace(/\n+/g," "))}),!n.requestInterceptor){e.next=12;break}return e.next=8,n.requestInterceptor(n);case 8:if(e.t0=e.sent,e.t0){e.next=11;break}e.t0=n;case 11:n=e.t0;case 12:return r=n.headers["content-type"]||n.headers["Content-Type"],/multipart\/form-data/i.test(r)&&(delete n.headers["content-type"],delete n.headers["Content-Type"]),e.prev=14,e.next=17,(n.userFetch||fetch)(n.url,n);case 17:return o=e.sent,e.next=20,z.serializeRes(o,t,n);case 20:if(o=e.sent,!n.responseInterceptor){e.next=28;break}return e.next=24,n.responseInterceptor(o);case 24:if(e.t1=e.sent,e.t1){e.next=27;break}e.t1=o;case 27:o=e.t1;case 28:e.next=38;break;case 30:if(e.prev=30,e.t2=e.catch(14),o){e.next=34;break}throw e.t2;case 34:throw(i=new Error(o.statusText)).statusCode=i.status=o.status,i.responseError=e.t2,i;case 38:if(o.ok){e.next=43;break}throw(a=new Error(o.statusText)).statusCode=a.status=o.status,a.response=o,a;case 43:return e.abrupt("return",o);case 44:case"end":return e.stop()}},e,null,[[14,30]])}))).apply(this,arguments)}var W=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return/(json|xml|yaml|text)\b/.test(e)};function J(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).loadSpec,r=void 0!==n&&n,o={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:K(e.headers)},i=o.headers["content-type"],a=r||W(i);return(a?e.text:e.blob||e.buffer).call(e).then(function(e){if(o.text=e,o.data=e,a)try{var t=function(e,t){return t&&(0===t.indexOf("application/json")||t.indexOf("+json")>0)?JSON.parse(e):q.a.safeLoad(e)}(e,i);o.body=t,o.obj=t}catch(e){o.parseError=e}return o})}function K(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={};return"function"==typeof e.forEach?(e.forEach(function(e,n){void 0!==t[n]?(t[n]=M()(t[n])?t[n]:[t[n]],t[n].push(e)):t[n]=e}),t):t}function Y(e,t){return t||"undefined"==typeof navigator||(t=navigator),t&&"ReactNative"===t.product?!(!e||"object"!==P()(e)||"string"!=typeof e.uri):"undefined"!=typeof File?e instanceof File:null!==e&&"object"===P()(e)&&"function"==typeof e.pipe}function $(e,t){var n=e.collectionFormat,r=e.allowEmptyValue,o="object"===P()(e)?e.value:e;if(void 0===o&&r)return"";if(Y(o)||"boolean"==typeof o)return o;var i=encodeURIComponent;return t&&(i=B()(o)?function(e){return e}:function(e){return T()(e)}),"object"!==P()(o)||M()(o)?M()(o)?M()(o)&&!n?o.map(i).join(","):"multi"===n?o.map(i):o.map(i).join({csv:",",ssv:"%20",tsv:"%09",pipes:"|"}[n]):i(o):""}function G(e){var t=m()(e).reduce(function(t,n){var r,o=e[n],i=!!o.skipEncoding,a=i?n:encodeURIComponent(n),s=(r=o)&&"object"===P()(r)&&!M()(o);return t[a]=$(s?o:{value:o},i),t},{});return L.a.stringify(t,{encode:!1,indices:!1})||""}function Z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,r=void 0===t?"":t,o=e.query,i=e.form;if(i){var a=m()(i).some(function(e){return Y(i[e].value)}),s=e.headers["content-type"]||e.headers["Content-Type"];if(a||/multipart\/form-data/i.test(s)){var u=n(48);e.body=new u,m()(i).forEach(function(t){e.body.append(t,$(i[t],!0))})}else e.body=G(i);delete e.form}if(o){var c=r.split("?"),l=O()(c,2),p=l[0],f=l[1],h="";if(f){var d=L.a.parse(f);m()(o).forEach(function(e){return delete d[e]}),h=L.a.stringify(d,{encode:!0})}var v=function(){for(var e=arguments.length,t=new Array(e),n=0;n0){var o=t(e,n[n.length-1],n);o&&(r=r.concat(o))}if(M()(e)){var i=e.map(function(e,r){return Ce(e,t,n.concat(r))});i&&(r=r.concat(i))}else if(Te(e)){var a=m()(e).map(function(r){return Ce(e[r],t,n.concat(r))});a&&(r=r.concat(a))}return r=Oe(r)}function ke(e){return M()(e)?e:[e]}function Oe(e){var t;return(t=[]).concat.apply(t,he()(e.map(function(e){return M()(e)?Oe(e):e})))}function Ae(e){return e.filter(function(e){return void 0!==e})}function Te(e){return e&&"object"===P()(e)}function je(e){return e&&"function"==typeof e}function Pe(e){if(Ne(e)){var t=e.op;return"add"===t||"remove"===t||"replace"===t}return!1}function Ie(e){return Pe(e)||Ne(e)&&"mutation"===e.type}function Me(e){return Ie(e)&&("add"===e.op||"replace"===e.op||"merge"===e.op||"mergeDeep"===e.op)}function Ne(e){return e&&"object"===P()(e)}function Re(e,t){try{return me.a.getValueByPointer(e,t)}catch(e){return console.error(e),{}}}var De=n(35),Le=n.n(De),Ue=n(36),qe=n(28),Fe=n.n(qe);function Be(e,t){function n(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,n=new Array(e),r=0;r-1&&-1===We.indexOf(n)||Je.indexOf(r)>-1||Ke.some(function(e){return r.indexOf(e)>-1})}function $e(e,t){var n=e.split("#"),r=O()(n,2),o=r[0],i=r[1],a=E.a.resolve(o||"",t||"");return i?"".concat(a,"#").concat(i):a}var Ge="application/json, application/yaml",Ze=new RegExp("^([a-z]+://|//)","i"),Xe=Be("JSONRefError",function(e,t,n){this.originalError=n,ie()(this,t||{})}),Qe={},et=new Le.a,tt=[function(e){return"paths"===e[0]&&"responses"===e[3]&&"content"===e[5]&&"example"===e[7]},function(e){return"paths"===e[0]&&"requestBody"===e[3]&&"content"===e[4]&&"example"===e[6]}],nt={key:"$ref",plugin:function(e,t,n,r){var o=r.getInstance(),i=n.slice(0,-1);if(!Ye(i)&&(a=i,!tt.some(function(e){return e(a)}))){var a,s=r.getContext(n).baseDoc;if("string"!=typeof e)return new Xe("$ref: must be a string (JSON-Ref)",{$ref:e,baseDoc:s,fullPath:n});var u,c,l,p=st(e),f=p[0],h=p[1]||"";try{u=s||f?it(f,s):null}catch(t){return at(t,{pointer:h,$ref:e,basePath:u,fullPath:n})}if(function(e,t,n,r){var o=et.get(r);o||(o={},et.set(r,o));var i=function(e){if(0===e.length)return"";return"/".concat(e.map(ht).join("/"))}(n),a="".concat(t||"","#").concat(e),s=i.replace(/allOf\/\d+\/?/g,""),u=r.contextTree.get([]).baseDoc;if(t==u&&mt(s,e))return!0;var c="";if(n.some(function(e){return c="".concat(c,"/").concat(ht(e)),o[c]&&o[c].some(function(e){return mt(e,a)||mt(a,e)})}))return!0;o[s]=(o[s]||[]).concat(a)}(h,u,i,r)&&!o.useCircularStructures){var d=$e(e,u);return e===d?null:_e.replace(n,d)}if(null==u?(l=pt(h),void 0===(c=r.get(l))&&(c=new Xe("Could not resolve reference: ".concat(e),{pointer:h,$ref:e,baseDoc:s,fullPath:n}))):c=null!=(c=ut(u,h)).__value?c.__value:c.catch(function(t){throw at(t,{pointer:h,$ref:e,baseDoc:s,fullPath:n})}),c instanceof Error)return[_e.remove(n),c];var v=$e(e,u),g=_e.replace(i,c,{$$ref:v});if(u&&u!==s)return[g,_e.context(i,{baseDoc:u})];try{if(!function(e,t){var n=[e];return t.path.reduce(function(e,t){return n.push(e[t]),e[t]},e),function e(t){return _e.isObject(t)&&(n.indexOf(t)>=0||m()(t).some(function(n){return e(t[n])}))}(t.value)}(r.state,g)||o.useCircularStructures)return g}catch(e){return null}}}},rt=ie()(nt,{docCache:Qe,absoluteify:it,clearCache:function(e){void 0!==e?delete Qe[e]:m()(Qe).forEach(function(e){delete Qe[e]})},JSONRefError:Xe,wrapError:at,getDoc:ct,split:st,extractFromDoc:ut,fetchJSON:function(e){return Object(Ue.fetch)(e,{headers:{Accept:Ge},loadSpec:!0}).then(function(e){return e.text()}).then(function(e){return q.a.safeLoad(e)})},extract:lt,jsonPointerToArray:pt,unescapeJsonPointerToken:ft}),ot=rt;function it(e,t){if(!Ze.test(e)){if(!t)throw new Xe("Tried to resolve a relative URL, without having a basePath. path: '".concat(e,"' basePath: '").concat(t,"'"));return E.a.resolve(t,e)}return e}function at(e,t){var n;return n=e&&e.response&&e.response.body?"".concat(e.response.body.code," ").concat(e.response.body.message):e.message,new Xe("Could not resolve reference: ".concat(n),t,e)}function st(e){return(e+"").split("#")}function ut(e,t){var n=Qe[e];if(n&&!_e.isPromise(n))try{var r=lt(t,n);return ie()(Q.a.resolve(r),{__value:r})}catch(e){return Q.a.reject(e)}return ct(e).then(function(e){return lt(t,e)})}function ct(e){var t=Qe[e];return t?_e.isPromise(t)?t:Q.a.resolve(t):(Qe[e]=rt.fetchJSON(e).then(function(t){return Qe[e]=t,t}),Qe[e])}function lt(e,t){var n=pt(e);if(n.length<1)return t;var r=_e.getIn(t,n);if(void 0===r)throw new Xe("Could not resolve pointer: ".concat(e," does not exist in document"),{pointer:e});return r}function pt(e){if("string"!=typeof e)throw new TypeError("Expected a string, got a ".concat(P()(e)));return"/"===e[0]&&(e=e.substr(1)),""===e?[]:e.split("/").map(ft)}function ft(e){return"string"!=typeof e?e:Fe.a.unescape(e.replace(/~1/g,"/").replace(/~0/g,"~"))}function ht(e){return Fe.a.escape(e.replace(/~/g,"~0").replace(/\//g,"~1"))}var dt=function(e){return!e||"/"===e||"#"===e};function mt(e,t){if(dt(t))return!0;var n=e.charAt(t.length),r=t.slice(-1);return 0===e.indexOf(t)&&(!n||"/"===n||"#"===n)&&"#"!==r}var vt={key:"allOf",plugin:function(e,t,n,r,o){if(!o.meta||!o.meta.$$ref){var i=n.slice(0,-1);if(!Ye(i)){if(!M()(e)){var a=new TypeError("allOf must be an array");return a.fullPath=n,a}var s=!1,u=o.value;i.forEach(function(e){u&&(u=u[e])}),delete(u=ie()({},u)).allOf;var c=[];return c.push(r.replace(i,{})),e.forEach(function(e,t){if(!r.isObject(e)){if(s)return null;s=!0;var o=new TypeError("Elements in allOf must be objects");return o.fullPath=n,c.push(o)}c.push(r.mergeDeep(i,e));var a=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.specmap,o=n.getBaseUrlForNodePath,i=void 0===o?function(e){return r.getContext([].concat(he()(t),he()(e))).baseDoc}:o,a=n.targetKeys,s=void 0===a?["$ref","$$ref"]:a,u=[];return Ve()(e).forEach(function(){if(s.indexOf(this.key)>-1){var e=this.path,n=t.concat(this.path),o=$e(this.node,i(e));u.push(r.replace(n,o))}}),u}(e,n.slice(0,-1),{getBaseUrlForNodePath:function(e){return r.getContext([].concat(he()(n),[t],he()(e))).baseDoc},specmap:r});c.push.apply(c,he()(a))}),c.push(r.mergeDeep(i,u)),u.$$ref||c.push(r.remove([].concat(i,"$$ref"))),c}}}},gt={key:"parameters",plugin:function(e,t,n,r,o){if(M()(e)&&e.length){var i=ie()([],e),a=n.slice(0,-1),s=ie()({},_e.getIn(r.spec,a));return e.forEach(function(e,t){try{i[t].default=r.parameterMacro(s,e)}catch(e){var o=new Error(e);return o.fullPath=n,o}}),_e.replace(n,i)}return _e.replace(n,e)}},yt={key:"properties",plugin:function(e,t,n,r){var o=ie()({},e);for(var i in e)try{o[i].default=r.modelPropertyMacro(o[i])}catch(e){var a=new Error(e);return a.fullPath=n,a}return _e.replace(n,o)}};function bt(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}var _t=function(){function e(t){se()(this,e),this.root=wt(t||{})}return ce()(e,[{key:"set",value:function(e,t){var n=this.getParent(e,!0);if(n){var r=e[e.length-1],o=n.children;o[r]?xt(o[r],t,n):o[r]=wt(t,n)}else xt(this.root,t,null)}},{key:"get",value:function(e){if((e=e||[]).length<1)return this.root.value;for(var t,n,r=this.root,o=0;o1?n-1:0),o=1;o1?n-1:0),o=1;o0})}},{key:"nextPromisedPatch",value:function(){if(this.promisedPatches.length>0)return Q.a.race(this.promisedPatches.map(function(e){return e.value}))}},{key:"getPluginHistory",value:function(e){var t=this.getPluginName(e);return this.pluginHistory[t]||[]}},{key:"getPluginRunCount",value:function(e){return this.getPluginHistory(e).length}},{key:"getPluginHistoryTip",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:"getPluginMutationIndex",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return"number"!=typeof t?-1:t}},{key:"getPluginName",value:function(e){return e.pluginName}},{key:"updatePluginHistory",value:function(e,t){var n=this.getPluginName(e);(this.pluginHistory[n]=this.pluginHistory[n]||[]).push(t)}},{key:"updatePatches",value:function(e,t){var n=this;_e.normalizeArray(e).forEach(function(e){if(e instanceof Error)n.errors.push(e);else try{if(!_e.isObject(e))return void n.debug("updatePatches","Got a non-object patch",e);if(n.showDebug&&n.allPatches.push(e),_e.isPromise(e.value))return n.promisedPatches.push(e),void n.promisedPatchThen(e);if(_e.isContextPatch(e))return void n.setContext(e.path,e.value);if(_e.isMutation(e))return void n.updateMutations(e)}catch(e){console.error(e),n.errors.push(e)}})}},{key:"updateMutations",value:function(e){"object"===P()(e.value)&&!M()(e.value)&&this.allowMetaPatches&&(e.value=ie()({},e.value));var t=_e.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(e),this.state=t)}},{key:"removePromisedPatch",value:function(e){var t=this.promisedPatches.indexOf(e);t<0?this.debug("Tried to remove a promisedPatch that isn't there!"):this.promisedPatches.splice(t,1)}},{key:"promisedPatchThen",value:function(e){var t=this;return e.value=e.value.then(function(n){var r=ie()({},e,{value:n});t.removePromisedPatch(e),t.updatePatches(r)}).catch(function(n){t.removePromisedPatch(e),t.updatePatches(n)})}},{key:"getMutations",value:function(e,t){return e=e||0,"number"!=typeof t&&(t=this.mutations.length),this.mutations.slice(e,t)}},{key:"getCurrentMutations",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:"getMutationsForPlugin",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:"getCurrentPlugin",value:function(){return this.currentPlugin}},{key:"getPatchesOfType",value:function(e,t){return e.filter(t)}},{key:"getLib",value:function(){return this.libMethods}},{key:"_get",value:function(e){return _e.getIn(this.state,e)}},{key:"_getContext",value:function(e){return this.contextTree.get(e)}},{key:"setContext",value:function(e,t){return this.contextTree.set(e,t)}},{key:"_hasRun",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:"_clone",value:function(e){return JSON.parse(T()(e))}},{key:"dispatch",value:function(){var e=this,t=this,n=this.nextPlugin();if(!n){var r=this.nextPromisedPatch();if(r)return r.then(function(){return e.dispatch()}).catch(function(){return e.dispatch()});var o={spec:this.state,errors:this.errors};return this.showDebug&&(o.patches=this.allPatches),Q.a.resolve(o)}if(t.pluginCount=t.pluginCount||{},t.pluginCount[n]=(t.pluginCount[n]||0)+1,t.pluginCount[n]>100)return Q.a.resolve({spec:t.state,errors:t.errors.concat(new Error("We've reached a hard limit of ".concat(100," plugin runs")))});if(n!==this.currentPlugin&&this.promisedPatches.length){var i=this.promisedPatches.map(function(e){return e.value});return Q.a.all(i.map(function(e){return e.then(Function,Function)})).then(function(){return e.dispatch()})}return function(){t.currentPlugin=n;var e=t.getCurrentMutations(),r=t.mutations.length-1;try{if(n.isGenerator){var o=!0,i=!1,s=void 0;try{for(var u,c=te()(n(e,t.getLib()));!(o=(u=c.next()).done);o=!0){a(u.value)}}catch(e){i=!0,s=e}finally{try{o||null==c.return||c.return()}finally{if(i)throw s}}}else{a(n(e,t.getLib()))}}catch(e){console.error(e),a([ie()(re()(e),{plugin:n})])}finally{t.updatePluginHistory(n,{mutationIndex:r})}return t.dispatch()}();function a(e){e&&(e=_e.fullyNormalizeArray(e),t.updatePatches(e,n))}}}]),e}();var St={refs:ot,allOf:vt,parameters:gt,properties:yt},Ct=n(29),kt=n.n(Ct),Ot=function(e){return String.prototype.toLowerCase.call(e)},At=function(e){return e.replace(/[^\w]/gi,"_")};function Tt(e){var t=e.openapi;return!!t&&w()(t,"3")}function jt(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=(arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}).v2OperationIdCompatibilityMode;return e&&"object"===P()(e)?(e.operationId||"").replace(/\s/g,"").length?At(e.operationId):function(e,t){if((arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).v2OperationIdCompatibilityMode){var n="".concat(t.toLowerCase(),"_").concat(e).replace(/[\s!@#$%^&*()_+=[{\]};:<>|.\/?,\\'""-]/g,"_");return(n=n||"".concat(e.substring(1),"_").concat(t)).replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return"".concat(Ot(t)).concat(At(e))}(t,n,{v2OperationIdCompatibilityMode:r}):null}function Pt(e,t){return"".concat(Ot(t),"-").concat(e)}function It(e,t){return e&&e.paths?function(e,t){return Mt(e,t,!0)||null}(e,function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||"object"!==P()(o))return!1;var i=o.operationId;return[jt(o,n,r),Pt(n,r),i].some(function(e){return e&&e===t})}):null}function Mt(e,t,n){if(!e||"object"!==P()(e)||!e.paths||"object"!==P()(e.paths))return null;var r=e.paths;for(var o in r)for(var i in r[o])if("PARAMETERS"!==i.toUpperCase()){var a=r[o][i];if(a&&"object"===P()(a)){var s={spec:e,pathName:o,method:i.toUpperCase(),operation:a},u=t(s);if(n&&u)return s}}}function Nt(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var o in n){var i=n[o];if(kt()(i)){var a=i.parameters,s=function(e){var n=i[e];if(!kt()(n))return"continue";var s=jt(n,o,e);if(s){r[s]?r[s].push(n):r[s]=[n];var u=r[s];if(u.length>1)u.forEach(function(e,t){e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId="".concat(s).concat(t+1)});else if(void 0!==n.operationId){var c=u[0];c.__originalOperationId=c.__originalOperationId||n.operationId,c.operationId=s}}if("parameters"!==e){var l=[],p={};for(var f in t)"produces"!==f&&"consumes"!==f&&"security"!==f||(p[f]=t[f],l.push(p));if(a&&(p.parameters=a,l.push(p)),l.length)for(var h=0,d=l;h1&&void 0!==arguments[1]?arguments[1]:{},n=t.requestInterceptor,r=t.responseInterceptor,o=e.withCredentials?"include":"same-origin";return function(t){return e({url:t,loadSpec:!0,requestInterceptor:n,responseInterceptor:r,headers:{Accept:Ge},credentials:o}).then(function(e){return e.body})}}function Dt(e){var t=e.fetch,n=e.spec,r=e.url,o=e.mode,i=e.allowMetaPatches,a=void 0===i||i,s=e.pathDiscriminator,u=e.modelPropertyMacro,c=e.parameterMacro,l=e.requestInterceptor,p=e.responseInterceptor,f=e.skipNormalization,h=e.useCircularStructures,d=e.http,m=e.baseDoc;return m=m||r,d=t||d||V,n?v(n):Rt(d,{requestInterceptor:l,responseInterceptor:p})(m).then(v);function v(e){m&&(St.refs.docCache[m]=e),St.refs.fetchJSON=Rt(d,{requestInterceptor:l,responseInterceptor:p});var t,n=[St.refs];return"function"==typeof c&&n.push(St.parameters),"function"==typeof u&&n.push(St.properties),"strict"!==o&&n.push(St.allOf),(t={spec:e,context:{baseDoc:m},plugins:n,allowMetaPatches:a,pathDiscriminator:s,parameterMacro:c,modelPropertyMacro:u,useCircularStructures:h},new Et(t).dispatch()).then(f?function(){var e=R()(C.a.mark(function e(t){return C.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",t);case 1:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}():Nt)}}var Lt=n(16),Ut=n.n(Lt);function qt(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Ft(e){for(var t=1;t2&&void 0!==m[2]?m[2]:{},o=r.returnEntireTree,i=r.baseDoc,a=r.requestInterceptor,s=r.responseInterceptor,u=r.parameterMacro,c=r.modelPropertyMacro,l=r.useCircularStructures,p={pathDiscriminator:n,baseDoc:i,requestInterceptor:a,responseInterceptor:s,parameterMacro:u,modelPropertyMacro:c,useCircularStructures:l},f=Nt({spec:t}),h=f.spec,e.next=6,Dt(Ft({},p,{spec:h,allowMetaPatches:!0,skipNormalization:!0}));case 6:return d=e.sent,!o&&M()(n)&&n.length&&(d.spec=Ut()(d.spec,n)||null),e.abrupt("return",d);case 9:case"end":return e.stop()}},e)}))).apply(this,arguments)}var zt=n(38),Vt=n.n(zt);function Ht(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Wt(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{};return function(t){var n=t.pathName,r=t.method,o=t.operationId;return function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.execute(Wt({spec:e.spec},Vt()(e,"requestInterceptor","responseInterceptor","userFetch"),{pathName:n,method:r,parameters:t,operationId:o},i))}}}};var $t=n(39),Gt=n.n($t),Zt=n(40),Xt=n.n(Zt),Qt=n(41),en=n.n(Qt),tn=n(19),nn=n.n(tn),rn=n(42),on=n.n(rn),an={body:function(e){var t=e.req,n=e.value;t.body=n},header:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},void 0!==r&&(t.headers[n.name]=r)},query:function(e){var t=e.req,n=e.value,r=e.parameter;t.query=t.query||{},!1===n&&"boolean"===r.type&&(n="false");0===n&&["number","integer"].indexOf(r.type)>-1&&(n="0");if(n)t.query[r.name]={collectionFormat:r.collectionFormat,value:n};else if(r.allowEmptyValue&&void 0!==n){var o=r.name;t.query[o]=t.query[o]||{},t.query[o].allowEmptyValue=!0}},path:function(e){var t=e.req,n=e.value,r=e.parameter;t.url=t.url.split("{".concat(r.name,"}")).join(encodeURIComponent(n))},formData:function(e){var t=e.req,n=e.value,r=e.parameter;(n||r.allowEmptyValue)&&(t.form=t.form||{},t.form[r.name]={value:n,allowEmptyValue:r.allowEmptyValue,collectionFormat:r.collectionFormat})}};n(49);var sn=n(43),un=n.n(sn),cn=n(44),ln=function(e){return":/?#[]@!$&'()*+,;=".indexOf(e)>-1},pn=function(e){return/^[a-z0-9\-._~]+$/i.test(e)};function fn(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).escape,n=arguments.length>2?arguments[2]:void 0;return"number"==typeof e&&(e=e.toString()),"string"==typeof e&&e.length&&t?n?JSON.parse(e):Object(cn.stringToCharArray)(e).map(function(e){return pn(e)?e:ln(e)&&"unsafe"===t?e:(un()(e)||[]).map(function(e){return"0".concat(e.toString(16).toUpperCase()).slice(-2)}).map(function(e){return"%".concat(e)}).join("")}).join(""):e}function hn(e){var t=e.value;return M()(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,i=e.escape,a=function(e){return fn(e,{escape:i})};if("simple"===r)return n.map(function(e){return a(e)}).join(",");if("label"===r)return".".concat(n.map(function(e){return a(e)}).join("."));if("matrix"===r)return n.map(function(e){return a(e)}).reduce(function(e,n){return!e||o?"".concat(e||"",";").concat(t,"=").concat(n):"".concat(e,",").concat(n)},"");if("form"===r){var s=o?"&".concat(t,"="):",";return n.map(function(e){return a(e)}).join(s)}if("spaceDelimited"===r){var u=o?"".concat(t,"="):"";return n.map(function(e){return a(e)}).join(" ".concat(u))}if("pipeDelimited"===r){var c=o?"".concat(t,"="):"";return n.map(function(e){return a(e)}).join("|".concat(c))}}(e):"object"===P()(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,i=e.escape,a=function(e){return fn(e,{escape:i})},s=m()(n);if("simple"===r)return s.reduce(function(e,t){var r=a(n[t]),i=o?"=":",",s=e?"".concat(e,","):"";return"".concat(s).concat(t).concat(i).concat(r)},"");if("label"===r)return s.reduce(function(e,t){var r=a(n[t]),i=o?"=":".",s=e?"".concat(e,"."):".";return"".concat(s).concat(t).concat(i).concat(r)},"");if("matrix"===r&&o)return s.reduce(function(e,t){var r=a(n[t]),o=e?"".concat(e,";"):";";return"".concat(o).concat(t,"=").concat(r)},"");if("matrix"===r)return s.reduce(function(e,r){var o=a(n[r]),i=e?"".concat(e,","):";".concat(t,"=");return"".concat(i).concat(r,",").concat(o)},"");if("form"===r)return s.reduce(function(e,t){var r=a(n[t]),i=e?"".concat(e).concat(o?"&":","):"",s=o?"=":",";return"".concat(i).concat(t).concat(s).concat(r)},"")}(e):function(e){var t=e.key,n=e.value,r=e.style,o=e.escape,i=function(e){return fn(e,{escape:o})};if("simple"===r)return i(n);if("label"===r)return".".concat(i(n));if("matrix"===r)return";".concat(t,"=").concat(i(n));if("form"===r)return i(n);if("deepObject"===r)return i(n)}(e)}function dn(e,t){return t.includes("application/json")?"string"==typeof e?e:T()(e):e.toString()}function mn(e){var t=e.req,n=e.value,r=e.parameter,o=r.name,i=r.style,a=r.explode,s=r.content;if(s){var u=m()(s)[0];t.url=t.url.split("{".concat(o,"}")).join(fn(dn(n,u),{escape:!0}))}else{var c=hn({key:r.name,value:n,style:i||"simple",explode:a||!1,escape:!0});t.url=t.url.split("{".concat(o,"}")).join(c)}}function vn(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},r.content){var o=m()(r.content)[0];t.query[r.name]=dn(n,o)}else if(!1===n&&(n="false"),0===n&&(n="0"),n){var i=P()(n);if("deepObject"===r.style)m()(n).forEach(function(e){var o=n[e];t.query["".concat(r.name,"[").concat(e,"]")]={value:hn({key:e,value:o,style:"deepObject",escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}});else if("object"!==i||M()(n)||"form"!==r.style&&r.style||!r.explode&&void 0!==r.explode){var a=encodeURIComponent(r.name);t.query[a]={value:hn({key:a,value:n,style:r.style||"form",explode:void 0===r.explode||r.explode,escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}}else{m()(n).forEach(function(e){var o=n[e];t.query[e]={value:hn({key:e,value:o,style:r.style||"form",escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}})}}else if(r.allowEmptyValue&&void 0!==n){var s=r.name;t.query[s]=t.query[s]||{},t.query[s].allowEmptyValue=!0}}var gn=["accept","authorization","content-type"];function yn(e){var t=e.req,n=e.parameter,r=e.value;if(t.headers=t.headers||{},!(gn.indexOf(n.name.toLowerCase())>-1))if(n.content){var o=m()(n.content)[0];t.headers[n.name]=dn(r,o)}else void 0!==r&&(t.headers[n.name]=hn({key:n.name,value:r,style:n.style||"simple",explode:void 0!==n.explode&&n.explode,escape:!1}))}function bn(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{};var o=P()(r);if(n.content){var i=m()(n.content)[0];t.headers.Cookie="".concat(n.name,"=").concat(dn(r,i))}else if("undefined"!==o){var a="object"===o&&!M()(r)&&n.explode?"":"".concat(n.name,"=");t.headers.Cookie=a+hn({key:n.name,value:r,escape:!1,style:n.style||"form",explode:void 0!==n.explode&&n.explode})}}var _n=n(30),wn=function(e,t){var n=e.operation,r=e.requestBody,o=e.securities,i=e.spec,a=e.attachContentTypeForEmptyPayload,s=e.requestContentType;t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,i=void 0===o?{}:o,a=e.spec,s=b()({},t),u=r.authorized,c=void 0===u?{}:u,l=i.security||a.security||[],p=c&&!!m()(c).length,f=Ut()(a,["components","securitySchemes"])||{};if(s.headers=s.headers||{},s.query=s.query||{},!m()(r).length||!p||!l||M()(i.security)&&!i.security.length)return t;return l.forEach(function(e,t){for(var n in e){var r=c[n],o=f[n];if(r){var i=r.value||r,a=o.type;if(r)if("apiKey"===a)"query"===o.in&&(s.query[o.name]=i),"header"===o.in&&(s.headers[o.name]=i),"cookie"===o.in&&(s.cookies[o.name]=i);else if("http"===a){if("basic"===o.scheme){var u=i.username,l=i.password,p=nn()("".concat(u,":").concat(l));s.headers.Authorization="Basic ".concat(p)}"bearer"===o.scheme&&(s.headers.Authorization="Bearer ".concat(i))}else if("oauth2"===a){var h=r.token||{},d=h[o["x-tokenName"]||"access_token"],m=h.token_type;m&&"bearer"!==m.toLowerCase()||(m="Bearer"),s.headers.Authorization="".concat(m," ").concat(d)}}}}),s}({request:t,securities:o,operation:n,spec:i});var u=n.requestBody||{},c=m()(u.content||{}),l=s&&c.indexOf(s)>-1;if(r||a){if(s&&l)t.headers["Content-Type"]=s;else if(!s){var p=c[0];p&&(t.headers["Content-Type"]=p,s=p)}}else s&&l&&(t.headers["Content-Type"]=s);return r&&(s?c.indexOf(s)>-1&&("application/x-www-form-urlencoded"===s||0===s.indexOf("multipart/")?"object"===P()(r)?(t.form={},m()(r).forEach(function(e){var n,o,i=r[e];"undefined"!=typeof File&&(o=i instanceof File),"undefined"!=typeof Blob&&(o=o||i instanceof Blob),void 0!==_n.Buffer&&(o=o||_n.Buffer.isBuffer(i)),n="object"!==P()(i)||o?i:M()(i)?i.toString():T()(i),t.form[e]={value:n}})):t.form=r:t.body=r):t.body=r),t};var xn=function(e,t){var n=e.spec,r=e.operation,o=e.securities,i=e.requestContentType,a=e.attachContentTypeForEmptyPayload;if((t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,i=void 0===o?{}:o,a=e.spec,s=b()({},t),u=r.authorized,c=void 0===u?{}:u,l=r.specSecurity,p=void 0===l?[]:l,f=i.security||p,h=c&&!!m()(c).length,d=a.securityDefinitions;if(s.headers=s.headers||{},s.query=s.query||{},!m()(r).length||!h||!f||M()(i.security)&&!i.security.length)return t;return f.forEach(function(e,t){for(var n in e){var r=c[n];if(r){var o=r.token,i=r.value||r,a=d[n],u=a.type,l=a["x-tokenName"]||"access_token",p=o&&o[l],f=o&&o.token_type;if(r)if("apiKey"===u){var h="query"===a.in?"query":"headers";s[h]=s[h]||{},s[h][a.name]=i}else"basic"===u?i.header?s.headers.authorization=i.header:(i.base64=nn()("".concat(i.username,":").concat(i.password)),s.headers.authorization="Basic ".concat(i.base64)):"oauth2"===u&&p&&(f=f&&"bearer"!==f.toLowerCase()?f:"Bearer",s.headers.authorization="".concat(f," ").concat(p))}}}),s}({request:t,securities:o,operation:r,spec:n})).body||t.form||a)i?t.headers["Content-Type"]=i:M()(r.consumes)?t.headers["Content-Type"]=r.consumes[0]:M()(n.consumes)?t.headers["Content-Type"]=n.consumes[0]:r.parameters&&r.parameters.filter(function(e){return"file"===e.type}).length?t.headers["Content-Type"]="multipart/form-data":r.parameters&&r.parameters.filter(function(e){return"formData"===e.in}).length&&(t.headers["Content-Type"]="application/x-www-form-urlencoded");else if(i){var s=r.parameters&&r.parameters.filter(function(e){return"body"===e.in}).length>0,u=r.parameters&&r.parameters.filter(function(e){return"formData"===e.in}).length>0;(s||u)&&(t.headers["Content-Type"]=i)}return t};function En(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Sn(e){for(var t=1;t-1&&(c=o,l=u[p.indexOf(o)])}return!c&&u&&u.length&&(c=u[0].url,l=u[0]),c.indexOf("{")>-1&&function(e){for(var t,n=[],r=/{([^}]+)}/g;t=r.exec(e);)n.push(t[1]);return n}(c).forEach(function(e){if(l.variables&&l.variables[e]){var t=l.variables[e],n=s[e]||t.default,r=new RegExp("{".concat(e,"}"),"g");c=c.replace(r,n)}}),function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=E.a.parse(t),o=E.a.parse(n),i=Pn(r.protocol)||Pn(o.protocol)||"",a=r.host||o.host,s=r.pathname||"";return"/"===(e=i&&a?"".concat(i,"://").concat(a+s):s)[e.length-1]?e.slice(0,-1):e}(c,i)}(b):function(e){var t,n=e.spec,r=e.scheme,o=e.contextUrl,i=void 0===o?"":o,a=E.a.parse(i),s=M()(n.schemes)?n.schemes[0]:null,u=r||s||Pn(a.protocol)||"http",c=n.host||a.host||"",l=n.basePath||"";return"/"===(t=u&&c?"".concat(u,"://").concat(c+l):l)[t.length-1]?t.slice(0,-1):t}(b),!n)return delete g.cookies,g;g.url+=S,g.method="".concat(x).toUpperCase(),h=h||{};var C=t.paths[S]||{};o&&(g.headers.accept=o);var k=An([].concat(Cn(w.parameters)).concat(Cn(C.parameters)));k.forEach(function(e){var n,r=d[e.in];if("body"===e.in&&e.schema&&e.schema.properties&&(n=h),void 0===(n=e&&e.name&&h[e.name])?n=e&&e.name&&h["".concat(e.in,".").concat(e.name)]:On(e.name,k).length>1&&console.warn("Parameter '".concat(e.name,"' is ambiguous because the defined spec has more than one parameter with the name: '").concat(e.name,"' and the passed-in parameter values did not define an 'in' value.")),null!==n){if(void 0!==e.default&&void 0===n&&(n=e.default),void 0===n&&e.required&&!e.allowEmptyValue)throw new Error("Required parameter ".concat(e.name," is not provided"));if(v&&e.schema&&"object"===e.schema.type&&"string"==typeof n)try{n=JSON.parse(n)}catch(e){throw new Error("Could not parse object parameter value string as JSON")}r&&r({req:g,parameter:e,value:n,operation:w,spec:t})}});var O=Sn({},e,{operation:w});if((g=v?wn(O,g):xn(O,g)).cookies&&m()(g.cookies).length){var A=m()(g.cookies).reduce(function(e,t){var n=g.cookies[t];return e+(e?"&":"")+on.a.serialize(t,n)},"");g.headers.Cookie=A}return g.cookies&&delete g.cookies,Z(g),g}var Pn=function(e){return e?e.replace(/\W/g,""):null};function In(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Mn(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("string"==typeof e?n.url=e:n=e,!(this instanceof Mn))return new Mn(n);b()(this,n);var r=this.resolve().then(function(){return t.disableInterfaces||b()(t,Mn.makeApisTagOperation(t)),t});return r.client=this,r}Mn.http=V,Mn.makeHttp=function(e,t,n){return n=n||function(e){return e},t=t||function(e){return e},function(r){return"string"==typeof r&&(r={url:r}),z.mergeInQueryOrForm(r),r=t(r),n(e(r))}}.bind(null,Mn.http),Mn.resolve=Dt,Mn.resolveSubtree=function(e,t){return Bt.apply(this,arguments)},Mn.execute=function(e){var t=e.http,n=e.fetch,r=e.spec,o=e.operationId,i=e.pathName,a=e.method,s=e.parameters,u=e.securities,c=Gt()(e,["http","fetch","spec","operationId","pathName","method","parameters","securities"]),l=t||n||V;i&&a&&!o&&(o=Pt(i,a));var p=Tn.buildRequest(Sn({spec:r,operationId:o,parameters:s,securities:u,http:l},c));return p.body&&(Xt()(p.body)||en()(p.body))&&(p.body=T()(p.body)),l(p)},Mn.serializeRes=J,Mn.serializeHeaders=K,Mn.clearCache=function(){St.refs.clearCache()},Mn.makeApisTagOperation=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Yt.makeExecute(e);return{apis:Yt.mapTagOperations({v2OperationIdCompatibilityMode:e.v2OperationIdCompatibilityMode,spec:e.spec,cb:t})}},Mn.buildRequest=jn,Mn.helpers={opId:jt},Mn.prototype={http:V,execute:function(e){return this.applyDefaults(),Mn.execute(function(e){for(var t=1;t - * @license MIT - */ -var r=n(569),o=n(570),i=n(355);function a(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(a()=a())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a().toString(16)+" bytes");return 0|e}function d(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return B(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return z(e).length;default:if(r)return B(e).length;t=(""+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return j(this,t,n);case"utf8":case"utf-8":return k(this,t,n);case"ascii":return A(this,t,n);case"latin1":case"binary":return T(this,t,n);case"base64":return C(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=u.from(t,r)),u.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,o);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,r,o){var i,a=1,s=e.length,u=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a=2,s/=2,u/=2,n/=2}function c(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(o){var l=-1;for(i=n;is&&(n=s-u),i=n;i>=0;i--){for(var p=!0,f=0;fo&&(r=o):r=o;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var a=0;a>8,o=n%256,i.push(o),i.push(r);return i}(t,e.length-n),e,n,r)}function C(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function k(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o239?4:c>223?3:c>191?2:1;if(o+p<=n)switch(p){case 1:c<128&&(l=c);break;case 2:128==(192&(i=e[o+1]))&&(u=(31&c)<<6|63&i)>127&&(l=u);break;case 3:i=e[o+1],a=e[o+2],128==(192&i)&&128==(192&a)&&(u=(15&c)<<12|(63&i)<<6|63&a)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:i=e[o+1],a=e[o+2],s=e[o+3],128==(192&i)&&128==(192&a)&&128==(192&s)&&(u=(15&c)<<18|(63&i)<<12|(63&a)<<6|63&s)>65535&&u<1114112&&(l=u)}null===l?(l=65533,p=1):l>65535&&(l-=65536,r.push(l>>>10&1023|55296),l=56320|1023&l),r.push(l),o+=p}return function(e){var t=e.length;if(t<=O)return String.fromCharCode.apply(String,e);var n="",r=0;for(;r0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,r,o){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),a=(n>>>=0)-(t>>>=0),s=Math.min(i,a),c=this.slice(r,o),l=e.slice(t,n),p=0;po)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return w(this,e,t,n);case"latin1":case"binary":return x(this,e,t,n);case"base64":return E(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function A(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;or)&&(n=r);for(var o="",i=t;in)throw new RangeError("Trying to access beyond buffer length")}function M(e,t,n,r,o,i){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function N(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function D(e,t,n,r,o,i){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function L(e,t,n,r,i){return i||D(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function U(e,t,n,r,i){return i||D(e,0,n,8),o.write(e,t,n,r,52,8),n+8}u.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(o*=256);)r+=this[e+--t]*o;return r},u.prototype.readUInt8=function(e,t){return t||I(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||I(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||I(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||I(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||I(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||I(e,t,this.length);for(var r=this[e],o=1,i=0;++i=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||I(e,t,this.length);for(var r=t,o=1,i=this[e+--r];r>0&&(o*=256);)i+=this[e+--r]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*t)),i},u.prototype.readInt8=function(e,t){return t||I(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||I(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||I(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||I(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||I(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||I(e,4,this.length),o.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||I(e,4,this.length),o.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||I(e,8,this.length),o.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||I(e,8,this.length),o.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||M(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,i=0;for(this[t]=255&e;++i=0&&(i*=256);)this[t+o]=e/i&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);M(this,e,t,n,o-1,-o)}var i=0,a=1,s=0;for(this[t]=255&e;++i>0)-s&255;return t+n},u.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);M(this,e,t,n,o-1,-o)}var i=n-1,a=1,s=0;for(this[t+i]=255&e;--i>=0&&(a*=256);)e<0&&0===s&&0!==this[t+i+1]&&(s=1),this[t+i]=(e/a>>0)-s&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return L(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return L(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return U(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return U(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(i<1e3||!u.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(i=t;i55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(a+1===r){(t-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;i.push(n)}else if(n<2048){if((t-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(q,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function V(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(36))},function(e,t,n){"use strict";e.exports={current:null}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var u,c=[],l=!1,p=-1;function f(){l&&u&&(l=!1,u.length?c=u.concat(c):p=-1,c.length&&h())}function h(){if(!l){var e=s(f);l=!0;for(var t=c.length;t;){for(u=c,c=[];++p1)for(var n=1;n0&&"/"!==t[0]});function oe(e,t,n){return t=t||[],te.apply(void 0,[e].concat(u()(t))).get("parameters",Object(p.List)()).reduce(function(e,t){var r=n&&"body"===t.get("in")?t.get("value_xml"):t.get("value");return e.set(Object(l.B)(t,{allowHashes:!1}),r)},Object(p.fromJS)({}))}function ie(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(p.List.isList(e))return e.some(function(e){return p.Map.isMap(e)&&e.get("in")===t})}function ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(p.List.isList(e))return e.some(function(e){return p.Map.isMap(e)&&e.get("type")===t})}function se(e,t){t=t||[];var n=x(e).getIn(["paths"].concat(u()(t)),Object(p.fromJS)({})),r=e.getIn(["meta","paths"].concat(u()(t)),Object(p.fromJS)({})),o=ue(e,t),i=n.get("parameters")||new p.List,a=r.get("consumes_value")?r.get("consumes_value"):ae(i,"file")?"multipart/form-data":ae(i,"formData")?"application/x-www-form-urlencoded":void 0;return Object(p.fromJS)({requestContentType:a,responseContentType:o})}function ue(e,t){t=t||[];var n=x(e).getIn(["paths"].concat(u()(t)),null);if(null!==n){var r=e.getIn(["meta","paths"].concat(u()(t),["produces_value"]),null),o=n.getIn(["produces",0],null);return r||o||"application/json"}}function ce(e,t){t=t||[];var n=x(e),r=n.getIn(["paths"].concat(u()(t)),null);if(null!==r){var o=t,i=a()(o,1)[0],s=r.get("produces",null),c=n.getIn(["paths",i,"produces"],null),l=n.getIn(["produces"],null);return s||c||l}}function le(e,t){t=t||[];var n=x(e),r=n.getIn(["paths"].concat(u()(t)),null);if(null!==r){var o=t,i=a()(o,1)[0],s=r.get("consumes",null),c=n.getIn(["paths",i,"consumes"],null),l=n.getIn(["consumes"],null);return s||c||l}}var pe=function(e,t,n){var r=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),i=o()(r)?r[1]:null;return e.getIn(["scheme",t,n])||e.getIn(["scheme","_defaultScheme"])||i||""},fe=function(e,t,n){return["http","https"].indexOf(pe(e,t,n))>-1},he=function(e,t){t=t||[];var n=e.getIn(["meta","paths"].concat(u()(t),["parameters"]),Object(p.fromJS)([])),r=!0;return n.forEach(function(e){var t=e.get("errors");t&&t.count()&&(r=!1)}),r};function de(e){return p.Map.isMap(e)?e:new p.Map}},function(e,t,n){"use strict";n.r(t),n.d(t,"SHOW_AUTH_POPUP",function(){return d}),n.d(t,"AUTHORIZE",function(){return m}),n.d(t,"LOGOUT",function(){return v}),n.d(t,"PRE_AUTHORIZE_OAUTH2",function(){return g}),n.d(t,"AUTHORIZE_OAUTH2",function(){return y}),n.d(t,"VALIDATE",function(){return b}),n.d(t,"CONFIGURE_AUTH",function(){return _}),n.d(t,"showDefinitions",function(){return w}),n.d(t,"authorize",function(){return x}),n.d(t,"logout",function(){return E}),n.d(t,"preAuthorizeImplicit",function(){return S}),n.d(t,"authorizeOauth2",function(){return C}),n.d(t,"authorizePassword",function(){return k}),n.d(t,"authorizeApplication",function(){return O}),n.d(t,"authorizeAccessCodeWithFormParams",function(){return A}),n.d(t,"authorizeAccessCodeWithBasicAuthentication",function(){return T}),n.d(t,"authorizeRequest",function(){return j}),n.d(t,"configureAuth",function(){return P});var r=n(26),o=n.n(r),i=n(16),a=n.n(i),s=n(28),u=n.n(s),c=n(95),l=n.n(c),p=n(18),f=n.n(p),h=n(3),d="show_popup",m="authorize",v="logout",g="pre_authorize_oauth2",y="authorize_oauth2",b="validate",_="configure_auth";function w(e){return{type:d,payload:e}}function x(e){return{type:m,payload:e}}function E(e){return{type:v,payload:e}}var S=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,i=e.token,a=e.isValid,s=o.schema,c=o.name,l=s.get("flow");delete f.a.swaggerUIRedirectOauth2,"accessCode"===l||a||r.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),i.error?r.newAuthErr({authId:c,source:"auth",level:"error",message:u()(i)}):n.authorizeOauth2({auth:o,token:i})}};function C(e){return{type:y,payload:e}}var k=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.name,i=e.username,s=e.password,u=e.passwordType,c=e.clientId,l=e.clientSecret,p={grant_type:"password",scope:e.scopes.join(" "),username:i,password:s},f={};switch(u){case"request-body":!function(e,t,n){t&&a()(e,{client_id:t});n&&a()(e,{client_secret:n})}(p,c,l);break;case"basic":f.Authorization="Basic "+Object(h.a)(c+":"+l);break;default:console.warn("Warning: invalid passwordType ".concat(u," was passed, not including client id and secret"))}return n.authorizeRequest({body:Object(h.b)(p),url:r.get("tokenUrl"),name:o,headers:f,query:{},auth:e})}};var O=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,i=e.name,a=e.clientId,s=e.clientSecret,u={Authorization:"Basic "+Object(h.a)(a+":"+s)},c={grant_type:"client_credentials",scope:o.join(" ")};return n.authorizeRequest({body:Object(h.b)(c),name:i,url:r.get("tokenUrl"),auth:e,headers:u})}},A=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,i=t.name,a=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={grant_type:"authorization_code",code:t.code,client_id:a,client_secret:s,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(h.b)(c),name:i,url:o.get("tokenUrl"),auth:t})}},T=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,i=t.name,a=t.clientId,s=t.clientSecret,u={Authorization:"Basic "+Object(h.a)(a+":"+s)},c={grant_type:"authorization_code",code:t.code,client_id:a,redirect_uri:n};return r.authorizeRequest({body:Object(h.b)(c),name:i,url:o.get("tokenUrl"),auth:t,headers:u})}},j=function(e){return function(t){var n,r=t.fn,i=t.getConfigs,s=t.authActions,c=t.errActions,p=t.oas3Selectors,f=t.specSelectors,h=t.authSelectors,d=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,_=e.url,w=e.auth,x=(h.getConfigs()||{}).additionalQueryStringParams;n=f.isOAS3()?l()(_,p.selectedServer(),!0):l()(_,f.url(),!0),"object"===o()(x)&&(n.query=a()({},n.query,x));var E=n.toString(),S=a()({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},y);r.fetch({url:E,method:"post",headers:S,query:v,body:d,requestInterceptor:i().requestInterceptor,responseInterceptor:i().responseInterceptor}).then(function(e){var t=JSON.parse(e.data),n=t&&(t.error||""),r=t&&(t.parseError||"");e.ok?n||r?c.newAuthErr({authId:b,level:"error",source:"auth",message:u()(t)}):s.authorizeOauth2({auth:w,token:t}):c.newAuthErr({authId:b,level:"error",source:"auth",message:e.statusText})}).catch(function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r="string"==typeof n?JSON.parse(n):n;r.error&&(t+=", error: ".concat(r.error)),r.error_description&&(t+=", description: ".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:b,level:"error",source:"auth",message:t})})}};function P(e){return{type:_,payload:e}}},function(e,t){var n=e.exports={version:"2.6.5"};"number"==typeof __e&&(__e=n)},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var r=n(127),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){var r=n(211),o=n(210);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(49),o=n(133);e.exports=n(50)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw new TypeError(e+" is not a function");return e}},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_LAYOUT",function(){return o}),n.d(t,"UPDATE_FILTER",function(){return i}),n.d(t,"UPDATE_MODE",function(){return a}),n.d(t,"SHOW",function(){return s}),n.d(t,"updateLayout",function(){return u}),n.d(t,"updateFilter",function(){return c}),n.d(t,"show",function(){return l}),n.d(t,"changeMode",function(){return p});var r=n(3),o="layout_update_layout",i="layout_update_filter",a="layout_update_mode",s="layout_show";function u(e){return{type:o,payload:e}}function c(e){return{type:i,payload:e}}function l(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=Object(r.w)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=Object(r.w)(e),{type:a,payload:{thing:e,mode:t}}}},function(e,t,n){"use strict";(function(t){ -/*! - * @description Recursive object extending - * @author Viacheslav Lotsmanov - * @license MIT - * - * The MIT License (MIT) - * - * Copyright (c) 2013-2018 Viacheslav Lotsmanov - * - * 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. - */ -function n(e){return e instanceof t||e instanceof Date||e instanceof RegExp}function r(e){if(e instanceof t){var n=t.alloc?t.alloc(e.length):new t(e.length);return e.copy(n),n}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e);throw new Error("Unexpected situation")}function o(e){var t=[];return e.forEach(function(e,i){"object"==typeof e&&null!==e?Array.isArray(e)?t[i]=o(e):n(e)?t[i]=r(e):t[i]=a({},e):t[i]=e}),t}function i(e,t){return"__proto__"===t?void 0:e[t]}var a=e.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var e,t,s=arguments[0],u=Array.prototype.slice.call(arguments,1);return u.forEach(function(u){"object"!=typeof u||null===u||Array.isArray(u)||Object.keys(u).forEach(function(c){return t=i(s,c),(e=i(u,c))===s?void 0:"object"!=typeof e||null===e?void(s[c]=e):Array.isArray(e)?void(s[c]=o(e)):n(e)?void(s[c]=r(e)):"object"!=typeof t||null===t||Array.isArray(t)?void(s[c]=a({},e)):void(s[c]=a(t,e))})}),s}}).call(this,n(64).Buffer)},function(e,t,n){var r=n(151),o=n(336);e.exports=n(126)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var r=n(106),o=n(603),i=n(604),a="[object Null]",s="[object Undefined]",u=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?s:a:u&&u in Object(e)?o(e):i(e)}},function(e,t,n){var r=n(621),o=n(624);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},function(e,t,n){var r=n(380),o=n(661),i=n(107);e.exports=function(e){return i(e)?r(e):o(e)}},function(e,t,n){"use strict";var r=n(178),o=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};e.exports=p;var i=n(137);i.inherits=n(47);var a=n(390),s=n(240);i.inherits(p,a);for(var u=o(s.prototype),c=0;c=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t){e.exports={}},function(e,t,n){n(561);for(var r=n(32),o=n(77),i=n(102),a=n(34)("toStringTag"),s="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),u=0;u1){for(var d=Array(h),m=0;m1){for(var g=Array(v),y=0;y=this._finalSize&&(this._update(this._block),this._block.fill(0));var n=8*this._len;if(n<=4294967295)this._block.writeUInt32BE(n,this._blockSize-4);else{var r=(4294967295&n)>>>0,o=(n-r)/4294967296;this._block.writeUInt32BE(o,this._blockSize-8),this._block.writeUInt32BE(r,this._blockSize-4)}this._update(this._block);var i=this._hash();return e?i.toString(e):i},o.prototype._update=function(){throw new Error("_update must be implemented by subclass")},e.exports=o},function(e,t,n){var r=n(63),o=n(406),i=n(407),a=n(46),s=n(158),u=n(225),c={},l={};(t=e.exports=function(e,t,n,p,f){var h,d,m,v,g=f?function(){return e}:u(e),y=r(n,p,t?2:1),b=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(i(g)){for(h=s(e.length);h>b;b++)if((v=t?y(a(d=e[b])[0],d[1]):y(e[b]))===c||v===l)return v}else for(m=g.call(e);!(d=m.next()).done;)if((v=o(m,y,d.value,t))===c||v===l)return v}).BREAK=c,t.RETURN=l},function(e,t,n){"use strict";function r(e){return null==e}e.exports.isNothing=r,e.exports.isObject=function(e){return"object"==typeof e&&null!==e},e.exports.toArray=function(e){return Array.isArray(e)?e:r(e)?[]:[e]},e.exports.repeat=function(e,t){var n,r="";for(n=0;n1&&void 0!==arguments[1]?arguments[1]:{},r=Object(i.A)(t),a=r.type,s=r.example,u=r.properties,c=r.additionalProperties,l=r.items,p=n.includeReadOnly,f=n.includeWriteOnly;if(void 0!==s)return Object(i.e)(s,"$$ref",function(e){return"string"==typeof e&&e.indexOf("#")>-1});if(!a)if(u)a="object";else{if(!l)return;a="array"}if("object"===a){var d=Object(i.A)(u),m={};for(var v in d)d[v]&&d[v].deprecated||d[v]&&d[v].readOnly&&!p||d[v]&&d[v].writeOnly&&!f||(m[v]=e(d[v],n));if(!0===c)m.additionalProp1={};else if(c)for(var g=Object(i.A)(c),y=e(g,n),b=1;b<4;b++)m["additionalProp"+b]=y;return m}return"array"===a?o()(l.anyOf)?l.anyOf.map(function(t){return e(t,n)}):o()(l.oneOf)?l.oneOf.map(function(t){return e(t,n)}):[e(l,n)]:t.enum?t.default?t.default:Object(i.w)(t.enum)[0]:"file"!==a?h(t):void 0},m=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type="object"),e},v=function e(t){var n,r,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=p()({},Object(i.A)(t)),u=s.type,c=s.properties,l=s.additionalProperties,f=s.items,d=s.example,m=a.includeReadOnly,v=a.includeWriteOnly,g=s.default,y={},b={},_=t.xml,w=_.name,x=_.prefix,E=_.namespace,S=s.enum;if(!u)if(c||l)u="object";else{if(!f)return;u="array"}if(n=(x?x+":":"")+(w=w||"notagname"),E){var C=x?"xmlns:"+x:"xmlns";b[C]=E}if("array"===u&&f){if(f.xml=f.xml||_||{},f.xml.name=f.xml.name||_.name,_.wrapped)return y[n]=[],o()(d)?d.forEach(function(t){f.example=t,y[n].push(e(f,a))}):o()(g)?g.forEach(function(t){f.default=t,y[n].push(e(f,a))}):y[n]=[e(f,a)],b&&y[n].push({_attr:b}),y;var k=[];return o()(d)?(d.forEach(function(t){f.example=t,k.push(e(f,a))}),k):o()(g)?(g.forEach(function(t){f.default=t,k.push(e(f,a))}),k):e(f,a)}if("object"===u){var O=Object(i.A)(c);for(var A in y[n]=[],d=d||{},O)if(O.hasOwnProperty(A)&&(!O[A].readOnly||m)&&(!O[A].writeOnly||v))if(O[A].xml=O[A].xml||{},O[A].xml.attribute){var T=o()(O[A].enum)&&O[A].enum[0],j=O[A].example,P=O[A].default;b[O[A].xml.name||A]=void 0!==j&&j||void 0!==d[A]&&d[A]||void 0!==P&&P||T||h(O[A])}else{O[A].xml.name=O[A].xml.name||A,void 0===O[A].example&&void 0!==d[A]&&(O[A].example=d[A]);var I=e(O[A]);o()(I)?y[n]=y[n].concat(I):y[n].push(I)}return!0===l?y[n].push({additionalProp:"Anything can be here"}):l&&y[n].push({additionalProp:h(l)}),b&&y[n].push({_attr:b}),y}return r=void 0!==d?d:void 0!==g?g:o()(S)?S[0]:h(t),y[n]=b?[{_attr:b},r]:r,y};function g(e,t){var n=v(e,t);if(n)return s()(n,{declaration:!0,indent:"\t"})}var y=c()(g),b=c()(d)},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_CONFIGS",function(){return i}),n.d(t,"TOGGLE_CONFIGS",function(){return a}),n.d(t,"update",function(){return s}),n.d(t,"toggle",function(){return u}),n.d(t,"loaded",function(){return c});var r=n(2),o=n.n(r),i="configs_update",a="configs_toggle";function s(e,t){return{type:i,payload:o()({},e,t)}}function u(e){return{type:a,payload:e}}var c=function(){return function(){}}},function(e,t,n){"use strict";n.d(t,"a",function(){return a});var r=n(1),o=n.n(r),i=o.a.Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");function a(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).isOAS3;if(!o.a.Map.isMap(e))return{schema:o.a.Map(),parameterContentMediaType:null};if(!t)return"body"===e.get("in")?{schema:e.get("schema",o.a.Map()),parameterContentMediaType:null}:{schema:e.filter(function(e,t){return i.includes(t)}),parameterContentMediaType:null};if(e.get("content")){var n=e.get("content",o.a.Map({})).keySeq().first();return{schema:e.getIn(["content",n,"schema"],o.a.Map()),parameterContentMediaType:n}}return{schema:e.get("schema",o.a.Map()),parameterContentMediaType:null}}},function(e,t,n){e.exports=n(781)},function(e,t,n){"use strict";n.r(t);var r=n(469),o="object"==typeof self&&self&&self.Object===Object&&self,i=(r.a||o||Function("return this")()).Symbol,a=Object.prototype,s=a.hasOwnProperty,u=a.toString,c=i?i.toStringTag:void 0;var l=function(e){var t=s.call(e,c),n=e[c];try{e[c]=void 0;var r=!0}catch(e){}var o=u.call(e);return r&&(t?e[c]=n:delete e[c]),o},p=Object.prototype.toString;var f=function(e){return p.call(e)},h="[object Null]",d="[object Undefined]",m=i?i.toStringTag:void 0;var v=function(e){return null==e?void 0===e?d:h:m&&m in Object(e)?l(e):f(e)};var g=function(e,t){return function(n){return e(t(n))}}(Object.getPrototypeOf,Object);var y=function(e){return null!=e&&"object"==typeof e},b="[object Object]",_=Function.prototype,w=Object.prototype,x=_.toString,E=w.hasOwnProperty,S=x.call(Object);var C=function(e){if(!y(e)||v(e)!=b)return!1;var t=g(e);if(null===t)return!0;var n=E.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&x.call(n)==S},k=n(330),O={INIT:"@@redux/INIT"};function A(e,t,n){var r;if("function"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if("function"!=typeof n)throw new Error("Expected the enhancer to be a function.");return n(A)(e,t)}if("function"!=typeof e)throw new Error("Expected the reducer to be a function.");var o=e,i=t,a=[],s=a,u=!1;function c(){s===a&&(s=a.slice())}function l(){return i}function p(e){if("function"!=typeof e)throw new Error("Expected listener to be a function.");var t=!0;return c(),s.push(e),function(){if(t){t=!1,c();var n=s.indexOf(e);s.splice(n,1)}}}function f(e){if(!C(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if(void 0===e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(u)throw new Error("Reducers may not dispatch actions.");try{u=!0,i=o(i,e)}finally{u=!1}for(var t=a=s,n=0;n0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];if(a)throw a;for(var r=!1,o={},s=0;s0?r:n)(e)}},function(e,t){e.exports={}},function(e,t,n){var r=n(348),o=n(215);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){e.exports=!0},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var r=n(49).f,o=n(75),i=n(34)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){var r=n(159)("meta"),o=n(43),i=n(75),a=n(49).f,s=0,u=Object.isExtensible||function(){return!0},c=!n(82)(function(){return u(Object.preventExtensions({}))}),l=function(e){a(e,r,{value:{i:"O"+ ++s,w:{}}})},p=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!u(e))return"F";if(!t)return"E";l(e)}return e[r].i},getWeak:function(e,t){if(!i(e,r)){if(!u(e))return!0;if(!t)return!1;l(e)}return e[r].w},onFreeze:function(e){return c&&p.NEED&&u(e)&&!i(e,r)&&l(e),e}}},function(e,t,n){"use strict";e.exports=function(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,r=0;r1&&void 0!==arguments[1]?arguments[1]:[],n={arrayBehaviour:(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).arrayBehaviour||"replace"},r=t.map(function(e){return e||{}}),i=e||{},c=0;c1?t-1:0),r=1;r")}),p=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var f=s(e),h=!i(function(){var t={};return t[f]=function(){return 7},7!=""[e](t)}),d=h?!i(function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[c]=function(){return n}),n[f](""),!t}):void 0;if(!h||!d||"replace"===e&&!l||"split"===e&&!p){var m=/./[f],v=n(a,f,""[e],function(e,t,n,r,o){return t.exec===u?h&&!o?{done:!0,value:m.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),g=v[0],y=v[1];r(String.prototype,e,g),o(RegExp.prototype,f,2==t?function(e,t){return y.call(e,this,t)}:function(e){return y.call(e,this)})}}},function(e,t,n){var r=n(212),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t,n){var r=n(46),o=n(350),i=n(215),a=n(213)("IE_PROTO"),s=function(){},u=function(){var e,t=n(217)("iframe"),r=i.length;for(t.style.display="none",n(351).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" - - - -

                            Map

                            There are many places where you can find OpenBikeSensors! Are you looking for like-minded people or contacts in your +Map | OpenBikeSensor +

                            Map

                            There are many places where you can find OpenBikeSensors! Are you looking for like-minded people or contacts in your area? This map will help you find them. Do you or your group want to appear on the map? Find out how -in the forum!

                            - \ No newline at end of file +in the forum!

                            \ No newline at end of file diff --git a/map/index.html b/map/index.html index 1c010391..f69f4313 100644 --- a/map/index.html +++ b/map/index.html @@ -1,6 +1,2 @@ -Karte der Initiativen | OpenBikeSensor - - - -

                            Karte

                            In vielen Regionen gibt es schon OpenBikeSensoren! Suchst du Gleichgesinnte oder Ansprechpartner in deiner Gegend? Die Karte hilft dir dabei. Möchtest du selbst oder deine Initiative noch auf der Karte auftauchen? Im Forum erfährst du, wie!

                            - \ No newline at end of file +Karte der Initiativen | OpenBikeSensor +

                            Karte

                            In vielen Regionen gibt es schon OpenBikeSensoren! Suchst du Gleichgesinnte oder Ansprechpartner in deiner Gegend? Die Karte hilft dir dabei. Möchtest du selbst oder deine Initiative noch auf der Karte auftauchen? Im Forum erfährst du, wie!

                            \ No newline at end of file diff --git a/montage/index.html b/montage/index.html index 7a1211ee..6cbebdb5 100644 --- a/montage/index.html +++ b/montage/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/user-guide/mounting/ \ No newline at end of file +https://www.openbikesensor.org/docs/user-guide/mounting/ + \ No newline at end of file diff --git a/scss/main.min.2a8271c907f1077208b95dd3863e4294fa64ebec827d97cfb25b5fa3c1fcf77e.css b/scss/main.min.2a8271c907f1077208b95dd3863e4294fa64ebec827d97cfb25b5fa3c1fcf77e.css new file mode 100644 index 00000000..e973e2b4 --- /dev/null +++ b/scss/main.min.2a8271c907f1077208b95dd3863e4294fa64ebec827d97cfb25b5fa3c1fcf77e.css @@ -0,0 +1,10 @@ +@font-face{font-family:open sans;font-style:normal;font-weight:300;src:local(""),url(/fonts/open-sans-v27-latin-300.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-300.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:500;src:local(""),url(/fonts/open-sans-v27-latin-500.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-500.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:400;src:local(""),url(/fonts/open-sans-v27-latin-regular.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-regular.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:700;src:local(""),url(/fonts/open-sans-v27-latin-700.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-700.woff)format("woff")}/*!* Bootstrap v5.2.3 (https://getbootstrap.com/) +* Copyright 2011-2022 The Bootstrap Authors +* Copyright 2011-2022 Twitter, Inc. +* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)*/:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#212730;--bs-secondary:#f1f1f6;--bs-success:#3772ff;--bs-info:#c0e0de;--bs-warning:#ed6a5a;--bs-danger:#ed6a5a;--bs-light:#d3f3ee;--bs-dark:#403f4c;--bs-primary-rgb:33, 39, 48;--bs-secondary-rgb:241, 241, 246;--bs-success-rgb:55, 114, 255;--bs-info-rgb:192, 224, 222;--bs-warning-rgb:237, 106, 90;--bs-danger-rgb:237, 106, 90;--bs-light-rgb:211, 243, 238;--bs-dark-rgb:64, 63, 76;--bs-white-rgb:255, 255, 255;--bs-black-rgb:0, 0, 0;--bs-body-color-rgb:33, 37, 41;--bs-body-bg-rgb:255, 255, 255;--bs-font-sans-serif:"Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:Open Sans, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#3489DD;--bs-link-hover-color:#24609b;--bs-code-color:#919194;--bs-highlight-bg:#fff3cd}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,.td-footer__links-item,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width:1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media(min-width:1200px){h2,.h2{font-size:2rem}}h3,.h3,.td-footer__links-item{font-size:calc(1.275rem + .3vw)}@media(min-width:1200px){h3,.h3,.td-footer__links-item{font-size:1.5rem}}h4,.h4{font-size:calc(1.26rem + .12vw)}@media(min-width:1200px){h4,.h4{font-size:1.35rem}}h5,.h5{font-size:1.15rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small,.td-footer__copyright-etc,.td-cover-block>.byline{font-size:.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:none}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color)}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media(min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled,.td-blog-posts-list{padding-left:0;list-style:none}.list-inline,.td-footer__links-list{padding-left:0;list-style:none}.list-inline-item,.td-footer__links-item{display:inline-block}.list-inline-item:not(:last-child),.td-footer__links-item:not(:last-child){margin-right:1rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid,.td-content img{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid var(--bs-border-color);box-shadow:0 .125rem .25rem rgba(0,0,0,.075);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media(min-width:576px){.container-sm,.container{max-width:540px}}@media(min-width:768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width:992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width:1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width:1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0}.row-cols-auto>*{flex:none;width:auto}.row-cols-1>*{flex:none;width:100%}.row-cols-2>*{flex:none;width:50%}.row-cols-3>*{flex:none;width:33.33333333%}.row-cols-4>*{flex:none;width:25%}.row-cols-5>*{flex:none;width:20%}.row-cols-6>*{flex:none;width:16.66666667%}.col-auto{flex:none;width:auto}.col-1{flex:none;width:8.33333333%}.col-2{flex:none;width:16.66666667%}.col-3{flex:none;width:25%}.col-4{flex:none;width:33.33333333%}.col-5{flex:none;width:41.66666667%}.col-6{flex:none;width:50%}.col-7{flex:none;width:58.33333333%}.col-8{flex:none;width:66.66666667%}.col-9{flex:none;width:75%}.col-10{flex:none;width:83.33333333%}.col-11{flex:none;width:91.66666667%}.col-12{flex:none;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media(min-width:576px){.col-sm{flex:1 0}.row-cols-sm-auto>*{flex:none;width:auto}.row-cols-sm-1>*{flex:none;width:100%}.row-cols-sm-2>*{flex:none;width:50%}.row-cols-sm-3>*{flex:none;width:33.33333333%}.row-cols-sm-4>*{flex:none;width:25%}.row-cols-sm-5>*{flex:none;width:20%}.row-cols-sm-6>*{flex:none;width:16.66666667%}.col-sm-auto{flex:none;width:auto}.col-sm-1{flex:none;width:8.33333333%}.col-sm-2{flex:none;width:16.66666667%}.col-sm-3{flex:none;width:25%}.col-sm-4{flex:none;width:33.33333333%}.col-sm-5{flex:none;width:41.66666667%}.col-sm-6{flex:none;width:50%}.col-sm-7{flex:none;width:58.33333333%}.col-sm-8{flex:none;width:66.66666667%}.col-sm-9{flex:none;width:75%}.col-sm-10{flex:none;width:83.33333333%}.col-sm-11{flex:none;width:91.66666667%}.col-sm-12{flex:none;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media(min-width:768px){.col-md{flex:1 0}.row-cols-md-auto>*{flex:none;width:auto}.row-cols-md-1>*{flex:none;width:100%}.row-cols-md-2>*{flex:none;width:50%}.row-cols-md-3>*{flex:none;width:33.33333333%}.row-cols-md-4>*{flex:none;width:25%}.row-cols-md-5>*{flex:none;width:20%}.row-cols-md-6>*{flex:none;width:16.66666667%}.col-md-auto{flex:none;width:auto}.col-md-1{flex:none;width:8.33333333%}.col-md-2{flex:none;width:16.66666667%}.col-md-3{flex:none;width:25%}.col-md-4{flex:none;width:33.33333333%}.col-md-5{flex:none;width:41.66666667%}.col-md-6{flex:none;width:50%}.col-md-7{flex:none;width:58.33333333%}.col-md-8{flex:none;width:66.66666667%}.col-md-9{flex:none;width:75%}.col-md-10{flex:none;width:83.33333333%}.col-md-11{flex:none;width:91.66666667%}.col-md-12{flex:none;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media(min-width:992px){.col-lg{flex:1 0}.row-cols-lg-auto>*{flex:none;width:auto}.row-cols-lg-1>*{flex:none;width:100%}.row-cols-lg-2>*{flex:none;width:50%}.row-cols-lg-3>*{flex:none;width:33.33333333%}.row-cols-lg-4>*{flex:none;width:25%}.row-cols-lg-5>*{flex:none;width:20%}.row-cols-lg-6>*{flex:none;width:16.66666667%}.col-lg-auto{flex:none;width:auto}.col-lg-1{flex:none;width:8.33333333%}.col-lg-2{flex:none;width:16.66666667%}.col-lg-3{flex:none;width:25%}.col-lg-4{flex:none;width:33.33333333%}.col-lg-5{flex:none;width:41.66666667%}.col-lg-6{flex:none;width:50%}.col-lg-7{flex:none;width:58.33333333%}.col-lg-8{flex:none;width:66.66666667%}.col-lg-9{flex:none;width:75%}.col-lg-10{flex:none;width:83.33333333%}.col-lg-11{flex:none;width:91.66666667%}.col-lg-12{flex:none;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media(min-width:1200px){.col-xl{flex:1 0}.row-cols-xl-auto>*{flex:none;width:auto}.row-cols-xl-1>*{flex:none;width:100%}.row-cols-xl-2>*{flex:none;width:50%}.row-cols-xl-3>*{flex:none;width:33.33333333%}.row-cols-xl-4>*{flex:none;width:25%}.row-cols-xl-5>*{flex:none;width:20%}.row-cols-xl-6>*{flex:none;width:16.66666667%}.col-xl-auto{flex:none;width:auto}.col-xl-1{flex:none;width:8.33333333%}.col-xl-2{flex:none;width:16.66666667%}.col-xl-3{flex:none;width:25%}.col-xl-4{flex:none;width:33.33333333%}.col-xl-5{flex:none;width:41.66666667%}.col-xl-6{flex:none;width:50%}.col-xl-7{flex:none;width:58.33333333%}.col-xl-8{flex:none;width:66.66666667%}.col-xl-9{flex:none;width:75%}.col-xl-10{flex:none;width:83.33333333%}.col-xl-11{flex:none;width:91.66666667%}.col-xl-12{flex:none;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media(min-width:1400px){.col-xxl{flex:1 0}.row-cols-xxl-auto>*{flex:none;width:auto}.row-cols-xxl-1>*{flex:none;width:100%}.row-cols-xxl-2>*{flex:none;width:50%}.row-cols-xxl-3>*{flex:none;width:33.33333333%}.row-cols-xxl-4>*{flex:none;width:25%}.row-cols-xxl-5>*{flex:none;width:20%}.row-cols-xxl-6>*{flex:none;width:16.66666667%}.col-xxl-auto{flex:none;width:auto}.col-xxl-1{flex:none;width:8.33333333%}.col-xxl-2{flex:none;width:16.66666667%}.col-xxl-3{flex:none;width:25%}.col-xxl-4{flex:none;width:33.33333333%}.col-xxl-5{flex:none;width:41.66666667%}.col-xxl-6{flex:none;width:50%}.col-xxl-7{flex:none;width:58.33333333%}.col-xxl-8{flex:none;width:66.66666667%}.col-xxl-9{flex:none;width:75%}.col-xxl-10{flex:none;width:83.33333333%}.col-xxl-11{flex:none;width:91.66666667%}.col-xxl-12{flex:none;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table,.td-table:not(.td-initial),.td-content table:not(.td-initial),.td-box table:not(.td-initial){--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--bs-table-color);vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*,.td-table:not(.td-initial)>:not(caption)>*>*,.td-content table:not(.td-initial)>:not(caption)>*>*,.td-box table:not(.td-initial)>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody,.td-table:not(.td-initial)>tbody,.td-content table:not(.td-initial)>tbody,.td-box table:not(.td-initial)>tbody{vertical-align:inherit}.table>thead,.td-table:not(.td-initial)>thead,.td-content table:not(.td-initial)>thead,.td-box table:not(.td-initial)>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*,.td-table:not(.td-initial)>tbody>tr:nth-of-type(odd)>*,.td-content table:not(.td-initial)>tbody>tr:nth-of-type(odd)>*,.td-box table:not(.td-initial)>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#d3d4d6;--bs-table-border-color:#bebfc1;--bs-table-striped-bg:#c8c9cb;--bs-table-striped-color:#000;--bs-table-active-bg:#bebfc1;--bs-table-active-color:#000;--bs-table-hover-bg:#c3c4c6;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#fcfcfd;--bs-table-border-color:#e3e3e4;--bs-table-striped-bg:#efeff0;--bs-table-striped-color:#000;--bs-table-active-bg:#e3e3e4;--bs-table-active-color:#000;--bs-table-hover-bg:#e9e9ea;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d7e3ff;--bs-table-border-color:#c2cce6;--bs-table-striped-bg:#ccd8f2;--bs-table-striped-color:#000;--bs-table-active-bg:#c2cce6;--bs-table-active-color:#000;--bs-table-hover-bg:#c7d2ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#f2f9f8;--bs-table-border-color:#dae0df;--bs-table-striped-bg:#e6edec;--bs-table-striped-color:#000;--bs-table-active-bg:#dae0df;--bs-table-active-color:#000;--bs-table-hover-bg:#e0e6e5;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fbe1de;--bs-table-border-color:#e2cbc8;--bs-table-striped-bg:#eed6d3;--bs-table-striped-color:#000;--bs-table-active-bg:#e2cbc8;--bs-table-active-color:#000;--bs-table-hover-bg:#e8d0cd;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#fbe1de;--bs-table-border-color:#e2cbc8;--bs-table-striped-bg:#eed6d3;--bs-table-striped-color:#000;--bs-table-active-bg:#e2cbc8;--bs-table-active-color:#000;--bs-table-hover-bg:#e8d0cd;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#d3f3ee;--bs-table-border-color:#bedbd6;--bs-table-striped-bg:#c8e7e2;--bs-table-striped-color:#000;--bs-table-active-bg:#bedbd6;--bs-table-active-color:#000;--bs-table-hover-bg:#c3e1dc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#403f4c;--bs-table-border-color:#53525e;--bs-table-striped-bg:#4a4955;--bs-table-striped-color:#fff;--bs-table-active-bg:#53525e;--bs-table-active-color:#fff;--bs-table-hover-bg:#4e4d59;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive,.td-table:not(.td-initial),.td-content table:not(.td-initial),.td-box table:not(.td-initial){overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#909398;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 0 .25rem rgba(33,39,48,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;background-image:var(--bs-gradient);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:calc(1.5em + .75rem + 2px);padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 2px)}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#909398;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 0 .25rem rgba(33,39,48,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:50%;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;print-color-adjust:exact}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#909398;outline:0;box-shadow:0 0 0 .25rem rgba(33,39,48,.25)}.form-check-input:checked{background-color:#212730;border-color:#212730}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"),var(--bs-gradient)}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"),var(--bs-gradient)}.form-check-input[type=checkbox]:indeterminate{background-color:#212730;border-color:#212730;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"),var(--bs-gradient)}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:0;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23909398'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:100%;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"),var(--bs-gradient)}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,div.drawio .btn-check[disabled]+button,.td-blog .btn-check[disabled]+.td-rss-button,.btn-check:disabled+.btn,div.drawio .btn-check:disabled+button,.td-blog .btn-check:disabled+.td-rss-button{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(33,39,48,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(33,39,48,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#212730;background-image:var(--bs-gradient);border:0;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bcbec1;background-image:var(--bs-gradient)}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#212730;background-image:var(--bs-gradient);border:0;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#bcbec1;background-image:var(--bs-gradient)}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;width:100%;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder,.form-floating>.form-control-plaintext::-moz-placeholder{color:transparent}.form-floating>.form-control:-ms-input-placeholder,.form-floating>.form-control-plaintext:-ms-input-placeholder{color:transparent}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown),.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-ms-input-placeholder),.form-floating>.form-control-plaintext:not(:-ms-input-placeholder){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85)translateY(-.5rem)translateX(.15rem)}.form-floating>.form-control:not(:-ms-input-placeholder)~label{opacity:.65;transform:scale(.85)translateY(-.5rem)translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85)translateY(-.5rem)translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85)translateY(-.5rem)translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn,.input-group div.drawio button,div.drawio .input-group button,.input-group .td-blog .td-rss-button,.td-blog .input-group .td-rss-button{position:relative;z-index:2}.input-group .btn:focus,.input-group div.drawio button:focus,div.drawio .input-group button:focus,.input-group .td-blog .td-rss-button:focus,.td-blog .input-group .td-rss-button:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn,div.drawio .input-group-lg>button,.td-blog .input-group-lg>.td-rss-button{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn,div.drawio .input-group-sm>button,.td-blog .input-group-sm>.td-rss-button{padding:.25rem .5rem;font-size:.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#3772ff}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#000;background-color:rgba(55,114,255,.9)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3772ff;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233772ff' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3772ff;box-shadow:0 0 0 .25rem rgba(55,114,255,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3772ff}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233772ff' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3772ff;box-shadow:0 0 0 .25rem rgba(55,114,255,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3772ff}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3772ff}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(55,114,255,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3772ff}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#ed6a5a}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#000;background-color:rgba(237,106,90,.9)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ed6a5a;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ed6a5a'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ed6a5a' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ed6a5a;box-shadow:0 0 0 .25rem rgba(237,106,90,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ed6a5a}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ed6a5a'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ed6a5a' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ed6a5a;box-shadow:0 0 0 .25rem rgba(237,106,90,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ed6a5a}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ed6a5a}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(237,106,90,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ed6a5a}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn,div.drawio button,.td-blog .td-rss-button{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:#212529;--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y)var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:var(--bs-btn-border-width)solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);background-image:var(--bs-gradient);box-shadow:var(--bs-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn,div.drawio button,.td-blog .td-rss-button{transition:none}}.btn:hover,div.drawio button:hover,.td-blog .td-rss-button:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover,div.drawio .btn-check+button:hover,.td-blog .btn-check+.td-rss-button:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible,div.drawio button:focus-visible,.td-blog .td-rss-button:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);background-image:var(--bs-gradient);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-box-shadow),var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn,div.drawio .btn-check:focus-visible+button,.td-blog .btn-check:focus-visible+.td-rss-button{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-box-shadow),var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,div.drawio .btn-check:checked+button,.td-blog .btn-check:checked+.td-rss-button,:not(.btn-check)+.btn:active,div.drawio :not(.btn-check)+button:active,.td-blog :not(.btn-check)+.td-rss-button:active,.btn:first-child:active,div.drawio button:first-child:active,.td-blog .td-rss-button:first-child:active,.btn.active,div.drawio button.active,.td-blog .active.td-rss-button,.btn.show,div.drawio button.show,.td-blog .show.td-rss-button{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);background-image:none;border-color:var(--bs-btn-active-border-color);box-shadow:var(--bs-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,div.drawio .btn-check:checked+button:focus-visible,.td-blog .btn-check:checked+.td-rss-button:focus-visible,:not(.btn-check)+.btn:active:focus-visible,div.drawio :not(.btn-check)+button:active:focus-visible,.td-blog :not(.btn-check)+.td-rss-button:active:focus-visible,.btn:first-child:active:focus-visible,div.drawio button:first-child:active:focus-visible,.td-blog .td-rss-button:first-child:active:focus-visible,.btn.active:focus-visible,div.drawio button.active:focus-visible,.td-blog .active.td-rss-button:focus-visible,.btn.show:focus-visible,div.drawio button.show:focus-visible,.td-blog .show.td-rss-button:focus-visible{box-shadow:var(--bs-btn-active-shadow),var(--bs-btn-focus-box-shadow)}.btn:disabled,div.drawio button:disabled,.td-blog .td-rss-button:disabled,.btn.disabled,div.drawio button.disabled,.td-blog .disabled.td-rss-button,fieldset:disabled .btn,fieldset:disabled div.drawio button,div.drawio fieldset:disabled button,fieldset:disabled .td-blog .td-rss-button,.td-blog fieldset:disabled .td-rss-button{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);background-image:none;border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity);box-shadow:none}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#212730;--bs-btn-border-color:#212730;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#1c2129;--bs-btn-hover-border-color:#1a1f26;--bs-btn-focus-shadow-rgb:66, 71, 79;--bs-btn-active-color:#fff;--bs-btn-active-bg:#1a1f26;--bs-btn-active-border-color:#191d24;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212730;--bs-btn-disabled-border-color:#212730}.btn-secondary{--bs-btn-color:#000;--bs-btn-bg:#f1f1f6;--bs-btn-border-color:#f1f1f6;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f3f3f7;--bs-btn-hover-border-color:#f2f2f7;--bs-btn-focus-shadow-rgb:205, 205, 209;--bs-btn-active-color:#000;--bs-btn-active-bg:#f4f4f8;--bs-btn-active-border-color:#f2f2f7;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f1f1f6;--bs-btn-disabled-border-color:#f1f1f6}.btn-success{--bs-btn-color:#000;--bs-btn-bg:#3772ff;--bs-btn-border-color:#3772ff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#5587ff;--bs-btn-hover-border-color:#4b80ff;--bs-btn-focus-shadow-rgb:47, 97, 217;--bs-btn-active-color:#000;--bs-btn-active-bg:#5f8eff;--bs-btn-active-border-color:#4b80ff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#3772ff;--bs-btn-disabled-border-color:#3772ff}.btn-info,.td-blog .td-rss-button{--bs-btn-color:#000;--bs-btn-bg:#c0e0de;--bs-btn-border-color:#c0e0de;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#c9e5e3;--bs-btn-hover-border-color:#c6e3e1;--bs-btn-focus-shadow-rgb:163, 190, 189;--bs-btn-active-color:#000;--bs-btn-active-bg:#cde6e5;--bs-btn-active-border-color:#c6e3e1;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#c0e0de;--bs-btn-disabled-border-color:#c0e0de}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ed6a5a;--bs-btn-border-color:#ed6a5a;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f08073;--bs-btn-hover-border-color:#ef796b;--bs-btn-focus-shadow-rgb:201, 90, 77;--bs-btn-active-color:#000;--bs-btn-active-bg:#f1887b;--bs-btn-active-border-color:#ef796b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ed6a5a;--bs-btn-disabled-border-color:#ed6a5a}.btn-danger{--bs-btn-color:#000;--bs-btn-bg:#ed6a5a;--bs-btn-border-color:#ed6a5a;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f08073;--bs-btn-hover-border-color:#ef796b;--bs-btn-focus-shadow-rgb:201, 90, 77;--bs-btn-active-color:#000;--bs-btn-active-bg:#f1887b;--bs-btn-active-border-color:#ef796b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ed6a5a;--bs-btn-disabled-border-color:#ed6a5a}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#d3f3ee;--bs-btn-border-color:#d3f3ee;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#b3cfca;--bs-btn-hover-border-color:#a9c2be;--bs-btn-focus-shadow-rgb:179, 207, 202;--bs-btn-active-color:#000;--bs-btn-active-bg:#a9c2be;--bs-btn-active-border-color:#9eb6b3;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#d3f3ee;--bs-btn-disabled-border-color:#d3f3ee}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#403f4c;--bs-btn-border-color:#403f4c;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5d5c67;--bs-btn-hover-border-color:#53525e;--bs-btn-focus-shadow-rgb:93, 92, 103;--bs-btn-active-color:#fff;--bs-btn-active-bg:#666570;--bs-btn-active-border-color:#53525e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#403f4c;--bs-btn-disabled-border-color:#403f4c}.btn-outline-primary,div.drawio button{--bs-btn-color:#212730;--bs-btn-border-color:#212730;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212730;--bs-btn-hover-border-color:#212730;--bs-btn-focus-shadow-rgb:33, 39, 48;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212730;--bs-btn-active-border-color:#212730;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212730;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212730;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#f1f1f6;--bs-btn-border-color:#f1f1f6;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f1f1f6;--bs-btn-hover-border-color:#f1f1f6;--bs-btn-focus-shadow-rgb:241, 241, 246;--bs-btn-active-color:#000;--bs-btn-active-bg:#f1f1f6;--bs-btn-active-border-color:#f1f1f6;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f1f1f6;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f1f1f6;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#3772ff;--bs-btn-border-color:#3772ff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#3772ff;--bs-btn-hover-border-color:#3772ff;--bs-btn-focus-shadow-rgb:55, 114, 255;--bs-btn-active-color:#000;--bs-btn-active-bg:#3772ff;--bs-btn-active-border-color:#3772ff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#3772ff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#3772ff;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#c0e0de;--bs-btn-border-color:#c0e0de;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#c0e0de;--bs-btn-hover-border-color:#c0e0de;--bs-btn-focus-shadow-rgb:192, 224, 222;--bs-btn-active-color:#000;--bs-btn-active-bg:#c0e0de;--bs-btn-active-border-color:#c0e0de;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#c0e0de;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#c0e0de;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ed6a5a;--bs-btn-border-color:#ed6a5a;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ed6a5a;--bs-btn-hover-border-color:#ed6a5a;--bs-btn-focus-shadow-rgb:237, 106, 90;--bs-btn-active-color:#000;--bs-btn-active-bg:#ed6a5a;--bs-btn-active-border-color:#ed6a5a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ed6a5a;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ed6a5a;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#ed6a5a;--bs-btn-border-color:#ed6a5a;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ed6a5a;--bs-btn-hover-border-color:#ed6a5a;--bs-btn-focus-shadow-rgb:237, 106, 90;--bs-btn-active-color:#000;--bs-btn-active-bg:#ed6a5a;--bs-btn-active-border-color:#ed6a5a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ed6a5a;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ed6a5a;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#d3f3ee;--bs-btn-border-color:#d3f3ee;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3f3ee;--bs-btn-hover-border-color:#d3f3ee;--bs-btn-focus-shadow-rgb:211, 243, 238;--bs-btn-active-color:#000;--bs-btn-active-bg:#d3f3ee;--bs-btn-active-border-color:#d3f3ee;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#d3f3ee;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#d3f3ee;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#403f4c;--bs-btn-border-color:#403f4c;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#403f4c;--bs-btn-hover-border-color:#403f4c;--bs-btn-focus-shadow-rgb:64, 63, 76;--bs-btn-active-color:#fff;--bs-btn-active-bg:#403f4c;--bs-btn-active-border-color:#403f4c;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#403f4c;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#403f4c;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:66, 71, 79;text-decoration:none;background-image:none}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.td-blog .td-rss-button,.btn-group-lg>.btn,div.drawio .btn-group-lg>button{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-sm,.btn-group-sm>.btn,div.drawio .btn-group-sm>button,.td-blog .btn-group-sm>.td-rss-button{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#212529;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:#212529;--bs-dropdown-link-hover-color:#1e2125;--bs-dropdown-link-hover-bg:#e9ecef;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#212730;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y)var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width)solid var(--bs-dropdown-border-color);box-shadow:var(--bs-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y)0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg);background-image:var(--bs-gradient)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg);background-image:var(--bs-gradient)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent;background-image:none}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y)var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#212730;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,div.drawio .btn-group>button,.td-blog .btn-group>.td-rss-button,.btn-group-vertical>.btn,div.drawio .btn-group-vertical>button,.td-blog .btn-group-vertical>.td-rss-button{position:relative;flex:auto}.btn-group>.btn-check:checked+.btn,div.drawio .btn-group>.btn-check:checked+button,.td-blog .btn-group>.btn-check:checked+.td-rss-button,.btn-group>.btn-check:focus+.btn,div.drawio .btn-group>.btn-check:focus+button,.td-blog .btn-group>.btn-check:focus+.td-rss-button,.btn-group>.btn:hover,div.drawio .btn-group>button:hover,.td-blog .btn-group>.td-rss-button:hover,.btn-group>.btn:focus,div.drawio .btn-group>button:focus,.td-blog .btn-group>.td-rss-button:focus,.btn-group>.btn:active,div.drawio .btn-group>button:active,.td-blog .btn-group>.td-rss-button:active,.btn-group>.btn.active,div.drawio .btn-group>button.active,.td-blog .btn-group>.active.td-rss-button,.btn-group-vertical>.btn-check:checked+.btn,div.drawio .btn-group-vertical>.btn-check:checked+button,.td-blog .btn-group-vertical>.btn-check:checked+.td-rss-button,.btn-group-vertical>.btn-check:focus+.btn,div.drawio .btn-group-vertical>.btn-check:focus+button,.td-blog .btn-group-vertical>.btn-check:focus+.td-rss-button,.btn-group-vertical>.btn:hover,div.drawio .btn-group-vertical>button:hover,.td-blog .btn-group-vertical>.td-rss-button:hover,.btn-group-vertical>.btn:focus,div.drawio .btn-group-vertical>button:focus,.td-blog .btn-group-vertical>.td-rss-button:focus,.btn-group-vertical>.btn:active,div.drawio .btn-group-vertical>button:active,.td-blog .btn-group-vertical>.td-rss-button:active,.btn-group-vertical>.btn.active,div.drawio .btn-group-vertical>button.active,.td-blog .btn-group-vertical>.active.td-rss-button{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>:not(.btn-check:first-child)+.btn,div.drawio .btn-group>:not(.btn-check:first-child)+button,.td-blog .btn-group>:not(.btn-check:first-child)+.td-rss-button,.btn-group>.btn-group:not(:first-child){margin-left:-1px}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split,div.drawio .btn-group-sm>button+.dropdown-toggle-split,.td-blog .btn-group-sm>.td-rss-button+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.td-blog .td-rss-button+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split,div.drawio .btn-group-lg>button+.dropdown-toggle-split,.td-blog .btn-group-lg>.td-rss-button+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group.show .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,div.drawio .btn-group-vertical>button,.td-blog .btn-group-vertical>.td-rss-button,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),div.drawio .btn-group-vertical>button:not(:first-child),.td-blog .btn-group-vertical>.td-rss-button:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#6c757d;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y)var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#dee2e6;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color:#495057;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width)solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));background:0 0;border:var(--bs-nav-tabs-border-width)solid transparent}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width))}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#212730}.nav-pills .nav-link{background:0 0;border:0}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg);background-image:var(--bs-gradient)}.nav-fill>.nav-link,.nav-fill .nav-item{flex:auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar,.td-navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.55);--bs-navbar-hover-color:rgba(0, 0, 0, 0.7);--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-hover-color:rgba(0, 0, 0, 0.9);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y)var(--bs-navbar-padding-x);background-image:var(--bs-gradient)}.navbar>.container,.td-navbar>.container,.navbar>.container-fluid,.td-navbar>.container-fluid,.navbar>.container-sm,.td-navbar>.container-sm,.navbar>.container-md,.td-navbar>.container-md,.navbar>.container-lg,.td-navbar>.container-lg,.navbar>.container-xl,.td-navbar>.container-xl,.navbar>.container-xxl,.td-navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .show>.nav-link,.navbar-nav .nav-link.active{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y)var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width)solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:50%;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media(min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand,.td-navbar{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav,.td-navbar .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu,.td-navbar .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link,.td-navbar .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll,.td-navbar .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse,.td-navbar .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler,.td-navbar .navbar-toggler{display:none}.navbar-expand .offcanvas,.td-navbar .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand .offcanvas .offcanvas-header,.td-navbar .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body,.td-navbar .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.75);--bs-navbar-hover-color:rgba(255, 255, 255, 0.5);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card,.td-content .highlight{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width)solid var(--bs-card-border-color);box-shadow:var(--bs-card-box-shadow)}.card>hr,.td-content .highlight>hr{margin-right:0;margin-left:0}.card>.list-group,.td-content .highlight>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child,.td-content .highlight>.list-group:first-child{border-top-width:0}.card>.list-group:last-child,.td-content .highlight>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.td-content .highlight>.card-header+.list-group,.card>.list-group+.card-footer,.td-content .highlight>.list-group+.card-footer{border-top:0}.card-body{flex:auto;padding:var(--bs-card-spacer-y)var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width)solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width)solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card,.td-content .card-group>.highlight{margin-bottom:var(--bs-card-group-margin)}@media(min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card,.td-content .card-group>.highlight{flex:1 0;margin-bottom:0}.card-group>.card+.card,.td-content .card-group>.highlight+.card,.td-content .card-group>.card+.highlight,.td-content .card-group>.highlight+.highlight{margin-left:0;border-left:0}}.accordion{--bs-accordion-color:#212529;--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:#212529;--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231e232b'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#909398;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(33, 39, 48, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#1e232b;--bs-accordion-active-bg:#e9e9ea}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y)var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width))0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width)solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y)var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#6c757d;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#6c757d;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y)var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider,"/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:#6c757d;--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:#dee2e6;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#e9ecef;--bs-pagination-hover-border-color:#dee2e6;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#e9ecef;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(33, 39, 48, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#212730;--bs-pagination-active-border-color:#212730;--bs-pagination-disabled-color:#dee2e6;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:#dee2e6;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y)var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width)solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);background-image:var(--bs-gradient);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;display:inline-block;padding:var(--bs-badge-padding-y)var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;background-image:var(--bs-gradient)}.badge:empty{display:none}.btn .badge,div.drawio button .badge,.td-blog .td-rss-button .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;position:relative;padding:var(--bs-alert-padding-y)var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:#14171d;--bs-alert-bg:#d3d4d6;--bs-alert-border-color:#bcbec1;background-image:var(--bs-gradient)}.alert-primary .alert-link{color:#101217}.alert-secondary{--bs-alert-color:#606062;--bs-alert-bg:#fcfcfd;--bs-alert-border-color:#fbfbfc;background-image:var(--bs-gradient)}.alert-secondary .alert-link{color:#4d4d4e}.alert-success{--bs-alert-color:#214499;--bs-alert-bg:#d7e3ff;--bs-alert-border-color:#c3d5ff;background-image:var(--bs-gradient)}.alert-success .alert-link{color:#1a367a}.alert-info{--bs-alert-color:#4d5a59;--bs-alert-bg:#f2f9f8;--bs-alert-border-color:#ecf6f5;background-image:var(--bs-gradient)}.alert-info .alert-link{color:#3e4847}.alert-warning{--bs-alert-color:#8e4036;--bs-alert-bg:#fbe1de;--bs-alert-border-color:#fad2ce;background-image:var(--bs-gradient)}.alert-warning .alert-link{color:#72332b}.alert-danger{--bs-alert-color:#8e4036;--bs-alert-bg:#fbe1de;--bs-alert-border-color:#fad2ce;background-image:var(--bs-gradient)}.alert-danger .alert-link{color:#72332b}.alert-light{--bs-alert-color:#54615f;--bs-alert-bg:#f6fdfc;--bs-alert-border-color:#f2fbfa;background-image:var(--bs-gradient)}.alert-light .alert-link{color:#434e4c}.alert-dark{--bs-alert-color:#26262e;--bs-alert-bg:#d9d9db;--bs-alert-border-color:#c6c5c9;background-image:var(--bs-gradient)}.alert-dark .alert-link{color:#1e1e25}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#e9ecef;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#212730;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);box-shadow:var(--bs-progress-box-shadow)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height)var(--bs-progress-height)}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{--bs-list-group-color:#212529;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#495057;--bs-list-group-action-hover-color:#495057;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#212529;--bs-list-group-action-active-bg:#e9ecef;--bs-list-group-disabled-color:#6c757d;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#212730;--bs-list-group-active-border-color:#212730;display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section,".")". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y)var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width)solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#14171d;background-color:#d3d4d6}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#14171d;background-color:#bebfc1}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#14171d;border-color:#14171d}.list-group-item-secondary{color:#606062;background-color:#fcfcfd}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#606062;background-color:#e3e3e4}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#606062;border-color:#606062}.list-group-item-success{color:#214499;background-color:#d7e3ff}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#214499;background-color:#c2cce6}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#214499;border-color:#214499}.list-group-item-info{color:#4d5a59;background-color:#f2f9f8}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#4d5a59;background-color:#dae0df}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#4d5a59;border-color:#4d5a59}.list-group-item-warning{color:#8e4036;background-color:#fbe1de}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#8e4036;background-color:#e2cbc8}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#8e4036;border-color:#8e4036}.list-group-item-danger{color:#8e4036;background-color:#fbe1de}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#8e4036;background-color:#e2cbc8}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#8e4036;border-color:#8e4036}.list-group-item-light{color:#54615f;background-color:#f6fdfc}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#54615f;background-color:#dde4e3}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#54615f;border-color:#54615f}.list-group-item-dark{color:#26262e;background-color:#d9d9db}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#26262e;background-color:#c3c3c5}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#26262e;border-color:#26262e}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#000;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e")50%/1em no-repeat;border:0;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(33,39,48,.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1)grayscale(100%)brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(255, 255, 255, 0.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color:#6c757d;--bs-toast-header-bg:rgba(255, 255, 255, 0.85);--bs-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width)solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y)var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width)solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width)solid var(--bs-modal-border-color);box-shadow:var(--bs-modal-box-shadow);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width)solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y))calc(-.5 * var(--bs-modal-header-padding-x))calc(-.5 * var(--bs-modal-header-padding-y))auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width)solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media(min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media(min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media(min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width) * .5)0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5)var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width) * .5)0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5)var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5)0 calc(var(--bs-tooltip-arrow-width) * .5)var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y)var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: ;--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#212529;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width)solid var(--bs-popover-border-color);box-shadow:var(--bs-popover-box-shadow)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width) * .5)0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5)var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width) * .5)0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width) * .5)var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5)0 calc(var(--bs-popover-arrow-width) * .5)var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y)var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y)var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0;background-image:linear-gradient(90deg,rgba(0,0,0,.25),rgba(0,0,0,.1%))}.carousel-control-next{right:0;background-image:linear-gradient(270deg,rgba(0,0,0,.25),rgba(0,0,0,.1%))}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:initial;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1)grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;-webkit-animation:var(--bs-spinner-animation-speed)linear infinite var(--bs-spinner-animation-name);animation:var(--bs-spinner-animation-speed)linear infinite var(--bs-spinner-animation-name)}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width)solid;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media(max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media(max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media(max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media(max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media(max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media(max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}@media(prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before,div.drawio button.placeholder::before,.td-blog .placeholder.td-rss-button::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(33,39,48,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#000!important;background-color:RGBA(241,241,246,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#000!important;background-color:RGBA(55,114,255,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(192,224,222,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(237,106,90,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#000!important;background-color:RGBA(237,106,90,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(211,243,238,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(64,63,76,var(--bs-bg-opacity,1))!important}.link-primary{color:#212730!important}.link-primary:hover,.link-primary:focus{color:#171b22!important}.link-secondary{color:#f1f1f6!important}.link-secondary:hover,.link-secondary:focus{color:#f5f5f9!important}.link-success{color:#3772ff!important}.link-success:hover,.link-success:focus{color:#739cff!important}.link-info{color:#c0e0de!important}.link-info:hover,.link-info:focus{color:#d3e9e8!important}.link-warning{color:#ed6a5a!important}.link-warning:hover,.link-warning:focus{color:#f2978c!important}.link-danger{color:#ed6a5a!important}.link-danger:hover,.link-danger:focus{color:#f2978c!important}.link-light{color:#d3f3ee!important}.link-light:hover,.link-light:focus{color:#e0f7f3!important}.link-dark{color:#403f4c!important}.link-dark:hover,.link-dark:focus{color:#2d2c35!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media(min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media(min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media(min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media(min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media(min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.275rem + .3vw)!important}.fs-4{font-size:calc(1.26rem + .12vw)!important}.fs-5{font-size:1.15rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media(min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media(min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media(min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block,.td-blog .td-rss-button{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media(min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media(min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media(min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.5rem!important}.fs-4{font-size:1.35rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}/*!* Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) +* Copyright 2023 Fonticons, Inc.*/.fa,.td-search__icon:before{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.td-search__icon:before,.fa-classic,.fa-sharp,.fas,.td-offline-search-results__close-button:after,.fa-solid,.far,.fa-regular,.fab,.fa-brands{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fas,.td-offline-search-results__close-button:after,.fa-classic,.fa-solid,.far,.fa-regular{font-family:'font awesome 6 free'}.fab,.fa-brands{font-family:'font awesome 6 brands'}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07142857em;vertical-align:.05357143em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04166667em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width,2em) * -1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media(prefers-reduced-motion:reduce){.fa-beat,.fa-bounce,.fa-fade,.fa-beat-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{transform:scale(1,1)translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0)}57%{transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1,1)translateY(0)}100%{transform:scale(1,1)translateY(0)}}@keyframes fa-bounce{0%{transform:scale(1,1)translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0)}57%{transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1,1)translateY(0)}100%{transform:scale(1,1)translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,100%{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,100%{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,100%{transform:rotate(0)}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,100%{transform:rotate(0)}}@-webkit-keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scale(-1,1)}.fa-flip-vertical{transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1,-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0::before{content:"\30"}.fa-1::before{content:"\31"}.fa-2::before{content:"\32"}.fa-3::before{content:"\33"}.fa-4::before{content:"\34"}.fa-5::before{content:"\35"}.fa-6::before{content:"\36"}.fa-7::before{content:"\37"}.fa-8::before{content:"\38"}.fa-9::before{content:"\39"}.fa-fill-drip::before{content:"\f576"}.fa-arrows-to-circle::before{content:"\e4bd"}.fa-circle-chevron-right::before{content:"\f138"}.fa-chevron-circle-right::before{content:"\f138"}.fa-at::before{content:"\40"}.fa-trash-can::before{content:"\f2ed"}.fa-trash-alt::before{content:"\f2ed"}.fa-text-height::before{content:"\f034"}.fa-user-xmark::before{content:"\f235"}.fa-user-times::before{content:"\f235"}.fa-stethoscope::before{content:"\f0f1"}.fa-message::before{content:"\f27a"}.fa-comment-alt::before{content:"\f27a"}.fa-info::before{content:"\f129"}.fa-down-left-and-up-right-to-center::before{content:"\f422"}.fa-compress-alt::before{content:"\f422"}.fa-explosion::before{content:"\e4e9"}.fa-file-lines::before{content:"\f15c"}.fa-file-alt::before{content:"\f15c"}.fa-file-text::before{content:"\f15c"}.fa-wave-square::before{content:"\f83e"}.fa-ring::before{content:"\f70b"}.fa-building-un::before{content:"\e4d9"}.fa-dice-three::before{content:"\f527"}.fa-calendar-days::before{content:"\f073"}.fa-calendar-alt::before{content:"\f073"}.fa-anchor-circle-check::before{content:"\e4aa"}.fa-building-circle-arrow-right::before{content:"\e4d1"}.fa-volleyball::before{content:"\f45f"}.fa-volleyball-ball::before{content:"\f45f"}.fa-arrows-up-to-line::before{content:"\e4c2"}.fa-sort-down::before{content:"\f0dd"}.fa-sort-desc::before{content:"\f0dd"}.fa-circle-minus::before{content:"\f056"}.fa-minus-circle::before{content:"\f056"}.fa-door-open::before{content:"\f52b"}.fa-right-from-bracket::before{content:"\f2f5"}.fa-sign-out-alt::before{content:"\f2f5"}.fa-atom::before{content:"\f5d2"}.fa-soap::before{content:"\e06e"}.fa-icons::before{content:"\f86d"}.fa-heart-music-camera-bolt::before{content:"\f86d"}.fa-microphone-lines-slash::before{content:"\f539"}.fa-microphone-alt-slash::before{content:"\f539"}.fa-bridge-circle-check::before{content:"\e4c9"}.fa-pump-medical::before{content:"\e06a"}.fa-fingerprint::before{content:"\f577"}.fa-hand-point-right::before{content:"\f0a4"}.fa-magnifying-glass-location::before{content:"\f689"}.fa-search-location::before{content:"\f689"}.fa-forward-step::before{content:"\f051"}.fa-step-forward::before{content:"\f051"}.fa-face-smile-beam::before{content:"\f5b8"}.fa-smile-beam::before{content:"\f5b8"}.fa-flag-checkered::before{content:"\f11e"}.fa-football::before{content:"\f44e"}.fa-football-ball::before{content:"\f44e"}.fa-school-circle-exclamation::before{content:"\e56c"}.fa-crop::before{content:"\f125"}.fa-angles-down::before{content:"\f103"}.fa-angle-double-down::before{content:"\f103"}.fa-users-rectangle::before{content:"\e594"}.fa-people-roof::before{content:"\e537"}.fa-people-line::before{content:"\e534"}.fa-beer-mug-empty::before{content:"\f0fc"}.fa-beer::before{content:"\f0fc"}.fa-diagram-predecessor::before{content:"\e477"}.fa-arrow-up-long::before{content:"\f176"}.fa-long-arrow-up::before{content:"\f176"}.fa-fire-flame-simple::before{content:"\f46a"}.fa-burn::before{content:"\f46a"}.fa-person::before{content:"\f183"}.fa-male::before{content:"\f183"}.fa-laptop::before{content:"\f109"}.fa-file-csv::before{content:"\f6dd"}.fa-menorah::before{content:"\f676"}.fa-truck-plane::before{content:"\e58f"}.fa-record-vinyl::before{content:"\f8d9"}.fa-face-grin-stars::before{content:"\f587"}.fa-grin-stars::before{content:"\f587"}.fa-bong::before{content:"\f55c"}.fa-spaghetti-monster-flying::before{content:"\f67b"}.fa-pastafarianism::before{content:"\f67b"}.fa-arrow-down-up-across-line::before{content:"\e4af"}.fa-spoon::before{content:"\f2e5"}.fa-utensil-spoon::before{content:"\f2e5"}.fa-jar-wheat::before{content:"\e517"}.fa-envelopes-bulk::before{content:"\f674"}.fa-mail-bulk::before{content:"\f674"}.fa-file-circle-exclamation::before{content:"\e4eb"}.fa-circle-h::before{content:"\f47e"}.fa-hospital-symbol::before{content:"\f47e"}.fa-pager::before{content:"\f815"}.fa-address-book::before{content:"\f2b9"}.fa-contact-book::before{content:"\f2b9"}.fa-strikethrough::before{content:"\f0cc"}.fa-k::before{content:"\4b"}.fa-landmark-flag::before{content:"\e51c"}.fa-pencil::before{content:"\f303"}.fa-pencil-alt::before{content:"\f303"}.fa-backward::before{content:"\f04a"}.fa-caret-right::before{content:"\f0da"}.fa-comments::before{content:"\f086"}.fa-paste::before{content:"\f0ea"}.fa-file-clipboard::before{content:"\f0ea"}.fa-code-pull-request::before{content:"\e13c"}.fa-clipboard-list::before{content:"\f46d"}.fa-truck-ramp-box::before{content:"\f4de"}.fa-truck-loading::before{content:"\f4de"}.fa-user-check::before{content:"\f4fc"}.fa-vial-virus::before{content:"\e597"}.fa-sheet-plastic::before{content:"\e571"}.fa-blog::before{content:"\f781"}.fa-user-ninja::before{content:"\f504"}.fa-person-arrow-up-from-line::before{content:"\e539"}.fa-scroll-torah::before{content:"\f6a0"}.fa-torah::before{content:"\f6a0"}.fa-broom-ball::before{content:"\f458"}.fa-quidditch::before{content:"\f458"}.fa-quidditch-broom-ball::before{content:"\f458"}.fa-toggle-off::before{content:"\f204"}.fa-box-archive::before{content:"\f187"}.fa-archive::before{content:"\f187"}.fa-person-drowning::before{content:"\e545"}.fa-arrow-down-9-1::before{content:"\f886"}.fa-sort-numeric-desc::before{content:"\f886"}.fa-sort-numeric-down-alt::before{content:"\f886"}.fa-face-grin-tongue-squint::before{content:"\f58a"}.fa-grin-tongue-squint::before{content:"\f58a"}.fa-spray-can::before{content:"\f5bd"}.fa-truck-monster::before{content:"\f63b"}.fa-w::before{content:"\57"}.fa-earth-africa::before{content:"\f57c"}.fa-globe-africa::before{content:"\f57c"}.fa-rainbow::before{content:"\f75b"}.fa-circle-notch::before{content:"\f1ce"}.fa-tablet-screen-button::before{content:"\f3fa"}.fa-tablet-alt::before{content:"\f3fa"}.fa-paw::before{content:"\f1b0"}.fa-cloud::before{content:"\f0c2"}.fa-trowel-bricks::before{content:"\e58a"}.fa-face-flushed::before{content:"\f579"}.fa-flushed::before{content:"\f579"}.fa-hospital-user::before{content:"\f80d"}.fa-tent-arrow-left-right::before{content:"\e57f"}.fa-gavel::before{content:"\f0e3"}.fa-legal::before{content:"\f0e3"}.fa-binoculars::before{content:"\f1e5"}.fa-microphone-slash::before{content:"\f131"}.fa-box-tissue::before{content:"\e05b"}.fa-motorcycle::before{content:"\f21c"}.fa-bell-concierge::before{content:"\f562"}.fa-concierge-bell::before{content:"\f562"}.fa-pen-ruler::before{content:"\f5ae"}.fa-pencil-ruler::before{content:"\f5ae"}.fa-people-arrows::before{content:"\e068"}.fa-people-arrows-left-right::before{content:"\e068"}.fa-mars-and-venus-burst::before{content:"\e523"}.fa-square-caret-right::before{content:"\f152"}.fa-caret-square-right::before{content:"\f152"}.fa-scissors::before{content:"\f0c4"}.fa-cut::before{content:"\f0c4"}.fa-sun-plant-wilt::before{content:"\e57a"}.fa-toilets-portable::before{content:"\e584"}.fa-hockey-puck::before{content:"\f453"}.fa-table::before{content:"\f0ce"}.fa-magnifying-glass-arrow-right::before{content:"\e521"}.fa-tachograph-digital::before{content:"\f566"}.fa-digital-tachograph::before{content:"\f566"}.fa-users-slash::before{content:"\e073"}.fa-clover::before{content:"\e139"}.fa-reply::before{content:"\f3e5"}.fa-mail-reply::before{content:"\f3e5"}.fa-star-and-crescent::before{content:"\f699"}.fa-house-fire::before{content:"\e50c"}.fa-square-minus::before{content:"\f146"}.fa-minus-square::before{content:"\f146"}.fa-helicopter::before{content:"\f533"}.fa-compass::before{content:"\f14e"}.fa-square-caret-down::before{content:"\f150"}.fa-caret-square-down::before{content:"\f150"}.fa-file-circle-question::before{content:"\e4ef"}.fa-laptop-code::before{content:"\f5fc"}.fa-swatchbook::before{content:"\f5c3"}.fa-prescription-bottle::before{content:"\f485"}.fa-bars::before{content:"\f0c9"}.fa-navicon::before{content:"\f0c9"}.fa-people-group::before{content:"\e533"}.fa-hourglass-end::before{content:"\f253"}.fa-hourglass-3::before{content:"\f253"}.fa-heart-crack::before{content:"\f7a9"}.fa-heart-broken::before{content:"\f7a9"}.fa-square-up-right::before{content:"\f360"}.fa-external-link-square-alt::before{content:"\f360"}.fa-face-kiss-beam::before{content:"\f597"}.fa-kiss-beam::before{content:"\f597"}.fa-film::before{content:"\f008"}.fa-ruler-horizontal::before{content:"\f547"}.fa-people-robbery::before{content:"\e536"}.fa-lightbulb::before{content:"\f0eb"}.fa-caret-left::before{content:"\f0d9"}.fa-circle-exclamation::before{content:"\f06a"}.fa-exclamation-circle::before{content:"\f06a"}.fa-school-circle-xmark::before{content:"\e56d"}.fa-arrow-right-from-bracket::before{content:"\f08b"}.fa-sign-out::before{content:"\f08b"}.fa-circle-chevron-down::before{content:"\f13a"}.fa-chevron-circle-down::before{content:"\f13a"}.fa-unlock-keyhole::before{content:"\f13e"}.fa-unlock-alt::before{content:"\f13e"}.fa-cloud-showers-heavy::before{content:"\f740"}.fa-headphones-simple::before{content:"\f58f"}.fa-headphones-alt::before{content:"\f58f"}.fa-sitemap::before{content:"\f0e8"}.fa-circle-dollar-to-slot::before{content:"\f4b9"}.fa-donate::before{content:"\f4b9"}.fa-memory::before{content:"\f538"}.fa-road-spikes::before{content:"\e568"}.fa-fire-burner::before{content:"\e4f1"}.fa-flag::before{content:"\f024"}.fa-hanukiah::before{content:"\f6e6"}.fa-feather::before{content:"\f52d"}.fa-volume-low::before{content:"\f027"}.fa-volume-down::before{content:"\f027"}.fa-comment-slash::before{content:"\f4b3"}.fa-cloud-sun-rain::before{content:"\f743"}.fa-compress::before{content:"\f066"}.fa-wheat-awn::before{content:"\e2cd"}.fa-wheat-alt::before{content:"\e2cd"}.fa-ankh::before{content:"\f644"}.fa-hands-holding-child::before{content:"\e4fa"}.fa-asterisk::before{content:"\2a"}.fa-square-check::before{content:"\f14a"}.fa-check-square::before{content:"\f14a"}.fa-peseta-sign::before{content:"\e221"}.fa-heading::before{content:"\f1dc"}.fa-header::before{content:"\f1dc"}.fa-ghost::before{content:"\f6e2"}.fa-list::before{content:"\f03a"}.fa-list-squares::before{content:"\f03a"}.fa-square-phone-flip::before{content:"\f87b"}.fa-phone-square-alt::before{content:"\f87b"}.fa-cart-plus::before{content:"\f217"}.fa-gamepad::before{content:"\f11b"}.fa-circle-dot::before{content:"\f192"}.fa-dot-circle::before{content:"\f192"}.fa-face-dizzy::before{content:"\f567"}.fa-dizzy::before{content:"\f567"}.fa-egg::before{content:"\f7fb"}.fa-house-medical-circle-xmark::before{content:"\e513"}.fa-campground::before{content:"\f6bb"}.fa-folder-plus::before{content:"\f65e"}.fa-futbol::before{content:"\f1e3"}.fa-futbol-ball::before{content:"\f1e3"}.fa-soccer-ball::before{content:"\f1e3"}.fa-paintbrush::before{content:"\f1fc"}.fa-paint-brush::before{content:"\f1fc"}.fa-lock::before{content:"\f023"}.fa-gas-pump::before{content:"\f52f"}.fa-hot-tub-person::before{content:"\f593"}.fa-hot-tub::before{content:"\f593"}.fa-map-location::before{content:"\f59f"}.fa-map-marked::before{content:"\f59f"}.fa-house-flood-water::before{content:"\e50e"}.fa-tree::before{content:"\f1bb"}.fa-bridge-lock::before{content:"\e4cc"}.fa-sack-dollar::before{content:"\f81d"}.fa-pen-to-square::before{content:"\f044"}.fa-edit::before{content:"\f044"}.fa-car-side::before{content:"\f5e4"}.fa-share-nodes::before{content:"\f1e0"}.fa-share-alt::before{content:"\f1e0"}.fa-heart-circle-minus::before{content:"\e4ff"}.fa-hourglass-half::before{content:"\f252"}.fa-hourglass-2::before{content:"\f252"}.fa-microscope::before{content:"\f610"}.fa-sink::before{content:"\e06d"}.fa-bag-shopping::before{content:"\f290"}.fa-shopping-bag::before{content:"\f290"}.fa-arrow-down-z-a::before{content:"\f881"}.fa-sort-alpha-desc::before{content:"\f881"}.fa-sort-alpha-down-alt::before{content:"\f881"}.fa-mitten::before{content:"\f7b5"}.fa-person-rays::before{content:"\e54d"}.fa-users::before{content:"\f0c0"}.fa-eye-slash::before{content:"\f070"}.fa-flask-vial::before{content:"\e4f3"}.fa-hand::before{content:"\f256"}.fa-hand-paper::before{content:"\f256"}.fa-om::before{content:"\f679"}.fa-worm::before{content:"\e599"}.fa-house-circle-xmark::before{content:"\e50b"}.fa-plug::before{content:"\f1e6"}.fa-chevron-up::before{content:"\f077"}.fa-hand-spock::before{content:"\f259"}.fa-stopwatch::before{content:"\f2f2"}.fa-face-kiss::before{content:"\f596"}.fa-kiss::before{content:"\f596"}.fa-bridge-circle-xmark::before{content:"\e4cb"}.fa-face-grin-tongue::before{content:"\f589"}.fa-grin-tongue::before{content:"\f589"}.fa-chess-bishop::before{content:"\f43a"}.fa-face-grin-wink::before{content:"\f58c"}.fa-grin-wink::before{content:"\f58c"}.fa-ear-deaf::before{content:"\f2a4"}.fa-deaf::before{content:"\f2a4"}.fa-deafness::before{content:"\f2a4"}.fa-hard-of-hearing::before{content:"\f2a4"}.fa-road-circle-check::before{content:"\e564"}.fa-dice-five::before{content:"\f523"}.fa-square-rss::before{content:"\f143"}.fa-rss-square::before{content:"\f143"}.fa-land-mine-on::before{content:"\e51b"}.fa-i-cursor::before{content:"\f246"}.fa-stamp::before{content:"\f5bf"}.fa-stairs::before{content:"\e289"}.fa-i::before{content:"\49"}.fa-hryvnia-sign::before{content:"\f6f2"}.fa-hryvnia::before{content:"\f6f2"}.fa-pills::before{content:"\f484"}.fa-face-grin-wide::before{content:"\f581"}.fa-grin-alt::before{content:"\f581"}.fa-tooth::before{content:"\f5c9"}.fa-v::before{content:"\56"}.fa-bangladeshi-taka-sign::before{content:"\e2e6"}.fa-bicycle::before{content:"\f206"}.fa-staff-snake::before{content:"\e579"}.fa-rod-asclepius::before{content:"\e579"}.fa-rod-snake::before{content:"\e579"}.fa-staff-aesculapius::before{content:"\e579"}.fa-head-side-cough-slash::before{content:"\e062"}.fa-truck-medical::before{content:"\f0f9"}.fa-ambulance::before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation::before{content:"\e598"}.fa-snowman::before{content:"\f7d0"}.fa-mortar-pestle::before{content:"\f5a7"}.fa-road-barrier::before{content:"\e562"}.fa-school::before{content:"\f549"}.fa-igloo::before{content:"\f7ae"}.fa-joint::before{content:"\f595"}.fa-angle-right::before{content:"\f105"}.fa-horse::before{content:"\f6f0"}.fa-q::before{content:"\51"}.fa-g::before{content:"\47"}.fa-notes-medical::before{content:"\f481"}.fa-temperature-half::before{content:"\f2c9"}.fa-temperature-2::before{content:"\f2c9"}.fa-thermometer-2::before{content:"\f2c9"}.fa-thermometer-half::before{content:"\f2c9"}.fa-dong-sign::before{content:"\e169"}.fa-capsules::before{content:"\f46b"}.fa-poo-storm::before{content:"\f75a"}.fa-poo-bolt::before{content:"\f75a"}.fa-face-frown-open::before{content:"\f57a"}.fa-frown-open::before{content:"\f57a"}.fa-hand-point-up::before{content:"\f0a6"}.fa-money-bill::before{content:"\f0d6"}.fa-bookmark::before{content:"\f02e"}.fa-align-justify::before{content:"\f039"}.fa-umbrella-beach::before{content:"\f5ca"}.fa-helmet-un::before{content:"\e503"}.fa-bullseye::before{content:"\f140"}.fa-bacon::before{content:"\f7e5"}.fa-hand-point-down::before{content:"\f0a7"}.fa-arrow-up-from-bracket::before{content:"\e09a"}.fa-folder::before{content:"\f07b"}.fa-folder-blank::before{content:"\f07b"}.fa-file-waveform::before{content:"\f478"}.fa-file-medical-alt::before{content:"\f478"}.fa-radiation::before{content:"\f7b9"}.fa-chart-simple::before{content:"\e473"}.fa-mars-stroke::before{content:"\f229"}.fa-vial::before{content:"\f492"}.fa-gauge::before{content:"\f624"}.fa-dashboard::before{content:"\f624"}.fa-gauge-med::before{content:"\f624"}.fa-tachometer-alt-average::before{content:"\f624"}.fa-wand-magic-sparkles::before{content:"\e2ca"}.fa-magic-wand-sparkles::before{content:"\e2ca"}.fa-e::before{content:"\45"}.fa-pen-clip::before{content:"\f305"}.fa-pen-alt::before{content:"\f305"}.fa-bridge-circle-exclamation::before{content:"\e4ca"}.fa-user::before{content:"\f007"}.fa-school-circle-check::before{content:"\e56b"}.fa-dumpster::before{content:"\f793"}.fa-van-shuttle::before{content:"\f5b6"}.fa-shuttle-van::before{content:"\f5b6"}.fa-building-user::before{content:"\e4da"}.fa-square-caret-left::before{content:"\f191"}.fa-caret-square-left::before{content:"\f191"}.fa-highlighter::before{content:"\f591"}.fa-key::before{content:"\f084"}.fa-bullhorn::before{content:"\f0a1"}.fa-globe::before{content:"\f0ac"}.fa-synagogue::before{content:"\f69b"}.fa-person-half-dress::before{content:"\e548"}.fa-road-bridge::before{content:"\e563"}.fa-location-arrow::before{content:"\f124"}.fa-c::before{content:"\43"}.fa-tablet-button::before{content:"\f10a"}.fa-building-lock::before{content:"\e4d6"}.fa-pizza-slice::before{content:"\f818"}.fa-money-bill-wave::before{content:"\f53a"}.fa-chart-area::before{content:"\f1fe"}.fa-area-chart::before{content:"\f1fe"}.fa-house-flag::before{content:"\e50d"}.fa-person-circle-minus::before{content:"\e540"}.fa-ban::before{content:"\f05e"}.fa-cancel::before{content:"\f05e"}.fa-camera-rotate::before{content:"\e0d8"}.fa-spray-can-sparkles::before{content:"\f5d0"}.fa-air-freshener::before{content:"\f5d0"}.fa-star::before{content:"\f005"}.fa-repeat::before{content:"\f363"}.fa-cross::before{content:"\f654"}.fa-box::before{content:"\f466"}.fa-venus-mars::before{content:"\f228"}.fa-arrow-pointer::before{content:"\f245"}.fa-mouse-pointer::before{content:"\f245"}.fa-maximize::before{content:"\f31e"}.fa-expand-arrows-alt::before{content:"\f31e"}.fa-charging-station::before{content:"\f5e7"}.fa-shapes::before{content:"\f61f"}.fa-triangle-circle-square::before{content:"\f61f"}.fa-shuffle::before{content:"\f074"}.fa-random::before{content:"\f074"}.fa-person-running::before{content:"\f70c"}.fa-running::before{content:"\f70c"}.fa-mobile-retro::before{content:"\e527"}.fa-grip-lines-vertical::before{content:"\f7a5"}.fa-spider::before{content:"\f717"}.fa-hands-bound::before{content:"\e4f9"}.fa-file-invoice-dollar::before{content:"\f571"}.fa-plane-circle-exclamation::before{content:"\e556"}.fa-x-ray::before{content:"\f497"}.fa-spell-check::before{content:"\f891"}.fa-slash::before{content:"\f715"}.fa-computer-mouse::before{content:"\f8cc"}.fa-mouse::before{content:"\f8cc"}.fa-arrow-right-to-bracket::before{content:"\f090"}.fa-sign-in::before{content:"\f090"}.fa-shop-slash::before{content:"\e070"}.fa-store-alt-slash::before{content:"\e070"}.fa-server::before{content:"\f233"}.fa-virus-covid-slash::before{content:"\e4a9"}.fa-shop-lock::before{content:"\e4a5"}.fa-hourglass-start::before{content:"\f251"}.fa-hourglass-1::before{content:"\f251"}.fa-blender-phone::before{content:"\f6b6"}.fa-building-wheat::before{content:"\e4db"}.fa-person-breastfeeding::before{content:"\e53a"}.fa-right-to-bracket::before{content:"\f2f6"}.fa-sign-in-alt::before{content:"\f2f6"}.fa-venus::before{content:"\f221"}.fa-passport::before{content:"\f5ab"}.fa-heart-pulse::before{content:"\f21e"}.fa-heartbeat::before{content:"\f21e"}.fa-people-carry-box::before{content:"\f4ce"}.fa-people-carry::before{content:"\f4ce"}.fa-temperature-high::before{content:"\f769"}.fa-microchip::before{content:"\f2db"}.fa-crown::before{content:"\f521"}.fa-weight-hanging::before{content:"\f5cd"}.fa-xmarks-lines::before{content:"\e59a"}.fa-file-prescription::before{content:"\f572"}.fa-weight-scale::before{content:"\f496"}.fa-weight::before{content:"\f496"}.fa-user-group::before{content:"\f500"}.fa-user-friends::before{content:"\f500"}.fa-arrow-up-a-z::before{content:"\f15e"}.fa-sort-alpha-up::before{content:"\f15e"}.fa-chess-knight::before{content:"\f441"}.fa-face-laugh-squint::before{content:"\f59b"}.fa-laugh-squint::before{content:"\f59b"}.fa-wheelchair::before{content:"\f193"}.fa-circle-arrow-up::before{content:"\f0aa"}.fa-arrow-circle-up::before{content:"\f0aa"}.fa-toggle-on::before{content:"\f205"}.fa-person-walking::before{content:"\f554"}.fa-walking::before{content:"\f554"}.fa-l::before{content:"\4c"}.fa-fire::before{content:"\f06d"}.fa-bed-pulse::before{content:"\f487"}.fa-procedures::before{content:"\f487"}.fa-shuttle-space::before{content:"\f197"}.fa-space-shuttle::before{content:"\f197"}.fa-face-laugh::before{content:"\f599"}.fa-laugh::before{content:"\f599"}.fa-folder-open::before{content:"\f07c"}.fa-heart-circle-plus::before{content:"\e500"}.fa-code-fork::before{content:"\e13b"}.fa-city::before{content:"\f64f"}.fa-microphone-lines::before{content:"\f3c9"}.fa-microphone-alt::before{content:"\f3c9"}.fa-pepper-hot::before{content:"\f816"}.fa-unlock::before{content:"\f09c"}.fa-colon-sign::before{content:"\e140"}.fa-headset::before{content:"\f590"}.fa-store-slash::before{content:"\e071"}.fa-road-circle-xmark::before{content:"\e566"}.fa-user-minus::before{content:"\f503"}.fa-mars-stroke-up::before{content:"\f22a"}.fa-mars-stroke-v::before{content:"\f22a"}.fa-champagne-glasses::before{content:"\f79f"}.fa-glass-cheers::before{content:"\f79f"}.fa-clipboard::before{content:"\f328"}.fa-house-circle-exclamation::before{content:"\e50a"}.fa-file-arrow-up::before{content:"\f574"}.fa-file-upload::before{content:"\f574"}.fa-wifi::before{content:"\f1eb"}.fa-wifi-3::before{content:"\f1eb"}.fa-wifi-strong::before{content:"\f1eb"}.fa-bath::before{content:"\f2cd"}.fa-bathtub::before{content:"\f2cd"}.fa-underline::before{content:"\f0cd"}.fa-user-pen::before{content:"\f4ff"}.fa-user-edit::before{content:"\f4ff"}.fa-signature::before{content:"\f5b7"}.fa-stroopwafel::before{content:"\f551"}.fa-bold::before{content:"\f032"}.fa-anchor-lock::before{content:"\e4ad"}.fa-building-ngo::before{content:"\e4d7"}.fa-manat-sign::before{content:"\e1d5"}.fa-not-equal::before{content:"\f53e"}.fa-border-top-left::before{content:"\f853"}.fa-border-style::before{content:"\f853"}.fa-map-location-dot::before{content:"\f5a0"}.fa-map-marked-alt::before{content:"\f5a0"}.fa-jedi::before{content:"\f669"}.fa-square-poll-vertical::before{content:"\f681"}.fa-poll::before{content:"\f681"}.fa-mug-hot::before{content:"\f7b6"}.fa-car-battery::before{content:"\f5df"}.fa-battery-car::before{content:"\f5df"}.fa-gift::before{content:"\f06b"}.fa-dice-two::before{content:"\f528"}.fa-chess-queen::before{content:"\f445"}.fa-glasses::before{content:"\f530"}.fa-chess-board::before{content:"\f43c"}.fa-building-circle-check::before{content:"\e4d2"}.fa-person-chalkboard::before{content:"\e53d"}.fa-mars-stroke-right::before{content:"\f22b"}.fa-mars-stroke-h::before{content:"\f22b"}.fa-hand-back-fist::before{content:"\f255"}.fa-hand-rock::before{content:"\f255"}.fa-square-caret-up::before{content:"\f151"}.fa-caret-square-up::before{content:"\f151"}.fa-cloud-showers-water::before{content:"\e4e4"}.fa-chart-bar::before{content:"\f080"}.fa-bar-chart::before{content:"\f080"}.fa-hands-bubbles::before{content:"\e05e"}.fa-hands-wash::before{content:"\e05e"}.fa-less-than-equal::before{content:"\f537"}.fa-train::before{content:"\f238"}.fa-eye-low-vision::before{content:"\f2a8"}.fa-low-vision::before{content:"\f2a8"}.fa-crow::before{content:"\f520"}.fa-sailboat::before{content:"\e445"}.fa-window-restore::before{content:"\f2d2"}.fa-square-plus::before{content:"\f0fe"}.fa-plus-square::before{content:"\f0fe"}.fa-torii-gate::before{content:"\f6a1"}.fa-frog::before{content:"\f52e"}.fa-bucket::before{content:"\e4cf"}.fa-image::before{content:"\f03e"}.fa-microphone::before{content:"\f130"}.fa-cow::before{content:"\f6c8"}.fa-caret-up::before{content:"\f0d8"}.fa-screwdriver::before{content:"\f54a"}.fa-folder-closed::before{content:"\e185"}.fa-house-tsunami::before{content:"\e515"}.fa-square-nfi::before{content:"\e576"}.fa-arrow-up-from-ground-water::before{content:"\e4b5"}.fa-martini-glass::before{content:"\f57b"}.fa-glass-martini-alt::before{content:"\f57b"}.fa-rotate-left::before{content:"\f2ea"}.fa-rotate-back::before{content:"\f2ea"}.fa-rotate-backward::before{content:"\f2ea"}.fa-undo-alt::before{content:"\f2ea"}.fa-table-columns::before{content:"\f0db"}.fa-columns::before{content:"\f0db"}.fa-lemon::before{content:"\f094"}.fa-head-side-mask::before{content:"\e063"}.fa-handshake::before{content:"\f2b5"}.fa-gem::before{content:"\f3a5"}.fa-dolly::before{content:"\f472"}.fa-dolly-box::before{content:"\f472"}.fa-smoking::before{content:"\f48d"}.fa-minimize::before{content:"\f78c"}.fa-compress-arrows-alt::before{content:"\f78c"}.fa-monument::before{content:"\f5a6"}.fa-snowplow::before{content:"\f7d2"}.fa-angles-right::before{content:"\f101"}.fa-angle-double-right::before{content:"\f101"}.fa-cannabis::before{content:"\f55f"}.fa-circle-play::before{content:"\f144"}.fa-play-circle::before{content:"\f144"}.fa-tablets::before{content:"\f490"}.fa-ethernet::before{content:"\f796"}.fa-euro-sign::before{content:"\f153"}.fa-eur::before{content:"\f153"}.fa-euro::before{content:"\f153"}.fa-chair::before{content:"\f6c0"}.fa-circle-check::before{content:"\f058"}.fa-check-circle::before{content:"\f058"}.fa-circle-stop::before{content:"\f28d"}.fa-stop-circle::before{content:"\f28d"}.fa-compass-drafting::before{content:"\f568"}.fa-drafting-compass::before{content:"\f568"}.fa-plate-wheat::before{content:"\e55a"}.fa-icicles::before{content:"\f7ad"}.fa-person-shelter::before{content:"\e54f"}.fa-neuter::before{content:"\f22c"}.fa-id-badge::before{content:"\f2c1"}.fa-marker::before{content:"\f5a1"}.fa-face-laugh-beam::before{content:"\f59a"}.fa-laugh-beam::before{content:"\f59a"}.fa-helicopter-symbol::before{content:"\e502"}.fa-universal-access::before{content:"\f29a"}.fa-circle-chevron-up::before{content:"\f139"}.fa-chevron-circle-up::before{content:"\f139"}.fa-lari-sign::before{content:"\e1c8"}.fa-volcano::before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right::before{content:"\e553"}.fa-sterling-sign::before{content:"\f154"}.fa-gbp::before{content:"\f154"}.fa-pound-sign::before{content:"\f154"}.fa-viruses::before{content:"\e076"}.fa-square-person-confined::before{content:"\e577"}.fa-user-tie::before{content:"\f508"}.fa-arrow-down-long::before{content:"\f175"}.fa-long-arrow-down::before{content:"\f175"}.fa-tent-arrow-down-to-line::before{content:"\e57e"}.fa-certificate::before{content:"\f0a3"}.fa-reply-all::before{content:"\f122"}.fa-mail-reply-all::before{content:"\f122"}.fa-suitcase::before{content:"\f0f2"}.fa-person-skating::before{content:"\f7c5"}.fa-skating::before{content:"\f7c5"}.fa-filter-circle-dollar::before{content:"\f662"}.fa-funnel-dollar::before{content:"\f662"}.fa-camera-retro::before{content:"\f083"}.fa-circle-arrow-down::before{content:"\f0ab"}.fa-arrow-circle-down::before{content:"\f0ab"}.fa-file-import::before{content:"\f56f"}.fa-arrow-right-to-file::before{content:"\f56f"}.fa-square-arrow-up-right::before{content:"\f14c"}.fa-external-link-square::before{content:"\f14c"}.fa-box-open::before{content:"\f49e"}.fa-scroll::before{content:"\f70e"}.fa-spa::before{content:"\f5bb"}.fa-location-pin-lock::before{content:"\e51f"}.fa-pause::before{content:"\f04c"}.fa-hill-avalanche::before{content:"\e507"}.fa-temperature-empty::before{content:"\f2cb"}.fa-temperature-0::before{content:"\f2cb"}.fa-thermometer-0::before{content:"\f2cb"}.fa-thermometer-empty::before{content:"\f2cb"}.fa-bomb::before{content:"\f1e2"}.fa-registered::before{content:"\f25d"}.fa-address-card::before{content:"\f2bb"}.fa-contact-card::before{content:"\f2bb"}.fa-vcard::before{content:"\f2bb"}.fa-scale-unbalanced-flip::before{content:"\f516"}.fa-balance-scale-right::before{content:"\f516"}.fa-subscript::before{content:"\f12c"}.fa-diamond-turn-right::before{content:"\f5eb"}.fa-directions::before{content:"\f5eb"}.fa-burst::before{content:"\e4dc"}.fa-house-laptop::before{content:"\e066"}.fa-laptop-house::before{content:"\e066"}.fa-face-tired::before{content:"\f5c8"}.fa-tired::before{content:"\f5c8"}.fa-money-bills::before{content:"\e1f3"}.fa-smog::before{content:"\f75f"}.fa-crutch::before{content:"\f7f7"}.fa-cloud-arrow-up::before{content:"\f0ee"}.fa-cloud-upload::before{content:"\f0ee"}.fa-cloud-upload-alt::before{content:"\f0ee"}.fa-palette::before{content:"\f53f"}.fa-arrows-turn-right::before{content:"\e4c0"}.fa-vest::before{content:"\e085"}.fa-ferry::before{content:"\e4ea"}.fa-arrows-down-to-people::before{content:"\e4b9"}.fa-seedling::before{content:"\f4d8"}.fa-sprout::before{content:"\f4d8"}.fa-left-right::before{content:"\f337"}.fa-arrows-alt-h::before{content:"\f337"}.fa-boxes-packing::before{content:"\e4c7"}.fa-circle-arrow-left::before{content:"\f0a8"}.fa-arrow-circle-left::before{content:"\f0a8"}.fa-group-arrows-rotate::before{content:"\e4f6"}.fa-bowl-food::before{content:"\e4c6"}.fa-candy-cane::before{content:"\f786"}.fa-arrow-down-wide-short::before{content:"\f160"}.fa-sort-amount-asc::before{content:"\f160"}.fa-sort-amount-down::before{content:"\f160"}.fa-cloud-bolt::before{content:"\f76c"}.fa-thunderstorm::before{content:"\f76c"}.fa-text-slash::before{content:"\f87d"}.fa-remove-format::before{content:"\f87d"}.fa-face-smile-wink::before{content:"\f4da"}.fa-smile-wink::before{content:"\f4da"}.fa-file-word::before{content:"\f1c2"}.fa-file-powerpoint::before{content:"\f1c4"}.fa-arrows-left-right::before{content:"\f07e"}.fa-arrows-h::before{content:"\f07e"}.fa-house-lock::before{content:"\e510"}.fa-cloud-arrow-down::before{content:"\f0ed"}.fa-cloud-download::before{content:"\f0ed"}.fa-cloud-download-alt::before{content:"\f0ed"}.fa-children::before{content:"\e4e1"}.fa-chalkboard::before{content:"\f51b"}.fa-blackboard::before{content:"\f51b"}.fa-user-large-slash::before{content:"\f4fa"}.fa-user-alt-slash::before{content:"\f4fa"}.fa-envelope-open::before{content:"\f2b6"}.fa-handshake-simple-slash::before{content:"\e05f"}.fa-handshake-alt-slash::before{content:"\e05f"}.fa-mattress-pillow::before{content:"\e525"}.fa-guarani-sign::before{content:"\e19a"}.fa-arrows-rotate::before{content:"\f021"}.fa-refresh::before{content:"\f021"}.fa-sync::before{content:"\f021"}.fa-fire-extinguisher::before{content:"\f134"}.fa-cruzeiro-sign::before{content:"\e152"}.fa-greater-than-equal::before{content:"\f532"}.fa-shield-halved::before{content:"\f3ed"}.fa-shield-alt::before{content:"\f3ed"}.fa-book-atlas::before{content:"\f558"}.fa-atlas::before{content:"\f558"}.fa-virus::before{content:"\e074"}.fa-envelope-circle-check::before{content:"\e4e8"}.fa-layer-group::before{content:"\f5fd"}.fa-arrows-to-dot::before{content:"\e4be"}.fa-archway::before{content:"\f557"}.fa-heart-circle-check::before{content:"\e4fd"}.fa-house-chimney-crack::before{content:"\f6f1"}.fa-house-damage::before{content:"\f6f1"}.fa-file-zipper::before{content:"\f1c6"}.fa-file-archive::before{content:"\f1c6"}.fa-square::before{content:"\f0c8"}.fa-martini-glass-empty::before{content:"\f000"}.fa-glass-martini::before{content:"\f000"}.fa-couch::before{content:"\f4b8"}.fa-cedi-sign::before{content:"\e0df"}.fa-italic::before{content:"\f033"}.fa-church::before{content:"\f51d"}.fa-comments-dollar::before{content:"\f653"}.fa-democrat::before{content:"\f747"}.fa-z::before{content:"\5a"}.fa-person-skiing::before{content:"\f7c9"}.fa-skiing::before{content:"\f7c9"}.fa-road-lock::before{content:"\e567"}.fa-a::before{content:"\41"}.fa-temperature-arrow-down::before{content:"\e03f"}.fa-temperature-down::before{content:"\e03f"}.fa-feather-pointed::before{content:"\f56b"}.fa-feather-alt::before{content:"\f56b"}.fa-p::before{content:"\50"}.fa-snowflake::before{content:"\f2dc"}.fa-newspaper::before{content:"\f1ea"}.fa-rectangle-ad::before{content:"\f641"}.fa-ad::before{content:"\f641"}.fa-circle-arrow-right::before{content:"\f0a9"}.fa-arrow-circle-right::before{content:"\f0a9"}.fa-filter-circle-xmark::before{content:"\e17b"}.fa-locust::before{content:"\e520"}.fa-sort::before{content:"\f0dc"}.fa-unsorted::before{content:"\f0dc"}.fa-list-ol::before{content:"\f0cb"}.fa-list-1-2::before{content:"\f0cb"}.fa-list-numeric::before{content:"\f0cb"}.fa-person-dress-burst::before{content:"\e544"}.fa-money-check-dollar::before{content:"\f53d"}.fa-money-check-alt::before{content:"\f53d"}.fa-vector-square::before{content:"\f5cb"}.fa-bread-slice::before{content:"\f7ec"}.fa-language::before{content:"\f1ab"}.fa-face-kiss-wink-heart::before{content:"\f598"}.fa-kiss-wink-heart::before{content:"\f598"}.fa-filter::before{content:"\f0b0"}.fa-question::before{content:"\3f"}.fa-file-signature::before{content:"\f573"}.fa-up-down-left-right::before{content:"\f0b2"}.fa-arrows-alt::before{content:"\f0b2"}.fa-house-chimney-user::before{content:"\e065"}.fa-hand-holding-heart::before{content:"\f4be"}.fa-puzzle-piece::before{content:"\f12e"}.fa-money-check::before{content:"\f53c"}.fa-star-half-stroke::before{content:"\f5c0"}.fa-star-half-alt::before{content:"\f5c0"}.fa-code::before{content:"\f121"}.fa-whiskey-glass::before{content:"\f7a0"}.fa-glass-whiskey::before{content:"\f7a0"}.fa-building-circle-exclamation::before{content:"\e4d3"}.fa-magnifying-glass-chart::before{content:"\e522"}.fa-arrow-up-right-from-square::before{content:"\f08e"}.fa-external-link::before{content:"\f08e"}.fa-cubes-stacked::before{content:"\e4e6"}.fa-won-sign::before{content:"\f159"}.fa-krw::before{content:"\f159"}.fa-won::before{content:"\f159"}.fa-virus-covid::before{content:"\e4a8"}.fa-austral-sign::before{content:"\e0a9"}.fa-f::before{content:"\46"}.fa-leaf::before{content:"\f06c"}.fa-road::before{content:"\f018"}.fa-taxi::before{content:"\f1ba"}.fa-cab::before{content:"\f1ba"}.fa-person-circle-plus::before{content:"\e541"}.fa-chart-pie::before{content:"\f200"}.fa-pie-chart::before{content:"\f200"}.fa-bolt-lightning::before{content:"\e0b7"}.fa-sack-xmark::before{content:"\e56a"}.fa-file-excel::before{content:"\f1c3"}.fa-file-contract::before{content:"\f56c"}.fa-fish-fins::before{content:"\e4f2"}.fa-building-flag::before{content:"\e4d5"}.fa-face-grin-beam::before{content:"\f582"}.fa-grin-beam::before{content:"\f582"}.fa-object-ungroup::before{content:"\f248"}.fa-poop::before{content:"\f619"}.fa-location-pin::before{content:"\f041"}.fa-map-marker::before{content:"\f041"}.fa-kaaba::before{content:"\f66b"}.fa-toilet-paper::before{content:"\f71e"}.fa-helmet-safety::before{content:"\f807"}.fa-hard-hat::before{content:"\f807"}.fa-hat-hard::before{content:"\f807"}.fa-eject::before{content:"\f052"}.fa-circle-right::before{content:"\f35a"}.fa-arrow-alt-circle-right::before{content:"\f35a"}.fa-plane-circle-check::before{content:"\e555"}.fa-face-rolling-eyes::before{content:"\f5a5"}.fa-meh-rolling-eyes::before{content:"\f5a5"}.fa-object-group::before{content:"\f247"}.fa-chart-line::before{content:"\f201"}.fa-line-chart::before{content:"\f201"}.fa-mask-ventilator::before{content:"\e524"}.fa-arrow-right::before{content:"\f061"}.fa-signs-post::before{content:"\f277"}.fa-map-signs::before{content:"\f277"}.fa-cash-register::before{content:"\f788"}.fa-person-circle-question::before{content:"\e542"}.fa-h::before{content:"\48"}.fa-tarp::before{content:"\e57b"}.fa-screwdriver-wrench::before{content:"\f7d9"}.fa-tools::before{content:"\f7d9"}.fa-arrows-to-eye::before{content:"\e4bf"}.fa-plug-circle-bolt::before{content:"\e55b"}.fa-heart::before{content:"\f004"}.fa-mars-and-venus::before{content:"\f224"}.fa-house-user::before{content:"\e1b0"}.fa-home-user::before{content:"\e1b0"}.fa-dumpster-fire::before{content:"\f794"}.fa-house-crack::before{content:"\e3b1"}.fa-martini-glass-citrus::before{content:"\f561"}.fa-cocktail::before{content:"\f561"}.fa-face-surprise::before{content:"\f5c2"}.fa-surprise::before{content:"\f5c2"}.fa-bottle-water::before{content:"\e4c5"}.fa-circle-pause::before{content:"\f28b"}.fa-pause-circle::before{content:"\f28b"}.fa-toilet-paper-slash::before{content:"\e072"}.fa-apple-whole::before{content:"\f5d1"}.fa-apple-alt::before{content:"\f5d1"}.fa-kitchen-set::before{content:"\e51a"}.fa-r::before{content:"\52"}.fa-temperature-quarter::before{content:"\f2ca"}.fa-temperature-1::before{content:"\f2ca"}.fa-thermometer-1::before{content:"\f2ca"}.fa-thermometer-quarter::before{content:"\f2ca"}.fa-cube::before{content:"\f1b2"}.fa-bitcoin-sign::before{content:"\e0b4"}.fa-shield-dog::before{content:"\e573"}.fa-solar-panel::before{content:"\f5ba"}.fa-lock-open::before{content:"\f3c1"}.fa-elevator::before{content:"\e16d"}.fa-money-bill-transfer::before{content:"\e528"}.fa-money-bill-trend-up::before{content:"\e529"}.fa-house-flood-water-circle-arrow-right::before{content:"\e50f"}.fa-square-poll-horizontal::before{content:"\f682"}.fa-poll-h::before{content:"\f682"}.fa-circle::before{content:"\f111"}.fa-backward-fast::before{content:"\f049"}.fa-fast-backward::before{content:"\f049"}.fa-recycle::before{content:"\f1b8"}.fa-user-astronaut::before{content:"\f4fb"}.fa-plane-slash::before{content:"\e069"}.fa-trademark::before{content:"\f25c"}.fa-basketball::before{content:"\f434"}.fa-basketball-ball::before{content:"\f434"}.fa-satellite-dish::before{content:"\f7c0"}.fa-circle-up::before{content:"\f35b"}.fa-arrow-alt-circle-up::before{content:"\f35b"}.fa-mobile-screen-button::before{content:"\f3cd"}.fa-mobile-alt::before{content:"\f3cd"}.fa-volume-high::before{content:"\f028"}.fa-volume-up::before{content:"\f028"}.fa-users-rays::before{content:"\e593"}.fa-wallet::before{content:"\f555"}.fa-clipboard-check::before{content:"\f46c"}.fa-file-audio::before{content:"\f1c7"}.fa-burger::before{content:"\f805"}.fa-hamburger::before{content:"\f805"}.fa-wrench::before{content:"\f0ad"}.fa-bugs::before{content:"\e4d0"}.fa-rupee-sign::before{content:"\f156"}.fa-rupee::before{content:"\f156"}.fa-file-image::before{content:"\f1c5"}.fa-circle-question::before{content:"\f059"}.fa-question-circle::before{content:"\f059"}.fa-plane-departure::before{content:"\f5b0"}.fa-handshake-slash::before{content:"\e060"}.fa-book-bookmark::before{content:"\e0bb"}.fa-code-branch::before{content:"\f126"}.fa-hat-cowboy::before{content:"\f8c0"}.fa-bridge::before{content:"\e4c8"}.fa-phone-flip::before{content:"\f879"}.fa-phone-alt::before{content:"\f879"}.fa-truck-front::before{content:"\e2b7"}.fa-cat::before{content:"\f6be"}.fa-anchor-circle-exclamation::before{content:"\e4ab"}.fa-truck-field::before{content:"\e58d"}.fa-route::before{content:"\f4d7"}.fa-clipboard-question::before{content:"\e4e3"}.fa-panorama::before{content:"\e209"}.fa-comment-medical::before{content:"\f7f5"}.fa-teeth-open::before{content:"\f62f"}.fa-file-circle-minus::before{content:"\e4ed"}.fa-tags::before{content:"\f02c"}.fa-wine-glass::before{content:"\f4e3"}.fa-forward-fast::before{content:"\f050"}.fa-fast-forward::before{content:"\f050"}.fa-face-meh-blank::before{content:"\f5a4"}.fa-meh-blank::before{content:"\f5a4"}.fa-square-parking::before{content:"\f540"}.fa-parking::before{content:"\f540"}.fa-house-signal::before{content:"\e012"}.fa-bars-progress::before{content:"\f828"}.fa-tasks-alt::before{content:"\f828"}.fa-faucet-drip::before{content:"\e006"}.fa-cart-flatbed::before{content:"\f474"}.fa-dolly-flatbed::before{content:"\f474"}.fa-ban-smoking::before{content:"\f54d"}.fa-smoking-ban::before{content:"\f54d"}.fa-terminal::before{content:"\f120"}.fa-mobile-button::before{content:"\f10b"}.fa-house-medical-flag::before{content:"\e514"}.fa-basket-shopping::before{content:"\f291"}.fa-shopping-basket::before{content:"\f291"}.fa-tape::before{content:"\f4db"}.fa-bus-simple::before{content:"\f55e"}.fa-bus-alt::before{content:"\f55e"}.fa-eye::before{content:"\f06e"}.fa-face-sad-cry::before{content:"\f5b3"}.fa-sad-cry::before{content:"\f5b3"}.fa-audio-description::before{content:"\f29e"}.fa-person-military-to-person::before{content:"\e54c"}.fa-file-shield::before{content:"\e4f0"}.fa-user-slash::before{content:"\f506"}.fa-pen::before{content:"\f304"}.fa-tower-observation::before{content:"\e586"}.fa-file-code::before{content:"\f1c9"}.fa-signal::before{content:"\f012"}.fa-signal-5::before{content:"\f012"}.fa-signal-perfect::before{content:"\f012"}.fa-bus::before{content:"\f207"}.fa-heart-circle-xmark::before{content:"\e501"}.fa-house-chimney::before{content:"\e3af"}.fa-home-lg::before{content:"\e3af"}.fa-window-maximize::before{content:"\f2d0"}.fa-face-frown::before{content:"\f119"}.fa-frown::before{content:"\f119"}.fa-prescription::before{content:"\f5b1"}.fa-shop::before{content:"\f54f"}.fa-store-alt::before{content:"\f54f"}.fa-floppy-disk::before{content:"\f0c7"}.fa-save::before{content:"\f0c7"}.fa-vihara::before{content:"\f6a7"}.fa-scale-unbalanced::before{content:"\f515"}.fa-balance-scale-left::before{content:"\f515"}.fa-sort-up::before{content:"\f0de"}.fa-sort-asc::before{content:"\f0de"}.fa-comment-dots::before{content:"\f4ad"}.fa-commenting::before{content:"\f4ad"}.fa-plant-wilt::before{content:"\e5aa"}.fa-diamond::before{content:"\f219"}.fa-face-grin-squint::before{content:"\f585"}.fa-grin-squint::before{content:"\f585"}.fa-hand-holding-dollar::before{content:"\f4c0"}.fa-hand-holding-usd::before{content:"\f4c0"}.fa-bacterium::before{content:"\e05a"}.fa-hand-pointer::before{content:"\f25a"}.fa-drum-steelpan::before{content:"\f56a"}.fa-hand-scissors::before{content:"\f257"}.fa-hands-praying::before{content:"\f684"}.fa-praying-hands::before{content:"\f684"}.fa-arrow-rotate-right::before{content:"\f01e"}.fa-arrow-right-rotate::before{content:"\f01e"}.fa-arrow-rotate-forward::before{content:"\f01e"}.fa-redo::before{content:"\f01e"}.fa-biohazard::before{content:"\f780"}.fa-location-crosshairs::before{content:"\f601"}.fa-location::before{content:"\f601"}.fa-mars-double::before{content:"\f227"}.fa-child-dress::before{content:"\e59c"}.fa-users-between-lines::before{content:"\e591"}.fa-lungs-virus::before{content:"\e067"}.fa-face-grin-tears::before{content:"\f588"}.fa-grin-tears::before{content:"\f588"}.fa-phone::before{content:"\f095"}.fa-calendar-xmark::before{content:"\f273"}.fa-calendar-times::before{content:"\f273"}.fa-child-reaching::before{content:"\e59d"}.fa-head-side-virus::before{content:"\e064"}.fa-user-gear::before{content:"\f4fe"}.fa-user-cog::before{content:"\f4fe"}.fa-arrow-up-1-9::before{content:"\f163"}.fa-sort-numeric-up::before{content:"\f163"}.fa-door-closed::before{content:"\f52a"}.fa-shield-virus::before{content:"\e06c"}.fa-dice-six::before{content:"\f526"}.fa-mosquito-net::before{content:"\e52c"}.fa-bridge-water::before{content:"\e4ce"}.fa-person-booth::before{content:"\f756"}.fa-text-width::before{content:"\f035"}.fa-hat-wizard::before{content:"\f6e8"}.fa-pen-fancy::before{content:"\f5ac"}.fa-person-digging::before{content:"\f85e"}.fa-digging::before{content:"\f85e"}.fa-trash::before{content:"\f1f8"}.fa-gauge-simple::before{content:"\f629"}.fa-gauge-simple-med::before{content:"\f629"}.fa-tachometer-average::before{content:"\f629"}.fa-book-medical::before{content:"\f7e6"}.fa-poo::before{content:"\f2fe"}.fa-quote-right::before{content:"\f10e"}.fa-quote-right-alt::before{content:"\f10e"}.fa-shirt::before{content:"\f553"}.fa-t-shirt::before{content:"\f553"}.fa-tshirt::before{content:"\f553"}.fa-cubes::before{content:"\f1b3"}.fa-divide::before{content:"\f529"}.fa-tenge-sign::before{content:"\f7d7"}.fa-tenge::before{content:"\f7d7"}.fa-headphones::before{content:"\f025"}.fa-hands-holding::before{content:"\f4c2"}.fa-hands-clapping::before{content:"\e1a8"}.fa-republican::before{content:"\f75e"}.fa-arrow-left::before{content:"\f060"}.fa-person-circle-xmark::before{content:"\e543"}.fa-ruler::before{content:"\f545"}.fa-align-left::before{content:"\f036"}.fa-dice-d6::before{content:"\f6d1"}.fa-restroom::before{content:"\f7bd"}.fa-j::before{content:"\4a"}.fa-users-viewfinder::before{content:"\e595"}.fa-file-video::before{content:"\f1c8"}.fa-up-right-from-square::before{content:"\f35d"}.fa-external-link-alt::before{content:"\f35d"}.fa-table-cells::before{content:"\f00a"}.fa-th::before{content:"\f00a"}.fa-file-pdf::before{content:"\f1c1"}.fa-book-bible::before{content:"\f647"}.fa-bible::before{content:"\f647"}.fa-o::before{content:"\4f"}.fa-suitcase-medical::before{content:"\f0fa"}.fa-medkit::before{content:"\f0fa"}.fa-user-secret::before{content:"\f21b"}.fa-otter::before{content:"\f700"}.fa-person-dress::before{content:"\f182"}.fa-female::before{content:"\f182"}.fa-comment-dollar::before{content:"\f651"}.fa-business-time::before{content:"\f64a"}.fa-briefcase-clock::before{content:"\f64a"}.fa-table-cells-large::before{content:"\f009"}.fa-th-large::before{content:"\f009"}.fa-book-tanakh::before{content:"\f827"}.fa-tanakh::before{content:"\f827"}.fa-phone-volume::before{content:"\f2a0"}.fa-volume-control-phone::before{content:"\f2a0"}.fa-hat-cowboy-side::before{content:"\f8c1"}.fa-clipboard-user::before{content:"\f7f3"}.fa-child::before{content:"\f1ae"}.fa-lira-sign::before{content:"\f195"}.fa-satellite::before{content:"\f7bf"}.fa-plane-lock::before{content:"\e558"}.fa-tag::before{content:"\f02b"}.fa-comment::before{content:"\f075"}.fa-cake-candles::before{content:"\f1fd"}.fa-birthday-cake::before{content:"\f1fd"}.fa-cake::before{content:"\f1fd"}.fa-envelope::before{content:"\f0e0"}.fa-angles-up::before{content:"\f102"}.fa-angle-double-up::before{content:"\f102"}.fa-paperclip::before{content:"\f0c6"}.fa-arrow-right-to-city::before{content:"\e4b3"}.fa-ribbon::before{content:"\f4d6"}.fa-lungs::before{content:"\f604"}.fa-arrow-up-9-1::before{content:"\f887"}.fa-sort-numeric-up-alt::before{content:"\f887"}.fa-litecoin-sign::before{content:"\e1d3"}.fa-border-none::before{content:"\f850"}.fa-circle-nodes::before{content:"\e4e2"}.fa-parachute-box::before{content:"\f4cd"}.fa-indent::before{content:"\f03c"}.fa-truck-field-un::before{content:"\e58e"}.fa-hourglass::before{content:"\f254"}.fa-hourglass-empty::before{content:"\f254"}.fa-mountain::before{content:"\f6fc"}.fa-user-doctor::before{content:"\f0f0"}.fa-user-md::before{content:"\f0f0"}.fa-circle-info::before{content:"\f05a"}.fa-info-circle::before{content:"\f05a"}.fa-cloud-meatball::before{content:"\f73b"}.fa-camera::before{content:"\f030"}.fa-camera-alt::before{content:"\f030"}.fa-square-virus::before{content:"\e578"}.fa-meteor::before{content:"\f753"}.fa-car-on::before{content:"\e4dd"}.fa-sleigh::before{content:"\f7cc"}.fa-arrow-down-1-9::before{content:"\f162"}.fa-sort-numeric-asc::before{content:"\f162"}.fa-sort-numeric-down::before{content:"\f162"}.fa-hand-holding-droplet::before{content:"\f4c1"}.fa-hand-holding-water::before{content:"\f4c1"}.fa-water::before{content:"\f773"}.fa-calendar-check::before{content:"\f274"}.fa-braille::before{content:"\f2a1"}.fa-prescription-bottle-medical::before{content:"\f486"}.fa-prescription-bottle-alt::before{content:"\f486"}.fa-landmark::before{content:"\f66f"}.fa-truck::before{content:"\f0d1"}.fa-crosshairs::before{content:"\f05b"}.fa-person-cane::before{content:"\e53c"}.fa-tent::before{content:"\e57d"}.fa-vest-patches::before{content:"\e086"}.fa-check-double::before{content:"\f560"}.fa-arrow-down-a-z::before{content:"\f15d"}.fa-sort-alpha-asc::before{content:"\f15d"}.fa-sort-alpha-down::before{content:"\f15d"}.fa-money-bill-wheat::before{content:"\e52a"}.fa-cookie::before{content:"\f563"}.fa-arrow-rotate-left::before{content:"\f0e2"}.fa-arrow-left-rotate::before{content:"\f0e2"}.fa-arrow-rotate-back::before{content:"\f0e2"}.fa-arrow-rotate-backward::before{content:"\f0e2"}.fa-undo::before{content:"\f0e2"}.fa-hard-drive::before{content:"\f0a0"}.fa-hdd::before{content:"\f0a0"}.fa-face-grin-squint-tears::before{content:"\f586"}.fa-grin-squint-tears::before{content:"\f586"}.fa-dumbbell::before{content:"\f44b"}.fa-rectangle-list::before{content:"\f022"}.fa-list-alt::before{content:"\f022"}.fa-tarp-droplet::before{content:"\e57c"}.fa-house-medical-circle-check::before{content:"\e511"}.fa-person-skiing-nordic::before{content:"\f7ca"}.fa-skiing-nordic::before{content:"\f7ca"}.fa-calendar-plus::before{content:"\f271"}.fa-plane-arrival::before{content:"\f5af"}.fa-circle-left::before{content:"\f359"}.fa-arrow-alt-circle-left::before{content:"\f359"}.fa-train-subway::before{content:"\f239"}.fa-subway::before{content:"\f239"}.fa-chart-gantt::before{content:"\e0e4"}.fa-indian-rupee-sign::before{content:"\e1bc"}.fa-indian-rupee::before{content:"\e1bc"}.fa-inr::before{content:"\e1bc"}.fa-crop-simple::before{content:"\f565"}.fa-crop-alt::before{content:"\f565"}.fa-money-bill-1::before{content:"\f3d1"}.fa-money-bill-alt::before{content:"\f3d1"}.fa-left-long::before{content:"\f30a"}.fa-long-arrow-alt-left::before{content:"\f30a"}.fa-dna::before{content:"\f471"}.fa-virus-slash::before{content:"\e075"}.fa-minus::before{content:"\f068"}.fa-subtract::before{content:"\f068"}.fa-chess::before{content:"\f439"}.fa-arrow-left-long::before{content:"\f177"}.fa-long-arrow-left::before{content:"\f177"}.fa-plug-circle-check::before{content:"\e55c"}.fa-street-view::before{content:"\f21d"}.fa-franc-sign::before{content:"\e18f"}.fa-volume-off::before{content:"\f026"}.fa-hands-asl-interpreting::before{content:"\f2a3"}.fa-american-sign-language-interpreting::before{content:"\f2a3"}.fa-asl-interpreting::before{content:"\f2a3"}.fa-hands-american-sign-language-interpreting::before{content:"\f2a3"}.fa-gear::before{content:"\f013"}.fa-cog::before{content:"\f013"}.fa-droplet-slash::before{content:"\f5c7"}.fa-tint-slash::before{content:"\f5c7"}.fa-mosque::before{content:"\f678"}.fa-mosquito::before{content:"\e52b"}.fa-star-of-david::before{content:"\f69a"}.fa-person-military-rifle::before{content:"\e54b"}.fa-cart-shopping::before{content:"\f07a"}.fa-shopping-cart::before{content:"\f07a"}.fa-vials::before{content:"\f493"}.fa-plug-circle-plus::before{content:"\e55f"}.fa-place-of-worship::before{content:"\f67f"}.fa-grip-vertical::before{content:"\f58e"}.fa-arrow-turn-up::before{content:"\f148"}.fa-level-up::before{content:"\f148"}.fa-u::before{content:"\55"}.fa-square-root-variable::before{content:"\f698"}.fa-square-root-alt::before{content:"\f698"}.fa-clock::before{content:"\f017"}.fa-clock-four::before{content:"\f017"}.fa-backward-step::before{content:"\f048"}.fa-step-backward::before{content:"\f048"}.fa-pallet::before{content:"\f482"}.fa-faucet::before{content:"\e005"}.fa-baseball-bat-ball::before{content:"\f432"}.fa-s::before{content:"\53"}.fa-timeline::before{content:"\e29c"}.fa-keyboard::before{content:"\f11c"}.fa-caret-down::before{content:"\f0d7"}.fa-house-chimney-medical::before{content:"\f7f2"}.fa-clinic-medical::before{content:"\f7f2"}.fa-temperature-three-quarters::before{content:"\f2c8"}.fa-temperature-3::before{content:"\f2c8"}.fa-thermometer-3::before{content:"\f2c8"}.fa-thermometer-three-quarters::before{content:"\f2c8"}.fa-mobile-screen::before{content:"\f3cf"}.fa-mobile-android-alt::before{content:"\f3cf"}.fa-plane-up::before{content:"\e22d"}.fa-piggy-bank::before{content:"\f4d3"}.fa-battery-half::before{content:"\f242"}.fa-battery-3::before{content:"\f242"}.fa-mountain-city::before{content:"\e52e"}.fa-coins::before{content:"\f51e"}.fa-khanda::before{content:"\f66d"}.fa-sliders::before{content:"\f1de"}.fa-sliders-h::before{content:"\f1de"}.fa-folder-tree::before{content:"\f802"}.fa-network-wired::before{content:"\f6ff"}.fa-map-pin::before{content:"\f276"}.fa-hamsa::before{content:"\f665"}.fa-cent-sign::before{content:"\e3f5"}.fa-flask::before{content:"\f0c3"}.fa-person-pregnant::before{content:"\e31e"}.fa-wand-sparkles::before{content:"\f72b"}.fa-ellipsis-vertical::before{content:"\f142"}.fa-ellipsis-v::before{content:"\f142"}.fa-ticket::before{content:"\f145"}.fa-power-off::before{content:"\f011"}.fa-right-long::before{content:"\f30b"}.fa-long-arrow-alt-right::before{content:"\f30b"}.fa-flag-usa::before{content:"\f74d"}.fa-laptop-file::before{content:"\e51d"}.fa-tty::before{content:"\f1e4"}.fa-teletype::before{content:"\f1e4"}.fa-diagram-next::before{content:"\e476"}.fa-person-rifle::before{content:"\e54e"}.fa-house-medical-circle-exclamation::before{content:"\e512"}.fa-closed-captioning::before{content:"\f20a"}.fa-person-hiking::before{content:"\f6ec"}.fa-hiking::before{content:"\f6ec"}.fa-venus-double::before{content:"\f226"}.fa-images::before{content:"\f302"}.fa-calculator::before{content:"\f1ec"}.fa-people-pulling::before{content:"\e535"}.fa-n::before{content:"\4e"}.fa-cable-car::before{content:"\f7da"}.fa-tram::before{content:"\f7da"}.fa-cloud-rain::before{content:"\f73d"}.fa-building-circle-xmark::before{content:"\e4d4"}.fa-ship::before{content:"\f21a"}.fa-arrows-down-to-line::before{content:"\e4b8"}.fa-download::before{content:"\f019"}.fa-face-grin::before{content:"\f580"}.fa-grin::before{content:"\f580"}.fa-delete-left::before{content:"\f55a"}.fa-backspace::before{content:"\f55a"}.fa-eye-dropper::before{content:"\f1fb"}.fa-eye-dropper-empty::before{content:"\f1fb"}.fa-eyedropper::before{content:"\f1fb"}.fa-file-circle-check::before{content:"\e5a0"}.fa-forward::before{content:"\f04e"}.fa-mobile::before{content:"\f3ce"}.fa-mobile-android::before{content:"\f3ce"}.fa-mobile-phone::before{content:"\f3ce"}.fa-face-meh::before{content:"\f11a"}.fa-meh::before{content:"\f11a"}.fa-align-center::before{content:"\f037"}.fa-book-skull::before{content:"\f6b7"}.fa-book-dead::before{content:"\f6b7"}.fa-id-card::before{content:"\f2c2"}.fa-drivers-license::before{content:"\f2c2"}.fa-outdent::before{content:"\f03b"}.fa-dedent::before{content:"\f03b"}.fa-heart-circle-exclamation::before{content:"\e4fe"}.fa-house::before{content:"\f015"}.fa-home::before{content:"\f015"}.fa-home-alt::before{content:"\f015"}.fa-home-lg-alt::before{content:"\f015"}.fa-calendar-week::before{content:"\f784"}.fa-laptop-medical::before{content:"\f812"}.fa-b::before{content:"\42"}.fa-file-medical::before{content:"\f477"}.fa-dice-one::before{content:"\f525"}.fa-kiwi-bird::before{content:"\f535"}.fa-arrow-right-arrow-left::before{content:"\f0ec"}.fa-exchange::before{content:"\f0ec"}.fa-rotate-right::before{content:"\f2f9"}.fa-redo-alt::before{content:"\f2f9"}.fa-rotate-forward::before{content:"\f2f9"}.fa-utensils::before{content:"\f2e7"}.fa-cutlery::before{content:"\f2e7"}.fa-arrow-up-wide-short::before{content:"\f161"}.fa-sort-amount-up::before{content:"\f161"}.fa-mill-sign::before{content:"\e1ed"}.fa-bowl-rice::before{content:"\e2eb"}.fa-skull::before{content:"\f54c"}.fa-tower-broadcast::before{content:"\f519"}.fa-broadcast-tower::before{content:"\f519"}.fa-truck-pickup::before{content:"\f63c"}.fa-up-long::before{content:"\f30c"}.fa-long-arrow-alt-up::before{content:"\f30c"}.fa-stop::before{content:"\f04d"}.fa-code-merge::before{content:"\f387"}.fa-upload::before{content:"\f093"}.fa-hurricane::before{content:"\f751"}.fa-mound::before{content:"\e52d"}.fa-toilet-portable::before{content:"\e583"}.fa-compact-disc::before{content:"\f51f"}.fa-file-arrow-down::before{content:"\f56d"}.fa-file-download::before{content:"\f56d"}.fa-caravan::before{content:"\f8ff"}.fa-shield-cat::before{content:"\e572"}.fa-bolt::before{content:"\f0e7"}.fa-zap::before{content:"\f0e7"}.fa-glass-water::before{content:"\e4f4"}.fa-oil-well::before{content:"\e532"}.fa-vault::before{content:"\e2c5"}.fa-mars::before{content:"\f222"}.fa-toilet::before{content:"\f7d8"}.fa-plane-circle-xmark::before{content:"\e557"}.fa-yen-sign::before{content:"\f157"}.fa-cny::before{content:"\f157"}.fa-jpy::before{content:"\f157"}.fa-rmb::before{content:"\f157"}.fa-yen::before{content:"\f157"}.fa-ruble-sign::before{content:"\f158"}.fa-rouble::before{content:"\f158"}.fa-rub::before{content:"\f158"}.fa-ruble::before{content:"\f158"}.fa-sun::before{content:"\f185"}.fa-guitar::before{content:"\f7a6"}.fa-face-laugh-wink::before{content:"\f59c"}.fa-laugh-wink::before{content:"\f59c"}.fa-horse-head::before{content:"\f7ab"}.fa-bore-hole::before{content:"\e4c3"}.fa-industry::before{content:"\f275"}.fa-circle-down::before{content:"\f358"}.fa-arrow-alt-circle-down::before{content:"\f358"}.fa-arrows-turn-to-dots::before{content:"\e4c1"}.fa-florin-sign::before{content:"\e184"}.fa-arrow-down-short-wide::before{content:"\f884"}.fa-sort-amount-desc::before{content:"\f884"}.fa-sort-amount-down-alt::before{content:"\f884"}.fa-less-than::before{content:"\3c"}.fa-angle-down::before{content:"\f107"}.fa-car-tunnel::before{content:"\e4de"}.fa-head-side-cough::before{content:"\e061"}.fa-grip-lines::before{content:"\f7a4"}.fa-thumbs-down::before{content:"\f165"}.fa-user-lock::before{content:"\f502"}.fa-arrow-right-long::before{content:"\f178"}.fa-long-arrow-right::before{content:"\f178"}.fa-anchor-circle-xmark::before{content:"\e4ac"}.fa-ellipsis::before{content:"\f141"}.fa-ellipsis-h::before{content:"\f141"}.fa-chess-pawn::before{content:"\f443"}.fa-kit-medical::before{content:"\f479"}.fa-first-aid::before{content:"\f479"}.fa-person-through-window::before{content:"\e5a9"}.fa-toolbox::before{content:"\f552"}.fa-hands-holding-circle::before{content:"\e4fb"}.fa-bug::before{content:"\f188"}.fa-credit-card::before{content:"\f09d"}.fa-credit-card-alt::before{content:"\f09d"}.fa-car::before{content:"\f1b9"}.fa-automobile::before{content:"\f1b9"}.fa-hand-holding-hand::before{content:"\e4f7"}.fa-book-open-reader::before{content:"\f5da"}.fa-book-reader::before{content:"\f5da"}.fa-mountain-sun::before{content:"\e52f"}.fa-arrows-left-right-to-line::before{content:"\e4ba"}.fa-dice-d20::before{content:"\f6cf"}.fa-truck-droplet::before{content:"\e58c"}.fa-file-circle-xmark::before{content:"\e5a1"}.fa-temperature-arrow-up::before{content:"\e040"}.fa-temperature-up::before{content:"\e040"}.fa-medal::before{content:"\f5a2"}.fa-bed::before{content:"\f236"}.fa-square-h::before{content:"\f0fd"}.fa-h-square::before{content:"\f0fd"}.fa-podcast::before{content:"\f2ce"}.fa-temperature-full::before{content:"\f2c7"}.fa-temperature-4::before{content:"\f2c7"}.fa-thermometer-4::before{content:"\f2c7"}.fa-thermometer-full::before{content:"\f2c7"}.fa-bell::before{content:"\f0f3"}.fa-superscript::before{content:"\f12b"}.fa-plug-circle-xmark::before{content:"\e560"}.fa-star-of-life::before{content:"\f621"}.fa-phone-slash::before{content:"\f3dd"}.fa-paint-roller::before{content:"\f5aa"}.fa-handshake-angle::before{content:"\f4c4"}.fa-hands-helping::before{content:"\f4c4"}.fa-location-dot::before{content:"\f3c5"}.fa-map-marker-alt::before{content:"\f3c5"}.fa-file::before{content:"\f15b"}.fa-greater-than::before{content:"\3e"}.fa-person-swimming::before{content:"\f5c4"}.fa-swimmer::before{content:"\f5c4"}.fa-arrow-down::before{content:"\f063"}.fa-droplet::before{content:"\f043"}.fa-tint::before{content:"\f043"}.fa-eraser::before{content:"\f12d"}.fa-earth-americas::before{content:"\f57d"}.fa-earth::before{content:"\f57d"}.fa-earth-america::before{content:"\f57d"}.fa-globe-americas::before{content:"\f57d"}.fa-person-burst::before{content:"\e53b"}.fa-dove::before{content:"\f4ba"}.fa-battery-empty::before{content:"\f244"}.fa-battery-0::before{content:"\f244"}.fa-socks::before{content:"\f696"}.fa-inbox::before{content:"\f01c"}.fa-section::before{content:"\e447"}.fa-gauge-high::before{content:"\f625"}.fa-tachometer-alt::before{content:"\f625"}.fa-tachometer-alt-fast::before{content:"\f625"}.fa-envelope-open-text::before{content:"\f658"}.fa-hospital::before{content:"\f0f8"}.fa-hospital-alt::before{content:"\f0f8"}.fa-hospital-wide::before{content:"\f0f8"}.fa-wine-bottle::before{content:"\f72f"}.fa-chess-rook::before{content:"\f447"}.fa-bars-staggered::before{content:"\f550"}.fa-reorder::before{content:"\f550"}.fa-stream::before{content:"\f550"}.fa-dharmachakra::before{content:"\f655"}.fa-hotdog::before{content:"\f80f"}.fa-person-walking-with-cane::before{content:"\f29d"}.fa-blind::before{content:"\f29d"}.fa-drum::before{content:"\f569"}.fa-ice-cream::before{content:"\f810"}.fa-heart-circle-bolt::before{content:"\e4fc"}.fa-fax::before{content:"\f1ac"}.fa-paragraph::before{content:"\f1dd"}.fa-check-to-slot::before{content:"\f772"}.fa-vote-yea::before{content:"\f772"}.fa-star-half::before{content:"\f089"}.fa-boxes-stacked::before{content:"\f468"}.fa-boxes::before{content:"\f468"}.fa-boxes-alt::before{content:"\f468"}.fa-link::before{content:"\f0c1"}.fa-chain::before{content:"\f0c1"}.fa-ear-listen::before{content:"\f2a2"}.fa-assistive-listening-systems::before{content:"\f2a2"}.fa-tree-city::before{content:"\e587"}.fa-play::before{content:"\f04b"}.fa-font::before{content:"\f031"}.fa-rupiah-sign::before{content:"\e23d"}.fa-magnifying-glass::before{content:"\f002"}.fa-search::before{content:"\f002"}.fa-table-tennis-paddle-ball::before{content:"\f45d"}.fa-ping-pong-paddle-ball::before{content:"\f45d"}.fa-table-tennis::before{content:"\f45d"}.fa-person-dots-from-line::before{content:"\f470"}.fa-diagnoses::before{content:"\f470"}.fa-trash-can-arrow-up::before{content:"\f82a"}.fa-trash-restore-alt::before{content:"\f82a"}.fa-naira-sign::before{content:"\e1f6"}.fa-cart-arrow-down::before{content:"\f218"}.fa-walkie-talkie::before{content:"\f8ef"}.fa-file-pen::before{content:"\f31c"}.fa-file-edit::before{content:"\f31c"}.fa-receipt::before{content:"\f543"}.fa-square-pen::before{content:"\f14b"}.fa-pen-square::before{content:"\f14b"}.fa-pencil-square::before{content:"\f14b"}.fa-suitcase-rolling::before{content:"\f5c1"}.fa-person-circle-exclamation::before{content:"\e53f"}.fa-chevron-down::before{content:"\f078"}.fa-battery-full::before{content:"\f240"}.fa-battery::before{content:"\f240"}.fa-battery-5::before{content:"\f240"}.fa-skull-crossbones::before{content:"\f714"}.fa-code-compare::before{content:"\e13a"}.fa-list-ul::before{content:"\f0ca"}.fa-list-dots::before{content:"\f0ca"}.fa-school-lock::before{content:"\e56f"}.fa-tower-cell::before{content:"\e585"}.fa-down-long::before{content:"\f309"}.fa-long-arrow-alt-down::before{content:"\f309"}.fa-ranking-star::before{content:"\e561"}.fa-chess-king::before{content:"\f43f"}.fa-person-harassing::before{content:"\e549"}.fa-brazilian-real-sign::before{content:"\e46c"}.fa-landmark-dome::before{content:"\f752"}.fa-landmark-alt::before{content:"\f752"}.fa-arrow-up::before{content:"\f062"}.fa-tv::before{content:"\f26c"}.fa-television::before{content:"\f26c"}.fa-tv-alt::before{content:"\f26c"}.fa-shrimp::before{content:"\e448"}.fa-list-check::before{content:"\f0ae"}.fa-tasks::before{content:"\f0ae"}.fa-jug-detergent::before{content:"\e519"}.fa-circle-user::before{content:"\f2bd"}.fa-user-circle::before{content:"\f2bd"}.fa-user-shield::before{content:"\f505"}.fa-wind::before{content:"\f72e"}.fa-car-burst::before{content:"\f5e1"}.fa-car-crash::before{content:"\f5e1"}.fa-y::before{content:"\59"}.fa-person-snowboarding::before{content:"\f7ce"}.fa-snowboarding::before{content:"\f7ce"}.fa-truck-fast::before{content:"\f48b"}.fa-shipping-fast::before{content:"\f48b"}.fa-fish::before{content:"\f578"}.fa-user-graduate::before{content:"\f501"}.fa-circle-half-stroke::before{content:"\f042"}.fa-adjust::before{content:"\f042"}.fa-clapperboard::before{content:"\e131"}.fa-circle-radiation::before{content:"\f7ba"}.fa-radiation-alt::before{content:"\f7ba"}.fa-baseball::before{content:"\f433"}.fa-baseball-ball::before{content:"\f433"}.fa-jet-fighter-up::before{content:"\e518"}.fa-diagram-project::before{content:"\f542"}.fa-project-diagram::before{content:"\f542"}.fa-copy::before{content:"\f0c5"}.fa-volume-xmark::before{content:"\f6a9"}.fa-volume-mute::before{content:"\f6a9"}.fa-volume-times::before{content:"\f6a9"}.fa-hand-sparkles::before{content:"\e05d"}.fa-grip::before{content:"\f58d"}.fa-grip-horizontal::before{content:"\f58d"}.fa-share-from-square::before{content:"\f14d"}.fa-share-square::before{content:"\f14d"}.fa-child-combatant::before{content:"\e4e0"}.fa-child-rifle::before{content:"\e4e0"}.fa-gun::before{content:"\e19b"}.fa-square-phone::before{content:"\f098"}.fa-phone-square::before{content:"\f098"}.fa-plus::before{content:"\2b"}.fa-add::before{content:"\2b"}.fa-expand::before{content:"\f065"}.fa-computer::before{content:"\e4e5"}.fa-xmark::before{content:"\f00d"}.fa-close::before{content:"\f00d"}.fa-multiply::before{content:"\f00d"}.fa-remove::before{content:"\f00d"}.fa-times::before{content:"\f00d"}.fa-arrows-up-down-left-right::before{content:"\f047"}.fa-arrows::before{content:"\f047"}.fa-chalkboard-user::before{content:"\f51c"}.fa-chalkboard-teacher::before{content:"\f51c"}.fa-peso-sign::before{content:"\e222"}.fa-building-shield::before{content:"\e4d8"}.fa-baby::before{content:"\f77c"}.fa-users-line::before{content:"\e592"}.fa-quote-left::before{content:"\f10d"}.fa-quote-left-alt::before{content:"\f10d"}.fa-tractor::before{content:"\f722"}.fa-trash-arrow-up::before{content:"\f829"}.fa-trash-restore::before{content:"\f829"}.fa-arrow-down-up-lock::before{content:"\e4b0"}.fa-lines-leaning::before{content:"\e51e"}.fa-ruler-combined::before{content:"\f546"}.fa-copyright::before{content:"\f1f9"}.fa-equals::before{content:"\3d"}.fa-blender::before{content:"\f517"}.fa-teeth::before{content:"\f62e"}.fa-shekel-sign::before{content:"\f20b"}.fa-ils::before{content:"\f20b"}.fa-shekel::before{content:"\f20b"}.fa-sheqel::before{content:"\f20b"}.fa-sheqel-sign::before{content:"\f20b"}.fa-map::before{content:"\f279"}.fa-rocket::before{content:"\f135"}.fa-photo-film::before{content:"\f87c"}.fa-photo-video::before{content:"\f87c"}.fa-folder-minus::before{content:"\f65d"}.fa-store::before{content:"\f54e"}.fa-arrow-trend-up::before{content:"\e098"}.fa-plug-circle-minus::before{content:"\e55e"}.fa-sign-hanging::before{content:"\f4d9"}.fa-sign::before{content:"\f4d9"}.fa-bezier-curve::before{content:"\f55b"}.fa-bell-slash::before{content:"\f1f6"}.fa-tablet::before{content:"\f3fb"}.fa-tablet-android::before{content:"\f3fb"}.fa-school-flag::before{content:"\e56e"}.fa-fill::before{content:"\f575"}.fa-angle-up::before{content:"\f106"}.fa-drumstick-bite::before{content:"\f6d7"}.fa-holly-berry::before{content:"\f7aa"}.fa-chevron-left::before{content:"\f053"}.fa-bacteria::before{content:"\e059"}.fa-hand-lizard::before{content:"\f258"}.fa-notdef::before{content:"\e1fe"}.fa-disease::before{content:"\f7fa"}.fa-briefcase-medical::before{content:"\f469"}.fa-genderless::before{content:"\f22d"}.fa-chevron-right::before{content:"\f054"}.fa-retweet::before{content:"\f079"}.fa-car-rear::before{content:"\f5de"}.fa-car-alt::before{content:"\f5de"}.fa-pump-soap::before{content:"\e06b"}.fa-video-slash::before{content:"\f4e2"}.fa-battery-quarter::before{content:"\f243"}.fa-battery-2::before{content:"\f243"}.fa-radio::before{content:"\f8d7"}.fa-baby-carriage::before{content:"\f77d"}.fa-carriage-baby::before{content:"\f77d"}.fa-traffic-light::before{content:"\f637"}.fa-thermometer::before{content:"\f491"}.fa-vr-cardboard::before{content:"\f729"}.fa-hand-middle-finger::before{content:"\f806"}.fa-percent::before{content:"\25"}.fa-percentage::before{content:"\25"}.fa-truck-moving::before{content:"\f4df"}.fa-glass-water-droplet::before{content:"\e4f5"}.fa-display::before{content:"\e163"}.fa-face-smile::before{content:"\f118"}.fa-smile::before{content:"\f118"}.fa-thumbtack::before{content:"\f08d"}.fa-thumb-tack::before{content:"\f08d"}.fa-trophy::before{content:"\f091"}.fa-person-praying::before{content:"\f683"}.fa-pray::before{content:"\f683"}.fa-hammer::before{content:"\f6e3"}.fa-hand-peace::before{content:"\f25b"}.fa-rotate::before{content:"\f2f1"}.fa-sync-alt::before{content:"\f2f1"}.fa-spinner::before{content:"\f110"}.fa-robot::before{content:"\f544"}.fa-peace::before{content:"\f67c"}.fa-gears::before{content:"\f085"}.fa-cogs::before{content:"\f085"}.fa-warehouse::before{content:"\f494"}.fa-arrow-up-right-dots::before{content:"\e4b7"}.fa-splotch::before{content:"\f5bc"}.fa-face-grin-hearts::before{content:"\f584"}.fa-grin-hearts::before{content:"\f584"}.fa-dice-four::before{content:"\f524"}.fa-sim-card::before{content:"\f7c4"}.fa-transgender::before{content:"\f225"}.fa-transgender-alt::before{content:"\f225"}.fa-mercury::before{content:"\f223"}.fa-arrow-turn-down::before{content:"\f149"}.fa-level-down::before{content:"\f149"}.fa-person-falling-burst::before{content:"\e547"}.fa-award::before{content:"\f559"}.fa-ticket-simple::before{content:"\f3ff"}.fa-ticket-alt::before{content:"\f3ff"}.fa-building::before{content:"\f1ad"}.fa-angles-left::before{content:"\f100"}.fa-angle-double-left::before{content:"\f100"}.fa-qrcode::before{content:"\f029"}.fa-clock-rotate-left::before{content:"\f1da"}.fa-history::before{content:"\f1da"}.fa-face-grin-beam-sweat::before{content:"\f583"}.fa-grin-beam-sweat::before{content:"\f583"}.fa-file-export::before{content:"\f56e"}.fa-arrow-right-from-file::before{content:"\f56e"}.fa-shield::before{content:"\f132"}.fa-shield-blank::before{content:"\f132"}.fa-arrow-up-short-wide::before{content:"\f885"}.fa-sort-amount-up-alt::before{content:"\f885"}.fa-house-medical::before{content:"\e3b2"}.fa-golf-ball-tee::before{content:"\f450"}.fa-golf-ball::before{content:"\f450"}.fa-circle-chevron-left::before{content:"\f137"}.fa-chevron-circle-left::before{content:"\f137"}.fa-house-chimney-window::before{content:"\e00d"}.fa-pen-nib::before{content:"\f5ad"}.fa-tent-arrow-turn-left::before{content:"\e580"}.fa-tents::before{content:"\e582"}.fa-wand-magic::before{content:"\f0d0"}.fa-magic::before{content:"\f0d0"}.fa-dog::before{content:"\f6d3"}.fa-carrot::before{content:"\f787"}.fa-moon::before{content:"\f186"}.fa-wine-glass-empty::before{content:"\f5ce"}.fa-wine-glass-alt::before{content:"\f5ce"}.fa-cheese::before{content:"\f7ef"}.fa-yin-yang::before{content:"\f6ad"}.fa-music::before{content:"\f001"}.fa-code-commit::before{content:"\f386"}.fa-temperature-low::before{content:"\f76b"}.fa-person-biking::before{content:"\f84a"}.fa-biking::before{content:"\f84a"}.fa-broom::before{content:"\f51a"}.fa-shield-heart::before{content:"\e574"}.fa-gopuram::before{content:"\f664"}.fa-earth-oceania::before{content:"\e47b"}.fa-globe-oceania::before{content:"\e47b"}.fa-square-xmark::before{content:"\f2d3"}.fa-times-square::before{content:"\f2d3"}.fa-xmark-square::before{content:"\f2d3"}.fa-hashtag::before{content:"\23"}.fa-up-right-and-down-left-from-center::before{content:"\f424"}.fa-expand-alt::before{content:"\f424"}.fa-oil-can::before{content:"\f613"}.fa-t::before{content:"\54"}.fa-hippo::before{content:"\f6ed"}.fa-chart-column::before{content:"\e0e3"}.fa-infinity::before{content:"\f534"}.fa-vial-circle-check::before{content:"\e596"}.fa-person-arrow-down-to-line::before{content:"\e538"}.fa-voicemail::before{content:"\f897"}.fa-fan::before{content:"\f863"}.fa-person-walking-luggage::before{content:"\e554"}.fa-up-down::before{content:"\f338"}.fa-arrows-alt-v::before{content:"\f338"}.fa-cloud-moon-rain::before{content:"\f73c"}.fa-calendar::before{content:"\f133"}.fa-trailer::before{content:"\e041"}.fa-bahai::before{content:"\f666"}.fa-haykal::before{content:"\f666"}.fa-sd-card::before{content:"\f7c2"}.fa-dragon::before{content:"\f6d5"}.fa-shoe-prints::before{content:"\f54b"}.fa-circle-plus::before{content:"\f055"}.fa-plus-circle::before{content:"\f055"}.fa-face-grin-tongue-wink::before{content:"\f58b"}.fa-grin-tongue-wink::before{content:"\f58b"}.fa-hand-holding::before{content:"\f4bd"}.fa-plug-circle-exclamation::before{content:"\e55d"}.fa-link-slash::before{content:"\f127"}.fa-chain-broken::before{content:"\f127"}.fa-chain-slash::before{content:"\f127"}.fa-unlink::before{content:"\f127"}.fa-clone::before{content:"\f24d"}.fa-person-walking-arrow-loop-left::before{content:"\e551"}.fa-arrow-up-z-a::before{content:"\f882"}.fa-sort-alpha-up-alt::before{content:"\f882"}.fa-fire-flame-curved::before{content:"\f7e4"}.fa-fire-alt::before{content:"\f7e4"}.fa-tornado::before{content:"\f76f"}.fa-file-circle-plus::before{content:"\e494"}.fa-book-quran::before{content:"\f687"}.fa-quran::before{content:"\f687"}.fa-anchor::before{content:"\f13d"}.fa-border-all::before{content:"\f84c"}.fa-face-angry::before{content:"\f556"}.fa-angry::before{content:"\f556"}.fa-cookie-bite::before{content:"\f564"}.fa-arrow-trend-down::before{content:"\e097"}.fa-rss::before{content:"\f09e"}.fa-feed::before{content:"\f09e"}.fa-draw-polygon::before{content:"\f5ee"}.fa-scale-balanced::before{content:"\f24e"}.fa-balance-scale::before{content:"\f24e"}.fa-gauge-simple-high::before{content:"\f62a"}.fa-tachometer::before{content:"\f62a"}.fa-tachometer-fast::before{content:"\f62a"}.fa-shower::before{content:"\f2cc"}.fa-desktop::before{content:"\f390"}.fa-desktop-alt::before{content:"\f390"}.fa-m::before{content:"\4d"}.fa-table-list::before{content:"\f00b"}.fa-th-list::before{content:"\f00b"}.fa-comment-sms::before{content:"\f7cd"}.fa-sms::before{content:"\f7cd"}.fa-book::before{content:"\f02d"}.fa-user-plus::before{content:"\f234"}.fa-check::before{content:"\f00c"}.fa-battery-three-quarters::before{content:"\f241"}.fa-battery-4::before{content:"\f241"}.fa-house-circle-check::before{content:"\e509"}.fa-angle-left::before{content:"\f104"}.fa-diagram-successor::before{content:"\e47a"}.fa-truck-arrow-right::before{content:"\e58b"}.fa-arrows-split-up-and-left::before{content:"\e4bc"}.fa-hand-fist::before{content:"\f6de"}.fa-fist-raised::before{content:"\f6de"}.fa-cloud-moon::before{content:"\f6c3"}.fa-briefcase::before{content:"\f0b1"}.fa-person-falling::before{content:"\e546"}.fa-image-portrait::before{content:"\f3e0"}.fa-portrait::before{content:"\f3e0"}.fa-user-tag::before{content:"\f507"}.fa-rug::before{content:"\e569"}.fa-earth-europe::before{content:"\f7a2"}.fa-globe-europe::before{content:"\f7a2"}.fa-cart-flatbed-suitcase::before{content:"\f59d"}.fa-luggage-cart::before{content:"\f59d"}.fa-rectangle-xmark::before{content:"\f410"}.fa-rectangle-times::before{content:"\f410"}.fa-times-rectangle::before{content:"\f410"}.fa-window-close::before{content:"\f410"}.fa-baht-sign::before{content:"\e0ac"}.fa-book-open::before{content:"\f518"}.fa-book-journal-whills::before{content:"\f66a"}.fa-journal-whills::before{content:"\f66a"}.fa-handcuffs::before{content:"\e4f8"}.fa-triangle-exclamation::before{content:"\f071"}.fa-exclamation-triangle::before{content:"\f071"}.fa-warning::before{content:"\f071"}.fa-database::before{content:"\f1c0"}.fa-share::before{content:"\f064"}.fa-arrow-turn-right::before{content:"\f064"}.fa-mail-forward::before{content:"\f064"}.fa-bottle-droplet::before{content:"\e4c4"}.fa-mask-face::before{content:"\e1d7"}.fa-hill-rockslide::before{content:"\e508"}.fa-right-left::before{content:"\f362"}.fa-exchange-alt::before{content:"\f362"}.fa-paper-plane::before{content:"\f1d8"}.fa-road-circle-exclamation::before{content:"\e565"}.fa-dungeon::before{content:"\f6d9"}.fa-align-right::before{content:"\f038"}.fa-money-bill-1-wave::before{content:"\f53b"}.fa-money-bill-wave-alt::before{content:"\f53b"}.fa-life-ring::before{content:"\f1cd"}.fa-hands::before{content:"\f2a7"}.fa-sign-language::before{content:"\f2a7"}.fa-signing::before{content:"\f2a7"}.fa-calendar-day::before{content:"\f783"}.fa-water-ladder::before{content:"\f5c5"}.fa-ladder-water::before{content:"\f5c5"}.fa-swimming-pool::before{content:"\f5c5"}.fa-arrows-up-down::before{content:"\f07d"}.fa-arrows-v::before{content:"\f07d"}.fa-face-grimace::before{content:"\f57f"}.fa-grimace::before{content:"\f57f"}.fa-wheelchair-move::before{content:"\e2ce"}.fa-wheelchair-alt::before{content:"\e2ce"}.fa-turn-down::before{content:"\f3be"}.fa-level-down-alt::before{content:"\f3be"}.fa-person-walking-arrow-right::before{content:"\e552"}.fa-square-envelope::before{content:"\f199"}.fa-envelope-square::before{content:"\f199"}.fa-dice::before{content:"\f522"}.fa-bowling-ball::before{content:"\f436"}.fa-brain::before{content:"\f5dc"}.fa-bandage::before{content:"\f462"}.fa-band-aid::before{content:"\f462"}.fa-calendar-minus::before{content:"\f272"}.fa-circle-xmark::before{content:"\f057"}.fa-times-circle::before{content:"\f057"}.fa-xmark-circle::before{content:"\f057"}.fa-gifts::before{content:"\f79c"}.fa-hotel::before{content:"\f594"}.fa-earth-asia::before{content:"\f57e"}.fa-globe-asia::before{content:"\f57e"}.fa-id-card-clip::before{content:"\f47f"}.fa-id-card-alt::before{content:"\f47f"}.fa-magnifying-glass-plus::before{content:"\f00e"}.fa-search-plus::before{content:"\f00e"}.fa-thumbs-up::before{content:"\f164"}.fa-user-clock::before{content:"\f4fd"}.fa-hand-dots::before{content:"\f461"}.fa-allergies::before{content:"\f461"}.fa-file-invoice::before{content:"\f570"}.fa-window-minimize::before{content:"\f2d1"}.fa-mug-saucer::before{content:"\f0f4"}.fa-coffee::before{content:"\f0f4"}.fa-brush::before{content:"\f55d"}.fa-mask::before{content:"\f6fa"}.fa-magnifying-glass-minus::before{content:"\f010"}.fa-search-minus::before{content:"\f010"}.fa-ruler-vertical::before{content:"\f548"}.fa-user-large::before{content:"\f406"}.fa-user-alt::before{content:"\f406"}.fa-train-tram::before{content:"\e5b4"}.fa-user-nurse::before{content:"\f82f"}.fa-syringe::before{content:"\f48e"}.fa-cloud-sun::before{content:"\f6c4"}.fa-stopwatch-20::before{content:"\e06f"}.fa-square-full::before{content:"\f45c"}.fa-magnet::before{content:"\f076"}.fa-jar::before{content:"\e516"}.fa-note-sticky::before{content:"\f249"}.fa-sticky-note::before{content:"\f249"}.fa-bug-slash::before{content:"\e490"}.fa-arrow-up-from-water-pump::before{content:"\e4b6"}.fa-bone::before{content:"\f5d7"}.fa-user-injured::before{content:"\f728"}.fa-face-sad-tear::before{content:"\f5b4"}.fa-sad-tear::before{content:"\f5b4"}.fa-plane::before{content:"\f072"}.fa-tent-arrows-down::before{content:"\e581"}.fa-exclamation::before{content:"\21"}.fa-arrows-spin::before{content:"\e4bb"}.fa-print::before{content:"\f02f"}.fa-turkish-lira-sign::before{content:"\e2bb"}.fa-try::before{content:"\e2bb"}.fa-turkish-lira::before{content:"\e2bb"}.fa-dollar-sign::before{content:"\24"}.fa-dollar::before{content:"\24"}.fa-usd::before{content:"\24"}.fa-x::before{content:"\58"}.fa-magnifying-glass-dollar::before{content:"\f688"}.fa-search-dollar::before{content:"\f688"}.fa-users-gear::before{content:"\f509"}.fa-users-cog::before{content:"\f509"}.fa-person-military-pointing::before{content:"\e54a"}.fa-building-columns::before{content:"\f19c"}.fa-bank::before{content:"\f19c"}.fa-institution::before{content:"\f19c"}.fa-museum::before{content:"\f19c"}.fa-university::before{content:"\f19c"}.fa-umbrella::before{content:"\f0e9"}.fa-trowel::before{content:"\e589"}.fa-d::before{content:"\44"}.fa-stapler::before{content:"\e5af"}.fa-masks-theater::before{content:"\f630"}.fa-theater-masks::before{content:"\f630"}.fa-kip-sign::before{content:"\e1c4"}.fa-hand-point-left::before{content:"\f0a5"}.fa-handshake-simple::before{content:"\f4c6"}.fa-handshake-alt::before{content:"\f4c6"}.fa-jet-fighter::before{content:"\f0fb"}.fa-fighter-jet::before{content:"\f0fb"}.fa-square-share-nodes::before{content:"\f1e1"}.fa-share-alt-square::before{content:"\f1e1"}.fa-barcode::before{content:"\f02a"}.fa-plus-minus::before{content:"\e43c"}.fa-video::before{content:"\f03d"}.fa-video-camera::before{content:"\f03d"}.fa-graduation-cap::before{content:"\f19d"}.fa-mortar-board::before{content:"\f19d"}.fa-hand-holding-medical::before{content:"\e05c"}.fa-person-circle-check::before{content:"\e53e"}.fa-turn-up::before{content:"\f3bf"}.fa-level-up-alt::before{content:"\f3bf"}.sr-only,.fa-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sr-only-focusable:not(:focus),.fa-sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}/*!* Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) +* Copyright 2023 Fonticons, Inc.*/:root,:host{--fa-style-family-classic:'Font Awesome 6 Free';--fa-font-solid:normal 900 1em/1 'Font Awesome 6 Free'}@font-face{font-family:'font awesome 6 free';font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2)format("woff2"),url(../webfonts/fa-solid-900.ttf)format("truetype")}.fas,.td-offline-search-results__close-button:after,.fa-solid{font-weight:900}/*!* Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) +* Copyright 2023 Fonticons, Inc.*/:root,:host{--fa-style-family-brands:'Font Awesome 6 Brands';--fa-font-brands:normal 400 1em/1 'Font Awesome 6 Brands'}@font-face{font-family:'font awesome 6 brands';font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2)format("woff2"),url(../webfonts/fa-brands-400.ttf)format("truetype")}.fab,.fa-brands{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-square-js:before{content:"\f3b9"}.fa-js-square:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-square-reddit:before{content:"\f1a2"}.fa-reddit-square:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-sistrix:before{content:"\f3ee"}.fa-square-instagram:before{content:"\e055"}.fa-instagram-square:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-square-hacker-news:before{content:"\f3af"}.fa-hacker-news-square:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-napster:before{content:"\f3d2"}.fa-square-snapchat:before{content:"\f2ad"}.fa-snapchat-square:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before{content:"\f2aa"}.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-square-dribbble:before{content:"\f397"}.fa-dribbble-square:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before{content:"\f081"}.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before{content:"\f431"}.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-wpressr:before{content:"\f3e4"}.fa-rendact:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before{content:"\f1b7"}.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before{content:"\f194"}.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-flag:before{content:"\f2b4"}.fa-font-awesome-logo-full:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-square-github:before{content:"\f092"}.fa-github-square:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-square-gitlab:before{content:"\e5ae"}.fa-gitlab-square:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-square-odnoklassniki:before{content:"\f264"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-square-pinterest:before{content:"\f0d3"}.fa-pinterest-square:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-facebook-f:before{content:"\f39e"}.fa-square-google-plus:before{content:"\f0d4"}.fa-google-plus-square:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before{content:"\f169"}.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before{content:"\e080"}.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-square-pied-piper:before{content:"\e01e"}.fa-pied-piper-square:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-square-facebook:before{content:"\f082"}.fa-facebook-square:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-square-lastfm:before{content:"\f203"}.fa-lastfm-square:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before{content:"\e2d0"}.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-square-behance:before{content:"\f1b5"}.fa-behance-square:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-square-git:before{content:"\f1d2"}.fa-git-square:before{content:"\f1d2"}.fa-square-tumblr:before{content:"\f174"}.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before{content:"\f40c"}.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-reacteurope:before{content:"\f75d"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}.td-border-top{border:none;border-top:1px solid #eee}.td-border-none{border:none}.td-block-padding,.td-default main section{padding-top:4rem;padding-bottom:4rem}@media(min-width:768px){.td-block-padding,.td-default main section{padding-top:5rem;padding-bottom:5rem}}.td-overlay{position:relative}.td-overlay::after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.td-overlay--dark::after{background-color:rgba(64,63,76,.3)}.td-overlay--light::after{background-color:rgba(211,243,238,.3)}.td-overlay__inner{position:relative;z-index:1}@media(min-width:992px){.td-max-width-on-larger-screens,.td-card.card,.td-content .td-card.highlight,.td-card-group.card-group,.td-content>.tab-content .tab-pane,.td-content .footnotes,.td-content>.alert,.td-content>.highlight,.td-content>.lead,.td-content>.td-table,.td-box .td-content>table,.td-content>table,.td-content>blockquote,.td-content>dl dd,.td-content>h1,.td-content>.h1,.td-content>h2,.td-content>.h2,.td-content>ol,.td-content>p,.td-content>pre,.td-content>ul{max-width:80%}}.-bg-blue{color:#fff;background-color:#0d6efd}.-bg-blue p:not(.p-initial)>a{color:#81b3fe}.-bg-blue p:not(.p-initial)>a:hover{color:#24609b}.-text-blue{color:#0d6efd}.-bg-indigo{color:#fff;background-color:#6610f2}.-bg-indigo p:not(.p-initial)>a{color:#85b6fe}.-bg-indigo p:not(.p-initial)>a:hover{color:#24609b}.-text-indigo{color:#6610f2}.-bg-purple{color:#fff;background-color:#6f42c1}.-bg-purple p:not(.p-initial)>a{color:#84b5fe}.-bg-purple p:not(.p-initial)>a:hover{color:#24609b}.-text-purple{color:#6f42c1}.-bg-pink{color:#fff;background-color:#d63384}.-bg-pink p:not(.p-initial)>a{color:#81b4fe}.-bg-pink p:not(.p-initial)>a:hover{color:#24609b}.-text-pink{color:#d63384}.-bg-red{color:#fff;background-color:#dc3545}.-bg-red p:not(.p-initial)>a{color:#7db1fe}.-bg-red p:not(.p-initial)>a:hover{color:#24609b}.-text-red{color:#dc3545}.-bg-orange{color:#000;background-color:#fd7e14}.-bg-orange p:not(.p-initial)>a{color:#073b87}.-bg-orange p:not(.p-initial)>a:hover{color:#24609b}.-text-orange{color:#fd7e14}.-bg-yellow{color:#000;background-color:#ffc107}.-bg-yellow p:not(.p-initial)>a{color:#073982}.-bg-yellow p:not(.p-initial)>a:hover{color:#24609b}.-text-yellow{color:#ffc107}.-bg-green{color:#fff;background-color:#198754}.-bg-green p:not(.p-initial)>a{color:#b3d2fe}.-bg-green p:not(.p-initial)>a:hover{color:#24609b}.-text-green{color:#198754}.-bg-teal{color:#000;background-color:#20c997}.-bg-teal p:not(.p-initial)>a{color:#063274}.-bg-teal p:not(.p-initial)>a:hover{color:#24609b}.-text-teal{color:#20c997}.-bg-cyan{color:#000;background-color:#0dcaf0}.-bg-cyan p:not(.p-initial)>a{color:#06377e}.-bg-cyan p:not(.p-initial)>a:hover{color:#24609b}.-text-cyan{color:#0dcaf0}.-bg-black{color:#fff;background-color:#000}.-bg-black p:not(.p-initial)>a{color:#fff}.-bg-black p:not(.p-initial)>a:hover{color:#24609b}.-text-black{color:#000}.-bg-white{color:#000;background-color:#fff}.-bg-white p:not(.p-initial)>a{color:#0d6efd}.-bg-white p:not(.p-initial)>a:hover{color:#24609b}.-text-white{color:#fff}.-bg-gray{color:#fff;background-color:#6c757d}.-bg-gray p:not(.p-initial)>a{color:#90bdfe}.-bg-gray p:not(.p-initial)>a:hover{color:#24609b}.-text-gray{color:#6c757d}.-bg-gray-dark{color:#fff;background-color:#343a40}.-bg-gray-dark p:not(.p-initial)>a{color:#c8deff}.-bg-gray-dark p:not(.p-initial)>a:hover{color:#24609b}.-text-gray-dark{color:#343a40}.-bg-primary{color:#fff;background-color:#212730}.-bg-primary p:not(.p-initial)>a{color:#d9e8ff}.-bg-primary p:not(.p-initial)>a:hover{color:#24609b}.-text-primary{color:#212730}.-bg-secondary{color:#000;background-color:#f1f1f6}.-bg-secondary p:not(.p-initial)>a{color:#0c69f2}.-bg-secondary p:not(.p-initial)>a:hover{color:#24609b}.-text-secondary{color:#f1f1f6}.-bg-success{color:#000;background-color:#3772ff}.-bg-success p:not(.p-initial)>a{color:#08439a}.-bg-success p:not(.p-initial)>a:hover{color:#24609b}.-text-success{color:#3772ff}.-bg-info{color:#000;background-color:#c0e0de}.-bg-info p:not(.p-initial)>a{color:#0b5ace}.-bg-info p:not(.p-initial)>a:hover{color:#24609b}.-text-info{color:#c0e0de}.-bg-warning{color:#000;background-color:#ed6a5a}.-bg-warning p:not(.p-initial)>a{color:#0847a2}.-bg-warning p:not(.p-initial)>a:hover{color:#24609b}.-text-warning{color:#ed6a5a}.-bg-danger{color:#000;background-color:#ed6a5a}.-bg-danger p:not(.p-initial)>a{color:#0847a2}.-bg-danger p:not(.p-initial)>a:hover{color:#24609b}.-text-danger{color:#ed6a5a}.-bg-light{color:#000;background-color:#d3f3ee}.-bg-light p:not(.p-initial)>a{color:#0c62e1}.-bg-light p:not(.p-initial)>a:hover{color:#24609b}.-text-light{color:#d3f3ee}.-bg-dark{color:#fff;background-color:#403f4c}.-bg-dark p:not(.p-initial)>a{color:#bdd7fe}.-bg-dark p:not(.p-initial)>a:hover{color:#24609b}.-text-dark{color:#403f4c}.-bg-100{color:#000;background-color:#f8f9fa}.-bg-100 p:not(.p-initial)>a{color:#0d6bf7}.-bg-100 p:not(.p-initial)>a:hover{color:#24609b}.-text-100{color:#f8f9fa}.-bg-200{color:#000;background-color:#e9ecef}.-bg-200 p:not(.p-initial)>a{color:#0c66ea}.-bg-200 p:not(.p-initial)>a:hover{color:#24609b}.-text-200{color:#e9ecef}.-bg-300{color:#000;background-color:#dee2e6}.-bg-300 p:not(.p-initial)>a{color:#0c61e0}.-bg-300 p:not(.p-initial)>a:hover{color:#24609b}.-text-300{color:#dee2e6}.-bg-400{color:#000;background-color:#ced4da}.-bg-400 p:not(.p-initial)>a{color:#0b5bd2}.-bg-400 p:not(.p-initial)>a:hover{color:#24609b}.-text-400{color:#ced4da}.-bg-500{color:#000;background-color:#adb5bd}.-bg-500 p:not(.p-initial)>a{color:#094eb4}.-bg-500 p:not(.p-initial)>a:hover{color:#24609b}.-text-500{color:#adb5bd}.-bg-600{color:#fff;background-color:#6c757d}.-bg-600 p:not(.p-initial)>a{color:#90bdfe}.-bg-600 p:not(.p-initial)>a:hover{color:#24609b}.-text-600{color:#6c757d}.-bg-700{color:#fff;background-color:#495057}.-bg-700 p:not(.p-initial)>a{color:#b3d2fe}.-bg-700 p:not(.p-initial)>a:hover{color:#24609b}.-text-700{color:#495057}.-bg-800{color:#fff;background-color:#343a40}.-bg-800 p:not(.p-initial)>a{color:#c8deff}.-bg-800 p:not(.p-initial)>a:hover{color:#24609b}.-text-800{color:#343a40}.-bg-900{color:#fff;background-color:#212529}.-bg-900 p:not(.p-initial)>a{color:#dceaff}.-bg-900 p:not(.p-initial)>a:hover{color:#24609b}.-text-900{color:#212529}.-bg-0{color:#fff;background-color:#403f4c}.-bg-0 p:not(.p-initial)>a{color:#bdd7fe}.-bg-0 p:not(.p-initial)>a:hover{color:#24609b}.-text-0{color:#403f4c}.-bg-1{color:#fff;background-color:#212730}.-bg-1 p:not(.p-initial)>a{color:#d9e8ff}.-bg-1 p:not(.p-initial)>a:hover{color:#24609b}.-text-1{color:#212730}.-bg-2{color:#000;background-color:#f1f1f6}.-bg-2 p:not(.p-initial)>a{color:#0c69f2}.-bg-2 p:not(.p-initial)>a:hover{color:#24609b}.-text-2{color:#f1f1f6}.-bg-3{color:#000;background-color:#c0e0de}.-bg-3 p:not(.p-initial)>a{color:#0b5ace}.-bg-3 p:not(.p-initial)>a:hover{color:#24609b}.-text-3{color:#c0e0de}.-bg-4{color:#000;background-color:#fff}.-bg-4 p:not(.p-initial)>a{color:#0d6efd}.-bg-4 p:not(.p-initial)>a:hover{color:#24609b}.-text-4{color:#fff}.-bg-5{color:#fff;background-color:#6c757d}.-bg-5 p:not(.p-initial)>a{color:#90bdfe}.-bg-5 p:not(.p-initial)>a:hover{color:#24609b}.-text-5{color:#6c757d}.-bg-6{color:#000;background-color:#3772ff}.-bg-6 p:not(.p-initial)>a{color:#08439a}.-bg-6 p:not(.p-initial)>a:hover{color:#24609b}.-text-6{color:#3772ff}.-bg-7{color:#000;background-color:#ed6a5a}.-bg-7 p:not(.p-initial)>a{color:#0847a2}.-bg-7 p:not(.p-initial)>a:hover{color:#24609b}.-text-7{color:#ed6a5a}.-bg-8{color:#fff;background-color:#403f4c}.-bg-8 p:not(.p-initial)>a{color:#bdd7fe}.-bg-8 p:not(.p-initial)>a:hover{color:#24609b}.-text-8{color:#403f4c}.-bg-9{color:#000;background-color:#ed6a5a}.-bg-9 p:not(.p-initial)>a{color:#0847a2}.-bg-9 p:not(.p-initial)>a:hover{color:#24609b}.-text-9{color:#ed6a5a}.-bg-10{color:#fff;background-color:#212730}.-bg-10 p:not(.p-initial)>a{color:#d9e8ff}.-bg-10 p:not(.p-initial)>a:hover{color:#24609b}.-text-10{color:#212730}.-bg-11{color:#000;background-color:#f1f1f6}.-bg-11 p:not(.p-initial)>a{color:#0c69f2}.-bg-11 p:not(.p-initial)>a:hover{color:#24609b}.-text-11{color:#f1f1f6}.-bg-12{color:#000;background-color:#c0e0de}.-bg-12 p:not(.p-initial)>a{color:#0b5ace}.-bg-12 p:not(.p-initial)>a:hover{color:#24609b}.-text-12{color:#c0e0de}.td-table:not(.td-initial),.td-content table:not(.td-initial),.td-box table:not(.td-initial){display:block}.td-box--height-min{min-height:300px}.td-box--height-med{min-height:400px}.td-box--height-max{min-height:500px}.td-box--height-full{min-height:100vh}@media(min-width:768px){.td-box--height-min{min-height:450px}.td-box--height-med{min-height:500px}.td-box--height-max{min-height:650px}}.td-box .row{padding-left:5vw;padding-right:5vw}.td-box.linkbox{padding:5vh 5vw}.td-box--0{color:#fff;background-color:#403f4c}.td-box--0 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--0 p>a,.td-box--0 span>a{color:#bdd7fe}.td-box--0 p>a:hover,.td-box--0 span>a:hover{color:#d1e3fe}.td-box--1{color:#fff;background-color:#212730}.td-box--1 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#212730 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--1 p>a,.td-box--1 span>a{color:#d9e8ff}.td-box--1 p>a:hover,.td-box--1 span>a:hover{color:#e4efff}.td-box--2{color:#000;background-color:#f1f1f6}.td-box--2 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f1f1f6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--2 p>a,.td-box--2 span>a{color:#0c69f2}.td-box--2 p>a:hover,.td-box--2 span>a:hover{color:#084aa9}.td-box--3{color:#000;background-color:#c0e0de}.td-box--3 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--3 p>a,.td-box--3 span>a{color:#0b5ace}.td-box--3 p>a:hover,.td-box--3 span>a:hover{color:#083f90}.td-box--4{color:#000;background-color:#fff}.td-box--4 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--4 p>a,.td-box--4 span>a{color:#0d6efd}.td-box--4 p>a:hover,.td-box--4 span>a:hover{color:#094db1}.td-box--5{color:#fff;background-color:#6c757d}.td-box--5 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6c757d transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--5 p>a,.td-box--5 span>a{color:#90bdfe}.td-box--5 p>a:hover,.td-box--5 span>a:hover{color:#b1d1fe}.td-box--6{color:#000;background-color:#3772ff}.td-box--6 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3772ff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--6 p>a,.td-box--6 span>a{color:#08439a}.td-box--6 p>a:hover,.td-box--6 span>a:hover{color:#062f6c}.td-box--7{color:#000;background-color:#ed6a5a}.td-box--7 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--7 p>a,.td-box--7 span>a{color:#0847a2}.td-box--7 p>a:hover,.td-box--7 span>a:hover{color:#063271}.td-box--8{color:#fff;background-color:#403f4c}.td-box--8 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--8 p>a,.td-box--8 span>a{color:#bdd7fe}.td-box--8 p>a:hover,.td-box--8 span>a:hover{color:#d1e3fe}.td-box--9{color:#000;background-color:#ed6a5a}.td-box--9 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--9 p>a,.td-box--9 span>a{color:#0847a2}.td-box--9 p>a:hover,.td-box--9 span>a:hover{color:#063271}.td-box--10{color:#fff;background-color:#212730}.td-box--10 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#212730 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--10 p>a,.td-box--10 span>a{color:#d9e8ff}.td-box--10 p>a:hover,.td-box--10 span>a:hover{color:#e4efff}.td-box--11{color:#000;background-color:#f1f1f6}.td-box--11 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f1f1f6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--11 p>a,.td-box--11 span>a{color:#0c69f2}.td-box--11 p>a:hover,.td-box--11 span>a:hover{color:#084aa9}.td-box--12{color:#000;background-color:#c0e0de}.td-box--12 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--12 p>a,.td-box--12 span>a{color:#0b5ace}.td-box--12 p>a:hover,.td-box--12 span>a:hover{color:#083f90}.td-box--blue{color:#fff;background-color:#0d6efd}.td-box--blue .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#0d6efd transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--blue p>a,.td-box--blue span>a{color:#81b3fe}.td-box--blue p>a:hover,.td-box--blue span>a:hover{color:#a7cafe}.td-box--indigo{color:#fff;background-color:#6610f2}.td-box--indigo .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6610f2 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--indigo p>a,.td-box--indigo span>a{color:#85b6fe}.td-box--indigo p>a:hover,.td-box--indigo span>a:hover{color:#aaccfe}.td-box--purple{color:#fff;background-color:#6f42c1}.td-box--purple .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6f42c1 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--purple p>a,.td-box--purple span>a{color:#84b5fe}.td-box--purple p>a:hover,.td-box--purple span>a:hover{color:#a9cbfe}.td-box--pink{color:#fff;background-color:#d63384}.td-box--pink .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#d63384 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--pink p>a,.td-box--pink span>a{color:#81b4fe}.td-box--pink p>a:hover,.td-box--pink span>a:hover{color:#a7cbfe}.td-box--red{color:#fff;background-color:#dc3545}.td-box--red .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dc3545 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--red p>a,.td-box--red span>a{color:#7db1fe}.td-box--red p>a:hover,.td-box--red span>a:hover{color:#a4c8fe}.td-box--orange{color:#000;background-color:#fd7e14}.td-box--orange .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fd7e14 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--orange p>a,.td-box--orange span>a{color:#073b87}.td-box--orange p>a:hover,.td-box--orange span>a:hover{color:#05295f}.td-box--yellow{color:#000;background-color:#ffc107}.td-box--yellow .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffc107 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--yellow p>a,.td-box--yellow span>a{color:#073982}.td-box--yellow p>a:hover,.td-box--yellow span>a:hover{color:#05285b}.td-box--green{color:#fff;background-color:#198754}.td-box--green .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#198754 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--green p>a,.td-box--green span>a{color:#b3d2fe}.td-box--green p>a:hover,.td-box--green span>a:hover{color:#cae0fe}.td-box--teal{color:#000;background-color:#20c997}.td-box--teal .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#20c997 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--teal p>a,.td-box--teal span>a{color:#063274}.td-box--teal p>a:hover,.td-box--teal span>a:hover{color:#042351}.td-box--cyan{color:#000;background-color:#0dcaf0}.td-box--cyan .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#0dcaf0 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--cyan p>a,.td-box--cyan span>a{color:#06377e}.td-box--cyan p>a:hover,.td-box--cyan span>a:hover{color:#042758}.td-box--black{color:#fff;background-color:#000}.td-box--black .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#000 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--black p>a,.td-box--black span>a{color:#fff}.td-box--black p>a:hover,.td-box--black span>a:hover{color:#fff}.td-box--white{color:#000;background-color:#fff}.td-box--white .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--white p>a,.td-box--white span>a{color:#0d6efd}.td-box--white p>a:hover,.td-box--white span>a:hover{color:#094db1}.td-box--gray{color:#fff;background-color:#6c757d}.td-box--gray .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6c757d transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray p>a,.td-box--gray span>a{color:#90bdfe}.td-box--gray p>a:hover,.td-box--gray span>a:hover{color:#b1d1fe}.td-box--gray-dark{color:#fff;background-color:#343a40}.td-box--gray-dark .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#343a40 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray-dark p>a,.td-box--gray-dark span>a{color:#c8deff}.td-box--gray-dark p>a:hover,.td-box--gray-dark span>a:hover{color:#d9e8ff}.td-box--primary{color:#fff;background-color:#212730}.td-box--primary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#212730 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--primary p>a,.td-box--primary span>a{color:#d9e8ff}.td-box--primary p>a:hover,.td-box--primary span>a:hover{color:#e4efff}.td-box--secondary{color:#000;background-color:#f1f1f6}.td-box--secondary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f1f1f6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--secondary p>a,.td-box--secondary span>a{color:#0c69f2}.td-box--secondary p>a:hover,.td-box--secondary span>a:hover{color:#084aa9}.td-box--success{color:#000;background-color:#3772ff}.td-box--success .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3772ff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--success p>a,.td-box--success span>a{color:#08439a}.td-box--success p>a:hover,.td-box--success span>a:hover{color:#062f6c}.td-box--info{color:#000;background-color:#c0e0de}.td-box--info .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--info p>a,.td-box--info span>a{color:#0b5ace}.td-box--info p>a:hover,.td-box--info span>a:hover{color:#083f90}.td-box--warning{color:#000;background-color:#ed6a5a}.td-box--warning .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--warning p>a,.td-box--warning span>a{color:#0847a2}.td-box--warning p>a:hover,.td-box--warning span>a:hover{color:#063271}.td-box--danger{color:#000;background-color:#ed6a5a}.td-box--danger .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--danger p>a,.td-box--danger span>a{color:#0847a2}.td-box--danger p>a:hover,.td-box--danger span>a:hover{color:#063271}.td-box--light{color:#000;background-color:#d3f3ee}.td-box--light .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#d3f3ee transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--light p>a,.td-box--light span>a{color:#0c62e1}.td-box--light p>a:hover,.td-box--light span>a:hover{color:#08459e}.td-box--dark,.td-footer{color:#fff;background-color:#403f4c}.td-box--dark .td-arrow-down::before,.td-footer .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--dark p>a,.td-footer p>a,.td-box--dark span>a,.td-footer span>a{color:#bdd7fe}.td-box--dark p>a:hover,.td-footer p>a:hover,.td-box--dark span>a:hover,.td-footer span>a:hover{color:#d1e3fe}.td-box--100{color:#000;background-color:#f8f9fa}.td-box--100 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f8f9fa transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--100 p>a,.td-box--100 span>a{color:#0d6bf7}.td-box--100 p>a:hover,.td-box--100 span>a:hover{color:#094bad}.td-box--200{color:#000;background-color:#e9ecef}.td-box--200 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#e9ecef transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--200 p>a,.td-box--200 span>a{color:#0c66ea}.td-box--200 p>a:hover,.td-box--200 span>a:hover{color:#0847a4}.td-box--300{color:#000;background-color:#dee2e6}.td-box--300 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dee2e6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--300 p>a,.td-box--300 span>a{color:#0c61e0}.td-box--300 p>a:hover,.td-box--300 span>a:hover{color:#08449d}.td-box--400{color:#000;background-color:#ced4da}.td-box--400 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ced4da transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--400 p>a,.td-box--400 span>a{color:#0b5bd2}.td-box--400 p>a:hover,.td-box--400 span>a:hover{color:#084093}.td-box--500{color:#000;background-color:#adb5bd}.td-box--500 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#adb5bd transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--500 p>a,.td-box--500 span>a{color:#094eb4}.td-box--500 p>a:hover,.td-box--500 span>a:hover{color:#06377e}.td-box--600{color:#fff;background-color:#6c757d}.td-box--600 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6c757d transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--600 p>a,.td-box--600 span>a{color:#90bdfe}.td-box--600 p>a:hover,.td-box--600 span>a:hover{color:#b1d1fe}.td-box--700{color:#fff;background-color:#495057}.td-box--700 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#495057 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--700 p>a,.td-box--700 span>a{color:#b3d2fe}.td-box--700 p>a:hover,.td-box--700 span>a:hover{color:#cae0fe}.td-box--800{color:#fff;background-color:#343a40}.td-box--800 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#343a40 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--800 p>a,.td-box--800 span>a{color:#c8deff}.td-box--800 p>a:hover,.td-box--800 span>a:hover{color:#d9e8ff}.td-box--900{color:#fff;background-color:#212529}.td-box--900 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#212529 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--900 p>a,.td-box--900 span>a{color:#dceaff}.td-box--900 p>a:hover,.td-box--900 span>a:hover{color:#e7f0ff}.td-blog .td-rss-button{border-radius:2rem;float:right;display:none}.td-blog-posts-list{margin-top:1.5rem!important}.td-blog-posts-list__item{display:flex;align-items:flex-start;margin-bottom:1.5rem!important}.td-blog-posts-list__item__body{flex:1}.td-content .highlight{margin:2rem 0;padding:0;position:relative}.td-content .highlight .click-to-copy{display:block;text-align:right}.td-content .highlight pre{margin:0;padding:1rem}.td-content .highlight pre button.td-click-to-copy{position:absolute;color:#ced4da;border-radius:3px;border-width:0;background-color:inherit;box-shadow:1px 1px #ced4da;right:4px;top:2px}.td-content .highlight pre button.td-click-to-copy:hover{color:#403f4c;background-color:#ced4da}.td-content .highlight pre button.td-click-to-copy:active{color:#403f4c;background-color:#ced4da;transform:translateY(2px)}.td-content p code,.td-content li>code,.td-content table code{color:inherit;padding:.2em .4em;margin:0;font-size:85%;word-break:normal;background-color:rgba(0,0,0,5%);border-radius:.375rem}.td-content p code br,.td-content li>code br,.td-content table code br{display:none}.td-content pre{word-wrap:normal;background-color:#f8f9fa;padding:1rem}.td-content pre>code{background-color:inherit!important;padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;border:0}.td-content pre.mermaid{background-color:inherit;font-size:0;padding:0}@media(min-width:768px){.td-navbar-cover{background:0 0!important}.td-navbar-cover .nav-link{text-shadow:1px 1px 2px #403f4c}}.td-navbar-cover.navbar-bg-onscroll .nav-link{text-shadow:none}.navbar-bg-onscroll{background:#212730!important;opacity:inherit}.td-navbar{background:#212730;min-height:4rem;margin:0;z-index:32}.td-navbar .navbar-brand{text-transform:none}.td-navbar .navbar-brand__name{font-weight:700}.td-navbar .navbar-brand svg{display:inline-block;margin:0 10px;height:30px}.td-navbar .navbar-nav{padding-top:.5rem;white-space:nowrap}.td-navbar .nav-link{text-transform:none;font-weight:700}.td-navbar .dropdown{min-width:100px}@media(min-width:768px){.td-navbar{position:fixed;top:0;width:100%}.td-navbar .nav-item{-webkit-padding-end:.5rem;padding-inline-end:.5rem}.td-navbar .navbar-nav{padding-top:0!important}}@media(max-width:991.98px){.td-navbar .td-navbar-nav-scroll{max-width:100%;height:2.5rem;overflow:hidden;font-size:.9rem}.td-navbar .navbar-brand{margin-right:0}.td-navbar .navbar-nav{padding-bottom:2rem;overflow-x:auto}}#main_navbar li i{padding-right:.5em}#main_navbar li i:before{display:inline-block;text-align:center;min-width:1em}#main_navbar .alert{background-color:inherit;padding:0;color:#f1f1f6;border:0;font-weight:inherit}#main_navbar .alert:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";font-weight:900;content:"\f0d9";padding-left:.5em;padding-right:.5em}nav.foldable-nav#td-section-nav{position:relative}nav.foldable-nav#td-section-nav label{margin-bottom:0;width:100%}nav.foldable-nav .td-sidebar-nav__section,nav.foldable-nav .with-child ul{list-style:none;padding:0;margin:0}nav.foldable-nav .ul-1>li{padding-left:1.5em}nav.foldable-nav ul.foldable{display:none}nav.foldable-nav input:checked~ul.foldable{display:block}nav.foldable-nav input[type=checkbox]{display:none}nav.foldable-nav .with-child,nav.foldable-nav .without-child{position:relative;padding-left:1.5em}nav.foldable-nav .ul-1 .with-child>label:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";font-weight:900;content:"\f0da";position:absolute;left:.1em;padding-left:.4em;padding-right:.4em;font-size:1em;color:#212529;transition:all .5s}nav.foldable-nav .ul-1 .with-child>label:before:hover{transform:rotate(90deg)}nav.foldable-nav .ul-1 .with-child>input:checked~label:before{color:#212730;transform:rotate(90deg);transition:transform .5s}nav.foldable-nav .with-child ul{margin-top:.1em}@media(hover:hover) and (pointer:fine){nav.foldable-nav .ul-1 .with-child>label:hover:before{color:#212730;transition:color .3s}nav.foldable-nav .ul-1 .with-child>input:checked~label:hover:before{color:#212730;transition:color .3s}}.td-sidebar-nav{padding-right:.5rem;margin-right:-15px;margin-left:-15px}@media(min-width:768px){@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar-nav{max-height:calc(100vh - 8.5rem);overflow-y:auto}}}@media(min-width:992px){.td-sidebar-nav.td-sidebar-nav--search-disabled{padding-top:1rem}@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar-nav.td-sidebar-nav--search-disabled{max-height:calc(calc(100vh - 8.5rem) + 4.5rem)}}}@media(min-width:768px){.td-sidebar-nav{display:block!important}}.td-sidebar-nav__section{padding-left:0}.td-sidebar-nav__section li{list-style:none}.td-sidebar-nav__section.ul-0,.td-sidebar-nav__section ul{padding:0;margin:0}@media(min-width:768px){.td-sidebar-nav__section .ul-1 ul{padding-left:1.5em}}.td-sidebar-nav__section-title{display:block;font-weight:500}.td-sidebar-nav__section-title .active{font-weight:700}.td-sidebar-nav__section-title a{color:#212529}.td-sidebar-nav .td-sidebar-link{display:block;padding-bottom:.375rem}.td-sidebar-nav .td-sidebar-link__page{color:#495057;font-weight:300}.td-sidebar-nav a:hover{color:#0d6efd;text-decoration:none}.td-sidebar-nav a.active{font-weight:700}.td-sidebar-nav .dropdown a{color:#495057}.td-sidebar-nav .dropdown .nav-link{padding:0 0 1rem}.td-sidebar-nav>.td-sidebar-nav__section{padding-left:1.5rem}.td-sidebar-nav li i{padding-right:.5em}.td-sidebar-nav li i:before{display:inline-block;text-align:center;min-width:1em}.td-sidebar-nav .td-sidebar-link.tree-root{font-weight:700;color:#212730;border-bottom:1px #212730 solid;margin-bottom:1rem}.td-sidebar{padding-bottom:1rem}@media(min-width:768px){.td-sidebar{padding-top:4rem;background-color:#fff;padding-right:1rem;border-right:1px solid #d4e4ff}}.td-sidebar__toggle{line-height:1;color:#212529;margin:1rem}.td-sidebar__search{padding:1rem 0}.td-sidebar__inner{order:0}@media(min-width:768px){@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar__inner{position:-webkit-sticky;position:sticky;top:4rem;z-index:10;height:calc(100vh - 5rem)}}}@media(min-width:1200px){.td-sidebar__inner{flex:0 1 320px}}.td-sidebar__inner .td-search-box{width:100%}.td-sidebar #content-desktop{display:block}.td-sidebar #content-mobile{display:none}@media(max-width:991.98px){.td-sidebar #content-desktop{display:none}.td-sidebar #content-mobile{display:block}}.td-sidebar-toc{border-left:1px solid #dee2e6;order:2;padding-top:.75rem;padding-bottom:1.5rem;vertical-align:top}@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar-toc{position:-webkit-sticky;position:sticky;top:4rem;height:calc(100vh - 4rem);overflow-y:auto}}.td-page-meta a{display:block;font-weight:500}.td-toc a{display:block;font-weight:300;padding-bottom:.25rem}.td-toc li{list-style:none;display:block}.td-toc li li{margin-left:.5rem}.td-toc #TableOfContents a{color:#6c757d}.td-toc #TableOfContents a:hover{color:#0d6efd;text-decoration:none}.td-toc ul{padding-left:0}@media print{.td-breadcrumbs{display:none!important}}.td-breadcrumbs .breadcrumb{background:inherit;padding-left:0;padding-top:0}.alert{font-weight:500;background:#fff;color:inherit;border-radius:0}.alert-primary{border-style:solid;border-color:#212730;border-width:0 0 0 4px}.alert-primary .alert-heading{color:#212730}.alert-secondary{border-style:solid;border-color:#f1f1f6;border-width:0 0 0 4px}.alert-secondary .alert-heading{color:#f1f1f6}.alert-success{border-style:solid;border-color:#3772ff;border-width:0 0 0 4px}.alert-success .alert-heading{color:#3772ff}.alert-info{border-style:solid;border-color:#c0e0de;border-width:0 0 0 4px}.alert-info .alert-heading{color:#c0e0de}.alert-warning{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-warning .alert-heading{color:#ed6a5a}.alert-danger{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-danger .alert-heading{color:#ed6a5a}.alert-light{border-style:solid;border-color:#d3f3ee;border-width:0 0 0 4px}.alert-light .alert-heading{color:#d3f3ee}.alert-dark{border-style:solid;border-color:#403f4c;border-width:0 0 0 4px}.alert-dark .alert-heading{color:#403f4c}.td-content{order:1}.td-content p,.td-content li,.td-content td{font-weight:400}.td-content>h1,.td-content>.h1{font-weight:700;margin-bottom:1rem}.td-content>h2,.td-content>.h2{margin-bottom:1rem}.td-content>h2:not(:first-child),.td-content>.h2:not(:first-child){margin-top:3rem}.td-content>h2+h3,.td-content>.h2+h3,.td-content>h2+.h3,.td-content>h2+.td-footer__links-item,.td-content>.h2+.h3,.td-content>.h2+.td-footer__links-item{margin-top:1rem}.td-content>h3,.td-content>.h3,.td-content>.td-footer__links-item,.td-content>h4,.td-content>.h4,.td-content>h5,.td-content>.h5,.td-content>h6,.td-content>.h6{margin-bottom:1rem;margin-top:2rem}.td-content blockquote{padding:0 0 0 1rem;margin-bottom:1rem;color:#6c757d;border-left:6px solid #f1f1f6}.td-content ul li,.td-content ol li{margin-bottom:.25rem}.td-content strong{font-weight:700}.td-content .alert:not(:first-child){margin-top:2rem;margin-bottom:2rem}.td-content .lead{margin-bottom:1.5rem}.td-title{margin-top:1rem;margin-bottom:.5rem}@media(min-width:576px){.td-title{font-size:3rem}}.td-search{background:0 0;position:relative;width:100%}.td-search__icon{display:flex;align-items:center;height:100%;position:absolute;left:.75em;pointer-events:none}.td-search__icon:before{content:"\f002"}.td-navbar .td-search__icon{color:rgba(255,255,255,.75)}.td-search__input{width:100%;text-indent:1.25em}.td-search__input:not(:focus){background:0 0}.td-search__input.form-control:focus{border-color:#f4f4f5;box-shadow:0 0 0 2px #7a7d83;color:inherit}.td-navbar .td-search__input{border:none;color:rgba(255,255,255,.75)}.td-navbar .td-search__input::-webkit-input-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search__input:-moz-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search__input::-moz-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search__input:-ms-input-placeholder{color:rgba(255,255,255,.75)}.td-search:focus-within .td-search__icon{display:none}.td-search:focus-within .td-search-input{text-indent:0}.td-search:not(:focus-within){color:#6c757d}.td-sidebar .td-search--algolia{display:block;padding:0 .5rem}.td-sidebar .td-search--algolia>button{margin:0;width:100%}.td-search--offline:focus-within .td-search__icon{display:flex;color:#6c757d}.td-offline-search-results{max-width:90%}.td-offline-search-results .card,.td-offline-search-results .td-content .highlight,.td-content .td-offline-search-results .highlight{margin-bottom:.5rem}.td-offline-search-results .card .card-header,.td-offline-search-results .td-content .highlight .card-header,.td-content .td-offline-search-results .highlight .card-header{font-weight:700}.td-offline-search-results__close-button{float:right}.td-offline-search-results__close-button:after{content:"\f00d"}.td-outer{display:flex;flex-direction:column;min-height:100vh}@media(min-width:768px){.td-default main>section:first-of-type{padding-top:8rem}}.td-main{flex-grow:1}.td-404 main,.td-main main{padding-top:1.5rem;padding-bottom:2rem}@media(min-width:768px){.td-404 main,.td-main main{padding-top:5.5rem}}.td-cover-block--height-min{min-height:300px}.td-cover-block--height-med{min-height:400px}.td-cover-block--height-max{min-height:500px}.td-cover-block--height-full{min-height:100vh}@media(min-width:768px){.td-cover-block--height-min{min-height:450px}.td-cover-block--height-med{min-height:500px}.td-cover-block--height-max{min-height:650px}}.td-cover-logo{margin-right:.5em}.td-cover-block{position:relative;padding-top:5rem;padding-bottom:5rem;background-repeat:no-repeat;background-position:50% 0;background-size:cover}.td-cover-block>.byline{position:absolute;bottom:2px;right:4px}.td-bg-arrow-wrapper{position:relative}.section-index .entry{padding:.75rem}.section-index h5,.section-index .h5{margin-bottom:0}.section-index h5 a,.section-index .h5 a{font-weight:700}.section-index p{margin-top:0}.pageinfo{font-weight:500;background:#f8f9fa;color:inherit;border-radius:0;margin:2rem;padding:1.5rem;padding-bottom:.5rem}.pageinfo-primary{border-style:solid;border-color:#212730}.pageinfo-secondary{border-style:solid;border-color:#f1f1f6}.pageinfo-success{border-style:solid;border-color:#3772ff}.pageinfo-info{border-style:solid;border-color:#c0e0de}.pageinfo-warning{border-style:solid;border-color:#ed6a5a}.pageinfo-danger{border-style:solid;border-color:#ed6a5a}.pageinfo-light{border-style:solid;border-color:#d3f3ee}.pageinfo-dark{border-style:solid;border-color:#403f4c}.taxonomy-terms-article{width:100%;clear:both;font-size:.8rem}.taxonomy-terms-article .taxonomy-title{display:inline;font-size:1.25em;height:1em;line-height:1em;margin-right:.5em;padding:0}.taxonomy-terms-cloud{width:100%;clear:both;font-size:.8rem}.taxonomy-terms-cloud .taxonomy-title{display:inline-block;width:100%;font-size:1rem;font-weight:700;color:#212730;border-bottom:1px #212730 solid;margin-bottom:1em;padding-bottom:.375rem;margin-top:1em}.taxonomy-terms-page{max-width:800px;margin:auto}.taxonomy-terms-page h1,.taxonomy-terms-page .h1{margin-bottom:1em}.taxonomy-terms-page .taxonomy-terms-cloud{font-size:1em}.taxonomy-terms-page .taxonomy-terms-cloud li{display:block}.taxonomy-terms-page .taxo-text-tags li+li::before{content:none}.taxonomy-terms-page .taxo-fruits .taxonomy-count,.taxonomy-terms-page .taxo-fruits .taxonomy-label{display:inherit;font-size:1rem;margin:0;padding:0;padding-right:.5em}.taxonomy-terms-page .taxo-fruits .taxonomy-count::before{content:"("}.taxonomy-terms-page .taxo-fruits .taxonomy-count::after{content:")"}.taxonomy-terms{list-style:none;margin:0;overflow:hidden;padding:0;display:inline}.taxonomy-terms li{display:inline;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.taxonomy-count{font-size:.8em;line-height:1.25em;display:inline-block;padding-left:.6em;padding-right:.6em;margin-left:.6em;text-align:center;border-radius:1em;background-color:#fff}.taxonomy-term{background:#e9ecef;border-width:0;border-radius:0 3px 3px 0;color:#6c757d;display:inline-block;font-size:1em;line-height:1.5em;min-height:1.5em;max-width:100%;padding:0 .5em 0 1em;position:relative;margin:0 .5em .2em 0;text-decoration:none;-webkit-transition:color .2s;-webkit-clip-path:polygon(100% 0,100% 100%,.8em 100%,0 50%,.8em 0);clip-path:polygon(100% 0,100% 100%,.8em 100%,0 50%,.8em 0)}.taxonomy-term:hover{background-color:#212730;color:#fff}.taxonomy-term:hover .taxonomy-count{color:#403f4c!important}.taxonomy-term:hover::before{background:#212730}.taxo-text-tags .taxonomy-term{background:0 0;border-width:0;border-radius:0;color:#6c757d;font-size:1em;line-height:1.5em;min-height:1.5em;max-width:100%;padding:0;position:relative;margin:0;text-decoration:none;-webkit-clip-path:none;clip-path:none}.taxo-text-tags .taxonomy-term:hover{background:0 0;color:#3489dd}.taxo-text-tags .taxonomy-term:hover .taxonomy-count{color:#403f4c!important}.taxo-text-tags .taxonomy-term:hover::before{background:0 0}.taxo-text-tags li+li::before{content:"|";color:#6c757d;margin-right:.2em}.taxo-text-tags .taxonomy-count{font-size:1em;line-height:1.25em;display:inline-block;padding:0;margin:0;text-align:center;border-radius:0;background:0 0;vertical-align:super;font-size:.75em}.taxo-text-tags .taxonomy-term:hover .taxonomy-count{color:#3489dd!important}.taxo-fruits .taxonomy-term[data-taxonomy-term]::before{font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";padding-right:.5em;font-size:2em;min-width:1.5em;display:inline-block}.taxo-fruits .taxonomy-term[data-taxonomy-term=apple]::before{content:"\f5d1";color:red}.taxo-fruits .taxonomy-term[data-taxonomy-term=carrot]::before{content:"\f787";color:orange}.taxo-fruits .taxonomy-term[data-taxonomy-term=lemon]::before{content:"\f094";color:#32cd32}.taxo-fruits .taxonomy-term[data-taxonomy-term=pepper]::before{content:"\f816";color:darkred}.taxo-fruits .taxonomy-term{background:0 0;border-width:0;border-radius:0;color:#6c757d;font-size:1em;line-height:2.5em;max-width:100%;padding:0;position:relative;margin:0;text-decoration:none;-webkit-clip-path:none;clip-path:none}.taxo-fruits .taxonomy-term:hover{background:0 0;color:#3489dd}.taxo-fruits .taxonomy-term:hover .taxonomy-count{color:#403f4c!important}.taxo-fruits .taxonomy-term:hover::before{background:0 0;text-shadow:0 0 3px #212529}.taxo-fruits .taxonomy-count,.taxo-fruits .taxonomy-label{display:none}.taxo-fruits.taxonomy-terms-article{margin-bottom:1rem}.taxo-fruits.taxonomy-terms-article .taxonomy-title{display:none}.taxonomy-taxonomy-page{max-width:800px;margin:auto}.taxonomy-taxonomy-page h1,.taxonomy-taxonomy-page .h1{margin-bottom:1em}.article-meta{margin-bottom:1.5rem}.article-teaser.article-type-docs h3 a:before,.article-teaser.article-type-docs .h3 a:before,.article-teaser.article-type-docs .td-footer__links-item a:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";content:"\f02d";padding-right:.5em}.article-teaser.article-type-blog h3 a:before,.article-teaser.article-type-blog .h3 a:before,.article-teaser.article-type-blog .td-footer__links-item a:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";content:"\f781";padding-right:.5em}.all-taxonomy-terms{font-weight:500;line-height:1.2;font-size:1.5rem}.all-taxonomy-terms:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";content:"\f122";padding-right:.5em}.article-teaser.card,.td-content .article-teaser.highlight{padding:1em;margin-bottom:1.5em}.article-teaser .breadcrumb{margin-bottom:0;font-size:.85rem}.article-teaser .article-meta{margin-bottom:0}div.drawio{display:inline-block;position:relative}div.drawio button{position:absolute;bottom:5px;right:5px;padding:.4em .5em;font-size:.8em;display:none}div.drawio:hover button{display:inline}div.drawioframe{position:fixed;height:100%;width:100%;top:0;left:0;z-index:1000;background:#000b;border:0}div.drawioframe iframe{position:absolute;height:90%;width:90%;top:5%;left:5%;z-index:1010}.tab-content .tab-pane{margin-top:0;margin-bottom:1.5rem;border-left:1px solid rgba(0,0,0,.125);border-right:1px solid rgba(0,0,0,.125);border-bottom:1px solid rgba(0,0,0,.125)}.tab-content .tab-pane .highlight{margin:0;border:none;max-width:100%}.tab-body{font-weight:500;background:#f8f9fa;color:inherit;border-radius:0;padding:1.5rem}.tab-body>:last-child{margin-bottom:0}.tab-body>.highlight:only-child{margin:-1.5rem;max-width:calc(100% + 3rem)}.tab-body-primary{border-style:solid;border-color:#212730}.tab-body-secondary{border-style:solid;border-color:#f1f1f6}.tab-body-success{border-style:solid;border-color:#3772ff}.tab-body-info{border-style:solid;border-color:#c0e0de}.tab-body-warning{border-style:solid;border-color:#ed6a5a}.tab-body-danger{border-style:solid;border-color:#ed6a5a}.tab-body-light{border-style:solid;border-color:#d3f3ee}.tab-body-dark{border-style:solid;border-color:#403f4c}.td-card.card .highlight,.td-content .td-card.highlight .highlight{border:none;margin:0}.td-card .card-body.code{background-color:#f8f9fa;padding:0 0 0 1ex}.td-card .card-body pre{margin:0;padding:0 1rem 1rem}.swagger-ui .info .title small pre,.swagger-ui .info .title .small pre,.swagger-ui .info .title .td-footer__copyright-etc pre,.swagger-ui .info .title .td-cover-block>.byline pre{background:#7d8492}.td-footer{min-height:150px;padding-top:3rem}@media(max-width:991.98px){.td-footer{min-height:200px}}.td-footer__about{font-size:initial}.td-footer__links-list{margin-bottom:0}.td-footer__links-item a{color:inherit!important}@media(min-width:768px){.td-offset-anchor:target{display:block;position:relative;top:-4rem;visibility:hidden}h2[id]:before,[id].h2:before,h3[id]:before,[id].h3:before,[id].td-footer__links-item:before,h4[id]:before,[id].h4:before,h5[id]:before,[id].h5:before{display:block;content:" ";margin-top:-5rem;height:5rem;visibility:hidden}}@font-face{font-family:open sans;font-style:normal;font-weight:300;src:local(""),url(/fonts/open-sans-v27-latin-300.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-300.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:500;src:local(""),url(/fonts/open-sans-v27-latin-500.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-500.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:400;src:local(""),url(/fonts/open-sans-v27-latin-regular.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-regular.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:700;src:local(""),url(/fonts/open-sans-v27-latin-700.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-700.woff)format("woff")}body{line-height:1.7em}.award{width:130px;transform:rotate(-20deg)}.td-navbar .navbar-brand svg{transform:scale(1.5);margin-right:1.5rem}.td-navbar .navbar-brand .text-uppercase{text-transform:none!important}.navbar-brand>.text-uppercase{font-weight:700}.td-content{max-width:60rem}.btn,.td-blog .td-rss-button,div.drawio button{border-radius:.2rem}.btn-lg,.btn-group-lg>.btn,.td-blog .td-rss-button,div.drawio .btn-group-lg>button{border-radius:.4rem}.btn-sm,.btn-group-sm>.btn,.td-blog .btn-group-sm>.td-rss-button,div.drawio .btn-group-sm>button{border-radius:.2rem}.btn-outline-light:hover{background-color:#f1f1f6;border-color:#f1f1f6}.youtube-video-wrapper{display:block;position:relative;padding-bottom:56.25%;height:0;overflow:hidden;width:100%;background:#000;margin:3rem 0}.youtube-video-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%;z-index:100;background:0 0}.youtube-video-wrapper img{-o-object-fit:cover;object-fit:cover;display:block;left:0;bottom:0;margin:0 auto;max-width:100%;width:100%;position:absolute;right:0;top:0;border:none;height:auto;cursor:pointer;transition:.4s all}.youtube-video-wrapper:hover img{-webkit-filter:brightness(75%)}.youtube-video-wrapper .play{height:72px;width:72px;left:50%;top:50%;margin-left:-36px;margin-top:-36px;position:absolute;background:url(../images/play.png)no-repeat;z-index:1;cursor:pointer}.youtube-video-wrapper .comment{left:50%;top:50%;transform:translate(-50%,50px);position:absolute;z-index:1;cursor:pointer;color:#fff}.ideal-image-slider{max-width:60rem;margin:2rem 0}.slider.small,.td-cover-block>.slider.byline,.slider.td-footer__copyright-etc{max-width:30rem}.print-only .noprint,.noprint .print-only{display:none}pre{max-width:100%}@media print{html,body{font-size:10pt;min-width:0!important}.noprint{display:none}.td-main main{max-width:100%!important;flex:1}.td-content{max-width:100%;-moz-column-gap:4rem;column-gap:4rem;font-size:1rem}.td-content p,.td-content ul,.td-content ol,.td-content .alert{line-height:1.7em;font-size:1em}.td-content>h1,.td-content>.h1,.td-content>h2,.td-content>.h2,.td-content>h3,.td-content>.h3,.td-content>.td-footer__links-item,.td-content>p,.td-content>ul,.td-content>ol,.td-content>.alert,.td-content>.highlight,.td-content>.lead,.td-content>dl dd,.td-content>pre,.td-content .footnotes,.td-content>blockquote{max-width:100%}.td-content li{margin-bottom:0!important}.td-content h2,.td-content .h2{font-size:1.6em;-moz-column-span:all;column-span:all}.td-content h3,.td-content .h3,.td-content .td-footer__links-item{font-size:1.3em}.td-content .print-figures{counter-reset:step-figure;margin:1rem 0;display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.td-content figure,.td-content .card,.td-content .highlight{position:relative;vertical-align:top;margin:0;padding:0!important;border:1px solid #000;border-radius:2mm;overflow:hidden;-moz-column-break-inside:avoid;break-inside:avoid;counter-increment:step-figure}.td-content figure figcaption,.td-content figure .card-body,.td-content .card figcaption,.td-content .highlight figcaption,.td-content .card .card-body,.td-content .highlight .card-body{position:relative;margin:0;padding:.2rem .5rem!important;border-top:inherit}.td-content .section-index,.td-content>.text-muted:last-child{display:none}.td-content .alert{border-width:2px;-moz-column-break-inside:avoid;break-inside:avoid}.td-content>table{margin:1rem auto;-moz-column-break-inside:avoid;break-inside:avoid}.td-content>table td,.td-content>table thead th{border:1px solid #000;padding:.25rem .75rem}}@media screen{.print-only{display:none}}#td-cover-block-0{background-position:50%}.container figure img{max-width:100%}.homepage-container{font-size:13pt}.lead{font-weight:500}.donations{background:#fff;border:1px solid #ddd;border-radius:4px;padding:1rem 2rem;display:inline-block;margin:1rem auto}.accordion .card-header{cursor:pointer;transition:background .1s}.accordion .card-header:hover{background-color:#fff}.alert.alert-info,.alert.alert-warning,.alert.alert-success{border:0;border-radius:4px;font-size:1rem}.alert.alert-info .alert-heading,.alert.alert-warning .alert-heading,.alert.alert-success .alert-heading{font-size:1.2rem}@media print{.alert.alert-info,.alert.alert-warning,.alert.alert-success{border-width:2px;border-style:solid}}.alert.alert-info{background:#e1f5fe;border-color:#1e88e5}.alert.alert-info .alert-heading{color:#1e88e5}.alert.alert-warning{background:#ffe7e4;border-color:#ed6a5a}.alert.alert-warning .alert-heading{color:#ed6a5a}.alert.alert-success{background:#ccefc6;border-color:#199f67}.alert.alert-success .alert-heading{color:#199f67}.alert>ul:last-child,.alert>p:last-child{margin-bottom:0}.nav-item.dropdown .dropdown-menu{margin-top:-1px}.nav-item.dropdown:hover .dropdown-menu{display:block}.dropdown-item{padding-left:1rem}.dropdown-item:active,.dropdown-item.active{background:0 0;font-weight:700}.td-content blockquote,.content blockquote{padding:.5rem 1.5rem;margin-left:1rem;border-left:4px solid #ddd;color:#777}.td-sidebar-nav{padding:1rem;font-family:open sans}.td-sidebar-nav ul{list-style:none;padding:0;margin:0}.td-sidebar-nav ul ul ul{padding-left:1.5rem}.td-sidebar-nav ul li{margin-bottom:2px}.td-sidebar-nav>ul>li{margin-bottom:1rem}.td-sidebar-nav>ul>li>a{font-weight:700;text-transform:uppercase}.td-sidebar-nav a{display:block;color:inherit;border-radius:3px;padding:.25rem .75rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.td-sidebar-nav a:hover{color:inherit;background:#f6f6f6}.td-sidebar-nav a.current-page{font-weight:700;color:#3489dd}@media(min-width:768px){.td-page-meta{top:4rem;position:-webkit-sticky;position:sticky}.td-sidebar-nav{max-height:none;overflow:initial}.td-sidebar__inner{height:auto;min-height:calc(100vh - 128px)}.td-docs .td-main{display:flex}.td-docs .td-main .td-sidebar{max-width:20rem;min-width:15rem;flex:1;margin-right:2rem}.td-docs .td-main .td-toc{order:2}.td-docs .td-main .td-toc .td-toc{top:4rem;position:-webkit-sticky;position:sticky;border-left:solid;border-left-width:1pt;border-left-color:#dee2e6;max-width:20rem;min-width:12rem;flex:1;margin-left:2rem;padding:1rem;line-height:1.2}.td-docs .td-main .td-toc .td-toc #TableOfContents a{color:inherit}.td-docs .td-main .td-toc .td-toc #TableOfContents a:hover{color:#72a1e5}.td-docs .td-main .td-toc .td-toc li ul{margin-bottom:.5em}.td-docs .td-main .td-toc .td-toc li li{margin-left:1.5em;font-size:.9em;list-style:inherit;display:list-item}.td-docs .td-main .td-toc .td-toc li ul{list-style:decimal}.td-docs .td-main>main{flex:4 4}}.feature-icon{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-size:200px;opacity:.06;pointer-events:none}.feature-cell{display:flex;flex-direction:column}address{padding-left:2rem;font-size:1.1em;line-height:1.5em;font-weight:100}footer{background:#212730;color:#fff;font-size:.8rem;min-height:0;flex:none;padding:1rem 0}.footer-copyright{line-height:1.5em}.print-qr-link{border:1px solid #000;background:#fff;display:none;align-items:center;overflow:hidden;padding:1mm;padding-left:4mm}@media print{.print-qr-link{display:flex}}.print-qr-link img{width:3cm;flex:none}.print-qr-link p{flex:1;margin:0;padding:0;font-size:11pt;overflow:hidden;word-wrap:break-word}.print-qr-link a{color:inherit;display:block;text-decoration:inherit;font-weight:700;font-family:SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace;white-space:wrap;letter-spacing:-.5pt}@page{size:A4 portrait;margin:.6in}.td-default main section.device-types-row{background:#f8f8f8;padding:0}.device-type-cell{text-align:center;padding-block:4rem;display:flex;flex-direction:column}.device-type-cell .label{order:-2;height:40px;align-self:center;display:flex;justify-content:center;align-items:center;padding:0 1.5rem;border-radius:1000px;margin-bottom:1rem;background:#eee;text-transform:uppercase;letter-spacing:.7pt;font-weight:700;font-size:80%}.device-type-cell h4,.device-type-cell .h4{order:-1}.device-type-cell.light{background:#fff}.device-type-cell img{margin-block:1rem;width:70%;height:200px;-o-object-fit:contain;object-fit:contain;align-self:center}.device-type-cell h4>span,.device-type-cell .h4>span{display:block;font-size:120%;opacity:.5;margin-top:.2rem}.device-type-cell.construction .label{background:#ffd600}.device-type-cell.construction img{opacity:.3}.device-type-cell.recommended .label{background:#0029a7;color:#fff}.device-type-cell ul{text-align:left} \ No newline at end of file diff --git a/scss/main.min.611c78ef5fdfcdf4dfa2c6fbd5b3729883793876344c02b22600f0046319865b.css b/scss/main.min.611c78ef5fdfcdf4dfa2c6fbd5b3729883793876344c02b22600f0046319865b.css deleted file mode 100644 index cf529d19..00000000 --- a/scss/main.min.611c78ef5fdfcdf4dfa2c6fbd5b3729883793876344c02b22600f0046319865b.css +++ /dev/null @@ -1,7 +0,0 @@ -@font-face{font-family:open sans;font-style:normal;font-weight:300;src:local(""),url(/fonts/open-sans-v27-latin-300.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-300.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:500;src:local(""),url(/fonts/open-sans-v27-latin-500.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-500.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:400;src:local(""),url(/fonts/open-sans-v27-latin-regular.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-regular.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:700;src:local(""),url(/fonts/open-sans-v27-latin-700.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-700.woff)format("woff")}@fa-font-path:"../webfonts";/*!* Bootstrap v4.5.3 (https://getbootstrap.com/) -* Copyright 2011-2020 The Bootstrap Authors -* Copyright 2011-2020 Twitter, Inc. -* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)*/:root{--blue:#72A1E5;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#BA5A31;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#888;--gray-dark:#333;--primary:#212730;--secondary:#f1f1f6;--success:#3772FF;--info:#C0E0DE;--warning:#ED6A5A;--danger:#ED6A5A;--light:#D3F3EE;--dark:#403F4C;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--font-family-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-size:1rem;font-weight:400;line-height:1.5;color:#222;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#3489dd;text-decoration:none;background-color:transparent}a:hover{color:#1c63a8;text-decoration:none}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#888;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:2.25rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.5rem}h4,.h4{font-size:1.35rem}h5,.h5{font-size:1.15rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:3rem;font-weight:700;line-height:1.2}.display-2{font-size:2.5rem;font-weight:700;line-height:1.2}.display-3{font-size:2rem;font-weight:700;line-height:1.2}.display-4{font-size:1.75rem;font-weight:700;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#888}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid,.td-content img{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;box-shadow:0 1px 2px rgba(0,0,0,.075);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#888}code{font-size:87.5%;color:#b3b3ce;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#222;box-shadow:inset 0 -.1rem rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;font-size:87.5%;color:#222}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width:576px){.container-sm,.container{max-width:540px}}@media(min-width:768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width:992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width:1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col-xl,.col-xl-auto,.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-lg,.col-lg-auto,.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-md,.col-md-auto,.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-sm,.col-sm-auto,.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col,.col-auto,.col-12,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-auto{flex:none;width:auto;max-width:100%}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-auto{flex:none;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-auto{flex:none;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-auto{flex:none;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-auto{flex:none;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table,.td-content>table,.td-box .row.section>table{width:100%;margin-bottom:1rem;color:#222}.table th,.td-content>table th,.td-box .row.section>table th,.table td,.td-content>table td,.td-box .row.section>table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th,.td-content>table thead th,.td-box .row.section>table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody,.td-content>table tbody+tbody,.td-box .row.section>table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd),.td-content>table tbody tr:nth-of-type(odd),.td-box .row.section>table tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,5%)}.table-hover tbody tr:hover{color:#222;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c1c3c5}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#8c8f93}.table-hover .table-primary:hover{background-color:#b4b6b9}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b4b6b9}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#fbfbfc}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#f8f8fa}.table-hover .table-secondary:hover{background-color:#ececf1}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#ececf1}.table-success,.table-success>th,.table-success>td{background-color:#c7d8ff}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#97b6ff}.table-hover .table-success:hover{background-color:#aec6ff}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aec6ff}.table-info,.table-info>th,.table-info>td{background-color:#edf6f6}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#deefee}.table-hover .table-info:hover{background-color:#dceeee}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#dceeee}.table-warning,.table-warning>th,.table-warning>td{background-color:#fad5d1}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#f6b2a9}.table-hover .table-warning:hover{background-color:#f8c0ba}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#f8c0ba}.table-danger,.table-danger>th,.table-danger>td{background-color:#fad5d1}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#f6b2a9}.table-hover .table-danger:hover{background-color:#f8c0ba}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f8c0ba}.table-light,.table-light>th,.table-light>td{background-color:#f3fcfa}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#e8f9f6}.table-hover .table-light:hover{background-color:#dff7f2}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#dff7f2}.table-dark,.table-dark>th,.table-dark>td{background-color:#cac9cd}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#9c9ba2}.table-hover .table-dark:hover{background-color:#bdbcc1}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#bdbcc1}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th,.td-content>table .thead-dark th,.td-box .row.section>table .thead-dark th{color:#fff;background-color:#333;border-color:#464646}.table .thead-light th,.td-content>table .thead-light th,.td-box .row.section>table .thead-light th{color:#495057;background-color:#eee;border-color:#dee2e6}.table-dark{color:#fff;background-color:#333}.table-dark th,.table-dark td,.table-dark thead th{border-color:#464646}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd),.td-content>table.table-dark tbody tr:nth-of-type(odd),.td-box .row.section>table.table-dark tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,5%)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media(max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media(max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media(max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media(max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive,.td-content>table,.td-box .row.section>table{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered,.td-content>table>.table-bordered,.td-box .row.section>table>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border-radius:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#55647c;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(33,39,48,.25)}.form-control::-moz-placeholder{color:#888;opacity:1}.form-control:-ms-input-placeholder{color:#888;opacity:1}.form-control::placeholder{color:#888;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eee;opacity:1}input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#222;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{color:#888}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#3772ff}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(55,114,255,.9)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3772ff;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%233772FF' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3772ff;box-shadow:0 0 0 .2rem rgba(55,114,255,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#3772ff;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%233772FF' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e")#fff no-repeat center right 1.75rem/calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#3772ff;box-shadow:0 0 0 .2rem rgba(55,114,255,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3772ff}.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip,.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-control-input:valid~.custom-control-label,.custom-control-input.is-valid~.custom-control-label{color:#3772ff}.was-validated .custom-control-input:valid~.custom-control-label::before,.custom-control-input.is-valid~.custom-control-label::before{border-color:#3772ff}.was-validated .custom-control-input:valid:checked~.custom-control-label::before,.custom-control-input.is-valid:checked~.custom-control-label::before{border-color:#6a96ff;background:#6a96ff linear-gradient(180deg,#80a6ff,#6a96ff)repeat-x}.was-validated .custom-control-input:valid:focus~.custom-control-label::before,.custom-control-input.is-valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(55,114,255,.25)}.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before{border-color:#3772ff}.was-validated .custom-file-input:valid~.custom-file-label,.custom-file-input.is-valid~.custom-file-label{border-color:#3772ff}.was-validated .custom-file-input:valid:focus~.custom-file-label,.custom-file-input.is-valid:focus~.custom-file-label{border-color:#3772ff;box-shadow:0 0 0 .2rem rgba(55,114,255,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#ed6a5a}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(237,106,90,.9)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ed6a5a;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ED6A5A' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ED6A5A' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ed6a5a;box-shadow:0 0 0 .2rem rgba(237,106,90,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#ed6a5a;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ED6A5A' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ED6A5A' stroke='none'/%3e%3c/svg%3e")#fff no-repeat center right 1.75rem/calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#ed6a5a;box-shadow:0 0 0 .2rem rgba(237,106,90,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ed6a5a}.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip,.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-control-input:invalid~.custom-control-label,.custom-control-input.is-invalid~.custom-control-label{color:#ed6a5a}.was-validated .custom-control-input:invalid~.custom-control-label::before,.custom-control-input.is-invalid~.custom-control-label::before{border-color:#ed6a5a}.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,.custom-control-input.is-invalid:checked~.custom-control-label::before{border-color:#f29488;background:#f29488 linear-gradient(180deg,#f4a49a,#f29488)repeat-x}.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,.custom-control-input.is-invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(237,106,90,.25)}.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before{border-color:#ed6a5a}.was-validated .custom-file-input:invalid~.custom-file-label,.custom-file-input.is-invalid~.custom-file-label{border-color:#ed6a5a}.was-validated .custom-file-input:invalid:focus~.custom-file-label,.custom-file-input.is-invalid:focus~.custom-file-label{border-color:#ed6a5a;box-shadow:0 0 0 .2rem rgba(237,106,90,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:none;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#222;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#222;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(33,39,48,.25)}.btn.disabled,.btn:disabled{opacity:.65;box-shadow:none}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled):active,.btn:not(:disabled):not(.disabled).active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:not(:disabled):not(.disabled):active:focus,.btn:not(:disabled):not(.disabled).active:focus{box-shadow:0 0 0 .2rem rgba(33,39,48,.25),inset 0 3px 5px rgba(0,0,0,.125)}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x;border-color:#212730;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-primary:hover{color:#fff;background:#111519 linear-gradient(180deg,#35383c,#111519)repeat-x;border-color:#0c0e12}.btn-primary:focus,.btn-primary.focus{color:#fff;background:#111519 linear-gradient(180deg,#35383c,#111519)repeat-x;border-color:#0c0e12;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(66,71,79,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#212730;border-color:#212730;background-image:none}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0c0e12;background-image:none;border-color:#07080a}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(66,71,79,.5)}.btn-secondary{color:#222;background:#f1f1f6 linear-gradient(180deg,#f3f3f7,#f1f1f6)repeat-x;border-color:#f1f1f6;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-secondary:hover{color:#222;background:#dadae7 linear-gradient(180deg,#dfdfeb,#dadae7)repeat-x;border-color:#d2d2e2}.btn-secondary:focus,.btn-secondary.focus{color:#222;background:#dadae7 linear-gradient(180deg,#dfdfeb,#dadae7)repeat-x;border-color:#d2d2e2;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(210,210,214,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#222;background-color:#f1f1f6;border-color:#f1f1f6;background-image:none}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#222;background-color:#d2d2e2;background-image:none;border-color:#cacadd}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(210,210,214,.5)}.btn-success{color:#fff;background:#3772ff linear-gradient(180deg,#5587ff,#3772FF)repeat-x;border-color:#3772ff;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-success:hover{color:#fff;background:#1157ff linear-gradient(180deg,#3470ff,#1157ff)repeat-x;border-color:#044eff}.btn-success:focus,.btn-success.focus{color:#fff;background:#1157ff linear-gradient(180deg,#3470ff,#1157ff)repeat-x;border-color:#044eff;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(85,135,255,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#3772ff;border-color:#3772ff;background-image:none}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#044eff;background-image:none;border-color:#0049f6}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(85,135,255,.5)}.btn-info{color:#222;background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x;border-color:#c0e0de;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-info:hover{color:#fff;background:#a6d3d1 linear-gradient(180deg,#b4dad8,#a6d3d1)repeat-x;border-color:#9ecfcc}.btn-info:focus,.btn-info.focus{color:#fff;background:#a6d3d1 linear-gradient(180deg,#b4dad8,#a6d3d1)repeat-x;border-color:#9ecfcc;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(168,196,194,.5)}.btn-info.disabled,.btn-info:disabled{color:#222;background-color:#c0e0de;border-color:#c0e0de;background-image:none}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#9ecfcc;background-image:none;border-color:#95cbc8}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(168,196,194,.5)}.btn-warning{color:#fff;background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x;border-color:#ed6a5a;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-warning:hover{color:#fff;background:#e94b38 linear-gradient(180deg,#ed6655,#e94b38)repeat-x;border-color:#e8402c}.btn-warning:focus,.btn-warning.focus{color:#fff;background:#e94b38 linear-gradient(180deg,#ed6655,#e94b38)repeat-x;border-color:#e8402c;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(240,128,115,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a;background-image:none}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#e8402c;background-image:none;border-color:#e73621}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(240,128,115,.5)}.btn-danger{color:#fff;background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x;border-color:#ed6a5a;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger:hover{color:#fff;background:#e94b38 linear-gradient(180deg,#ed6655,#e94b38)repeat-x;border-color:#e8402c}.btn-danger:focus,.btn-danger.focus{color:#fff;background:#e94b38 linear-gradient(180deg,#ed6655,#e94b38)repeat-x;border-color:#e8402c;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(240,128,115,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a;background-image:none}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#e8402c;background-image:none;border-color:#e73621}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(240,128,115,.5)}.btn-light{color:#222;background:#d3f3ee linear-gradient(180deg,#daf5f1,#D3F3EE)repeat-x;border-color:#d3f3ee;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-light:hover{color:#222;background:#b5ebe2 linear-gradient(180deg,#c0eee7,#b5ebe2)repeat-x;border-color:#abe8df}.btn-light:focus,.btn-light.focus{color:#222;background:#b5ebe2 linear-gradient(180deg,#c0eee7,#b5ebe2)repeat-x;border-color:#abe8df;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(184,212,207,.5)}.btn-light.disabled,.btn-light:disabled{color:#222;background-color:#d3f3ee;border-color:#d3f3ee;background-image:none}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#222;background-color:#abe8df;background-image:none;border-color:#a1e5db}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(184,212,207,.5)}.btn-dark{color:#fff;background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x;border-color:#403f4c;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-dark:hover{color:#fff;background:#2e2e37 linear-gradient(180deg,#4e4d55,#2e2e37)repeat-x;border-color:#292830}.btn-dark:focus,.btn-dark.focus{color:#fff;background:#2e2e37 linear-gradient(180deg,#4e4d55,#2e2e37)repeat-x;border-color:#292830;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(93,92,103,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#403f4c;border-color:#403f4c;background-image:none}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#292830;background-image:none;border-color:#232229}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(93,92,103,.5)}.btn-outline-primary{color:#212730;border-color:#212730}.btn-outline-primary:hover{color:#fff;background-color:#212730;border-color:#212730}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(33,39,48,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#212730;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#212730;border-color:#212730}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(33,39,48,.5)}.btn-outline-secondary{color:#f1f1f6;border-color:#f1f1f6}.btn-outline-secondary:hover{color:#222;background-color:#f1f1f6;border-color:#f1f1f6}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(241,241,246,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#f1f1f6;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#222;background-color:#f1f1f6;border-color:#f1f1f6}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(241,241,246,.5)}.btn-outline-success{color:#3772ff;border-color:#3772ff}.btn-outline-success:hover{color:#fff;background-color:#3772ff;border-color:#3772ff}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(55,114,255,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#3772ff;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#3772ff;border-color:#3772ff}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(55,114,255,.5)}.btn-outline-info{color:#c0e0de;border-color:#c0e0de}.btn-outline-info:hover{color:#222;background-color:#c0e0de;border-color:#c0e0de}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(192,224,222,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#c0e0de;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#222;background-color:#c0e0de;border-color:#c0e0de}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(192,224,222,.5)}.btn-outline-warning{color:#ed6a5a;border-color:#ed6a5a}.btn-outline-warning:hover{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ed6a5a;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-danger{color:#ed6a5a;border-color:#ed6a5a}.btn-outline-danger:hover{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#ed6a5a;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-light{color:#d3f3ee;border-color:#d3f3ee}.btn-outline-light:hover{color:#222;background-color:#d3f3ee;border-color:#d3f3ee}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(211,243,238,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#d3f3ee;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#222;background-color:#d3f3ee;border-color:#d3f3ee}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(211,243,238,.5)}.btn-outline-dark{color:#403f4c;border-color:#403f4c}.btn-outline-dark:hover{color:#fff;background-color:#403f4c;border-color:#403f4c}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(64,63,76,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#403f4c;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#403f4c;border-color:#403f4c}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(64,63,76,.5)}.btn-link{font-weight:400;color:#3489dd;text-decoration:none}.btn-link:hover{color:#1c63a8;text-decoration:none}.btn-link:focus,.btn-link.focus{text-decoration:none}.btn-link:disabled,.btn-link.disabled{color:#888;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#222;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);box-shadow:0 .5rem 1rem rgba(0,0,0,.175)}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=top],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #eee}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#222;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#151515;text-decoration:none;background:#f8f9fa linear-gradient(180deg,#f9fafb,#f8f9fa)repeat-x}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x}.dropdown-item.disabled,.dropdown-item:disabled{color:#888;pointer-events:none;background-color:transparent;background-image:none}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#888;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#222}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group.show .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:auto;width:1%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus~.custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-file{display:flex;align-items:center}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#eee;border:1px solid #ccc}.input-group-text input[type=radio],.input-group-text input[type=checkbox]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + .5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#212730;background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x;box-shadow:}.custom-control-input:focus~.custom-control-label::before{box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(33,39,48,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#55647c}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#6b7d99;border-color:#6b7d99;box-shadow:}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#888}.custom-control-input[disabled]~.custom-control-label::before,.custom-control-input:disabled~.custom-control-label::before{background-color:#eee}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50%}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#212730;background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x;box-shadow:}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background:rgba(33,39,48,.5)linear-gradient(180deg,rgba(110,114,120,.575),rgba(33,39,48,.5))repeat-x}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background:rgba(33,39,48,.5)linear-gradient(180deg,rgba(110,114,120,.575),rgba(33,39,48,.5))repeat-x}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background:rgba(33,39,48,.5)linear-gradient(180deg,rgba(110,114,120,.575),rgba(33,39,48,.5))repeat-x}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background:rgba(33,39,48,.5)linear-gradient(180deg,rgba(110,114,120,.575),rgba(33,39,48,.5))repeat-x}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")no-repeat right .75rem center/8px 10px;border:1px solid #ccc;border-radius:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075);-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#55647c;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 0 .2rem rgba(33,39,48,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#888;background-color:#eee}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#55647c;box-shadow:0 0 0 .2rem rgba(33,39,48,.25)}.custom-file-input[disabled]~.custom-file-label,.custom-file-input:disabled~.custom-file-label{background-color:#eee}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background:#eee linear-gradient(180deg,#f1f1f1,#eee)repeat-x;border-left:inherit}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(33,39,48,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(33,39,48,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(33,39,48,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x;border:0;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background:#6b7d99 linear-gradient(180deg,#8191a8,#6b7d99)repeat-x}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x;border:0;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background:#6b7d99 linear-gradient(180deg,#8191a8,#6b7d99)repeat-x}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x;border:0;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background:#6b7d99 linear-gradient(180deg,#8191a8,#6b7d99)repeat-x}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-fill-lower{background-color:#dee2e6}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#888;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#eee #eee #dee2e6}.nav-tabs .nav-link.disabled{color:#888;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#212730}.nav-fill>.nav-link,.nav-fill .nav-item{flex:auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media(max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media(min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media(min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media(min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media(min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.75);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.75)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card,.td-content .highlight{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125)}.card>hr,.td-content .highlight>hr{margin-right:0;margin-left:0}.card>.list-group,.td-content .highlight>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child,.td-content .highlight>.list-group:first-child{border-top-width:0}.card>.list-group:last-child,.td-content .highlight>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.td-content .highlight>.card-header+.list-group,.card>.list-group+.card-footer,.td-content .highlight>.list-group+.card-footer{border-top:0}.card-body{flex:auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,3%);border-bottom:1px solid rgba(0,0,0,.125)}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,3%);border-top:1px solid rgba(0,0,0,.125)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-top,.card-img-bottom{flex-shrink:0;width:100%}.card-deck .card,.card-deck .td-content .highlight,.td-content .card-deck .highlight{margin-bottom:15px}@media(min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card,.card-deck .td-content .highlight,.td-content .card-deck .highlight{flex:1 0;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card,.td-content .card-group>.highlight{margin-bottom:15px}@media(min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card,.td-content .card-group>.highlight{flex:1 0;margin-bottom:0}.card-group>.card+.card,.td-content .card-group>.highlight+.card,.td-content .card-group>.card+.highlight,.td-content .card-group>.highlight+.highlight{margin-left:0;border-left:0}}.card-columns .card,.card-columns .td-content .highlight,.td-content .card-columns .highlight{margin-bottom:.75rem}@media(min-width:576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card,.card-columns .td-content .highlight,.td-content .card-columns .highlight{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card,.td-content .accordion>.highlight{overflow:hidden}.accordion>.card:not(:last-of-type),.td-content .accordion>.highlight:not(:last-of-type){border-bottom:0}.accordion>.card>.card-header,.td-content .accordion>.highlight>.card-header{margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eee}.breadcrumb-item{display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#888;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#888}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#888;background-color:#fff;border:1px solid rgba(0,0,0,.1)}.page-link:hover{z-index:2;color:#1c63a8;text-decoration:none;background-color:#eee;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(33,39,48,.25)}.page-item:first-child .page-link{margin-left:0}.page-item.active .page-link{z-index:3;color:#fff;background-color:#212730;border-color:#171b21}.page-item.disabled .page-link{color:#dee2e6;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em}.badge-primary{color:#fff;background-color:#212730}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#0c0e12}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(33,39,48,.5)}.badge-secondary{color:#222;background-color:#f1f1f6}a.badge-secondary:hover,a.badge-secondary:focus{color:#222;background-color:#d2d2e2}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(241,241,246,.5)}.badge-success{color:#fff;background-color:#3772ff}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#044eff}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(55,114,255,.5)}.badge-info{color:#222;background-color:#c0e0de}a.badge-info:hover,a.badge-info:focus{color:#222;background-color:#9ecfcc}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(192,224,222,.5)}.badge-warning{color:#fff;background-color:#ed6a5a}a.badge-warning:hover,a.badge-warning:focus{color:#fff;background-color:#e8402c}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.badge-danger{color:#fff;background-color:#ed6a5a}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#e8402c}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.badge-light{color:#222;background-color:#d3f3ee}a.badge-light:hover,a.badge-light:focus{color:#222;background-color:#abe8df}a.badge-light:focus,a.badge-light.focus{outline:0;box-shadow:0 0 0 .2rem rgba(211,243,238,.5)}.badge-dark{color:#fff;background-color:#403f4c}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#292830}a.badge-dark:focus,a.badge-dark.focus{outline:0;box-shadow:0 0 0 .2rem rgba(64,63,76,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eee}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#111419;background:#d3d4d6 linear-gradient(180deg,#dadadc,#d3d4d6)repeat-x;border-color:#c1c3c5}.alert-primary hr{border-top-color:#b4b6b9}.alert-primary .alert-link{color:#000}.alert-secondary{color:#7d7d80;background:#fcfcfd linear-gradient(180deg,#fcfcfd,#fcfcfd)repeat-x;border-color:#fbfbfc}.alert-secondary hr{border-top-color:#ececf1}.alert-secondary .alert-link{color:#646466}.alert-success{color:#1d3b85;background:#d7e3ff linear-gradient(180deg,#dde7ff,#d7e3ff)repeat-x;border-color:#c7d8ff}.alert-success hr{border-top-color:#aec6ff}.alert-success .alert-link{color:#14285b}.alert-info{color:#647473;background:#f2f9f8 linear-gradient(180deg,#f4faf9,#f2f9f8)repeat-x;border-color:#edf6f6}.alert-info hr{border-top-color:#dceeee}.alert-info .alert-link{color:#4c5958}.alert-warning{color:#7b372f;background:#fbe1de linear-gradient(180deg,#fce6e3,#fbe1de)repeat-x;border-color:#fad5d1}.alert-warning hr{border-top-color:#f8c0ba}.alert-warning .alert-link{color:#562721}.alert-danger{color:#7b372f;background:#fbe1de linear-gradient(180deg,#fce6e3,#fbe1de)repeat-x;border-color:#fad5d1}.alert-danger hr{border-top-color:#f8c0ba}.alert-danger .alert-link{color:#562721}.alert-light{color:#6e7e7c;background:#f6fdfc linear-gradient(180deg,#f7fdfc,#f6fdfc)repeat-x;border-color:#f3fcfa}.alert-light hr{border-top-color:#dff7f2}.alert-light .alert-link{color:#566361}.alert-dark{color:#212128;background:#d9d9db linear-gradient(180deg,#dfdfe0,#d9d9db)repeat-x;border-color:#cac9cd}.alert-dark hr{border-top-color:#bdbcc1}.alert-dark .alert-link{color:#0a0a0c}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#eee;box-shadow:inset 0 .1rem .1rem rgba(0,0,0,.1)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#212730;transition:width .6s ease}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media(prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#222;background-color:#eee}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item.disabled,.list-group-item:disabled{color:#888;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#212730;border-color:#212730}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#111419;background-color:#c1c3c5}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#111419;background-color:#b4b6b9}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#111419;border-color:#111419}.list-group-item-secondary{color:#7d7d80;background-color:#fbfbfc}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#7d7d80;background-color:#ececf1}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#7d7d80;border-color:#7d7d80}.list-group-item-success{color:#1d3b85;background-color:#c7d8ff}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#1d3b85;background-color:#aec6ff}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1d3b85;border-color:#1d3b85}.list-group-item-info{color:#647473;background-color:#edf6f6}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#647473;background-color:#dceeee}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#647473;border-color:#647473}.list-group-item-warning{color:#7b372f;background-color:#fad5d1}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#7b372f;background-color:#f8c0ba}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#7b372f;border-color:#7b372f}.list-group-item-danger{color:#7b372f;background-color:#fad5d1}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#7b372f;background-color:#f8c0ba}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#7b372f;border-color:#7b372f}.list-group-item-light{color:#6e7e7c;background-color:#f3fcfa}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#6e7e7c;background-color:#dff7f2}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#6e7e7c;border-color:#6e7e7c}.list-group-item-dark{color:#212128;background-color:#cac9cd}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#212128;background-color:#bdbcc1}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#212128;border-color:#212128}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#888;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,5%)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);box-shadow:0 .25rem .5rem rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-content{box-shadow:0 .5rem 1rem rgba(0,0,0,.5)}.modal-sm{max-width:300px}}@media(min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^=top]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^=top] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^=top] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^=right]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^=right] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^=bottom] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^=bottom] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^=left]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^=left] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);box-shadow:0 .25rem .5rem rgba(0,0,0,.2)}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^=top]{margin-bottom:.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^=top]>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^=top]>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^=top]>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^=right]{margin-left:.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^=right]>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^=right]>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^=right]>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^=bottom]{margin-top:.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^=bottom]>.arrow{top:calc(-.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^=bottom]>.arrow::before{top:0;border-width:0 .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^=bottom]>.arrow::after{top:1px;border-width:0 .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^=left]{margin-right:.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^=left]>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^=left]>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^=left]>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#222}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0;background-image:linear-gradient(90deg,rgba(0,0,0,.25),rgba(0,0,0,.1%))}.carousel-control-next{right:0;background-image:linear-gradient(270deg,rgba(0,0,0,.25),rgba(0,0,0,.1%))}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:initial;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#212730!important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#0c0e12!important}.bg-secondary{background-color:#f1f1f6!important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#d2d2e2!important}.bg-success{background-color:#3772ff!important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#044eff!important}.bg-info{background-color:#c0e0de!important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#9ecfcc!important}.bg-warning{background-color:#ed6a5a!important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#e8402c!important}.bg-danger{background-color:#ed6a5a!important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#e8402c!important}.bg-light{background-color:#d3f3ee!important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#abe8df!important}.bg-dark{background-color:#403f4c!important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#292830!important}.bg-gradient-primary{background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x!important}.bg-gradient-secondary{background:#f1f1f6 linear-gradient(180deg,#f3f3f7,#f1f1f6)repeat-x!important}.bg-gradient-success{background:#3772ff linear-gradient(180deg,#5587ff,#3772FF)repeat-x!important}.bg-gradient-info{background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x!important}.bg-gradient-warning{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.bg-gradient-danger{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.bg-gradient-light{background:#d3f3ee linear-gradient(180deg,#daf5f1,#D3F3EE)repeat-x!important}.bg-gradient-dark{background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#212730!important}.border-secondary{border-color:#f1f1f6!important}.border-success{border-color:#3772ff!important}.border-info{border-color:#c0e0de!important}.border-warning{border-color:#ed6a5a!important}.border-danger{border-color:#ed6a5a!important}.border-light{border-color:#d3f3ee!important}.border-dark{border-color:#403f4c!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media(min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media(min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media(min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media(min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714286%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media(min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media(min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media(min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media(min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media(min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media(min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media(min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media(min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media(min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media(min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media(min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media(min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media(min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media(min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media(min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media(min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#212730!important}a.text-primary:hover,a.text-primary:focus{color:#020203!important}.text-secondary{color:#f1f1f6!important}a.text-secondary:hover,a.text-secondary:focus{color:#c2c2d8!important}.text-success{color:#3772ff!important}a.text-success:hover,a.text-success:focus{color:#0045ea!important}.text-info{color:#c0e0de!important}a.text-info:hover,a.text-info:focus{color:#8dc7c3!important}.text-warning{color:#ed6a5a!important}a.text-warning:hover,a.text-warning:focus{color:#e22f19!important}.text-danger{color:#ed6a5a!important}a.text-danger:hover,a.text-danger:focus{color:#e22f19!important}.text-light{color:#d3f3ee!important}a.text-light:hover,a.text-light:focus{color:#97e3d7!important}.text-dark{color:#403f4c!important}a.text-dark:hover,a.text-dark:focus{color:#1d1c22!important}.text-body{color:#222!important}.text-muted{color:#888!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,*::before,*::after{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title)")"}pre{white-space:pre-wrap!important}pre,blockquote{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table,.td-content>table,.td-box .row.section>table{border-collapse:collapse!important}.table td,.td-content>table td,.td-box .row.section>table td,.table th,.td-content>table th,.td-box .row.section>table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#dee2e6}.table .thead-dark th,.td-content>table .thead-dark th,.td-box .row.section>table .thead-dark th{color:inherit;border-color:#dee2e6}}/*!* Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com -* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/.fa,.fas,.far,.fal,.fad,.fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fas.fa-pull-left,.far.fa-pull-left,.fal.fa-pull-left,.fab.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fas.fa-pull-right,.far.fa-pull-right,.fal.fa-pull-right,.fab.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(-1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-flip-both{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}/*!* Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com -* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/@font-face{font-family:'font awesome 5 free';font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix)format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2)format("woff2"),url(../webfonts/fa-solid-900.woff)format("woff"),url(../webfonts/fa-solid-900.ttf)format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome)format("svg")}.fa,.fas{font-family:'font awesome 5 free';font-weight:900}/*!* Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com -* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/@font-face{font-family:'font awesome 5 brands';font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix)format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2)format("woff2"),url(../webfonts/fa-brands-400.woff)format("woff"),url(../webfonts/fa-brands-400.ttf)format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome)format("svg")}.fab{font-family:'font awesome 5 brands';font-weight:400}.td-border-top{border:none;border-top:1px solid #eee}.td-border-none{border:none}.td-block-padding,.td-default main section{padding-top:4rem;padding-bottom:4rem}@media(min-width:768px){.td-block-padding,.td-default main section{padding-top:5rem;padding-bottom:5rem}}.td-overlay{position:relative}.td-overlay::after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.td-overlay--dark::after{background-color:rgba(64,63,76,.3)}.td-overlay--light::after{background-color:rgba(211,243,238,.3)}.td-overlay__inner{position:relative;z-index:1}@media(min-width:992px){.td-max-width-on-larger-screens,.td-content>pre,.td-content>.highlight,.td-content>.lead,.td-content>h1,.td-content>h2,.td-content>ul,.td-content>ol,.td-content>p,.td-content>blockquote,.td-content>dl dd,.td-content .footnotes,.td-content>.alert{max-width:80%}}.-bg-blue{color:#fff;background-color:#72a1e5}.-bg-blue p>a{color:#a0c0ee}.-bg-blue p>a:hover{color:#1c63a8}.-text-blue{color:#72a1e5}.-bg-indigo{color:#fff;background-color:#6610f2}.-bg-indigo p>a{color:#b8cff2}.-bg-indigo p>a:hover{color:#1c63a8}.-text-indigo{color:#6610f2}.-bg-purple{color:#fff;background-color:#6f42c1}.-bg-purple p>a{color:#b7cff2}.-bg-purple p>a:hover{color:#1c63a8}.-text-purple{color:#6f42c1}.-bg-pink{color:#fff;background-color:#e83e8c}.-bg-pink p>a{color:#aec9f0}.-bg-pink p>a:hover{color:#1c63a8}.-text-pink{color:#e83e8c}.-bg-red{color:#fff;background-color:#dc3545}.-bg-red p>a{color:#b4cdf1}.-bg-red p>a:hover{color:#1c63a8}.-text-red{color:#dc3545}.-bg-orange{color:#fff;background-color:#ba5a31}.-bg-orange p>a{color:#bed4f3}.-bg-orange p>a:hover{color:#1c63a8}.-text-orange{color:#ba5a31}.-bg-yellow{color:#fff;background-color:#ffc107}.-bg-yellow p>a{color:#b7cff2}.-bg-yellow p>a:hover{color:#1c63a8}.-text-yellow{color:#ffc107}.-bg-green{color:#fff;background-color:#28a745}.-bg-green p>a{color:#c6d9f4}.-bg-green p>a:hover{color:#1c63a8}.-text-green{color:#28a745}.-bg-teal{color:#fff;background-color:#20c997}.-bg-teal p>a{color:#bfd4f3}.-bg-teal p>a:hover{color:#1c63a8}.-text-teal{color:#20c997}.-bg-cyan{color:#fff;background-color:#17a2b8}.-bg-cyan p>a{color:#c6d9f4}.-bg-cyan p>a:hover{color:#1c63a8}.-text-cyan{color:#17a2b8}.-bg-white{color:#222;background-color:#fff}.-bg-white p>a{color:#72a1e5}.-bg-white p>a:hover{color:#1c63a8}.-text-white{color:#fff}.-bg-gray{color:#fff;background-color:#888}.-bg-gray p>a{color:#b4cdf1}.-bg-gray p>a:hover{color:#1c63a8}.-text-gray{color:#888}.-bg-gray-dark{color:#fff;background-color:#333}.-bg-gray-dark p>a{color:#e3ecfa}.-bg-gray-dark p>a:hover{color:#1c63a8}.-text-gray-dark{color:#333}.-bg-primary{color:#fff;background-color:#212730}.-bg-primary p>a{color:#e9f0fb}.-bg-primary p>a:hover{color:#1c63a8}.-text-primary{color:#212730}.-bg-secondary{color:#222;background-color:#f1f1f6}.-bg-secondary p>a{color:#6e9bdc}.-bg-secondary p>a:hover{color:#1c63a8}.-text-secondary{color:#f1f1f6}.-bg-success{color:#fff;background-color:#3772ff}.-bg-success p>a{color:#a9c6ef}.-bg-success p>a:hover{color:#1c63a8}.-text-success{color:#3772ff}.-bg-info{color:#222;background-color:#c0e0de}.-bg-info p>a{color:#638ac1}.-bg-info p>a:hover{color:#1c63a8}.-text-info{color:#c0e0de}.-bg-warning{color:#fff;background-color:#ed6a5a}.-bg-warning p>a{color:#a5c3ee}.-bg-warning p>a:hover{color:#1c63a8}.-text-warning{color:#ed6a5a}.-bg-danger{color:#fff;background-color:#ed6a5a}.-bg-danger p>a{color:#a5c3ee}.-bg-danger p>a:hover{color:#1c63a8}.-text-danger{color:#ed6a5a}.-bg-light{color:#222;background-color:#d3f3ee}.-bg-light p>a{color:#6993d0}.-bg-light p>a:hover{color:#1c63a8}.-text-light{color:#d3f3ee}.-bg-dark{color:#fff;background-color:#403f4c}.-bg-dark p>a{color:#d9e5f8}.-bg-dark p>a:hover{color:#1c63a8}.-text-dark{color:#403f4c}.-bg-100{color:#222;background-color:#f8f9fa}.-bg-100 p>a{color:#709ee0}.-bg-100 p>a:hover{color:#1c63a8}.-text-100{color:#f8f9fa}.-bg-200{color:#222;background-color:#eee}.-bg-200 p>a{color:#6d99d8}.-bg-200 p>a:hover{color:#1c63a8}.-text-200{color:#eee}.-bg-300{color:#222;background-color:#dee2e6}.-bg-300 p>a{color:#6993cf}.-bg-300 p>a:hover{color:#1c63a8}.-text-300{color:#dee2e6}.-bg-400{color:#222;background-color:#ccc}.-bg-400 p>a{color:#6288be}.-bg-400 p>a:hover{color:#1c63a8}.-text-400{color:#ccc}.-bg-500{color:#fff;background-color:#adb5bd}.-bg-500 p>a{color:#9bbced}.-bg-500 p>a:hover{color:#1c63a8}.-text-500{color:#adb5bd}.-bg-600{color:#fff;background-color:#888}.-bg-600 p>a{color:#b4cdf1}.-bg-600 p>a:hover{color:#1c63a8}.-text-600{color:#888}.-bg-700{color:#fff;background-color:#495057}.-bg-700 p>a{color:#d3e2f7}.-bg-700 p>a:hover{color:#1c63a8}.-text-700{color:#495057}.-bg-800{color:#fff;background-color:#333}.-bg-800 p>a{color:#e3ecfa}.-bg-800 p>a:hover{color:#1c63a8}.-text-800{color:#333}.-bg-900{color:#fff;background-color:#222}.-bg-900 p>a{color:#ecf2fc}.-bg-900 p>a:hover{color:#1c63a8}.-text-900{color:#222}.-bg-0{color:#fff;background-color:#403f4c}.-bg-0 p>a{color:#d9e5f8}.-bg-0 p>a:hover{color:#1c63a8}.-text-0{color:#403f4c}.-bg-1{color:#fff;background-color:#212730}.-bg-1 p>a{color:#e9f0fb}.-bg-1 p>a:hover{color:#1c63a8}.-text-1{color:#212730}.-bg-2{color:#222;background-color:#f1f1f6}.-bg-2 p>a{color:#6e9bdc}.-bg-2 p>a:hover{color:#1c63a8}.-text-2{color:#f1f1f6}.-bg-3{color:#222;background-color:#c0e0de}.-bg-3 p>a{color:#638ac1}.-bg-3 p>a:hover{color:#1c63a8}.-text-3{color:#c0e0de}.-bg-4{color:#fff;background-color:#3e4a5d}.-bg-4 p>a{color:#d4e2f7}.-bg-4 p>a:hover{color:#1c63a8}.-text-4{color:#3e4a5d}.-bg-5{color:#fff;background-color:#888}.-bg-5 p>a{color:#b4cdf1}.-bg-5 p>a:hover{color:#1c63a8}.-text-5{color:#888}.-bg-6{color:#fff;background-color:#3772ff}.-bg-6 p>a{color:#a9c6ef}.-bg-6 p>a:hover{color:#1c63a8}.-text-6{color:#3772ff}.-bg-7{color:#fff;background-color:#ed6a5a}.-bg-7 p>a{color:#a5c3ee}.-bg-7 p>a:hover{color:#1c63a8}.-text-7{color:#ed6a5a}.-bg-8{color:#fff;background-color:#403f4c}.-bg-8 p>a{color:#d9e5f8}.-bg-8 p>a:hover{color:#1c63a8}.-text-8{color:#403f4c}.-bg-9{color:#fff;background-color:#ed6a5a}.-bg-9 p>a{color:#a5c3ee}.-bg-9 p>a:hover{color:#1c63a8}.-text-9{color:#ed6a5a}.-bg-10{color:#fff;background-color:#212730}.-bg-10 p>a{color:#e9f0fb}.-bg-10 p>a:hover{color:#1c63a8}.-text-10{color:#212730}.-bg-11{color:#222;background-color:#f1f1f6}.-bg-11 p>a{color:#6e9bdc}.-bg-11 p>a:hover{color:#1c63a8}.-text-11{color:#f1f1f6}.-bg-12{color:#fff;background-color:#3e4a5d}.-bg-12 p>a{color:#d4e2f7}.-bg-12 p>a:hover{color:#1c63a8}.-text-12{color:#3e4a5d}.-bg-13{color:#222;background-color:#c0e0de}.-bg-13 p>a{color:#638ac1}.-bg-13 p>a:hover{color:#1c63a8}.-text-13{color:#c0e0de}.td-box--height-min{min-height:300px}.td-box--height-med{min-height:400px}.td-box--height-max{min-height:500px}.td-box--height-full{min-height:100vh}@media(min-width:768px){.td-box--height-min{min-height:450px}.td-box--height-med{min-height:500px}.td-box--height-max{min-height:650px}}.td-box .row.section{padding-left:5vw;padding-right:5vw;flex-direction:column}.td-box .row{padding-left:5vw;padding-right:5vw;flex-direction:row}.td-box.linkbox{padding:5vh 5vw}.td-box--0{color:#fff;background-color:#403f4c}.td-box--0 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--0 p>a{color:#d9e5f8}.td-box--0 p>a:hover{color:#1c63a8}.td-box--10.td-box--gradient{background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x!important}.td-box--1{color:#fff;background-color:#212730}.td-box--1 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#212730 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--1 p>a{color:#e9f0fb}.td-box--1 p>a:hover{color:#1c63a8}.td-box--11.td-box--gradient{background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x!important}.td-box--2{color:#222;background-color:#f1f1f6}.td-box--2 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f1f1f6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--2 p>a{color:#6e9bdc}.td-box--2 p>a:hover{color:#1c63a8}.td-box--12.td-box--gradient{background:#f1f1f6 linear-gradient(180deg,#f3f3f7,#f1f1f6)repeat-x!important}.td-box--3{color:#222;background-color:#c0e0de}.td-box--3 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--3 p>a{color:#638ac1}.td-box--3 p>a:hover{color:#1c63a8}.td-box--13.td-box--gradient{background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x!important}.td-box--4{color:#fff;background-color:#3e4a5d}.td-box--4 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3e4a5d transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--4 p>a{color:#d4e2f7}.td-box--4 p>a:hover{color:#1c63a8}.td-box--14.td-box--gradient{background:#3e4a5d linear-gradient(180deg,#5b6575,#3e4a5d)repeat-x!important}.td-box--5{color:#fff;background-color:#888}.td-box--5 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#888 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--5 p>a{color:#b4cdf1}.td-box--5 p>a:hover{color:#1c63a8}.td-box--15.td-box--gradient{background:#888 linear-gradient(180deg,#9a9a9a,#888)repeat-x!important}.td-box--6{color:#fff;background-color:#3772ff}.td-box--6 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3772ff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--6 p>a{color:#a9c6ef}.td-box--6 p>a:hover{color:#1c63a8}.td-box--16.td-box--gradient{background:#3772ff linear-gradient(180deg,#5587ff,#3772FF)repeat-x!important}.td-box--7{color:#fff;background-color:#ed6a5a}.td-box--7 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--7 p>a{color:#a5c3ee}.td-box--7 p>a:hover{color:#1c63a8}.td-box--17.td-box--gradient{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.td-box--8{color:#fff;background-color:#403f4c}.td-box--8 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--8 p>a{color:#d9e5f8}.td-box--8 p>a:hover{color:#1c63a8}.td-box--18.td-box--gradient{background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x!important}.td-box--9{color:#fff;background-color:#ed6a5a}.td-box--9 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--9 p>a{color:#a5c3ee}.td-box--9 p>a:hover{color:#1c63a8}.td-box--19.td-box--gradient{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.td-box--10{color:#fff;background-color:#212730}.td-box--10 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#212730 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--10 p>a{color:#e9f0fb}.td-box--10 p>a:hover{color:#1c63a8}.td-box--110.td-box--gradient{background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x!important}.td-box--11{color:#222;background-color:#f1f1f6}.td-box--11 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f1f1f6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--11 p>a{color:#6e9bdc}.td-box--11 p>a:hover{color:#1c63a8}.td-box--111.td-box--gradient{background:#f1f1f6 linear-gradient(180deg,#f3f3f7,#f1f1f6)repeat-x!important}.td-box--12{color:#fff;background-color:#3e4a5d}.td-box--12 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3e4a5d transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--12 p>a{color:#d4e2f7}.td-box--12 p>a:hover{color:#1c63a8}.td-box--112.td-box--gradient{background:#3e4a5d linear-gradient(180deg,#5b6575,#3e4a5d)repeat-x!important}.td-box--13{color:#222;background-color:#c0e0de}.td-box--13 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--13 p>a{color:#638ac1}.td-box--13 p>a:hover{color:#1c63a8}.td-box--113.td-box--gradient{background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x!important}.td-box--blue{color:#fff;background-color:#72a1e5}.td-box--blue .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#72a1e5 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--blue p>a{color:#a0c0ee}.td-box--blue p>a:hover{color:#1c63a8}.td-box--1blue.td-box--gradient{background:#72a1e5 linear-gradient(180deg,#87afe9,#72A1E5)repeat-x!important}.td-box--indigo{color:#fff;background-color:#6610f2}.td-box--indigo .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6610f2 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--indigo p>a{color:#b8cff2}.td-box--indigo p>a:hover{color:#1c63a8}.td-box--1indigo.td-box--gradient{background:#6610f2 linear-gradient(180deg,#7d34f4,#6610f2)repeat-x!important}.td-box--purple{color:#fff;background-color:#6f42c1}.td-box--purple .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6f42c1 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--purple p>a{color:#b7cff2}.td-box--purple p>a:hover{color:#1c63a8}.td-box--1purple.td-box--gradient{background:#6f42c1 linear-gradient(180deg,#855eca,#6f42c1)repeat-x!important}.td-box--pink{color:#fff;background-color:#e83e8c}.td-box--pink .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#e83e8c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--pink p>a{color:#aec9f0}.td-box--pink p>a:hover{color:#1c63a8}.td-box--1pink.td-box--gradient{background:#e83e8c linear-gradient(180deg,#eb5b9d,#e83e8c)repeat-x!important}.td-box--red{color:#fff;background-color:#dc3545}.td-box--red .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dc3545 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--red p>a{color:#b4cdf1}.td-box--red p>a:hover{color:#1c63a8}.td-box--1red.td-box--gradient{background:#dc3545 linear-gradient(180deg,#e15361,#dc3545)repeat-x!important}.td-box--orange{color:#fff;background-color:#ba5a31}.td-box--orange .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ba5a31 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--orange p>a{color:#bed4f3}.td-box--orange p>a:hover{color:#1c63a8}.td-box--1orange.td-box--gradient{background:#ba5a31 linear-gradient(180deg,#c47350,#BA5A31)repeat-x!important}.td-box--yellow{color:#fff;background-color:#ffc107}.td-box--yellow .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffc107 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--yellow p>a{color:#b7cff2}.td-box--yellow p>a:hover{color:#1c63a8}.td-box--1yellow.td-box--gradient{background:#ffc107 linear-gradient(180deg,#ffca2c,#ffc107)repeat-x!important}.td-box--green{color:#fff;background-color:#28a745}.td-box--green .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#28a745 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--green p>a{color:#c6d9f4}.td-box--green p>a:hover{color:#1c63a8}.td-box--1green.td-box--gradient{background:#28a745 linear-gradient(180deg,#48b461,#28a745)repeat-x!important}.td-box--teal{color:#fff;background-color:#20c997}.td-box--teal .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#20c997 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--teal p>a{color:#bfd4f3}.td-box--teal p>a:hover{color:#1c63a8}.td-box--1teal.td-box--gradient{background:#20c997 linear-gradient(180deg,#41d1a7,#20c997)repeat-x!important}.td-box--cyan{color:#fff;background-color:#17a2b8}.td-box--cyan .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#17a2b8 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--cyan p>a{color:#c6d9f4}.td-box--cyan p>a:hover{color:#1c63a8}.td-box--1cyan.td-box--gradient{background:#17a2b8 linear-gradient(180deg,#3ab0c3,#17a2b8)repeat-x!important}.td-box--white{color:#222;background-color:#fff}.td-box--white .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--white p>a{color:#72a1e5}.td-box--white p>a:hover{color:#1c63a8}.td-box--1white.td-box--gradient{background:#fff linear-gradient(180deg,white,#fff)repeat-x!important}.td-box--gray{color:#fff;background-color:#888}.td-box--gray .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#888 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray p>a{color:#b4cdf1}.td-box--gray p>a:hover{color:#1c63a8}.td-box--1gray.td-box--gradient{background:#888 linear-gradient(180deg,#9a9a9a,#888)repeat-x!important}.td-box--gray-dark{color:#fff;background-color:#333}.td-box--gray-dark .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#333 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray-dark p>a{color:#e3ecfa}.td-box--gray-dark p>a:hover{color:#1c63a8}.td-box--1gray-dark.td-box--gradient{background:#333 linear-gradient(180deg,#525252,#333)repeat-x!important}.td-box--primary{color:#fff;background-color:#212730}.td-box--primary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#212730 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--primary p>a{color:#e9f0fb}.td-box--primary p>a:hover{color:#1c63a8}.td-box--1primary.td-box--gradient{background:#212730 linear-gradient(180deg,#42474f,#212730)repeat-x!important}.td-box--secondary{color:#222;background-color:#f1f1f6}.td-box--secondary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f1f1f6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--secondary p>a{color:#6e9bdc}.td-box--secondary p>a:hover{color:#1c63a8}.td-box--1secondary.td-box--gradient{background:#f1f1f6 linear-gradient(180deg,#f3f3f7,#f1f1f6)repeat-x!important}.td-box--success{color:#fff;background-color:#3772ff}.td-box--success .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3772ff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--success p>a{color:#a9c6ef}.td-box--success p>a:hover{color:#1c63a8}.td-box--1success.td-box--gradient{background:#3772ff linear-gradient(180deg,#5587ff,#3772FF)repeat-x!important}.td-box--info{color:#222;background-color:#c0e0de}.td-box--info .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--info p>a{color:#638ac1}.td-box--info p>a:hover{color:#1c63a8}.td-box--1info.td-box--gradient{background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x!important}.td-box--warning{color:#fff;background-color:#ed6a5a}.td-box--warning .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--warning p>a{color:#a5c3ee}.td-box--warning p>a:hover{color:#1c63a8}.td-box--1warning.td-box--gradient{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.td-box--danger{color:#fff;background-color:#ed6a5a}.td-box--danger .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--danger p>a{color:#a5c3ee}.td-box--danger p>a:hover{color:#1c63a8}.td-box--1danger.td-box--gradient{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.td-box--light{color:#222;background-color:#d3f3ee}.td-box--light .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#d3f3ee transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--light p>a{color:#6993d0}.td-box--light p>a:hover{color:#1c63a8}.td-box--1light.td-box--gradient{background:#d3f3ee linear-gradient(180deg,#daf5f1,#D3F3EE)repeat-x!important}.td-box--dark{color:#fff;background-color:#403f4c}.td-box--dark .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--dark p>a{color:#d9e5f8}.td-box--dark p>a:hover{color:#1c63a8}.td-box--1dark.td-box--gradient{background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x!important}.td-box--100{color:#222;background-color:#f8f9fa}.td-box--100 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f8f9fa transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--100 p>a{color:#709ee0}.td-box--100 p>a:hover{color:#1c63a8}.td-box--1100.td-box--gradient{background:#f8f9fa linear-gradient(180deg,#f9fafb,#f8f9fa)repeat-x!important}.td-box--200{color:#222;background-color:#eee}.td-box--200 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#eee transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--200 p>a{color:#6d99d8}.td-box--200 p>a:hover{color:#1c63a8}.td-box--1200.td-box--gradient{background:#eee linear-gradient(180deg,#f1f1f1,#eee)repeat-x!important}.td-box--300{color:#222;background-color:#dee2e6}.td-box--300 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dee2e6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--300 p>a{color:#6993cf}.td-box--300 p>a:hover{color:#1c63a8}.td-box--1300.td-box--gradient{background:#dee2e6 linear-gradient(180deg,#e3e6ea,#dee2e6)repeat-x!important}.td-box--400{color:#222;background-color:#ccc}.td-box--400 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ccc transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--400 p>a{color:#6288be}.td-box--400 p>a:hover{color:#1c63a8}.td-box--1400.td-box--gradient{background:#ccc linear-gradient(180deg,#d4d4d4,#ccc)repeat-x!important}.td-box--500{color:#fff;background-color:#adb5bd}.td-box--500 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#adb5bd transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--500 p>a{color:#9bbced}.td-box--500 p>a:hover{color:#1c63a8}.td-box--1500.td-box--gradient{background:#adb5bd linear-gradient(180deg,#b9c0c7,#adb5bd)repeat-x!important}.td-box--600{color:#fff;background-color:#888}.td-box--600 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#888 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--600 p>a{color:#b4cdf1}.td-box--600 p>a:hover{color:#1c63a8}.td-box--1600.td-box--gradient{background:#888 linear-gradient(180deg,#9a9a9a,#888)repeat-x!important}.td-box--700{color:#fff;background-color:#495057}.td-box--700 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#495057 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--700 p>a{color:#d3e2f7}.td-box--700 p>a:hover{color:#1c63a8}.td-box--1700.td-box--gradient{background:#495057 linear-gradient(180deg,#646a70,#495057)repeat-x!important}.td-box--800{color:#fff;background-color:#333}.td-box--800 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#333 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--800 p>a{color:#e3ecfa}.td-box--800 p>a:hover{color:#1c63a8}.td-box--1800.td-box--gradient{background:#333 linear-gradient(180deg,#525252,#333)repeat-x!important}.td-box--900{color:#fff;background-color:#222}.td-box--900 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#222 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--900 p>a{color:#ecf2fc}.td-box--900 p>a:hover{color:#1c63a8}.td-box--1900.td-box--gradient{background:#222 linear-gradient(180deg,#434343,#222)repeat-x!important}.td-blog .td-rss-button{position:absolute;top:5.5rem;right:1rem;z-index:22}.td-content .highlight{margin:2rem 0;padding:0}.td-content .highlight pre{margin:0;padding:1rem}.td-content p code,.td-content li>code,.td-content table code{color:inherit;padding:.2em .4em;margin:0;font-size:85%;word-break:normal;background-color:rgba(0,0,0,5%);border-radius:.25rem}.td-content p code br,.td-content li>code br,.td-content table code br{display:none}.td-content pre{word-wrap:normal;background-color:#f8f9fa;padding:1rem}.td-content pre>code{background-color:inherit!important;padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;border:0}.td-content pre.mermaid{background-color:inherit;font-size:0}.td-navbar-cover{background:#212730}@media(min-width:768px){.td-navbar-cover{background:0 0!important}.td-navbar-cover .nav-link{text-shadow:1px 1px 2px #403f4c}}.td-navbar-cover.navbar-bg-onscroll .nav-link{text-shadow:none}.navbar-bg-onscroll{background:#212730!important;opacity:inherit}.td-navbar{background:#212730;min-height:4rem;margin:0;z-index:32}@media(min-width:768px){.td-navbar{position:fixed;top:0;width:100%}}.td-navbar .navbar-brand{text-transform:none;text-align:middle}.td-navbar .navbar-brand .nav-link{display:inline-block;margin-right:-30px}.td-navbar .navbar-brand svg{display:inline-block;margin:0 10px;height:30px}.td-navbar .nav-link{text-transform:none;font-weight:700}.td-navbar .td-search-input{border:none}.td-navbar .td-search-input::-webkit-input-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search-input:-moz-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search-input::-moz-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search-input:-ms-input-placeholder{color:rgba(255,255,255,.75)}.td-navbar .dropdown{min-width:100px}@media(max-width:991.98px){.td-navbar{padding-right:.5rem;padding-left:.75rem}.td-navbar .td-navbar-nav-scroll{max-width:100%;height:2.5rem;margin-top:.25rem;overflow:hidden;font-size:.875rem}.td-navbar .td-navbar-nav-scroll .nav-link{padding-right:.25rem;padding-left:0}.td-navbar .td-navbar-nav-scroll .navbar-nav{padding-bottom:2rem;overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch}}.td-sidebar-nav{padding-right:.5rem;margin-right:-15px;margin-left:-15px}@media(min-width:768px){@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar-nav{max-height:calc(100vh - 10rem);overflow-y:auto}}}@media(min-width:768px){.td-sidebar-nav{display:block!important}}.td-sidebar-nav__section{padding-left:0}.td-sidebar-nav__section li{list-style:none}.td-sidebar-nav__section ul{padding:0;margin:0}@media(min-width:768px){.td-sidebar-nav__section>ul{padding-left:.5rem}}.td-sidebar-nav__section-title{display:block;font-weight:500}.td-sidebar-nav__section-title .active{font-weight:700}.td-sidebar-nav__section-title a{color:#222}.td-sidebar-nav .td-sidebar-link{display:block;padding-bottom:.375rem}.td-sidebar-nav .td-sidebar-link__page{color:#495057;font-weight:300}.td-sidebar-nav a:hover{color:#72a1e5;text-decoration:none}.td-sidebar-nav a.active{font-weight:700}.td-sidebar-nav .dropdown a{color:#495057}.td-sidebar-nav .dropdown .nav-link{padding:0 0 1rem}.td-sidebar-nav>.td-sidebar-nav__section{padding-top:.5rem;padding-left:1.5rem}.td-sidebar{padding-bottom:1rem}@media(min-width:768px){.td-sidebar{padding-top:4rem;background-color:#fff;padding-right:1rem;border-right:1px solid #d4e4ff}}.td-sidebar__toggle{line-height:1;color:#222;margin:1rem}.td-sidebar__search{padding:1rem 15px;margin-right:-15px;margin-left:-15px}.td-sidebar__inner{order:0}@media(min-width:768px){@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar__inner{position:-webkit-sticky;position:sticky;top:4rem;z-index:10;height:calc(100vh - 6rem)}}}@media(min-width:1200px){.td-sidebar__inner{flex:0 1 320px}}.td-sidebar__inner .td-search-box{width:100%}.td-sidebar #content-desktop{display:block}.td-sidebar #content-mobile{display:none}@media(max-width:991.98px){.td-sidebar #content-desktop{display:none}.td-sidebar #content-mobile{display:block}}.td-toc{border-left:1px solid #dee2e6;order:2;padding-top:.75rem;padding-bottom:1.5rem;vertical-align:top}@supports((position:-webkit-sticky) or (position:sticky)){.td-toc{position:-webkit-sticky;position:sticky;top:4rem;height:calc(100vh - 10rem);overflow-y:auto}}.td-toc a{display:block;font-weight:300;padding-bottom:.25rem}.td-toc li{list-style:none;display:block}.td-toc li li{margin-left:.5rem}.td-toc .td-page-meta a{font-weight:500}.td-toc #TableOfContents a{color:#888}.td-toc #TableOfContents a:hover{color:#72a1e5;text-decoration:none}.td-toc ul{padding-left:0}.breadcrumb{background:0 0;padding-left:0;padding-top:0}.alert{font-weight:500;background:#fff;color:inherit;border-radius:0}.alert-primary{border-style:solid;border-color:#212730;border-width:0 0 0 4px}.alert-primary .alert-heading{color:#212730}.alert-secondary{border-style:solid;border-color:#f1f1f6;border-width:0 0 0 4px}.alert-secondary .alert-heading{color:#f1f1f6}.alert-success{border-style:solid;border-color:#3772ff;border-width:0 0 0 4px}.alert-success .alert-heading{color:#3772ff}.alert-info{border-style:solid;border-color:#c0e0de;border-width:0 0 0 4px}.alert-info .alert-heading{color:#c0e0de}.alert-warning{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-warning .alert-heading{color:#ed6a5a}.alert-danger{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-danger .alert-heading{color:#ed6a5a}.alert-light{border-style:solid;border-color:#d3f3ee;border-width:0 0 0 4px}.alert-light .alert-heading{color:#d3f3ee}.alert-dark{border-style:solid;border-color:#403f4c;border-width:0 0 0 4px}.alert-dark .alert-heading{color:#403f4c}.td-content{order:1}.td-content p,.td-content li,.td-content td{font-weight:400}.td-content>h1{font-weight:700;margin-bottom:1rem}.td-content>h2{margin-bottom:1rem}.td-content>h2:not(:first-child){margin-top:3rem}.td-content>h2+h3{margin-top:1rem}.td-content>h3,.td-content>h4,.td-content>h5,.td-content>h6{margin-bottom:1rem;margin-top:2rem}.td-content>blockquote{padding:0 0 0 1rem;margin-bottom:1rem;color:#888;border-left:6px solid #f1f1f6}.td-content>ul li,.td-content>ol li{margin-bottom:.25rem}.td-content strong{font-weight:700}.td-content .alert:not(:first-child){margin-top:2rem;margin-bottom:2rem}.td-content .lead{margin-bottom:1.5rem}.td-title{margin-top:1rem;margin-bottom:.5rem}@media(min-width:576px){.td-title{font-size:3rem}}.td-search-input{background:0 0;max-width:90%;font-family:"font awesome 5 free",open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol}.td-search-input.form-control:focus{border-color:#b6bfcd;box-shadow:0 0 0 2px #5f718b}.popover.offline-search-result{max-width:90%}.popover.offline-search-result .card,.popover.offline-search-result .td-content .highlight,.td-content .popover.offline-search-result .highlight{margin-bottom:.5rem}.popover.offline-search-result .card .card-header,.popover.offline-search-result .td-content .highlight .card-header,.td-content .popover.offline-search-result .highlight .card-header{font-weight:700}.td-outer{display:flex;flex-direction:column;height:100vh}@media(min-width:768px){.td-default main section:first-of-type{padding-top:8rem}}.td-main{flex-grow:1}.td-main main{padding-bottom:2rem}@media(min-width:768px){.td-main main{padding-top:5.5rem}}.td-cover-block--height-min{min-height:300px}.td-cover-block--height-med{min-height:400px}.td-cover-block--height-max{min-height:500px}.td-cover-block--height-full{min-height:100vh}@media(min-width:768px){.td-cover-block--height-min{min-height:450px}.td-cover-block--height-med{min-height:500px}.td-cover-block--height-max{min-height:650px}}.td-cover-logo{margin-right:.5em}.td-cover-block{position:relative;padding-top:5rem;padding-bottom:5rem;background-repeat:no-repeat;background-position:50% 0;background-size:cover}.td-cover-block>.byline{position:absolute;bottom:2px;right:4px}.td-bg-arrow-wrapper{position:relative}.section-index .entry{padding:.75rem}.section-index h5{margin-bottom:0}.section-index h5 a{font-weight:700}.section-index p{margin-top:0}.pageinfo{font-weight:500;background:#f8f9fa;color:inherit;border-radius:0;margin:2rem;padding:1.5rem;padding-bottom:.5rem}.pageinfo-primary{border-style:solid;border-color:#212730}.pageinfo-secondary{border-style:solid;border-color:#f1f1f6}.pageinfo-success{border-style:solid;border-color:#3772ff}.pageinfo-info{border-style:solid;border-color:#c0e0de}.pageinfo-warning{border-style:solid;border-color:#ed6a5a}.pageinfo-danger{border-style:solid;border-color:#ed6a5a}.pageinfo-light{border-style:solid;border-color:#d3f3ee}.pageinfo-dark{border-style:solid;border-color:#403f4c}footer{min-height:150px}@media(max-width:991.98px){footer{min-height:200px}}@media(min-width:768px){.td-offset-anchor:target{display:block;position:relative;top:-4rem;visibility:hidden}h2[id]:before,h3[id]:before,h4[id]:before,h5[id]:before{display:block;content:" ";margin-top:-5rem;height:5rem;visibility:hidden}}@font-face{font-family:open sans;font-style:normal;font-weight:300;src:local(""),url(/fonts/open-sans-v27-latin-300.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-300.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:500;src:local(""),url(/fonts/open-sans-v27-latin-500.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-500.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:400;src:local(""),url(/fonts/open-sans-v27-latin-regular.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-regular.woff)format("woff")}@font-face{font-family:open sans;font-style:normal;font-weight:700;src:local(""),url(/fonts/open-sans-v27-latin-700.woff2)format("woff2"),url(/fonts/open-sans-v27-latin-700.woff)format("woff")}body{line-height:1.7em}.award{width:130px;transform:rotate(-20deg)}.td-navbar .navbar-brand svg{transform:scale(1.5);margin-right:1.5rem}.td-navbar .navbar-brand .text-uppercase{text-transform:none!important}.td-content{max-width:60rem}.btn{border-radius:.2rem}.btn-lg,.btn-group-lg>.btn{border-radius:.4rem}.btn-sm,.btn-group-sm>.btn{border-radius:.2rem}.btn-outline-light:hover{background-color:#f1f1f6;border-color:#f1f1f6}.youtube-video-wrapper{display:block;position:relative;padding-bottom:56.25%;height:0;overflow:hidden;width:100%;background:#000;margin:3rem 0}.youtube-video-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%;z-index:100;background:0 0}.youtube-video-wrapper img{-o-object-fit:cover;object-fit:cover;display:block;left:0;bottom:0;margin:0 auto;max-width:100%;width:100%;position:absolute;right:0;top:0;border:none;height:auto;cursor:pointer;transition:.4s all}.youtube-video-wrapper:hover img{-webkit-filter:brightness(75%)}.youtube-video-wrapper .play{height:72px;width:72px;left:50%;top:50%;margin-left:-36px;margin-top:-36px;position:absolute;background:url(../images/play.png)no-repeat;z-index:1;cursor:pointer}.youtube-video-wrapper .comment{left:50%;top:50%;transform:translate(-50%,50px);position:absolute;z-index:1;cursor:pointer;color:#fff}.ideal-image-slider{max-width:60rem;margin:2rem 0}.slider.small{max-width:30rem}.print-only .noprint,.noprint .print-only{display:none}pre{max-width:100%}@media print{html,body{font-size:10pt;min-width:0!important}.noprint{display:none}.td-main main{max-width:100%!important;flex:1}.td-content{max-width:100%;-moz-column-gap:4rem;column-gap:4rem;font-size:1rem}.td-content p,.td-content ul,.td-content ol,.td-content .alert{line-height:1.7em;font-size:1em}.td-content>h1,.td-content>h2,.td-content>h3,.td-content>p,.td-content>ul,.td-content>ol,.td-content>.alert,.td-content>.highlight,.td-content>.lead,.td-content>dl dd,.td-content>pre,.td-content .footnotes,.td-content>blockquote{max-width:100%}.td-content li{margin-bottom:0!important}.td-content h2{font-size:1.6em;-moz-column-span:all;column-span:all}.td-content h3{font-size:1.3em}.td-content .print-figures{counter-reset:step-figure;margin:1rem 0;display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.td-content figure,.td-content .card,.td-content .highlight{position:relative;vertical-align:top;margin:0;padding:0!important;border:1px solid #000;border-radius:2mm;overflow:hidden;-moz-column-break-inside:avoid;break-inside:avoid;counter-increment:step-figure}.td-content figure figcaption,.td-content figure .card-body,.td-content .card figcaption,.td-content .highlight figcaption,.td-content .card .card-body,.td-content .highlight .card-body{position:relative;margin:0;padding:.2rem .5rem!important;border-top:inherit}.td-content .section-index,.td-content>.text-muted:last-child{display:none}.td-content .alert{border-width:2px;-moz-column-break-inside:avoid;break-inside:avoid}.td-content>table{margin:1rem auto;-moz-column-break-inside:avoid;break-inside:avoid}.td-content>table td,.td-content>table thead th{border:1px solid #000;padding:.25rem .75rem}}@media screen{.print-only{display:none}}#td-cover-block-0{background-position:50%}.container figure img{max-width:100%}.homepage-container{font-size:13pt}.lead{font-weight:500}.donations{background:#fff;border:1px solid #ddd;border-radius:4px;padding:1rem 2rem;display:inline-block;margin:1rem auto}.accordion .card-header{cursor:pointer;transition:background .1s}.accordion .card-header:hover{background-color:#fff}.alert.alert-info,.alert.alert-warning,.alert.alert-success{border:0;border-radius:4px;font-size:1rem}.alert.alert-info .alert-heading,.alert.alert-warning .alert-heading,.alert.alert-success .alert-heading{font-size:1.2rem}@media print{.alert.alert-info,.alert.alert-warning,.alert.alert-success{border-width:2px;border-style:solid}}.alert.alert-info{background:#e1f5fe;border-color:#1e88e5}.alert.alert-info .alert-heading{color:#1e88e5}.alert.alert-warning{background:#ffe7e4;border-color:#ed6a5a}.alert.alert-warning .alert-heading{color:#ed6a5a}.alert.alert-success{background:#ccefc6;border-color:#199f67}.alert.alert-success .alert-heading{color:#199f67}.alert>ul:last-child,.alert>p:last-child{margin-bottom:0}.nav-item.dropdown .dropdown-menu{margin-top:-1px}.nav-item.dropdown:hover .dropdown-menu{display:block}.dropdown-item{padding-left:1rem}.dropdown-item:active,.dropdown-item.active{background:0 0;font-weight:700}.td-content blockquote,.content blockquote{padding:.5rem 1.5rem;margin-left:1rem;border-left:4px solid #ddd;color:#777}.td-sidebar-nav{padding:1rem;font-family:open sans}.td-sidebar-nav ul{list-style:none;padding:0;margin:0}.td-sidebar-nav ul ul ul{padding-left:1.5rem}.td-sidebar-nav ul li{margin-bottom:2px}.td-sidebar-nav>ul>li{margin-bottom:1rem}.td-sidebar-nav>ul>li>a{font-weight:700;text-transform:uppercase}.td-sidebar-nav a{display:block;color:inherit;border-radius:3px;padding:.25rem .75rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.td-sidebar-nav a:hover{color:inherit;background:#f6f6f6}.td-sidebar-nav a.current-page{font-weight:700;color:#3489dd}@media(min-width:768px){.td-sidebar-nav{max-height:none;overflow:initial}.td-sidebar__inner{height:auto;min-height:calc(100vh - 128px)}.td-docs .td-main{display:flex}.td-docs .td-main .td-sidebar{max-width:20rem;min-width:15rem;flex:1;margin-right:2rem}.td-docs .td-main .td-toc{max-width:20rem;min-width:12rem;flex:1;margin-left:2rem;padding:1rem;line-height:1.2}.td-docs .td-main .td-toc #TableOfContents a{color:inherit}.td-docs .td-main .td-toc #TableOfContents a:hover{color:#72a1e5}.td-docs .td-main .td-toc li ul{margin-bottom:.5em}.td-docs .td-main .td-toc li li{margin-left:1.5em;font-size:.9em;list-style:inherit;display:list-item}.td-docs .td-main .td-toc li ul{list-style:decimal}.td-docs .td-main>main{flex:4 4}}.feature-icon{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-size:200px;opacity:.06;pointer-events:none}.feature-cell{display:flex;flex-direction:column}address{padding-left:2rem;font-size:1.1em;line-height:1.5em;font-weight:100}footer{background:#212730;color:#fff;font-size:.8rem;min-height:0;flex:none;padding:1rem 0}.footer-copyright{line-height:1.5em}.print-qr-link{border:1px solid #000;background:#fff;display:none;align-items:center;overflow:hidden;padding:1mm;padding-left:4mm}@media print{.print-qr-link{display:flex}}.print-qr-link img{width:3cm;flex:none}.print-qr-link p{flex:1;margin:0;padding:0;font-size:11pt;overflow:hidden;word-wrap:break-word}.print-qr-link a{color:inherit;display:block;text-decoration:inherit;font-weight:700;font-family:SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace;white-space:wrap;letter-spacing:-.5pt}@page{size:A4 portrait;margin:.6in}.td-default main section.device-types-row{background:#f8f8f8;padding:0}.device-type-cell{text-align:center;padding-block:4rem;display:flex;flex-direction:column}.device-type-cell .label{order:-2;height:40px;align-self:center;display:flex;justify-content:center;align-items:center;padding:0 1.5rem;border-radius:1000px;margin-bottom:1rem;background:#eee;text-transform:uppercase;letter-spacing:.7pt;font-weight:700;font-size:80%}.device-type-cell h4{order:-1}.device-type-cell.light{background:#fff}.device-type-cell img{margin-block:1rem;width:70%;height:200px;-o-object-fit:contain;object-fit:contain;align-self:center}.device-type-cell h4>span{display:block;font-size:120%;opacity:.5;margin-top:.2rem}.device-type-cell.construction .label{background:#ffd600}.device-type-cell.construction img{opacity:.3}.device-type-cell.recommended .label{background:#0029a7;color:#fff}.device-type-cell ul{text-align:left} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index b5b8c816..a3425b6e 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://www.openbikesensor.org/docs/firmware/flash-python/2023-12-16T14:50:46+01:00https://www.openbikesensor.org/docs/firmware/flash-linux/2023-12-16T14:50:46+01:00https://www.openbikesensor.org/docs/classic/case/printing/2023-02-06T14:59:43+01:00https://www.openbikesensor.org/docs/other/collective-order/2023-02-06T14:59:43+01:00https://www.openbikesensor.org/docs/user-guide/quickstart/2023-12-16T16:40:27+01:00https://www.openbikesensor.org/docs/classic/about/2023-12-16T13:56:18+01:00https://www.openbikesensor.org/faq/data/welche-daten-werden-aufgezeichnet/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/docs/firmware/flash-windows/2023-12-16T14:50:46+01:00https://www.openbikesensor.org/docs/firmware/flash-macos/2023-12-16T14:50:46+01:00https://www.openbikesensor.org/docs/user-guide/mounting/2023-02-06T15:27:58+01:00https://www.openbikesensor.org/docs/classic/parts/2023-02-07T06:26:28+01:00https://www.openbikesensor.org/docs/user-guide/2023-02-06T14:23:45+01:00https://www.openbikesensor.org/docs/user-guide/configuration/2023-02-04T12:37:56+01:00https://www.openbikesensor.org/docs/classic/pcb/2023-02-07T06:26:28+01:00https://www.openbikesensor.org/faq/data/wie-werden-die-daten-verarbeitet/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/docs/user-guide/recording/2021-06-06T11:21:34+02:00https://www.openbikesensor.org/docs/classic/case/parts/2023-02-06T14:59:43+01:00https://www.openbikesensor.org/docs/classic/case/2023-02-07T06:26:28+01:00https://www.openbikesensor.org/docs/classic/2023-02-06T15:50:51+01:00https://www.openbikesensor.org/docs/classic/build-instructions/2023-12-16T16:28:24+01:00https://www.openbikesensor.org/docs/other/privacy-zones/2023-02-06T14:46:11+01:00https://www.openbikesensor.org/docs/classic/case/variants/2023-02-06T14:59:43+01:00https://www.openbikesensor.org/faq/data/wie-werden-die-daten-ausgewertet/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/docs/firmware/2023-12-16T14:50:46+01:00https://www.openbikesensor.org/docs/user-guide/track-upload/2023-02-06T14:55:31+01:00https://www.openbikesensor.org/docs/classic/case/color-prints/2023-02-06T14:59:43+01:00https://www.openbikesensor.org/docs/other/2023-02-06T14:46:11+01:00https://www.openbikesensor.org/docs/user-guide/simra/2021-11-12T14:22:10+01:00https://www.openbikesensor.org/faq/data/warum-sollte-es-mehrere-portale-geben/2021-06-10T17:09:37+02:00https://www.openbikesensor.org/faq/data/wie-funktionieren-privacy-zones/2023-02-06T14:46:11+01:00https://www.openbikesensor.org/docs/classic/troubleshooting/2023-02-07T06:26:28+01:00https://www.openbikesensor.org/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/2022-02-17T16:31:20+01:00https://www.openbikesensor.org/blog/2021/12/07/gr%C3%BCndung-des-gemeinn%C3%BCtzigen-vereins-openbikesensor/2021-12-09T20:06:22+01:00https://www.openbikesensor.org/blog/2021/11/12/startschuss-f%C3%BCr-neues-openbikesensor-forum/2021-11-12T11:32:30+01:00https://www.openbikesensor.org/blog/2021/06/17/openbikesensor-zu-gast-im-achter/2021-07-09T19:53:43+02:00https://www.openbikesensor.org/blog/2021/05/24/der-openbikesensor-im-deutschlandfunk/2021-05-24T16:02:33+02:00https://www.openbikesensor.org/blog/2021/03/28/das-projekt-openbikesensor-im-ersten/2022-12-30T15:07:54+01:00https://www.openbikesensor.org/blog/2021/03/23/openbikesensor-goes-lgpl/2021-07-09T18:23:44+02:00https://www.openbikesensor.org/docs/classic/build-instructions/v00.03.12/2023-12-16T16:28:24+01:00https://www.openbikesensor.org/faq/build/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/blog/2023-02-05T19:44:48+01:00https://www.openbikesensor.org/community/2023-02-05T19:44:48+01:00https://www.openbikesensor.org/faq/data/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/docs/2023-02-06T14:23:45+01:00https://www.openbikesensor.org/faq/2021-11-12T11:32:30+01:00https://www.openbikesensor.org/device/2023-02-04T23:02:06+01:00https://www.openbikesensor.org/faq/build/ich-bin-neuling/2021-11-14T14:06:11+01:00https://www.openbikesensor.org/faq/build/woher-bekomme-ich-eine-platine/2023-02-06T14:59:43+01:00https://www.openbikesensor.org/map/2023-02-05T19:44:48+01:00https://www.openbikesensor.org/contact/2022-03-27T19:47:42+02:00https://www.openbikesensor.org/aliases/2022-12-31T23:24:21+01:00https://www.openbikesensor.org/map.en/2023-07-25T21:13:51+02:00https://www.openbikesensor.org/docs/other/visualization/2023-02-06T14:46:11+01:00https://www.openbikesensor.org/verein/2023-02-05T19:44:48+01:00https://www.openbikesensor.org/2023-02-06T14:59:43+01:00https://www.openbikesensor.org/faq/build/was-kostet-ein-ueberholabstandsmesser/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/faq/build/woher-bekomme-ich-den-ueberholabstandsmesser/2023-02-12T20:49:43+01:00 \ No newline at end of file +https://www.openbikesensor.org/docs/firmware/flash-python/2024-01-20T15:13:30+00:00https://www.openbikesensor.org/docs/firmware/flash-linux/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/classic/case/printing/2024-01-20T15:13:30+00:00https://www.openbikesensor.org/docs/other/collective-order/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/user-guide/quickstart/2024-01-20T15:13:30+00:00https://www.openbikesensor.org/docs/classic/about/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/faq/data/welche-daten-werden-aufgezeichnet/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/docs/firmware/flash-windows/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/firmware/flash-macos/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/user-guide/mounting/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/classic/parts/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/user-guide/2023-02-06T14:23:45+01:00https://www.openbikesensor.org/docs/user-guide/configuration/2024-01-20T15:13:30+00:00https://www.openbikesensor.org/docs/classic/pcb/2024-01-20T15:13:30+00:00https://www.openbikesensor.org/faq/data/wie-werden-die-daten-verarbeitet/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/docs/user-guide/recording/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/classic/case/parts/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/classic/case/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/classic/2023-02-06T15:50:51+01:00https://www.openbikesensor.org/docs/classic/build-instructions/2024-01-20T15:13:30+00:00https://www.openbikesensor.org/docs/other/privacy-zones/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/classic/case/variants/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/faq/data/wie-werden-die-daten-ausgewertet/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/docs/firmware/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/user-guide/track-upload/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/classic/case/color-prints/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/docs/other/2023-02-06T14:46:11+01:00https://www.openbikesensor.org/docs/user-guide/simra/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/faq/data/warum-sollte-es-mehrere-portale-geben/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/faq/data/wie-funktionieren-privacy-zones/2023-02-06T14:46:11+01:00https://www.openbikesensor.org/docs/classic/troubleshooting/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/blog/2022/02/17/openbikesensor-mit-deutschem-fahrradpreis-ausgezeichnet/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/blog/2021/12/07/gr%C3%BCndung-des-gemeinn%C3%BCtzigen-vereins-openbikesensor/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/blog/2021/11/12/startschuss-f%C3%BCr-neues-openbikesensor-forum/2021-11-12T11:32:30+01:00https://www.openbikesensor.org/blog/2021/06/17/openbikesensor-zu-gast-im-achter/2021-07-09T19:53:43+02:00https://www.openbikesensor.org/blog/2021/05/24/der-openbikesensor-im-deutschlandfunk/2021-05-24T16:02:33+02:00https://www.openbikesensor.org/blog/2021/03/28/das-projekt-openbikesensor-im-ersten/2022-12-30T15:07:54+01:00https://www.openbikesensor.org/blog/2021/03/23/openbikesensor-goes-lgpl/2021-07-09T18:23:44+02:00https://www.openbikesensor.org/docs/classic/build-instructions/v00.03.12/2023-12-16T16:28:24+01:00https://www.openbikesensor.org/faq/build/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/blog/2023-02-05T19:44:48+01:00https://www.openbikesensor.org/community/2024-01-20T17:04:05+01:00https://www.openbikesensor.org/faq/data/2021-05-14T16:54:31+02:00https://www.openbikesensor.org/docs/2023-02-06T14:23:45+01:00https://www.openbikesensor.org/faq/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/device/2024-01-20T17:04:05+01:00https://www.openbikesensor.org/faq/build/ich-bin-neuling/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/faq/build/woher-bekomme-ich-eine-platine/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/map/2023-02-05T19:44:48+01:00https://www.openbikesensor.org/contact/2022-03-27T19:47:42+02:00https://www.openbikesensor.org/aliases/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/map.en/2023-07-25T21:13:51+02:00https://www.openbikesensor.org/docs/other/visualization/2024-01-20T15:13:30+00:00https://www.openbikesensor.org/verein/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/faq/build/was-kostet-ein-ueberholabstandsmesser/2024-01-20T12:17:05+01:00https://www.openbikesensor.org/faq/build/woher-bekomme-ich-den-ueberholabstandsmesser/2024-01-20T12:17:05+01:00 \ No newline at end of file diff --git a/slack/index.html b/slack/index.html index 6097e8fe..0fb83d42 100644 --- a/slack/index.html +++ b/slack/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/community/ \ No newline at end of file +https://www.openbikesensor.org/community/ + \ No newline at end of file diff --git a/start/index.html b/start/index.html index fbd898d3..d8adce96 100644 --- a/start/index.html +++ b/start/index.html @@ -1 +1,2 @@ -https://www.openbikesensor.org/docs/user-guide/quickstart/ \ No newline at end of file +https://www.openbikesensor.org/docs/user-guide/quickstart/ + \ No newline at end of file diff --git a/verein/index.html b/verein/index.html index 9808b783..3bb2c3ea 100644 --- a/verein/index.html +++ b/verein/index.html @@ -1,12 +1,9 @@ -OpenBikeSensor e. V. | OpenBikeSensor - - - -

                            OpenBikeSensor e. V.

                            Im Dezember 2021 haben wir gemeinsam einen Verein gegründet, um uns künftig die -Arbeit zu erleichern. Der Verein trägt den Namen OpenBikeSensor e. V. und ist +OpenBikeSensor e. V. | OpenBikeSensor +

                            OpenBikeSensor e. V.

                            Im Dezember 2021 haben wir gemeinsam einen Verein gegründet, um uns künftig die +Arbeit zu erleichtern. Der Verein trägt den Namen OpenBikeSensor e. V. und ist beim Amtsgericht Stuttgart im Vereinsregister eingetragen.

                            Die Gründung eines Vereins wurde speziell für die Vereinfachung rechtlicher Fragen diskutiert und angestrebt. Dazu zählen hauptsächlich die Verantwortlichkeiten für unsere Online-Präsenz und eine gewisse zivilrechtliche @@ -22,9 +19,8 @@ dazu – wer sich einbringt, darf mit entscheiden! Das heißt, dass Entscheidungen, die keine rechtlichen oder finanziellen Auswirkungen haben, auf die übliche Art stattfinden.

                            Allen natürlichen und juristischen Personen steht es frei, einen Antrag auf -Aufnahme in den Verein zu stellen. Dies geht ganz unkompliziert unter diesem Link:

                            Zum Beitrittsformular

                            Der Jahresbeitrag für Mitglieder unterstützt den Verein insbesondere durch +Aufnahme in den Verein zu stellen. Dies geht ganz unkompliziert unter diesem Link:

                            Zum Beitrittsformular

                            Der Jahresbeitrag für Mitglieder unterstützt den Verein, insbesondere durch finanzielle Stabilität für wiederkehrende Ausgaben wie Vereinsverwaltung und IT-Infrastruktur, auch für die Community. Die aktuell gültigen Jahresbeiträge für Mitglieder sind auf dem Beitrittsformular (siehe oben) beschrieben.

                            Zur Kontaktaufnahme mit dem Vorstand kann die E-Mail-Adresse aus dem -Impressum genutzt werden.

                            - \ No newline at end of file +Impressum genutzt werden.

                            \ No newline at end of file diff --git a/webfonts/fa-brands-400.eot b/webfonts/fa-brands-400.eot deleted file mode 100644 index 2cca660d..00000000 Binary files a/webfonts/fa-brands-400.eot and /dev/null differ diff --git a/webfonts/fa-brands-400.svg b/webfonts/fa-brands-400.svg deleted file mode 100644 index d9939bc0..00000000 --- a/webfonts/fa-brands-400.svg +++ /dev/null @@ -1,3451 +0,0 @@ - - - - - -Created by FontForge 20190112 at Fri Aug 2 14:41:09 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webfonts/fa-brands-400.ttf b/webfonts/fa-brands-400.ttf index 2cb180bc..989f323b 100644 Binary files a/webfonts/fa-brands-400.ttf and b/webfonts/fa-brands-400.ttf differ diff --git a/webfonts/fa-brands-400.woff b/webfonts/fa-brands-400.woff deleted file mode 100644 index e192c51c..00000000 Binary files a/webfonts/fa-brands-400.woff and /dev/null differ diff --git a/webfonts/fa-brands-400.woff2 b/webfonts/fa-brands-400.woff2 index e916d751..19f04b90 100644 Binary files a/webfonts/fa-brands-400.woff2 and b/webfonts/fa-brands-400.woff2 differ diff --git a/webfonts/fa-regular-400.eot b/webfonts/fa-regular-400.eot deleted file mode 100644 index 54c89910..00000000 Binary files a/webfonts/fa-regular-400.eot and /dev/null differ diff --git a/webfonts/fa-regular-400.svg b/webfonts/fa-regular-400.svg deleted file mode 100644 index e04c2e0e..00000000 --- a/webfonts/fa-regular-400.svg +++ /dev/null @@ -1,803 +0,0 @@ - - - - - -Created by FontForge 20190112 at Fri Aug 2 14:41:09 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webfonts/fa-regular-400.ttf b/webfonts/fa-regular-400.ttf index ef43cfd3..201cc58b 100644 Binary files a/webfonts/fa-regular-400.ttf and b/webfonts/fa-regular-400.ttf differ diff --git a/webfonts/fa-regular-400.woff b/webfonts/fa-regular-400.woff deleted file mode 100644 index 13f01914..00000000 Binary files a/webfonts/fa-regular-400.woff and /dev/null differ diff --git a/webfonts/fa-regular-400.woff2 b/webfonts/fa-regular-400.woff2 index 004b29b6..a395e91b 100644 Binary files a/webfonts/fa-regular-400.woff2 and b/webfonts/fa-regular-400.woff2 differ diff --git a/webfonts/fa-solid-900.eot b/webfonts/fa-solid-900.eot deleted file mode 100644 index 8f113689..00000000 Binary files a/webfonts/fa-solid-900.eot and /dev/null differ diff --git a/webfonts/fa-solid-900.svg b/webfonts/fa-solid-900.svg deleted file mode 100644 index b80d4772..00000000 --- a/webfonts/fa-solid-900.svg +++ /dev/null @@ -1,4649 +0,0 @@ - - - - - -Created by FontForge 20190112 at Fri Aug 2 14:41:09 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webfonts/fa-solid-900.ttf b/webfonts/fa-solid-900.ttf index 5a6d7476..1920af1e 100644 Binary files a/webfonts/fa-solid-900.ttf and b/webfonts/fa-solid-900.ttf differ diff --git a/webfonts/fa-solid-900.woff b/webfonts/fa-solid-900.woff deleted file mode 100644 index d92df456..00000000 Binary files a/webfonts/fa-solid-900.woff and /dev/null differ diff --git a/webfonts/fa-solid-900.woff2 b/webfonts/fa-solid-900.woff2 index df7e7042..a9f37fd1 100644 Binary files a/webfonts/fa-solid-900.woff2 and b/webfonts/fa-solid-900.woff2 differ diff --git a/webfonts/fa-v4compatibility.ttf b/webfonts/fa-v4compatibility.ttf new file mode 100644 index 00000000..4c4c5b3e Binary files /dev/null and b/webfonts/fa-v4compatibility.ttf differ diff --git a/webfonts/fa-v4compatibility.woff2 b/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 00000000..507a2ff5 Binary files /dev/null and b/webfonts/fa-v4compatibility.woff2 differ