mumuki-gobstones-runner 2.5.0 → 2.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/lib/assets_server.rb +32 -4
  3. data/lib/checker.rb +2 -2
  4. data/lib/game_framework/default.gbs.erb +3 -0
  5. data/lib/game_framework/default.xml.erb +3 -0
  6. data/lib/game_framework/extra.gbs.erb +84 -0
  7. data/lib/game_framework/program.gbs.erb +5 -0
  8. data/lib/game_framework/program.xml.erb +17 -0
  9. data/lib/gobstones.rb +1 -0
  10. data/lib/gobstones/batch.rb +4 -2
  11. data/lib/gobstones/batch_parser.rb +5 -1
  12. data/lib/gobstones/compilation_mode.rb +60 -0
  13. data/lib/gobstones_runner.rb +3 -1
  14. data/lib/public/full-kindergarten-toolbox.xml +5 -0
  15. data/lib/public/local-media/bool-false.svg +24 -0
  16. data/lib/public/local-media/bool-true.svg +17 -0
  17. data/lib/public/local-media/clean.png +0 -0
  18. data/lib/public/local-media/color-azul.svg +44 -0
  19. data/lib/public/local-media/color-negro.svg +44 -0
  20. data/lib/public/local-media/color-rojo.svg +44 -0
  21. data/lib/public/local-media/color-verde.svg +44 -0
  22. data/lib/public/local-media/direccion-este.svg +38 -0
  23. data/lib/public/local-media/direccion-norte.svg +38 -0
  24. data/lib/public/local-media/direccion-oeste.svg +38 -0
  25. data/lib/public/local-media/direccion-sur.svg +38 -0
  26. data/lib/public/local-media/hand.png +0 -0
  27. data/lib/public/local-media/main-procedure.png +0 -0
  28. data/lib/public/local-media/minus.png +0 -0
  29. data/lib/public/local-media/plus.png +0 -0
  30. data/lib/public/local-media/program.png +0 -0
  31. data/lib/public/local-media/repeticion-simple.png +0 -0
  32. data/lib/public/media/1x1.gif +0 -0
  33. data/lib/public/media/ShiftDown.png +0 -0
  34. data/lib/public/media/ShiftLeft.png +0 -0
  35. data/lib/public/media/ShiftRight.png +0 -0
  36. data/lib/public/media/ShiftUp.png +0 -0
  37. data/lib/public/media/click.mp3 +0 -0
  38. data/lib/public/media/click.ogg +0 -0
  39. data/lib/public/media/click.wav +0 -0
  40. data/lib/public/media/delete.mp3 +0 -0
  41. data/lib/public/media/delete.ogg +0 -0
  42. data/lib/public/media/delete.wav +0 -0
  43. data/lib/public/media/disconnect.mp3 +0 -0
  44. data/lib/public/media/disconnect.ogg +0 -0
  45. data/lib/public/media/disconnect.wav +0 -0
  46. data/lib/public/media/quote0.png +0 -0
  47. data/lib/public/media/quote1.png +0 -0
  48. data/lib/public/media/sprites.png +0 -0
  49. data/lib/public/media/sprites.svg +74 -0
  50. data/lib/public/minimal-kindergarten-toolbox.xml +2 -0
  51. data/lib/render/boards.html.erb +5 -6
  52. data/lib/render/editor/editor.css +9 -0
  53. data/lib/render/editor/{editor.html → editor.html.erb} +143 -96
  54. data/lib/render/html_renderer.rb +2 -2
  55. data/lib/render/layout/layout.html +84 -0
  56. data/lib/render/with_renderer.rb +6 -3
  57. data/lib/version_hook.rb +1 -1
  58. metadata +92 -36
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cac300fd1a47b04646788843ddfecc79ff2884ded1f0fe5c487aa6be7a956847
4
- data.tar.gz: '0483fa63493e187c1d7c11cc78f19d58a524bb11aa60180c6650e1c3b8848cf8'
3
+ metadata.gz: d3507cea19ce7907891ee10fd1cd92ae96bc508033439a83e9f950759b610708
4
+ data.tar.gz: 27474324d90e1c8a5fb1607022f7185a8d02cd8f266a0b1080a44a1570c4badf
5
5
  SHA512:
