pinokiod 3.9.0 → 3.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/:w +1247 -0
  2. package/kernel/api/filepicker/index.js +59 -0
  3. package/kernel/api/fs/index.js +6 -4
  4. package/kernel/api/index.js +123 -37
  5. package/kernel/api/input/index.js +2 -0
  6. package/kernel/api/web/index.js +6 -0
  7. package/kernel/bin/caddy.js +127 -0
  8. package/kernel/bin/cloudflared.js +1 -0
  9. package/kernel/bin/conda.js +10 -2
  10. package/kernel/bin/cuda.js +0 -16
  11. package/kernel/bin/ffmpeg.js +4 -6
  12. package/kernel/bin/git.js +55 -29
  13. package/kernel/bin/gxx.js +8 -6
  14. package/kernel/bin/huggingface.js +4 -5
  15. package/kernel/bin/index.js +347 -88
  16. package/kernel/bin/node.js +13 -6
  17. package/kernel/bin/py.js +1 -1
  18. package/kernel/bin/setup.js +146 -0
  19. package/kernel/bin/uv.js +4 -5
  20. package/kernel/bin/zip.js +7 -8
  21. package/kernel/connect/index.js +25 -0
  22. package/kernel/connect/providers/github/README.md +11 -0
  23. package/kernel/connect/providers/x/README.md +96 -0
  24. package/kernel/connect/providers/x/index.js +152 -0
  25. package/kernel/environment.js +50 -1
  26. package/kernel/index.js +152 -32
  27. package/kernel/info.js +4 -2
  28. package/kernel/kv.js +38 -0
  29. package/kernel/loader.js +13 -3
  30. package/kernel/peer.js +161 -0
  31. package/kernel/procs.js +116 -0
  32. package/kernel/prototype.js +62 -0
  33. package/kernel/router/common.js +42 -0
  34. package/kernel/router/connector.js +81 -0
  35. package/kernel/router/index.js +235 -0
  36. package/kernel/router/localhost_home_router.js +84 -0
  37. package/kernel/router/localhost_port_router.js +15 -0
  38. package/kernel/router/localhost_variable_router.js +37 -0
  39. package/kernel/router/peer_home_router.js +15 -0
  40. package/kernel/router/peer_peer_router.js +26 -0
  41. package/kernel/router/peer_port_router.js +45 -0
  42. package/kernel/router/peer_variable_router.js +46 -0
  43. package/kernel/router/processor.js +31 -0
  44. package/kernel/shell.js +141 -60
  45. package/kernel/shells.js +32 -17
  46. package/kernel/store.js +58 -0
  47. package/kernel/sysinfo.js +0 -1
  48. package/kernel/util.js +143 -36
  49. package/package.json +4 -1
  50. package/pipe/index.js +0 -2
  51. package/script/index.js +12 -0
  52. package/server/index.js +1473 -553
  53. package/server/public/Socket.js +5 -1
  54. package/server/public/SourceCodePro-Regular.ttf +0 -0
  55. package/server/public/SpaceMono-Bold.ttf +0 -0
  56. package/server/public/SpaceMono-BoldItalic.ttf +0 -0
  57. package/server/public/SpaceMono-Italic.ttf +0 -0
  58. package/server/public/SpaceMono-Regular.ttf +0 -0
  59. package/server/public/commander.js +40 -0
  60. package/server/public/common.js +60 -0
  61. package/server/public/dropzone-min.js +2 -0
  62. package/server/public/dropzone.css +1 -0
  63. package/server/public/filepond-plugin-file-validate-type.min.js +9 -0
  64. package/server/public/filepond-plugin-image-crop.min.js +9 -0
  65. package/server/public/filepond-plugin-image-edit.min.css +8 -0
  66. package/server/public/filepond-plugin-image-edit.min.js +9 -0
  67. package/server/public/filepond-plugin-image-exif-orientation.min.js +9 -0
  68. package/server/public/filepond-plugin-image-preview.min.css +8 -0
  69. package/server/public/filepond-plugin-image-preview.min.js +9 -0
  70. package/server/public/filepond-plugin-image-resize.min.js +9 -0
  71. package/server/public/filepond-plugin-image-transform.min.js +9 -0
  72. package/server/public/filepond.min.css +8 -0
  73. package/server/public/filepond.min.js +9 -0
  74. package/server/public/fscreator.js +174 -0
  75. package/server/public/fseditor.js +212 -0
  76. package/server/public/github.png +0 -0
  77. package/server/public/highlight-js.js +81 -0
  78. package/server/public/highlight.css +9 -0
  79. package/server/public/highlight.js +1244 -0
  80. package/server/public/install.js +17 -20
  81. package/server/public/modalinput.js +105 -9
  82. package/server/public/opener.js +3 -1
  83. package/server/public/pinokio-black.png +0 -0
  84. package/server/public/pinokio-black2.png +0 -0
  85. package/server/public/redoc.standalone.js +1832 -0
  86. package/server/public/style.css +215 -17
  87. package/server/public/swagger-ui-bundle.js +2 -0
  88. package/server/public/swagger-ui.css +3 -0
  89. package/server/public/x.js +63 -0
  90. package/server/socket.js +136 -39
  91. package/server/views/404.ejs +0 -1
  92. package/server/views/app.ejs +368 -98
  93. package/server/views/bootstrap.ejs +22 -19
  94. package/server/views/connect/x.ejs +324 -0
  95. package/server/views/connect.ejs +197 -0
  96. package/server/views/download.ejs +7 -1
  97. package/server/views/editor.ejs +68 -9
  98. package/server/views/explore.ejs +13 -10
  99. package/server/views/file_explorer.ejs +10 -37
  100. package/server/views/github.ejs +218 -0
  101. package/server/views/help.ejs +4 -3
  102. package/server/views/index.ejs +275 -121
  103. package/server/views/install.ejs +56 -29
  104. package/server/views/keys.ejs +276 -0
  105. package/server/views/network.ejs +889 -0
  106. package/server/views/partials/dynamic.ejs +9 -0
  107. package/server/views/partials/menu.ejs +7 -1
  108. package/server/views/prototype/index.ejs +311 -0
  109. package/server/views/prototype/show.ejs +383 -0
  110. package/server/views/redoc.ejs +18 -0
  111. package/server/views/required_env_editor.ejs +11 -2
  112. package/server/views/settings.ejs +38 -10
  113. package/server/views/setup.ejs +254 -0
  114. package/server/views/setup_home.ejs +192 -0
  115. package/server/views/shell.ejs +781 -0
  116. package/server/views/swaggerui.ejs +19 -0
  117. package/server/views/terminal.ejs +174 -42
  118. package/LICENSE +0 -7
  119. package/server/views/proxy.ejs +0 -405
