j1-template 2024.3.14 → 2024.3.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/assets/data/amplitude.html +111 -58
  3. data/assets/data/cookieconsent.html +8 -8
  4. data/assets/data/panel.html +4 -3
  5. data/assets/data/speak2me.html +11 -11
  6. data/assets/data/translator.html +29 -29
  7. data/assets/theme/j1/adapter/js/amplitude.js +112 -88
  8. data/assets/theme/j1/adapter/js/j1.js +4 -4
  9. data/assets/theme/j1/adapter/js/masonry.js +2 -2
  10. data/assets/theme/j1/adapter/js/themes.js +42 -4
  11. data/assets/theme/j1/adapter/js/videojs.js +212 -0
  12. data/assets/theme/j1/core/css/icon-fonts/mdib.css +24 -4
  13. data/assets/theme/j1/core/css/icon-fonts/mdib.css.map +1 -1
  14. data/assets/theme/j1/core/css/icon-fonts/mdib.min.css +1 -1
  15. data/assets/theme/j1/core/css/icon-fonts/mdib.min.css.map +1 -1
  16. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css +9 -6
  17. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css.map +1 -1
  18. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
  19. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css.map +1 -1
  20. data/assets/theme/j1/core/js/template.js +262 -275
  21. data/assets/theme/j1/core/js/template.min.js +7 -7
  22. data/assets/theme/j1/core/js/template.min.js.map +1 -1
  23. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.css +131 -24
  24. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.min.css +1 -1
  25. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.css +102 -76
  26. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.min.css +1 -1
  27. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.css +109 -78
  28. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.min.css +1 -1
  29. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/artist.svg +78 -0
  30. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/mute.svg +52 -20
  31. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/next.svg +20 -39
  32. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/now-playing.svg +24 -38
  33. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/playlist-hide.svg +85 -0
  34. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/playlist-music.svg +85 -0
  35. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/playlist-show.svg +85 -0
  36. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/playlist.svg +85 -0
  37. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/previous.svg +18 -37
  38. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/skip-backward.svg +33 -30
  39. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/skip-forward.svg +33 -29
  40. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/small/next.svg +55 -14
  41. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/small/previous.svg +56 -14
  42. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/volume.svg +38 -21
  43. data/assets/theme/j1/modules/amplitudejs/js/amplitude.map +20 -20
  44. data/assets/theme/j1/modules/amplitudejs/js/tech/youtube_example.js +211 -0
  45. data/assets/theme/j1/modules/gemini/js/gemini.js.map +1 -1
  46. data/assets/theme/j1/modules/jquery/js/jquery.min.map +1 -1
  47. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.js +206 -122
  48. data/assets/theme/j1/modules/videojs/assets/icons/custom-icons/next.svg +82 -0
  49. data/assets/theme/j1/modules/videojs/css/font/README.md +151 -0
  50. data/assets/theme/j1/modules/videojs/css/font/VideoJS.svg +150 -0
  51. data/assets/theme/j1/modules/videojs/css/font/video-js-cdn.css +2012 -0
  52. data/assets/theme/j1/modules/videojs/css/plugins/controls/skipbuttons.0.css +32 -0
  53. data/assets/theme/j1/modules/videojs/css/plugins/controls/skipbuttons.1.css +31 -0
  54. data/assets/theme/j1/modules/videojs/css/plugins/controls/skipbuttons.css +31 -0
  55. data/assets/theme/j1/modules/videojs/css/plugins/controls/skipbuttons.min.css +21 -0
  56. data/assets/theme/j1/modules/videojs/css/themes/uno.css +14 -3
  57. data/assets/theme/j1/modules/videojs/css/themes/uno.min.css +1 -1
  58. data/assets/theme/j1/modules/videojs/css/videojs.css +1 -0
  59. data/assets/theme/j1/modules/videojs/js/plugins/controls/autocaption/LICENSE +13 -0
  60. data/assets/theme/j1/modules/videojs/js/plugins/controls/autocaption/README.md +75 -0
  61. data/assets/theme/j1/modules/videojs/js/plugins/controls/autocaption/autocaption.js +149 -0
  62. data/assets/theme/j1/modules/videojs/js/plugins/controls/autocaption/autocaption.min.js +21 -0
  63. data/assets/theme/j1/modules/videojs/js/plugins/controls/hotkeys/README.md +76 -30
  64. data/assets/theme/j1/modules/videojs/js/plugins/controls/hotkeys/hotkeys.js +64 -53
  65. data/assets/theme/j1/modules/videojs/js/plugins/controls/hotkeys/hotkeys.min.js +1 -1
  66. data/assets/theme/j1/modules/videojs/js/plugins/controls/skipbuttons/README.md +133 -0
  67. data/assets/theme/j1/modules/videojs/js/plugins/controls/skipbuttons/skipbuttons.js +137 -0
  68. data/assets/theme/j1/modules/videojs/js/plugins/controls/skipbuttons/skipbuttons.min.js +21 -0
  69. data/assets/theme/j1/modules/videojs/js/plugins/controls/zoom/zoom.js +15 -12
  70. data/assets/theme/j1/modules/videojs/js/plugins/players/dm/dailymotion.js +2 -2
  71. data/assets/theme/j1/modules/videojs/js/plugins/players/yt/youtube.js +43 -16
  72. data/lib/j1/patches/rubygems/eventmachine-1.2.7-x64-mingw32/lib/3.3/fastfilereaderext.so +0 -0
  73. data/lib/j1/patches/rubygems/eventmachine-1.2.7-x64-mingw32/lib/3.3/rubyeventmachine.so +0 -0
  74. data/lib/j1/patches/rubygems/eventmachine-1.2.7-x64-mingw32/lib/3.4/fastfilereaderext.so +0 -0
  75. data/lib/j1/patches/rubygems/eventmachine-1.2.7-x64-mingw32/lib/3.4/rubyeventmachine.so +0 -0
  76. data/lib/j1/version.rb +1 -1
  77. data/lib/j1_app/j1_auth_manager/config.rb +0 -4
  78. data/lib/starter_web/Gemfile +45 -22
  79. data/lib/starter_web/README.md +5 -5
  80. data/lib/starter_web/_config.yml +4 -6
  81. data/lib/starter_web/_data/modules/amplitude.yml +67 -37
  82. data/lib/starter_web/_data/modules/defaults/amplitude.yml +1 -0
  83. data/lib/starter_web/_data/modules/defaults/gallery.yml +42 -0
  84. data/lib/starter_web/_data/modules/defaults/videojs.yml +107 -0
  85. data/lib/starter_web/_data/modules/gallery.yml +30 -14
  86. data/lib/starter_web/_data/modules/lazyLoader.yml +8 -8
  87. data/lib/starter_web/_data/modules/masonry.yml +15 -0
  88. data/lib/starter_web/_data/modules/masterslider.yml +6 -6
  89. data/lib/starter_web/_data/modules/videojs.yml +57 -0
  90. data/lib/starter_web/_data/resources.yml +9 -26
  91. data/lib/starter_web/_data/templates/feed.xml +1 -1
  92. data/lib/starter_web/_includes/tables/jekyll_variables.asciidoc +1 -0
  93. data/lib/starter_web/_plugins/asciidoctor/carousel-block.rb +2 -1
  94. data/lib/starter_web/_plugins/asciidoctor/dailymotion-block.rb +4 -1
  95. data/lib/starter_web/_plugins/asciidoctor/lightbox-block.rb +1 -1
  96. data/lib/starter_web/_plugins/asciidoctor/masterslider-block.rb +1 -1
  97. data/lib/starter_web/_plugins/asciidoctor/slick-block.rb +2 -1
  98. data/lib/starter_web/_plugins/asciidoctor/videojs-block.rb +145 -24
  99. data/lib/starter_web/_plugins/asciidoctor/vimeo-block.rb +4 -1
  100. data/lib/starter_web/_plugins/asciidoctor/wistia-block.rb +313 -0
  101. data/lib/starter_web/_plugins/asciidoctor/youtube-block.rb +192 -17
  102. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  103. data/lib/starter_web/assets/audio/cover/spontanorama/spontanorama.jpg +0 -0
  104. data/lib/starter_web/assets/audio/cover/spontanorama/src/spontanorama.png +0 -0
  105. data/lib/starter_web/assets/audio/cover/spontanorama/src/spontanorama.psd +0 -0
  106. data/lib/starter_web/package.json +1 -1
  107. data/lib/starter_web/pages/public/amplitude_yt_tester.adoc +20 -7
  108. data/lib/starter_web/pages/public/manuals/integrations/amplitudejs/amplitudejs-api.adoc +1 -1
  109. data/lib/starter_web/pages/public/manuals/integrations/videojs/youtube-api.adoc +1638 -0
  110. data/lib/starter_web/pages/public/tools/previewer/preview_bootstrap_theme.adoc +5 -6
  111. data/lib/starter_web/pages/public/tools/previewer/preview_videojs.adoc +203 -0
  112. data/lib/starter_web/pages/public/tour/asciidoc_extensions.adoc +1 -1
  113. data/lib/starter_web/pages/public/tour/bootstrap_themes.adoc +1 -1
  114. data/lib/starter_web/pages/public/tour/highlghter_rouge.adoc +1 -1
  115. data/lib/starter_web/pages/public/tour/modal_extentions.adoc +1 -1
  116. data/lib/starter_web/pages/public/tour/play_audio.adoc +30 -29
  117. data/lib/starter_web/pages/public/tour/play_video.adoc +65 -39
  118. data/lib/starter_web/pages/public/tour/present_images.adoc +17 -16
  119. data/lib/starter_web/pages/public/tour/quicksearch.adoc +1 -1
  120. data/lib/starter_web/pages/public/tour/responsive_tables.adoc +1 -1
  121. data/lib/starter_web/pages/public/tour/typography.adoc +1 -1
  122. metadata +37 -20
  123. data/assets/data/amplitude.28.html +0 -887
  124. data/assets/data/amplitude.29.html +0 -923
  125. data/assets/theme/j1/adapter/js/amplitude.23.js +0 -1165
  126. data/assets/theme/j1/adapter/js/amplitude.24.js +0 -1164
  127. data/assets/theme/j1/adapter/js/amplitude.25.js +0 -1268
  128. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/_pause.svg +0 -19
  129. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/_play.svg +0 -18
  130. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/show-playlist.svg +0 -15
  131. data/assets/theme/j1/modules/jqueryScrollbar/LICENSE +0 -20
  132. data/assets/theme/j1/modules/jqueryScrollbar/README.md +0 -28
  133. data/assets/theme/j1/modules/jqueryScrollbar/css/scrollbar.css +0 -939
  134. data/assets/theme/j1/modules/jqueryScrollbar/css/scrollbar.min.css +0 -20
  135. data/assets/theme/j1/modules/jqueryScrollbar/js/scrollbar.js +0 -851
  136. data/assets/theme/j1/modules/jqueryScrollbar/js/scrollbar.min.js +0 -36
  137. data/assets/theme/j1/modules/jqueryScrollbar/sass/scrollbar.scss +0 -806
  138. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.0.js +0 -794
  139. data/lib/starter_web/_data/modules/lazyLoader.0.yml +0 -118