6
- metadata.gz: 4f504c3eac9f541416c2357ed1cd8da5adceb3ae4f24381cd3ecd473eae613d9742f8c5044c7e26c21230af9eab9b9a1ca46db761f91423d673142f62be604bd
7
- data.tar.gz: ea1bd21dc36faedcfe18c49ec6d90e5953654b55d1c2433c4de8a55076660a1db33b0107701db85ef13ba6768c29ac7cd35f2f3fd9218b2bf50bae32cdbf9465
6
+ metadata.gz: ab63804c220388270581b86c4e465367c7e8ce7c465051e0155aa41bc21b64c0d68a1309a4848b732b228147d46cedfd9297fc817b495d3bc58c41c4d4c33287
7
+ data.tar.gz: 7ed4add431c6cffcf17d13108de40e5e99bcdbd64b0a152e4da0a5d891e49389e8af3523d2d56ef62f68833f928a09196260bae69a14e7996621f76ada5fd24d
@@ -13,6 +13,16 @@ class Mumukit::Server::App < Sinatra::Base
13
13
  get_asset route, Gobstones::CodeRunner.assets_path_for(path), type
14
14
  end
15
15
 
16
+ def self.get_local_svg(name, asset_type)
17
+ get_local_asset "#{asset_type}/#{name}.svg", "lib/public/#{name}.svg", 'image/svg+xml'
18
+ end
19
+
20
+ def self.get_media_assets(folder)
21
+ Dir.glob("lib/public/#{folder}/*").each do |path|
22
+ get_local_asset "#{folder}/#{File.basename path}", path
23
+ end
24
+ end
25
+
16
26
  ['polymer', 'polymer-mini', 'polymer-micro'].each { |name|
17
27
  get_board_asset "#{name}.html", "htmls/vendor/#{name}.html", 'text/html'
18
28
  }
@@ -25,10 +35,28 @@ class Mumukit::Server::App < Sinatra::Base
25
35
  get_local_asset 'layout/layout.html', 'lib/render/layout/layout.html', 'text/html'
26
36
  get_local_asset 'editor/editor.js', 'lib/render/editor/editor.js', 'application/javascript'
27
37
  get_local_asset 'editor/editor.css', 'lib/render/editor/editor.css', 'text/css'
28
- get_local_asset 'editor/editor.html', 'lib/render/editor/editor.html', 'text/html'
29
38
  get_local_asset 'editor/hammer.min.js', 'lib/render/editor/hammer.min.js', 'application/javascript'
30
39
  get_local_asset 'boom.png', 'lib/public/boom.png', 'image/png'
31
- ['red', 'blue', 'green', 'black', 'attires_enabled', 'attires_disabled'].each { |name|
32
- get_local_asset "editor/#{name}.svg", "lib/public/#{name}.svg", 'image/svg+xml'
33
- }
40
+ get_local_asset 'full-kindergarten-toolbox.xml', 'lib/public/full-kindergarten-toolbox.xml', 'text/plain'
41
+ get_local_asset 'minimal-kindergarten-toolbox.xml', 'lib/public/minimal-kindergarten-toolbox.xml', 'text/plain'
42
+
43
+ get_media_assets 'media'
44
+ get_media_assets 'local-media'
45
+
46
+ ['red', 'blue', 'green', 'black'].each do |name|
47
+ get_local_svg(name, 'editor')
48
+ end
49
+
50
+ ['attires_enabled', 'attires_disabled'].each do |name|
51
+ get_local_svg(name, 'layout')
52
+ end
53
+
54
+ get '/assets/editor/editor.html' do
55
+ cross_origin
56
+ @game_framework_extra = Gobstones::CompilationMode::GameFramework.extra_code
57
+ @game_framework_program = Gobstones::CompilationMode::GameFramework.program_code
58
+ @game_framework_default = Gobstones::CompilationMode::GameFramework.default_code
59
+ @assets_url = "//#{request.host_with_port}/assets"
60
+ erb File.read(File.join(self.class.local_asset_dir, '..', 'lib/render/editor/editor.html.erb'))
61
+ end
34
62
  end
@@ -49,7 +49,7 @@ module Gobstones
49
49
  fail_with status: :check_error_failed_another_reason,
50
50
  result: {
51
51
  reason: result[:finalBoardError],
52
- expected_code: expected
52
+ expected_code: I18n.t("code_#{expected}")
53
53
  } if reason_code != expected
