merge: 合并master到develop

This commit is contained in:
王立帮
2025-05-18 00:17:23 +08:00
89 changed files with 4695 additions and 860 deletions

View File

@@ -104,6 +104,10 @@
}
},
"web": {
"com": "serial"
"devices": {
"serial": true,
"hid": false,
"usb": false
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -32,26 +32,10 @@
}
},
"web": {
"com": "serial",
"upload": {
"reset": [
{
"dtr": false,
"rts": false
}, {
"sleep": 500
}, {
"dtr": false,
"rts": true
}, {
"sleep": 500
}, {
"dtr": false,
"rts": false
}, {
"sleep": 500
}
]
"devices": {
"serial": true,
"hid": false,
"usb": false
}
}
}

View File

@@ -1 +1 @@
<script defer=defer src=main.bundle.af75b215.js></script><link href=styles/main.b29a8ee0.css rel=stylesheet><xml></xml>
<script defer=defer src=main.bundle.ec93e14c.js></script><link href=styles/main.b29a8ee0.css rel=stylesheet><xml></xml>

View File

@@ -1076,26 +1076,10 @@
}
},
"web": {
"com": "serial",
"upload": {
"reset": [
{
"dtr": true,
"rts": true
}, {
"sleep": 500
}, {
"dtr": false,
"rts": true
}, {
"sleep": 500
}, {
"dtr": true,
"rts": true
}, {
"sleep": 500
}
]
"devices": {
"serial": true,
"hid": false,
"usb": false
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
(self.webpackChunk_mixly_python_pyodide=self.webpackChunk_mixly_python_pyodide||[]).push([[837],{8982:()=>{},7790:()=>{},3776:()=>{},7965:()=>{},6089:()=>{},9368:()=>{},4688:()=>{},1069:()=>{},5340:()=>{},9838:()=>{},6490:()=>{},3779:()=>{},7199:()=>{}}]);
(self.webpackChunk_mixly_python_pyodide=self.webpackChunk_mixly_python_pyodide||[]).push([[837],{8982:()=>{},7790:()=>{},3776:()=>{},7965:()=>{},6089:()=>{},9368:()=>{},4688:()=>{},1069:()=>{},5340:()=>{},9838:()=>{},6490:()=>{},9017:()=>{},7199:()=>{}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -9,7 +9,7 @@ export const base_setup = {
this.appendStatementInput("DO").appendField("");
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_SETUP);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#id2"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#id2"
);
}
};
@@ -26,7 +26,7 @@ export const controls_delay = {
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#id9"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#id9"
);
},
UNIT: [
@@ -58,7 +58,7 @@ export const controls_for = {
this.setNextStatement(true);
this.setInputsInline(true);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#id2"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#for"
);
var thisBlock = this;
this.setTooltip(function () {
@@ -90,7 +90,7 @@ export const controls_whileUntil = {
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#while"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#while"
);
var thisBlock = this;
this.setTooltip(function () {
@@ -193,7 +193,7 @@ export const controls_if = {
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#if"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#if"
);
this.setMutator(
new Blockly.icons.MutatorIcon(
@@ -535,7 +535,7 @@ export const controls_switch_case = {
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#switch"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#switch"
);
this.setMutator(
new Blockly.icons.MutatorIcon(["controls_case", "controls_default"], this)
@@ -743,7 +743,7 @@ export const controls_mstimer2 = {
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_MSTIMER2);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#MsTimer2"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#mstimer2"
);
}
};
@@ -757,7 +757,7 @@ export const controls_mstimer2_start = {
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#id45"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#id36"
);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_MSTIMER2_START);
}
@@ -773,7 +773,7 @@ export const controls_mstimer2_stop = {
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_MSTIMER2_STOP);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#id48"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#id38"
);
}
};
@@ -808,7 +808,7 @@ export const controls_interrupts = {
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_ALLOW_INTERRUPT);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#id51"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#id43"
);
}
};
@@ -822,7 +822,7 @@ export const controls_nointerrupts = {
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_CONTROL_NOINTERRUPTS);
this.setHelpUrl(
"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#id55"
"https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#id46"
);
}
};
@@ -844,7 +844,7 @@ export const simple_timer = {
.appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);
this.setColour(120);
this.setTooltip();
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#id40");
},
NUMBER: [
["1", "1"],

View File

@@ -49,7 +49,7 @@ export const inout_digital_write2 = {
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.LANG_INOUT_DIGITAL_WRITE_TOOLTIP);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id2");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#id2");
}
};
@@ -61,7 +61,7 @@ export const inout_digital_read = {
.appendField(new Blockly.FieldDropdown(Profile.default.digital), "PIN");
this.setOutput(true, [Boolean, Number]);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_DIGITAL_READ);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id7");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#id6");
}
};
@@ -74,7 +74,7 @@ export const inout_digital_read2 = {
this.setInputsInline(true);
this.setOutput(true, [Boolean, Number]);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_DIGITAL_READ);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id19");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#id6");
}
};
@@ -91,7 +91,7 @@ export const inout_analog_write = {
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_WRITE);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id13");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#id16");
}
};
@@ -104,7 +104,7 @@ export const inout_analog_read = {
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_READ);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id13");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#id11");
}
};
@@ -166,7 +166,7 @@ export const controls_attachInterrupt = {
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ATTACHINTERRUPT);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id25");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#id20");
}
};
@@ -180,7 +180,7 @@ export const controls_detachInterrupt = {
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_DETACHINTERRUPT);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id30");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#id24");
}
};
@@ -231,7 +231,7 @@ export const inout_pulseIn = {
]), "STAT");
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_pulseIn);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id33");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#id27");
}
};
@@ -253,7 +253,7 @@ export const inout_pulseIn2 = {
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_pulseIn2);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id33");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#id27");
}
};
@@ -281,7 +281,7 @@ export const inout_shiftout = {
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_shiftout);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#shiftout");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/01Input-Output.html#shiftout");
}
};

View File

@@ -448,6 +448,7 @@ export const lists_length = {
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR');
this.setTooltip(Blockly.Msg.LISTS_LENGTH_TOOLTIP);
this.setOutput(true, Number);
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/06Lists.html#mylist");
}
};
@@ -472,7 +473,7 @@ export const create_array2_with_text = {
.appendField(Blockly.Msg.MIXLY_ESP32_SET);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/06Lists.html#array");
}
};
@@ -514,7 +515,7 @@ export const get_array2_value = {
.appendField('(' + Blockly.Msg.MIXLY_DEPRECATED + ')');
this.setInputsInline(true);
this.setOutput(true, null);
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/06Lists.html#arraymn");
this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT);
}
};
@@ -535,7 +536,7 @@ export const lists2SetValueByIndex = {
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/06Lists.html#mn");
this.setTooltip(Blockly.Msg.LANG_LISTS_SET_VALUE_BY_INDEX_TOOLTIP);
}
};
@@ -553,7 +554,7 @@ export const lists2GetValueByIndex = {
.appendField(Blockly.Msg.DATAFRAME_COLUMN);
this.setInputsInline(true);
this.setOutput(true, null);
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/06Lists.html#arraymn");
this.setTooltip(Blockly.Msg.LANG_LISTS_GET_VALUE_BY_INDEX_TOOLTIP);
}
};

View File

@@ -23,7 +23,7 @@ export const logic_compare = {
['>', 'GT'],
['\u2265', 'GTE']
];
//this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL);
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/04Logic.html#id2");
this.setColour(LOGIC_HUE);
this.setOutput(true, Boolean);
this.appendValueInput('A');
@@ -58,7 +58,7 @@ export const logic_operation = {
[Blockly.Msg.LOGIC_OPERATION_AND, 'AND'],
[Blockly.Msg.LOGIC_OPERATION_OR, 'OR']
];
//this.setHelpUrl(Blockly.Msg.LOGIC_OPERATION_HELPURL);
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/04Logic.html#id12");
this.setColour(LOGIC_HUE);
this.setOutput(true, Boolean);
this.appendValueInput('A')
@@ -144,5 +144,6 @@ export const logic_true_or_false = {
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_LOGIT_TRUEORFALSE);
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/04Logic.html#id17");
}
};

View File

@@ -19,7 +19,7 @@ export const math_number = {
Blockly.FieldTextInput.math_number_validator), 'NUM');
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id2");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#id2");
}
};
@@ -34,7 +34,7 @@ export const math_arithmetic = {
this.setOutput(true, Number);
this.appendValueInput('A')
.setCheck(null);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id4");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#id4");
this.appendValueInput('B')
.setCheck(null)
.appendField(new Blockly.FieldDropdown(math_arithmetic.OPERATORS), 'OP');
@@ -75,7 +75,7 @@ export const math_bit = {
.appendField(new Blockly.FieldDropdown(math_bit.OPERATORS), 'OP');
this.setInputsInline(true);
this.setTooltip("");
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id8");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#id8");
},
OPERATORS: [
['&', '&'],
@@ -100,7 +100,7 @@ export const math_trig = {
.appendField(new Blockly.FieldDropdown(math_trig.OPERATORS), 'OP');
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id17");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#id21");
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
@@ -139,7 +139,7 @@ export const math_to_int = {
.setCheck(Number)
.appendField(new Blockly.FieldDropdown(math_to_int.OPERATORS), 'OP');
this.setOutput(true, Number);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id18");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#id35");
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
@@ -226,7 +226,7 @@ export const math_max_min = {
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(')');
this.setInputsInline(true);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#min-max");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#min-max");
this.setOutput(true, Number);
var thisBlock = this;
this.setTooltip(function () {
@@ -255,7 +255,7 @@ export const math_random_seed = {
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_MATH_RANDOM_SEED);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#randomseed");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#randomseed");
}
};
@@ -276,7 +276,7 @@ export const math_random_int = {
.appendField(Blockly.Msg.LANG_MATH_RANDOM_INT_INPUT_TO);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MATH_RANDOM_INT_TOOLTIP);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#random");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#random");
}
};
@@ -299,7 +299,7 @@ export const math_constrain = {
.appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_HIGH);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MATH_CONSTRAIN_TOOLTIP);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#constrain");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#constrain");
}
};
@@ -330,7 +330,7 @@ export const base_map = {
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_MATH_MAP);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#map");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/03Mathematics.html#map");
}
};

View File

@@ -15,7 +15,7 @@ export const SCoopTask = {
.setCheck(null);
this.setColour(SCOOP_HUE);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SCOOP);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#scoop-task");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#scoop-task");
},
NUMBER: [
["1", "1"],
@@ -37,7 +37,7 @@ export const SCoop_yield = {
this.setPreviousStatement(false, null);
this.setNextStatement(false, null);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SCOOP_YIELD);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#scoop-task");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/02Control.html#scoop-task");
}
};

View File

@@ -271,7 +271,7 @@ export const substring = {
this.setOutput(true, null);
this.setColour(TEXTS_HUE);
this.setTooltip(Blockly.Msg.SUBSTRING_HELP);
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/05Text.html#id13");
}
};
@@ -291,7 +291,7 @@ export const letter_conversion = {
this.setNextStatement(true, null);
this.setColour(TEXTS_HUE);
this.setTooltip(Blockly.Msg.LETTER_CONVERSION_HELP);
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/05Text.html#id19");
}
};
@@ -312,7 +312,7 @@ export const data_replacement = {
this.setNextStatement(true, null);
this.setColour(TEXTS_HUE);
this.setTooltip(Blockly.Msg.DATA_REPLACEMENT_HELP);
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/05Text.html#id23");
}
};
@@ -328,7 +328,7 @@ export const eliminate = {
this.setNextStatement(true, null);
this.setColour(TEXTS_HUE);
this.setTooltip(Blockly.Msg.ELIMINATE_HELP);
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/05Text.html#id27");
}
};
@@ -349,7 +349,7 @@ export const first_and_last = {
this.setOutput(true, null);
this.setColour(TEXTS_HUE);
this.setTooltip(Blockly.Msg.FIRST_AND_LAST_HELP);
this.setHelpUrl("");
this.setHelpUrl("https://mixly.readthedocs.io/zh-cn/latest/Arduino/AVR/05Text.html#id31");
}
};

View File

@@ -104,6 +104,10 @@
}
},
"web": {
"com": "serial"
"devices": {
"serial": true,
"hid": false,
"usb": false
}
}
}

View File

@@ -32,26 +32,10 @@
}
},
"web": {
"com": "serial",
"upload": {
"reset": [
{
"dtr": false,
"rts": false
}, {
"sleep": 500
}, {
"dtr": false,
"rts": true
}, {
"sleep": 500
}, {
"dtr": false,
"rts": false
}, {
"sleep": 500
}
]
"devices": {
"serial": true,
"hid": false,
"usb": false
}
}
}

View File

@@ -1076,26 +1076,10 @@
}
},
"web": {
"com": "serial",
"upload": {
"reset": [
{
"dtr": true,
"rts": true
}, {
"sleep": 500
}, {
"dtr": false,
"rts": true
}, {
"sleep": 500
}, {
"dtr": true,
"rts": true
}, {
"sleep": 500
}
]
"devices": {
"serial": true,
"hid": false,
"usb": false
}
}
}

View File

@@ -398,7 +398,7 @@ export const actuator_neopixel_init = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
.appendField(Blockly.Msg.MIXLY_RGB);
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_SETUP)
.setCheck("var");
@@ -421,7 +421,7 @@ export const actuator_neopixel_rgb = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
.appendField(Blockly.Msg.MIXLY_RGB);
this.appendValueInput('SUB')
.setCheck("var");
// .appendField(Blockly.Msg.MIXLY_SETUP)
@@ -453,7 +453,7 @@ export const actuator_neopixel_rgb_all = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
.appendField(Blockly.Msg.MIXLY_RGB);
this.appendValueInput('SUB')
.setCheck("var");
this.appendValueInput("RVALUE")
@@ -480,11 +480,7 @@ export const actuator_neopixel_write = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
// this.appendValueInput("PIN", Number)
// .setCheck(Number)
// .setAlign(Blockly.inputs.Align.RIGHT)
// .appendField(Blockly.Msg.MIXLY_PIN);
.appendField(Blockly.Msg.MIXLY_RGB);
this.appendValueInput('SUB')
.setCheck("var");
this.appendDummyInput()
@@ -497,6 +493,58 @@ export const actuator_neopixel_write = {
}
};
export const actuator_neopixel_rgb_show_all_rainbow = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB);
this.appendValueInput('SUB')
.setCheck("var");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RAINBOW);
this.appendValueInput('time')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_DURATION)
.appendField(Blockly.Msg.MIXLY_MILLIS);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
}
};
export const actuator_neopixel_rgb_show_all_chase = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB);
this.appendValueInput('SUB')
.setCheck("var");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_CHASE);
this.appendValueInput("RVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_R);
this.appendValueInput("GVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_G);
this.appendValueInput("BVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_B);
this.appendValueInput('time')
.setCheck(Number)
.appendField(Blockly.Msg.PYTHON_RANGE_STEP)
.appendField(Blockly.Msg.MIXLY_MILLIS);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
}
};
export const actuator_use_uart_init = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);

View File

@@ -1028,7 +1028,7 @@ export const special_key = {
[Blockly.Msg.MIXLY_SPECIAL_KEY0, "0x00"],
[Blockly.Msg.MIXLY_SPECIAL_KEY1, "0x01"],
[Blockly.Msg.MIXLY_SPECIAL_KEY2, "0x02"],
[Blockly.Msg.MIXLY_SPECIAL_KEY1, "0x04"],
[Blockly.Msg.MIXLY_SPECIAL_KEY4, "0x04"],
[Blockly.Msg.MIXLY_SPECIAL_KEY8, "0x08"],
[Blockly.Msg.MIXLY_SPECIAL_KEY16, "0x10"],
[Blockly.Msg.MIXLY_SPECIAL_KEY32, "0x20"],

View File

@@ -178,41 +178,54 @@ export const actuator_extern_led_brightness = function (_, generator) {
}
export const actuator_neopixel_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var dropdown_rgbpin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_ledcount = generator.valueToCode(this, 'LEDCOUNT', generator.ORDER_ATOMIC);
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const dropdown_rgbpin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
const value_ledcount = generator.valueToCode(this, 'LEDCOUNT', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_neopixel'] = 'import neopixel';
var code = v + ' = neopixel.NeoPixel(machine.Pin(' + dropdown_rgbpin + '), ' + value_ledcount + ')\n';
generator.definitions_['import_ws2812_Neopixel'] = 'from ws2812 import NeoPixel';
const code = `${v} = NeoPixel(machine.Pin(${dropdown_rgbpin}), ${value_ledcount})\n`;
return code;
}
export const actuator_neopixel_rgb_all = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = v + '.fill((' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + '))\n';
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const code = `${v}.fill((${value_rvalue}, ${value_gvalue}, ${value_bvalue}))\n`;
return code;
}
export const actuator_neopixel_write = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_neopixel'] = 'import neopixel';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.write()\n';
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const code = `${v}.write()\n`;
return code;
}
export const actuator_neopixel_rgb = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_neopixel'] = 'import neopixel';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = v + '[' + value_led + '] = (' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const code = `${v}[${value_led}] = (${value_rvalue}, ${value_gvalue}, ${value_bvalue})\n`;
return code;
}
export const actuator_neopixel_rgb_show_all_chase = function (_, generator) {
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
const code = `${v}.color_chase(${value_rvalue}, ${value_gvalue}, ${value_bvalue}, ${number_time})\n`;
return code;
}
export const actuator_neopixel_rgb_show_all_rainbow = function (_, generator) {
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
const code = `${v}.rainbow_cycle(${number_time})\n`;
return code;
}

