mumuki-laboratory 7.7.6 → 7.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +83 -3
  3. data/Rakefile +7 -1
  4. data/app/assets/javascripts/mumuki_laboratory/application/alias-modes.js +1 -1
  5. data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +66 -57
  6. data/app/assets/javascripts/mumuki_laboratory/application/codemirror-builder.js +28 -25
  7. data/app/assets/javascripts/mumuki_laboratory/application/codemirror.js +8 -10
  8. data/app/assets/javascripts/mumuki_laboratory/application/confirmation.js +2 -2
  9. data/app/assets/javascripts/mumuki_laboratory/application/console.js +41 -43
  10. data/app/assets/javascripts/mumuki_laboratory/application/csrf-token.js +9 -12
  11. data/app/assets/javascripts/mumuki_laboratory/application/custom-editor.js +11 -15
  12. data/app/assets/javascripts/mumuki_laboratory/application/discussions.js +1 -3
  13. data/app/assets/javascripts/mumuki_laboratory/application/editors.js +104 -0
  14. data/app/assets/javascripts/mumuki_laboratory/application/elipsis.js +5 -4
  15. data/app/assets/javascripts/mumuki_laboratory/application/events.js +51 -0
  16. data/app/assets/javascripts/mumuki_laboratory/application/exercise.js +68 -0
  17. data/app/assets/javascripts/mumuki_laboratory/application/inputs.js +4 -2
  18. data/app/assets/javascripts/mumuki_laboratory/application/interval.js +2 -4
  19. data/app/assets/javascripts/mumuki_laboratory/application/kids.js +1 -1
  20. data/app/assets/javascripts/mumuki_laboratory/application/load-analytics.js +1 -1
  21. data/app/assets/javascripts/mumuki_laboratory/application/load-error-svg.js +1 -1
  22. data/app/assets/javascripts/mumuki_laboratory/application/messages.js +2 -2
  23. data/app/assets/javascripts/mumuki_laboratory/application/multiple-choice.js +1 -1
  24. data/app/assets/javascripts/mumuki_laboratory/application/multiple-scenarios.js +3 -6
  25. data/app/assets/javascripts/mumuki_laboratory/application/pin.js +3 -5
  26. data/app/assets/javascripts/mumuki_laboratory/application/profile.js +71 -0
  27. data/app/assets/javascripts/mumuki_laboratory/application/progress.js +24 -6
  28. data/app/assets/javascripts/mumuki_laboratory/application/results-renderer.js +20 -11
  29. data/app/assets/javascripts/mumuki_laboratory/application/speech-bubble-renderer.js +12 -5
  30. data/app/assets/javascripts/mumuki_laboratory/application/submission.js +19 -101
  31. data/app/assets/javascripts/mumuki_laboratory/application/submissions-store.js +93 -0
  32. data/app/assets/javascripts/mumuki_laboratory/application/sync-mode.js +75 -0
  33. data/app/assets/javascripts/mumuki_laboratory/application/timer.js +5 -6
  34. data/app/assets/javascripts/mumuki_laboratory/application/tooltip.js +1 -1
  35. data/app/assets/javascripts/mumuki_laboratory/application/upload.js +1 -1
  36. data/app/assets/javascripts/mumuki_laboratory/application/user.js +1 -1
  37. data/app/assets/stylesheets/mumuki_laboratory/application.scss +1 -1
  38. data/app/assets/stylesheets/mumuki_laboratory/application/_modules.scss +19 -17
  39. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_avatar.scss +41 -0
  40. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_gs-board.scss +3 -0
  41. data/app/assets/stylesheets/mumuki_laboratory/application/modules/{guide-corollary.scss → _guide_corollary.scss} +0 -0
  42. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_kids.scss +1 -2
  43. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_kindergarten.scss +2 -1
  44. data/app/assets/stylesheets/mumuki_laboratory/application/modules/{popover.scss → _popover.scss} +0 -0
  45. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_user_profile.scss +36 -0
  46. data/app/controllers/application_controller.rb +2 -1
  47. data/app/controllers/users_controller.rb +5 -1
  48. data/app/helpers/application_helper.rb +6 -4
  49. data/app/helpers/avatar_helper.rb +9 -0
  50. data/app/helpers/discussions_helper.rb +2 -2
  51. data/app/helpers/{locale_helper.rb → globals_helper.rb} +6 -2
  52. data/app/helpers/profile_helper.rb +5 -0
  53. data/app/mailers/user_mailer.rb +24 -11
  54. data/app/views/book/show.html.erb +1 -1
  55. data/app/views/exercises/show.html.erb +3 -0
  56. data/app/views/layouts/_main.html.erb +1 -2
  57. data/app/views/layouts/_progress.html.erb +1 -1
  58. data/app/views/layouts/_progress_bar.html.erb +7 -1
  59. data/app/views/layouts/_runner_assets.html.erb +1 -2
  60. data/app/views/layouts/application.html.erb +2 -2
  61. data/app/views/layouts/modals/_avatar_picker.html.erb +16 -0
  62. data/app/views/users/_avatar_list.html.erb +11 -0
  63. data/app/views/users/_edit_user_form.html.erb +22 -0
  64. data/app/views/users/_user_form.html.erb +21 -8
  65. data/app/views/users/edit.html.erb +5 -0
  66. data/app/views/users/show.html.erb +0 -4
  67. data/config/routes.rb +1 -1
  68. data/lib/mumuki/laboratory/controllers.rb +1 -0
  69. data/lib/mumuki/laboratory/controllers/incognito_mode.rb +28 -0
  70. data/lib/mumuki/laboratory/locales/datetime.es.yml +14 -14
  71. data/lib/mumuki/laboratory/locales/en.yml +12 -4
  72. data/lib/mumuki/laboratory/locales/es.yml +12 -4
  73. data/lib/mumuki/laboratory/locales/pt.yml +10 -2
  74. data/lib/mumuki/laboratory/version.rb +1 -1
  75. data/spec/dummy/db/schema.rb +13 -1
  76. data/spec/features/chapter_spec.rb +17 -0
  77. data/spec/features/exercise_flow_spec.rb +54 -6
  78. data/spec/features/home_public_flow_spec.rb +16 -0
  79. data/spec/helpers/avatar_helper_spec.rb +26 -0
  80. data/spec/javascripts/editors-spec.js +54 -0
  81. data/spec/javascripts/events-spec.js +33 -0
  82. data/spec/javascripts/exercise-spec.js +41 -0
  83. data/spec/javascripts/global-spec.js +6 -0
  84. data/spec/javascripts/spec-helper.js +4 -0
  85. data/spec/javascripts/submissions-store-spec.js +44 -0
  86. data/spec/javascripts/sync-mode-spec.js +15 -0
  87. data/spec/mailers/user_mailer_spec.rb +23 -3
  88. data/spec/teaspoon_env.rb +8 -2
  89. data/vendor/assets/javascripts/codemirror-modes/gobstones.js +3 -3
  90. metadata +38 -11
  91. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_follow_us.scss +0 -16
  92. data/app/helpers/version_helper.rb +0 -5