54
54
  end
55
55
 
@@ -102,7 +102,7 @@ module Gobstones
102
102
  end
103
103
 
104
104
  def fail_with(error)
105
- fail error.to_json
105
+ fail error[:status], details: error[:result]
106
106
  end
107
107
 
108
108
  def board_json(board)
@@ -0,0 +1,3 @@
1
+ procedure Main() {
2
+
3
+ }
@@ -0,0 +1,3 @@
1
+ <block type="procedures_defnoreturnnoparams" x="30" y="30">
2
+ <field name="NAME">Main</field>
3
+ </block>
@@ -0,0 +1,84 @@
1
+ procedure Before() {
2
+ x := 0
3
+ y := 0
4
+
5
+ while(puedeMover(Sur)) {
6
+ x := x + 1
7
+ Mover(Sur)
8
+ }
9
+ while(puedeMover(Oeste)) {
10
+ y := y + 1
11
+ Mover(Oeste)
12
+ }
13
+
14
+ NextStage()
15
+
16
+ while(x > 0) {
17
+ x := x - 1
18
+ Mover(Norte)
19
+ }
20
+ while(y > 0) {
21
+ y := y - 1
22
+ Mover(Este)
23
+ }
24
+ }
25
+
26
+ procedure After() {
27
+ GoToOrigin()
28
+ NextStage()
29
+ }
30
+
31
+ procedure NextStage() {
32
+ while(puedeMover(Norte)) {
33
+ NextRowStage()
34
+ Mover(Norte)
35
+ }
36
+ NextRowStage()
37
+ GoToOrigin()
38
+ }
39
+
40
+ procedure NextRowStage() {
41
+ while(puedeMover(Este)) {
42
+ Poner(Verde)
43
+ Mover(Este)
44
+ }
45
+ Poner(Verde)
46
+ IrAlBorde(Oeste)
47
+ }
48
+
49
+ procedure ShiftLeft() {
50
+ ShiftTo(Oeste)
51
+ }
52
+
53
+ procedure ShiftRight() {
54
+ ShiftTo(Este)
55
+ }
56
+
57
+ procedure ShiftUp() {
58
+ ShiftTo(Norte)
59
+ }
60
+
61
+ procedure ShiftDown() {
62
+ ShiftTo(Sur)
63
+ }
64
+
65
+ procedure ShiftTo(dir) {
66
+ if (puedeMover(dir)) {
67
+ Sacar(Rojo)
68
+ Mover(dir)
69
+ Poner(Rojo)
70
+ CheckCollision()
71
+ }
72
+ }
73
+
74
+ procedure CheckCollision() {
75
+ if (hayBolitas(Azul) && nroBolitas(Azul) mod 2 == 0) {
76
+ After();
77
+ BOOM("Colision")
78
+ }
79
+ }
80
+
81
+ procedure GoToOrigin() {
82
+ IrAlBorde(Sur)
83
+ IrAlBorde(Oeste)
84
+ }
@@ -0,0 +1,5 @@
1
+ program {
2
+ Before()
3
+ Main()
4
+ After()
5
+ }
@@ -0,0 +1,17 @@
1
+ <block type="Program" deletable="false" x="189" y="177">
2
+ <statement name="program">
3
+ <block type="procedures_callnoreturnnoparams">
4
+ <mutation name="Before"></mutation>
5
+ <next>
6
+ <block type="procedures_callnoreturnnoparams">
7
+ <mutation name="Main"></mutation>
8
+ <next>
9
+ <block type="procedures_callnoreturnnoparams">
10
+ <mutation name="After"></mutation>
11
+ </block>
12
+ </next>
13
+ </block>
14
+ </next>
15
+ </block>
16
+ </statement>
17
+ </block>
@@ -8,5 +8,6 @@ end
8
8
 
9
9
  require_relative './gobstones/batch'
10
10
  require_relative './gobstones/batch_parser'
11
+ require_relative './gobstones/compilation_mode'
11
12
  require_relative './gobstones/error_builder'
12
13
  require_relative './gobstones/example_code_builder'
@@ -1,11 +1,13 @@
1
1
  class Gobstones::Batch
2
2
  attr_accessor :options, :examples, :content, :extra