View File

@@ -203,49 +203,49 @@ export const rm_actuator_led_brightness = function (_, generator) {
}
export const actuator_onboard_neopixel_write = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var code = 'onboard_rgb.write()\n';
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const code = 'onboard_rgb.write()\n';
return code;
}
export const actuator_onboard_neopixel_rgb = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = 'onboard_rgb[' + value_led + '] = (' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const code = `onboard_rgb[${value_led}] = (${value_rvalue}, ${value_gvalue}, ${value_bvalue})\n`;
return code;
}
export const actuator_onboard_neopixel_rgb_all = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = 'onboard_rgb.fill((' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + '))\n';
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const code = `onboard_rgb.fill((${value_rvalue}, ${value_gvalue}, ${value_bvalue}))\n`;
return code;
}
export const actuator_onboard_neopixel_rgb_show_all_chase = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = 'onboard_rgb.color_chase(' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ', ' + number_time + ')\n';
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
const code = `onboard_rgb.color_chase(${value_rvalue}, ${value_gvalue}, ${value_bvalue}, ${number_time})\n`;
return code;
}
export const actuator_onboard_neopixel_rgb_show_all_rainbow = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = 'onboard_rgb.rainbow_cycle(' + number_time + ')\n';
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
const code = `onboard_rgb.rainbow_cycle(${number_time})\n`;
return code;
}

View File

@@ -1704,8 +1704,7 @@
</shadow>
</value>
</block>
<block type="actuator_onboard_neopixel_write">
</block>
<block type="actuator_onboard_neopixel_write"></block>
<block type="rm_motor" m-show='micropython:esp32:rm_e1'>
<value name="speed">
<shadow type="math_number">
@@ -4482,6 +4481,45 @@
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_chase">
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="RVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="GVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="BVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_rainbow">
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_write">
<value name="SUB">
<shadow type="variables_get">

View File