@@ -0,0 +1,211 @@
1
+ /*
2
+ # -----------------------------------------------------------------------------
3
+ # ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/youtube.js
4
+ # AmplitudeJS V5 Plugin|Tech for J1 Template
5
+ #
6
+ # Product/Info:
7
+ # https://jekyll.one
8
+ #
9
+ # Copyright (C) 2023, 2024 Juergen Adams
10
+ #
11
+ # J1 Template is licensed under the MIT License.
12
+ # See: https://github.com/jekyll-one-org/j1-template/blob/main/LICENSE
13
+ # -----------------------------------------------------------------------------
14
+ */
15
+ "use strict";
16
+ function ytAudio() {
17
+ }
18
+
19
+ // 2. This code loads the IFrame Player API code asynchronously.
20
+ var player1, player2, player3, player4;
21
+ var firstScriptTag;
22
+
23
+ var tag = document.createElement('script');
24
+ tag.src = "https://www.youtube.com/iframe_api";
25
+ firstScriptTag = document.getElementsByTagName('script')[0];
26
+ firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
27
+
28
+ // 3. This function creates an <iframe> (and YouTube player)
29
+ // after the API code downloads.
30
+ function onYouTubeIframeAPIReady() {
31
+
32
+ var ctrlq1 = document.getElementById("youtube-audio1");
33
+ ctrlq1.innerHTML = '<img id="youtube-icon1" src=""/><div id="youtube-player1"></div>';
34
+ ctrlq1.style.cssText = 'width:150px;margin:2em auto;cursor:pointer;cursor:hand;display:none';
35
+ ctrlq1.onclick = toggleAudio1;
36
+
37
+ player1 = new YT.Player('youtube-player1', {
38
+ height: '0',
39
+ width: '0',
40
+ videoId: ctrlq1.dataset.video,
41
+ playerVars: {
42
+ autoplay: ctrlq1.dataset.autoplay,
43
+ loop: ctrlq1.dataset.loop,
44
+ },
45
+ events: {
46
+ 'onReady': onPlayerReady1,
47
+ 'onStateChange': onPlayerStateChange1
48
+ }
49
+ });
50
+
51
+ var ctrlq2 = document.getElementById("youtube-audio2");
52
+ ctrlq2.innerHTML = '<img id="youtube-icon2" src=""/><div id="youtube-player2"></div>';
53
+ ctrlq2.style.cssText = 'width:150px;margin:2em auto;cursor:pointer;cursor:hand;display:none';
54
+ ctrlq2.onclick = toggleAudio2;
55
+
56
+ player2 = new YT.Player('youtube-player2', {
57
+ height: '0',
58
+ width: '0',
59
+ videoId: ctrlq2.dataset.video,
60
+ playerVars: {
61
+ autoplay: ctrlq2.dataset.autoplay,
62
+ loop: ctrlq2.dataset.loop,
63
+ },
64
+ events: {
65
+ 'onReady': onPlayerReady2,
66
+ 'onStateChange': onPlayerStateChange2
67
+ }
68
+ });
69
+
70
+ var ctrlq3 = document.getElementById("youtube-audio3");
71
+ ctrlq3.innerHTML = '<img id="youtube-icon3" src=""/><div id="youtube-player3"></div>';
72
+ ctrlq3.style.cssText = 'width:150px;margin:2em auto;cursor:pointer;cursor:hand;display:none';
73
+ ctrlq3.onclick = toggleAudio3;
74
+
75
+ player3 = new YT.Player('youtube-player3', {
76
+ height: '0',
77
+ width: '0',
78
+ videoId: ctrlq3.dataset.video,
79
+ playerVars: {
80
+ autoplay: ctrlq3.dataset.autoplay,
81
+ loop: ctrlq3.dataset.loop,
82
+ },
83
+ events: {
84
+ 'onReady': onPlayerReady3,
85
+ 'onStateChange': onPlayerStateChange3
86
+ }
87
+ });
88
+
89
+ var ctrlq4 = document.getElementById("youtube-audio4");
90
+ ctrlq4.innerHTML = '<img id="youtube-icon4" src=""/><div id="youtube-player4"></div>';
91
+ ctrlq4.style.cssText = 'width:150px;margin:2em auto;cursor:pointer;cursor:hand;display:none';
92
+ ctrlq4.onclick = toggleAudio4;
93
+
94
+ player4 = new YT.Player('youtube-player4', {
95
+ height: '0',
96
+ width: '0',
97
+ videoId: ctrlq4.dataset.video,
98
+ playerVars: {
99
+ autoplay: ctrlq4.dataset.autoplay,
100
+ loop: ctrlq4.dataset.loop,
101
+ },
102
+ events: {
103
+ 'onReady': onPlayerReady4,
104
+ 'onStateChange': onPlayerStateChange4
105
+ }
106
+ });
107
+ }
108
+
109
+ function togglePlayButton1(play) {
110
+ document.getElementById("youtube-icon1").src = play ? "/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.png" : "/assets/theme/j1/modules/amplitudejs/icons/player/blue/pause.png";
111
+ }
112
+
113
+ function toggleAudio1() {
114
+ if ( player1.getPlayerState() == 1 || player1.getPlayerState() == 3 ) {
115
+ player1.pauseVideo();
116
+ togglePlayButton1(false);
117
+ } else {
118
+ player1.playVideo();
119
+ togglePlayButton1(true);
120
+ }
121
+ }
122
+
123
+ function togglePlayButton2(play) {
124
+ document.getElementById("youtube-icon2").src = play ? "/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.png" : "/assets/theme/j1/modules/amplitudejs/icons/player/blue/pause.png";
125
+ }
126
+
127
+ function toggleAudio2() {
128
+ if ( player2.getPlayerState() == 1 || player2.getPlayerState() == 3 ) {
129
+ player2.pauseVideo();
130
+ togglePlayButton2(false);
131
+ } else {
132
+ player2.playVideo();
133
+ togglePlayButton2(true);
134
+ }
135
+ }
136
+
137
+ function togglePlayButton3(play) {
138
+ document.getElementById("youtube-icon3").src = play ? "/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.png" : "/assets/theme/j1/modules/amplitudejs/icons/player/blue/pause.png";
139
+ }
140
+
141
+ function toggleAudio3() {
142
+ if ( player3.getPlayerState() == 1 || player3.getPlayerState() == 3 ) {
143
+ player3.pauseVideo();
144
+ togglePlayButton3(false);
145
+ } else {
146
+ player3.playVideo();
147
+ togglePlayButton3(true);
148
+ }
149
+ }
150
+
151
+ function togglePlayButton4(play) {
152
+ document.getElementById("youtube-icon4").src = play ? "/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.png" : "/assets/theme/j1/modules/amplitudejs/icons/player/blue/pause.png";
153
+ }
154
+
155
+ function toggleAudio4() {
156
+ if ( player4.getPlayerState() == 1 || player4.getPlayerState() == 3 ) {
157
+ player4.pauseVideo();
158
+ togglePlayButton4(false);
159
+ } else {
160
+ player4.playVideo();
161
+ togglePlayButton4(true);
162
+ }
163
+ }
164
+
165
+ function onPlayerReady1(event) {
166
+ player1.setPlaybackQuality("small");
167
+ document.getElementById("youtube-audio1").style.display = "block";
168
+ togglePlayButton1(player1.getPlayerState() !== 5);
169
+ }
170
+
171
+ function onPlayerStateChange1(event) {
172
+ if (event.data === 0) {
173
+ togglePlayButton1(false);
174
+ }
175
+ }
176
+
177
+ function onPlayerReady2(event) {
178
+ player2.setPlaybackQuality("small");
179
+ document.getElementById("youtube-audio2").style.display = "block";
180
+ togglePlayButton2(player2.getPlayerState() !== 5);
181
+ }
182
+
183
+ function onPlayerStateChange2(event) {
184
+ if (event.data === 0) {
185
+ togglePlayButton2(false);
186
+ }
187
+ }
188
+
189
+ function onPlayerReady3(event) {
190
+ player3.setPlaybackQuality("small");
191
+ document.getElementById("youtube-audio3").style.display = "block";
192
+ togglePlayButton3(player3.getPlayerState() !== 5);
193
+ }
194
+
195
+ function onPlayerStateChange3(event) {
196
+ if (event.data === 0) {
197
+ togglePlayButton3(false);
198
+ }
199
+ }
200
+
201
+ function onPlayerReady4(event) {
202
+ player4.setPlaybackQuality("small");
203
+ document.getElementById("youtube-audio4").style.display = "block";
204
+ togglePlayButton4(player4.getPlayerState() !== 5);
205
+ }
206
+
207
+ function onPlayerStateChange4(event) {
208
+ if (event.data === 0) {
209
+ togglePlayButton4(false);
210
+ }
211
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"gemini.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}