@@ -0,0 +1,212 @@
1
+ const FSEditor = async ({title, description, old_path, icon, iconpath, redirect, copy, move, edit }) => {
2
+ console.log({ icon, iconpath })
3
+ const compare = async (file1, file2) => {
4
+ if (file1.size !== file2.size) return false;
5
+ console.log({ file1, file2 })
6
+ const buffer1 = await file1.arrayBuffer();
7
+ const buffer2 = await file2.arrayBuffer();
8
+ const view1 = new Uint8Array(buffer1);
9
+ const view2 = new Uint8Array(buffer2);
10
+ for (let i = 0; i < view1.length; i++) {
11
+ if (view1[i] !== view2[i]) return false;
12
+ }
13
+ return true;
14
+ }
15
+ let dirty
16
+ let mode
17
+ let new_path
18
+ let initial_file
19
+ let title_label
20
+ let file_type
21
+ let folderpath_html = ""
22
+ if (copy) {
23
+ mode = "copy"
24
+ title_label = "Copy to"
25
+ } else if (move) {
26
+ mode = "move"
27
+ title_label = "Move to"
28
+ } else {
29
+ mode = "edit"
30
+ title_label = "Edit"
31
+ }
32
+ if (copy || move) {
33
+ folderpath_html = `<div class='folder-row'>
34
+ <label for='new-folder-description'>Folder Path</label>
35
+ <div class='field-row'>
36
+ <label>/api/</label>
37
+ <input id="new-folder-path" class="swal2-input" placeholder="Folder Path" value="${old_path}" />
38
+ </div>
39
+ </div>`
40
+ }
41
+ let result = await Swal.fire({
42
+ title: title_label,
43
+ html: `<div class='filepond-wrapper'>
44
+ <div class='avatar-field'>
45
+ <input id='new-folder-image' type="file" class="filepond" name="avatar" accept="image/png, image/jpeg, image/gif" />
46
+ </div>
47
+ <div class='folder-rows'>
48
+ ${folderpath_html}
49
+ <div class='folder-row'>
50
+ <label for='new-folder-title'>Title</label>
51
+ <input id="new-folder-title" class="swal2-input" placeholder="Folder Name" value="${title}" />
52
+ </div>
53
+ <div class='folder-row'>
54
+ <label for='new-folder-description'>Description</label>
55
+ <textarea id="new-folder-description" class="swal2-input" placeholder="Folder Description">${description}</textarea>
56
+ </div>
57
+ </div>
58
+ </div>`,
59
+ allowOutsideClick: true,
60
+ focusConfirm: false,
61
+ // showCancelButton: true,
62
+ confirmButtonText: 'Save',
63
+ didOpen: () => {
64
+ const textarea = document.querySelector("#new-folder-description")
65
+ textarea.style.height = 'auto';
66
+ textarea.style.height = textarea.scrollHeight + 'px';
67
+ textarea.addEventListener('input', () => {
68
+ textarea.style.height = textarea.scrollHeight + 'px';
69
+ });
70
+ FilePond.registerPlugin(
71
+ FilePondPluginFileValidateType,
72
+ FilePondPluginImageExifOrientation,
73
+ FilePondPluginImagePreview,
74
+ FilePondPluginImageCrop,
75
+ FilePondPluginImageResize,
76
+ FilePondPluginImageTransform,
77
+ FilePondPluginImageEdit
78
+ );
79
+ pond = FilePond.create(
80
+ document.querySelector('#new-folder-image'),
81
+ {
82
+ allowReplace: true,
83
+ allowRevert: true,
84
+ allowRemove: true,
85
+
86
+ allowImageCrop: true,
87
+ allowImageEdit: true,
88
+ allowImageTransform: true,
89
+
90
+
91
+ labelIdle: `Drag & Drop your picture or <span class="filepond--label-action">Browse</span>`,
92
+ imagePreviewHeight: 170,
93
+ imageCropAspectRatio: '1:1',
94
+ imageResizeTargetWidth: 200,
95
+ imageResizeTargetHeight: 200,
96
+ stylePanelLayout: 'compact circle',
97
+ instantUpload: false,
98
+ server: {
99
+ // process: {
100
+ // url: '/pinokio/upload', // optional if same as above
101
+ process: async (fieldName, file, metadata, load, error, progress, abort) => {
102
+ const formData = new FormData();
103
+
104
+ console.log("upload", { dirty })
105
+ if (dirty) {
106
+ formData.append("icon_dirty", true)
107
+ }
108
+ formData.append("icon_path", iconpath)
109
+ let title = Swal.getPopup().querySelector('#new-folder-title').value
110
+ let description = Swal.getPopup().querySelector('#new-folder-description').value
111
+ let folder_path_el = Swal.getPopup().querySelector('#new-folder-path')
112
+ formData.append("title", title)
113
+ formData.append("description", description)
114
+ formData.append("old_path", old_path)
115
+ let path
116
+ if (folder_path_el) {
117
+ path = folder_path_el.value
118
+ formData.append("new_path", path)
119
+ } else {
120
+ path = old_path
121
+ formData.append("new_path", old_path)
122
+ }
123
+ if (mode === "copy") {
124
+ formData.append("copy", true)
125
+ } else if (mode === "move") {
126
+ formData.append("move", true)
127
+ }
128
+ if (edit) {
129
+ formData.append("edit", true)
130
+ }
131
+ new_path = path
132
+
133
+ try {
134
+ let response = await fetch('/pinokio/upload', {
135
+ method: 'POST',
136
+ body: formData
137
+ }).then(res => res.json())
138
+ if (response.error) {
139
+ alert(response.error)
140
+ } else {
141
+ Swal.close()
142
+ if (new_path) {
143
+ location.href = redirect(new_path)
144
+ } else {
145
+ location.href = location.href
146
+ }
147
+ }
148
+ } catch (e) {
149
+ alert(e.message)
150
+ }
151
+ return {
152
+ abort: () => {
153
+ abort();
154
+ }
155
+ };
156
+ }
157
+ },
158
+ onaddfile(error, file) {
159
+ console.log({ file, initial_file })
160
+ if (initial_file) {
161
+ compare(initial_file.file, file.file).then((same) => {
162
+ if (same) {
163
+ // don't do anything
164
+ } else {
165
+ dirty = true
166
+ // make sure the image mime type is transformed into the same type as the existing image
167
+ pond.setOptions({
168
+ imageTransformOutputMimeType: initial_file.fileType
169
+ })
170
+ }
171
+ initial_file = file
172
+ })
173
+ } else {
174
+ initial_file = file
175
+ }
176
+ },
177
+ // onprocessfile(error, file) {
178
+ // console.log("onprocessfile")
179
+ // if (error) {
180
+ // alert(error.body)
181
+ // } else {
182
+ // Swal.close()
183
+ // if (new_path) {
184
+ // location.href = redirect(new_path)
185
+ // } else {
186
+ // location.href = location.href
187
+ // }
188
+ // }
189
+ // },
190
+ files: [
191
+ {
192
+ type: 'local',
193
+ source: icon,
194
+ }
195
+ ]
196
+ }
197
+ );
198
+ },
199
+ preConfirm: () => {
200
+ if (mode === "copy") {
201
+ let new_path = Swal.getPopup().querySelector('#new-folder-path').value
202
+ if (new_path === old_path) {
203
+ alert("Please specify a new folder name to copy to")
204
+ return false
205
+ }
206
+ }
207
+ pond.processFile()
208
+ return false
209
+ }
210
+ })
211
+
212
+ }
Binary file
@@ -0,0 +1,81 @@
1
+ /*! `javascript` grammar compiled for Highlight.js 11.11.1 */
2
+ (()=>{var e=(()=>{"use strict"
3
+ ;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],r=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],c=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],i=[].concat(r,t,s)
4
+ ;return o=>{const l=o.regex,d=e,b={begin:/<[A-Za-z0-9\\._:-]+/,
5
+ end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{
6
+ const a=e[0].length+e.index,t=e.input[a]
7
+ ;if("<"===t||","===t)return void n.ignoreMatch();let s
8
+ ;">"===t&&(((e,{after:n})=>{const a="</"+e[0].slice(1)
9
+ ;return-1!==e.input.indexOf(a,n)})(e,{after:a})||n.ignoreMatch())
10
+ ;const r=e.input.substring(a)
11
+ ;((s=r.match(/^\s*=/))||(s=r.match(/^\s+extends\s+/))&&0===s.index)&&n.ignoreMatch()
12
+ }},g={$pattern:e,keyword:n,literal:a,built_in:i,"variable.language":c
13
+ },u="[0-9](_?[0-9])*",m=`\\.(${u})`,E="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",A={
14
+ className:"number",variants:[{
15
+ begin:`(\\b(${E})((${m})|\\.)?|(${m}))[eE][+-]?(${u})\\b`},{
16
+ begin:`\\b(${E})\\b((${m})\\b|\\.)?|(${m})\\b`},{
17
+ begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{
18
+ begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{
19
+ begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{
20
+ begin:"\\b0[0-7]+n?\\b"}],relevance:0},y={className:"subst",begin:"\\$\\{",
21
+ end:"\\}",keywords:g,contains:[]},h={begin:".?html`",end:"",starts:{end:"`",
22
+ returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"xml"}},_={
23
+ begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,
24
+ contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"css"}},N={begin:".?gql`",end:"",
25
+ starts:{end:"`",returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],
26
+ subLanguage:"graphql"}},f={className:"string",begin:"`",end:"`",
27
+ contains:[o.BACKSLASH_ESCAPE,y]},p={className:"comment",
28
+ variants:[o.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{
29
+ begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",
30
+ begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,
31
+ excludeBegin:!0,relevance:0},{className:"variable",begin:d+"(?=\\s*(-)|$)",
32
+ endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]
33
+ }),o.C_BLOCK_COMMENT_MODE,o.C_LINE_COMMENT_MODE]
34
+ },v=[o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,h,_,N,f,{match:/\$\d+/},A]
35
+ ;y.contains=v.concat({begin:/\{/,end:/\}/,keywords:g,contains:["self"].concat(v)
36
+ });const S=[].concat(p,y.contains),w=S.concat([{begin:/(\s*)\(/,end:/\)/,
37
+ keywords:g,contains:["self"].concat(S)}]),R={className:"params",begin:/(\s*)\(/,
38
+ end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w},O={variants:[{
39
+ match:[/class/,/\s+/,d,/\s+/,/extends/,/\s+/,l.concat(d,"(",l.concat(/\./,d),")*")],
40
+ scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{
41
+ match:[/class/,/\s+/,d],scope:{1:"keyword",3:"title.class"}}]},k={relevance:0,
42
+ match:l.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),
43
+ className:"title.class",keywords:{_:[...t,...s]}},I={variants:[{
44
+ match:[/function/,/\s+/,d,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],
45
+ className:{1:"keyword",3:"title.function"},label:"func.def",contains:[R],
46
+ illegal:/%/},x={
47
+ match:l.concat(/\b/,(T=[...r,"super","import"].map((e=>e+"\\s*\\(")),
48
+ l.concat("(?!",T.join("|"),")")),d,l.lookahead(/\s*\(/)),
49
+ className:"title.function",relevance:0};var T;const C={
50
+ begin:l.concat(/\./,l.lookahead(l.concat(d,/(?![0-9A-Za-z$_(])/))),end:d,
51
+ excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},M={
52
+ match:[/get|set/,/\s+/,d,/(?=\()/],className:{1:"keyword",3:"title.function"},
53
+ contains:[{begin:/\(\)/},R]
54
+ },B="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+o.UNDERSCORE_IDENT_RE+")\\s*=>",$={
55
+ match:[/const|var|let/,/\s+/,d,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(B)],
56
+ keywords:"async",className:{1:"keyword",3:"title.function"},contains:[R]}
57
+ ;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{
58
+ PARAMS_CONTAINS:w,CLASS_REFERENCE:k},illegal:/#(?![$_A-z])/,
59
+ contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{
60
+ label:"use_strict",className:"meta",relevance:10,
61
+ begin:/^\s*['"]use (strict|asm)['"]/
62
+ },o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,h,_,N,f,p,{match:/\$\d+/},A,k,{
63
+ scope:"attr",match:d+l.lookahead(":"),relevance:0},$,{
64
+ begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",
65
+ keywords:"return throw case",relevance:0,contains:[p,o.REGEXP_MODE,{
66
+ className:"function",begin:B,returnBegin:!0,end:"\\s*=>",contains:[{
67
+ className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{
68
+ className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,
69
+ excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w}]}]},{begin:/,/,relevance:0
70
+ },{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:"</>"},{
71
+ match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:b.begin,
72
+ "on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{
73
+ begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},I,{
74
+ beginKeywords:"while if switch catch for"},{
75
+ begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",
76
+ returnBegin:!0,label:"func.def",contains:[R,o.inherit(o.TITLE_MODE,{begin:d,
77
+ className:"title.function"})]},{match:/\.\.\./,relevance:0},C,{match:"\\$"+d,
78
+ relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},
79
+ contains:[R]},x,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,
80
+ className:"variable.constant"},O,M,{match:/\$[(.]/}]}}})()
81
+ ;hljs.registerLanguage("javascript",e)})();
@@ -0,0 +1,9 @@
1
+ /*!
2
+ Theme: Default
3
+ Description: Original highlight.js style
4
+ Author: (c) Ivan Sagalaev <maniac@softwaremaniacs.org>
5
+ Maintainer: @highlightjs/core-team
6
+ Website: https://highlightjs.org/
7
+ License: see project LICENSE
8
+ Touched: 2021
9
+ */pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}