@@ -3,6 +3,7 @@ import * as MicropythonESP32C2InoutBlocks from './blocks/inout';
import * as MicropythonESP32C2MiniG2Blocks from './blocks/mini_g2';
import * as MicropythonESP32C2MEGOBlocks from './blocks/me_go';
import * as MicropythonESP32C2PinsBlocks from './blocks/pins';
import * as MicropythonESP32C2ActuatorExternGenerators from './generators/actuator_extern';
import * as MicropythonESP32C2InoutGenerators from './generators/inout';
import * as MicropythonESP32C2MiniG2Generators from './generators/mini_g2';
import * as MicropythonESP32C2MEGOGenerators from './generators/me_go';
@@ -14,6 +15,7 @@ export {
MicropythonESP32C2MiniG2Blocks,
MicropythonESP32C2MEGOBlocks,
MicropythonESP32C2PinsBlocks,
MicropythonESP32C2ActuatorExternGenerators,
MicropythonESP32C2InoutGenerators,
MicropythonESP32C2MiniG2Generators,
MicropythonESP32C2MEGOGenerators,

View File

@@ -0,0 +1,17 @@
/**
* @typedef {import('@mixly/micropython').MicroPythonActuatorExternGenerators} MicroPythonActuatorExternGenerators
*/
/**
* @override Override {@link MicroPythonActuatorExternGenerators.actuator_neopixel_init}
*/
export const actuator_neopixel_init = function (_, generator) {
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const dropdown_rgbpin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
const value_ledcount = generator.valueToCode(this, 'LEDCOUNT', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ws2812x_NeoPixel'] = 'from ws2812x import NeoPixel';
const code = `${v} = NeoPixel(machine.Pin(${dropdown_rgbpin}), ${value_ledcount})\n`;
return code;
}

View File

@@ -80,6 +80,7 @@ import {
MicropythonESP32C2MiniG2Blocks,
MicropythonESP32C2MEGOBlocks,
MicropythonESP32C2PinsBlocks,
MicropythonESP32C2ActuatorExternGenerators,
MicropythonESP32C2InoutGenerators,
MicropythonESP32C2MiniG2Generators,
MicropythonESP32C2MEGOGenerators,
@@ -171,6 +172,7 @@ Object.assign(
MicroPythonBlynkGenerators,
MicroPythonCCG1Generators,
MicroPythonCEGOGenerators,
MicropythonESP32C2ActuatorExternGenerators,
MicropythonESP32C2InoutGenerators,
MicropythonESP32C2MiniG2Generators,
MicropythonESP32C2MEGOGenerators,

View File

@@ -4385,6 +4385,45 @@
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_chase">
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="RVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="GVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="BVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_rainbow">
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_write">
<value name="SUB">
<shadow type="variables_get">

View File

@@ -4287,6 +4287,45 @@
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_chase" m-hide='micropython:esp32c3:mixgocar_c3'>
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="RVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="GVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="BVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_rainbow" m-hide='micropython:esp32c3:mixgocar_c3'>
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_write" m-hide='micropython:esp32c3:mixgocar_c3'>
<value name="SUB">
<shadow type="variables_get">

View File

@@ -4018,6 +4018,45 @@
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_chase">
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="RVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="GVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="BVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_rainbow">
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_write">
<value name="SUB">
<shadow type="variables_get">

View File

@@ -4645,6 +4645,45 @@
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_chase">
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="RVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="GVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="BVALUE">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_rgb_show_all_rainbow">
<value name="SUB">
<shadow type="variables_get">
<field name="VAR">rgb</field>
</shadow>
</value>
<value name="time">
<shadow type="math_number">
<field name="NUM">1000</field>
</shadow>
</value>
</block>
<block type="actuator_neopixel_write">
<value name="SUB">
<shadow type="variables_get">

View File

@@ -146,6 +146,11 @@
box-sizing: unset;
}
.classic-theme.thrasos-renderer .blocklyMenu > .blocklyMenuItem {
background-color: #fff;
color: #2f2f2f;
}
.classic-theme.geras-renderer .blocklyMenu > .blocklyMenuItem {
background-color: #fff;
color: #2f2f2f;
@@ -185,6 +190,12 @@
box-sizing: unset;
}
.dark-theme.thrasos-renderer .blocklyMenu > .blocklyMenuItem {
background-color: #252525;
color: #eee;
font-family: "Lato", "Noto Sans SC";
}
.dark-theme.geras-renderer .blocklyMenu > .blocklyMenuItem {
background-color: #252525;
color: #eee;
@@ -233,4 +244,8 @@
.geras-renderer.dark-theme .blocklyText {
color: #000;
}
.thrasos-renderer.dark-theme .blocklyText {
color: #000;
}

View File

@@ -1,7 +1,7 @@
.chrome-tabs {
box-sizing: border-box;
position: relative;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-family: "Lato", "Noto Sans SC";
font-size: 12px;
height: 46px;
padding: 5px 0px 0px 0px;

View File

@@ -193,9 +193,10 @@
}
.tippy-box > .tippy-content > .context-menu-list {
-webkit-box-shadow: unset;
box-shadow: unset;
border-radius: 0.25rem;
position: relative;
-webkit-box-shadow: unset;
box-shadow: unset;
border-radius: 0.25rem;
}
.context-menu-item {

View File

@@ -128,8 +128,8 @@
"provide": ["PouchDB"],
"require": []
}, {
"path": "modules/web-modules/avr-uploader.min.js",
"provide": ["AvrUploader"],
"path": "modules/web-modules/avrbro.min.js",
"provide": ["avrbro"],
"require": []
}, {
"path": "modules/web-modules/microbit/microbit-fs.umd.min.js",
@@ -233,7 +233,7 @@
"require": []
}, {
"path": "modules/web-modules/esptool.min.js",
"provide": ["ESPTool"],
"provide": ["esptooljs"],
"require": []
}, {
"path": "modules/web-modules/adafruit-esptool/index.js",

View File

@@ -6,7 +6,7 @@
window.VIEW = scriptUrl.searchParams.get('view') || 'board';
let config = {};
try {
config = JSON.parse(localStorage.getItem('mixly2.0') ?? '{}');
config = JSON.parse(localStorage.getItem('mixly3.0') ?? '{}');
} catch (error) {
console.log(error);
}

View File

@@ -41,10 +41,11 @@ class ContextMenu {
}
}
#selector_ = null;
#menus_ = new Registry();
#events_ = new Events(['getMenu']);
constructor(selector, config = {}) {
this.selector = selector;
this.#selector_ = selector;
this.menu = $.contextMenu({
selector,
build: ($trigger) => {
@@ -67,20 +68,20 @@ class ContextMenu {
return ContextMenu.generate(menu, $trigger, e);
}
dispose() {
$.contextMenu('destroy', this.selector);
this.#events_.reset();
this.#menus_.reset();
this.menu = null;
this.selector = null;
}
show() {
$(this.selector).contextMenu();
$(this.#selector_).contextMenu();
}
hide() {
$(this.selector).contextMenu('hide');
$(this.#selector_).contextMenu('hide');
}
dispose() {
$.contextMenu('destroy', this.#selector_);
this.#events_.reset();
this.#menus_.reset();
this.menu = null;
this.#selector_ = null;
}
bind(type, func) {

View File

@@ -1,35 +1,66 @@
goog.loadJs('common', () => {
goog.require('tippy');
goog.require('Mixly.IdGenerator');
goog.require('Mixly.ContextMenu');
goog.provide('Mixly.DropdownMenu');
const { ContextMenu } = Mixly;
const {
IdGenerator,
ContextMenu
} = Mixly;
class DropdownMenu extends ContextMenu {
#contextMenu_ = null;
#layer_ = null;
static {
this.$container = $('<div class="mixly-dropdown-menus"></div>');
$(document.body).append(this.$container);
}
#shown_ = false;
constructor(selector) {
#layer_ = null;
#contextMenuId_ = '';
#$contextMenuElem_ = null;
constructor(elem) {
const layer = tippy(elem, {
allowHTML: true,
content: '',
trigger: 'click',
interactive: true,
maxWidth: 'none',
offset: [0, 0],
appendTo: document.body,
arrow: false,
placement: 'bottom-start',
delay: 0,
duration: [0, 0],
onCreate: (instance) => {
$(instance.popper).addClass('mixly-drapdown-menu');
},
onMount: () => {
this.show();
},
onHide: () => {
this.#shown_ && this.hide();
}
});
const contextMenuId = IdGenerator.generate();
const selector = `body > .mixly-dropdown-menus > div[m-id="${contextMenuId}"]`;
super(selector, {
trigger: 'none',
appendTo: $(layer.popper).children().children(),
zIndex: 1001,
position: (opt) => {
opt.$menu.css({
top: 0,
left: 0,
position: 'relative',
margin: 0
});
opt.$menu.css('margin', 0);
},
events: {
show: (opt) => {
opt.$menu.detach();
$('body > .mixly-drapdown-menu > .tippy-box > .tippy-content').empty().append(opt.$menu);
this.#layer_.setProps({});
show: () => {
this.#shown_ = true;
this.#layer_.setProps({});
},
hide: (opt) => {
hide: () => {
this.#shown_ = false;
if (this.#layer_.state.isShown) {
this.#layer_.hide();
@@ -38,33 +69,26 @@ class DropdownMenu extends ContextMenu {
}
});
this.#layer_ = tippy($(selector)[0], {
allowHTML: true,
content: '',
trigger: 'click',
interactive: true,
maxWidth: 'none',
offset: [ 0, 0 ],
appendTo: document.body,
arrow: false,
placement: 'bottom-start',
delay: 0,
duration: [ 0, 0 ],
onCreate: (instance) => {
$(instance.popper).addClass('mixly-drapdown-menu');
},
onMount: (instance) => {
this.show();
},
onHide: () => {
this.#shown_ && this.hide();
}
});
this.#$contextMenuElem_ = $(`<div m-id="${contextMenuId}"><div>`);
DropdownMenu.$container.append(this.#$contextMenuElem_);
this.#contextMenuId_ = contextMenuId;
this.#layer_ = layer;
}
show() {
this.#$contextMenuElem_.contextMenu();
}
hide() {
this.#$contextMenuElem_.contextMenu('hide');
}
dispose() {
super.dispose();
this.#layer_.destroy();
this.#layer_ = null;
this.#$contextMenuElem_.remove();
this.#$contextMenuElem_ = null;
}
}

View File

@@ -60,7 +60,7 @@ class EditorBlockly extends EditorBase {
this.initBlockly = () => {
const DEFAULT_CATEGORIES = HTMLTemplate.get('xml/default-categories.xml').render();
const media = path.join(Env.srcDirPath, 'common/media/blockly');
const renderer = ['geras', 'zelos'].includes(USER.blockRenderer) ? USER.blockRenderer : 'geras';
const renderer = ['geras', 'zelos', 'thrasos'].includes(USER.blockRenderer) ? USER.blockRenderer : 'geras';
this.editor = Blockly.inject(this.$blockly[0], {
media,
toolbox: DEFAULT_CATEGORIES,

View File

@@ -22,7 +22,7 @@ Env.hasSocketServer = false;
Env.hasCompiler = false;
/**
* 获取当前mixly2.0的路径
* 获取当前mixly的路径
* @type {String}
*/
Env.clientPath = null;

View File

@@ -16,7 +16,8 @@ goog.require('Mixly.Debug');
goog.require('Mixly.API2');
goog.require('Mixly.Electron.LibManager');
goog.require('Mixly.Electron.File');
goog.require('Mixly.WebSocket.Socket');
goog.require('Mixly.WebCompiler.Loader');
goog.require('Mixly.WebSocket.Loader');
goog.provide('Mixly.Loader');
const {
@@ -35,16 +36,20 @@ const {
API2,
Electron = {},
Web = {},
WebCompiler = {},
WebSocket = {}
} = Mixly;
const { LibManager, File } = goog.isElectron? Electron : Web;
const { Socket } = WebSocket;
window.addEventListener('load', () => {
if (!goog.isElectron && Env.hasSocketServer) {
Socket.init();
if (!goog.isElectron) {
if (Env.hasSocketServer) {
WebSocket.Loader.init();
} else if (Env.hasCompiler) {
WebCompiler.Loader.init();
}
}
const app = new App($('body')[0]);
Mixly.app = app;

View File

@@ -7,9 +7,9 @@ goog.provide('Mixly.LocalStorage');
const { MArray, LocalStorage } = Mixly;
LocalStorage.PATH = {
USER: 'mixly2.0/user',
BOARD: 'mixly2.0/boards/{{d.boardType}}/user',
THIRD_PARTY: 'mixly2.0/boards/{{d.boardType}}/third_party/{{d.thirdPartyName}}'
USER: 'mixly3.0/user',
BOARD: 'mixly3.0/boards/{{d.boardType}}/user',
THIRD_PARTY: 'mixly3.0/boards/{{d.boardType}}/third_party/{{d.thirdPartyName}}'
};
LocalStorage.set = function (path, value) {

View File

@@ -0,0 +1,91 @@
goog.loadJs('common', () => {
goog.require('io');
goog.require('Mixly');
goog.provide('Mixly.Socket');
class Socket {
#socket_ = null;
constructor(path, option) {
this.#socket_ = io(path, option);
}
#detectStatus_(status, callback) {
window.setTimeout(() => {
if (status.finished) {
return;
}
if (this.isConnected()) {
this.#detectStatus_(status, callback);
} else {
callback({
error: 'socket is not connected'
});
status.finished = true;
}
}, 1000);
}
emit(eventName, ...args) {
const callback = args.pop();
if (this.isConnected()) {
let emitStatus = {
finished: false
};
let status = this.#socket_.emit(eventName, ...args, (...callbackArgs) => {
if (emitStatus.finished) {
return;
}
emitStatus.finished = true;
callback(...callbackArgs);
});
this.#detectStatus_(emitStatus, callback);
return status;
} else {
callback({
error: 'socket is not connected'
});
return false;
}
}
async emitAsync(eventName, ...args) {
return new Promise((resolve, reject) => {
if (this.isConnected()) {
const callback = (...callbackArgs) => {
if (callbackArgs[0].error) {
reject(callbackArgs[0].error);
return;
}
resolve(...callbackArgs);
}
let emitStatus = {
finished: false
};
let status = this.#socket_.emit(eventName, ...args, (...callbackArgs) => {
if (emitStatus.finished) {
return;
}
emitStatus.finished = true;
callback(...callbackArgs);
});
this.#detectStatus_(emitStatus, callback);
} else {
reject('socket is not connected');
}
})
}
getSocket() {
return this.#socket_;
}
isConnected() {
return this.#socket_?.connected;
}
}
Mixly.Socket = Socket;
});

View File

@@ -86,6 +86,7 @@ class StatusBarsManager extends PagesManager {
#shown_ = false;
#dropdownMenu_ = null;
#$dropdownBtn_ = null;
constructor(element) {
const managerHTMLTemplate = HTMLTemplate.get('html/statusbar/statusbars-manager.html');
@@ -103,6 +104,7 @@ class StatusBarsManager extends PagesManager {
this.tabId = tabHTMLTemplate.id;
this.id = IdGenerator.generate();
this.addEventsType(['show', 'hide', 'onSelectMenu', 'getMenu']);
this.#$dropdownBtn_ = $tab.find('.statusbar-dropdown-menu > button');
$tab.find('.statusbar-close > button').click(() => this.hide());
this.#addDropdownMenu_();
this.#addEventsListener_();
@@ -146,7 +148,6 @@ class StatusBarsManager extends PagesManager {
}
#addDropdownMenu_() {
const selector = `div[m-id="${this.tabId}"] > .statusbar-dropdown-menu > .layui-btn`;
let menu = new Menu();
let serialChildMenu = new Menu(true);
menu.add({
@@ -240,7 +241,7 @@ class StatusBarsManager extends PagesManager {
}
return result;
});
this.#dropdownMenu_ = new DropdownMenu(selector);
this.#dropdownMenu_ = new DropdownMenu(this.#$dropdownBtn_[0]);
this.#dropdownMenu_.register('menu', menu);
this.#dropdownMenu_.bind('getMenu', () => 'menu');
}
@@ -278,6 +279,9 @@ class StatusBarsManager extends PagesManager {
dispose() {
StatusBarsManager.remove(this);
this.#dropdownMenu_.dispose();
this.#$dropdownBtn_.remove();
this.#$dropdownBtn_ = null;
super.dispose();
}
}

View File

@@ -49,6 +49,7 @@
"Mixly.Web.FS",
"Mixly.Web.File",
"Mixly.Web.Serial",
"Mixly.WebCompiler.ArduShell",
"Mixly.WebSocket.File",
"Mixly.WebSocket.Serial",
"Mixly.WebSocket.ArduShell",
@@ -190,6 +191,7 @@
"path": "/common/dropdown-menu.js",
"require": [
"tippy",
"Mixly.IdGenerator",
"Mixly.ContextMenu"
],
"provide": [
@@ -652,7 +654,8 @@
"Mixly.API2",
"Mixly.Electron.LibManager",
"Mixly.Electron.File",
"Mixly.WebSocket.Socket"
"Mixly.WebCompiler.Loader",
"Mixly.WebSocket.Loader"
],
"provide": [
"Mixly.Loader"
@@ -918,6 +921,16 @@
"Mixly.RightSideBarsManager"
]
},
{
"path": "/common/socket.js",
"require": [
"io",
"Mixly"
],
"provide": [
"Mixly.Socket"
]
},
{
"path": "/common/statusbar-ampy.js",
"require": [
@@ -1428,6 +1441,7 @@
{
"path": "/electron/loader.js",
"require": [
"path",
"Mixly.Url",
"Mixly.Config",
"Mixly.Env",
@@ -1552,10 +1566,9 @@
"FSWrapper",
"DAPWrapper",
"PartialFlashing",
"ESPTool",
"esptooljs",
"AdafruitESPTool",
"CryptoJS",
"AvrUploader",
"Mixly.Env",
"Mixly.LayerExt",
"Mixly.Config",
@@ -1712,19 +1725,38 @@
]
},
{
"path": "/web-compiler/compiler.js",
"path": "/web-compiler/arduino-shell.js",
"require": [
"Mixly.Url",
"Mixly.Config",
"Mixly.LayerExt",
"layui",
"avrbro",
"esptooljs",
"AdafruitESPTool",
"CryptoJS",
"dayjs.duration",
"Mixly.Boards",
"Mixly.MFile",
"Mixly.Debug",
"Mixly.LayerExt",
"Mixly.Msg",
"Mixly.Web.BU",
"Mixly.Web.Serial"
"Mixly.Workspace",
"Mixly.LayerProgress",
"Mixly.Web.Serial",
"Mixly.WebCompiler"
],
"provide": [
"Mixly.WebCompiler.Compiler"
"Mixly.WebCompiler.ArduShell"
]
},
{
"path": "/web-compiler/loader.js",
"require": [
"Mixly.Debug",
"Mixly.Config",
"Mixly.StatusBarsManager",
"Mixly.Socket",
"Mixly.WebCompiler.ArduShell"
],
"provide": [
"Mixly.WebCompiler.Loader"
]
},
{
@@ -1810,6 +1842,22 @@
"Mixly.WebSocket.File"
]
},
{
"path": "/web-socket/loader.js",
"require": [
"Mixly.Debug",
"Mixly.Config",
"Mixly.StatusBarsManager",
"Mixly.Socket",
"Mixly.WebSocket.Serial",
"Mixly.WebSocket.ArduShell",
"Mixly.WebSocket.BU",
"Mixly.WebSocket.Ampy"
],
"provide": [
"Mixly.WebSocket.Loader"
]
},
{
"path": "/web-socket/serial.js",
"require": [
@@ -1824,25 +1872,9 @@
"Mixly.WebSocket.Serial"
]
},
{
"path": "/web-socket/socket.js",
"require": [
"Mixly.Debug",
"Mixly.StatusBarsManager",
"Mixly.WebSocket",
"Mixly.WebSocket.Serial",
"Mixly.WebSocket.ArduShell",
"Mixly.WebSocket.BU",
"Mixly.WebSocket.Ampy"
],
"provide": [
"Mixly.WebSocket.Socket"
]
},
{
"path": "/web-socket/web-socket.js",
"require": [
"io",
"Mixly"
],
"provide": [

View File

@@ -1,5 +1,6 @@
goog.loadJs('electron', () => {
goog.require('path');
goog.require('Mixly.Url');
goog.require('Mixly.Config');
goog.require('Mixly.Env');
@@ -32,7 +33,7 @@ Loader.onbeforeunload = function(reload = false) {
window.location.reload(true);
}
}
let href = Env.srcDirPath + '/index.html?' + Url.jsonToUrl({ boardType: BOARD.boardType ?? 'None' });
let href = path.join(Env.srcDirPath, 'index.html') + '?' + Url.jsonToUrl({ boardType: BOARD.boardType ?? 'None' });
let endPromise = [];
const { mainStatusBarTabs } = Mixly;
Serial.getCurrentPortsName().map((name) => {

View File

@@ -0,0 +1,399 @@
goog.loadJs('web', () => {
goog.require('layui');
goog.require('avrbro');
goog.require('esptooljs');
goog.require('AdafruitESPTool');
goog.require('CryptoJS');
goog.require('dayjs.duration');
goog.require('Mixly.Boards');
goog.require('Mixly.Debug');
goog.require('Mixly.LayerExt');
goog.require('Mixly.Msg');
goog.require('Mixly.Workspace');
goog.require('Mixly.LayerProgress');
goog.require('Mixly.Web.Serial');
goog.require('Mixly.WebCompiler');
goog.provide('Mixly.WebCompiler.ArduShell');
const {
Boards,
Debug,
LayerExt,
Msg,
Workspace,
LayerProgress,
Web,
WebCompiler
} = Mixly;
const { Serial } = Web;
const { layer } = layui;
const { ESPLoader, Transport } = esptooljs;
function hexToBinaryString (hex) {
let binaryString = '';
for (let i = 0; i < hex.length; i += 2) {
const byte = parseInt(hex.substr(i, 2), 16);
binaryString += String.fromCharCode(byte);
}
return binaryString;
}
class WebCompilerArduShell {
static {
this.mixlySocket = null;
this.socket = null;
this.shell = null;
this.getSocket = function () {
return this.socket;
}
this.getMixlySocket = function () {
return this.mixlySocket;
}
this.init = function (mixlySocket) {
this.mixlySocket = mixlySocket;
this.socket = mixlySocket.getSocket();
this.shell = new WebCompilerArduShell();
const socket = this.socket;
socket.on('arduino.dataEvent', (data) => {
if (data.length > 1000) {
return;
}
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
statusBarTerminal.addValue(data);
});
socket.on('arduino.errorEvent', (data) => {
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
try {
data = unescape(data.replace(/(_E[0-9A-F]{1}_[0-9A-F]{2}_[0-9A-F]{2})+/gm, '%$1'));
data = unescape(data.replace(/\\(u[0-9a-fA-F]{4})/gm, '%$1'));
} catch (error) {
Debug.error(error);
}
statusBarTerminal.addValue(data);
});
}
this.initCompile = function () {
if (!this.mixlySocket.isConnected()) {
layer.msg(Msg.Lang['websocket.offline'], { time: 1000 });
return;
}
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
mainStatusBarTabs.changeTo('output');
mainStatusBarTabs.show();
const mainWorkspace = Workspace.getMain();
const editor = mainWorkspace.getEditorsManager().getActive();
const code = editor.getCode();
statusBarTerminal.setValue(`${Msg.Lang['shell.compiling']}...\n`);
this.shell.compile(code)
.then((info) => {
this.endCallback(info.code, info.time);
})
.catch((error) => {
Debug.error(error);
statusBarTerminal.addValue(`\n==${Msg.Lang['shell.compileFailed']}==\n`);
});
}
this.initUpload = function () {
if (!this.mixlySocket.isConnected()) {
layer.msg(Msg.Lang['websocket.offline'], { time: 1000 });
return;
}
const port = Serial.getSelectedPortName();
if (!port) {
layer.msg(Msg.Lang['statusbar.serial.noDevice'], {
time: 1000
});
return;
}
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
mainStatusBarTabs.changeTo('output');
mainStatusBarTabs.show();
statusBarTerminal.setValue(`${Msg.Lang['shell.uploading']}...\n`);
const mainWorkspace = Workspace.getMain();
const editor = mainWorkspace.getEditorsManager().getActive();
const code = editor.getCode();
const statusBarSerial = mainStatusBarTabs.getStatusBarById(port);
const closePromise = statusBarSerial ? statusBarSerial.close() : Promise.resolve();
closePromise
.then(() => {
return this.shell.upload(port, code)
})
.then((info) => {
this.endCallback(info.code, info.time);
if (info.code || !Serial.portIsLegal(port)) {
return;
}
mainStatusBarTabs.add('serial', port);
mainStatusBarTabs.changeTo(port);
const statusBarSerial = mainStatusBarTabs.getStatusBarById(port);
statusBarSerial.open()
.then(() => {
const baudRates = code.match(/(?<=Serial.begin[\s]*\([\s]*)[0-9]*(?=[\s]*\))/g);
if (!baudRates?.length) {
return statusBarSerial.setBaudRate(9600);
} else {
return statusBarSerial.setBaudRate(baudRates[0] - 0);
}
})
.catch(Debug.error);
})
.catch((error) => {
Debug.error(error);
statusBarTerminal.addValue(`\n==${Msg.Lang['shell.uploadFailed']}==\n`);
});
}
this.endCallback = function (code, time) {
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
mainStatusBarTabs.changeTo('output');
let message = '';
if (code) {
message = (this.shell.isCompiling() ? Msg.Lang['shell.compileFailed'] : Msg.Lang['shell.uploadFailed']);
statusBarTerminal.addValue(`\n==${message}==\n`);
} else {
message = (this.shell.isCompiling() ? Msg.Lang['shell.compileSucc'] : Msg.Lang['shell.uploadSucc']);
statusBarTerminal.addValue(`\n==${message}(${Msg.Lang['shell.timeCost']} ${
dayjs.duration(time).format('HH:mm:ss.SSS')
})==\n`);
}
layer.msg(message, { time: 1000 });
}
}
#running_ = false;
#upload_ = false;
#killing_ = false;
#layer_ = null;
constructor() {
this.#layer_ = new LayerProgress({
width: 200,
cancelValue: Msg.Lang['nav.btn.stop'],
skin: 'layui-anim layui-anim-scale',
cancel: () => {
if (this.#killing_) {
return false;
}
this.#layer_.title(`${Msg.Lang['shell.aborting']}...`);
this.#killing_ = true;
this.kill().catch(Debug.error);
return false;
},
cancelDisplay: false
});
}
async compile(code) {
return new Promise(async (resolve, reject) => {
this.#running_ = true;
this.#upload_ = false;
this.#killing_ = false;
this.showProgress();
const key = Boards.getSelectedBoardCommandParam();
const config = { key, code };
const mixlySocket = WebCompilerArduShell.getMixlySocket();
mixlySocket.emit('arduino.compile', config, (response) => {
this.hideProgress();
if (response.error) {
reject(response.error);
return;
}
const [error, result] = response;
if (error) {
reject(error);
} else {
resolve(result);
}
});
});
}
async upload(port, code) {
return new Promise(async (resolve, reject) => {
this.#running_ = true;
this.#upload_ = true;
this.#killing_ = false;
this.showProgress();
const key = Boards.getSelectedBoardCommandParam();
const config = { key, code };
const mixlySocket = WebCompilerArduShell.getMixlySocket();
mixlySocket.emit('arduino.upload', config, async (response) => {
if (response.error) {
this.hideProgress();
reject(response.error);
return;
}
const [error, result] = response;
if (error) {
this.hideProgress();
reject(error);
return;
}
if (result.code !== 0) {
this.hideProgress();
resolve(result);
return;
}
const { files } = result;
try {
const keys = Boards.getSelectedBoardKey().split(':');
if (`${keys[0]}:${keys[1]}` === 'arduino:avr') {
await this.uploadWithAvrbro(port, files);
} else {
await this.uploadWithEsptool(port, files);
}
} catch (error) {
this.hideProgress();
reject(error);
return;
}
this.hideProgress();
result.files = null;
resolve(result);
});
});
}
async uploadWithEsptool(port, files) {
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
let esploader = null;
let transport = null;
let baudrate = 115200;
let eraseAll = true;
try {
const keys = Boards.getSelectedBoardKey().split(':');
if (`${keys[0]}:${keys[1]}` === 'esp32:esp32') {
baudrate = Boards.getSelectedBoardConfigParam('UploadSpeed');
eraseAll = Boards.getSelectedBoardConfigParam('EraseFlash') === 'all';
} else {
baudrate = Boards.getSelectedBoardConfigParam('baud');
eraseAll = Boards.getSelectedBoardConfigParam('wipe') === 'all';
}
transport = new Transport(Serial.getPort(port), false);
esploader = new ESPLoader({
transport,
baudrate,
terminal: {
clean() {},
writeLine(data) {
statusBarTerminal.addValue(data + '\n');
},
write(data) {
statusBarTerminal.addValue(data);
}
}
});
let chip = await esploader.main();
} catch (error) {
await transport.disconnect();
throw new Error(error);
}
let data = [];
statusBarTerminal.addValue("\n");
for (let file of files) {
if (file.data && file.offset) {
data.push({
address: parseInt(file.offset, 16),
data: hexToBinaryString(file.data)
});
}
}
const flashOptions = {
fileArray: data,
flashSize: 'keep',
eraseAll,
compress: true,
calculateMD5Hash: (image) => CryptoJS.MD5(CryptoJS.enc.Latin1.parse(image))
};
try {
await esploader.writeFlash(flashOptions);
await transport.setDTR(false);
await new Promise((resolve) => setTimeout(resolve, 100));
await transport.setDTR(true);
await transport.disconnect();
} catch (error) {
await transport.disconnect();
throw new Error(error);
}
}
async uploadWithAvrbro(port, files) {
const key = Boards.getSelectedBoardKey();
const boardId = key.split(':')[2];
let boardName = '';
if (boardId === 'uno') {
boardName = 'uno';
} else if (boardId === 'nano') {
const cpu = Boards.getSelectedBoardConfigParam('cpu');
if (cpu === 'atmega328old') {
boardName = 'nano';
} else {
boardName = 'nano (new bootloader)';
}
} else if (boardId === 'pro') {
boardName = 'pro-mini';
} else if (boardId === 'mega') {
boardName = 'mega';
} else if (boardId === 'leonardo') {
boardName = 'leonardo';
}
const buffer = avrbro.parseHex(files[0].data);
await avrbro.flash(Serial.getPort(port), buffer, { boardName });
}
async kill() {
return new Promise(async (resolve, reject) => {
const mixlySocket = WebCompilerArduShell.getMixlySocket();
mixlySocket.emit('arduino.kill', (response) => {
if (response.error) {
reject(response.error);
return;
}
const [error, result] = response;
if (error) {
reject(error);
} else {
resolve(result);
}
});
});
}
showProgress() {
const message = this.isCompiling() ? Msg.Lang['shell.compiling'] : Msg.Lang['shell.uploading'];
this.#layer_.title(`${message}...`);
this.#layer_.show();
}
hideProgress() {
this.#layer_.hide();
}
isUploading() {
return this.#running_ && this.#upload_;
}
isCompiling() {
return this.#running_ && !this.#upload_;
}
}
WebCompiler.ArduShell = WebCompilerArduShell;
});

View File

@@ -1,184 +0,0 @@
goog.loadJs('web', () => {
goog.require('Mixly.Url');
goog.require('Mixly.Config');
goog.require('Mixly.LayerExt');
goog.require('Mixly.Boards');
goog.require('Mixly.MFile');
goog.require('Mixly.Msg');
goog.require('Mixly.Web.BU');
goog.require('Mixly.Web.Serial');
goog.provide('Mixly.WebCompiler.Compiler');
const {
WebCompiler,
Url,
Boards,
MFile,
Config,
LayerExt,
Msg,
Web
} = Mixly;
const { SOFTWARE, BOARD } = Config;
const { Compiler } = WebCompiler;
const { BU, Serial } = Web;
const DEFAULT_CONFIG = {
"enabled": true,
"protocol": "http:",
"ip": "localhost",
"domain": null
};
Compiler.CONFIG = { ...DEFAULT_CONFIG, ...(SOFTWARE?.webCompiler ?? {}) };
const { CONFIG } = Compiler;
let { hostname, protocol, port } = window.location;
if (port) {
port = ':' + port;
}
Compiler.protocol = protocol;
Compiler.URL = Compiler.protocol + '//' + hostname + port + '/compile';
Compiler.compile = () => {
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
mainStatusBarTabs.show();
statusBarTerminal.setValue('');
Compiler.generateCommand('compile', (error, obj, layerNum) => {
layer.close(layerNum);
let message = Msg.Lang['shell.compileSucc'];
if (error) {
message = Msg.Lang['shell.compileFailed'];
}
layer.msg(message, { time: 1000 });
statusBarTerminal.addValue("==" + message + "(" + Msg.Lang['shell.timeCost'] + " " + obj.timeCost + ")==\n");
});
}
Compiler.upload = async () => {
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
mainStatusBarTabs.show();
statusBarTerminal.setValue('');
BU.burning = false;
BU.uploading = true;
const board = Boards.getSelectedBoardCommandParam();
const boardParam = board.split(':');
const portName = 'web-serial';
if (boardParam[1] === 'avr') {
let boardUpload;
switch (boardParam[2]) {
case 'uno':
boardUpload = 'uno';
break;
case 'nano':
if (boardParam.length > 3 && boardParam[3] === 'cpu=atmega328old') {
boardUpload = 'nanoOldBootloader';
} else {
boardUpload = 'nano';
}
break;
case 'pro':
boardUpload = 'proMini';
break;
}
Serial.portClose(portName, async () => {
mainStatusBarTabs.changeTo('output');
try {
await AvrUploader.connect(boardUpload, {});
Compiler.generateCommand('upload', BU.uploadWithAvrUploader);
} catch (error) {
statusBarTerminal.addValue(error.toString() + '\n');
}
});
} else {
Serial.connect(portName, 115200, async (port) => {
if (!port) {
layer.msg(Msg.Lang['已取消连接'], { time: 1000 });
return;
}
mainStatusBarTabs.changeTo('output');
Compiler.generateCommand('upload', BU.uploadWithEsptool);
});
}
}
Compiler.generateCommand = (operate, endFunc = (errorMessage, data, layerNum) => {}) => {
const code = MFile.getCode();
let type;
const boardType = Boards.getSelectedBoardCommandParam();
let command = {
board: encodeURIComponent(boardType),
code: encodeURIComponent(code),
visitorId: BOARD.visitorId.str32CRC32b,
operate
};
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
let commandStr = Compiler.URL + '?' + Url.jsonToUrl(command);
statusBarTerminal.setValue(Msg.Lang['shell.compiling'] + '...\n');
console.log('send -> ', commandStr);
const compileLayer = layer.open({
type: 1,
title: Msg.Lang['shell.compiling'] + "...",
content: $('#mixly-loader-div'),
shade: LayerExt.SHADE_NAV,
closeBtn: 0,
success: function () {
$(".layui-layer-page").css("z-index", "198910151");
$("#mixly-loader-btn").off("click").click(() => {
layer.close(compileLayer);
});
},
end: function () {
$('#mixly-loader-div').css('display', 'none');
$(".layui-layer-shade").remove();
}
});
Compiler.sendCommand(compileLayer, commandStr, endFunc);
}
Compiler.sendCommand = (layerType, command, endFunc = (errorMessage, data, layerNum) => {}) => {
/*
fetch(command).then(function(response) {
console.log(response);
if(response.ok) {
return response.blob();
}
throw new Error('Network response was not ok.');
}).then(function(myBlob) {
var objectURL = URL.createObjectURL(myBlob);
console.log(objectURL);
}).catch(function(error) {
console.log('There has been a problem with your fetch operation: ', error.message);
});
*/
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
let req = new Request(command);
fetch(req, {
credentials: 'omit', // 设置不传递cookie
mode: 'cors', // 设置请求不允许跨域
}).then(res => {
return res.text();
}).then((data) => {
const dataObj = JSON.parse(data);
console.log(dataObj);
if (dataObj.error) {
statusBarTerminal.addValue(decodeURIComponent(dataObj.error));
endFunc(true, null, layerType);
} else {
statusBarTerminal.addValue(decodeURIComponent(dataObj.compileMessage));
endFunc(false, {
data: dataObj.data,
timeCost: decodeURIComponent(dataObj.timeCost)
}, layerType);
}
})
.catch((error) => {
endFunc(true, error.toString(), layerType);
});
}
});

View File

@@ -0,0 +1,53 @@
goog.loadJs('web', () => {
goog.require('Mixly.Debug');
goog.require('Mixly.Config');
goog.require('Mixly.StatusBarsManager');
goog.require('Mixly.Socket');
goog.require('Mixly.WebCompiler.ArduShell');
goog.provide('Mixly.WebCompiler.Loader');
const {
Debug,
Config,
StatusBarsManager,
Socket,
WebCompiler
} = Mixly;
const {
Loader,
ArduShell
} = WebCompiler;
const { SOFTWARE } = Config;
Loader.init = function () {
let url = '';
if (SOFTWARE.webCompiler?.url) {
const info = new window.URL(SOFTWARE.webCompiler.url);
if (info.hostname === 'default') {
info.hostname = window.location.hostname;
url = info.origin;
} else {
url = SOFTWARE.webCompiler.url;
}
} else {
url = `wss://${window.location.host}`;
}
const mixlySocket = new Socket(`${url}/compile`, {
path: '/mixly-socket/',
reconnection: true,
reconnectionDelayMax: 10000,
transports: ['websocket'],
protocols: ['my-protocol-v1']
});
const socket = mixlySocket.getSocket();
socket.on('connect', () => {});
socket.on('disconnect', () => {});
ArduShell.init(mixlySocket);
}
});

View File

@@ -128,7 +128,7 @@ class WebSocketArduShell {
statusBarSerial.open()
.then(() => {
const baudRates = code.match(/(?<=Serial.begin[\s]*\([\s]*)[0-9]*(?=[\s]*\))/g);
if (!baudRates.length) {
if (!baudRates?.length) {
return statusBarSerial.setBaudRate(9600);
} else {
return statusBarSerial.setBaudRate(baudRates[0] - 0);

View File

@@ -1,31 +1,48 @@
goog.loadJs('web', () => {
goog.require('Mixly.Debug');
goog.require('Mixly.Config');
goog.require('Mixly.StatusBarsManager');
goog.require('Mixly.WebSocket');
goog.require('Mixly.Socket');
goog.require('Mixly.WebSocket.Serial');
goog.require('Mixly.WebSocket.ArduShell');
goog.require('Mixly.WebSocket.BU');
goog.require('Mixly.WebSocket.Ampy');
goog.provide('Mixly.WebSocket.Socket');
goog.provide('Mixly.WebSocket.Loader');
const {
Debug,
Config,
StatusBarsManager,
Socket,
WebSocket
} = Mixly;
const {
Socket,
Loader,
Serial,
ArduShell,
BU,
Ampy
} = WebSocket;
const { SOFTWARE } = Config;
Socket.init = function () {
const mixlySocket = new WebSocket('wss://127.0.0.1:4000', {
Loader.init = function () {
let url = '';
if (SOFTWARE.webSocket?.url) {
const info = new window.URL(SOFTWARE.webSocket.url);
if (info.hostname === 'default') {
info.hostname = window.location.hostname;
url = info.origin;
} else {
url = SOFTWARE.webSocket.url;
}
} else {
url = `wss://${window.location.host}`;
}
const mixlySocket = new Socket(`${url}/all`, {
path: '/mixly-socket/',
reconnection: true,
reconnectionDelayMax: 10000,

View File

@@ -1,91 +1,6 @@
goog.loadJs('web', () => {
goog.require('io');
goog.require('Mixly');
goog.provide('Mixly.WebSocket');
class WebSocket {
#socket_ = null;
constructor(path, option) {
this.#socket_ = io(path, option);
}
#detectStatus_(status, callback) {
window.setTimeout(() => {
if (status.finished) {
return;
}
if (this.isConnected()) {
this.#detectStatus_(status, callback);
} else {
callback({
error: 'socket is not connected'
});
status.finished = true;
}
}, 1000);
}
emit(eventName, ...args) {
const callback = args.pop();
if (this.isConnected()) {
let emitStatus = {
finished: false
};
let status = this.#socket_.emit(eventName, ...args, (...callbackArgs) => {
if (emitStatus.finished) {
return;
}
emitStatus.finished = true;
callback(...callbackArgs);
});
this.#detectStatus_(emitStatus, callback);
return status;
} else {
callback({
error: 'socket is not connected'
});
return false;
}
}
async emitAsync(eventName, ...args) {
return new Promise((resolve, reject) => {
if (this.isConnected()) {
const callback = (...callbackArgs) => {
if (callbackArgs[0].error) {
reject(callbackArgs[0].error);
return;
}
resolve(...callbackArgs);
}
let emitStatus = {
finished: false
};
let status = this.#socket_.emit(eventName, ...args, (...callbackArgs) => {
if (emitStatus.finished) {
return;
}
emitStatus.finished = true;
callback(...callbackArgs);
});
this.#detectStatus_(emitStatus, callback);
} else {
reject('socket is not connected');
}
})
}
getSocket() {
return this.#socket_;
}
isConnected() {
return this.#socket_?.connected;
}
}
Mixly.WebSocket = WebSocket;
});

View File

@@ -166,11 +166,13 @@ class AmpyExt extends Ampy {
if (data.length < 1) {
throw new Error(Msg.Lang['ampy.waitingFirstEOFTimeout']);
}
let start = data.toLowerCase().indexOf('>ok');
if (start === -1){
let start = data.toLowerCase().lastIndexOf('ok');
if (start === -1) {
start = 0;
} else {
start += 2;
}
data = data.substring(start + 3, data.length - 1);
data = data.substring(start, data.length - 1);
let dataError = await this.readUntil('\x04', true, timeout);
if (dataError.length < 1) {
throw new Error(Msg.Lang['ampy.secondEOFTimeout']);

View File

@@ -5,10 +5,9 @@ goog.require('BoardId');
goog.require('FSWrapper');
goog.require('DAPWrapper');
goog.require('PartialFlashing');
goog.require('ESPTool');
goog.require('esptooljs');
goog.require('AdafruitESPTool');
goog.require('CryptoJS');
goog.require('AvrUploader');
goog.require('Mixly.Env');
goog.require('Mixly.LayerExt');
goog.require('Mixly.Config');
@@ -52,7 +51,7 @@ const { BOARD, SELECTED_BOARD } = Config;
const {
ESPLoader,
Transport
} = ESPTool;
} = esptooljs;
BU.uploading = false;
BU.burning = false;
@@ -333,6 +332,9 @@ BU.burnWithEsptool = async (binFile, erase) => {
};
try {
await esploader.writeFlash(flashOptions);
await transport.setDTR(false);
await new Promise((resolve) => setTimeout(resolve, 100));
await transport.setDTR(true);
BU.progressLayer.hide();
layer.msg(Msg.Lang['shell.burnSucc'], { time: 1000 });
statusBarTerminal.addValue(`==${Msg.Lang['shell.burnSucc']}==\n`);
@@ -660,6 +662,9 @@ BU.uploadWithAmpy = async (portName) => {
for (let item of rootInfo) {
rootMap[item[0]] = item[1];
}
if (cwd === '/') {
cwd = '';
}
if (libraries && libraries instanceof Object) {
for (let key in libraries) {
if (rootMap[`${cwd}/${key}`] !== undefined && rootMap[`${cwd}/${key}`] === libraries[key].size) {
@@ -692,110 +697,6 @@ BU.uploadWithAmpy = async (portName) => {
}
}
function hexToBuf (hex) {
var typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16)
}));
return typedArray.buffer;
}
BU.uploadWithEsptool = async (endType, obj, layerType) => {
const portName = 'web-serial';
const portObj = Serial.portsOperator[portName];
const { serialport, toolConfig } = portObj;
let prevBaud = toolConfig.baudRates;
if (prevBaud !== 115200) {
toolConfig.baudRates = 115200;
await serialport.setBaudRate(toolConfig.baudRates);
}
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
let firmwareData = obj.data;
if (endType || typeof firmwareData !== 'object') {
statusBarTerminal.addValue(Msg.Lang['shell.bin.readFailed'] + "\n");
layer.close(layerType);
return;
}
layer.title(Msg.Lang['shell.uploading'] + '...', layerType);
statusBarTerminal.addValue(Msg.Lang['shell.bin.reading'] + "... ");
let firmwareList = [];
for (let i of firmwareData) {
if (!i.offset || !i.data) {
continue;
}
const firmware = {
offset: i.offset,
binBuf: hexToBuf(i.data)
};
firmwareList.push(firmware);
}
statusBarTerminal.addValue("Done!\n");
BU.burning = true;
BU.uploading = false;
statusBarTerminal.addValue(Msg.Lang['shell.uploading'] + '...\n');
mainStatusBarTabs.show();
mainStatusBarTabs.changeTo('output');
try {
SerialPort.refreshOutputBuffer = false;
SerialPort.refreshInputBuffer = true;
await espTool.reset();
if (await clickSync()) {
// await clickErase();
for (let i of firmwareList) {
await clickProgram(i.offset, i.binBuf);
}
}
layer.close(layerType);
layer.msg(Msg.Lang['shell.uploadSucc'], { time: 1000 });
statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadSucc']}==\n`);
Serial.reset(portName, 'upload');
mainStatusBarTabs.changeTo(portName);
} catch (error) {
Debug.error(error);
layer.close(layerType);
statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadFailed']}==\n`);
} finally {
SerialPort.refreshOutputBuffer = true;
SerialPort.refreshInputBuffer = false;
const code = MFile.getCode();
const baudRateList = code.match(/(?<=Serial.begin[\s]*\([\s]*)[0-9]*(?=[\s]*\))/g);
if (baudRateList && Serial.BAUDRATES.includes(baudRateList[0]-0)) {
prevBaud = baudRateList[0]-0;
}
if (toolConfig.baudRates !== prevBaud) {
toolConfig.baudRates = prevBaud;
await serialport.setBaudRate(prevBaud);
}
}
}
BU.uploadWithAvrUploader = async (endType, obj, layerType) => {
let firmwareData = obj.data;
const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
if (endType || typeof firmwareData !== 'object') {
statusBarTerminal.addValue(Msg.Lang['shell.bin.readFailed'] + "\n");
layer.close(layerType);
return;
}
statusBarTerminal.addValue(Msg.Lang['shell.uploading'] + '...\n');
layer.title(Msg.Lang['shell.uploading'] + '...', layerType);
let uploadSucMessageShow = true;
AvrUploader.upload(firmwareData[0].data, (progress) => {
if (progress >= 100 && uploadSucMessageShow) {
statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadSucc']}==\n`);
layer.msg(Msg.Lang['shell.uploadSucc'], { time: 1000 });
layer.close(layerType);
uploadSucMessageShow = false;
}
}, true)
.catch((error) => {
layer.close(layerType);
statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadFailed']}==\n`);
});
}
/**
* @function 特殊固件的烧录
* @return {void}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -3640,9 +3640,9 @@ En.MIXLY_SPECIAL_KEY = "special key";
En.MIXLY_GENERAL_KEY = "general key";
En.MIXLY_RELEASE = "automatic release";
En.MIXLY_SPECIAL_KEY0 = "no operation";
En.MIXLY_SPECIAL_KEY1 = "Left Control key";
En.MIXLY_SPECIAL_KEY1 = "Left Alt key";
En.MIXLY_SPECIAL_KEY2 = "Left Shift key";
En.MIXLY_SPECIAL_KEY4 = "Left Alt key";
En.MIXLY_SPECIAL_KEY4 = "Left Control key";
En.MIXLY_SPECIAL_KEY8 = "Left Windows key";
En.MIXLY_SPECIAL_KEY16 = "Right Control key";
En.MIXLY_SPECIAL_KEY32 = "Right Shift key";

View File

@@ -3789,9 +3789,9 @@ ZhHans.MIXLY_SPECIAL_KEY = "特殊按键";
ZhHans.MIXLY_GENERAL_KEY = "普通按键";
ZhHans.MIXLY_RELEASE = "自动释放";
ZhHans.MIXLY_SPECIAL_KEY0 = "无操作";
ZhHans.MIXLY_SPECIAL_KEY1 = "左Control键";
ZhHans.MIXLY_SPECIAL_KEY1 = "左Alt键";
ZhHans.MIXLY_SPECIAL_KEY2 = "左Shift键";
ZhHans.MIXLY_SPECIAL_KEY4 = "左Alt键";
ZhHans.MIXLY_SPECIAL_KEY4 = "左Control键";
ZhHans.MIXLY_SPECIAL_KEY8 = "左Windows键";
ZhHans.MIXLY_SPECIAL_KEY16 = "右Control键";
ZhHans.MIXLY_SPECIAL_KEY32 = "右Shift键";

View File

@@ -3789,9 +3789,9 @@ ZhHant.MIXLY_SPECIAL_KEY = "特殊按鍵";
ZhHant.MIXLY_GENERAL_KEY = "普通按鍵";
ZhHant.MIXLY_RELEASE = "自動釋放";
ZhHant.MIXLY_SPECIAL_KEY0 = "無操作";
ZhHant.MIXLY_SPECIAL_KEY1 = "左Control鍵";
ZhHant.MIXLY_SPECIAL_KEY1 = "左Alt鍵";
ZhHant.MIXLY_SPECIAL_KEY2 = "左Shift鍵";
ZhHant.MIXLY_SPECIAL_KEY4 = "左Alt鍵";
ZhHant.MIXLY_SPECIAL_KEY4 = "左Control鍵";
ZhHant.MIXLY_SPECIAL_KEY8 = "左Windows鍵";
ZhHant.MIXLY_SPECIAL_KEY16 = "右Control鍵";
ZhHant.MIXLY_SPECIAL_KEY32 = "右Shift鍵";

View File

@@ -1,7 +1,7 @@
<div class="menu-line">
<label>{{d.name}}</label>
<div class="sep"></div>
{{# if (d.hotKey) { }}
<div class="sep"></div>
<label>{{d.hotKey}}</label>
{{# } }}
</div>

View File

@@ -12,10 +12,12 @@
}
html[data-bs-theme=light] ul[m-id="{{d.mId}}"] {
background-color: var(--app-light-color) !important;
border-bottom: 1px solid #c9c9c9;
}
html[data-bs-theme=dark] ul[m-id="{{d.mId}}"] {
background-color: #3c3c3c !important;
border-bottom: 1px solid rgba(128, 128, 128, 0.35);
}
@@ -27,9 +29,6 @@
flex-direction: row;
align-items: center;
justify-content: center;
}
ul[m-id="{{d.mId}}"] button {
border-color: transparent;
color: #fff !important;
}
@@ -48,13 +47,11 @@
html[data-bs-theme=light] ul[m-id="{{d.mId}}"] button:hover {
box-shadow: 2px 0px 5px #7b7171;
/*box-shadow: none;*/
border-color: #19897f;
}
html[data-bs-theme=dark] ul[m-id="{{d.mId}}"] button:hover {
box-shadow: 2px 0px 5px #303030;
/*box-shadow: none;*/
border-color: #434242;
}
@@ -75,14 +72,8 @@
max-height: calc(100vh - var(--nav-height) - 12px);
line-height: 30px;
overflow-y: auto;
}
html[data-bs-theme=light] ul[m-id="{{d.mId}}"] {
background-color: var(--app-light-color) !important;
}
html[data-bs-theme=dark] ul[m-id="{{d.mId}}"] {
background-color: #3c3c3c !important;
top: var(--nav-height);
box-shadow: 0 2px 5px rgb(0 0 0 / 50%);
}
ul[m-id="{{d.mId}}"] .layui-nav-item {
@@ -91,10 +82,6 @@
cursor: pointer;
}
ul[m-id="{{d.mId}}"] .layui-nav-child {
top: var(--nav-height);
}
ul[m-id="{{d.mId}}"] dl {
z-index: 1001;
}
@@ -161,25 +148,20 @@
}
ul[m-id="{{d.mId}}"] .layui-nav-item dd > a {
font-size: 14px;
line-height: 14px;
font-family: "Lato", "Noto Sans SC";
font-size: 13px;
line-height: 13px;
border-radius: 5px;
box-sizing: content-box;
padding: 5px 7px 4px 7px !important;
padding: 5px 7px;
margin: 0px 5px;
border-radius: 5px;
min-width: 100px;
font-family: "Lato", "Noto Sans SC";
}
ul[m-id="{{d.mId}}"] .layui-nav-item dd > a {
transition: none;
-webkit-transition: none;
}
ul[m-id="{{d.mId}}"] .layui-nav-item dd > a:hover {
transition: none;
-webkit-transition: none;
color: #fff;
}
@@ -205,11 +187,11 @@
ul[m-id="{{d.mId}}"] > .editor-btn-container {
line-height: 22px;
font-size: 16px;
border-radius: 5px;
background-color: rgba(255, 255, 255, 0.05);
margin: 4px;
padding: 0 2px;
border: 1px solid rgba(204, 204, 204, 0.2);
border-radius: 5px;
}
ul[m-id="{{d.mId}}"] > .editor-btn-container > .copyright {
@@ -283,33 +265,33 @@
-webkit-transition: all .3s;
}
html[data-bs-theme=light] ul[m-id="{{d.mId}}"] select + .select2 > .selection > .select2-selection {
html[data-bs-theme=light] ul[m-id="{{d.mId}}"] .select2 > .selection > .select2-selection {
background-color: #009f90;
border-color: #009f90;
}
html[data-bs-theme=dark] ul[m-id="{{d.mId}}"] select + .select2 > .selection > .select2-selection {
html[data-bs-theme=dark] ul[m-id="{{d.mId}}"] .select2 > .selection > .select2-selection {
background-color: var(--lay-color-fill-2);
border-color: var(--lay-color-border-1);
}
html[data-bs-theme=light] ul[m-id="{{d.mId}}"] select + .select2 > .selection > .select2-selection:hover {
html[data-bs-theme=light] ul[m-id="{{d.mId}}"] .select2 > .selection > .select2-selection:hover {
border-color: #037a6f;
}
html[data-bs-theme=dark] ul[m-id="{{d.mId}}"] select + .select2 > .selection > .select2-selection:hover {
html[data-bs-theme=dark] ul[m-id="{{d.mId}}"] .select2 > .selection > .select2-selection:hover {
border-color: #1f1f1f;
}
ul[m-id="{{d.mId}}"] select + .select2 > .selection > .select2-selection > .select2-selection__rendered {
ul[m-id="{{d.mId}}"] .select2 > .selection > .select2-selection > .select2-selection__rendered {
color: #fff;
}
ul[m-id="{{d.mId}}"] select + .select2 > .selection > .select2-selection > .select2-selection__arrow b {
ul[m-id="{{d.mId}}"] .select2 > .selection > .select2-selection > .select2-selection__arrow b {
border-color: #fff transparent transparent transparent;
}
ul[m-id="{{d.mId}}"] select + .select2-container--open > .selection > .select2-selection > .select2-selection__arrow b {
ul[m-id="{{d.mId}}"] .select2-container--open > .selection > .select2-selection > .select2-selection__arrow b {
border-color: transparent transparent #fff transparent;
}
</style>

View File

@@ -1,85 +0,0 @@
(function(){/*
Copyright The Closure Library Authors.
SPDX-License-Identifier: Apache-2.0
*/
var l=this||self,m=function(a,b){a=a.split(".");var c=l;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b};var q=function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])},r=function(a){for(var b in a)if(a.hasOwnProperty(b))return!0;return!1};var t=window,u=document,v=function(a,b){u.addEventListener?u.addEventListener(a,b,!1):u.attachEvent&&u.attachEvent("on"+a,b)};var w=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;var x={},y=function(){x.TAGGING=x.TAGGING||[];x.TAGGING[1]=!0};var z=/:[0-9]+$/,B=function(a,b){b&&(b=String(b).toLowerCase());if("protocol"===b||"port"===b)a.protocol=A(a.protocol)||A(t.location.protocol);"port"===b?a.port=String(Number(a.hostname?a.port:t.location.port)||("http"==a.protocol?80:"https"==a.protocol?443:"")):"host"===b&&(a.hostname=(a.hostname||t.location.hostname).replace(z,"").toLowerCase());var c=A(a.protocol);b&&(b=String(b).toLowerCase());switch(b){case "url_no_fragment":b="";a&&a.href&&(b=a.href.indexOf("#"),b=0>b?a.href:a.href.substr(0,
b));a=b;break;case "protocol":a=c;break;case "host":a=a.hostname.replace(z,"").toLowerCase();break;case "port":a=String(Number(a.port)||("http"==c?80:"https"==c?443:""));break;case "path":a.pathname||a.hostname||y();a="/"==a.pathname.substr(0,1)?a.pathname:"/"+a.pathname;a=a.split("/");a:if(b=[],c=a[a.length-1],Array.prototype.indexOf)b=b.indexOf(c),b="number"==typeof b?b:-1;else{for(var d=0;d<b.length;d++)if(b[d]===c){b=d;break a}b=-1}0<=b&&(a[a.length-1]="");a=a.join("/");break;case "query":a=a.search.replace("?",
"");break;case "extension":a=a.pathname.split(".");a=1<a.length?a[a.length-1]:"";a=a.split("/")[0];break;case "fragment":a=a.hash.replace("#","");break;default:a=a&&a.href}return a},A=function(a){return a?a.replace(":","").toLowerCase():""},C=function(a){var b=u.createElement("a");a&&(b.href=a);var c=b.pathname;"/"!==c[0]&&(a||y(),c="/"+c);a=b.hostname.replace(z,"");return{href:b.href,protocol:b.protocol,host:b.host,hostname:a,pathname:c,search:b.search,hash:b.hash,port:b.port}};function D(){for(var a=E,b={},c=0;c<a.length;++c)b[a[c]]=c;return b}function F(){var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";a+=a.toLowerCase()+"0123456789-_";return a+"."}var E,G;function H(a){E=E||F();G=G||D();for(var b=[],c=0;c<a.length;c+=3){var d=c+1<a.length,f=c+2<a.length,e=a.charCodeAt(c),g=d?a.charCodeAt(c+1):0,h=f?a.charCodeAt(c+2):0,k=e>>2;e=(e&3)<<4|g>>4;g=(g&15)<<2|h>>6;h&=63;f||(h=64,d||(g=64));b.push(E[k],E[e],E[g],E[h])}return b.join("")}
function I(a){function b(k){for(;d<a.length;){var n=a.charAt(d++),p=G[n];if(null!=p)return p;if(!/^[\s\xa0]*$/.test(n))throw Error("Unknown base64 encoding at char: "+n);}return k}E=E||F();G=G||D();for(var c="",d=0;;){var f=b(-1),e=b(0),g=b(64),h=b(64);if(64===h&&-1===f)return c;c+=String.fromCharCode(f<<2|e>>4);64!=g&&(c+=String.fromCharCode(e<<4&240|g>>2),64!=h&&(c+=String.fromCharCode(g<<6&192|h)))}};var J;var N=function(){var a=K,b=L,c=M(),d=function(g){a(g.target||g.srcElement||{})},f=function(g){b(g.target||g.srcElement||{})};if(!c.init){v("mousedown",d);v("keyup",d);v("submit",f);var e=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){b(this);e.call(this)};c.init=!0}},O=function(a,b,c){for(var d=M().decorators,f={},e=0;e<d.length;++e){var g=d[e],h;if(h=!c||g.forms)a:{h=g.domains;var k=a,n=!!g.sameHost;if(h&&(n||k!==u.location.hostname))for(var p=0;p<h.length;p++)if(h[p]instanceof
RegExp){if(h[p].test(k)){h=!0;break a}}else if(0<=k.indexOf(h[p])||n&&0<=h[p].indexOf(k)){h=!0;break a}h=!1}h&&(h=g.placement,void 0==h&&(h=g.fragment?2:1),h===b&&q(f,g.callback()))}return f},M=function(){var a={};var b=t.google_tag_data;t.google_tag_data=void 0===b?a:b;a=t.google_tag_data;b=a.gl;b&&b.decorators||(b={decorators:[]},a.gl=b);return b};var P=/(.*?)\*(.*?)\*(.*)/,aa=/([^?#]+)(\?[^#]*)?(#.*)?/;function Q(a){return new RegExp("(.*?)(^|&)"+a+"=([^&]*)&?(.*)")}
var S=function(a){var b=[],c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];void 0!==d&&d===d&&null!==d&&"[object Object]"!==d.toString()&&(b.push(c),b.push(H(String(d))))}a=b.join("*");return["1",R(a),a].join("*")},R=function(a,b){a=[window.navigator.userAgent,(new Date).getTimezoneOffset(),window.navigator.userLanguage||window.navigator.language,Math.floor((new Date).getTime()/60/1E3)-(void 0===b?0:b),a].join("*");if(!(b=J)){b=Array(256);for(var c=0;256>c;c++){for(var d=c,f=0;8>f;f++)d=d&1?d>>>1^
3988292384:d>>>1;b[c]=d}}J=b;b=4294967295;for(c=0;c<a.length;c++)b=b>>>8^J[(b^a.charCodeAt(c))&255];return((b^-1)>>>0).toString(36)},ca=function(a){return function(b){var c=C(t.location.href),d=c.search.replace("?","");a:{var f=d.split("&");for(var e=0;e<f.length;e++){var g=f[e].split("=");if("_gl"===decodeURIComponent(g[0]).replace(/\+/g," ")){f=g.slice(1).join("=");break a}}f=void 0}b.query=T(f||"")||{};f=B(c,"fragment");e=f.match(Q("_gl"));b.fragment=T(e&&e[3]||"")||{};a&&ba(c,d,f)}};
function U(a,b){if(a=Q(a).exec(b)){var c=a[2],d=a[4];b=a[1];d&&(b=b+c+d)}return b}
var ba=function(a,b,c){function d(e,g){e=U("_gl",e);e.length&&(e=g+e);return e}if(t.history&&t.history.replaceState){var f=Q("_gl");if(f.test(b)||f.test(c))a=B(a,"path"),b=d(b,"?"),c=d(c,"#"),t.history.replaceState({},void 0,""+a+b+c)}},T=function(a){var b=void 0===b?3:b;try{if(a){a:{for(var c=0;3>c;++c){var d=P.exec(a);if(d){var f=d;break a}a=decodeURIComponent(a)}f=void 0}if(f&&"1"===f[1]){var e=f[2],g=f[3];a:{for(f=0;f<b;++f)if(e===R(g,f)){var h=!0;break a}h=!1}if(h){b={};var k=g?g.split("*"):
[];for(g=0;g<k.length;g+=2)b[k[g]]=I(k[g+1]);return b}}}}catch(n){}};function V(a,b,c,d){function f(k){k=U(a,k);var n=k.charAt(k.length-1);k&&"&"!==n&&(k+="&");return k+h}d=void 0===d?!1:d;var e=aa.exec(c);if(!e)return"";c=e[1];var g=e[2]||"";e=e[3]||"";var h=a+"="+b;d?e="#"+f(e.substring(1)):g="?"+f(g.substring(1));return""+c+g+e}
function W(a,b){var c="FORM"===(a.tagName||"").toUpperCase(),d=O(b,1,c),f=O(b,2,c);b=O(b,3,c);r(d)&&(d=S(d),c?X("_gl",d,a):Y("_gl",d,a,!1));!c&&r(f)&&(c=S(f),Y("_gl",c,a,!0));for(var e in b)b.hasOwnProperty(e)&&Z(e,b[e],a)}function Z(a,b,c,d){if(c.tagName){if("a"===c.tagName.toLowerCase())return Y(a,b,c,d);if("form"===c.tagName.toLowerCase())return X(a,b,c)}if("string"==typeof c)return V(a,b,c,d)}function Y(a,b,c,d){c.href&&(a=V(a,b,c.href,void 0===d?!1:d),w.test(a)&&(c.href=a))}
function X(a,b,c){if(c&&c.action){var d=(c.method||"").toLowerCase();if("get"===d){d=c.childNodes||[];for(var f=!1,e=0;e<d.length;e++){var g=d[e];if(g.name===a){g.setAttribute("value",b);f=!0;break}}f||(d=u.createElement("input"),d.setAttribute("type","hidden"),d.setAttribute("name",a),d.setAttribute("value",b),c.appendChild(d))}else"post"===d&&(a=V(a,b,c.action),w.test(a)&&(c.action=a))}}
var K=function(a){try{a:{for(var b=100;a&&0<b;){if(a.href&&a.nodeName.match(/^a(?:rea)?$/i)){var c=a;break a}a=a.parentNode;b--}c=null}if(c){var d=c.protocol;"http:"!==d&&"https:"!==d||W(c,c.hostname)}}catch(f){}},L=function(a){try{if(a.action){var b=B(C(a.action),"host");W(a,b)}}catch(c){}};m("google_tag_data.glBridge.auto",function(a,b,c,d){N();c="fragment"===c?2:1;a={callback:a,domains:b,fragment:2===c,placement:c,forms:!!d,sameHost:!1};M().decorators.push(a)});m("google_tag_data.glBridge.decorate",function(a,b,c){a=S(a);return Z("_gl",a,b,!!c)});m("google_tag_data.glBridge.generate",S);m("google_tag_data.glBridge.get",function(a,b){var c=ca(!!b);b=M();b.data||(b.data={query:{},fragment:{}},c(b.data));c={};if(b=b.data)q(c,b.query),a&&q(c,b.fragment);return c});})(window);
(function(){function La(a){var b=1,c;if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.charCodeAt(c);b=(b<<6&268435455)+d+(d<<14);d=b&266338304;b=0!=d?b^d>>21:b}return b};/*
Copyright The Closure Library Authors.
SPDX-License-Identifier: Apache-2.0
*/
var $c=function(a){this.C=a||[]};$c.prototype.set=function(a){this.C[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b<this.C.length;b++)this.C[b]&&(a[Math.floor(b/6)]^=1<<b%6);for(b=0;b<a.length;b++)a[b]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b]||0);return a.join("")+"~"};var ha=window.GoogleAnalyticsObject,F;if(F=void 0!=ha)F=-1<(ha.constructor+"").indexOf("String");var wa;if(wa=F){var Ea=window.GoogleAnalyticsObject;wa=Ea?Ea.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""}var gb=wa||"ga",jd=/^(?:utma\.)?\d+\.\d+$/,kd=/^amp-[\w.-]{22,64}$/,Ba=!1;var vd=new $c;function J(a){vd.set(a)}var Td=function(a){a=Dd(a);a=new $c(a);for(var b=vd.C.slice(),c=0;c<a.C.length;c++)b[c]=b[c]||a.C[c];return(new $c(b)).encode()},Dd=function(a){a=a.get(Gd);ka(a)||(a=[]);return a};var ea=function(a){return"function"==typeof a},ka=function(a){return"[object Array]"==Object.prototype.toString.call(Object(a))},qa=function(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")},D=function(a,b){return 0==a.indexOf(b)},sa=function(a){return a?a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""},ra=function(){for(var a=O.navigator.userAgent+(M.cookie?M.cookie:"")+(M.referrer?M.referrer:""),b=a.length,c=O.history.length;0<c;)a+=c--^b++;return[hd()^La(a)&2147483647,Math.round((new Date).getTime()/
1E3)].join(".")},ta=function(a){var b=M.createElement("img");b.width=1;b.height=1;b.src=a;return b},ua=function(){},K=function(a){if(encodeURIComponent instanceof Function)return encodeURIComponent(a);J(28);return a},L=function(a,b,c,d){try{a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)}catch(e){J(27)}},f=/^[\w\-:/.?=&%!\[\]]+$/,Nd=/^[\w+/_-]+[=]{0,2}$/,be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+
K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||""==a||":"==a)return!0;return!1},ya=function(a,b){var c=M.referrer;if(/^(https?|android-app):\/\//i.test(c)){if(a)return c;a="//"+M.location.hostname;if(!de(c,a))return b&&(b=a.replace(/\./g,"-")+".cdn.ampproject.org",de(c,b))?void 0:
c}},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e<d;e++)if("object"===typeof b[e]){for(var g in b[e])b[e].hasOwnProperty(g)&&(c[g]=b[e][g]);break}else e<a.length&&(c[a[e]]=b[e]);return c};var ee=function(){this.keys=[];this.values={};this.m={}};ee.prototype.set=function(a,b,c){this.keys.push(a);c?this.m[":"+a]=b:this.values[":"+a]=b};ee.prototype.get=function(a){return this.m.hasOwnProperty(":"+a)?this.m[":"+a]:this.values[":"+a]};ee.prototype.map=function(a){for(var b=0;b<this.keys.length;b++){var c=this.keys[b],d=this.get(c);d&&a(c,d)}};var O=window,M=document,va=function(a,b){return setTimeout(a,b)};var Qa=window,Za=document,G=function(a){var b=Qa._gaUserPrefs;if(b&&b.ioo&&b.ioo()||a&&!0===Qa["ga-disable-"+a])return!0;try{var c=Qa.external;if(c&&c._gaUserPrefs&&"oo"==c._gaUserPrefs)return!0}catch(g){}a=[];b=String(Za.cookie).split(";");for(c=0;c<b.length;c++){var d=b[c].split("="),e=d[0].replace(/^\s*|\s*$/g,"");e&&"AMP_TOKEN"==e&&((d=d.slice(1).join("=").replace(/^\s*|\s*$/g,""))&&(d=decodeURIComponent(d)),a.push(d))}for(b=0;b<a.length;b++)if("$OPT_OUT"==a[b])return!0;return Za.getElementById("__gaOptOutExtension")?
!0:!1};var Ca=function(a){var b=[],c=M.cookie.split(";");a=new RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$");for(var d=0;d<c.length;d++){var e=c[d].match(a);e&&b.push(e[1])}return b},zc=function(a,b,c,d,e,g,ca){e=G(e)?!1:eb.test(M.location.hostname)||"/"==c&&vc.test(d)?!1:!0;if(!e)return!1;b&&1200<b.length&&(b=b.substring(0,1200));c=a+"="+b+"; path="+c+"; ";g&&(c+="expires="+(new Date((new Date).getTime()+g)).toGMTString()+"; ");d&&"none"!==d&&(c+="domain="+d+";");ca&&(c+=ca+";");d=M.cookie;M.cookie=c;if(!(d=d!=M.cookie))a:{a=
Ca(a);for(d=0;d<a.length;d++)if(b==a[d]){d=!0;break a}d=!1}return d},Cc=function(a){return encodeURIComponent?encodeURIComponent(a).replace(/\(/g,"%28").replace(/\)/g,"%29"):a},vc=/^(www\.)?google(\.com?)?(\.[a-z]{2})?$/,eb=/(^|\.)doubleclick\.net$/i;var oc,Id=/^.*Version\/?(\d+)[^\d].*$/i,ne=function(){if(void 0!==O.__ga4__)return O.__ga4__;if(void 0===oc){var a=O.navigator.userAgent;if(a){var b=a;try{b=decodeURIComponent(a)}catch(c){}if(a=!(0<=b.indexOf("Chrome"))&&!(0<=b.indexOf("CriOS"))&&(0<=b.indexOf("Safari/")||0<=b.indexOf("Safari,")))b=Id.exec(b),a=11<=(b?Number(b[1]):-1);oc=a}else oc=!1}return oc};var Fa,Ga,fb,Ab,ja=/^https?:\/\/[^/]*cdn\.ampproject\.org\//,Ue=/^(?:www\.|m\.|amp\.)+/,Ub=[],da=function(a){if(ye(a[Kd])){if(void 0===Ab){var b;if(b=(b=De.get())&&b._ga||void 0)Ab=b,J(81)}if(void 0!==Ab)return a[Q]||(a[Q]=Ab),!1}if(a[Kd]){J(67);if(a[ac]&&"cookie"!=a[ac])return!1;if(void 0!==Ab)a[Q]||(a[Q]=Ab);else{a:{b=String(a[W]||xa());var c=String(a[Yb]||"/"),d=Ca(String(a[U]||"_ga"));b=na(d,b,c);if(!b||jd.test(b))b=!0;else if(b=Ca("AMP_TOKEN"),0==b.length)b=!0;else{if(1==b.length&&(b=decodeURIComponent(b[0]),
"$RETRIEVING"==b||"$OPT_OUT"==b||"$ERROR"==b||"$NOT_FOUND"==b)){b=!0;break a}b=!1}}if(b&&tc(ic,String(a[Na])))return!0}}return!1},ic=function(){Z.D([ua])},tc=function(a,b){var c=Ca("AMP_TOKEN");if(1<c.length)return J(55),!1;c=decodeURIComponent(c[0]||"");if("$OPT_OUT"==c||"$ERROR"==c||G(b))return J(62),!1;if(!ja.test(M.referrer)&&"$NOT_FOUND"==c)return J(68),!1;if(void 0!==Ab)return J(56),va(function(){a(Ab)},0),!0;if(Fa)return Ub.push(a),!0;if("$RETRIEVING"==c)return J(57),va(function(){tc(a,b)},
1E4),!0;Fa=!0;c&&"$"!=c[0]||(xc("$RETRIEVING",3E4),setTimeout(Mc,3E4),c="");return Pc(c,b)?(Ub.push(a),!0):!1},Pc=function(a,b,c){if(!window.JSON)return J(58),!1;var d=O.XMLHttpRequest;if(!d)return J(59),!1;var e=new d;if(!("withCredentials"in e))return J(60),!1;e.open("POST",(c||"https://ampcid.google.com/v1/publisher:getClientId")+"?key=AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM",!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onload=function(){Fa=!1;if(4==e.readyState){try{200!=
e.status&&(J(61),Qc("","$ERROR",3E4));var g=JSON.parse(e.responseText);g.optOut?(J(63),Qc("","$OPT_OUT",31536E6)):g.clientId?Qc(g.clientId,g.securityToken,31536E6):!c&&g.alternateUrl?(Ga&&clearTimeout(Ga),Fa=!0,Pc(a,b,g.alternateUrl)):(J(64),Qc("","$NOT_FOUND",36E5))}catch(ca){J(65),Qc("","$ERROR",3E4)}e=null}};d={originScope:"AMP_ECID_GOOGLE"};a&&(d.securityToken=a);e.send(JSON.stringify(d));Ga=va(function(){J(66);Qc("","$ERROR",3E4)},1E4);return!0},Mc=function(){Fa=!1},xc=function(a,b){if(void 0===
fb){fb="";for(var c=id(),d=0;d<c.length;d++){var e=c[d];if(zc("AMP_TOKEN",encodeURIComponent(a),"/",e,"",b)){fb=e;return}}}zc("AMP_TOKEN",encodeURIComponent(a),"/",fb,"",b)},Qc=function(a,b,c){Ga&&clearTimeout(Ga);b&&xc(b,c);Ab=a;b=Ub;Ub=[];for(c=0;c<b.length;c++)b[c](a)},ye=function(a){a:{if(ja.test(M.referrer)){var b=M.location.hostname.replace(Ue,"");b:{var c=M.referrer;c=c.replace(/^https?:\/\//,"");var d=c.replace(/^[^/]+/,"").split("/"),e=d[2];d=(d="s"==e?d[3]:e)?decodeURIComponent(d):d;if(!d){if(0==
c.indexOf("xn--")){c="";break b}(c=c.match(/(.*)\.cdn\.ampproject\.org\/?$/))&&2==c.length&&(d=c[1].replace(/-/g,".").replace(/\.\./g,"-"))}c=d?d.replace(Ue,""):""}(d=b===c)||(c="."+c,d=b.substring(b.length-c.length,b.length)===c);if(d){b=!0;break a}else J(78)}b=!1}return b&&!1!==a};var bd=function(a){return(a?"https:":Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com"},Da=function(a){this.name="len";this.message=a+"-8192"},ba=function(a,b,c){c=c||ua;if(2036>=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,
d){var e=O.XMLHttpRequest;if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d)try{var ca=g.responseText;if(1>ca.length)ge("xhr","ver","0"),c();else if("1"!=ca.charAt(0))ge("xhr","ver",String(ca.length)),c();else if(3<d.count++)ge("xhr","tmr",""+d.count),c();else if(1==ca.length)c();else{var l=ca.charAt(1);if("d"==
l)pe("https://stats.g.doubleclick.net/j/collect",d.U,d,c);else if("g"==l){wc("https://www.google.%/ads/ga-audiences".replace("%","com"),d.google,c);var k=ca.substring(2);k&&(/^[a-z.]{1,6}$/.test(k)?wc("https://www.google.%/ads/ga-audiences".replace("%",k),d.google,ua):ge("tld","bcc",k))}else ge("xhr","brc",l),c()}}catch(w){ge("xhr","rsp"),c()}else c();g=null}};g.send(b);return!0},x=function(a,b,c){return O.navigator.sendBeacon?O.navigator.sendBeacon(a,b)?(c(),!0):!1:!1},ge=function(a,b,c){1<=100*
Math.random()||G("?")||(a=["t=error","_e="+a,"_v=j83","sr=1"],b&&a.push("_f="+b),c&&a.push("_m="+K(c.substring(0,100))),a.push("aip=1"),a.push("z="+hd()),wc(bd(!0)+"/u/d",a.join("&"),ua))};var qc=function(){return O.gaData=O.gaData||{}},h=function(a){var b=qc();return b[a]=b[a]||{}};var Ha=function(){this.M=[]};Ha.prototype.add=function(a){this.M.push(a)};Ha.prototype.D=function(a){try{for(var b=0;b<this.M.length;b++){var c=a.get(this.M[b]);c&&ea(c)&&c.call(O,a)}}catch(d){}b=a.get(Ia);b!=ua&&ea(b)&&(a.set(Ia,ua,!0),setTimeout(b,10))};function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";}
function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];ue.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});!1===a.get(xe)&&b.push("npa=1");b.push("z="+Bd());a.set(Ra,b.join("&"),!0)}
function Sa(a){var b=P(a,fa);!b&&a.get(Vd)&&(b="beacon");var c=P(a,gd),d=P(a,oe),e=c||(d||bd(!1)+"")+"/collect";switch(P(a,ad)){case "d":e=c||(d||bd(!1)+"")+"/j/collect";b=a.get(qe)||void 0;pe(e,P(a,Ra),b,a.Z(Ia));break;case "b":e=c||(d||bd(!1)+"")+"/r/collect";default:b?(c=P(a,Ra),d=(d=a.Z(Ia))||ua,"image"==b?wc(e,c,d):"xhr"==b&&wd(e,c,d)||"beacon"==b&&x(e,c,d)||ba(e,c,d)):ba(e,P(a,Ra),a.Z(Ia))}e=P(a,Na);e=h(e);b=e.hitcount;e.hitcount=b?b+1:1;e.first_hit||(e.first_hit=(new Date).getTime());e=P(a,
Na);delete h(e).pending_experiments;a.set(Ia,ua,!0)}function Hc(a){qc().expId&&a.set(Nc,qc().expId);qc().expVar&&a.set(Oc,qc().expVar);var b=P(a,Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&((b=a.get(m))&&(d=b+"!"+d),a.set(m,d,!0))}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";}
function yd(a){var b=O.gaDevIds||[];if(ka(b)){var c=a.get("&did");qa(c)&&0<c.length&&(b=b.concat(c.split(",")));c=[];for(var d=0;d<b.length;d++){var e;a:{for(e=0;e<c.length;e++)if(b[d]==c[e]){e=!0;break a}e=!1}e||c.push(b[d])}0!=c.length&&a.set("&did",c.join(","),!0)}}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0<e&&(c=Math.min(c+e,20),a.set(Xa,d));if(0>=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee};Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:Number(a)};Ya.prototype.Z=function(a){return(a=this.get(a))&&ea(a)?a:ua};
Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)};var ue=new ee,ve=[],bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=ue.get(a);if(!b)for(var c=0;c<ve.length;c++){var d=ve[c],e=d[0].exec(a);if(e){b=d[1](e);ue.set(b.name,b);break}}return b},yc=function(a){var b;ue.map(function(c,d){d.F==a&&(b=d)});return b&&b.name},S=function(a,b,c,d,e){a=new bb(a,b,c,d,e);ue.set(a.name,a);return a.name},cb=function(a,b){ve.push([new RegExp("^"+a+"$"),b])},T=function(a,b,c){return S(a,b,c,void 0,db)},db=function(){};var hb=T("apiVersion","v"),ib=T("clientVersion","_v");S("anonymizeIp","aip");var jb=S("adSenseId","a"),Va=S("hitType","t"),Ia=S("hitCallback"),Ra=S("hitPayload");S("nonInteraction","ni");S("currencyCode","cu");S("dataSource","ds");var Vd=S("useBeacon",void 0,!1),fa=S("transport");S("sessionControl","sc","");S("sessionGroup","sg");S("queueTime","qt");var Ac=S("_s","_s");S("screenName","cd");var kb=S("location","dl",""),lb=S("referrer","dr"),mb=S("page","dp","");S("hostname","dh");
var nb=S("language","ul"),ob=S("encoding","de");S("title","dt",function(){return M.title||void 0});cb("contentGroup([0-9]+)",function(a){return new bb(a[0],"cg"+a[1])});var pb=S("screenColors","sd"),qb=S("screenResolution","sr"),rb=S("viewportSize","vp"),sb=S("javaEnabled","je"),tb=S("flashVersion","fl");S("campaignId","ci");S("campaignName","cn");S("campaignSource","cs");S("campaignMedium","cm");S("campaignKeyword","ck");S("campaignContent","cc");
var ub=S("eventCategory","ec"),xb=S("eventAction","ea"),yb=S("eventLabel","el"),zb=S("eventValue","ev"),Bb=S("socialNetwork","sn"),Cb=S("socialAction","sa"),Db=S("socialTarget","st"),Eb=S("l1","plt"),Fb=S("l2","pdt"),Gb=S("l3","dns"),Hb=S("l4","rrt"),Ib=S("l5","srt"),Jb=S("l6","tcp"),Kb=S("l7","dit"),Lb=S("l8","clt"),Ve=S("l9","_gst"),We=S("l10","_gbt"),Xe=S("l11","_cst"),Ye=S("l12","_cbt"),Mb=S("timingCategory","utc"),Nb=S("timingVar","utv"),Ob=S("timingLabel","utl"),Pb=S("timingValue","utt");
S("appName","an");S("appVersion","av","");S("appId","aid","");S("appInstallerId","aiid","");S("exDescription","exd");S("exFatal","exf");var Nc=S("expId","xid"),Oc=S("expVar","xvar"),m=S("exp","exp"),Rc=S("_utma","_utma"),Sc=S("_utmz","_utmz"),Tc=S("_utmht","_utmht"),Ua=S("_hc",void 0,0),Xa=S("_ti",void 0,0),Wa=S("_to",void 0,20);cb("dimension([0-9]+)",function(a){return new bb(a[0],"cd"+a[1])});cb("metric([0-9]+)",function(a){return new bb(a[0],"cm"+a[1])});S("linkerParam",void 0,void 0,Bc,db);
var Ze=T("_cd2l",void 0,!1),ld=S("usage","_u"),Gd=S("_um");S("forceSSL",void 0,void 0,function(){return Ba},function(a,b,c){J(34);Ba=!!c});var ed=S("_j1","jid"),ia=S("_j2","gjid");cb("\\&(.*)",function(a){var b=new bb(a[0],a[1]),c=yc(a[0].substring(1));c&&(b.Z=function(d){return d.get(c)},b.o=function(d,e,g,ca){d.set(c,g,ca)},b.F=void 0);return b});
var Qb=T("_oot"),dd=S("previewTask"),Rb=S("checkProtocolTask"),md=S("validationTask"),Sb=S("checkStorageTask"),Uc=S("historyImportTask"),Tb=S("samplerTask"),Vb=S("_rlt"),Wb=S("buildHitTask"),Xb=S("sendHitTask"),Vc=S("ceTask"),zd=S("devIdTask"),Cd=S("timingTask"),Ld=S("displayFeaturesTask"),oa=S("customTask"),ze=S("fpsCrossDomainTask"),V=T("name"),Q=T("clientId","cid"),n=T("clientIdTime"),xd=T("storedClientId"),Ad=S("userId","uid"),Na=T("trackingId","tid"),U=T("cookieName",void 0,"_ga"),W=T("cookieDomain"),
Yb=T("cookiePath",void 0,"/"),Zb=T("cookieExpires",void 0,63072E3),Hd=T("cookieUpdate",void 0,!0),Be=T("cookieFlags",void 0,""),$b=T("legacyCookieDomain"),Wc=T("legacyHistoryImport",void 0,!0),ac=T("storage",void 0,"cookie"),bc=T("allowLinker",void 0,!1),cc=T("allowAnchor",void 0,!0),Ka=T("sampleRate","sf",100),dc=T("siteSpeedSampleRate",void 0,1),ec=T("alwaysSendReferrer",void 0,!1),I=T("_gid","_gid"),la=T("_gcn"),Kd=T("useAmpClientId"),ce=T("_gclid"),fe=T("_gt"),he=T("_ge",void 0,7776E6),ie=T("_gclsrc"),
je=T("storeGac",void 0,!0),oe=S("_x_19"),Ae=S("_fplc","_fplc"),gd=S("transportUrl"),Md=S("_r","_r"),qe=S("_dp"),ad=S("_jt",void 0,"n"),Ud=S("allowAdFeatures",void 0,!0),xe=S("allowAdPersonalizationSignals",void 0,!0);function X(a,b,c,d){b[a]=function(){try{return d&&J(d),c.apply(this,arguments)}catch(e){throw ge("exc",a,e&&e.name),e;}}};var Od=function(){this.V=100;this.$=this.fa=!1;this.oa="detourexp";this.groups=1},Ed=function(a){var b=new Od,c;if(b.fa&&b.$)return 0;b.$=!0;if(a){if(b.oa&&void 0!==a.get(b.oa))return R(a,b.oa);if(0==a.get(dc))return 0}if(0==b.V)return 0;void 0===c&&(c=Bd());return 0==c%b.V?Math.floor(c/b.V)%b.groups+1:0};function fc(){var a,b;if((b=(b=O.navigator)?b.plugins:null)&&b.length)for(var c=0;c<b.length&&!a;c++){var d=b[c];-1<d.name.indexOf("Shockwave Flash")&&(a=d.description)}if(!a)try{var e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),a="WIN 6,0,21,0",e.AllowScriptAccess="always",a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),a=e.GetVariable("$version")}catch(g){}a&&
(e=a.match(/[\d]+/g))&&3<=e.length&&(a=e[0]+"."+e[1]+" r"+e[2]);return a||void 0};var Ee=function(){var a=Ca("FPLC");return 0<a.length?a[0]:void 0},Fe=function(a){P(a,oe)&&a.get(Ze)&&a.set(Ae,Ee()||"0")};var aa=function(a){var b=Math.min(R(a,dc),100);return La(P(a,Q))%100>=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0<c?(Y(b,Gb),Y(b,Jb),Y(b,Ib),Y(b,Fb),Y(b,Hb),Y(b,Kb),Y(b,Lb),Y(b,Ve),Y(b,We),Y(b,Xe),Y(b,Ye),va(function(){a(b)},10)):L(O,"load",function(){gc(a)},!1))}},Ec=function(a){var b=O.performance||O.webkitPerformance;b=b&&b.timing;if(!b)return!1;var c=b.navigationStart;if(0==c)return!1;a[Eb]=b.loadEventStart-c;a[Gb]=b.domainLookupEnd-b.domainLookupStart;
a[Jb]=b.connectEnd-b.connectStart;a[Ib]=b.responseStart-b.requestStart;a[Fb]=b.responseEnd-b.responseStart;a[Hb]=b.fetchStart-c;a[Kb]=b.domInteractive-c;a[Lb]=b.domContentLoadedEventStart-c;a[Ve]=N.L-c;a[We]=N.ya-c;O.google_tag_manager&&O.google_tag_manager._li&&(b=O.google_tag_manager._li,a[Xe]=b.cst,a[Ye]=b.cbt);return!0},Fc=function(a){if(O.top!=O)return!1;var b=O.external,c=b&&b.onloadT;b&&!b.isValidLoadTime&&(c=void 0);2147483648<c&&(c=void 0);0<c&&b.setPageReadyTime();if(void 0==c)return!1;
a[Eb]=c;return!0},Y=function(a,b){var c=a[b];if(isNaN(c)||Infinity==c||0>c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&&!a.I){a.I=!0;var c=aa(b),d=0<E(P(b,kb),"gclid").length;(c||d)&&gc(function(e){c&&a.send("timing",e);d&&a.send("adtiming",e)})}}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){if(a.get(Hd)||P(a,xd)!=P(a,Q)){var b=1E3*R(a,Zb);ma(a,Q,U,b);a.data.set(xd,P(a,Q))}(a.get(Hd)||uc(a)!=P(a,I))&&ma(a,I,la,864E5);if(a.get(je)){var c=P(a,ce);if(c){var d=Math.min(R(a,he),1E3*R(a,Zb));d=Math.min(d,1E3*R(a,fe)+d-(new Date).getTime());a.data.set(he,d);b={};var e=P(a,fe),g=P(a,ie),ca=kc(P(a,Yb)),l=lc(P(a,W)),k=P(a,Na),w=P(a,Be);g&&"aw.ds"!=g?b&&(b.ua=!0):(c=["1",e,Cc(c)].join("."),0<d&&(b&&(b.ta=!0),zc("_gac_"+Cc(k),c,ca,l,k,d,w)));le(b)}}else J(75);
(a=P(a,Ae))&&zc("FPLC",a,"/","none","",void 0,"Secure")}},ma=function(a,b,c,d){var e=nd(a,b);if(e){c=P(a,c);var g=kc(P(a,Yb)),ca=lc(P(a,W)),l=P(a,Be),k=P(a,Na);if("auto"!=ca)zc(c,e,g,ca,k,d,l)&&(hc=!0);else{J(32);for(var w=id(),Ce=0;Ce<w.length;Ce++)if(ca=w[Ce],a.data.set(W,ca),e=nd(a,b),zc(c,e,g,ca,k,d,l)){hc=!0;return}a.data.set(W,"auto")}}},uc=function(a){var b=Ca(P(a,la));return Xd(a,b)},nc=function(a){if("cookie"==P(a,ac)&&!hc&&(mc(a),!hc))throw"abort";},Yc=function(a){if(a.get(Wc)){var b=P(a,
W),c=P(a,$b)||xa(),d=Xc("__utma",c,b);d&&(J(19),a.set(Tc,(new Date).getTime(),!0),a.set(Rc,d.R),(b=Xc("__utmz",c,b))&&d.hash==b.hash&&a.set(Sc,b.R))}},nd=function(a,b){b=Cc(P(a,b));var c=lc(P(a,W)).split(".").length;a=jc(P(a,Yb));1<a&&(c+="-"+a);return b?["GA1",c,b].join("."):""},Xd=function(a,b){return na(b,P(a,W),P(a,Yb))},na=function(a,b,c){if(!a||1>a.length)J(12);else{for(var d=[],e=0;e<a.length;e++){var g=a[e];var ca=g.split(".");var l=ca.shift();("GA1"==l||"1"==l)&&1<ca.length?(g=ca.shift().split("-"),
1==g.length&&(g[1]="1"),g[0]*=1,g[1]*=1,ca={H:g,s:ca.join(".")}):ca=kd.test(g)?{H:[0,0],s:g}:void 0;ca&&d.push(ca)}if(1==d.length)return J(13),d[0].s;if(0==d.length)J(12);else{J(14);d=Gc(d,lc(b).split(".").length,0);if(1==d.length)return d[0].s;d=Gc(d,jc(c),1);1<d.length&&J(41);return d[0]&&d[0].s}}},Gc=function(a,b,c){for(var d=[],e=[],g,ca=0;ca<a.length;ca++){var l=a[ca];l.H[c]==b?d.push(l):void 0==g||l.H[c]<g?(e=[l],g=l.H[c]):l.H[c]==g&&e.push(l)}return 0<d.length?d:e},lc=function(a){return 0==
a.indexOf(".")?a.substr(1):a},id=function(){var a=[],b=xa().split(".");if(4==b.length){var c=b[b.length-1];if(parseInt(c,10)==c)return["none"]}for(c=b.length-2;0<=c;c--)a.push(b.slice(c).join("."));b=M.location.hostname;eb.test(b)||vc.test(b)||a.push("none");return a},kc=function(a){if(!a)return"/";1<a.length&&a.lastIndexOf("/")==a.length-1&&(a=a.substr(0,a.length-1));0!=a.indexOf("/")&&(a="/"+a);return a},jc=function(a){a=kc(a);return"/"==a?1:a.split("/").length},le=function(a){a.ta&&J(77);a.na&&
J(74);a.pa&&J(73);a.ua&&J(69)};function Xc(a,b,c){"none"==b&&(b="");var d=[],e=Ca(a);a="__utma"==a?6:2;for(var g=0;g<e.length;g++){var ca=(""+e[g]).split(".");ca.length>=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d<b.length;d++)if(b[d].hash==c||b[d].hash==a)return b[d]};var Jc=new RegExp(/^https?:\/\/([^\/:]+)/),De=O.google_tag_data.glBridge,Kc=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/,od=/(.*)([?&#])(?:_gac=[^&#]*)(?:&?)(.*)/;function Bc(a){if(a.get(Ze))return J(35),De.generate($e(a));var b=P(a,Q),c=P(a,I)||"";b="_ga=2."+K(pa(c+b,0)+"."+c+"-"+b);(a=af(a))?(J(44),a="&_gac=1."+K([pa(a.qa,0),a.timestamp,a.qa].join("."))):a="";return b+a}
function Ic(a,b){var c=new Date,d=O.navigator,e=d.plugins||[];a=[a,d.userAgent,c.getTimezoneOffset(),c.getYear(),c.getDate(),c.getHours(),c.getMinutes()+b];for(b=0;b<e.length;++b)a.push(e[b].description);return La(a.join("."))}function pa(a,b){var c=new Date,d=O.navigator,e=c.getHours()+Math.floor((c.getMinutes()+b)/60);return La([a,d.userAgent,d.language||"",c.getTimezoneOffset(),c.getYear(),c.getDate()+Math.floor(e/24),(24+e)%24,(60+c.getMinutes()+b)%60].join("."))}
var Dc=function(a){J(48);this.target=a;this.T=!1};Dc.prototype.ca=function(a,b){if(a){if(this.target.get(Ze))return De.decorate($e(this.target),a,b);if(a.tagName){if("a"==a.tagName.toLowerCase()){a.href&&(a.href=qd(this,a.href,b));return}if("form"==a.tagName.toLowerCase())return rd(this,a)}if("string"==typeof a)return qd(this,a,b)}};
var qd=function(a,b,c){var d=Kc.exec(b);d&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));(d=od.exec(b))&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));a=a.target.get("linkerParam");var e=b.indexOf("?");d=b.indexOf("#");c?b+=(-1==d?"#":"&")+a:(c=-1==e?"?":"&",b=-1==d?b+(c+a):b.substring(0,d)+c+a+b.substring(d));b=b.replace(/&+_ga=/,"&_ga=");return b=b.replace(/&+_gac=/,"&_gac=")},rd=function(a,b){if(b&&b.action)if("get"==b.method.toLowerCase()){a=a.target.get("linkerParam").split("&");for(var c=0;c<a.length;c++){var d=
a[c].split("="),e=d[1];d=d[0];for(var g=b.childNodes||[],ca=!1,l=0;l<g.length;l++)if(g[l].name==d){g[l].setAttribute("value",e);ca=!0;break}ca||(g=M.createElement("input"),g.setAttribute("type","hidden"),g.setAttribute("name",d),g.setAttribute("value",e),b.appendChild(g))}}else"post"==b.method.toLowerCase()&&(b.action=qd(a,b.action))};
Dc.prototype.S=function(a,b,c){function d(g){try{g=g||O.event;a:{var ca=g.target||g.srcElement;for(g=100;ca&&0<g;){if(ca.href&&ca.nodeName.match(/^a(?:rea)?$/i)){var l=ca;break a}ca=ca.parentNode;g--}l={}}("http:"==l.protocol||"https:"==l.protocol)&&sd(a,l.hostname||"")&&l.href&&(l.href=qd(e,l.href,b))}catch(k){J(26)}}var e=this;this.target.get(Ze)?De.auto(function(){return $e(e.target)},a,b?"fragment":"",c):(this.T||(this.T=!0,L(M,"mousedown",d,!1),L(M,"keyup",d,!1)),c&&L(M,"submit",function(g){g=
g||O.event;if((g=g.target||g.srcElement)&&g.action){var ca=g.action.match(Jc);ca&&sd(a,ca[1])&&rd(e,g)}}))};function sd(a,b){if(b==M.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}function ke(a,b){return b!=Ic(a,0)&&b!=Ic(a,-1)&&b!=Ic(a,-2)&&b!=pa(a,0)&&b!=pa(a,-1)&&b!=pa(a,-2)}
function $e(a){var b=af(a),c={};return c._ga=a.get(Q),c._gid=a.get(I)||void 0,c._gac=b?[b.qa,b.timestamp].join("."):void 0,c._fplc=Ee(),c}function af(a){function b(e){return void 0==e||""===e?0:Number(e)}var c=a.get(ce);if(c&&a.get(je)){var d=b(a.get(fe));if(1E3*d+b(a.get(he))<=(new Date).getTime())J(76);else return{timestamp:d,qa:c}}};var p=/^(GTM|OPT)-[A-Z0-9]+$/,q=/;_gaexp=[^;]*/g,r=/;((__utma=)|([^;=]+=GAX?\d+\.))[^;]*/g,Aa=/^https?:\/\/[\w\-.]+\.google.com(:\d+)?\/optimize\/opt-launch\.html\?.*$/,t=function(a){function b(d,e){e&&(c+="&"+d+"="+K(e))}var c="https://www.google-analytics.com/gtm/js?id="+K(a.id);"dataLayer"!=a.B&&b("l",a.B);b("t",a.target);b("cid",a.clientId);b("cidt",a.ka);b("gac",a.la);b("aip",a.ia);a.sync&&b("m","sync");b("cycle",a.G);a.qa&&b("gclid",a.qa);Aa.test(M.referrer)&&b("cb",String(hd()));return c};var Jd=function(a,b,c){this.aa=b;(b=c)||(b=(b=P(a,V))&&"t0"!=b?Wd.test(b)?"_gat_"+Cc(P(a,Na)):"_gat_"+Cc(b):"_gat");this.Y=b;this.ra=null},Rd=function(a,b){var c=b.get(Wb);b.set(Wb,function(e){Pd(a,e,ed);Pd(a,e,ia);var g=c(e);Qd(a,e);return g});var d=b.get(Xb);b.set(Xb,function(e){var g=d(e);if(se(e)){if(ne()!==H(a,e)){J(80);var ca={U:re(a,e,1),google:re(a,e,2),count:0};pe("https://stats.g.doubleclick.net/j/collect",ca.U,ca)}else ta(re(a,e,0));e.set(ed,"",!0)}return g})},Pd=function(a,b,c){!1===b.get(Ud)||
b.get(c)||("1"==Ca(a.Y)[0]?b.set(c,"",!0):b.set(c,""+hd(),!0))},Qd=function(a,b){se(b)&&zc(a.Y,"1",P(b,Yb),P(b,W),P(b,Na),6E4,P(b,Be))},se=function(a){return!!a.get(ed)&&!1!==a.get(Ud)},re=function(a,b,c){var d=new ee,e=function(ca){$a(ca).F&&d.set($a(ca).F,b.get(ca))};e(hb);e(ib);e(Na);e(Q);e(ed);if(0==c||1==c)e(Ad),e(ia),e(I);d.set($a(ld).F,Td(b));var g="";d.map(function(ca,l){g+=K(ca)+"=";g+=K(""+l)+"&"});g+="z="+hd();0==c?g=a.aa+g:1==c?g="t=dc&aip=1&_r=3&"+g:2==c&&(g="t=sr&aip=1&_r=4&slf_rd=1&"+
g);return g},H=function(a,b){null===a.ra&&(a.ra=1===Ed(b),a.ra&&J(33));return a.ra},Wd=/^gtm\d+$/;var fd=function(a,b){a=a.b;if(!a.get("dcLoaded")){var c=new $c(Dd(a));c.set(29);a.set(Gd,c.C);b=b||{};var d;b[U]&&(d=Cc(b[U]));b=new Jd(a,"https://stats.g.doubleclick.net/r/collect?t=dc&aip=1&_r=3&",d);Rd(b,a);a.set("dcLoaded",!0)}};var Sd=function(a){if(!a.get("dcLoaded")&&"cookie"==a.get(ac)){var b=new Jd(a);Pd(b,a,ed);Pd(b,a,ia);Qd(b,a);if(se(a)){var c=ne()!==H(b,a);a.set(Md,1,!0);c?(J(79),a.set(ad,"d",!0),a.set(qe,{U:re(b,a,1),google:re(b,a,2),count:0},!0)):a.set(ad,"b",!0)}}};var Lc=function(){var a=O.gaGlobal=O.gaGlobal||{};return a.hid=a.hid||hd()};var wb=/^(UA|YT|MO|GP)-(\d+)-(\d+)$/,pc=function(a){function b(e,g){d.b.data.set(e,g)}function c(e,g){b(e,g);d.filters.add(e)}var d=this;this.b=new Ya;this.filters=new Ha;b(V,a[V]);b(Na,sa(a[Na]));b(U,a[U]);b(W,a[W]||xa());b(Yb,a[Yb]);b(Zb,a[Zb]);b(Hd,a[Hd]);b(Be,a[Be]);b($b,a[$b]);b(Wc,a[Wc]);b(bc,a[bc]);b(cc,a[cc]);b(Ka,a[Ka]);b(dc,a[dc]);b(ec,a[ec]);b(ac,a[ac]);b(Ad,a[Ad]);b(n,a[n]);b(Kd,a[Kd]);b(je,a[je]);b(Ze,a[Ze]);b(oe,a[oe]);b(hb,1);b(ib,"j83");c(Qb,Ma);c(oa,ua);c(dd,cd);c(Rb,Oa);c(md,vb);
c(Sb,nc);c(Uc,Yc);c(Tb,Ja);c(Vb,Ta);c(Vc,Hc);c(zd,yd);c(Ld,Sd);c(ze,Fe);c(Wb,Pa);c(Xb,Sa);c(Cd,Fd(this));pd(this.b);td(this.b,a[Q]);this.b.set(jb,Lc())},td=function(a,b){var c=P(a,U);a.data.set(la,"_ga"==c?"_gid":c+"_gid");if("cookie"==P(a,ac)){hc=!1;c=Ca(P(a,U));c=Xd(a,c);if(!c){c=P(a,W);var d=P(a,$b)||xa();c=Xc("__utma",d,c);void 0!=c?(J(10),c=c.O[1]+"."+c.O[2]):c=void 0}c&&(hc=!0);if(d=c&&!a.get(Hd))if(d=c.split("."),2!=d.length)d=!1;else if(d=Number(d[1])){var e=R(a,Zb);d=d+e<(new Date).getTime()/
1E3}else d=!1;d&&(c=void 0);c&&(a.data.set(xd,c),a.data.set(Q,c),(c=uc(a))&&a.data.set(I,c));if(a.get(je)&&(c=a.get(ce),d=a.get(ie),!c||d&&"aw.ds"!=d)){c={};if(M){d=[];e=M.cookie.split(";");for(var g=/^\s*_gac_(UA-\d+-\d+)=\s*(.+?)\s*$/,ca=0;ca<e.length;ca++){var l=e[ca].match(g);l&&d.push({ja:l[1],value:l[2]})}e={};if(d&&d.length)for(g=0;g<d.length;g++)(ca=d[g].value.split("."),"1"!=ca[0]||3!=ca.length)?c&&(c.na=!0):ca[1]&&(e[d[g].ja]?c&&(c.pa=!0):e[d[g].ja]=[],e[d[g].ja].push({timestamp:ca[1],qa:ca[2]}));
d=e}else d={};d=d[P(a,Na)];le(c);d&&0!=d.length&&(c=d[0],a.data.set(fe,c.timestamp),a.data.set(ce,c.qa))}}if(a.get(Hd)&&(c=be("_ga",!!a.get(cc)),g=be("_gl",!!a.get(cc)),d=De.get(a.get(cc)),e=d._ga,g&&0<g.indexOf("_ga*")&&!e&&J(30),g=d.gclid,ca=d._gac,c||e||g||ca))if(c&&e&&J(36),a.get(bc)||ye(a.get(Kd))){e&&(J(38),a.data.set(Q,e),d._gid&&(J(51),a.data.set(I,d._gid)));g?(J(82),a.data.set(ce,g),d.gclsrc&&a.data.set(ie,d.gclsrc)):ca&&(e=ca.split("."))&&2===e.length&&(J(37),a.data.set(ce,e[0]),a.data.set(fe,
e[1]));if(d=d._fplc)J(83),a.data.set(Ae,d);if(c)b:if(d=c.indexOf("."),-1==d)J(22);else{e=c.substring(0,d);g=c.substring(d+1);d=g.indexOf(".");c=g.substring(0,d);g=g.substring(d+1);if("1"==e){if(d=g,ke(d,c)){J(23);break b}}else if("2"==e){d=g.indexOf("-");e="";0<d?(e=g.substring(0,d),d=g.substring(d+1)):d=g.substring(1);if(ke(e+d,c)){J(53);break b}e&&(J(2),a.data.set(I,e))}else{J(22);break b}J(11);a.data.set(Q,d);if(c=be("_gac",!!a.get(cc)))c=c.split("."),"1"!=c[0]||4!=c.length?J(72):ke(c[3],c[1])?
J(71):(a.data.set(ce,c[3]),a.data.set(fe,c[2]),J(70))}}else J(21);b&&(J(9),a.data.set(Q,K(b)));a.get(Q)||(b=(b=O.gaGlobal)&&b.from_cookie&&"cookie"!==P(a,ac)?void 0:(b=b&&b.vid)&&-1!==b.search(jd)?b:void 0,b?(J(17),a.data.set(Q,b)):(J(8),a.data.set(Q,ra())));a.get(I)||(J(3),a.data.set(I,ra()));mc(a);b=O.gaGlobal=O.gaGlobal||{};c=P(a,Q);a=c===P(a,xd);if(void 0==b.vid||a&&!b.from_cookie)b.vid=c,b.from_cookie=a},pd=function(a){var b=O.navigator,c=O.screen,d=M.location;a.set(lb,ya(!!a.get(ec),!!a.get(Kd)));
if(d){var e=d.pathname||"";"/"!=e.charAt(0)&&(J(31),e="/"+e);a.set(kb,d.protocol+"//"+d.hostname+e+d.search)}c&&a.set(qb,c.width+"x"+c.height);c&&a.set(pb,c.colorDepth+"-bit");c=M.documentElement;var g=(e=M.body)&&e.clientWidth&&e.clientHeight,ca=[];c&&c.clientWidth&&c.clientHeight&&("CSS1Compat"===M.compatMode||!g)?ca=[c.clientWidth,c.clientHeight]:g&&(ca=[e.clientWidth,e.clientHeight]);c=0>=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&
"function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe,Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(c=0;c<b.length;++c)(D(b[c],"utm_id")||D(b[c],"utm_campaign")||D(b[c],"utm_source")||D(b[c],"utm_medium")||D(b[c],"utm_term")||D(b[c],"utm_content")||D(b[c],"gclid")||D(b[c],"dclid")||D(b[c],"gclsrc"))&&
d.push(b[c]);0<d.length&&(b="#"+d.join("&"),a.set(kb,a.get(kb)+b))}};pc.prototype.get=function(a){return this.b.get(a)};pc.prototype.set=function(a,b){this.b.set(a,b)};var me={pageview:[mb],event:[ub,xb,yb,zb],social:[Bb,Cb,Db],timing:[Mb,Nb,Pb,Ob]};
pc.prototype.send=function(a){if(!(1>arguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(me[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b.data.m={})}};pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var te=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=te.exec(a[0]);null!=b&&4==b.length&&(this.c=b[1]||"t0",this.K=b[2]||"",this.methodName=b[3],this.a=[].slice.call(a,1),this.K||(this.A="create"==this.methodName,this.i="require"==this.methodName,this.g="provide"==this.methodName,this.ba="remove"==this.methodName),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.methodName)throw"abort";
if(this.i&&(!qa(b)||""==b))throw"abort";if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47};
var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);a=N.j(a);if(p.test(b)){J(52);if(!a)return!0;c=d||{};d={id:b,B:c.dataLayer||"dataLayer",ia:!!a.get("anonymizeIp"),sync:e,G:!1};a.get("&gtm")==b&&(d.G=!0);var g=String(a.get("name"));"t0"!=g&&(d.target=g);G(String(a.get("trackingId")))||(d.clientId=
String(a.get(Q)),d.ka=Number(a.get(n)),c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,d.la=c,d.qa=E(a.b.get(kb)||"","gclid"));c=d.B;g=(new Date).getTime();O[c]=O[c]||[];g={"gtm.start":g};e||(g.event="gtm.js");O[c].push(g);c=t(d)}!c&&Zd.hasOwnProperty(b)?(J(39),c=b+".js"):J(43);if(c){if(a){var ca=a.get(oe);qa(ca)||(ca=void 0)}c&&0<=c.indexOf("/")||(c=(ca||bd(!1))+"/plugins/ua/"+c);ca=ae(c);a=ca.protocol;d=M.location.protocol;if(("https:"==a||
a==d||("http:"!=a?0:"http:"==d))&&B(ca)){if(ca=ca.url)a=(a=M.querySelector&&M.querySelector("script[nonce]")||null)?a.nonce||a.getAttribute&&a.getAttribute("nonce")||"":"",e?(e="",a&&Nd.test(a)&&(e=' nonce="'+a+'"'),f.test(ca)&&M.write("<script"+e+' src="'+ca+'">\x3c/script>')):(e=M.createElement("script"),e.type="text/javascript",e.async=!0,e.src=ca,a&&e.setAttribute("nonce",a),ca=M.getElementsByTagName("script")[0],ca.parentNode.insertBefore(e,ca));$d.set(b,!0)}}}},v=function(a,b){var c=A.get(a)||
[];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;c<b.length;c++)b[c]();A.set(a,[])},B=function(a){var b=ae(M.location.href);if(D(a.url,"https://www.google-analytics.com/gtm/js?id="))return!0;if(a.query||0<=a.url.indexOf("?")||0<=a.path.indexOf("://"))return!1;if(a.host==b.host&&a.port==b.port)return!0;b="http:"==a.protocol?80:443;return"www.google-analytics.com"==a.host&&(a.port||b)==b&&D(a.path,"/plugins/")?!0:!1},ae=function(a){function b(l){var k=l.hostname||"",w=
0<=k.indexOf("]");k=k.split(w?"]":":")[0].toLowerCase();w&&(k+="]");w=(l.protocol||"").toLowerCase();w=1*l.port||("http:"==w?80:"https:"==w?443:"");l=l.pathname||"";D(l,"/")||(l="/"+l);return[k,""+w,l]}var c=M.createElement("a");c.href=M.location.href;var d=(c.protocol||"").toLowerCase(),e=b(c),g=c.search||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a||D(a,"?")?a=ca+e[2]+(a||g):0>a.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a;
d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.f.concat(b);for(Z.f=[];0<b.length&&!Z.v(b[0])&&!(b.shift(),0<Z.f.length););Z.f=Z.f.concat(b)};Z.J=function(a){for(var b=[],c=0;c<arguments.length;c++)try{var d=new sc(arguments[c]);d.g?C(d.a[0],d.a[1]):(d.i&&(d.ha=y(d.c,d.a[0],d.X,d.W)),b.push(d))}catch(e){}return b};
Z.v=function(a){try{if(a.u)a.u.call(O,N.j("t0"));else{var b=a.c==gb?N:N.j(a.c);if(a.A){if("t0"==a.c&&(b=N.create.apply(N,a.a),null===b))return!0}else if(a.ba)N.remove(a.c);else if(b)if(a.i){if(a.ha&&(a.ha=y(a.c,a.a[0],a.X,a.W)),!u(a.a[0],b,a.W))return!0}else if(a.K){var c=a.methodName,d=a.a,e=b.plugins_.get(a.K);e[c].apply(e,d)}else b[a.methodName].apply(b,a.a)}}catch(g){}};var N=function(a){J(1);Z.D.apply(Z,[arguments])};N.h={};N.P=[];N.L=0;N.ya=0;N.answer=42;var we=[Na,W,V];N.create=function(a){var b=za(we,[].slice.call(arguments));b[V]||(b[V]="t0");var c=""+b[V];if(N.h[c])return N.h[c];if(da(b))return null;b=new pc(b);N.h[c]=b;N.P.push(b);c=qc().tracker_created;if(ea(c))try{c(b)}catch(d){}return b};N.remove=function(a){for(var b=0;b<N.P.length;b++)if(N.P[b].get(V)==a){N.P.splice(b,1);N.h[a]=null;break}};N.j=function(a){return N.h[a]};N.getAll=function(){return N.P.slice(0)};
N.N=function(){"ga"!=gb&&J(49);var a=O[gb];if(!a||42!=a.answer){N.L=a&&a.l;N.ya=1*new Date;N.loaded=!0;var b=O[gb]=N;X("create",b,b.create);X("remove",b,b.remove);X("getByName",b,b.j,5);X("getAll",b,b.getAll,6);b=pc.prototype;X("get",b,b.get,7);X("set",b,b.set,4);X("send",b,b.send);X("requireSync",b,b.ma);b=Ya.prototype;X("get",b,b.get);X("set",b,b.set);if("https:"!=M.location.protocol&&!Ba){a:{b=M.getElementsByTagName("script");for(var c=0;c<b.length&&100>c;c++){var d=b[c].src;if(d&&0==d.indexOf(bd(!0)+
"/analytics")){b=!0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};N.da=function(){for(var a=N.getAll(),b=0;b<a.length;b++)a[b].get(V)};var Ge=N.N,He=O[gb];He&&He.r?Ge():z(Ge);z(function(){Z.D(["provide","render",ua])});})(window);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

View File

@@ -14,7 +14,7 @@ const { Env, Config } = Mixly;
const { SOFTWARE } = Config;
/**
* 获取当前mixly2.0的路径
* 获取当前mixly的路径
* @type {String}
*/
Env.clientPath = null;

View File

@@ -311,6 +311,7 @@
<div class="layui-input-block layui-row layui-col-space10">
<select class="setting-menu-item" value="blockRenderer" lay-ignore>
<option value="geras">geras</option>
<option value="thrasos">thrasos</option>
<option value="zelos">zelos</option>
</select>
</div>

View File

@@ -18,9 +18,11 @@
}
},
"webSocket": {
"url": "",
"enabled": false
},
"webCompiler": {
"url": "",
"enabled": false
},
"behaviorRecord": {