3
+ delegate :compile_content, :compile_extra, to: :@compilation_mode
3
4
 
4
5
  def initialize(content, examples, extra, options)
5
6
  @content = content
6
7
  @examples = examples
7
8
  @extra = extra
8
9
  @options = options
10
+ @compilation_mode = @options[:game_framework] ? Gobstones::CompilationMode::GameFramework : Gobstones::CompilationMode::Classic
9
11
  end
10
12
 
11
13
  def run_tests!(output)
@@ -16,8 +18,8 @@ class Gobstones::Batch
16
18
 
17
19
  def to_json
18
20
  {
19
- code: content,
20
- extraCode: extra,
21
+ code: compile_content(content),
22
+ extraCode: compile_extra(extra),
21
23
  examples: examples.map { |example| example_json(example) }
22
24
  }.to_json
23
25
  end
@@ -3,7 +3,7 @@ module Gobstones::BatchParser
3
3
  def parse(request)
4
4
  test = parse_test(request)
5
5
 
6
- options = parse_options test
6
+ options = parse_options(test).merge(parse_settings(request))
7
7
  examples = parse_examples test, options
8
8
 
9
9
  Gobstones::Batch.new request.content, examples, request.extra, options
@@ -11,6 +11,10 @@ module Gobstones::BatchParser
11
11
 
12
12
  private
13
13
 
14
+ def parse_settings(request)
15
+ { game_framework: !!request.dig(:settings, 'game_framework') }
16
+ end
17
+
14
18
  def parse_test(request)
15
19
  YAML.load(request.test).deep_symbolize_keys
16
20
  end
@@ -0,0 +1,60 @@
1
+ module Gobstones
2
+ module CompilationMode
3
+ module Classic
4
+ class << self
5
+ def compile_extra(extra)
6
+ extra
7
+ end
8
+
9
+ def compile_content(content)
10
+ content
11
+ end
12
+ end
13
+ end
14
+
15
+ module GameFramework
16
+ class << self
17
+ def compile_extra(extra)
18
+ [extra, extra_code]
19
+ end
20
+
21
+ def compile_content(content)
22
+ if blockly_code?(content)
23
+ xml = Nokogiri::XML(content)
24
+ xml.root.add_child render_framework_file('program.xml')
25
+ xml.to_xhtml.gsub(/\n\s*/, '')
26
+ else
27
+ <<~GBS
28
+ #{content}
29
+
30
+ #{program_code}
31
+ GBS
32
+ .chop
33
+ end
34
+ end
35
+
36
+ def extra_code
37
+ render_framework_file 'extra.gbs'
38
+ end
39
+
40
+ def program_code
41
+ render_framework_file 'program.gbs'
42
+ end
43
+
44
+ def default_code
45
+ render_framework_file 'default.xml'
46
+ end
47
+
48
+ private
49
+
50
+ def blockly_code?(content)
51
+ content.strip.start_with? '<xml'
52
+ end
53
+
54
+ def render_framework_file(name)
55
+ ERB.new(File.read("lib/game_framework/#{name}.erb")).result
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,13 +1,15 @@
1
1
  require 'mumukit'
2
2
  require 'erb'
3
+ require 'nokogiri'
3
4
 
4
5
  I18n.load_translations_path File.join(__dir__, 'locales', '*.yml')
5
6
 
6
7
  Mumukit.runner_name = 'gobstones'
7
8
  Mumukit.configure do |config|
8
- config.docker_image = 'mumuki/mumuki-gobstones-worker:6.0'
9
+ config.docker_image = 'mumuki/mumuki-gobstones-worker:9.1'
9
10
  config.content_type = 'html'
10
11
  config.structured = true
12
+ config.settings = true
11
13
  end
12
14
 
13
15
  require_relative './gobstones'