@@ -1,12 +1,14 @@
1
- (() => {
1
+ mumuki.onInputsReady = (() => {
2
2
  // Declares a `document.ready` handler that will be
3
3
  // activated only when there is at least one element that match
4
4
  // the given selector
5
- mumuki.onInputsReady = (inputsSelector, callback) => {
5
+ function onInputsReady(inputsSelector, callback) {
6
6
  $(document).ready((event) => {
7
7
  if ($(inputsSelector).length === 0) return;
8
8
 
9
9
  callback(event);
10
10
  })
11
11
  }
12
+
13
+ return onInputsReady;
12
14
  })();
@@ -1,6 +1,4 @@
1
- var mumuki = mumuki || {};
2
-
3
- (function (mumuki) {
1
+ (function () {
4
2
  // When using Turbolinks, intervals loaded inside <body> aren't destroyed on page changes
5
3
  // Use this function instead if you want the behaviour of a regular setInterval
6
4
  mumuki.setInterval = function (intervalFunction, milliseconds) {
@@ -14,4 +12,4 @@ var mumuki = mumuki || {};
14
12
  return interval;
15
13
  }.bind(this);
16
14
 
17
- }(mumuki));
15
+ }());
@@ -1,4 +1,4 @@
1
- mumuki.load(function () {
1
+ mumuki.load(() => {
2
2
  let $bubble = $('.mu-kids-character-speech-bubble').children('.mu-kids-character-speech-bubble-normal');
3
3
 
4
4
  let availableTabs = ['.description', '.hint'];
@@ -1,4 +1,4 @@
1
- mumuki.load(function(){
1
+ mumuki.load(() => {
2
2
  ga('create', 'UA-58353823-1', 'auto');
3
3
  ga('send', 'pageview');
4
4
  });
@@ -1,4 +1,4 @@
1
- mumuki.load(function () {
1
+ mumuki.load(() => {
2
2
  var error_svgs = ['403', '404', '500', 'timeout_1', 'timeout_2', 'timeout_3'];
3
3
 
4
4
  mumuki.errors = mumuki.errors || {};
@@ -1,4 +1,4 @@
1
- mumuki.load(function () {
1
+ mumuki.load(() => {
2
2
  var Chat = {
3
3
  $body: function () {
4
4
  return $('body')
@@ -61,7 +61,7 @@ mumuki.load(function () {
61
61
  Chat.readMessages(readUrl);
62
62
  }
63
63
 
64
- function error(xhr) {
64
+ function error(_xhr) {
65
65
  Chat.tokenRequest({
66
66
  url: errorUrl,
67
67
  success: renderHTML,
@@ -1,5 +1,5 @@
1
1
  mumuki.load(() => {
2
- function dumpChoices(evt) {
2
+ function dumpChoices(_evt) {
3
3
  var indexes = $('.solution-choice:checked').map(function () {
4
4
  return $(this).data('index')
5
5
  }).get().join(':');
@@ -1,6 +1,4 @@
1
- var mumuki = mumuki || {};
2
-
3
- (function (mumuki) {
1
+ mumuki.MultipleScenarios = (() => {
4
2
 
5
3
  const setControlVisibility = function ($control, visible) {
6
4
  visible ? $control.show() : $control.hide();
@@ -147,6 +145,5 @@ var mumuki = mumuki || {};
147
145
  }
148
146
  }
149
147
 
150
- mumuki.MultipleScenarios = MultipleScenarios;
151
-
152
- }(mumuki));
148
+ return MultipleScenarios;
149
+ })();
@@ -1,12 +1,10 @@
1
- var mumuki = mumuki || {};
2
-
3
- (function (mumuki) {
1
+ mumuki.pin = (() => {
4
2
  function smoothScrollToElement(domElement) {
5
3
  var SPEED = 1000;
6
4
  $('html, body').animate({scrollTop: domElement.offset().top}, SPEED);
7
5
  }
8
6
 
9
- mumuki.pin = {
7
+ return {
10
8
  scroll: function () {
11
9
  var scrollPin = $('.scroll-pin');
12
10
  if (scrollPin.length) {
@@ -14,4 +12,4 @@ var mumuki = mumuki || {};
14
12
  }
15
13
  }
16
14
  }
17
- })(mumuki);
15
+ })();
@@ -0,0 +1,71 @@
1
+ mumuki.load(function() {
2
+ let $userForm = $("#mu-user-form");
3
+ let $userAvatar = $('#mu-user-avatar');
4
+ let $editButton = $('#mu-edit-profile-btn');
5
+ let $avatarPicker = $('#mu-avatar-picker');
6
+ let $avatarItem = $('.mu-avatar-item');
7
+
8
+ let userImage = "";
9
+ let avatarId = "";
10
+
11
+ let originalData = $userForm.serialize();
12
+ let originalProfilePicture = $userAvatar.attr('src');
13
+
14
+ $userForm.on('change keyup', function() {
15
+ toggleEditButtonIfThereAreChanges();
16
+ });
17
+
18
+ $avatarItem.on('click', function() {
19
+ $userAvatar.attr('src', $(this).attr('src'));
20
+ $avatarPicker.modal('hide');
21
+
22
+ const clickedAvatarId = $(this).attr('mu-avatar-id');
23
+ avatarId = clickedAvatarId || "";
24
+
25
+ toggleEditButtonIfThereAreChanges();
26
+ });
27
+
28
+ function toggleEditButtonIfThereAreChanges() {
29
+ let shouldEnable = requiredFieldsAreFilled() && (dataChanged() || avatarChanged());
30
+
31
+ $editButton.prop('disabled', !shouldEnable);
32
+ }
33
+
34
+ const requiredFieldsAreFilled = () =>
35
+ $userForm.find('select, textarea, input').toArray().every(elem => {
36
+ const $elem = $(elem);
37
+ return !($elem.prop('required')) || !!$elem.val();
38
+ });
39
+
40
+ const dataChanged = () => $userForm.serialize() !== originalData;
41
+
42
+ const avatarChanged = () => $userAvatar.attr('src') !== originalProfilePicture;
43
+
44
+ $('#mu-user-image').on('click', function(){
45
+ userImage = $userAvatar.attr('src');
46
+ });
47
+
48
+ $userForm.on('submit', function(){
49
+ if (userImage) {
50
+ setImageUrl($(this), userImage);
51
+ setAvatarId($(this), "");
52
+ }
53
+
54
+ if (avatarId) {
55
+ setAvatarId($(this), avatarId);
56
+ }
57
+ });
58
+
59
+ function setImageUrl(form, url) {
60
+ form.append(`<input type="hidden" name="user[image_url]" value="${url}"/>`);
61
+ }
62
+
63
+ function setAvatarId(form, id) {
64
+ form.append(`<input type="hidden" name="user[avatar_id]" value=${id}/>`);
65
+ }
66
+
67
+ $("#mu-edit-avatar-icon").on('click', function(){
68
+ $avatarPicker.modal();
69
+ });
70
+
71
+ });
@@ -1,13 +1,31 @@
1
- var mumuki = mumuki || {};
2
-
3
- (function (mumuki) {
4
-
1
+ mumuki.progress = (() => {
5
2
  /**
6
3
  * Updates the current exercise progress indicator
4
+ *
5
+ * @param {SubmissionResult} data
7
6
  * */
8
- mumuki.updateProgressBarAndShowModal = function (data) {
7
+ function updateProgressBarAndShowModal(data) {
9
8
  $('.progress-list-item.active').attr('class', data.class_for_progress_list_item);
10
9
  if(data.guide_finished_by_solution) $('#guide-done').modal();
10
+ }
11
+
12
+ /**
13
+ * Update all links in the progress bar with the given function
14
+ *
15
+ * @param {(anchor: JQuery) => string} f
16
+ */
17
+ function updateWholeProgressBar(f) {
18
+ $('.progress-list-item').each((_, it) => {
19
+ const $anchor = $(it);
20
+ $anchor.attr('class', f($anchor))
21
+ });
22
+ }
23
+
24
+ return {
25
+ updateProgressBarAndShowModal,
26
+ updateWholeProgressBar
11
27
  };
28
+ })();
12
29
 
13
- })(mumuki);
30
+ /** @deprecated use {@code mumuki.progress.updateProgressBarAndShowModal} instead */
31
+ mumuki.updateProgressBarAndShowModal = mumuki.progress.updateProgressBarAndShowModal;
@@ -1,4 +1,6 @@
1
- (() => {
1
+ mumuki.renderers = mumuki.renderers || {};
2
+ mumuki.renderers.results = (() => {
3
+
2
4
 
3
5
  // ==========================
4
6
  // View function for building
@@ -6,7 +8,7 @@
6
8
  // ==========================
7
9
 
8
10
  /**
9
- * @param {string} status
11
+ * @param {SubmissionStatus} status
10
12
  * @returns {string}
11
13
  */
12
14
  function iconForStatus(status) {
@@ -20,8 +22,7 @@
20
22
  }
21
23
 
22
24
  /**
23
- *
24
- * @param {string} status
25
+ * @param {SubmissionStatus} status
25
26
  * @returns {string}
26
27
  */
27
28
  function classForStatus(status) {
@@ -32,20 +33,28 @@
32
33
  case "passed": return "success";
33
34
  case "pending": return "muted";
34
35
  }
35
- };
36
+ }
36
37
 
37
38
 
38
39
  /**
39
- * @param {string} status
40
+ * @param {SubmissionStatus} status
40
41
  * @param {boolean} [active]
41
42
  * @returns {string}
42
43
  */
43
44
  function progressListItemClassForStatus(status, active = false) {
44
45
  return `progress-list-item text-center ${classForStatus(status)} ${active ? 'active' : ''}`;
45
- };
46
+ }
46
47
 
47
- mumuki.renderers = mumuki.renderers || {};
48
- mumuki.renderers.classForStatus = classForStatus;
49
- mumuki.renderers.iconForStatus = iconForStatus;
50
- mumuki.renderers.progressListItemClassForStatus = progressListItemClassForStatus;
48
+ return {
49
+ classForStatus,
50
+ iconForStatus,
51
+ progressListItemClassForStatus
52
+ }
51
53
  })();
54
+
55
+ /** @deprecated use {@code mumuki.renderers.results.classForStatus} instead */
56
+ mumuki.renderers.classForStatus = mumuki.renderers.results.classForStatus;
57
+ /** @deprecated use {@code mumuki.renderers.results.iconForStatus} instead */
58
+ mumuki.renderers.iconForStatus = mumuki.renderers.results.iconForStatus;
59
+ /** @deprecated use {@code mumuki.renderers.results.progressListItemClassForStatus} instead */
60
+ mumuki.renderers.progressListItemClassForStatus = mumuki.renderers.results.progressListItemClassForStatus;
@@ -1,4 +1,5 @@
1
- ((mumuki)=> {
1
+ mumuki.renderers = mumuki.renderers || {};
2
+ mumuki.renderers.speechBubble = (()=> {
2
3
 
3
4
  function renderSpeechBubbleResultItem(item) {
4
5
  return `
@@ -93,7 +94,13 @@
93
94
  }
94
95
  }
95
96
 
96
- mumuki.renderers = mumuki.renderers || {};
97
- mumuki.renderers.SpeechBubbleRenderer = SpeechBubbleRenderer;
98
- mumuki.renderers.renderSpeechBubbleResultItem = renderSpeechBubbleResultItem;
99
- })(mumuki)
97
+ return {
98
+ SpeechBubbleRenderer,
99
+ renderSpeechBubbleResultItem
100
+ }
101
+ })();
102
+
103
+ /** @deprecated use {@code mumuki.renderers.speechBubble.SpeechBubbleRenderer} instead */
104
+ mumuki.renderers.SpeechBubbleRenderer = mumuki.renderers.speechBubble.SpeechBubbleRenderer;
105
+ /** @deprecated use {@code mumuki.renderers.speechBubble.renderSpeechBubbleResultItem} instead */
106
+ mumuki.renderers.renderSpeechBubbleResultItem = mumuki.renderers.speechBubble.renderSpeechBubbleResultItem;
@@ -1,6 +1,4 @@
1
- var mumuki = mumuki || {};
2
-
3
- (function (mumuki) {
1
+ mumuki.submission = (() => {
4
2
 
5
3
  // =============
6
4
  // UI Components
@@ -14,32 +12,31 @@ var mumuki = mumuki || {};
14
12
  .play();
15
13
  }
16
14
 
17
- function ResultsBox(submissionsResults) {
18
- this.submissionsResultsArea = submissionsResults;
19
- this.processingTemplate = $('#processing-template');
20
- this.submissionsErrorTemplate = $(".submission-result-error");
21
- }
22
-
23
- ResultsBox.prototype = {
24
- waiting: function () {
15
+ class ResultsBox {
16
+ constructor(submissionsResults) {
17
+ this.submissionsResultsArea = submissionsResults;
18
+ this.processingTemplate = $('#processing-template');
19
+ this.submissionsErrorTemplate = $(".submission-result-error");
20
+ }
21
+ waiting() {
25
22
  this.submissionsResultsArea.html(this.processingTemplate.html());
26
23
  this.submissionsErrorTemplate.hide();
27
- },
28
- success: function (data, submitButton) {
24
+ }
25
+ success(data, submitButton) {
29
26
  this.submissionsResultsArea.html(data.html);
30
27
  data.status === 'aborted' ? this.error(submitButton) : submitButton.enable();
31
28
  mumuki.updateProgressBarAndShowModal(data);
32
- },
33
- error: function (submitButton) {
29
+ }
30
+ error(submitButton) {
34
31
  this.submissionsResultsArea.html('');
35
32
  this.submissionsErrorTemplate.show();
36
33
  animateTimeoutError(submitButton);
37
- },
38
- done: function (data, submitButton) {
34
+ }
35
+ done(data, submitButton) {
39
36
  submitButton.updateAttemptsLeft(data);
40
37
  mumuki.pin.scroll();
41
38
  }
42
- };
39
+ }
43
40
 
44
41
  class SubmitButton extends mumuki.Button {
45
42
 
@@ -59,78 +56,6 @@ var mumuki = mumuki || {};
59
56
  }
60
57
  }
61
58
 
62
- // ============
63
- // Content Sync
64
- // ============
65
-
66
- /**
67
- * Syncs and returns the content objects of the standard editor form
68
- *
69
- * This content object may include keys like {@code content},
70
- * {@code content_extra} and {@code content_test}
71
- *
72
- * @returns {EditorProperty[]}
73
- */
74
- function getStandardEditorContents() {
75
- mumuki.submission._syncContent();
76
- return $('.new_solution').serializeArray();
77
- }
78
-
79
- /**
80
- * Answers a content object with a key for each of the current
81
- * editor sources.
82
- *
83
- * This method will use CustomEditor's sources if availble, or
84
- * standard editor's content sources otherwise
85
- */
86
- function getContent() {
87
- let content = {};
88
- let contents;
89
-
90
- if (mumuki.CustomEditor.hasSources) {
91
- contents = mumuki.CustomEditor.getContents();
92
- } else {
93
- contents = mumuki.submission.getStandardEditorContents();
94
- }
95
-
96
- contents.forEach((it) => {
97
- content[it.name] = it.value;
98
- });
99
-
100
- return content;
101
- }
102
-
103
- /**
104
- * Copies current solution from it native rendering components
105
- * to the appropriate submission form elements.
106
- *
107
- * Both editors and runners with a custom editor that don't register a source should
108
- * register its own syncer function in order to {@link syncContent} work properly.
109
- *
110
- * @see registerContentSyncer
111
- * @see CustomEditor#addSource
112
- */
113
- function _syncContent() {
114
- if (mumuki.submission._contentSyncer) {
115
- mumuki.submission._contentSyncer();
116
- }
117
- }
118
-
119
- /**
120
- * Sets a content syncer, that will be used by {@link _syncContent}
121
- * in ordet to dump solution into the submission form fields.
122
- *
123
- * Each editor should have its own syncer registered - otherwise previous or none may be used
124
- * causing unpredicatble behaviours - or cleared by passing {@code null}.
125
- *
126
- * As a particular case, runners with custom editors that don't add sources using {@link CustomEditor#addSource}
127
- * should set the {@code #mu-custom-editor-value} value within its syncer.
128
- *
129
- * @param {() => void} [syncer] the syncer, or null, if no sync'ing is needed
130
- */
131
- function registerContentSyncer(syncer = null) {
132
- mumuki.submission._contentSyncer = syncer;
133
- }
134
59
 
135
60
  // ==========
136
61
  // Processing
@@ -212,7 +137,7 @@ var mumuki = mumuki || {};
212
137
  // Entry Point
213
138
  // ===========
214
139
 
215
- mumuki.load(function () {
140
+ mumuki.load(() => {
216
141
  var $submissionsResults = $('.submission-results');
217
142
  if (!$submissionsResults) return;
218
143
 
@@ -222,8 +147,7 @@ var mumuki = mumuki || {};
222
147
  mumuki.submission._selectSolutionProcessor(submitButton, $submissionsResults);
223
148
 
224
149
  submitButton.start(() => {
225
- var solution = mumuki.submission.getContent();
226
- mumuki.submission.processSolution(solution);
150
+ mumuki.submission.processSolution(mumuki.editors.getSubmission());
227
151
  });
228
152
 
229
153
  submitButton.checkAttemptsLeft();
@@ -244,18 +168,12 @@ var mumuki = mumuki || {};
244
168
  *
245
169
  * @module mumuki.submission
246
170
  */
247
- mumuki.submission = {
171
+ return {
248
172
  processSolution,
249
173
  _registerSolutionProcessor,
250
174
  _selectSolutionProcessor,
251
175
 
252
- _syncContent,
253
- registerContentSyncer,
254
- getStandardEditorContents,
255
- getContent,
256
-
257
176
  animateTimeoutError,
258
177
  SubmitButton,
259
178
  };
260
-
261
- })(mumuki);
179
+ })();