@@ -0,0 +1,5 @@
1
+ <category name="Bloques de Gobstones">
2
+ <block type="RepeticionSimple"></block>
3
+ </category>
4
+ <category name="Procedimientos primitivos"></category>
5
+ <category name="Funciones primitivas"></category>
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
6
+ <g id="Layer_2" display="none">
7
+ <g display="inline">
8
+ <rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
9
+ </g>
10
+ </g>
11
+ <g id="Layer_3" display="none">
12
+ </g>
13
+ <g id="Layer_1">
14
+
15
+ <line fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="3.836" y1="3.836" x2="10.336" y2="10.336"/>
16
+
17
+ <line fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="10.336" y1="3.836" x2="3.836" y2="10.336"/>
18
+ </g>
19
+ <g id="Layer_4" display="none">
20
+
21
+ <polyline display="inline" fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
22
+ 10.958,4.801 6.388,9.372 3.215,6.094 "/>
23
+ </g>
24
+ </svg>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
6
+ <g id="Layer_2" display="none">
7
+ <g display="inline">
8
+ <rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
9
+ </g>
10
+ </g>
11
+ <g id="Layer_3" display="none">
12
+ </g>
13
+ <g id="Layer_1">
14
+ <polyline fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
15
+ 10.958,4.801 6.388,9.372 3.215,6.094 "/>
16
+ </g>
17
+ </svg>
@@ -0,0 +1,44 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
6
+ <g id="Layer_2" display="none">
7
+ <g display="inline">
8
+ <rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
9
+ </g>
10
+ </g>
11
+ <g id="Layer_3" display="none">
12
+ </g>
13
+ <g id="Layer_7">
14
+ </g>
15
+ <g id="Layer_1">
16
+
17
+ <circle fill="#1B75BB" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="7.087" cy="7.086" r="3.688"/>
18
+ </g>
19
+ <g id="Layer_6" display="none">
20
+ <g display="inline">
21
+ <g>
22
+
23
+ <path fill="#231F20" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
24
+ M7.082,3.701c0.021,1.21-0.007,5.512,0,6.771L0.889,7.086L7.082,3.701z"/>
25
+ </g>
26
+ <g>
27
+
28
+ <path fill="none" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
29
+ M7.09,3.701c-0.021,1.21,0.008,5.512,0,6.771l6.194-3.386L7.09,3.701z"/>
30
+ </g>
31
+ </g>
32
+ </g>
33
+ <g id="Layer_5" display="none">
34
+
35
+ <line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="3.836" y1="3.836" x2="10.336" y2="10.336"/>
36
+
37
+ <line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="10.336" y1="3.836" x2="3.836" y2="10.336"/>
38
+ </g>
39
+ <g id="Layer_4" display="none">
40
+
41
+ <polyline display="inline" fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
42
+ 10.958,4.801 6.388,9.372 3.215,6.094 "/>
43
+ </g>
44
+ </svg>
@@ -0,0 +1,44 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="14.173px" height="14.173px" viewBox="0 0 14.173 14.173" enable-background="new 0 0 14.173 14.173" xml:space="preserve">
6
+ <g id="Layer_2" display="none">
7
+ <g display="inline">
8
+ <rect x="-5.132" y="-3.933" fill="#5CBEFF" width="67.306" height="25.396"/>
9
+ </g>
10
+ </g>
11
+ <g id="Layer_3" display="none">
12
+ </g>
13
+ <g id="Layer_7">
14
+ </g>
15
+ <g id="Layer_1">
16
+
17
+ <circle fill="#404041" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="7.087" cy="7.086" r="3.688"/>
18
+ </g>
19
+ <g id="Layer_6" display="none">
20
+ <g display="inline">
21
+ <g>
22
+
23
+ <path fill="#231F20" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
24
+ M7.082,3.701c0.021,1.21-0.007,5.512,0,6.771L0.889,7.086L7.082,3.701z"/>
25
+ </g>
26
+ <g>
27
+
28
+ <path fill="none" stroke="#231F20" stroke-width="0.9761" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
29
+ M7.09,3.701c-0.021,1.21,0.008,5.512,0,6.771l6.194-3.386L7.09,3.701z"/>
30
+ </g>
31
+ </g>
32
+ </g>
33
+ <g id="Layer_5" display="none">
34
+
35
+ <line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="3.836" y1="3.836" x2="10.336" y2="10.336"/>
36
+
37
+ <line display="inline" fill="#FFFFFF" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="10.336" y1="3.836" x2="3.836" y2="10.336"/>
38
+ </g>
39
+ <g id="Layer_4" display="none">
40
+
41
+ <polyline display="inline" fill="none" stroke="#231F20" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
42
+ 10.958,4.801 6.388,9.372 3.215,6.094 "/>
43
+ </g>
44
+ </svg>