diff --git a/mixly/boards/default_src/python_mixpy/.npmignore b/mixly/boards/default_src/python_mixpy/.npmignore new file mode 100644 index 00000000..21ab2a3e --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/.npmignore @@ -0,0 +1,3 @@ +node_modules +build +origin \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/ai.js b/mixly/boards/default_src/python_mixpy/blocks/ai.js new file mode 100644 index 00000000..607f45e1 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/ai.js @@ -0,0 +1,370 @@ +import * as Blockly from 'blockly/core'; + +const AI_HUE = 205; + +export const AI_ChooseAndGet = { + init: function () { + this.setColour(AI_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_CHOOSE_AND_GET) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_CHOOSE_AND_GET_ONE_FILE_NAME, "getOneFile"], + [Blockly.Msg.MIXLY_CHOOSE_AND_GET_MANY_FILE_NAMES, "getManyFiles"], + [Blockly.Msg.MIXLY_CHOOSE_AND_GET_DIR, "getDirectory"] + ]), 'TYPE'); + this.setInputsInline(true); + this.setOutput(true); + } +} + +export const AI_client = { + init: function () { + this.setColour(AI_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_SETUP) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_AipImageClassify, "AipImageClassify"], + [Blockly.Msg.MIXLY_AipSpeech, "AipSpeech"], + [Blockly.Msg.MIXLY_AipImageCensor, "AipImageCensor"], + [Blockly.Msg.MIXLY_AipFace, "AipFace"], + [Blockly.Msg.MIXLY_AipOcr, "AipOcr"], + [Blockly.Msg.MIXLY_AipNlp, "AipNlp"] + ]), 'CTYPE') + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('API_KEY') + .appendField('API_KEY') + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('SECRET_KEY') + .appendField('SECRET_KEY') + .setAlign(Blockly.inputs.Align.RIGHT); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const AI_Speech_synthesis = { // AI_TYPE_FUNC + init: function () { + this.setColour(AI_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_AipSpeech_synthesis) + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('STR') + .appendField(Blockly.Msg.OLED_STRING) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ATTR') + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setTooltip(Blockly.Msg.MIXLY_AipSpeech_synthesis_TOOLTIP) + this.setInputsInline(false); + this.setOutput(true); + } +}; + +export const AI_Speech_asr = { // AI_TYPE_FUNC + init: function () { + this.setColour(AI_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_AipSpeech_asr) + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('FILE') + .appendField(Blockly.Msg.MIXLY_AipSpeech_File) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ATTR') + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setTooltip(Blockly.Msg.MIXLY_AipSpeech_ASR_TOOLTIP) + this.setInputsInline(false); + this.setOutput(true); + } +}; + +export const AI_ImageClassify = { // AI_TYPE_FUNC + init: function () { + this.setColour(AI_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_AipImageClassify) + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('FUNC') + .appendField(Blockly.Msg.MIXLY_AIP_FUNC) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ADDR') + .appendField(Blockly.Msg.MIXLY_AipImageClassify_Image) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ATTR') + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setTooltip(Blockly.Msg.MIXLY_AipImageClassify_advancedGeneral_TOOLTIP) + this.setInputsInline(false); + this.setOutput(true); + } +}; + + +export const AI_ImageClassify_Func = { + init: function () { + this.setColour(AI_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_AipImageClassify_advancedGeneral, "advancedGeneral"], + [Blockly.Msg.MIXLY_AipImageClassify_dishDetect, "dishDetect"], + [Blockly.Msg.MIXLY_AipImageClassify_carDetect, "carDetect"], + [Blockly.Msg.MIXLY_AipImageClassify_animalDetect, "animalDetect"], + [Blockly.Msg.MIXLY_AipImageClassify_plantDetect, "plantDetect"], + [Blockly.Msg.MIXLY_AipImageClassify_logoSearch, "logoSearch"] + ]), 'TYPE') + this.setOutput(true); + } +}; + +export const AI_Face_match = { // AI_TYPE_FUNC + init: function () { + this.setColour(AI_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_AipFace_match) + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_AipImageClassify_Image + '1' + Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('VAR2') + .appendField(Blockly.Msg.MIXLY_AipImageClassify_Image + '2' + Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ATTR') + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setTooltip(Blockly.Msg.MIXLY_AipFace_match_TOOLTIP) + this.setInputsInline(false); + this.setOutput(true); + } +}; + +export const AI_Ocr = { // AI_TYPE_FUNC + init: function () { + this.setColour(AI_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_AipOcr) + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('FUNC') + .appendField(Blockly.Msg.MIXLY_AIP_FUNC) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ADDR') + .appendField(Blockly.Msg.MIXLY_AipImageClassify_Image) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ATTR') + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setTooltip(Blockly.Msg.MIXLY_AipOcr_TOOLTIP) + this.setInputsInline(false); + this.setOutput(true); + } +}; + + +export const AI_Ocr_Func = { + init: function () { + this.setColour(AI_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_AipOcr_basicGeneral, "basicGeneral"], + [Blockly.Msg.MIXLY_AipOcr_webImage, "webImage"], + [Blockly.Msg.MIXLY_AipOcr_idcard, "idcard"], + [Blockly.Msg.MIXLY_AipOcr_bankcard, "bankcard"], + [Blockly.Msg.MIXLY_AipOcr_drivingLicense, "drivingLicense"], + [Blockly.Msg.MIXLY_AipOcr_vehicleLicense, "vehicleLicense"], + [Blockly.Msg.MIXLY_AipOcr_licensePlate, "licensePlate"], + [Blockly.Msg.MIXLY_AipOcr_businessLicense, "businessLicense"], + [Blockly.Msg.MIXLY_AipOcr_receipt, "receipt"], + [Blockly.Msg.MIXLY_AipOcr_trainTicket, "trainTicket"], + [Blockly.Msg.MIXLY_AipOcr_taxiReceipt, "taxiReceipt"], + [Blockly.Msg.MIXLY_AipOcr_form, "tableRecognition"], + [Blockly.Msg.MIXLY_AipOcr_vatInvoice, "vatInvoice"], + [Blockly.Msg.MIXLY_AipOcr_passport, "passport"], + [Blockly.Msg.MIXLY_AipOcr_handwriting, "handwriting"] + ]), 'TYPE') + this.setOutput(true); + } +}; + +export const AI_Nlp = { // AI_TYPE_FUNC + init: function () { + this.setColour(AI_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_AipNlp) + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('FUNC') + .appendField(Blockly.Msg.MIXLY_AIP_FUNC) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('STR') + .appendField(Blockly.Msg.OLED_STRING) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ATTR') + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setTooltip(Blockly.Msg.MIXLY_AipNlp_TOOLTIP) + this.setInputsInline(false); + this.setOutput(true); + } +}; + +export const AI_Nlp_Sim = { // AI_TYPE_FUNC + init: function () { + this.setColour(AI_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_AipNlp_Sim) + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('FUNC') + .appendField(Blockly.Msg.MIXLY_AIP_FUNC) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('STR1') + .appendField(Blockly.Msg.OLED_STRING + '1') + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('STR2') + .appendField(Blockly.Msg.OLED_STRING + '2') + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ATTR') + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setTooltip(Blockly.Msg.MIXLY_AipNlp_Sim_TOOLTIP) + this.setInputsInline(false); + this.setOutput(true); + } +}; + +export const AI_Nlp_Func = { + init: function () { + this.setColour(AI_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_AipNlp_lexer, "lexer"], + [Blockly.Msg.MIXLY_AipNlp_depParser, "depParser"], + [Blockly.Msg.MIXLY_AipNlp_wordEmbedding, "wordEmbedding"], + [Blockly.Msg.MIXLY_AipNlp_dnnlm, "dnnlm"], + [Blockly.Msg.MIXLY_AipNlp_commentTag, "commentTag"], + [Blockly.Msg.MIXLY_AipNlp_sentimentClassify, "sentimentClassify"], + [Blockly.Msg.MIXLY_AipNlp_keyword, "keyword"], + [Blockly.Msg.MIXLY_AipNlp_topic, "topic"], + [Blockly.Msg.MIXLY_AipNlp_ecnet, "ecnet"], + [Blockly.Msg.MIXLY_AipNlp_emotion, "emotion"] + ]), 'TYPE') + this.setOutput(true); + } +}; + +export const AI_Nlp_Func_sim = { + init: function () { + this.setColour(AI_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_AipNlp_wordSimEmbedding, "wordSimEmbedding"], + [Blockly.Msg.MIXLY_AipNlp_simnet, "simnet"] + ]), 'TYPE') + this.setOutput(true); + } +}; + +export const AI_Nlp_Topic = { // AI_TYPE_FUNC + init: function () { + this.setColour(AI_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_AipNlp_topic) + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('STR1') + .appendField(Blockly.Msg.MIXLY_AipNlp_Topic_Title) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('STR2') + .appendField(Blockly.Msg.MIXLY_AipNlp_Topic_Content) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setTooltip(Blockly.Msg.MIXLY_AipNlp_Topic_TOOLTIP) + this.setInputsInline(false); + this.setOutput(true); + } +}; + +export const AI_Nlp_newsSummary = { // AI_TYPE_FUNC + init: function () { + this.setColour(AI_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_AipNlp_summary) + .appendField(Blockly.Msg.MIXLY_Client) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('STR') + .appendField(Blockly.Msg.MIXLY_AipNlp_Topic_Content) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('LEN') + .appendField(Blockly.Msg.MIXLY_LIST_LEN) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('ATTR') + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setTooltip(Blockly.Msg.MIXLY_AipNlp_Summary_TOOLTIP) + this.setInputsInline(false); + this.setOutput(true); + } +}; + + +// [Blockly.Msg.MIXLY_AipNlp_topic, "topic"] +// [Blockly.Msg.MIXLY_AipNlp_keyword, "keyword"] + +export const AI_audio = { + init: function () { + this.setColour(AI_HUE); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.MIXPY_AI_AUDIO); + this.appendValueInput("TIME") + .appendField(Blockly.Msg.MIXPY_AI_AUDIO_TIME); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXPY_AI_AUDIO_TOOLTIP); + } +}; + +export const AI_photo = { + init: function () { + this.setColour(AI_HUE); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.MIXPY_AI_PHOTO); + this.appendValueInput("BUT") + .appendField(Blockly.Msg.MIXPY_AI_PHOTO_BUTTON); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXPY_AI_PHOTO_TOOLTIP); + } +}; + +export const AI_result = { + /** + * Block for negation. + * @this Blockly.Block + */ + init: function () { + + this.setColour(AI_HUE); + + this.appendValueInput('AI') + .appendField(Blockly.Msg.MIXPY_AI_RESULT) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_AipImageClassify, "Image"], + [Blockly.Msg.MIXLY_AipSpeech_asr, "Speech"], + [Blockly.Msg.MIXLY_AipFace_match, "Face"], + [Blockly.Msg.MIXLY_AipOcr, "Ocr"], + [Blockly.Msg.MIXLY_AipNlp_simnet, "OcrSimilarity"], + [Blockly.Msg.MIXLY_AipNlp_sentimentClassify, "Emotion"], + ]), 'CTYPE') + + this.setOutput(true); + this.setTooltip(Blockly.Msg.LOGIC_NEGATE_TOOLTIP); + } +}; diff --git a/mixly/boards/default_src/python_mixpy/blocks/algorithm.js b/mixly/boards/default_src/python_mixpy/blocks/algorithm.js new file mode 100644 index 00000000..f81b5c2f --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/algorithm.js @@ -0,0 +1,835 @@ +import * as Blockly from 'blockly/core'; + +const ALGORITHM_HUE = '#526FC3'; + +// sub_algorithm_1 + +export const algorithm_prepare = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PREPARE); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_add_school = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_ADD_SCHOOL); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_find_path = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_FIND_PATH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_new_path = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NEW_PATH); + this.setOutput(true); + } +} + +export const algorithm_set_path = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_SET_PATH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_add_path = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_ADD_PATH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_del_path = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_DEL_PATH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_return_path = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_RETURN_PATH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_no_left = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NO_LEFT); + this.setOutput(true); + } +} + +export const algorithm_print_path = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PRINT_PATH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +// sub_algorithm_2 + +export const algorithm_prepare2 = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PREPARE2); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_current_school = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_CURRENT_SCHOOL); + this.setOutput(true); + } +} + +export const algorithm_no_path = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NO_PATH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +// sub_algorithm_3 + +export const algorithm_prepare_2_1 = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PREPARE_2_1); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_prepare_2_2 = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PREPARE_2_2); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_move_recent = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_MOVE_RECENT); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_not_home = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NOT_HOME); + this.setOutput(true); + } +}; + +export const algorithm_not_school = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NOT_SCHOOL); + this.setOutput(true); + } +}; + +export const algorithm_print_path2 = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PRINT_PATH2); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +// sub_algorithm_4 hanoi + +export const hanoi_init = { + init: function () { + this.appendDummyInput() + .appendField("准备") + .appendField(new Blockly.FieldNumber(3, 0, 100, 1), "NUM") + .appendField("层汉诺塔"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const hanoi_move = { + init: function () { + this.appendDummyInput() + .appendField("移动圆盘从"); + this.appendValueInput("FROM_NUM") + .setCheck(null) + .appendField("柱"); + this.appendDummyInput() + .appendField("到"); + this.appendValueInput("TO_NUM") + .setCheck(null) + .appendField("柱"); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +// sub_algorithm_5 + +export const algorithm_all_books = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_ALL_BOOKS); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_all_books_sequence = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_ALL_BOOKS2); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_first_book = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_FIRST_BOOK); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +// export const algorithm_no_ring = { +// init: function() { +// this.setColour(ALGORITHM_HUE); +// this.appendDummyInput() +// .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NO_RING); +// this.setOutput(true); +// } +// } + +export const algorithm_no_ring2 = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NO_RING); + this.setOutput(true); + } +}; + +export const algorithm_yes_ring2 = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_YES_RING); + this.setOutput(true); + } +}; + +export const algorithm_next_book = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NEXT_BOOK); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_two_left = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_TWO_LEFT); + this.setOutput(true); + } +} + +export const algorithm_divide_books = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_DIVIDE_BOOKS); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_get_half_books = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_GET_HALF_BOOKS); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +// export const algorithm_check_half_books = { +// init: function() { +// this.setColour(ALGORITHM_HUE); +// this.appendDummyInput() +// .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_CHECK_HALF_BOOKS); +// this.setPreviousStatement(true, null); +// this.setNextStatement(true, null); +// } +// }; + +export const algorithm_delete_book = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_DELETE_BOOK); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_delete_books = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_DELETE_BOOKS); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_delete_books2 = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_DELETE_BOOKS2); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +// export const algorithm_print_book = { +// init: function() { +// this.setColour(ALGORITHM_HUE); +// this.appendDummyInput() +// .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PRINT_BOOK); +// this.setPreviousStatement(true, null); +// this.setNextStatement(true, null); +// } +// }; + +export const algorithm_print_book2 = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PRINT_BOOK); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +// sub_algorithm_6 + +export const algorithm_book_scale = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("设置待查书总数 N=") + .appendField(new Blockly.FieldDropdown([ + ["5", "5"], + ["10", "10"], + ["20", "20"], + ["50", "50"] + ]), "NUM"); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_number_zero = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NUMBER_ZERO); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_number_add = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_NUMBER_ADD); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_print_number = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PRINT_NUMBER); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_get_book_num = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField('n' + Blockly.Msg.MIXLY_VALUE2) + .appendField(new Blockly.FieldTextInput('50'), 'NUM'); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_print_sequence = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PRINT_SEQUENCE); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_print_divide = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_PRINT_DIVIDE); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +// sub_algorithm_7 + +export const algorithm_init_jttl = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("初始化鸡兔同笼问题:"); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("有若干只鸡、兔在同一个笼子里。"); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("从上面数鸡兔有10个头,"); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("从下面数鸡兔有32只脚。"); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("问笼中有多少只鸡和多少只兔?"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_rabbit_zero = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("假设兔子的数量为0只"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_rabbit_number_in_range = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("兔子的数量在范围之内"); + this.setOutput(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_chick_calculate = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("根据(头数-兔子数)计算出鸡的数量"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_check_feet = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("计算得到脚的数量正确"); + this.setOutput(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_print_jttl_answer = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("输出鸡、兔的数量"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_rabbit_add = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("假设兔子数量要更多一只"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +// sub_algorithm_8 + +export const algorithm_init_fzsf = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("加载路线图"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_fz_calc = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("计算") + .appendField(new Blockly.FieldDropdown([ + ["S1", "1"], + ["S2", "2"], + ["S3", "3"], + ["S4", "4"] + ]), "PATHNAME") + .appendField("长度"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_fz_calc_first_min = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("设置S1为Smin"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_fz_compare = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField(new Blockly.FieldDropdown([ + ["S1", "1"], + ["S2", "2"], + ["S3", "3"], + ["S4", "4"] + ]), "PATHNAME") + .appendField("的长度比") + .appendField(new Blockly.FieldDropdown([ + ["S1", "1"], + ["S2", "2"], + ["S3", "3"], + ["S4", "4"] + ]), "PATHNAME2") + .appendField("短"); + this.setOutput(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_fz_set_min = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("设置") + .appendField(new Blockly.FieldDropdown([ + ["S1", "1"], + ["S2", "2"], + ["S3", "3"], + ["S4", "4"] + ]), "PATHNAME") + .appendField("为Smin"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_fz_move = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("按照Smin移动"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +// sub_algorithm_8 + +export const algorithm_init_hxdb = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("初始化韩信点兵问题:"); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("有未知数量的若干士兵。"); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("若3人一排列队,多1人;"); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("若5人一排列队,多2人;"); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("若7人一排列队,多2人;"); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("问士兵的数量最少是多少人?"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_hxdb_init_soldier = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("初始化士兵为") + .appendField(new Blockly.FieldTextInput("7"), "NUM") + .appendField("个"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_hxdb_stand_in_line = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("使士兵") + .appendField(new Blockly.FieldDropdown([ + ["3", "3"], + ["5", "5"], + ["7", "7"] + ]), "NUM") + .appendField("人一排列队"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_hxdb_last_line = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("剩余") + .appendField(new Blockly.FieldTextInput("1"), "NUM") + .appendField("个士兵"); + this.setOutput(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_hxdb_add = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("增加1个士兵"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_hxdb_result = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.LEFT) + .appendField("输出士兵数量"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +// others + +export const hanoi_init_offline = { + init: function () { + this.appendDummyInput() + .appendField("准备") + .appendField(new Blockly.FieldNumber(3, 0, 100, 1), "NUM") + .appendField("层汉诺塔"); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.HTML_COLOUR); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(ALGORITHM_HUE); + this.setInputsInline(true); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +export const algorithm_get_current_location = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_GET_CURRENT_LOCATION); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const algorithm_void_path = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MIXPY_ALGORITHM_VOID_PATH); + this.setOutput(true); + } +} + +export const algorithm_color_seclet = { + init: function () { + this.setColour(ALGORITHM_HUE); + this.appendDummyInput("") + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(new Blockly.FieldColour("ff0000"), "COLOR"); + this.setInputsInline(true); + this.setOutput(true, String); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/communicate.js b/mixly/boards/default_src/python_mixpy/blocks/communicate.js new file mode 100644 index 00000000..ad9ab542 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/communicate.js @@ -0,0 +1,121 @@ +import * as Blockly from 'blockly/core'; + +const COMMUNICATE_HUE = '#3288dd'; //'#3288dd'; + +export const requests_get_old = { + init: function () { + this.setColour(COMMUNICATE_HUE); + this.appendValueInput("DOMAIN") + .appendField(Blockly.Msg.DISPLAY_IMAGE_LET2) + .setCheck(String); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_REQUESTS_GET) + .appendField(new Blockly.FieldTextInput('response'), 'VAR') + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.blockpy_REQUESTS_GET_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +export const requests_get = { + init: function () { + this.setColour(COMMUNICATE_HUE); + this.appendValueInput("URL") + .appendField(Blockly.Msg.DISPLAY_IMAGE_LET2) + .setCheck(String); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_CONDUCT) + .appendField(new Blockly.FieldDropdown([["get", "get"], ["head", "head"], ["delete", "delete"]]), 'TYPE') + .appendField(Blockly.Msg.blockpy_REQUESTS) + .appendField(Blockly.Msg.MIXPY_REQUESTS_GET_RESULT) + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(""); + }, +} + +export const requests_post = { + init: function () { + this.setColour(COMMUNICATE_HUE); + this.appendValueInput("URL") + .appendField(Blockly.Msg.DISPLAY_IMAGE_LET2) + .setCheck(String); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_CONDUCT) + .appendField(new Blockly.FieldDropdown([["post", "post"], ["put", "put"], ["patch", "patch"]]), 'TYPE') + .appendField(Blockly.Msg.blockpy_REQUESTS) + this.appendValueInput("data") + .appendField(Blockly.Msg.blockpy_REQUESTS + Blockly.Msg.OLED_STRING) + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXPY_REQUESTS_GET_RESULT) + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(""); + }, +} + + +export const requests_attribute = { + init: function () { + this.appendValueInput('VAL') + + var attr = [ + [Blockly.Msg.blockpy_REQUESTS_GET_ATTR_STATUS_CODE, 'status_code'], [Blockly.Msg.blockpy_REQUESTS_GET_ATTR_TEXT, 'text'], + [Blockly.Msg.blockpy_REQUESTS_GET_ATTR_COOKIES, 'cookies'], [Blockly.Msg.blockpy_REQUESTS_GET_ATTR_CONTENT, 'content'], + [Blockly.Msg.MIXPY_TEXT_ENCODE, 'encoding'] + ]; + this.setColour(COMMUNICATE_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET) + .appendField(new Blockly.FieldDropdown(attr), 'ATTR') + + this.setInputsInline(true); + this.setOutput(true, String); + } +}; + + + +export const requests_method = { + init: function () { + this.appendValueInput("VAR") + .appendField(Blockly.Msg.DISPLAY_IMAGE_LET2) + .setCheck(String); + var method = [ + ['post', 'post'], ['put', 'put'], + ['delete', 'delete'], ['head', 'head'], + ['option', 'option'] + ]; + this.setColour(COMMUNICATE_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_CONDUCT) + .appendField(new Blockly.FieldDropdown(method), 'DIR') + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_REQUESTS) + + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'forward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + 'backward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + }; + return TOOLTIPS[mode]; + }); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/cv.js b/mixly/boards/default_src/python_mixpy/blocks/cv.js new file mode 100644 index 00000000..76b58b25 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/cv.js @@ -0,0 +1,206 @@ +import * as Blockly from 'blockly/core'; + +const CV_HUE = "f0a559"; + +export const cv_read_image = { + init: function () { + this.setColour(CV_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_CV_IMREAD); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true); + } +}; + +export const cv_show_image = { + init: function () { + this.setColour(CV_HUE); + this.appendValueInput("FILE") + .appendField(Blockly.Msg.OLED_BITMAP); + this.appendValueInput('data') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_AipNlp_Topic_Title); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + } +} + +export const cv_write_image = { + init: function () { + this.setColour(CV_HUE); + this.appendValueInput("FILE") + .appendField(Blockly.Msg.MIXLY_CV_IMWRITE); + this.appendValueInput('data') + .setCheck(String) + .appendField(Blockly.Msg.HTML_NAME); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + } +} + +export const cv_waitkey = { + init: function () { + this.setColour(CV_HUE); + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_DELAY); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MILLIS + Blockly.Msg.MIXLY_CV_OR_PRESS) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_CV_WAITKEY_TOOLTIP) + } +} + +export const cv_destroy_all = { + init: function () { + this.setColour(CV_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_CV_DESTROY_ALL) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + } +} + +export const cv_line_rect = { + init: function () { + this.setColour(CV_HUE); + this.appendValueInput("FILE") + .appendField(Blockly.Msg.MIXLY_MICROBIT_IMAGE); + var line_rect = + [[Blockly.Msg.MIXLY_CV_RECT, 'rectangle'], [Blockly.Msg.MIXLY_CV_LINE, 'line']]; + + this.appendValueInput('x1') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_DISPLAY_DRAW) + .appendField(new Blockly.FieldDropdown(line_rect), 'DIR') + .appendField(Blockly.Msg.MIXLY_CV_DRAWLINE_BEGIN + '(x1') + this.appendValueInput('y1') + .setCheck(Number) + .appendField(',y1'); + this.appendValueInput('x2') + .setCheck(Number) + .appendField(') ' + Blockly.Msg.MIXLY_CV_DRAWLINE_END + '(x2'); + this.appendValueInput('y2') + .setCheck(Number) + .appendField(',y2'); + this.appendDummyInput() + .appendField(') ' + Blockly.Msg.MIXLY_CV_DRAWLINE_COLOR) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.appendValueInput('thick') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_CV_DRAWLINE_THICKNESS); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_CV_DRAWLINE_RECT_TOOLTIP) + } +} + +export const cv_text = { + init: function () { + this.setColour(CV_HUE); + this.appendValueInput("FILE") + .appendField(Blockly.Msg.MIXLY_MICROBIT_IMAGE); + var font = + [['SIMPLEX', 'SIMPLEX'], ['PLAIN', 'PLAIN'], ['DUPLEX', 'DUPLEX'], ['COMPLEX', 'COMPLEX'], ['COMPLEX_SMALL', 'COMPLEX_SMALL'], ['TRIPLEX', 'TRIPLEX'], ['SCRIPT_SIMPLEX', 'SCRIPT_SIMPLEX'], ['SCRIPT_COMPLEX', 'SCRIPT_COMPLEX'],]; + this.appendValueInput('data') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_CV_DRAWTEXT); + this.appendValueInput('x1') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_CV_DRAWLINE_BEGIN + '(x1') + this.appendValueInput('y1') + .setCheck(Number) + .appendField(',y1'); + this.appendDummyInput() + .appendField(') ' + Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NAME) + .appendField(new Blockly.FieldDropdown(font), 'font'); + this.appendValueInput('size') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.appendDummyInput() + .appendField(') ' + Blockly.Msg.MIXLY_CV_DRAWLINE_COLOR) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.appendValueInput('thick') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_CV_DRAWLINE_THICKNESS); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_CV_DRAWLINE_RECT_TOOLTIP) + } +} + +export const cv_face_classifier = { + init: function () { + this.setColour(CV_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_CV_FACE_CLASSIFIER); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true); + } +}; + +export const cv_face_detect = { + init: function () { + this.setColour(CV_HUE); + this.appendValueInput("FILE") + .appendField(Blockly.Msg.MIXLY_MICROBIT_IMAGE); + this.appendValueInput("FACE") + .appendField(Blockly.Msg.MIXLY_CV_FACE_DETECT); + this.appendValueInput('SCALE') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_CV_FACE_DETECT_SCALE) + this.appendValueInput('NEIGHBOR') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_CV_FACE_DETECT_NEIGHBOR) + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true); + } +}; + +export const cv_face_detect_all = { + init: function () { + this.setColour(CV_HUE); + this.appendValueInput("FILE") + .appendField(Blockly.Msg.MIXLY_MICROBIT_IMAGE); + this.appendValueInput("FACE") + .appendField(Blockly.Msg.MIXLY_CV_FACE_DETECT); + this.appendValueInput('SCALE') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_CV_FACE_DETECT_SCALE) + this.appendValueInput('NEIGHBOR') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_CV_FACE_DETECT_NEIGHBOR) + this.appendValueInput('x1') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_CV_FACE_DETECT_RANGE) + .appendField(Blockly.Msg.blockpy_TUPLE_MIN) + this.appendValueInput('y1') + .setCheck(Number) + .appendField('×') + this.appendValueInput('x2') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_TUPLE_MAX) + this.appendValueInput('y2') + .setCheck(Number) + .appendField('×') + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/data.js b/mixly/boards/default_src/python_mixpy/blocks/data.js new file mode 100644 index 00000000..68b9ab7e --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/data.js @@ -0,0 +1,1570 @@ +import * as Blockly from 'blockly/core'; + +const DATA_HUE = 170//'#5ec73d'//195; + +export const series_create = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_series_create) + .appendField(new Blockly.FieldTextInput('ser1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_series_create_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const series_create_from_index = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_series_create) + .appendField(new Blockly.FieldTextInput('ser1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.appendValueInput('INDEX') + .setCheck([String, 'List']) + .appendField(Blockly.Msg.blockpy_series_set_index) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_series_create_index_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const dataframe_create = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_dataframe_create) + .appendField(new Blockly.FieldTextInput('df1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_dataframe_create_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const dataframe_create_from_one_index = { + init: function () { + this.setColour(DATA_HUE); + var column_raw = + [[Blockly.Msg.DATAFRAME_RAW, 'index'], [Blockly.Msg.DATAFRAME_COLUMN, 'columns']]; + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_dataframe_create) + .appendField(new Blockly.FieldTextInput('df1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(column_raw), 'COLUMN_RAW') + this.appendValueInput('INDEX') + .setCheck([String, 'List']) + .appendField(Blockly.Msg.blockpy_series_set_index) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_dataframe_create_index_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const dataframe_create_from_index = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_dataframe_create) + .appendField(new Blockly.FieldTextInput('df1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.appendValueInput('INDEX_COLUMN') + .setCheck([String, 'List']) + .appendField(Blockly.Msg.blockpy_dataframe_set_index_column) + this.appendValueInput('INDEX_RAW') + .setCheck([String, 'List']) + .appendField(Blockly.Msg.blockpy_dataframe_set_index_raw) + this.setPreviousStatement(true); + this.setNextStatement(true); + //this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_dataframe_create_index_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const series_create_from_text = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(new Blockly.FieldTextInput('ser1'), 'VAR') + + .appendField(' = [') + .appendField(new Blockly.FieldTextInput('1,2,3'), 'TEXT') + .appendField(']'); + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SERIES_CREATE_FROM_TEXT); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const series_index_value = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DATA_HUE); + var index_value = + [[Blockly.Msg.SERIES_INDEX, 'index'], [Blockly.Msg.HTML_VALUE, 'value']]; + this.appendValueInput('SERIES') + .setCheck('Series') + this.appendDummyInput("") + .appendField(Blockly.Msg.SERIES_INDEX_VALUE) + .appendField(new Blockly.FieldDropdown(index_value), 'INDEX_VALUE') + + this.setOutput(true, 'List'); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('INDEX_VALUE'); + var TOOLTIPS = { + 'index': Blockly.Msg.SERIES_INDEX_TOOLTIP, + 'value': Blockly.Msg.HTML_VALUE_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const series_get_num = { + init: function () { + this.setColour(DATA_HUE); + //this.setOutput(true, Number); + this.setOutput(true); + this.appendValueInput('SER') + .setCheck('Series') + this.appendValueInput('AT') + .setCheck(Number) + .appendField(Blockly.Msg.LANG_LISTS_GET_INDEX1); + this.appendDummyInput("") + .appendField(Blockly.Msg.LANG_LISTS_GET_INDEX2); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.TUPLE_GET_INDEX_TOOLTIP); + } +}; + +export const pl_plot_easy = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('SER') + .setCheck('Series') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_plot = { + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + + this.appendValueInput('SER') + .setCheck('Series') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new Blockly.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_show = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_SHOW); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_axes = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.mixpy_PL_AXES); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_legend = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_LEGEND); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_title = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_TITLE); + this.appendValueInput('TITLE') + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_label = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_SET_LABEL) + .appendField(new Blockly.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('LABEL') + .appendField(Blockly.Msg.blockpy_PYLAB_LABEL) + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // var thisBlock = this; + // this.setTooltip(function() { + // var mode = thisBlock.getFieldValue('DIR'); + // var TOOLTIPS = { + // 'x': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + // 'y': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + // }; + // return TOOLTIPS[mode]; + // }); + } +}; + +export const array_create = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('FROM') + .setCheck(Number) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_SPLITBYDOU) + .appendField(Blockly.Msg.MIXPY_DATA_ARRAY_CREATE_FROM); + this.appendValueInput('TO') + .setCheck(Number) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXPY_DATA_ARRAY_CREATE_TO); + this.appendValueInput('STEP') + .setCheck(Number) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_STEP); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + +export const pl_plot_bar = { + init: function () { + this.setColour(DATA_HUE); + var plot_bar = + [[Blockly.Msg.mixpy_PYLAB_PLOT_BAR_PLOT, 'plot'], [Blockly.Msg.mixpy_PYLAB_PLOT_BAR_BAR, 'bar']]; + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_DISPLAY_DRAW) + .appendField(new Blockly.FieldDropdown(plot_bar), 'DIR'); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'plot': Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP, + 'bar': Blockly.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const pl_plot_scatter = { + init: function () { + this.setColour(DATA_HUE); + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_SCATTER) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('S') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_NUMBER); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT'); + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(""); + } +}; + +export const pl_plot_xy = { + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""] + ]; + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_XY) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new Blockly.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR') + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const pl_bar = { + init: function () { + this.setColour(DATA_HUE); + var align = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.AILGN_EDGE, 'edge']]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_BAR) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('WIDTH') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_WIDTH); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_BAR_ALIGN) + .appendField(new Blockly.FieldDropdown(align), 'ALIGN') + this.appendDummyInput() + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldColour('#0000ff'), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const pl_pie = { + init: function () { + this.setColour(DATA_HUE); + var shadow = + [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'False'], [Blockly.Msg.mixpy_PL_PIE_SHADOW_Y, 'True']]; + var autopct = + [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'None'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z, '%.0f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_O, '%.1f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_T, '%.2f%%']]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PIE) + .appendField(Blockly.Msg.COLOUR_BLEND_RATIO); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.appendValueInput('EXPLODE') + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_EXPLODE); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT) + .appendField(new Blockly.FieldDropdown(autopct), 'autopct') + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_SHADOW) + .appendField(new Blockly.FieldDropdown(shadow), 'SHADOW') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const pl_hist = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_HIST) + .appendField(Blockly.Msg.MIXLY_SD_DATA); + this.appendValueInput('B') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_ticks = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SETTING) + .appendField(new Blockly.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS) + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE) + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_TICKS_TOOLTIP); + } +}; + +export const numpy_trig = { + /** + * Block for trigonometry operators. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = [ + ['sin', 'sin'], + ['cos', 'cos'], + ['tan', 'tan'], + ['arcsin', 'arcsin'], + ['arccos', 'arccos'], + ['arctan', 'arctan'], + [Blockly.Msg.LANG_MATH_TO_ROUND, 'round'], + [Blockly.Msg.LANG_MATH_TO_CEIL, 'ceil'], + [Blockly.Msg.LANG_MATH_TO_FLOOR, 'floor'] + ]; + this.setColour(DATA_HUE); + this.setOutput(true); + this.setInputsInline(true); + this.appendDummyInput() + .appendField(Blockly.Msg.mixpy_NUMPY_TRIG) + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); + this.setTooltip(Blockly.Msg.mixpy_NUMPY_TRIG_TOOLTIP); + } +}; + +export const pl_subplot = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('VET') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT) + .appendField(Blockly.Msg.mixpy_SUBPLOT_VERTICLE); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT_HORIZEN); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + +export const pandas_readcsv = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput("FILENAME") + .appendField(Blockly.Msg.MIXPY_PANDAS_READ_CSV); + this.appendDummyInput() + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.mixpy_PANDAS_READCSV_HEADER_Y, '0'], [Blockly.Msg.mixpy_PANDAS_READCSV_HEADER_N, 'None']]), 'MODE'); + this.appendDummyInput() + .appendField(Blockly.Msg.mixpy_PANDAS_READCSV_TITLE); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.mixpy_PANDAS_READCSV_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const dataframe_get = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendValueInput('KEY') + .appendField(Blockly.Msg.mixpy_DATAFRAME_GET) + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_DATAFRAME_GET_INDEX) + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.DATAFRAME_COLUMN, 'column'], [Blockly.Msg.DATAFRAME_RAW, 'raw']]), 'MODE') + this.setOutput(true); + this.setTooltip(Blockly.Msg.mixpy_DATAFRAME_GET_TOOLTIP); + } +}; + +export const pl_savefig = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PL_SAVEFIG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(Blockly.Msg.mixpy_PL_SAVEFIG_TOOLTIP); + } +}; + +export const pl_text = { + init: function () { + this.setColour(DATA_HUE); + var halign = + [[Blockly.Msg.TEXT_TRIM_LEFT, 'right'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.TEXT_TRIM_RIGHT, 'left']]; + var valign = + [[Blockly.Msg.mixpy_PL_TEXT_TOP, 'bottom'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.mixpy_PL_TEXT_BOTTOM, 'top']]; + this.appendValueInput('VET') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_SETTING) + .appendField(Blockly.Msg.mixpy_PL_TEXT_X); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_PL_TEXT_Y); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_PL_TEXT_TAG); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_TEXT_HOR) + .appendField(new Blockly.FieldDropdown(halign), 'HALIGN'); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_TEXT_VER) + .appendField(new Blockly.FieldDropdown(valign), 'VALIGN'); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PL_TEXT_TOOLTIP); + } +}; + +export const array_toarray = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_TOARRAY); + this.setOutput(true, 'List'); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOARRAY); + } +}; + +export const plot_plot_easy = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('SER') + .setCheck('Series') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_plot = { + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + + this.appendValueInput('SER') + .setCheck('Series') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new Blockly.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_show = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_SHOW); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_axes = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.mixpy_PL_AXES); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_legend = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_LEGEND); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_title = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_TITLE); + this.appendValueInput('TITLE') + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_label = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_SET_LABEL) + .appendField(new Blockly.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('LABEL') + .appendField(Blockly.Msg.blockpy_PYLAB_LABEL) + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // var thisBlock = this; + // this.setTooltip(function() { + // var mode = thisBlock.getFieldValue('DIR'); + // var TOOLTIPS = { + // 'x': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + // 'y': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + // }; + // return TOOLTIPS[mode]; + // }); + } +}; + +export const plot_plot_bar = { + init: function () { + this.setColour(DATA_HUE); + var plot_bar = + [[Blockly.Msg.mixpy_PYLAB_PLOT_BAR_PLOT, 'plot'], [Blockly.Msg.mixpy_PYLAB_PLOT_BAR_BAR, 'bar']]; + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_DISPLAY_DRAW) + .appendField(new Blockly.FieldDropdown(plot_bar), 'DIR'); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'plot': Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP, + 'bar': Blockly.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const plot_plot_scatter = { + init: function () { + this.setColour(DATA_HUE); + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_SCATTER) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('S') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_NUMBER); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT'); + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(""); + } +}; + +export const plot_plot_xy = { + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""] + ]; + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_XY) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new Blockly.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR') + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const plot_bar = { + init: function () { + this.setColour(DATA_HUE); + var align = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.AILGN_EDGE, 'edge']]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_BAR) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('WIDTH') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_WIDTH); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_BAR_ALIGN) + .appendField(new Blockly.FieldDropdown(align), 'ALIGN') + this.appendDummyInput() + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldColour('#0000ff'), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const plot_pie = { + init: function () { + this.setColour(DATA_HUE); + var shadow = + [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'False'], [Blockly.Msg.mixpy_PL_PIE_SHADOW_Y, 'True']]; + var autopct = + [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'None'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z, '%.0f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_O, '%.1f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_T, '%.2f%%']]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PIE) + .appendField(Blockly.Msg.COLOUR_BLEND_RATIO); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.appendValueInput('EXPLODE') + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_EXPLODE); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT) + .appendField(new Blockly.FieldDropdown(autopct), 'autopct') + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_SHADOW) + .appendField(new Blockly.FieldDropdown(shadow), 'SHADOW') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const plot_hist = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_HIST) + .appendField(Blockly.Msg.MIXLY_SD_DATA); + this.appendValueInput('B') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_ticks = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SETTING) + .appendField(new Blockly.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS) + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE) + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_TICKS_TOOLTIP); + } +}; + +export const plot_subplot = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('VET') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT) + .appendField(Blockly.Msg.mixpy_SUBPLOT_VERTICLE); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT_HORIZEN); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + +export const plot_savefig = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_SAVEFIG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(Blockly.Msg.mixpy_PL_SAVEFIG_TOOLTIP); + } +}; + +export const plot_text = { + init: function () { + this.setColour(DATA_HUE); + var halign = + [[Blockly.Msg.TEXT_TRIM_LEFT, 'right'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.TEXT_TRIM_RIGHT, 'left']]; + var valign = + [[Blockly.Msg.mixpy_PL_TEXT_TOP, 'bottom'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.mixpy_PL_TEXT_BOTTOM, 'top']]; + this.appendValueInput('VET') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_SETTING) + .appendField(Blockly.Msg.mixpy_PL_TEXT_X); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_PL_TEXT_Y); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_PL_TEXT_TAG); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_TEXT_HOR) + .appendField(new Blockly.FieldDropdown(halign), 'HALIGN'); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_TEXT_VER) + .appendField(new Blockly.FieldDropdown(valign), 'VALIGN'); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PL_TEXT_TOOLTIP); + } +}; + +export const numpy_shape = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取维度'); + this.setOutput(true); + this.setTooltip('Returns the shape of the array.'); + } +}; + +export const numpy_reshape = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('变形'); + this.appendValueInput('DIMENSIONS') + .appendField('后维度为'); + this.setOutput(true); + this.setTooltip('Reshapes the array to the specified dimensions.'); + } +}; + +export const numpy_astype = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('把'); + this.appendDummyInput() + .appendField('转换为') + .appendField(new Blockly.FieldDropdown([ + ['uint8', 'numpy.uint8'], + ['int32', 'numpy.int32'], + ['float32', 'numpy.float32'], + ['float64', 'numpy.float64'] + // 可以根据需要添加更多的类型 + ]), 'TYPE'); + this.setOutput(true); + this.setTooltip('Converts array to specified type.'); + } +}; + +export const pylab_imshow = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('创建二维图'); + this.appendDummyInput() + .appendField('颜色') + .appendField(new Blockly.FieldDropdown([ + ['gray', 'gray'], + ['viridis', 'viridis'], + ['plasma', 'plasma'], + ['inferno', 'inferno'], + ['magma', 'magma'], + ['cividis', 'cividis'], + ['hot', 'hot'], + ['cool', 'cool'], + ['spring', 'spring'], + ['summer', 'summer'], + ['autumn', 'autumn'], + ['winter', 'winter'], + ['jet', 'jet'] + // 可以根据需要添加更多的类型 + ]), 'COLORMAP'); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip('Displays an image with the specified colormap.'); + } +}; + +export const numpy_mean_digit = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('X') + .appendField('从数据集'); + this.appendValueInput('Y') + .appendField('获取平均图像,标签'); + this.appendValueInput('DIGIT') + .appendField('为'); + this.setOutput(true); + this.setTooltip('Computes the mean of X where y equals the specified digit.'); + } +}; + +export const numpy_argmin_template_match = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('IMAGE') + .appendField('获取模板匹配结果,图片:'); + this.appendValueInput('TEMPLATES') + .appendField('模板:'); + this.setOutput(true); + this.setTooltip('Finds the index of the template that minimizes the sum of absolute differences with the image.'); + } +}; + +export const numpy_mean = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取平均值'); + this.appendDummyInput() + .appendField('沿着axis') + .appendField(new Blockly.FieldDropdown([ + ['None', 'NONE'], + ['0', '0'], + ['1', '1'] + ]), 'AXIS'); + this.setOutput(true); + this.setTooltip('Computes the mean of the array along the specified axis.'); + } +}; + +export const numpy_std = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取标准差'); + this.appendDummyInput() + .appendField('沿着axis') + .appendField(new Blockly.FieldDropdown([ + ['None', 'NONE'], + ['0', '0'], + ['1', '1'] + ]), 'AXIS'); + this.setOutput(true); + this.setTooltip('Computes the standard deviation of the array along the specified axis.'); + } +}; + +export const pandas_dropna = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DF') + .appendField('丢弃缺省值'); + this.setOutput(true); + this.setTooltip('Drops rows with NaN values from the dataframe.'); + } +}; + +export const pandas_drop_columns = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DATAFRAME') + .appendField('从数据集'); + this.appendValueInput('COLUMNS') + .appendField('中删除列') + .setCheck(String); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip('从数据框中删除指定的列。用逗号分隔多个列名。'); + }, +}; + +export const numpy_ones = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('NUM') + .appendField('生成单位行向量'); + this.setOutput(true); + this.setTooltip('Creates an array of ones with the specified length.'); + } +}; + +export const numpy_c_ = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY1') + .appendField('列拼接:数组1'); + this.appendValueInput('ARRAY2') + .appendField('数组2'); + this.setOutput(true); + this.setTooltip('Concatenates two arrays along the second axis using numpy.c_.'); + } +}; + +export const numpy_linalg_det = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取行列式'); + this.setOutput(true); + this.setTooltip('Computes the determinant of an array using numpy.linalg.det.'); + } +}; + +export const matrix_transpose = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('MATRIX') + .appendField('获取转置'); + this.setOutput(true); + this.setTooltip('Computes the transpose of the given matrix.'); + } +}; + +export const matrix_multiplication = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('MATRIX1'); + this.appendValueInput('MATRIX2') + .appendField('@'); + this.setOutput(true); + this.setTooltip('Multiplies two matrices.'); + } +}; + +export const numpy_linalg_inv = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取逆矩阵'); + this.setOutput(true); + this.setTooltip('Computes the inverse of the given matrix using numpy.linalg.inv.'); + } +}; + +export const dataframe_median = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DATAFRAME') + .appendField('获取中位数'); + this.setOutput(true); + this.setTooltip('Computes the median of the given dataframe.'); + } +}; + +export const dataframe_fillna = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DATAFRAME') + .appendField('填充缺失值'); + this.appendValueInput('VALUE') + .appendField('填充值'); + this.appendDummyInput() + .appendField('是否修改原数据') + .appendField(new Blockly.FieldDropdown([ + ['True', 'True'], + ['False', 'False'] + ]), 'INPLACE'); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip('Fills NaN values in the dataframe with the specified value.'); + } +}; + +export const dataframe_info = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DATAFRAME') + .appendField('获取DataFrame信息'); + this.setOutput(true); + this.setTooltip('Displays information about the DataFrame.'); + } +}; + +export const numpy_min = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取最小值'); + this.appendDummyInput() + .appendField('沿着axis') + .appendField(new Blockly.FieldDropdown([ + ['None', 'None'], + ['行', '0'], + ['列', '1'] + ]), 'AXIS'); + this.setOutput(true); + this.setTooltip('Returns the minimum value along the specified axis.'); + } +}; + +export const numpy_max = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取最大值'); + this.appendDummyInput() + .appendField('沿着axis') + .appendField(new Blockly.FieldDropdown([ + ['None', 'None'], + ['行', '0'], + ['列', '1'] + ]), 'AXIS'); + this.setOutput(true); + this.setTooltip('Returns the maximum value along the specified axis.'); + } +}; + +export const numpy_size = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取数组大小'); + this.setOutput(true); + this.setTooltip('Returns the size of the array.'); + } +}; + +export const numpy_dot = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY1') + .appendField('点乘数组1'); + this.appendValueInput('ARRAY2') + .appendField('点乘数组2'); + this.setOutput(true); + this.setTooltip('Returns the dot product of two arrays.'); + } +}; + +export const numpy_square = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取平方数组'); + this.setOutput(true); + this.setTooltip('Returns the element-wise square of the array.'); + } +}; + +export const numpy_sum = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('获取数组元素和'); + this.setOutput(true); + this.setTooltip('Returns the sum of the array.'); + } +}; + +export const numpy_random_random = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('SIZE') + .appendField('生成随机数组'); + this.setOutput(true); + this.setTooltip('Returns a random array of the specified size.'); + } +}; + +export const py_sum = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('ARRAY') + .appendField('Python求和'); + this.setOutput(true); + this.setTooltip('Returns the sum of the iterable.'); + } +}; + +export const dataframe_sort_values = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DICT') + .setAlign(Blockly.inputs.Align.RIGHT) + .setCheck('Dict'); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('值排序'); + this.appendValueInput('KEY') + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('标签'); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('排序方式') + .appendField(new Blockly.FieldDropdown([ + ['升序', 'True'], + ['降序', 'False'] + ]), 'AS_CENDING'); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(''); + } +} + +export const dataframe_head_tail = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DICT') + .setAlign(Blockly.inputs.Align.RIGHT) + .setCheck('Dict'); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('获取') + .appendField(new Blockly.FieldDropdown([ + ['前几行', 'head'], + ['最后几行', 'tail'] + ]), 'TYPE'); + this.appendValueInput('LINES') + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('行数'); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(''); + } +} + +export const dataframe_select = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DICT') + .setAlign(Blockly.inputs.Align.RIGHT) + .setCheck('Dict'); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('筛选数据'); + this.appendValueInput('KEY') + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('满足条件'); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(''); + } +} + +export const dataframe_groupby = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DICT') + .setAlign(Blockly.inputs.Align.RIGHT) + .setCheck('Dict'); + this.appendValueInput('KEY') + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('通过标签'); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('分组'); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(''); + } +} + +export const dataframe_aggregate_func = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(new Blockly.FieldDropdown([ + ['求最小值', 'min'], + ['求最大值', 'max'], + ['求和', 'sum'], + ['求平均值', 'mean'], + ['求中位数', 'median'], + ['求标准差', 'std'] + ]), 'TYPE'); + this.appendValueInput('DICT') + .setAlign(Blockly.inputs.Align.RIGHT) + .setCheck('Dict'); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(''); + } +} + +export const plot_cla = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField('清除已有图像'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/datastructure.js b/mixly/boards/default_src/python_mixpy/blocks/datastructure.js new file mode 100644 index 00000000..de548f71 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/datastructure.js @@ -0,0 +1,355 @@ +import * as Blockly from 'blockly/core'; + +const DS_HUE = 80; + +export const ds_create_linkedlist = { + + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + + init: function () { + this.setColour(DS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldLabel(Blockly.Msg.DS_CREATE_LINKEDLIST_NEW)) + this.appendDummyInput("") + .appendField(new Blockly.FieldLabel(Blockly.Msg.DS_CREATE_LINKEDLIST_HEAD)) + .appendField(new Blockly.FieldTextInput('head'), 'VAR') + this.appendDummyInput("") + .appendField(new Blockly.FieldLabel(Blockly.Msg.DS_CREATE_LINKEDLIST_TYPE)) + .appendField(new Blockly.FieldTextInput('tag'), 'TYPE') + this.appendDummyInput() + .appendField(Blockly.Msg.DS_CREATE_LINKEDLIST_ATTRIBUTE); + this.itemCount_ = 1; + this.updateShape_(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new Blockly.icons.MutatorIcon(['ds_create_linkedlist_item'], this)); + this.setTooltip(Blockly.Msg.DS_CREATE_LINKEDLIST_TOOLTIP); + }, + + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('ds_create_linkedlist_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('ds_create_linkedlist_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } + + var keyNames = []; + for (var i = 0; this.getInput('ADD' + i); i++) { + //this.getInput('VALUE' + i).removeField("KEY"+i); + keyNames.push(this.getFieldValue("KEY" + i)) + this.removeInput('ADD' + i); + } + // Rebuild block. + //if (this.itemCount_ == 0) { + // this.getField('TIP').setText(Blockly.Msg.DICTS_CREATE_EMPTY_TITLE); + // } else { + // this.getField('TIP').setText(Blockly.Msg.DS_CREATE_LINKEDLIST_NEW); + for (var i = 0; i < this.itemCount_; i++) { + this.appendValueInput('ADD' + i) + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField( + new Blockly.FieldTextInput(keyNames.length > i + ? keyNames[i] + : 'name'), + 'KEY' + i) + .appendField("=") + + } + }, getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + + + +export const ds_create_linkedlist_container = { + + /** + * Mutator block for list container. + * @this Blockly.Block + */ + init: function () { + this.setColour(DS_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.DS_CREATE_LINKEDLIST_CONTAINER_TITLE); + this.appendStatementInput('STACK'); + this.setTooltip(Blockly.Msg.DS_CREATE_LINKEDLIST_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +export const ds_create_linkedlist_item = { + /** + * Mutator bolck for adding items. + * @this Blockly.Block + */ + init: function () { + this.setColour(DS_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.DS_CREATE_LINKEDLIST_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.DS_CREATE_LINKEDLIST_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + + +export const ds_create_node = { + init: function () { + this.setColour(DS_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_CREATE_NODE_USE) + .appendField(new Blockly.FieldTextInput('tag'), 'TYPE') + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_CREATE_NODE_NEW) + this.appendValueInput('NODE') + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.DS_CREATE_NODE_TOOLTIP); + } +} + +export const ds_get_node_attr = { + init: function () { + this.setColour(DS_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_GET_NODE_ATTR_NODE) + this.appendValueInput('NODE') + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .appendField(new Blockly.FieldTextInput('name'), 'TYPE') + this.appendDummyInput("") + .appendField(Blockly.Msg.DICTS_ADD_VALUE) + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.DS_GET_NODE_ATTR_TOOLTIP); + } +} + +export const ds_set_node_attr = { + init: function () { + this.setColour(DS_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_SET_NODE_ATTR_NODE) + this.appendValueInput('NODE') + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + .appendField(new Blockly.FieldTextInput('name'), 'TYPE') + this.appendValueInput('VAR') + .appendField(Blockly.Msg.DS_SET_NODE_ATTR_SET) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.DS_SET_NODE_ATTR_TOOLTIP); + } +} + +export const ds_add_node_by_name = { + init: function () { + this.setColour(DS_HUE); + this.appendValueInput('NODE') + .appendField(Blockly.Msg.DS_ADD_NODE_HEAD_NODE) + var pos = + [[Blockly.Msg.DS_ADD_NODE_BEFORE, 'before'], [Blockly.Msg.DS_ADD_NODE_AFTER, 'after']]; + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_ADD_NODE_LINKEDLIST) + this.appendValueInput('NODE2') + .appendField(Blockly.Msg.DS_SET_NODE_ATTR_NODE) + this.appendValueInput('NODE3') + .appendField(new Blockly.FieldDropdown(pos), 'DIR') + .appendField(Blockly.Msg.DS_ADD_NODE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.DS_ADD_NODE_TOOLTIP); + } +} + +export const ds_add_node_by_attr = { + init: function () { + this.setColour(DS_HUE); + this.appendValueInput('NODE') + .appendField(Blockly.Msg.DS_ADD_NODE_HEAD_NODE) + var pos = + [[Blockly.Msg.DS_ADD_NODE_BEFORE, 'before'], [Blockly.Msg.DS_ADD_NODE_AFTER, 'after']]; + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_ADD_NODE_LINKEDLIST) + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_CREATE_LINKEDLIST_ITEM_TITLE) + .appendField(new Blockly.FieldTextInput('name'), 'TYPE') + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_AS) + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_ADD_NODE_ATTR) + this.appendValueInput('NODE3') + .appendField(new Blockly.FieldDropdown(pos), 'DIR') + .appendField(Blockly.Msg.DS_ADD_NODE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.DS_ADD_NODE_TOOLTIP); + } +} + +export const ds_del_node_by_name = { + init: function () { + this.setColour(DS_HUE); + this.appendValueInput('NODE') + .appendField(Blockly.Msg.DS_ADD_NODE_HEAD_NODE) + + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_ADD_NODE_LINKEDLIST) + this.appendValueInput('NODE2') + .appendField(Blockly.Msg.DS_DEL_NODE_NAME) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.DS_DEL_NODE_TOOLTIP); + } +} + +export const ds_del_node_by_attr = { + init: function () { + this.setColour(DS_HUE); + this.appendValueInput('NODE') + .appendField(Blockly.Msg.DS_ADD_NODE_HEAD_NODE) + + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_ADD_NODE_LINKEDLIST) + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_DEL_NODE_ATTR) + .appendField(new Blockly.FieldTextInput('name'), 'TYPE') + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_AS) + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_ADD_NODE_ATTR) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.DS_DEL_NODE_TOOLTIP); + } +} + +export const ds_reverse_linkedlist = { + init: function () { + this.setColour(DS_HUE); + this.appendValueInput('NODE') + .appendField(Blockly.Msg.DS_ADD_NODE_HEAD_NODE) + + this.appendDummyInput("") + .appendField(Blockly.Msg.DS_REVERSE_LINKEDLIST) + this.appendValueInput('NODE2') + .appendField(Blockly.Msg.DS_REVERSE_LINKEDLIST_NEW_HEAD) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.DS_DEL_NODE_TOOLTIP); + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/factory.js b/mixly/boards/default_src/python_mixpy/blocks/factory.js new file mode 100644 index 00000000..05840bc0 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/factory.js @@ -0,0 +1,273 @@ +import * as Blockly from 'blockly/core'; + +const FACTORY_HUE = "#777777"; //65; + +export const factory_from_import = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField("from ") + .appendField(new Blockly.FieldTextInput('ESP32'), 'path') + .appendField(" import ") + .appendField(new Blockly.FieldTextInput('*'), 'module'); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const factory_import = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField("import ") + .appendField(new Blockly.FieldTextInput('module'), 'module'); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const factory_function_noreturn = { + init: function () { + //console.log('init'); + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput('my_function'), 'NAME'); + this.itemCount_ = 1; + this.arguments_ = ['x'];//add + this.updateShape_(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this)); + }, + mutationToDom: function () { + //console.log('mutationToDom'); + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + //add + for (var i = 0; i < this.arguments_.length; i++) { + var parameter = document.createElement('arg'); + parameter.setAttribute('name', this.arguments_[i]); + container.appendChild(parameter); + } + return container; + }, + domToMutation: function (xmlElement) { + //console.log('domToMutation'); + this.arguments_ = [];//add + //add + for (var i = 0; xmlElement.childNodes[i]; i++) { + let childNode = xmlElement.childNodes[i]; + if (childNode.nodeName.toLowerCase() == 'arg') { + this.arguments_.push(childNode.getAttribute('name')); + } + } + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + decompose: function (workspace) { + //console.log('decompose'); + var containerBlock = + workspace.newBlock('factory_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('factory_create_with_item'); + itemBlock.initSvg(); + itemBlock.setFieldValue(this.arguments_[i], 'NAME');//add + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + compose: function (containerBlock) { + //console.log('compose'); + this.arguments_ = [];//add + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + this.arguments_.push(itemBlock.getFieldValue('NAME'));//add + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i) + .connection.connect(connections[i]); + } + } + }, + saveConnections: function (containerBlock) { + //console.log('saveConnections'); + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + updateShape_: function () { + //console.log('updateShape_'); + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + for (var i = 0; i < this.itemCount_; i++) { + this.appendValueInput('ADD' + i) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(this.arguments_[i]); + } + } +}; + +export const factory_create_with_container = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_PARAMS); + this.appendStatementInput('STACK'); + this.contextMenu = false; + } +}; + +export const factory_create_with_item = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE + ':') + .appendField(new Blockly.FieldTextInput('x'), 'NAME'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.contextMenu = false; + } +}; + +export const factory_function_return = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput('my_function'), 'NAME'); + this.itemCount_ = 1; + this.arguments_ = ['x'];//add + this.updateShape_(); + this.setOutput(true); + this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this)); + }, + mutationToDom: factory_function_noreturn.mutationToDom, + domToMutation: factory_function_noreturn.domToMutation, + decompose: factory_function_noreturn.decompose, + compose: factory_function_noreturn.compose, + saveConnections: factory_function_noreturn.saveConnections, + updateShape_: factory_function_noreturn.updateShape_ +}; + +export const factory_declare = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput('test'), 'NAME') + .appendField("=") + .appendField(new Blockly.FieldTextInput('Test'), 'TYPE') + .appendField("()"); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +} + + +export const factory_callMethod_noreturn = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput('test'), 'NAME') + .appendField('.') + .appendField(new Blockly.FieldTextInput('callMethod'), 'METHOD'); + this.itemCount_ = 1; + this.arguments_ = ['x'];//add + this.updateShape_(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this)); + }, + mutationToDom: factory_function_noreturn.mutationToDom, + domToMutation: factory_function_noreturn.domToMutation, + decompose: factory_function_noreturn.decompose, + compose: factory_function_noreturn.compose, + saveConnections: factory_function_noreturn.saveConnections, + updateShape_: factory_function_noreturn.updateShape_ +}; + +export const factory_callMethod_return = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput('test'), 'NAME') + .appendField('.') + .appendField(new Blockly.FieldTextInput('callMethod'), 'METHOD'); + this.itemCount_ = 1; + this.arguments_ = ['x'];//add + this.updateShape_(); + this.setOutput(true); + this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this)); + }, + mutationToDom: factory_function_noreturn.mutationToDom, + domToMutation: factory_function_noreturn.domToMutation, + decompose: factory_function_noreturn.decompose, + compose: factory_function_noreturn.compose, + saveConnections: factory_function_noreturn.saveConnections, + updateShape_: factory_function_noreturn.updateShape_ +}; + +export const factory_block = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput('display.scroll("Hello World!")'), 'VALUE'); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const factory_block_return = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput('test'), 'VALUE'); + this.setOutput(true); + } +}; + +export const factory_block_with_textarea = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldMultilineInput('display.scroll("Hello World!")\ndisplay.scroll("Hello Mixly!")'), 'VALUE'); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const factory_block_return_with_textarea = { + init: function () { + this.setColour(FACTORY_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldMultilineInput('Hello\nMixly'), 'VALUE'); + this.setOutput(true); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/hardware.js b/mixly/boards/default_src/python_mixpy/blocks/hardware.js new file mode 100644 index 00000000..4b81fcf9 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/hardware.js @@ -0,0 +1,104 @@ +import * as Blockly from 'blockly/core'; + +const HARDWARE_HUE = 40; + +export const hardware_arduino_start = { + init: function () { + this.setColour(HARDWARE_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_HARDWARE) + this.appendValueInput('SUB') + .setCheck("var"); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_HARDWARE_START) + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +export const inout_highlow = { + init: function () { + this.setColour(HARDWARE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_HIGH, "HIGH"], [Blockly.Msg.MIXLY_LOW, "LOW"]]), 'BOOL') + this.setOutput(true, Boolean); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_HIGHLOW); + } +}; + +export const hardware_arduino_digital_write = { + init: function () { + this.setColour(HARDWARE_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_HARDWARE) + .setCheck("var"); + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_Digital_PINMODEOUT) + .appendField(Blockly.Msg.MIXLY_PIN) + .setCheck(Number); + this.appendValueInput("STAT") + .appendField(Blockly.Msg.MIXLY_STAT) + .setCheck([Number, Boolean]); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.LANG_INOUT_DIGITAL_WRITE_TOOLTIP); + } +}; + +export const hardware_arduino_digital_read = { + init: function () { + this.setColour(HARDWARE_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_HARDWARE) + .setCheck("var"); + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_Digital_PINMODEIN) + .appendField(Blockly.Msg.MIXLY_PIN) + .setCheck(Number); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_MACHINE_VALUE) + this.setInputsInline(true); + this.setOutput(true, [Boolean, Number]); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_DIGITAL_READ); + } +}; + +export const hardware_arduino_analog_write = { + init: function () { + this.setColour(HARDWARE_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_HARDWARE) + .setCheck("var"); + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_Analog_PINMODEOUT) + .appendField(Blockly.Msg.MIXLY_PIN) + .setCheck(Number); + this.appendValueInput("NUM", Number) + .appendField(Blockly.Msg.MIXLY_VALUE2) + .setCheck(Number); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_WRITE); + } +}; + +export const hardware_arduino_analog_read = { + init: function () { + this.setColour(HARDWARE_HUE); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_HARDWARE) + .setCheck("var"); + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_Analog_PINMODEIN) + .appendField(Blockly.Msg.MIXLY_PIN) + .setCheck(Number); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_MACHINE_VALUE) + this.setInputsInline(true); + this.setOutput(true, [Boolean, Number]); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_READ); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/inout.js b/mixly/boards/default_src/python_mixpy/blocks/inout.js new file mode 100644 index 00000000..bd6af166 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/inout.js @@ -0,0 +1,229 @@ +import * as Blockly from 'blockly/core'; + +export const inout_input = { + init: function () { + this.setColour(20); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.blockpy_inout_raw_input) + .setCheck(String); + this.setOutput(true); + this.setTooltip(Blockly.Msg.INOUT_input_TOOLTIP); + } +}; + +export const inout_print = { + init: function () { + this.setColour(20); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.BLOCKPY_PRINT_TOOLTIP); + } +}; + +export const inout_print_inline = { + init: function () { + this.setColour(20); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.MIXLY_SERIAL_PRINT); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP); + } +}; + +export const inout_print_end = { + init: function () { + this.setColour(20); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.MIXLY_SERIAL_PRINT); + this.appendValueInput("END") + .appendField(Blockly.Msg.MIXLY_ENDSWITH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_INOUT_PRINT_END_TOOLTIP); + } +}; + +export const inout_type_input = { + init: function () { + + var input_type = + [[Blockly.Msg.LANG_MATH_STRING, 'str'], [Blockly.Msg.LANG_MATH_INT, 'int'] + , [Blockly.Msg.LANG_MATH_FLOAT, 'float']]; + this.setColour(20); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(new Blockly.FieldDropdown(input_type), 'DIR') + this.appendValueInput("VAR") + .appendField(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE) + .setCheck(String); + + this.setInputsInline(true); + this.setOutput(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'str': Blockly.Msg.MIXLY_MIXPY_INOUT_STR_INPUT_TOOLTIP, + 'int': Blockly.Msg.MIXLY_MIXPY_INOUT_INT_INPUT_TOOLTIP, + 'float': Blockly.Msg.MIXLY_MIXPY_INOUT_FLOAT_INPUT_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const pyinout_type_input = { + init: function () { + + var input_type = + [[Blockly.Msg.LANG_MATH_STRING, 'str'], [Blockly.Msg.LANG_MATH_INT, 'int'] + , [Blockly.Msg.LANG_MATH_FLOAT, 'float']]; + this.setColour(20); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(new Blockly.FieldDropdown(input_type), 'DIR') + this.appendValueInput("VAR") + .appendField(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE) + .setCheck(String); + + this.setInputsInline(true); + this.setOutput(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'str': Blockly.Msg.MIXLY_MIXPY_INOUT_STR_INPUT_TOOLTIP, + 'int': Blockly.Msg.MIXLY_MIXPY_INOUT_INT_INPUT_TOOLTIP, + 'float': Blockly.Msg.MIXLY_MIXPY_INOUT_FLOAT_INPUT_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const inout_print_many = { + + init: function () { + this.setColour(20); + + this.itemCount_ = 2; + this.updateShape_(); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setInputsInline(true); + this.setMutator(new Blockly.icons.MutatorIcon(['inout_print_item'], this)); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_TOOLTIP); + }, + + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('inout_print_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('inout_print_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i) + .connection.connect(connections[i]); + } + } + }, + + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_EMPTY); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN); + } + } + } + } +}; +export const inout_print_container = { + init: function () { + this.setColour(20); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN); + this.appendStatementInput('STACK'); + this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +export const inout_print_item = { + init: function () { + this.setColour(20); + this.appendDummyInput() + .appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/iot.js b/mixly/boards/default_src/python_mixpy/blocks/iot.js new file mode 100644 index 00000000..95e52f25 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/iot.js @@ -0,0 +1,670 @@ +import * as Blockly from 'blockly/core'; +import * as Mixly from 'mixly'; + +const IOT_HUE = '#526FC3'; +//'#2FAD7A'; + +export const iot_onenet_connect = { + init: function () { + this.setColour("#78AAE0"); + this.appendValueInput('VAR') + .setCheck("var") + .appendField("OneNET" + Blockly.Msg.TUPLE_JOIN); + this.appendValueInput('CLIENT') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_ESP32_ONENET_CLIENT); + this.appendValueInput('SERVER') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_ESP32_ONENET_SERVER); + this.appendValueInput('USERNAME') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_ESP32_ONENET_USERNAME); + this.appendValueInput('PASSWORD') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_ESP32_ONENET_PASSWORD); + this.appendValueInput('TOPIC') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_ESP32_ONENET_TOPIC); + this.appendValueInput('SUB') + .appendField(Blockly.Msg.MIXLY_ESP32_ONENET_SUB); + //this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_CONNECT_TOOLTIP); + } +}; + +export const iot_onenet_disconnect = { + init: function () { + this.setColour("#78AAE0"); + this.appendValueInput('VAR') + .setCheck("var") + .appendField("OneNET") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_DISCONNECT_ONENET); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_DISCONNECT_TOOLTIP); + } +}; + +export const iot_onenet_check = { + init: function () { + this.setColour("#78AAE0"); + this.appendValueInput('VAR') + .setCheck("var") + .appendField("OneNET") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_CHECK_ONENET); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_CHECK_TOOLTIP); + } +}; + +export const iot_onenet_publish_dict = { + init: function () { + this.setColour("#78AAE0"); + this.appendValueInput('VAR') + .setCheck("var") + .appendField("OneNET") + this.appendValueInput('DICT') + .appendField(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_PRINT_DATA) + .appendField(new Blockly.FieldCheckbox('TRUE'), 'is_print'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_PUBLISH_DICT_TOOLTIP); + } +}; + +export const iot_onenet_publish = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour("#78AAE0"); + this.appendValueInput('VAR') + .setCheck("var") + .appendField("OneNET") + .setAlign(Blockly.inputs.Align.RIGHT) + this.appendDummyInput() + .appendField(new Blockly.FieldLabel(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET), 'TIP') + .setAlign(Blockly.inputs.Align.RIGHT) + this.itemCount_ = 2; + this.updateShape_(); + this.setInputsInline(false); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new Blockly.Mutator(['iot_publish_item'])); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_PUBLISH_TOOLTIP); + }, + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('iot_publish_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('iot_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } + var keyNames = []; + for (var i = 0; this.getInput('ADD' + i); i++) { + //this.getInput('VALUE' + i).removeField("KEY"+i); + keyNames.push(this.getFieldValue("KEY" + i)) + this.removeInput('ADD' + i); + } + // Rebuild block. + if (this.itemCount_ == 0) { + //this.getField('TIP') + //.setText(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET_EMPTY); + this.setFieldValue(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET_EMPTY, 'TIP'); + } else { + //this.getField('TIP') + //.setText(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET); + this.setFieldValue(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET, 'TIP'); + for (var i = 0; i < this.itemCount_; i++) { + this.appendValueInput('ADD' + i) + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField( + new Blockly.FieldTextInput( + keyNames.length > i + ? keyNames[i] + : '"key' + (i + 1) + '"'), + 'KEY' + i) + .appendField(":") + } + } + }, getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const iot_publish_container = { + /** + * Mutator block for list container. + * @this Blockly.Block + */ + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT); + this.appendStatementInput('STACK'); + this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + + +export const iot_publish_item = { + /** + * Mutator bolck for adding items. + * @this Blockly.Block + */ + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + +export const iot_create_with_item = { + /** + * Mutator bolck for adding items. + * @this Blockly.Block + */ + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + + +export const iot_mixio_connect = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT); + this.appendValueInput('SERVER') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_EMQX_SERVER) + .setAlign(Blockly.inputs.Align.RIGHT) + this.appendValueInput('USERNAME') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_WIFI_USERNAME) + .setAlign(Blockly.inputs.Align.RIGHT) + this.appendValueInput('PASSWORD') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_IOT_PASSWORD) + .setAlign(Blockly.inputs.Align.RIGHT) + this.appendValueInput('PROJECT') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_EMQX_PROJECT) + .setAlign(Blockly.inputs.Align.RIGHT) + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const IOT_MIXIO_PUBLISH = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendValueInput('TOPIC') + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_NEW) + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC); + this.appendValueInput('MSG') + .appendField(Blockly.Msg.HTML_BODY); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_PUBLISH_TOOLTIP); + } +}; + +export const IOT_MIXIO_PUBLISHEX = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendValueInput('TOPIC') + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_NEW) + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC); + this.appendValueInput('MSG') + .appendField(Blockly.Msg.HTML_BODY); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_Service_quality_display) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_AT_MOST_ONCE,"0"], + [Blockly.Msg.MIXLY_AT_LEAST_ONCE,"1"] + ]),"quality") + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_PUBLISH_TOOLTIP); + } +}; + +export const IOT_MIXIO_SUBSCRIBE = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendValueInput('TOPIC') + .appendField(Blockly.Msg.MIXLY_EMQX_SUBSCRIBE + Blockly.Msg.MIXLY_MICROBIT_MSG) + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC); + this.appendValueInput('METHOD') + .appendField(Blockly.Msg.MIXLY_EMQX_SET_METHOD); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_SUBSCRIBE_TOOLTIP); + } +}; + +export const IOT_MIXIO_UNSUBSCRIBE = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendValueInput('TOPIC') + .appendField(Blockly.Msg.MSG.stop + Blockly.Msg.MIXLY_EMQX_SUBSCRIBE) + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_SUBSCRIBE_TOOLTIP); + } +}; + +export const iot_mixio_disconnect = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_DISCONNECT_ONENET); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_DISCONNECT_TOOLTIP); + } +}; + +export const iot_mixio_connect_only = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_EMQX_CONNECT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_DISCONNECT_TOOLTIP); + } +}; + +export const iot_mixio_check = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_CHECK_ONENET); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_CHECK_TOOLTIP); + } +}; + +export const iot_mixio_format_topic = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT) + .appendField(Blockly.MQTT_Topic); + this.setInputsInline(true); + this.setOutput(true); + } +}; + +export const iot_mixio_format_msg = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT) + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_MSG); + this.setInputsInline(true); + this.setOutput(true); + } +}; + +export const IOT_FORMATTING = { + init: function () { + this.setColour(IOT_HUE); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_ESP32_IOT_MAP_FORMATING); + this.setOutput(true); + // this.setTooltip(); + } +}; + +export const IOT_FORMAT_STRING = { + init: function () { + this.setColour(IOT_HUE); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT + '(Json)'); + this.setOutput(true); + // this.setTooltip(); + } +}; + +export const IOT_EMQX_PING = { + init: function () { + this.setColour(IOT_HUE); + // this.appendValueInput('VAR') + // .setCheck("var") + this.appendDummyInput() + .appendField("MixIO") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_EMQX_PING); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_PING_TOOLTIP); + } +}; + +export const IOT_MIXIO_NTP = { + init: function () { + this.setColour(IOT_HUE); + // this.appendValueInput('VAR') + // .setCheck("var") + this.appendDummyInput() + .appendField("MixIO") + .appendField(Blockly.Msg.MIXLY_GET_NTP) + this.appendValueInput('addr') + .appendField(Blockly.blynk_SERVER_ADD); + this.setInputsInline(true); + this.setOutput(true); + } +}; + +export const IOT_EMQX_INIT_AND_CONNECT_BY_SHARE_CODE = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT); + this.appendValueInput('SERVER') + .appendField(Blockly.Msg.MIXLY_EMQX_SERVER) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('KEY') + .appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + Blockly.Msg.MIXLY_MIXIO_SHARE_KEY) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const IOT_EMQX_INIT_AND_CONNECT_BY_MIXLY_CODE = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT); + this.appendValueInput('SERVER') + .appendField(Blockly.Msg.MIXLY_EMQX_SERVER) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('KEY') + .appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + "Mixly Key") + .setAlign(Blockly.inputs.Align.RIGHT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const iot_mixly_key_py = { + init: function () { + this.VISITOR_ID = Mixly.Config.BOARD.visitorId.str32.substring(0, 8).toUpperCase(); + this.setColour(IOT_HUE); + this.appendDummyInput("") + .appendField(this.newQuote_(true)) + .appendField(new Blockly.FieldTextInput(this.visitorId), 'VISITOR_ID') + .appendField(this.newQuote_(false)); + this.setOutput(true, null); + }, + onchange: function () { + const nowVisitorId = this.getFieldValue('VISITOR_ID'); + if (this.VISITOR_ID !== nowVisitorId) + this.setFieldValue(this.VISITOR_ID, 'VISITOR_ID'); + }, + newQuote_: function (open) { + if (open == this.RTL) { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg=='; + } else { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC'; + } + return new Blockly.FieldImage(file, 12, 12, '"'); + } +}; + +export const iot_mixly_key = { + init: function () { + this.VISITOR_ID = Mixly.Config.BOARD.visitorId.str32.substring(0, 8).toUpperCase(); + this.setColour(IOT_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput(this.visitorId), 'VISITOR_ID'); + this.setOutput(true, null); + }, + onchange: function () { + const nowVisitorId = this.getFieldValue('VISITOR_ID'); + if (this.VISITOR_ID !== nowVisitorId) + this.setFieldValue(this.VISITOR_ID, 'VISITOR_ID'); + } +}; + +export const iot_client_onboard = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField('MixIO') + .appendField(Blockly.Msg.MSG.catEthernet_clinet); + this.setOutput(true); + this.setInputsInline(true); + } +}; + +export const iot_http_client = { + init: function () { + this.setColour(IOT_HUE); + // this.appendValueInput('VAR') + // .setCheck("var") + this.appendDummyInput() + .appendField("HTTP" + Blockly.Msg.MIXLY_Client) + this.appendValueInput('addr') + .appendField(Blockly.Msg.DISPLAY_IMAGE_LET2); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_REQUESTS_GET) + .appendField(Blockly.Msg.MIXLY_GET_CURRENT_TIME) + .appendField(Blockly.Msg.MIXLY_OPEN_DEBUG) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, "True"], + [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, "False"] + ]), "key"); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const iot_http_data = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("HTTP" + Blockly.Msg.MIXLY_Client) + .appendField(Blockly.Msg.MIXLY_GET) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_REQUESTS_LEN, "client_len"], + [Blockly.Msg.MIXLY_REQUESTS_GET_LEN, "server_len"], + [Blockly.Msg.MIXLY_REQUESTS_MESSAGE, "text"] + ]), "key"); + this.setOutput(true); + this.setInputsInline(true); + + } +}; + +export const iot_mqtt_client = { + init: function () { + this.setColour(IOT_HUE); + // this.appendValueInput('VAR') + // .setCheck("var") + this.appendDummyInput() + .appendField("MQTT" + Blockly.Msg.MIXLY_Client) + this.appendValueInput('addr') + .appendField(Blockly.Msg.MIXLY_CONNECTTO); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_INIT_SUBSCRIBE) + .appendField(Blockly.MQTT_Topic) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_GET_CURRENT_TIME, ""], + ]), "key") + .appendField(Blockly.Msg.MIXLY_OPEN_DEBUG) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, "True"], + [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, "False"] + ]), "key2"); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const iot_mqtt_data = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MQTT" + Blockly.Msg.MIXLY_Client) + .appendField(Blockly.Msg.MIXLY_GET) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_REQUESTS_LEN, "client_len"], + [Blockly.Msg.MIXLY_REQUESTS_GET_LEN, "server_len"], + [Blockly.Msg.MIXLY_REQUESTS_MESSAGE, "time_msg()"] + ]), "key"); + this.setOutput(true); + this.setInputsInline(true); + + } +}; + +// export const iot_wificonnect = iot_wifi_connect; +export const iot_onenetconnect = iot_onenet_connect; +export const iot_onenetdisconnect = iot_onenet_disconnect; +export const iot_checkonenet = iot_onenet_check; +export const iot_publish = iot_onenet_publish; + diff --git a/mixly/boards/default_src/python_mixpy/blocks/pins.js b/mixly/boards/default_src/python_mixpy/blocks/pins.js new file mode 100644 index 00000000..969bba85 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/pins.js @@ -0,0 +1,40 @@ +import * as Blockly from 'blockly/core'; +import { Profile } from 'mixly'; + +const PINS_HUE = 230; + +export const pins_digital_write = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.digital_write), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_digital_read = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.digital_read), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_analog_write = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.analog_write), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_analog_read = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.analog_read), 'PIN'); + this.setOutput(true); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/serial.js b/mixly/boards/default_src/python_mixpy/blocks/serial.js new file mode 100644 index 00000000..471791ab --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/serial.js @@ -0,0 +1,65 @@ +import * as Blockly from 'blockly/core'; + +const SERIAL_HUE = 40; + +export const serial_open = { + init: function () { + var bps = [ + ["115200", '115200'], ["256000", '256000'], ["128000", '128000'], ["57600", '57600'], ["56000", '56000'], + ["43000", '43000'], ["38400", '38400'], ["28800", '28800'], ["19200", '19200'], ["9600", '9600'], + ["4800", '4800'], ["2400", '2400'], ["1200", '1200'], ["600", '600'], ["300", '300'], ["110", '110'] + ]; + this.setColour(SERIAL_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldLabel(Blockly.Msg.MIXPY_SERIAL_OPEN)) + .appendField(new Blockly.FieldTextInput('ser'), 'SER') + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SERIAL_BEGIN) + .appendField(new Blockly.FieldDropdown(bps), 'BPS') + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXPY_SERIAL_OPEN_TIMEOUT); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.MIXPY_SERIAL_OPEN_TOOLTIP); + } +}; + +export const serial_write = { + init: function () { + this.setColour(SERIAL_HUE); + this.appendValueInput('SER') + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXPY_SERIAL_WRITE); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.MIXPY_SERIAL_WRITE_TOOLTIP); + } +}; + +export const serial_read_b = { + init: function () { + this.setColour(SERIAL_HUE); + this.appendValueInput('SER') + this.appendValueInput('VAR') + .setCheck(Number) + .appendField(Blockly.Msg.MIXPY_SERIAL_READ); + this.setInputsInline(true); + this.setOutput(true, String); + this.setTooltip(Blockly.Msg.MIXPY_SERIAL_READ_TOOLTIP); + } +}; + +export const serial_close = { + init: function () { + this.setColour(SERIAL_HUE); + this.appendValueInput('SER') + this.appendDummyInput() + .appendField(Blockly.Msg.MIXPY_SERIAL_CLOSE); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.MIXPY_SERIAL_CLOSE_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/sklearn.js b/mixly/boards/default_src/python_mixpy/blocks/sklearn.js new file mode 100644 index 00000000..f03597e9 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/sklearn.js @@ -0,0 +1,702 @@ +import * as Blockly from 'blockly/core'; + +const SKLEARN_HUE = 80; + +export const sklearn_make_classification = { + init: function () { + this.appendDummyInput() + .appendField(Blockly.Msg.SKLEARN_CLASSIFICATION_GENERATION); + this.appendValueInput("n_samples") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_SAMPLES); + this.appendValueInput("n_features") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_FEATURES); + this.appendValueInput("n_informative") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_EFFECTIVE_FEATURES); + this.appendValueInput("n_redundant") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_REDUNDANT_FEATURES); + this.appendValueInput("n_repeated") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_REPEATED_FEATURES); + this.appendValueInput("n_classes") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_CLASSES); + this.appendValueInput("n_clusters_per_class") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_CLUSTERS_PER_CLASSES); + this.appendValueInput("random_state") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.RANDOM_SEED); + this.setInputsInline(false); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 生成回归样本 +export const sklearn_make_regression = { + init: function () { + this.appendDummyInput() + .appendField(Blockly.Msg.SKLEARN_REGRESSION_GENERATION); + this.appendValueInput("n_samples") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_SAMPLES); + this.appendValueInput("n_features") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_FEATURES); + this.appendValueInput("n_informative") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_EFFECTIVE_FEATURES); + this.appendValueInput("n_targets") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_LABELS); + this.appendValueInput("bias") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.DEVIATION); + this.appendValueInput("noise") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NOISE); + this.appendValueInput("random_state") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.RANDOM_SEED); + this.setInputsInline(false); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 生成聚类样本 +export const sklearn_make_blobs = { + init: function () { + this.appendDummyInput() + .appendField(Blockly.Msg.SKLEARN_CLUSTERING_GENERATION); + this.appendValueInput("n_samples") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_SAMPLES); + this.appendValueInput("n_features") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_FEATURES); + this.appendValueInput("centers") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_CLUSTERS); + this.appendValueInput("cluster_std") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.STANDARD_DEVIATION_OF_CLUSTER); + this.appendValueInput("center_box") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.CLUSTER_BOUNDING_BOX); + this.appendValueInput("shuffle") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SHUFFLE_SAMPLES); + this.appendValueInput("random_state") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.RANDOM_SEED); + this.setInputsInline(false); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 加载数据集 +export const sklearn_load = { + init: function () { + var data = [ + [Blockly.Msg.SKLEARN_LOAD_IRIS, "load_iris"], + [Blockly.Msg.SKLEARN_LOAD_BOSTON, "load_boston"], + [Blockly.Msg.SKLEARN_LOAD_DIABETES, "load_diabetes"], + [Blockly.Msg.SKLEARN_LOAD_BREAST_CANCER, "load_breast_cancer"], + [Blockly.Msg.SKLEARN_LOAD_LINNERUD, "load_linnerud"], + [Blockly.Msg.SKLEARN_LOAD_DIGITS, "load_digits"] + ]; + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.LOAD) + .appendField(new Blockly.FieldDropdown(data), "type") + .appendField(new Blockly.FieldTextInput("iris"), "name"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + }, + getVars: function () { + return [this.getFieldValue('name')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('name'))) { + this.setTitleValue(newName, 'name'); + } + } +}; + +//sklearn 获取特征值/标签值/标签/特征 +export const sklearn_data_target = { + init: function () { + this.appendValueInput("name") + .setCheck(null) + .appendField("sklearn " + Blockly.Msg.DATA_SET); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_GET) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.EIGENVALUES, "data"], + [Blockly.Msg.LABEL_VALUE, "target"], + [Blockly.Msg.FEATURE, "feature_names"], + [Blockly.Msg.mixpy_PYLAB_TICKS_TAG, "target_names"] + ]), "type"); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 数据集分割 +export const sklearn_train_test_split = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.DATA_SEGMENTATION); + this.appendValueInput("train_data") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.EIGENVALUES); + this.appendValueInput("train_target") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.LABEL_VALUE); + this.appendValueInput("test_size") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.TEST_SET_PROPORTION); + this.appendValueInput("rondom_state") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.RANDOM_SEED); + this.setInputsInline(false); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 数据集分割-无标签值 +export const sklearn_train_test_split_no_target = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.DATA_SEGMENTATION); + this.appendValueInput("train_data") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.EIGENVALUES); + this.appendValueInput("test_size") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.TEST_SET_PROPORTION); + this.appendValueInput("rondom_state") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.RANDOM_SEED); + this.setInputsInline(false); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 初始化线性回归 +export const sklearn_LinearRegression = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.SKLEARN_LINEARREGRESSION_INIT); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("fit_intercept") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_CALCULATE_MODEL_INTERRUPT); + this.appendValueInput("normalize") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_REGRESSION_NORMIALIZATION); + this.appendValueInput("n_jobs") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_THREADS); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 初始化岭回归 +export const sklearn_Ridge = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.SKLEARN_RIDGE_INIT); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("alpha") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_REGULA_INTENSITY); + this.appendValueInput("fit_intercept") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_CALCULATE_MODEL_INTERRUPT); + this.appendValueInput("normalize") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_REGRESSION_NORMIALIZATION); + this.appendValueInput("max_iter") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_MAX_ITER); + this.appendValueInput("random_state") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.RANDOM_SEED); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 初始化决策树 分类/回归算法 +export const sklearn_DecisionTreeClassifier_Regressor = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.SKLEARN_DECISIONTREE_INIT) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "DecisionTreeClassifier"], + [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "DecisionTreeRegressor"] + ]), "type"); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("max_depth") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_MAXIMUM_TREE_DEPTH); + this.appendValueInput("random_state") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.RANDOM_SEED); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 初始化随机森林 分类/回归算法 +export const sklearn_RandomForestClassifier_Regressor = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.SKLEARN_RANDOMFOREST_INIT) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "RandomForestClassifier"], + [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "RandomForestRegressor"] + ]), "type"); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("n_estimators") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_TREES); + this.appendValueInput("max_depth") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_MAXIMUM_TREE_DEPTH); + this.appendValueInput("n_jobs") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_THREADS); + this.appendValueInput("random_state") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.RANDOM_SEED); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 初始化K近邻 分类/回归算法 +export const sklearn_KNeighborsClassifier_Regressor = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.SKLEARN_KNN_INIT) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "KNeighborsClassifier"], + [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "KNeighborsRegressor"] + ]), "type"); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("K") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField("K"); + this.appendValueInput("n_jobs") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_THREADS); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 初始化高斯贝叶斯分类算法 +export const sklearn_GaussianNB = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.SKLEARN_GAUSSINNB_INIT); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 初始化PCA降维 +export const sklearn_pca = { + init: function () { + this.appendDummyInput() + .appendField("sklearn 初始化 PCA 算法"); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("n_components") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_PCA_N_COMPONENTS); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn PCA拟合并转换数据 +export const sklearn_pca_fit_transform = { + init: function () { + this.appendDummyInput() + .appendField("sklearn PCA 降维"); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("train_data") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.EIGENVALUES); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 初始化K-均值聚类 +export const sklearn_KMeans = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.SKLEARN_KMEANS_INIT); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("n_clusters") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.NUMBER_OF_CLUSTERS_JUST); + this.appendValueInput("max_iter") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_MAX_ITER); + this.appendValueInput("random_state") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.RANDOM_SEED); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn KMeans拟合数据 +export const sklearn_KMeans_fit = { + init: function () { + this.appendDummyInput() + .appendField("sklearn K-均值聚类"); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("train_data") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.EIGENVALUES); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 训练模型 +export const sklearn_fit = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.TRAINING_MODEL); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("train_data") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.EIGENVALUES); + this.appendValueInput("train_target") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.LABEL_VALUE); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 训练模型-无标签值 +export const sklearn_fit_no_target = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.TRAINING_MODEL); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("train_data") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.EIGENVALUES); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 模型预测 +export const sklearn_predict = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.MODEL_PRODICTION); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("train_data") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.EIGENVALUES); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 计算模型得分 +export const sklearn_score = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.CALCULATE_THE_SCORE); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("train_data") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.EIGENVALUES); + this.appendValueInput("train_target") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.LABEL_VALUE); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 计算模型得分 - 无标签值 +export const sklearn_score_no_target = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.CALCULATE_THE_SCORE); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput("train_data") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.EIGENVALUES); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 线性回归 模型获取 斜率/截距 +export const sklearn_coef_intercept = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.SKLEARN_GENERALIZED_LINEAR_REGRESSION); + this.appendValueInput("model_name") + .setAlign(Blockly.inputs.Align.RIGHT) + .setCheck(null) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendDummyInput() + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_GET) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_COEF, "coef_"], + [Blockly.Msg.SKLEARN_INTERCEPT, "intercept_"] + ]), "type"); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn K-均值聚类 模型获取 簇中心坐标/聚类后的标签/所有点到对应簇中心的距离平方和 +export const sklearn_cluster_centers_labels_inertia = { + init: function () { + this.appendDummyInput() + .appendField("sklearn " + Blockly.Msg.SKLEARN_CLUSTERING); + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_GET) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_CLUSTER_CENTER, "cluster_centers_"], + [Blockly.Msg.SKLEARN_LABELS_AFTER_CLUSTERING, "labels_"], + [Blockly.Msg.SKLEARN_CLUSTERING_SUM_OF_SQUARED_DISTANCES, "inertia_"] + ]), "type"); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +//sklearn 保存/加载模型 +export const sklearn_save_load_model = { + init: function () { + this.appendValueInput("model_name") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField("sklearn") + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_SAVE_MODEL, "dump"], + [Blockly.Msg.SKLEARN_LOAD_MODEL, "load"] + ]), "type") + .appendField(" " + Blockly.Msg.MODEL_NAME); + this.appendValueInput("address") + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/system.js b/mixly/boards/default_src/python_mixpy/blocks/system.js new file mode 100644 index 00000000..eb4a7a00 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/system.js @@ -0,0 +1,126 @@ +import * as Blockly from 'blockly/core'; + +const SYSTEM_HUE = 120; + +export const base_delay = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput("DELAY_TIME", Number) + .appendField(Blockly.Msg.MIXLY_DELAY + '(' + Blockly.Msg.MIXLY_MILLIS + ')') + .setCheck(Number); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + } +}; + +export const controls_millis = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_time_time); + this.setOutput(true, Number); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_MILLIS); + } +}; + +export const time_localtime = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME) + this.appendDummyInput() + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_ALL, "all"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_YEAR, "0"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_MONTH, "1"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_DATE, "2"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_HOUR, "3"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_MINUTE, "4"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_SECOND, "5"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_INWEEK, "6"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_INYEAR, "7"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_DST, "8"] + ]), "op"); + this.setOutput(true); + this.setInputsInline(true); + } +}; + +export const Panic_with_status_code = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput("STATUS_CODE", Number) + .appendField(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code) + .setCheck(Number); + this.setPreviousStatement(true, null); + // this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + } +}; + +export const reset = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_micro); + this.setPreviousStatement(true); + // this.setNextStatement(true); + } +}; + +export const controls_mstimer2 = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput('TIME') + .setCheck(Number) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('MsTimer2') + .appendField(Blockly.Msg.MIXLY_MSTIMER2_EVERY); + this.appendDummyInput() + .appendField('ms'); + this.appendStatementInput('DO') + .appendField(Blockly.Msg.MIXLY_MSTIMER2_DO); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const controls_mstimer2_start = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField('MsTimer2') + .appendField(Blockly.Msg.MIXLY_MSTIMER2_START); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const controls_mstimer2_stop = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField('MsTimer2') + .appendField(Blockly.Msg.MIXLY_STOP); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const time_sleep = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput("DELAY_TIME", Number) + .appendField(Blockly.Msg.MIXLY_DELAY) + .setCheck(Number); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SECOND) + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/blocks/turtle.js b/mixly/boards/default_src/python_mixpy/blocks/turtle.js new file mode 100644 index 00000000..0a725576 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/blocks/turtle.js @@ -0,0 +1,945 @@ +import * as Blockly from 'blockly/core'; + +const TURTLE_HUE = 180; + +export const turtle_create = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_turtle_create) + .appendField(new Blockly.FieldTextInput('tina'), 'VAR') + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.blockpy_turtle_create_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const turtle_done = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_TURTLE_DONE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_exitonclick = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_PYTHON_TURTLE_EXITONCLICK); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_move = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var front_back = + [[Blockly.Msg.blockpy_forward, 'forward'], [Blockly.Msg.blockpy_backward, 'backward']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MOVE_BY) + .appendField(new Blockly.FieldDropdown(front_back), 'DIR') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MOVE_BY_num); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'forward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + 'backward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_rotate = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var front_back = + [[Blockly.Msg.blockpy_left, 'left'], [Blockly.Msg.blockpy_right, 'right']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_rotate) + .appendField(new Blockly.FieldDropdown(front_back), 'DIR') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'left': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_LEFT, + 'right': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_RIGHT + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_setheading = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_setheading); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_setheading_degree); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_screen_delay = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_SCREEN_DELAY); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MILLIS); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SCREEN_DELAY); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_goto = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + + .appendField(Blockly.Msg.blockpy_turtle_goto); + this.appendValueInput('val') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_turtle_goto_y); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_goto_position); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_setxy = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var set_xy = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .appendField(new Blockly.FieldDropdown(set_xy), 'DIR') + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_SETXY); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_MIXPY_TURTLE_SETXY_TOOLTIP); + } +}; + +export const turtle_pos_shape = { + init: function () { + this.setColour(TURTLE_HUE); + var pos_shape = + [[Blockly.Msg.TURTLE_POS, 'pos'], [Blockly.Msg.TURTLE_SHAPE, 'shape'], [Blockly.Msg.TURTLE_HEADING, 'heading'], [Blockly.Msg.MIXLY_MIXPY_TURTLE_WIDTH, 'width'], [Blockly.Msg.MIXLY_TURTEL_GET_SHAPESIZE, 'shapesize'], [Blockly.Msg.MIXLY_SPEED, 'speed']]; + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput("") + .appendField(Blockly.Msg.TURTLE_POS_SHAPE) + .appendField(new Blockly.FieldDropdown(pos_shape), 'DIR') + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'pos': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_POS, + 'shape': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SHAPE, + 'heading': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HEADING, + 'width': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_WIDTH, + 'speed': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_GET_SPEED, + 'shapesize': Blockly.Msg.MIXLY_TURTEL_GET_SHAPESIZE_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + this.setOutput(true); + this.setInputsInline(true); + + } +}; + +export const turtle_stamp = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput() + .appendField(Blockly.Msg.TURTLE_STAMP); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_clear = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var clear_reset = + [[Blockly.Msg.MIXLY_LCD_STAT_CLEAR, 'clear'], [Blockly.Msg.blockpy_turtle_reset, 'reset'] + , [Blockly.Msg.blockpy_turtle_home, 'home']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(clear_reset), 'DIR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'clear': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CLEAR, + 'reset': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_RESET, + 'home': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HOME + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_penup = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var penup_down = + [[Blockly.Msg.blockpy_turtle_penup, 'penup'], [Blockly.Msg.blockpy_turtle_pendown, 'pendown']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(penup_down), 'DIR') + + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'penup': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_PENUP, + 'pendown': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_PENDOWN + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_fill = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var fill = + [[Blockly.Msg.blockpy_turtle_beginfill, 'begin'], [Blockly.Msg.blockpy_turtle_endfill, 'end']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(fill), 'DIR') + + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'begin': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BEGINFILL, + 'end': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_ENDFILL + }; + return TOOLTIPS[mode]; + }); + } +}; + + +export const turtle_size_speed = { + init: function () { + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput('tina'), 'TUR') + var size_speed = + [[Blockly.Msg.blockpy_turtle_size, 'pensize'], [Blockly.Msg.MIXLY_SPEED, 'speed']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_set) + .appendField(new Blockly.FieldDropdown(size_speed), 'DIR') + .appendField(Blockly.Msg.blockpy_turtle_set_num); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'pensize': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SIZE, + 'speed': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SPEED + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_size = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_turtle_set_size); + + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SIZE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const turtle_speed = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_turtle_set_speed); + + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SPEED); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_circle = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var circle_dot = + [[Blockly.Msg.blockpy_turtle_circle, 'circle'], [Blockly.Msg.blockpy_turtle_dot, 'dot']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_draw) + .appendField(new Blockly.FieldDropdown(circle_dot), 'DIR') + .appendField(Blockly.Msg.blockpy_turtle_radius); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'circle': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CIRCLE, + 'dot': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_DOT + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_circle_advanced = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_DRAW_CIRCLE) + .appendField(Blockly.Msg.blockpy_turtle_radius); + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_turtle_angle); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CIRCLE); + } +}; + +export const turtle_visible = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var visible = + [[Blockly.Msg.blockpy_turtle_hide, 'hideturtle'], [Blockly.Msg.blockpy_turtle_show, 'showturtle']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(visible), 'DIR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'hideturtle': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HIDE, + 'showturtle': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SHOW + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_bgcolor = { + init: function () { + + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_bgcolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_title = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TITLE') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_TURTLE_TITLE_SET); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_setup = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_TURTLE_SETUP_SET); + this.appendValueInput('WIDTH') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_WIDTH); + this.appendValueInput('HEIGHT') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_HEIGHT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_tracer = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_TURTLE_TRACER); + this.appendValueInput('STEP') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_TURTLE_TRACER_STEP); + this.appendValueInput('DELAY') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_TURTLE_TRACER_DELAY_MS); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_pencolor = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_pencolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_fillcolor = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_fillcolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_clone = { + + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput("") + .appendField(Blockly.Msg.TURTLE_CLONE); + this.setTooltip(Blockly.Msg.TURTLE_CLONE_TOOLTIP); + this.setOutput(true); + } +}; + +export const turtle_bgcolor_hex_new = { + init: function () { + + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_bgcolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_pencolor_hex_new = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_pencolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_fillcolor_hex_new = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_fillcolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_color = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_pencolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_fillcolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME2'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_color_hex = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR1') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_pencolor); + this.appendValueInput('VAR2') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_fillcolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_bgcolor_hex = { + init: function () { + + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_bgcolor_hex); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_pencolor_hex = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_pencolor_hex); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_fillcolor_hex = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_fillcolor_hex); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_shape = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var shape = [ + [Blockly.Msg.blockpy_turtle_shape_arrow, 'arrow'], [Blockly.Msg.blockpy_turtle_shape_turtle, 'turtle'], + [Blockly.Msg.blockpy_turtle_shape_circle, 'circle'], [Blockly.Msg.blockpy_turtle_shape_square, 'square'], + [Blockly.Msg.blockpy_turtle_shape_triangle, 'triangle'], [Blockly.Msg.blockpy_turtle_shape_classic, 'classic'] + ]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_turtle_shape) + .appendField(new Blockly.FieldDropdown(shape), 'DIR'); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.TURTLE_SHAPE_TOOLTIP); + } +}; + +export const turtle_shapesize = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE); + this.appendValueInput('WID') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE_WID); + this.appendValueInput('LEN') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE_LEN); + this.appendValueInput('OUTLINE') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE_OUTLINE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SHAPESIZE); + } +}; + +export const turtle_numinput = { + init: function () { + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_NUMINPUT) + this.setColour(TURTLE_HUE); + this.appendValueInput('TITLE') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_TITLE); + this.appendValueInput('PROMPT') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_PROMPT); + this.appendValueInput('DEFAULT') + .setCheck(Number) + .appendField(Blockly.Msg.DICTS_DEFAULT_VALUE); + this.appendValueInput('MIN') + .setCheck(Number) + .appendField(Blockly.Msg.MATH_ONLIST_OPERATOR_MIN); + this.appendValueInput('MAX') + .setCheck(Number) + .appendField(Blockly.Msg.MATH_ONLIST_OPERATOR_MAX); + this.setInputsInline(true); + this.setOutput(true, Number); + this.setTooltip(Blockly.Msg.TURTLE_NUMINPUT_TOOLTIP); + } +}; + +export const turtle_textinput = { + init: function () { + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT) + this.setColour(TURTLE_HUE); + this.appendValueInput('TITLE') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_TITLE); + this.appendValueInput('PROMPT') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_PROMPT); + this.setInputsInline(true); + this.setOutput(true, String); + this.setTooltip(Blockly.Msg.TURTLE_TEXTINPUT_TOOLTIP); + } +}; + +export const turtle_write = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_write); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.TURTLE_WRITE_TOOLTIP); + } +}; + +export const turtle_write_format = { + init: function () { + var move = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True']]; + var align = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_LEFT, 'left'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_RIGHT, 'right']]; + var fonttype = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_NORMAL, 'normal'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD, 'bold'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_ITALIC, 'italic'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD_ITALIC, 'bold","italic']]; + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_write); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE) + .appendField(new Blockly.FieldDropdown(move), 'MOVE'); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN) + .appendField(new Blockly.FieldDropdown(align), 'ALIGN'); + this.appendValueInput('FONTNAME') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NAME); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE) + .appendField(new Blockly.FieldDropdown(fonttype), 'FONTTYPE'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.TURTLE_WRITE_TOOLTIP); + } +}; + +export const turtle_write_format_skulpt = { + init: function () { + var move = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True']]; + var align = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_LEFT, 'left'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_RIGHT, 'right']]; + var fonttype = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_NORMAL, 'normal'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD, 'bold'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_ITALIC, 'italic']]; + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_write); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE) + .appendField(new Blockly.FieldDropdown(move), 'MOVE'); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN) + .appendField(new Blockly.FieldDropdown(align), 'ALIGN'); + this.appendValueInput('FONTNAME') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NAME); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE) + .appendField(new Blockly.FieldDropdown(fonttype), 'FONTTYPE'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.TURTLE_WRITE_TOOLTIP); + } +}; + + +export const turtle_color_seclet = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(new Blockly.FieldColour("ff0000"), "COLOR"); + this.setInputsInline(true); + this.setOutput(true, String); + } +}; + +export const turtle_getscreen = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput("") + + .appendField(Blockly.Msg.MIXLY_TURTEL_GETSCREEN) + .appendField(new Blockly.FieldTextInput('screen'), 'VAR') + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_TURTEL_GETSCREEN_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +export const turtle_update = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_TURTLE_UPDATE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONKEY_TOOLTIP); + } +}; + +export const turtle_onkey = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_TURTEL_EVENT_ONKEY); + this.appendValueInput('callback') + .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONKEY_TOOLTIP); + } +}; + +export const turtle_onclick = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTEL_EVENT_ONCLICK); + this.appendValueInput('callback') + .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONCLICK_TOOLTIP); + } +}; + +export const turtle_ontimer = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_TURTEL_EVENT_ONTIMER); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_mSecond); + this.appendValueInput('callback') + .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONTIMER_TOOLTIP); + } +}; + +export const turtle_listen = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_TURTEL_SCREEN_LISTEN); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_screen_savefig = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendValueInput("FILE") + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PL_SAVEFIG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(Blockly.Msg.mixpy_TURTLE_SAVEFIG_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/converters/ai.js b/mixly/boards/default_src/python_mixpy/converters/ai.js new file mode 100644 index 00000000..a56fbe5b --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/ai.js @@ -0,0 +1,412 @@ +'use strict'; + + +pbc.assignD.get('AipImageClassify')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var funcName = py2block.identifier(value.func.attr); + var moduleName = py2block.Name_str(value.func.value); + if(moduleName === "aip" && funcName === "AipImageClassify" && value.args.length === 2) + return true; + return false; +} + +pbc.assignD.get('AipImageClassify')['create_block'] = function(py2block, node, targets, value){ + //var mode = py2block.Str_value(value.args[1]); + return block("AI_client", node.lineno, { + "CTYPE":"AipImageClassify" + }, { + //"APP_ID":py2block.convert(value.args[0]), + "API_KEY":py2block.convert(value.args[0]), + "SECRET_KEY":py2block.convert(value.args[1]), + "SUB":py2block.convert(targets[0]) + }); +} + +pbc.assignD.get('AipSpeech')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var funcName = py2block.identifier(value.func.attr); + var moduleName = py2block.Name_str(value.func.value); + if(moduleName === "aip" && funcName === "AipSpeech" && value.args.length === 2) + return true; + return false; +} + +pbc.assignD.get('AipSpeech')['create_block'] = function(py2block, node, targets, value){ + //var mode = py2block.Str_value(value.args[1]); + return block("AI_client", node.lineno, { + "CTYPE":"AipSpeech" + }, { + //"APP_ID":py2block.convert(value.args[0]), + "API_KEY":py2block.convert(value.args[0]), + "SECRET_KEY":py2block.convert(value.args[1]), + "SUB":py2block.convert(targets[0]) + }); +} + +pbc.assignD.get('AipImageCensor')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var funcName = py2block.identifier(value.func.attr); + var moduleName = py2block.Name_str(value.func.value); + if(moduleName === "aip" && funcName === "AipImageCensor" && value.args.length === 2) + return true; + return false; +} + +pbc.assignD.get('AipImageCensor')['create_block'] = function(py2block, node, targets, value){ + //var mode = py2block.Str_value(value.args[1]); + return block("AI_client", node.lineno, { + "CTYPE":"AipImageCensor" + }, { + //"APP_ID":py2block.convert(value.args[0]), + "API_KEY":py2block.convert(value.args[0]), + "SECRET_KEY":py2block.convert(value.args[1]), + "SUB":py2block.convert(targets[0]) + }); +} + +pbc.assignD.get('AipOcr')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var funcName = py2block.identifier(value.func.attr); + var moduleName = py2block.Name_str(value.func.value); + if(moduleName === "aip" && funcName === "AipOcr" && value.args.length === 2) + return true; + return false; +} + +pbc.assignD.get('AipOcr')['create_block'] = function(py2block, node, targets, value){ + //var mode = py2block.Str_value(value.args[1]); + return block("AI_client", node.lineno, { + "CTYPE":"AipOcr" + }, { + //"APP_ID":py2block.convert(value.args[0]), + "API_KEY":py2block.convert(value.args[0]), + "SECRET_KEY":py2block.convert(value.args[1]), + "SUB":py2block.convert(targets[0]) + }); +} + +pbc.assignD.get('AipNlp')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var funcName = py2block.identifier(value.func.attr); + var moduleName = py2block.Name_str(value.func.value); + if(moduleName === "aip" && funcName === "AipNlp" && value.args.length === 2) + return true; + return false; +} + +pbc.assignD.get('AipNlp')['create_block'] = function(py2block, node, targets, value){ + //var mode = py2block.Str_value(value.args[1]); + return block("AI_client", node.lineno, { + "CTYPE":"AipNlp" + }, { + //"APP_ID":py2block.convert(value.args[0]), + "API_KEY":py2block.convert(value.args[0]), + "SECRET_KEY":py2block.convert(value.args[1]), + "SUB":py2block.convert(targets[0]) + }); +} + +pbc.assignD.get('AipFace')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var funcName = py2block.identifier(value.func.attr); + var moduleName = py2block.Name_str(value.func.value); + if(moduleName === "aip" && funcName === "AipFace" && value.args.length === 2) + return true; + return false; +} + +pbc.assignD.get('AipFace')['create_block'] = function(py2block, node, targets, value){ + //var mode = py2block.Str_value(value.args[1]); + return block("AI_client", node.lineno, { + "CTYPE":"AipFace" + }, { + //"APP_ID":py2block.convert(value.args[0]), + "API_KEY":py2block.convert(value.args[0]), + "SECRET_KEY":py2block.convert(value.args[1]), + "SUB":py2block.convert(targets[0]) + }); +} + +function AIChooseAndGet(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + + return block("AI_ChooseAndGet", func.lineno, {"TYPE":mode}, {}, { + "inline": "true" + }); + } + return converter; +} + +pbc.moduleFunctionD.get('FileDialog')['getOneFile'] = AIChooseAndGet('getOneFile'); +pbc.moduleFunctionD.get('FileDialog')['getManyFiles'] = AIChooseAndGet('getManyFiles'); +pbc.moduleFunctionD.get('FileDialog')['getDirectory'] = AIChooseAndGet('getDirectory'); + +pbc.objectFunctionD.get('synthesis')['Dict'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + return block("AI_Speech_synthesis", func.lineno, {}, { + "SUB": objblock, + "STR": argument, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); +}; + +pbc.objectFunctionD.get('asr')['Dict'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + return block("AI_Speech_asr", func.lineno, {}, { + "SUB": objblock, + "FILE": argument, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); +}; + +pbc.objectFunctionD.get('advancedGeneral')['Dict'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + return block("AI_ImageClassify", func.lineno, {}, { + "SUB": objblock, + "FUNC": block("AI_ImageClassify_Func", func.lineno, {"TYPE":"advancedGeneral"}, {}), + "ADDR": argument, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); +}; + +pbc.objectFunctionD.get('match')['Dict'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + var argument1 = py2block.convert(args[1]); + return block("AI_Face_match", func.lineno, {}, { + "SUB": objblock, + "VAR": argument, + "VAR2": argument1, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); +}; + +function AIImageClassify(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + return block("AI_ImageClassify", func.lineno, {}, { + "SUB": objblock, + "FUNC": block("AI_ImageClassify_Func", func.lineno, {"TYPE":mode}, {}), + "ADDR": argument, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); + } + return converter; +} + +pbc.objectFunctionD.get('advancedGeneral')['Dict'] = AIImageClassify('advancedGeneral'); +pbc.objectFunctionD.get('dishDetect')['Dict'] = AIImageClassify('dishDetect'); +pbc.objectFunctionD.get('carDetect')['Dict'] = AIImageClassify('carDetect'); +pbc.objectFunctionD.get('animalDetect')['Dict'] = AIImageClassify('animalDetect'); +pbc.objectFunctionD.get('plantDetect')['Dict'] = AIImageClassify('plantDetect'); +pbc.objectFunctionD.get('logoSearch')['Dict'] = AIImageClassify('logoSearch'); + +function AIORC(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + return block("AI_Ocr", func.lineno, {}, { + "SUB": objblock, + "FUNC": block("AI_Ocr_Func", func.lineno, {"TYPE":mode}, {}), + "ADDR": argument, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); + } + return converter; +} + +pbc.objectFunctionD.get('basicGeneral')['Dict'] = AIORC('basicGeneral'); +pbc.objectFunctionD.get('webImage')['Dict'] = AIORC('webImage'); +pbc.objectFunctionD.get('idcard')['Dict'] = AIORC('idcard'); +pbc.objectFunctionD.get('bankcard')['Dict'] = AIORC('bankcard'); +pbc.objectFunctionD.get('drivingLicense')['Dict'] = AIORC('drivingLicense'); +pbc.objectFunctionD.get('vehicleLicense')['Dict'] = AIORC('vehicleLicense'); +pbc.objectFunctionD.get('licensePlate')['Dict'] = AIORC('licensePlate'); +pbc.objectFunctionD.get('businessLicense')['Dict'] = AIORC('businessLicense'); +pbc.objectFunctionD.get('receipt')['Dict'] = AIORC('receipt'); +pbc.objectFunctionD.get('trainTicket')['Dict'] = AIORC('trainTicket'); +pbc.objectFunctionD.get('taxiReceipt')['Dict'] = AIORC('taxiReceipt'); +pbc.objectFunctionD.get('tableRecognition')['Dict'] = AIORC('tableRecognition'); +pbc.objectFunctionD.get('vatInvoice')['Dict'] = AIORC('vatInvoice'); +pbc.objectFunctionD.get('passport')['Dict'] = AIORC('passport'); +pbc.objectFunctionD.get('handwriting')['Dict'] = AIORC('handwriting'); + +function AINLP(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + return block("AI_Nlp", func.lineno, {}, { + "SUB": objblock, + "FUNC": block("AI_Nlp_Func", func.lineno, {"TYPE":mode}, {}), + "STR": argument, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); + } + return converter; +} + +pbc.objectFunctionD.get('lexer')['Dict'] = AINLP('lexer'); +pbc.objectFunctionD.get('depParser')['Dict'] = AINLP('depParser'); +pbc.objectFunctionD.get('wordEmbedding')['Dict'] = AINLP('wordEmbedding'); +pbc.objectFunctionD.get('dnnlm')['Dict'] = AINLP('dnnlm'); +pbc.objectFunctionD.get('commentTag')['Dict'] = AINLP('commentTag'); +pbc.objectFunctionD.get('sentimentClassify')['Dict'] = AINLP('sentimentClassify'); +pbc.objectFunctionD.get('keyword')['Dict'] = AINLP('keyword'); +//pbc.objectFunctionD.get('topic')['Dict'] = AINLP('topic'); +pbc.objectFunctionD.get('ecnet')['Dict'] = AINLP('ecnet'); +pbc.objectFunctionD.get('emotion')['Dict'] = AINLP('emotion'); + +function AISIMILARITY(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + var argument1 = py2block.convert(args[1]); + var a; + return block("AI_Nlp_Sim", func.lineno, {}, { + "SUB": objblock, + "FUNC": block("AI_Nlp_Func_sim", func.lineno, {"TYPE":mode}, {}), + "STR1": argument, + "STR2": argument1, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); + } + return converter; +} + +pbc.objectFunctionD.get('wordSimEmbedding')['Dict'] = AISIMILARITY('wordSimEmbedding'); +pbc.objectFunctionD.get('simnet')['Dict'] = AISIMILARITY('simnet'); + + +pbc.objectFunctionD.get('newsSummary')['Dict'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + var argument1 = py2block.convert(args[1]); + return block("AI_Nlp_newsSummary", func.lineno, {}, { + "SUB": objblock, + "STR": argument, + "LEN": argument1, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); +}; + +pbc.objectFunctionD.get('topic')['Dict'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (keywords.length > 1) { + throw new Error("Incorrect number of arguments"); + } + if (keywords.length == 0){ + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + var argument1 = py2block.convert(args[1]); + return block("AI_Nlp_Topic", func.lineno, {}, { + "SUB": objblock, + "STR1": argument, + "STR2": argument1, + }, { + "inline": "false" + }); + } + if (keywords.length == 1){ + var objblock = py2block.convert(func.value); + var argument = py2block.convert(args[0]); + return block("AI_Nlp", func.lineno, {}, { + "SUB": objblock, + "FUNC": block("AI_Nlp_Func", func.lineno, {"TYPE":"topic"}, {}), + "STR": argument, + 'ATTR':py2block.convert(keywords[0].value) + }, { + "inline": "false" + }); + } +}; + +pbc.moduleFunctionD.get('audio')['audio_record'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var varblock = py2block.convert(args[0]); + var numblock = py2block.convert(args[1]); + return [block("AI_audio", func.lineno, {}, { + 'VAR': varblock, + 'TIME': numblock + }, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('cam')['photo_capture'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var varblock = py2block.convert(args[0]); + var numblock = py2block.convert(args[1]); + return [block("AI_photo", func.lineno, {}, { + 'VAR': varblock, + 'BUT': numblock + }, { + "inline": "true" + })]; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/converters/communicate.js b/mixly/boards/default_src/python_mixpy/converters/communicate.js new file mode 100644 index 00000000..8552895d --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/communicate.js @@ -0,0 +1,86 @@ +'use strict'; + +// pbc.assignD.get('Response')['check_assign'] = function (py2block, node, targets, value) { +// if(value.func._astname != "Attribute" || value.func.value._astname != "Name"){ +// return false; +// } +// var moduleName = py2block.Name_str(value.func.value); +// var funcName = py2block.identifier(value.func.attr); +// if (value._astname === "Call" && moduleName === "requests" +// && funcName === "get" && value.args.length === 1) +// return true; +// return false; +// } + +// pbc.assignD.get('Response')['create_block'] = function (py2block, node, targets, value) { +// var nameblock = py2block.Name_str(node.targets[0]); +// var argblock = py2block.convert(value.args[0]); +// return block('requests_get', node.lineno, { +// 'VAR': nameblock +// }, { +// 'DOMAIN':argblock +// }); +// } + +function communicateRequestmethod(mode) { + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + return block("requests_get", func.lineno, { + 'TYPE': mode, + }, { + 'URL': argblock + }, { + "inline": "true" + }); + + } + return converter; + +} + +pbc.moduleFunctionD.get('requests')['get'] = communicateRequestmethod('get'); +pbc.moduleFunctionD.get('requests')['head'] = communicateRequestmethod('head'); +pbc.moduleFunctionD.get('requests')['delete'] = communicateRequestmethod('delete'); + +function communicatePostmethod(mode) { + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + var keyblock = py2block.convert(keywords[0].value) + return block("requests_post", func.lineno, { + 'TYPE': mode, + }, { + 'URL': argblock, + 'data':keyblock + }, { + "inline": "true" + }); + + } + return converter; + +} + +pbc.moduleFunctionD.get('requests')['post'] = communicatePostmethod('post'); +pbc.moduleFunctionD.get('requests')['put'] = communicatePostmethod('put'); +pbc.moduleFunctionD.get('requests')['patch'] = communicatePostmethod('patch'); + +function modelsResponse(py2block, node, value, attr) { + return block('requests_attribute', node.lineno, { + 'ATTR': py2block.identifier(attr) + }, { + 'VAL': py2block.convert(value) + }); +} + +pbc.objectAttrD.get('status_code')['Response'] = modelsResponse; +pbc.objectAttrD.get('text')['Response'] = modelsResponse; +pbc.objectAttrD.get('cookies')['Response'] = modelsResponse; +pbc.objectAttrD.get('content')['Response'] = modelsResponse; +pbc.objectAttrD.get('encoding')['Response'] = modelsResponse; + diff --git a/mixly/boards/default_src/python_mixpy/converters/cv.js b/mixly/boards/default_src/python_mixpy/converters/cv.js new file mode 100644 index 00000000..d06baf61 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/cv.js @@ -0,0 +1,244 @@ +'use strict'; + +pbc.moduleFunctionD.get('cv2')['imread'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + return block("cv_read_image", func.lineno, {}, { + 'FILE': arg1block + }, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('cv2')['CascadeClassifier'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + return block("cv_face_classifier", func.lineno, {}, { + 'FILE': arg1block + }, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('cv2')['imshow'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 2) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("cv_show_image", func.lineno, {}, { + 'data': arg1block, + 'FILE':arg2block + }, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('cv2')['imwrite'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 2) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("cv_write_image", func.lineno, {}, { + 'data': arg1block, + 'FILE':arg2block + }, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('cv2')['waitKey'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + return [block("cv_waitkey", func.lineno, {}, { + 'data': arg1block + }, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('cv2')['destroyAllWindows'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + return [block("cv_destroy_all", func.lineno, {}, {}, { + "inline": "true" + })]; +} + + +function cvRectLine(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 5) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + + var x1 = args[1].elts[0] + var y1 = args[1].elts[1] + var x2 = args[2].elts[0] + var y2 = args[2].elts[1] + + var colorv='#' + if(args[3].elts[2].n.v.toString(16).length==1){ + colorv+='0' + } + colorv+=args[3].elts[2].n.v.toString(16) + if(args[3].elts[1].n.v.toString(16).length==1){ + colorv+='0' + } + colorv+=args[3].elts[1].n.v.toString(16) + if(args[3].elts[0].n.v.toString(16).length==1){ + colorv+='0' + } + colorv+=args[3].elts[0].n.v.toString(16) + var color = { + _astname: "Str", + s: { + 'v': colorv + } + } + var x1block = py2block.convert(x1); + var x2block = py2block.convert(x2); + var y1block = py2block.convert(y1); + var y2block = py2block.convert(y2); + var colorblock = py2block.Str_value(color); + var arg5block = py2block.convert(args[4]); + return [block("cv_line_rect", func.lineno, { + 'DIR':mode, + 'FIELDNAME':colorblock + }, { + 'FILE': arg1block, + 'x1':x1block, + 'y1':y1block, + 'x2':x2block, + 'y2':y2block, + 'thick':arg5block, + + }, { + "inline": "true" + })]; +} + return converter; +} + +pbc.moduleFunctionD.get('cv2')['rectangle'] = cvRectLine('rectangle') +pbc.moduleFunctionD.get('cv2')['line'] = cvRectLine('line') + +pbc.moduleFunctionD.get('cv2')['putText'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 7) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + var x1 = args[2].elts[0] + var y1 = args[2].elts[1] + + var colorv='#' + if(args[5].elts[2].n.v.toString(16).length==1){ + colorv+='0' + } + colorv+=args[5].elts[2].n.v.toString(16) + if(args[5].elts[1].n.v.toString(16).length==1){ + colorv+='0' + } + colorv+=args[5].elts[1].n.v.toString(16) + if(args[5].elts[0].n.v.toString(16).length==1){ + colorv+='0' + } + colorv+=args[5].elts[0].n.v.toString(16) + var color = { + _astname: "Str", + s: { + 'v': colorv + } + } + var x1block = py2block.convert(x1); + var y1block = py2block.convert(y1); + var colorblock = py2block.Str_value(color); + var arg5block = py2block.convert(args[4]); + var arg7block = py2block.convert(args[6]); + var font = args[3].attr.v.slice(13) + return [block("cv_text", func.lineno, { + 'font':font, + 'FIELDNAME':colorblock + }, { + 'FILE': arg1block, + 'data':arg2block, + 'x1':x1block, + 'y1':y1block, + 'size':arg5block, + 'thick':arg7block, + + }, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('detectMultiScale')['face'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1 || keywords.length < 2) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + var faceblock = py2block.convert(func.value); + if(keywords.length == 2){ + var keylist = new Array(2) + for(var i=0;i4) { + throw new Error("Incorrect number of arguments"); + } + var dottype = ','; + var linetype = ''; + var colortype = 'b'; + for(var i=0;i': + dottype=operate; + break; + + case '4': + dottype=operate; + break; + + case 'h': + dottype=operate; + break; + + case 'D': + dottype=operate; + break; + + case 'v': + dottype=operate; + break; + + case '1': + dottype=operate; + break; + + case 's': + dottype=operate; + break; + + case 'd': + dottype=operate; + break; + + case 'H': + dottype=operate; + break; + } + + } + } + + return [block("pl_plot", func.lineno, { + 'DOT':dottype, + 'LINE':linetype, + 'COLOR':colortype + }, { + 'SER': argblock + }, { + "inline": "true" + })]; + } + else{ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("pl_plot_bar", func.lineno, { + 'DIR':"plot" + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; + } + } + else if(args.length == 3){ + + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + var lineblock = args[2].s.v; + if (lineblock.length>4) { + throw new Error("Incorrect number of arguments"); + } + var dottype = ','; + var linetype = ''; + var colortype = 'b'; + for(var i=0;i': + dottype=operate; + break; + + case '4': + dottype=operate; + break; + + case 'h': + dottype=operate; + break; + + case 'D': + dottype=operate; + break; + + case 'v': + dottype=operate; + break; + + case '1': + dottype=operate; + break; + + case 's': + dottype=operate; + break; + + case 'd': + dottype=operate; + break; + + case 'H': + dottype=operate; + break; + } + + } + } + var args0 = { + _astname: "Str", + n: { + 'v': "" + } + } + if(keywords.length==1&&keywords[0].arg.v=='label'){ + args0=py2block.convert(keywords[0].value) + } + return [block("pl_plot_xy", func.lineno, { + 'DOT':dottype, + 'LINE':linetype, + 'COLOR':colortype + }, { + 'A': arg1block, + 'B':arg2block, + 'TAG':args0 + }, { + "inline": "true" + })]; + } +} + +pbc.moduleFunctionD.get('pylab')['bar'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length >2) { + throw new Error("Incorrect number of arguments"); + } + + + if (args.length == 2){ + if(keywords.length==0){ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("pl_plot_bar", func.lineno, { + 'DIR':"bar" + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; + } + else{ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + + for(var i=0;i 3 || args.length < 1) { + throw new Error("Incorrect number of arguments"); + } + var arg1block, arg2block, arg3block; + if (args.length == 1) { + arg2block = py2block.convert(args[0]); + var args0 = { + _astname: "Num", + n: { + 'v': 0 + } + + }; + arg1block = py2block.convert(args0); + var args2 = { + _astname: "Num", + n: { + 'v': 1 + } + }; + arg3block = py2block.convert(args2); + }else if (args.length == 2) { + var args2 = { + _astname: "Num", + n: { + 'v': 1 + } + }; + arg1block = py2block.convert(args[0]); + arg2block = py2block.convert(args[1]); + arg3block = py2block.convert(args2); + }else { + arg1block = py2block.convert(args[0]); + arg2block = py2block.convert(args[1]); + arg3block = py2block.convert(args[2]); + } + return block("array_create", func.lineno, {}, { + 'FROM': arg1block, + 'TO': arg2block, + 'STEP': arg3block + }, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('pylab')['subplot'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 3 ) { + throw new Error("Incorrect number of arguments"); + } + var arg1block, arg2block, arg3block; + { + arg1block = py2block.convert(args[0]); + arg2block = py2block.convert(args[1]); + arg3block = py2block.convert(args[2]); + } + return [block("pl_subplot", func.lineno, {}, { + 'VET': arg1block, + 'HOR': arg2block, + 'NUM': arg3block + }, { + "inline": "true" + })]; +} + + +pbc.moduleFunctionD.get('pandas')['read_csv'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1 ) { + throw new Error("Incorrect number of arguments"); + } + + var argblock = py2block.convert(args[0]); + if(keywords.length>0){ + if (keywords[0].value._astname=='Num'){ + var args0=keywords[0].value.n.v + } + else if (keywords[0].value._astname=='Name'){ + var args0=keywords[0].value.id.v + } +} + else{ + var args0=0 + } + return block("pandas_readcsv", func.lineno, { + 'MODE':args0 + }, { + 'FILENAME': argblock, + + }, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('pylab')['savefig'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + return [block("pl_savefig", func.lineno, {}, { + "FILE" : argblock + }, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('pylab')['text'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 3 ) { + throw new Error("Incorrect number of arguments"); + } + var arg1block, arg2block, arg3block; + { + arg1block = py2block.convert(args[0]); + arg2block = py2block.convert(args[1]); + arg3block = py2block.convert(args[2]); + } + for(var i=0;i1) { + throw new Error("Incorrect number of arguments"); + } + + + + + var arg1block = py2block.convert(args[0]); + + + for(var i=0;i4) { + throw new Error("Incorrect number of arguments"); + } + var dottype = ','; + var linetype = ''; + var colortype = 'b'; + for(var i=0;i': + dottype=operate; + break; + + case '4': + dottype=operate; + break; + + case 'h': + dottype=operate; + break; + + case 'D': + dottype=operate; + break; + + case 'v': + dottype=operate; + break; + + case '1': + dottype=operate; + break; + + case 's': + dottype=operate; + break; + + case 'd': + dottype=operate; + break; + + case 'H': + dottype=operate; + break; + } + + } + } + + return [block("plot_plot", func.lineno, { + 'DOT':dottype, + 'LINE':linetype, + 'COLOR':colortype + }, { + 'SER': argblock + }, { + "inline": "true" + })]; + } + else{ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("plot_plot_bar", func.lineno, { + 'DIR':"plot" + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; + } + } + else if(args.length == 3){ + + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + var lineblock = args[2].s.v; + if (lineblock.length>4) { + throw new Error("Incorrect number of arguments"); + } + var dottype = ','; + var linetype = ''; + var colortype = 'b'; + for(var i=0;i': + dottype=operate; + break; + + case '4': + dottype=operate; + break; + + case 'h': + dottype=operate; + break; + + case 'D': + dottype=operate; + break; + + case 'v': + dottype=operate; + break; + + case '1': + dottype=operate; + break; + + case 's': + dottype=operate; + break; + + case 'd': + dottype=operate; + break; + + case 'H': + dottype=operate; + break; + } + + } + } + var args0 = { + _astname: "Str", + n: { + 'v': "" + } + } + if(keywords.length==1&&keywords[0].arg.v=='label'){ + args0=py2block.convert(keywords[0].value) + } + return [block("plot_plot_xy", func.lineno, { + 'DOT':dottype, + 'LINE':linetype, + 'COLOR':colortype + }, { + 'A': arg1block, + 'B':arg2block, + 'TAG':args0 + }, { + "inline": "true" + })]; + } +} + +pbc.moduleFunctionD.get('matplotlib.pyplot')['bar'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length >2) { + throw new Error("Incorrect number of arguments"); + } + + + if (args.length == 2){ + if(keywords.length==0){ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("plot_plot_bar", func.lineno, { + 'DIR':"bar" + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; + } + else{ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + + for(var i=0;i1) { + throw new Error("Incorrect number of arguments"); + } + + + + + var arg1block = py2block.convert(args[0]); + + + for(var i=0;i4) { + throw new Error("Incorrect number of arguments"); + } + var dottype = ','; + var linetype = '-'; + var colortype = 'b'; + for(var i=0;i': + dottype=operate; + break; + + case '4': + dottype=operate; + break; + + case 'h': + dottype=operate; + break; + + case 'D': + dottype=operate; + break; + + case 'v': + dottype=operate; + break; + + case '1': + dottype=operate; + break; + + case 's': + dottype=operate; + break; + + case 'd': + dottype=operate; + break; + + case 'H': + dottype=operate; + break; + + } + } + + return [block("pl_plot", func.lineno, { + 'DOT':dottype, + 'LINE':linetype, + 'COLOR':colortype + }, { + 'SER': argblock + }, { + "inline": "true" + })]; + } +} + + +function series_index_value(py2block, node, value, attr) { + return block('series_index_value', node.lineno, { + 'INDEX_VALUE': py2block.identifier(attr) + }, { + 'SERIES': py2block.convert(value) + }); +} + +pbc.objectAttrD.get('index')['Series'] = series_index_value; +pbc.objectAttrD.get('value')['Series'] = series_index_value; diff --git a/mixly/boards/default_src/python_mixpy/converters/hardware.js b/mixly/boards/default_src/python_mixpy/converters/hardware.js new file mode 100644 index 00000000..dcb60043 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/hardware.js @@ -0,0 +1,93 @@ +'use strict'; + +pbc.assignD.get('hardware')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var moduleName = py2block.Name_str(value.func.value); + var funcName = py2block.identifier(value.func.attr); + if(value._astname === "Call" && moduleName === "s4alib" + && funcName === "s4a_start" && value.args.length === 1) + return true; + return false; +} + +pbc.assignD.get('hardware')['create_block'] = function(py2block, node, targets, value){ + var argblock = py2block.convert(value.args[0]); + return block("hardware_arduino_start", node.lineno, { + }, { + // "PIN":argblock, + "SUB":py2block.convert(targets[0]), + }); +} + +pbc.objectFunctionD.get('digital_write')['s4a'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + pbc.pinType = "pins_digital_write"; + var pinblock = py2block.convert(args[0]); + pbc.pinType = "pins_digital"; + var argblock = py2block.convert(args[1]); + pbc.pinType = null; + var s4ablock=py2block.convert(func.value); + return [block("hardware_arduino_digital_write", func.lineno, {}, { + 'SUB':s4ablock, + "PIN": pinblock, + "STAT": argblock + }, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('digital_read')['s4a'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + pbc.pinType = "pins_digital_read"; + var pinblock = py2block.convert(args[0]); + pbc.pinType = null; + var s4ablock=py2block.convert(func.value); + return block("hardware_arduino_digital_read", func.lineno, {}, { + 'SUB':s4ablock, + "PIN": pinblock, + }, { + "inline": "true" + }); +} + +pbc.objectFunctionD.get('analog_write')['s4a'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + pbc.pinType = "pins_analog_write"; + var pinblock = py2block.convert(args[0]); + pbc.pinType = null; + var argblock = py2block.convert(args[1]); + var s4ablock=py2block.convert(func.value); + return [block("hardware_arduino_analog_write", func.lineno, {}, { + 'SUB':s4ablock, + "PIN": pinblock, + "NUM": argblock + }, { + "inline": "true" + })]; +} + + +pbc.objectFunctionD.get('analog_read')['s4a'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + pbc.pinType = "pins_analog_read"; + var pinblock = py2block.convert(args[0]); + pbc.pinType = null; + var s4ablock=py2block.convert(func.value); + return block("hardware_arduino_analog_read", func.lineno, {}, { + 'SUB':s4ablock, + "PIN": pinblock, + }, { + "inline": "true" + }); +} + diff --git a/mixly/boards/default_src/python_mixpy/converters/inout.js b/mixly/boards/default_src/python_mixpy/converters/inout.js new file mode 100644 index 00000000..0684b480 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/inout.js @@ -0,0 +1,98 @@ +'use strict'; + +pbc.globalFunctionD['input'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 1 && args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + if (args.length == 1){ + var argblock = py2block.convert(args[0]); + return block("inout_type_input", func.lineno, { + "DIR":"str" + }, { + 'VAR':argblock + }, { + "inline": "true" + });} + if (args.length == 0){ + + return block("inout_type_input", func.lineno, { + "DIR":"str" + }, { + //'VAR':argblock + }, { + "inline": "true" + });} +} + +pbc.moduleFunctionD.get('pyinput')['input'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 1 && args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + if (args.length == 1){ + var argblock = py2block.convert(args[0]); + return block("inout_type_input", func.lineno, { + "DIR":"str" + }, { + 'VAR':argblock + }, { + "inline": "true" + });} + if (args.length == 0){ + + return block("inout_type_input", func.lineno, { + "DIR":"str" + }, { + //'VAR':argblock + }, { + "inline": "true" + });} +} + + +//int(input('prompt'))在math.js中实现 +//float(input('prompt'))在lists.js中实现 + +pbc.globalFunctionD['print'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length === 1 && keywords.length === 1 + && py2block.identifier(keywords[0].arg) === "end" + && keywords[0].value._astname === "Str" + //&& py2block.Str_value(keywords[0].value) === "" + ) { if(py2block.Str_value(keywords[0].value) === ""){//print('Hello',end ="") + var argblock = py2block.convert(args[0]); + return [block("inout_print_inline", func.lineno, {}, { + 'VAR':argblock + }, { + "inline": "false" + })]; + } + else{ + var argblock = py2block.convert(args[0]); + return [block("inout_print_end", func.lineno, { + }, { + 'VAR':argblock, + 'END':py2block.convert(keywords[0].value) + }, { + "inline": "true" + })]; + } + }else if (args.length === 1 && keywords.length === 0) { //print('Hello') + var argblock = py2block.convert(args[0]); + return [block("inout_print", func.lineno, {}, { + 'VAR':argblock + }, { + "inline": "false" + })]; + }else if (args.length != 1 && keywords.length === 0) { //print() + var d = py2block.convertElements("ADD", args); + + return [block("inout_print_many", node.lineno, { + }, d, { + "inline": "true", + }, { + "@items":args.length + })]; + + }else{ + throw new Error("Incorrect number of arguments"); + } +} diff --git a/mixly/boards/default_src/python_mixpy/converters/iot.js b/mixly/boards/default_src/python_mixpy/converters/iot.js new file mode 100644 index 00000000..5a08e1d9 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/iot.js @@ -0,0 +1,162 @@ +'use strict'; + +var mqtt_client = 'mixiot.MixIO'; +pbc.assignD.get('from_mixly_key')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Attribute"){ + return false; + } + var funcName = py2block.identifier(value.func.attr); + var moduleName = py2block.identifier(value.func.value.attr); + if(moduleName === "MixIO" && funcName === "from_mixly_key" && value.args.length === 4) + return true; + return false; +} + +pbc.assignD.get('from_mixly_key')['create_block'] = function(py2block, node, targets, value){ + var arg0block = py2block.convert(value.args[0]); + var arg2block = py2block.convert(value.args[2]); + return block("IOT_EMQX_INIT_AND_CONNECT_BY_MIXLY_CODE", node.lineno, {}, { + 'SERVER': arg0block, + 'KEY':arg2block, + }); +} + +pbc.assignD.get('from_share_key')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Attribute"){ + return false; + } + var funcName = py2block.identifier(value.func.attr); + var moduleName = py2block.identifier(value.func.value.attr); + if(moduleName === "MixIO" && funcName === "from_share_key" && value.args.length === 4) + return true; + return false; +} + +pbc.assignD.get('from_share_key')['create_block'] = function(py2block, node, targets, value){ + var arg0block = py2block.convert(value.args[0]); + var arg2block = py2block.convert(value.args[2]); + return block("IOT_EMQX_INIT_AND_CONNECT_BY_SHARE_CODE", node.lineno, {}, { + 'SERVER': arg0block, + 'KEY':arg2block, + }); +} + +pbc.assignD.get('MixIO')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var funcName = py2block.identifier(value.func.attr); + var moduleName = py2block.Name_str(value.func.value); + if(moduleName === "mixiot" && funcName === "MixIO" && value.args.length === 6) + return true; + return false; +} + +pbc.assignD.get('MixIO')['create_block'] = function(py2block, node, targets, value){ + var arg0block = py2block.convert(value.args[0]); + var arg2block = py2block.convert(value.args[2]); + var arg3block = py2block.convert(value.args[3]); + var arg4block = py2block.convert(value.args[4]); + return block("iot_mixio_connect", node.lineno, {}, { + 'SERVER': arg0block, + 'USERNAME':arg2block, + 'PASSWORD': arg3block, + 'PROJECT':arg4block + }); +} + +pbc.objectFunctionD.get('publish')[mqtt_client] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 2) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + var arg1block = py2block.convert(args[1]); + return [block('IOT_MIXIO_PUBLISH', func.lineno, {}, { + 'TOPIC': argblock, + 'MSG': arg1block + }, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('unsubscribe')[mqtt_client] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + return [block('IOT_MIXIO_UNSUBSCRIBE', func.lineno, {}, { + 'TOPIC': argblock + }, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('subscribe_and_set_callback')[mqtt_client] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 2) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + var arg1block = py2block.convert(args[1]); + return [block('IOT_MIXIO_SUBSCRIBE', func.lineno, {}, { + 'TOPIC': argblock, + 'METHOD': arg1block + }, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('check_msg')[mqtt_client] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + + return [block('iot_mixio_check', func.lineno, {}, {}, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('connect')[mqtt_client] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + + return [block('iot_mixio_connect_only', func.lineno, {}, {}, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('disconnect')[mqtt_client] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + + return [block('iot_mixio_disconnect', func.lineno, {}, {}, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('mixpy')['format_content'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 2) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + + return block('IOT_FORMATTING', func.lineno, {}, { + 'VAR': argblock, + }, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('mixpy')['format_str'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + + return block('IOT_FORMAT_STRING', func.lineno, {}, { + 'VAR': argblock, + }, { + "inline": "true" + }); +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/converters/py2block_config.js b/mixly/boards/default_src/python_mixpy/converters/py2block_config.js new file mode 100644 index 00000000..36a23c51 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/py2block_config.js @@ -0,0 +1,82 @@ +function defDict(type) { + var dict = {}; + return { + get: function (key) { + if (!dict[key]) { + dict[key] = type.constructor(); + } + return dict[key]; + }, + dict: dict + }; +} + +function Py2blockConfig (){ + this.initIgnoreS(); + this.initModuleAttrD(); + this.initKnownModuleS(); + this.initObjectTypeD(); +} + +var pbc = Py2blockConfig.prototype; +pbc.MIXPY = "MIXPY"; +pbc.board = pbc.MIXPY; +pbc.objectFunctionD = defDict({}); +pbc.moduleFunctionD = defDict({}); +pbc.moduleAttrD = defDict({}); +pbc.objectAttrD = defDict({}); +pbc.globalFunctionD = {}; +pbc.assignD = defDict({}); +pbc.ifStatementD= defDict({}); +pbc.whileStatementD= defDict({}); +pbc.forStatementD= defDict({}); +pbc.reservedNameD= {}; +pbc.knownModuleS = new Set(); +pbc.objectTypeD = {}; //key:变量名,value:变量类型,如{'a':'List'} +pbc.ignoreS = new Set(); +pbc.pinType = null; +pbc.inScope = null; +pbc.formatModuleKeyL = []; +pbc.formatModuleL = []; + +//忽略某些方法、类、赋值 +pbc.initIgnoreS = function(){ + var pythonIgnoreL = [ + ]; + var boardIgnoreL = []; + + var ignoreL = pythonIgnoreL.concat(boardIgnoreL); + for (var i = 0; i < ignoreL.length; i++) { + this.ignoreS.add(ignoreL[i]); + } +} + + +pbc.initModuleAttrD = function(){ +} + +pbc.initKnownModuleS = function(){ + var pythonModuleL = [ + 'math', 'random' + ]; + var boardModuleL = []; + + var moduleL = pythonModuleL.concat(boardModuleL); + for (var i = 0; i < moduleL.length; i++) { + this.knownModuleS.add(moduleL[i]); + } +} + +pbc.initObjectTypeD = function () { + this.objectTypeD = { + 'tina': 'turtle.Turtle', + 'f': 'open' + } +} + +pbc.reset = function(){ + this.initObjectTypeD(); +} + +var py2block_config = new Py2blockConfig(); + diff --git a/mixly/boards/default_src/python_mixpy/converters/serial.js b/mixly/boards/default_src/python_mixpy/converters/serial.js new file mode 100644 index 00000000..97138bc2 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/serial.js @@ -0,0 +1,75 @@ +'use strict'; + +var serialClass = 'serial.Serial'; +pbc.assignD.get('Serial')['check_assign'] = function (py2block, node, targets, value) { + if(value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var moduleName = py2block.Name_str(value.func.value); + var funcName = py2block.identifier(value.func.attr); + if (value._astname === "Call" && moduleName === "serial" + && funcName === "Serial" && value.args.length === 2 && value.keywords.length === 1) + return true; + return false; +} + +pbc.assignD.get('Serial')['create_block'] = function (py2block, node, targets, value) { + var ser = py2block.Name_str(node.targets[0]); + if(value.keywords[0].arg.v == 'timeout') + {return block('serial_open', node.lineno, { + 'SER': ser, + 'BPS':value.args[1].n.v.toString() + }, { + "VAR":py2block.convert(value.keywords[0].value) + });} +} + +pbc.objectFunctionD.get('close')[serialClass] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var fileblock = py2block.convert(func.value); + return [block("serial_close", func.lineno, {}, { + "SER" : fileblock + }, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('write')[serialClass] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var fileblock = py2block.convert(func.value); + return [block("serial_write", func.lineno, {}, { + "SER" : fileblock, + 'VAR' : py2block.convert(args[0]) + }, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('read')[serialClass] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var fileblock = py2block.convert(func.value); + return block("serial_read_b", func.lineno, {}, { + "SER" : fileblock, + 'VAR' : py2block.convert(args[0]) + }, { + "inline": "true" + }); +} + +pbc.objectFunctionD.get('decode')['List'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + + return [block("lists_insert_value", func.lineno, {}, { + + }, { + "inline": "true" + })]; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/converters/sklearn.js b/mixly/boards/default_src/python_mixpy/converters/sklearn.js new file mode 100644 index 00000000..2b2440b4 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/sklearn.js @@ -0,0 +1,598 @@ +'use strict'; + +//sklearn 生成分类样本 +pbc.globalFunctionD['make_classification'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length === 0 && keywords.length === 8) { + var key1block = py2block.convert(keywords[0].value); + var key2block = py2block.convert(keywords[1].value); + var key3block = py2block.convert(keywords[2].value); + var key4block = py2block.convert(keywords[3].value); + var key5block = py2block.convert(keywords[4].value); + var key6block = py2block.convert(keywords[5].value); + var key7block = py2block.convert(keywords[6].value); + var key8block = py2block.convert(keywords[7].value); + return block("sklearn_make_classification", func.lineno, {}, { + "n_samples": key1block, + "n_features": key2block, + "n_informative": key3block, + "n_redundant": key4block, + "n_repeated": key5block, + "n_classes": key6block, + "n_clusters_per_class": key7block, + "random_state": key8block + }, { + "inline": "false" + }); + } + else + { + throw new Error("Incorrect number of arguments"); + } + +} + +//sklearn 生成回归样本 +pbc.globalFunctionD['make_regression'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length === 0 && keywords.length === 7) { + var key1block = py2block.convert(keywords[0].value); + var key2block = py2block.convert(keywords[1].value); + var key3block = py2block.convert(keywords[2].value); + var key4block = py2block.convert(keywords[3].value); + var key5block = py2block.convert(keywords[4].value); + var key6block = py2block.convert(keywords[5].value); + var key7block = py2block.convert(keywords[6].value); + return block("sklearn_make_regression", func.lineno, {}, { + "n_samples": key1block, + "n_features": key2block, + "n_informative": key3block, + "n_targets": key4block, + "bias": key5block, + "noise": key6block, + "random_state": key7block + }, { + "inline": "false" + }); + } + else + { + throw new Error("Incorrect number of arguments"); + } + +} + +//sklearn 生成聚类样本 +pbc.globalFunctionD['make_blobs'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length === 0 && keywords.length === 7) { + var key1block = py2block.convert(keywords[0].value); + var key2block = py2block.convert(keywords[1].value); + var key3block = py2block.convert(keywords[2].value); + var key4block = py2block.convert(keywords[3].value); + var key5block = py2block.convert(keywords[4].value); + var key6block = py2block.convert(keywords[5].value); + var key7block = py2block.convert(keywords[6].value); + return block("sklearn_make_blobs", func.lineno, {}, { + "n_samples": key1block, + "n_features": key2block, + "centers": key3block, + "cluster_std": key4block, + "center_box": key5block, + "shuffle": key6block, + "random_state": key7block + }, { + "inline": "false" + }); + } + else + { + throw new Error("Incorrect number of arguments"); + } + +} + +//sklearn 加载数据集 +function sklearn_load_check_assign(mode){ + function converter(py2block, node, targets, value) { + if(value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var moduleName = py2block.Name_str(value.func.value); + var funcName = py2block.identifier(value.func.attr); + value.args = value.args || []; + if (value._astname === "Call" && moduleName === "datasets" + && funcName === mode && !value.args.length) + return true; + return false; + } + return converter; +} + +function sklearn_load_create_block(){ + function converter(py2block, node, targets, value) { + var name = py2block.Name_str(node.targets[0]); + var type = py2block.identifier(value.func.attr); + //注意:赋值语句里,即使图形块上下可接,也不需要加[] + return block('sklearn_load', node.lineno, { + "name": name, + "type": type + }, {}); + } + return converter; +} + +pbc.assignD.get('load_iris')['check_assign'] = sklearn_load_check_assign('load_iris'); +pbc.assignD.get('load_boston')['check_assign'] = sklearn_load_check_assign('load_boston'); +pbc.assignD.get('load_diabetes')['check_assign'] = sklearn_load_check_assign('load_diabetes'); +pbc.assignD.get('load_breast_cancer')['check_assign'] = sklearn_load_check_assign('load_breast_cancer'); +pbc.assignD.get('load_linnerud')['check_assign'] = sklearn_load_check_assign('load_linnerud'); +pbc.assignD.get('load_digits')['check_assign'] = sklearn_load_check_assign('load_digits'); + +pbc.assignD.get('load_iris')['create_block'] = sklearn_load_create_block(); +pbc.assignD.get('load_boston')['create_block'] = sklearn_load_create_block(); +pbc.assignD.get('load_diabetes')['create_block'] = sklearn_load_create_block(); +pbc.assignD.get('load_breast_cancer')['create_block'] = sklearn_load_create_block(); +pbc.assignD.get('load_linnerud')['create_block'] = sklearn_load_create_block(); +pbc.assignD.get('load_digits')['create_block'] = sklearn_load_create_block(); + +//sklearn 获取特征值/标签值/标签/特征 +function sklearn_data_target(py2block, node, value, attr) { + return block('sklearn_data_target', node.lineno, { + "type": py2block.identifier(attr) + }, { + "name": py2block.convert(value) + }); +} +pbc.objectAttrD.get('data')['sklearn.datasets'] = sklearn_data_target; +pbc.objectAttrD.get('target')['sklearn.datasets'] = sklearn_data_target; +pbc.objectAttrD.get('target_names')['sklearn.datasets'] = sklearn_data_target; +pbc.objectAttrD.get('feature_names')['sklearn.datasets'] = sklearn_data_target; + +//sklearn 数据集分割 +pbc.globalFunctionD['train_test_split'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length === 2) { + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + var key1block = py2block.convert(keywords[0].value); + var key2block = py2block.convert(keywords[1].value); + return block("sklearn_train_test_split", func.lineno, {}, { + "train_data": arg1block, + "train_target": arg2block, + "test_size": key1block, + "rondom_state": key2block, + }, { + "inline": "false" + }); + } + else if(args.length === 1) + { + var arg1block = py2block.convert(args[0]); + var key1block = py2block.convert(keywords[0].value); + var key2block = py2block.convert(keywords[1].value); + return block("sklearn_train_test_split_no_target", func.lineno, {}, { + "train_data": arg1block, + "test_size": key1block, + "rondom_state": key2block, + }, { + "inline": "false" + }); + } + else + { + throw new Error("Incorrect number of arguments"); + } + +} + +//sklearn 初始化线性回归 +pbc.assignD.get('LinearRegression')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "LinearRegression" && !value.args.length) + return true; + return false; +} + +pbc.assignD.get('LinearRegression')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.keywords[0].value); + var key2block = py2block.convert(value.keywords[1].value); + var key3block = py2block.convert(value.keywords[2].value); + return block("sklearn_LinearRegression", node.lineno, {}, { + "model_name": name, + "fit_intercept": key1block, + "normalize": key2block, + "n_jobs": key3block + }); +} + +//sklearn 初始化岭回归 +pbc.assignD.get('Ridge')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "Ridge" && !value.args.length) + return true; + return false; +} + +pbc.assignD.get('Ridge')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.keywords[0].value); + var key2block = py2block.convert(value.keywords[1].value); + var key3block = py2block.convert(value.keywords[2].value); + var key4block = py2block.convert(value.keywords[3].value); + var key5block = py2block.convert(value.keywords[4].value); + return block("sklearn_Ridge", node.lineno, {}, { + "model_name": name, + "alpha": key1block, + "fit_intercept": key2block, + "normalize": key3block, + "max_iter": key4block, + "random_state": key5block + }); +} + +//sklearn 初始化决策树 分类算法 +pbc.assignD.get('DecisionTreeClassifier')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "DecisionTreeClassifier" && !value.args.length) + return true; + return false; +} +pbc.assignD.get('DecisionTreeClassifier')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.keywords[0].value); + var key2block = py2block.convert(value.keywords[1].value); + return block("sklearn_DecisionTreeClassifier_Regressor", node.lineno, { + "type": "DecisionTreeClassifier" + }, { + "model_name": name, + "max_depth": key1block, + "random_state": key2block + }); +} + +//sklearn 初始化决策树 回归算法 +pbc.assignD.get('DecisionTreeRegressor')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "DecisionTreeRegressor" && !value.args.length) + return true; + return false; +} +pbc.assignD.get('DecisionTreeRegressor')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.keywords[0].value); + var key2block = py2block.convert(value.keywords[1].value); + return block("sklearn_DecisionTreeClassifier_Regressor", node.lineno, { + "type": "DecisionTreeRegressor" + }, { + "model_name": name, + "max_depth": key1block, + "random_state": key2block + }); +} + +//sklearn 初始化随机森林 分类算法 +pbc.assignD.get('RandomForestClassifier')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "RandomForestClassifier" && !value.args.length) + return true; + return false; +} +pbc.assignD.get('RandomForestClassifier')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.keywords[0].value); + var key2block = py2block.convert(value.keywords[1].value); + var key3block = py2block.convert(value.keywords[2].value); + var key4block = py2block.convert(value.keywords[3].value); + return block("sklearn_RandomForestClassifier_Regressor", node.lineno, { + "type": "RandomForestClassifier" + }, { + "model_name": name, + "n_estimators": key1block, + "max_depth": key2block, + "n_jobs": key3block, + "random_state": key4block + }); +} + +//sklearn 初始化随机森林 回归算法 +pbc.assignD.get('RandomForestRegressor')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "RandomForestRegressor" && !value.args.length) + return true; + return false; +} +pbc.assignD.get('RandomForestRegressor')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.keywords[0].value); + var key2block = py2block.convert(value.keywords[1].value); + var key3block = py2block.convert(value.keywords[2].value); + var key4block = py2block.convert(value.keywords[3].value); + return block("sklearn_RandomForestClassifier_Regressor", node.lineno, { + "type": "RandomForestRegressor" + }, { + "model_name": name, + "n_estimators": key1block, + "max_depth": key2block, + "n_jobs": key3block, + "random_state": key4block + }); +} + +//sklearn 初始化K近邻 分类算法 +pbc.assignD.get('KNeighborsClassifier')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "KNeighborsClassifier" && !value.args.length) + return true; + return false; +} +pbc.assignD.get('KNeighborsClassifier')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.keywords[0].value); + var key2block = py2block.convert(value.keywords[1].value); + return block("sklearn_KNeighborsClassifier_Regressor", node.lineno, { + "type": "KNeighborsClassifier" + }, { + "model_name": name, + "K": key1block, + "n_jobs": key2block + }); +} + +//sklearn 初始化K近邻 回归算法 +pbc.assignD.get('KNeighborsRegressor')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "KNeighborsRegressor" && !value.args.length) + return true; + return false; +} +pbc.assignD.get('KNeighborsRegressor')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.keywords[0].value); + var key2block = py2block.convert(value.keywords[1].value); + return block("sklearn_KNeighborsClassifier_Regressor", node.lineno, { + "type": "KNeighborsRegressor" + }, { + "model_name": name, + "K": key1block, + "n_jobs": key2block + }); +} + +//sklearn 初始化高斯贝叶斯分类算法 +pbc.assignD.get('GaussianNB')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "GaussianNB" && !value.args.length) + return true; + return false; +} +pbc.assignD.get('GaussianNB')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + return block("sklearn_GaussianNB", node.lineno, {}, { + "model_name": name + }); +} + +//sklearn 初始K-均值聚类 +pbc.assignD.get('KMeans')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Name"){ + return false; + } + var funcName = value.func.id.v; + value.args = value.args || []; + if(funcName === "KMeans" && !value.args.length) + return true; + return false; +} + +pbc.assignD.get('KMeans')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.keywords[0].value); + var key2block = py2block.convert(value.keywords[1].value); + var key3block = py2block.convert(value.keywords[2].value); + var key4block = py2block.convert(value.keywords[3].value); + return block("sklearn_KMeans", node.lineno, {}, { + "model_name": name, + "n_clusters": key1block, + "max_iter": key2block, + "random_state": key3block, + "n_jobs": key4block + }); +} + +//sklearn 训练模型 +function sklearn_fit(){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if(args.length === 1) { + var objblock = py2block.convert(func.value); + var argblock1 = py2block.convert(args[0]); + return [block("sklearn_fit_no_target", func.lineno, {}, { + "model_name": objblock, + "train_data": argblock1 + }, { + "inline": "true" + })]; + } + else if(args.length === 2) { + var objblock = py2block.convert(func.value); + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + return [block("sklearn_fit", func.lineno, { + }, { + "model_name": objblock, + "train_data": argblock1, + "train_target": argblock2 + }, { + "inline": "true" + })]; + } + else + { + throw new Error("Incorrect number of arguments"); + } + } + return converter; +} +pbc.objectFunctionD.get('fit')['sklearn.fit'] = sklearn_fit(); + +//sklearn 模型预测 +function sklearn_predict(){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if(args.length === 1) + { + var objblock = py2block.convert(func.value); + var argblock1 = py2block.convert(args[0]); + return block("sklearn_predict", func.lineno, { + }, { + "model_name": objblock, + "train_data": argblock1 + }, { + "inline": "true" + }); + } + else + { + throw new Error("Incorrect number of arguments"); + } + } + return converter; +} +pbc.objectFunctionD.get('predict')['sklearn'] = sklearn_predict(); + +//sklearn 计算模型得分 +function sklearn_score(){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length === 2) { + var objblock = py2block.convert(func.value); + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + return block("sklearn_score", func.lineno, {}, { + "model_name": objblock, + "train_data": argblock1, + "train_target": argblock2 + }, { + "inline": "true" + }); + } + else if(args.length === 1) + { + var objblock = py2block.convert(func.value); + var argblock1 = py2block.convert(args[0]); + return block("sklearn_score_no_target", func.lineno, {}, { + "model_name": objblock, + "train_data": argblock1 + }, { + "inline": "true" + }); + } + else + { + throw new Error("Incorrect number of arguments"); + } + } + return converter; +} +pbc.objectFunctionD.get('score')['sklearn'] = sklearn_score(); + +//sklearn 线性回归 模型获取 斜率/截距 +function sklearn_coef_intercept(py2block, node, value, attr) { + return block('sklearn_coef_intercept', node.lineno, { + "type": py2block.identifier(attr) + }, { + "model_name": py2block.convert(value) + }); +} +pbc.objectAttrD.get('coef_')['sklearn.linear_model'] = sklearn_coef_intercept; +pbc.objectAttrD.get('intercept_')['sklearn.linear_model'] = sklearn_coef_intercept; + +//sklearn K-均值聚类 模型获取 簇中心坐标/聚类后的标签/所有点到对应簇中心的距离平方和 +function sklearn_cluster_centers_labels_inertia(py2block, node, value, attr) { + return block('sklearn_cluster_centers_labels_inertia', node.lineno, { + "type": py2block.identifier(attr) + }, { + "model_name": py2block.convert(value) + }); +} +pbc.objectAttrD.get('cluster_centers_')['sklearn.cluster'] = sklearn_cluster_centers_labels_inertia; +pbc.objectAttrD.get('labels_')['sklearn.cluster'] = sklearn_cluster_centers_labels_inertia; +pbc.objectAttrD.get('inertia_')['sklearn.cluster'] = sklearn_cluster_centers_labels_inertia; + +//sklearn 保存模型 +function sklearn_save_model(){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if(args.length === 2) { + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + var funcName = func.attr.v; + return [block("sklearn_save_load_model", func.lineno, { + "type" : funcName + }, { + "model_name": argblock1, + "address": argblock2 + }, { + "inline": "true" + })]; + } + else + { + throw new Error("Incorrect number of arguments"); + } + } + return converter; +} +pbc.objectFunctionD.get('dump')['sklearn.externals'] = sklearn_save_model(); + +//sklearn 加载模型 +pbc.assignD.get('load')['check_assign'] = function(py2block, node, targets, value) { + if(value._astname != "Call" || value.func._astname != "Attribute"){ + return false; + } + var funcName = value.func.attr.v; + if(funcName === "load" && value.args.length === 1) + return true; + return false; +} +pbc.assignD.get('load')['create_block'] = function(py2block, node, targets, value){ + var name = py2block.convert(node.targets[0]); + var key1block = py2block.convert(value.args[0]); + var funcName = value.func.attr.v; + return block("sklearn_save_load_model", node.lineno, { + "type" : funcName + }, { + "model_name" : name, + "address" : key1block + }); +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/converters/system.js b/mixly/boards/default_src/python_mixpy/converters/system.js new file mode 100644 index 00000000..24a7ae0e --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/system.js @@ -0,0 +1,45 @@ +'use strict'; + +pbc.globalFunctionD['exit'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + return [block("controls_end_program", func.lineno, {}, {}, { + "inline": "true" + })]; +} + + + +pbc.moduleFunctionD.get('time')['time'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + return block("controls_millis", func.lineno, {}, {}, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('time')['localtime'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + return block("time_localtime", func.lineno, { + "op":'all' + }, {}, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('time')['sleep'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + return [block("time_sleep", func.lineno, {}, { + + "DELAY_TIME":argblock + }, { + "inline": "true" + })]; +} diff --git a/mixly/boards/default_src/python_mixpy/converters/turtle.js b/mixly/boards/default_src/python_mixpy/converters/turtle.js new file mode 100644 index 00000000..d896d5b7 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/converters/turtle.js @@ -0,0 +1,1127 @@ +'use strict'; + +var turtleClass = 'turtle.Turtle'; +var screenClass = 'turtle.getscreen'; +pbc.assignD.get('Turtle')['check_assign'] = function (py2block, node, targets, value) { + if(value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var moduleName = py2block.Name_str(value.func.value); + var funcName = py2block.identifier(value.func.attr); + value.args = value.args || []; + if (value._astname === "Call" && moduleName === "turtle" + && (funcName === "Turtle" || funcName === "Pen")&& !value.args.length) + return true; + return false; +} + +pbc.assignD.get('Turtle')['create_block'] = function (py2block, node, targets, value) { + var turtle = py2block.Name_str(node.targets[0]); + return block('turtle_create', node.lineno, { + 'VAR': turtle + }, {}); +} + +pbc.assignD.get('Pen')['create_block'] = function (py2block, node, targets, value) { + var turtle = py2block.Name_str(node.targets[0]); + return block('turtle_create', node.lineno, { + 'VAR': turtle + }, {}); +} + +pbc.assignD.get('getscreen')['check_assign'] = function (py2block, node, targets, value) { + if(value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var moduleName = py2block.Name_str(value.func.value); + var funcName = py2block.identifier(value.func.attr); + value.args = value.args || []; + if (value._astname === "Call" + && funcName === "getscreen" && !value.args.length) + return true; + return false; +} + +pbc.assignD.get('getscreen')['create_block'] = function (py2block, node, targets, value) { + var turtle = py2block.Name_str(node.targets[0]); + var moduleName = py2block.convert(value.func.value); + return block('turtle_getscreen', node.lineno, { + 'VAR': turtle + }, { + 'TUR':moduleName + }); +} + +function turtleForwardBackward(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + return [block('turtle_move', func.lineno, { + 'DIR': mode + }, { + 'TUR': turtleblock, + 'VAR': argblock, + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.objectFunctionD.get('fd')[turtleClass] = turtleForwardBackward('forward'); +pbc.objectFunctionD.get('bk')[turtleClass] = turtleForwardBackward('backward'); +pbc.objectFunctionD.get('forward')[turtleClass] = turtleForwardBackward('forward'); +pbc.objectFunctionD.get('backward')[turtleClass] = turtleForwardBackward('backward'); + + +function turtleSetxy(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + return [block('turtle_setxy', func.lineno, { + 'DIR': mode + }, { + 'TUR': turtleblock, + 'VAR': argblock, + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.objectFunctionD.get('setx')[turtleClass] = turtleSetxy('x'); +pbc.objectFunctionD.get('sety')[turtleClass] = turtleSetxy('y'); + + +function turtleLeftRight(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + return [block('turtle_rotate', func.lineno, { + 'DIR': mode + }, { + 'TUR': turtleblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.objectFunctionD.get('left')[turtleClass] = turtleLeftRight('left'); +pbc.objectFunctionD.get('right')[turtleClass] = turtleLeftRight('right'); +pbc.objectFunctionD.get('lt')[turtleClass] = turtleLeftRight('left'); +pbc.objectFunctionD.get('rt')[turtleClass] = turtleLeftRight('right'); + + + +pbc.objectFunctionD.get('setheading')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + return [block('turtle_setheading', func.lineno, {}, { + 'TUR': turtleblock, + 'data': argblock, + }, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('delay')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value.value); + var argblock = py2block.convert(args[0]); + return [block('turtle_screen_delay', func.lineno, {}, { + 'TUR': turtleblock, + 'data': argblock, + }, { + "inline": "true" + })]; +} + +pbc.objectFunctionD.get('postscript')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + + var turtleblock = py2block.convert(func.value.func.value); + var argblock = py2block.convert(keywords[0].value); + return [block('turtle_screen_savefig', func.lineno, {}, { + 'TUR': turtleblock, + 'FILE': argblock, + }, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('turtle')['done'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + return [block("turtle_done", func.lineno, {}, {}, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('turtle')['mainloop'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + return [block("turtle_done", func.lineno, {}, {}, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('turtle')['exitonclick'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + return [block("turtle_exitonclick", func.lineno, {}, {}, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('turtle')['bgcolor'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + if (args[0]._astname != "Str") { + return [block("turtle_bgcolor_hex", func.lineno, {}, { + 'VAR': argblock + }, { + "inline": "true" + })]; + } + else{ + + return [block("turtle_bgcolor", func.lineno, {"FIELDNAME":py2block.Str_value(args[0])}, {}, { + "inline": "true" + })]; + } +} + + +pbc.objectFunctionD.get('goto')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var xblock = py2block.convert(args[0]); + var yblock = py2block.convert(args[1]); + return [block('turtle_goto', func.lineno, {}, { + 'TUR': turtleblock, + 'data': xblock, + 'val': yblock + }, { + "inline": "true" + })]; +} + + +function turtleClearResetHome(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return [block('turtle_clear', func.lineno, { + 'DIR': mode + }, { + 'TUR': turtleblock, + }, { + "inline": "true" + })]; + } + return converter; +} + +//turtle.clear方法和list里的clear方法重复 +pbc.objectFunctionD.get('clear')[turtleClass] = turtleClearResetHome('clear'); +pbc.objectFunctionD.get('reset')[turtleClass] = turtleClearResetHome('reset'); +pbc.objectFunctionD.get('home')[turtleClass] = turtleClearResetHome('home'); + + +function turtlePenupPendown(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return [block('turtle_penup', func.lineno, { + 'DIR': mode + }, { + 'TUR': turtleblock, + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.objectFunctionD.get('penup')[turtleClass] = turtlePenupPendown('penup'); +pbc.objectFunctionD.get('pendown')[turtleClass] = turtlePenupPendown('pendown'); + + +pbc.objectFunctionD.get('pensize')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var sizeblock = py2block.convert(args[0]); + return [block('turtle_size', func.lineno, {}, { + 'TUR': turtleblock, + 'data': sizeblock, + }, { + "inline": "true" + })]; +} + + +pbc.objectFunctionD.get('speed')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1&& args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + if (args.length == 1){ + var turtleblock = py2block.convert(func.value); + var speedblock = py2block.convert(args[0]); + return [block('turtle_speed', func.lineno, {}, { + 'TUR': turtleblock, + 'data': speedblock, + }, { + "inline": "true" + })];} + if(args.length == 0){ + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'speed' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + });} +} + +pbc.objectFunctionD.get('shape')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1 && args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + if (args.length == 1){ + var turtleblock = py2block.convert(func.value); + var shapeblock = py2block.Str_value(args[0]); + return [block('turtle_shape', func.lineno, { + + 'DIR': shapeblock + }, { + 'TUR': turtleblock, + + + }, { + "inline": "true" + })];} + if(args.length == 0){ + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'shape' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + });} +} + +pbc.objectFunctionD.get('shapesize')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 3 && args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + if (args.length == 3){ + var turtleblock = py2block.convert(func.value); + var widblock = py2block.convert(args[0]); + var lenblock = py2block.convert(args[1]); + var outlineblock = py2block.convert(args[2]); + return [block('turtle_shapesize', func.lineno, {}, { + 'TUR': turtleblock, + 'WID': widblock, + 'LEN': lenblock, + 'OUTLINE': outlineblock, + + + }, { + "inline": "true" + })];} + if(args.length == 0){ + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'shapesize' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + });} +} + + +pbc.objectFunctionD.get('width')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1 && args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + if (args.length == 1){ + var turtleblock = py2block.convert(func.value); + var widthblock = py2block.convert(args[0]); + return [block('turtle_size', func.lineno, {}, { + 'TUR': turtleblock, + 'data': widthblock + + }, { + "inline": "true" + })];} + if(args.length == 0){ + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'width' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + });} +} + +pbc.moduleFunctionD.get('turtle')['textinput'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + return block('turtle_textinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2 + }, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('turtle')['numinput'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length <2 || args.length + keywords.length >5 || keywords.length>2) { + throw new Error("Incorrect number of arguments"); + } + if(args.length==5){ + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + var argblock3 = py2block.convert(args[2]); + var argblock4 = py2block.convert(args[3]); + var argblock5 = py2block.convert(args[4]); + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MAX':argblock5, + 'MIN':argblock4 + }, { + "inline": "true" + }); + + } + if(args.length==4){ + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + var argblock3 = py2block.convert(args[2]); + var argblock4 = py2block.convert(args[3]); + if(keywords.length==1){ + if(py2block.identifier(keywords[0].arg) === "maxval"){ + var maxblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MAX':maxblock, + 'MIN':argblock4 + }, { + "inline": "true" + }); + } + if(py2block.identifier(keywords[0].arg) === "minval"){ + var minblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MIN':minblock, + 'MAX':argblock4 + }, { + "inline": "true" + }); + + } + } + if(keywords.length==0){ + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MIN':argblock4, + + }, { + "inline": "true" + }); + } + } + if(args.length==3){ + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + var argblock3 = py2block.convert(args[2]); + if(keywords.length==1){ + if(py2block.identifier(keywords[0].arg) === "maxval"){ + var maxblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MAX':maxblock + }, { + "inline": "true" + }); + } + if(py2block.identifier(keywords[0].arg) === "minval"){ + var minblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MIN':minblock + }, { + "inline": "true" + }); + + } + } + if(keywords.length==2){ + if(py2block.identifier(keywords[0].arg) === "maxval"){var maxblock=py2block.convert(keywords[0].value)} + else if(py2block.identifier(keywords[1].arg) === "maxval"){var maxblock=py2block.convert(keywords[1].value)} + if(py2block.identifier(keywords[0].arg) === "minval"){var minblock=py2block.convert(keywords[0].value)} + else if(py2block.identifier(keywords[1].arg) === "minval"){var minblock=py2block.convert(keywords[1].value)} + + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MIN':minblock, + 'MAX':maxblock + }, { + "inline": "true" + });} + } + if(args.length==2){ + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + + if(keywords.length==1){ + if(py2block.identifier(keywords[0].arg) === "maxval"){ + var maxblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'MAX':maxblock + }, { + "inline": "true" + }); + } + if(py2block.identifier(keywords[0].arg) === "minval"){ + var minblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'MIN':minblock + }, { + "inline": "true" + }); + + } + } + if(keywords.length==2){ + if(py2block.identifier(keywords[0].arg) === "maxval"){var maxblock=py2block.convert(keywords[0].value)} + else if(py2block.identifier(keywords[1].arg) === "maxval"){var maxblock=py2block.convert(keywords[1].value)} + if(py2block.identifier(keywords[0].arg) === "minval"){var minblock=py2block.convert(keywords[0].value)} + else if(py2block.identifier(keywords[1].arg) === "minval"){var minblock=py2block.convert(keywords[1].value)} + + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'MIN':minblock, + 'MAX':maxblock + }, { + "inline": "true" + });} + } +} + +pbc.objectFunctionD.get('write')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + var args0 = { + _astname: "Str", + s: { + 'v': 'Arial' + } + + }; + var args1 = { + _astname: "Num", + n: { + 'v': 8 + } + + }; + + if (args.length !== 1 && args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + if(args.length == 1){ + if (keywords.length == 0){ + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + + return [block('turtle_write', func.lineno, {}, { + 'TUR': turtleblock, + + 'VAR': argblock, + }, { + "inline": "true" + })]; + } + else if (keywords.length == 1){ + var tag = py2block.identifier(keywords[0].arg) + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (tag=='align') { + var formatblock = py2block.Str_value(keywords[0].value); + var fontnumblock = py2block.convert(args1); + var fontnameblock = py2block.convert(args0); + return [block('turtle_write_format', func.lineno, { + 'ALIGN':formatblock + }, { + + 'TUR': turtleblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + if (tag=='font') { + var fontnameblock = py2block.convert(keywords[0].value.elts[0]); + var fontnumblock = py2block.convert(keywords[0].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + if (keywords[0].value.elts.length == 4){ + if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')|| + (keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){ + keywords[0].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + } + } + + return [block('turtle_write_format', func.lineno, { + 'FONTTYPE':fonttypeblock + }, { + 'TUR': turtleblock, + 'VAR': argblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock + }, { + "inline": "true" + })]; + } + } + else if (keywords.length == 2){ + var tag1 = py2block.identifier(keywords[0].arg) + var tag2 = py2block.identifier(keywords[1].arg) + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (tag1=='align' && tag2=='font') { + var formatblock = py2block.Str_value(keywords[0].value); + var fontnameblock = py2block.convert(keywords[1].value.elts[0]); + var fontnumblock = py2block.convert(keywords[1].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]); + if (keywords[1].value.elts.length == 4){ + if((keywords[1].value.elts[2].s.v=='bold'&&keywords[1].value.elts[3].s.v=='italic')|| + (keywords[1].value.elts[3].s.v=='bold'&&keywords[1].value.elts[2].s.v=='italic')){ + keywords[1].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]); + } + } + } + if (tag2=='align' && tag1=='font') { + var formatblock = py2block.Str_value(keywords[1].value); + var fontnameblock = py2block.convert(keywords[0].value.elts[0]); + var fontnumblock = py2block.convert(keywords[0].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + if (keywords[0].value.elts.length == 4){ + if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')|| + (keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){ + keywords[0].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + } + } + } + return [block('turtle_write_format', func.lineno, { + 'FONTTYPE':fonttypeblock, + 'ALIGN':formatblock + }, { + 'TUR': turtleblock, + 'VAR': argblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock + }, { + "inline": "true" + })]; + + } + } + if(args.length == 2){ + var moveblock = py2block.Name_str(args[1]); + if (keywords.length == 0){ + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + var fontnameblock = py2block.convert(args0); + var fontnumblock = py2block.convert(args1); + return [block('turtle_write_format', func.lineno, { + 'MOVE':moveblock + }, { + 'TUR': turtleblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock, + 'VAR': argblock, + }, { + "inline": "true" + })]; + } + else if (keywords.length == 1){ + var tag = py2block.identifier(keywords[0].arg) + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (tag=='align') { + var formatblock = py2block.Str_value(keywords[0].value); + var fontnameblock = py2block.convert(args0); + var fontnumblock = py2block.convert(args1); + return [block('turtle_write_format', func.lineno, { + 'ALIGN':formatblock, + 'MOVE':moveblock + }, { + + 'TUR': turtleblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + if (tag=='font') { + var fontnameblock = py2block.convert(keywords[0].value.elts[0]); + var fontnumblock = py2block.convert(keywords[0].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + if (keywords[0].value.elts.length == 4){ + if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')|| + (keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){ + keywords[0].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + } + } + return [block('turtle_write_format', func.lineno, { + 'FONTTYPE':fonttypeblock, + 'MOVE':moveblock + }, { + 'TUR': turtleblock, + 'VAR': argblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock + }, { + "inline": "true" + })]; + } + } + else if (keywords.length == 2){ + var tag1 = py2block.identifier(keywords[0].arg) + var tag2 = py2block.identifier(keywords[1].arg) + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (tag1=='align' && tag2=='font') { + var formatblock = py2block.Str_value(keywords[0].value); + var fontnameblock = py2block.convert(keywords[1].value.elts[0]); + var fontnumblock = py2block.convert(keywords[1].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]); + if (keywords[1].value.elts.length == 4){ + if((keywords[1].value.elts[2].s.v=='bold'&&keywords[1].value.elts[3].s.v=='italic')|| + (keywords[1].value.elts[3].s.v=='bold'&&keywords[1].value.elts[2].s.v=='italic')){ + keywords[1].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]); + } + } + } + if (tag2=='align' && tag1=='font') { + var formatblock = py2block.Str_value(keywords[1].value); + var fontnameblock = py2block.convert(keywords[0].value.elts[0]); + var fontnumblock = py2block.convert(keywords[0].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + if (keywords[0].value.elts.length == 4){ + if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')|| + (keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){ + keywords[0].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + } + } + } + return [block('turtle_write_format', func.lineno, { + 'FONTTYPE':fonttypeblock, + 'ALIGN':formatblock, + 'MOVE':moveblock + }, { + 'TUR': turtleblock, + 'VAR': argblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock + }, { + "inline": "true" + })]; + + } + } +} + +pbc.objectFunctionD.get('circle')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2 && args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + if(args.length == 2){ + var turtleblock = py2block.convert(func.value); + var varblock = py2block.convert(args[0]); + var datablock = py2block.convert(args[1]); + + return [block('turtle_circle_advanced', func.lineno, {}, { + 'TUR': turtleblock, + 'VAR': varblock, + 'data': datablock + }, { + "inline": "true" + })]; + } + if(args.length == 1){ + var turtleblock = py2block.convert(func.value); + var varblock = py2block.convert(args[0]); + + + return [block('turtle_circle', func.lineno, { + 'DIR': 'circle' + }, { + 'TUR': turtleblock, + 'VAR': varblock + }, { + "inline": "true" + })]; + } + } + + +pbc.objectFunctionD.get('dot')['turtleClass'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var varblock = py2block.convert(args[0]); + + return [block('turtle_circle', func.lineno, { + 'DIR': 'dot' + }, { + 'TUR': turtleblock, + 'VAR': varblock + }, { + "inline": "true" + })]; + } + + +pbc.objectFunctionD.get('clone')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return block('turtle_clone', func.lineno, {}, { + 'TUR': turtleblock + }, { + "inline": "true" + }); +} + +pbc.objectFunctionD.get('pos')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'pos' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + }); +} + +pbc.objectFunctionD.get('position')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'pos' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + }); +} + +pbc.objectFunctionD.get('heading')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'heading' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + }); +} + +function turtleHideShow(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return [block('turtle_visible', func.lineno, { + 'DIR': mode + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.objectFunctionD.get('hideturtle')[turtleClass] = turtleHideShow('hideturtle'); +pbc.objectFunctionD.get('showturtle')[turtleClass] = turtleHideShow('showturtle'); + + +pbc.objectFunctionD.get('pencolor')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + + + + + if (args[0]._astname != "Str") { + return [block("turtle_pencolor_hex", func.lineno, {}, { + 'TUR': turtleblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + else{ + return [block('turtle_pencolor', func.lineno, { + "FIELDNAME":py2block.Str_value(args[0]) + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + } + +} + + +pbc.objectFunctionD.get('fillcolor')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (args[0]._astname == "Str" ) { + return [block('turtle_fillcolor', func.lineno, { + "FIELDNAME":py2block.Str_value(args[0]) + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + } else { + return [block("turtle_fillcolor_hex", func.lineno, {}, { + 'TUR': turtleblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + + +} + +pbc.objectFunctionD.get('color')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2 &&args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + if(args.length == 2){ + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + var argblock1 = py2block.convert(args[1]); + if (args[0]._astname == "Str" ) { + return [block('turtle_color', func.lineno, { + "FIELDNAME":py2block.Str_value(args[0]), + "FIELDNAME2":py2block.Str_value(args[1]) + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + } else { + return [block("turtle_color_hex", func.lineno, {}, { + 'TUR': turtleblock, + 'VAR1': argblock, + 'VAR2': argblock1 + }, { + "inline": "true" + })]; + } + } + if(args.length == 1){ + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (args[0]._astname != "Str") { + return [block("turtle_pencolor_hex", func.lineno, {}, { + 'TUR': turtleblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + else{ + return [block('turtle_pencolor', func.lineno, { + "FIELDNAME":py2block.Str_value(args[0]) + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + + } + } + +} + + + + +function turtleBeginEndFill(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return [block("turtle_fill", func.lineno, { + 'DIR': mode + }, { + 'TUR': turtleblock, + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.objectFunctionD.get('begin_fill')[turtleClass] = turtleBeginEndFill('begin'); +pbc.objectFunctionD.get('end_fill')[turtleClass] = turtleBeginEndFill('end'); + + +pbc.objectFunctionD.get('onkey')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + pbc.pinType = "pins_callback"; + var callback = py2block.convert(args[0]); + pbc.pinType=null; + var tupblock = py2block.convert(args[1]); + return [block("turtle_onkey", func.lineno, {},{ + 'TUR': turtleblock, + "callback":callback, + "VAR":tupblock + },{ + "inline": "true" + })]; +}; + +pbc.objectFunctionD.get('onclick')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + pbc.pinType = "pins_callback"; + var callback = py2block.convert(args[0]); + + return [block("turtle_onclick", func.lineno, {},{ + 'TUR': turtleblock, + "callback":callback, + + },{ + "inline": "true" + })]; +}; + +pbc.objectFunctionD.get('ontimer')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + pbc.pinType = "pins_callback"; + var callback = py2block.convert(args[0]); + pbc.pinType=null; + var tupblock = py2block.convert(args[1]); + return [block("turtle_ontimer", func.lineno, {},{ + 'TUR': turtleblock, + "callback":callback, + "VAR":tupblock + },{ + "inline": "true" + })]; +}; + + +pbc.objectFunctionD.get('listen')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return [block('turtle_listen', func.lineno, { + + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/css/color_mixpy_python_advance.css b/mixly/boards/default_src/python_mixpy/css/color_mixpy_python_advance.css new file mode 100644 index 00000000..867dfeb1 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/css/color_mixpy_python_advance.css @@ -0,0 +1,211 @@ +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/inout.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/inout2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ctrl.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ctrl2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/math.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/math2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/logic.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/logic2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/text.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/text2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/list3.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/list4.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/tuple.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/tuple2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/dict.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/dict2.png') no-repeat; + background-size: 100% auto; +} + + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/set.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/set2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/var.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/var2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/func.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/func2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/file.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/file2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/requests.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/requests2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio2.png') no-repeat; + background-size: 100% auto; +} + +#catMixIO.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio.png') no-repeat; + background-size: 100% auto; +} + +#catMixIO.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio2.png') no-repeat; + background-size: 100% auto; +} + + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(15)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/turtle.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(15)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/turtle2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(16)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ai.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(16)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ai2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(17)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/data.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(17)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/data2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(18)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/cv.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(18)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/cv2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(19)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/algorithm.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(19)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/algorithm2.png') no-repeat; + background-size: 100% auto; +} + +#catFactory.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/factory3.png') no-repeat; + background-size: 100% auto; +} + +#catFactory.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/factory4.png') no-repeat; + background-size: 100% auto; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/export.js b/mixly/boards/default_src/python_mixpy/export.js new file mode 100644 index 00000000..0e1f42c8 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/export.js @@ -0,0 +1,64 @@ +import * as PythonMixpyAIBlocks from './blocks/ai'; +import * as PythonMixpyAlgorithmBlocks from './blocks/algorithm'; +import * as PythonMixpyCommunicateBlocks from './blocks/communicate'; +import * as PythonMixpyCVBlocks from './blocks/cv'; +import * as PythonMixpyDataBlocks from './blocks/data'; +import * as PythonMixpyDatastructureBlocks from './blocks/datastructure'; +import * as PythonMixpyFactoryBlocks from './blocks/factory'; +import * as PythonMixpyHardwareBlocks from './blocks/hardware'; +import * as PythonMixpyInoutBlocks from './blocks/inout'; +import * as PythonMixpyIOTBlocks from './blocks/iot'; +import * as PythonMixpyPinsBlocks from './blocks/pins'; +import * as PythonMixpySerialBlocks from './blocks/serial'; +import * as PythonMixpySKLearnBlocks from './blocks/sklearn'; +import * as PythonMixpySystemBlocks from './blocks/system'; +import * as PythonMixpyTurtleBlocks from './blocks/turtle'; + +import * as PythonMixpyAIGenerators from './generators/ai'; +import * as PythonMixpyAlgorithmGenerators from './generators/algorithm'; +import * as PythonMixpyCommunicateGenerators from './generators/communicate'; +import * as PythonMixpyCVGenerators from './generators/cv'; +import * as PythonMixpyDataGenerators from './generators/data'; +import * as PythonMixpyDatastructureGenerators from './generators/datastructure'; +import * as PythonMixpyFactoryGenerators from './generators/factory'; +import * as PythonMixpyHardwareGenerators from './generators/hardware'; +import * as PythonMixpyInoutGenerators from './generators/inout'; +import * as PythonMixpyIOTGenerators from './generators/iot'; +import * as PythonMixpyPinsGenerators from './generators/pins'; +import * as PythonMixpySerialGenerators from './generators/serial'; +import * as PythonMixpySKLearnGenerators from './generators/sklearn'; +import * as PythonMixpySystemGenerators from './generators/system'; +import * as PythonMixpyTurtleGenerators from './generators/turtle'; + +export { + PythonMixpyAIBlocks, + PythonMixpyAlgorithmBlocks, + PythonMixpyCommunicateBlocks, + PythonMixpyCVBlocks, + PythonMixpyDataBlocks, + PythonMixpyDatastructureBlocks, + PythonMixpyFactoryBlocks, + PythonMixpyHardwareBlocks, + PythonMixpyInoutBlocks, + PythonMixpyIOTBlocks, + PythonMixpyPinsBlocks, + PythonMixpySerialBlocks, + PythonMixpySKLearnBlocks, + PythonMixpySystemBlocks, + PythonMixpyTurtleBlocks, + PythonMixpyAIGenerators, + PythonMixpyAlgorithmGenerators, + PythonMixpyCommunicateGenerators, + PythonMixpyCVGenerators, + PythonMixpyDataGenerators, + PythonMixpyDatastructureGenerators, + PythonMixpyFactoryGenerators, + PythonMixpyHardwareGenerators, + PythonMixpyInoutGenerators, + PythonMixpyIOTGenerators, + PythonMixpyPinsGenerators, + PythonMixpySerialGenerators, + PythonMixpySKLearnGenerators, + PythonMixpySystemGenerators, + PythonMixpyTurtleGenerators +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/ai.js b/mixly/boards/default_src/python_mixpy/generators/ai.js new file mode 100644 index 00000000..f4227866 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/ai.js @@ -0,0 +1,163 @@ +export const AI_ChooseAndGet = function (_, generator) { + var type = this.getFieldValue('TYPE'); + generator.definitions_['import_FileDialog'] = 'import FileDialog'; + var code = 'FileDialog.' + type + '()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_client = function (_, generator) { + var ctype = this.getFieldValue('CTYPE'); + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_' + ctype] = 'from aip import '+ ctype; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var api_key = generator.valueToCode(this, 'API_KEY', generator.ORDER_ATOMIC); + var secret_key = generator.valueToCode(this, 'SECRET_KEY', generator.ORDER_ATOMIC); + var code = v + ' = ' + 'aip.' + ctype + '(' + api_key + ', ' + secret_key + ')\n'; + return code; +} + +export const AI_Speech_synthesis = function (_, generator) { + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_AipSpeech'] = 'from aip import AipSpeech'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var s = generator.valueToCode(this, 'STR', generator.ORDER_ATOMIC); + var attr = generator.valueToCode(this, 'ATTR', generator.ORDER_ATOMIC) || '{}'; + var code = v + '.synthesis(' + s + ', options=' + attr + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Speech_asr = function (_, generator) { + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_AipSpeech'] = 'from aip import AipSpeech'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + //var f = generator.valueToCode(this, 'FUNC', generator.ORDER_ATOMIC); + var fn = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC) || '""'; + var attr = generator.valueToCode(this, 'ATTR', generator.ORDER_ATOMIC) || '{}'; + //var code = v + '.'+ f +'(' + fn + ', options=' + attr + ')'; + var code = v + '.asr(' + fn + ', options=' + attr + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_ImageClassify = function (_, generator) { + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_AipImageClassify'] = 'from aip import AipImageClassify'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var addr = generator.valueToCode(this, 'ADDR', generator.ORDER_ATOMIC); + var f = generator.valueToCode(this, 'FUNC', generator.ORDER_ATOMIC); + var attr = generator.valueToCode(this, 'ATTR', generator.ORDER_ATOMIC) || '{}'; + var code = v + '.' + f + '(' + addr + ', options=' + attr + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Face_match = function (_, generator) { + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_AipSpeech'] = 'from aip import AipSpeech'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var s = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var s2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC); + var attr = generator.valueToCode(this, 'ATTR', generator.ORDER_ATOMIC) || '{}'; + var code = v + '.match(' + s + ',' + s2 + ', options=' + attr + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Ocr = function (_, generator) { + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_Ocr'] = 'from aip import Ocr'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var addr = generator.valueToCode(this, 'ADDR', generator.ORDER_ATOMIC); + var f = generator.valueToCode(this, 'FUNC', generator.ORDER_ATOMIC); + var attr = generator.valueToCode(this, 'ATTR', generator.ORDER_ATOMIC) || '{}'; + var code = v + '.' + f + '(' + addr + ', options=' + attr + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Nlp = function (_, generator) { + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_Nlp'] = 'from aip import Nlp'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var s = generator.valueToCode(this, 'STR', generator.ORDER_ATOMIC); + var f = generator.valueToCode(this, 'FUNC', generator.ORDER_ATOMIC); + var attr = generator.valueToCode(this, 'ATTR', generator.ORDER_ATOMIC) || '{}'; + var code = v + '.' + f + '(' + s + ', options=' + attr + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Nlp_Sim = function (_, generator) { + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_Nlp'] = 'from aip import Nlp'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var s1 = generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC); + var s2 = generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC); + var f = generator.valueToCode(this, 'FUNC', generator.ORDER_ATOMIC); + var attr = generator.valueToCode(this, 'ATTR', generator.ORDER_ATOMIC) || '{}'; + var code = v + '.' + f + '(' + s1 + ',' + s2 + ', options=' + attr + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Nlp_Topic = function (_, generator) { + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_Nlp'] = 'from aip import Nlp'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var s1 = generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC); + var s2 = generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC); + var code = v + '.topic(' + s1 + ',' + s2 + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Nlp_newsSummary = function (_, generator) { + generator.definitions_['import_aip'] = 'import aip'; + //generator.definitions_['import_aip_Nlp'] = 'from aip import Nlp'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var s = generator.valueToCode(this, 'STR', generator.ORDER_ATOMIC); + var n = generator.valueToCode(this, 'LEN', generator.ORDER_ATOMIC); + var attr = generator.valueToCode(this, 'ATTR', generator.ORDER_ATOMIC) || '{}'; + var code = v + '.newsSummary(' + s + ',' + n + ', options=' + attr + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_ImageClassify_Func = function (_, generator) { + var code = this.getFieldValue('TYPE'); + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Ocr_Func = function (_, generator) { + var code = this.getFieldValue('TYPE'); + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Nlp_Func = function (_, generator) { + var code = this.getFieldValue('TYPE'); + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_Nlp_Func_sim = function (_, generator) { + var code = this.getFieldValue('TYPE'); + return [code, generator.ORDER_ATOMIC]; +} + +export const AI_audio = function (_, generator) { + generator.definitions_['import_audio'] = 'import audio'; + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var num = generator.valueToCode(this, 'TIME', generator.ORDER_ATOMIC) || '0'; + var code = "audio.audio_record(" + str + ',' + num + ")\n"; + return code; +} + +export const AI_photo = function (_, generator) { + generator.definitions_['import_audio'] = 'import cam'; + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var button = generator.valueToCode(this, 'BUT', generator.ORDER_ATOMIC) || '""'; + var code = "cam.photo_capture(" + str + ',' + button + ")\n"; + return code; +} + +export const AI_result = function (_, generator) { + var varName = generator.valueToCode(this, 'AI', generator.ORDER_ASSIGNMENT) || '0'; + var ctype = this.getFieldValue('CTYPE'); + if (ctype == 'Image') { var code = varName + '["result"][0]["keyword"]' } + if (ctype == 'Speech') { var code = varName + '["result"][0]' } + if (ctype == 'Face' || ctype == 'OcrSimilarity') { var code = varName + '["score"]' } + if (ctype == 'Ocr') { var code = varName + '["words_result"]' } + + return [code, generator.ORDER_ATOMIC]; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/algorithm.js b/mixly/boards/default_src/python_mixpy/generators/algorithm.js new file mode 100644 index 00000000..0100b00a --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/algorithm.js @@ -0,0 +1,936 @@ +// sub_algorithm_1 +export const algorithm_prepare = function (_, generator) { + generator.definitions_.import_sprite = "import sprite"; + var line1 = 'g = [[0,0,0,0,0,0,0,0,0,0], [0,0,0,1,0,0,0,0,0,0], [0,0,0,1,0,0,1,0,0,0], [0,1,1,0,1,1,0,0,0,0], [0,0,0,1,0,0,0,1,0,0], [0,0,0,1,0,0,1,1,0,0], [0,0,1,0,0,1,0,1,0,0], [0,0,0,0,1,1,1,0,0,0]]\n'; + var line2 = 'mark = [[0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0]]\n'; + var code = line1 + line2 + "vis = [0,1,0,0,0,0,0,0,0]\n"; + code += `position = [[0, 0], [200, 200], [250, 60], [320, 200], [280, 380], [470, 250], [670, 90], [650, 340]] +sprite.clearAllSprites() +sprite.createBackground('ditu') +mask = sprite.Sprite('white', 96, 354) +mask.hide() +house = [ + sprite.Sprite('mark', 150, 380), + sprite.Sprite('xtxn', 96, 170), + sprite.Sprite('xnvijx', 270, 45), + sprite.Sprite('xnxbjx', 310, 182), + sprite.Sprite('xnsijx', 300, 370), + sprite.Sprite('xnkejx', 495, 220), + sprite.Sprite('bwbwjx', 716, 85), + sprite.Sprite('lelejx', 686, 314) +] +for i in house: + i.filterBrighter() + i.hide()\n`; + return code; +} + +export const algorithm_add_school = function () { + // var code = "path = [1]\n" + // + "list1 = [0,1,2,3,4,5,6]\n" + // + "list2 = [3,1,0,4,5,6,2]\n"; + var code = `path = [1] +mask.show() +car = sprite.Sprite('xnie', position[1][0], position[1][1])\nhouse[1].show() +car.nowPos = 1 +def drive(n): + if g[car.nowPos][n]==1: + car.slideTo(position[n][0], position[n][1], 1) + car.nowPos = n + else: + print('移动失败!程序有误!') + exit()\n`; + return code; +} + +export const algorithm_find_path = function (_, generator) { + generator.definitions_.import_random = "import random"; + // var line1 = 'if random.choice([0,1]) == 0:\n' + // + ' list = list1\n' + // + 'else:\n' + // + ' list = list2\n' + // + 'f = path[(len(path) - 1)]\n' + // + 'flag = 0\n' + // + 'for _my_variable in range(7):\n' + // + ' if vis[_my_variable+1] == 0 and g[f][_my_variable+1] == 1:\n' + // + ' if mark[f][_my_variable+1] == 0:\n' + // + ' flag = 1\n' + // + ' break\n'; + var line1 = 'f = path[(len(path) - 1)]\n' + + 'flag = 0\n' + + 'for _my_variable in [6,5,4,3,2,1,0]:\n' + + ' if vis[_my_variable+1] == 0 and g[f][_my_variable+1] == 1:\n' + + ' if mark[f][_my_variable+1] == 0:\n' + + ' flag = 1\n' + + ' break\n'; + var code = line1; + return code; +} + +export const algorithm_new_path = function (_, generator) { + var code = "flag == 1"; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_set_path = function () { + var code = "mark[f][_my_variable+1] = 1\nvis[_my_variable+1] = 1\n"; + return code; +} + +export const algorithm_add_path = function () { + var code = "path.append(_my_variable+1)\n"; + code += `drive(path[len(path) - 1])\nhouse[_my_variable+1].show()\n`; + return code; +} + +export const algorithm_del_path = function (_, generator) { + generator.definitions_.import_time = "import time"; + var code = "del path[len(path) - 1]\n"; + code += `house[0].show()\ntime.sleep(0.5)\nhouse[0].hide()\n`; + return code; +} + +export const algorithm_return_path = function () { + var code = 'for i in range(7):\n' + ' mark[f][i+1] = 0\n' + ' vis[f] = 0\n'; + code = `house[f].hide()\ndrive(path[len(path) - 1])\n` + code; + return code; +} + +export const algorithm_no_left = function (_, generator) { + var code = "len(path) == 7"; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_print_path = function () { + var code = 'name = ["","学校","小智家","小欣家","小思家","小科家","贝贝家","乐乐家"]\nres = ""\nfor i in path:\n res = res + name[i] + "-"\nprint(res[:-1])\n'; + return code; +} + +// sub_algorithm_2 + +export const algorithm_prepare2 = function (_, generator) { + generator.definitions_.import_sprite = "import sprite"; + var line1 = 'g = [[0,0,0,0,0,0,0,0,0,0], [0,0,0,1,0,0,0,0,0,0], [0,0,0,1,0,0,1,0,0,0], [0,1,1,0,1,0,0,0,0,0], [0,0,0,1,0,0,0,1,0,0], [0,0,0,1,0,0,0,1,0,0], [0,0,1,0,0,0,0,1,0,0], [0,0,0,0,1,1,1,0,0,0]]\n'; + var line2 = 'mark = [[0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0]]\n'; + var code = line1 + line2 + "vis = [0,1,0,0,0,0,0,0,0]\n"; + code += `position = [[0, 0], [200, 200], [250, 60], [320, 200], [280, 380], [470, 250], [670, 90], [650, 340]] +sprite.clearAllSprites() +sprite.createBackground('ditu') +mask = sprite.Sprite('white', 96, 354) +mask.hide() +house = [ + sprite.Sprite('mark', 150, 380), + sprite.Sprite('xtxn', 96, 170), + sprite.Sprite('xnvijx', 270, 45), + sprite.Sprite('xnxbjx', 310, 182), + sprite.Sprite('xnsijx', 300, 370), + sprite.Sprite('xnkejx', 495, 220), + sprite.Sprite('bwbwjx', 716, 85), + sprite.Sprite('lelejx', 686, 314) +] +barricade = sprite.Sprite('barricade', 610, 170) +barricade.enlargeTo(100) +for i in house: + i.filterBrighter() + i.hide()\n`; + return code; +} + +export const algorithm_current_school = function (_, generator) { + var code = "f == 1"; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_no_path = function () { + var code = "print('没有符合条件的路线')\n"; + return code; +} + +// sub_algorithm_3 + +export const algorithm_prepare_2_1 = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var line1 = 'g = [[10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000],[10000,10000,500,300,10000,10000,10000,10000,10000,10000,10000],[10000,500,10000,10000,100,10000,10000,10000,10000,10000,10000],[10000,300,10000,10000,400,300,10000,10000,10000,10000,10000],[10000,10000,100,400,10000,10000,200,10000,10000,10000,10000],[10000,10000,10000,300,10000,10000,100,200,10000,10000,10000],[10000,10000,10000,10000,200,100,10000,10000,100,10000,10000],[10000,10000,10000,10000,10000,200,10000,10000,100,10000,10000],[10000,10000,10000,10000,10000,10000,100,100,10000,10000,10000]]\n'; + var line2 = 'now=1\n'; + var code = line1 + line2 + "last=1\npath=[]\npath.append(1)\n"; + code += `name = ["","小思家","银行","邮局","餐厅","书店","医院","超市","小科家"] +position = [[0, 0], [60, 320], [510, 390], [240, 200], [750, 330], [410, 90], [540, 190], [550, 30], [720, 120]] +sprite.clearAllSprites() +sprite.createBackground('map_si_ke') +stu = sprite.Sprite('girl', 60, 320) +stu.enlargeTo(100) +time.sleep(1)\n +` + return code; +} + +export const algorithm_prepare_2_2 = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var line1 = 'g =[[10000,10000,10000,10000,10000,10000,10000],[10000,10000,300,500,10000,10000,10000],[10000,300,10000,10000,300,700,10000],[10000,500,10000,10000,10000,100,10000],[10000,10000,300,10000,10000,10000,200],[10000,10000,700,100,10000,10000,100],[10000,10000,10000,10000,200,100,10000]]\n'; + var line2 = 'now=1\n'; + var code = line1 + line2 + "last=1\npath=[]\npath.append(1)\n"; + code += `name = ["","小智家","邮局","银行","书店","餐厅","学校"] +position = [[0, 0], [70, 340], [70, 90], [550, 310], [420, 70], [730, 250], [650, 130]] +sprite.clearAllSprites() +sprite.createBackground('map_zhi_xue') +stu = sprite.Sprite('boy', 70, 340) +stu.enlargeTo(100) +time.sleep(1)\n +` + return code; +} + +export const algorithm_move_recent = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var line1 = 'tmp=10000\nfor i in range(0, len(g), 1):\n' + ' if g[now][i]6:\n print("路线错乱!程序有误!")\n exit()\n'; + var code = line1; + return code; +} + +export const algorithm_not_home = function (_, generator) { + var code = "name[now] != '小科家'"; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_not_school = function (_, generator) { + var code = "name[now] != '学校'"; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_print_path2 = function () { + var code = `res = "" +for i in path: + res = res + name[i] + "→" +print(res[:-1])\n`; + + return code; +} + +// sub_algorithm_4 hanoi + +export const hanoi_init = function (_, generator) { + // generator.definitions_.import_turtle = "import turtle"; + // generator.definitions_.import_time = "import time"; + // generator.definitions_.import_math = "import math"; + // function randomHexColor() { + // //随机生成十六进制颜色 + // var hex = Math.floor(Math.random() * 16777216).toString(16); + // //生成ffffff以内16进制数 + // while (hex.length < 6) { + // //while循环判断hex位数,少于6位前面加0凑够6位 + // hex = '0' + hex; + // } + // return '#' + hex; //返回‘#'开头16进制颜色 + // } + // var num = this.getFieldValue('NUM'); + // let colorList = []; + // let i = 0; + // while (i < num) { + // i++; + // colorList.push('"' + randomHexColor() + '"'); + // } + // generator.setups_['init_Hanoi'] = ` + // def init_Hanoi(): + // pen = turtle.Turtle() + // pen.hideturtle() + // pen.speed(0) + // for i in range(0, 3, 1): + // pen.penup() + // pen.setheading(0) + // pen.goto(150 * i - 200,-100) + // pen.pendown() + // pen.pensize(5) + // pen.forward(100) + // pen.goto(150 * i - 150,-100) + // pen.setheading(90) + // pen.forward(200)`; + // generator.setups_['begin'] = ` + // def begin(): + // s = turtle.Turtle() + // s.hideturtle() + // s.penup() + // s.speed(0) + // s.goto(0,-150) + // s.write('3') + // time.sleep(1) + // s.clear() + // s.write('2') + // time.sleep(1) + // s.clear() + // s.write('1') + // time.sleep(1) + // s.clear() + // s.write('Start!') + // time.sleep(1) + // s.clear()\n`; + // generator.setups_['move'] = ` + // def move(x, y): + // try: + // t = tower[x].pop(-1) + // a = tower_num[x].pop(-1) + // if tower_num[y]!=[]: + // b = tower_num[y][-1] + // if a= 7) var code = `print('层数过高!不得高于6层!')\nexit()\n`; + else { + var code = `sprite.clearAllSprites() +_Hanoicolor = ['blue', 'red', 'yellow', 'green', 'purple', 'black'] +_Hanoi = [[], [], []] +A = 0 +B = 1 +C = 2 +_n = `+ num + ` +_HanoiColumn = [ + sprite.Sprite('HanoiColumn', 200, 320), + sprite.Sprite('HanoiColumn', 400, 320), + sprite.Sprite('HanoiColumn', 600, 320) +] +_HanoiColumnNumber = [ + sprite.Text('A', 190, 120), + sprite.Text('B', 390, 120), + sprite.Text('C', 590, 120) +] +_HanoiBlock = [] +for i in range(0, _n, 1): + _HanoiBlock.append(sprite.Sprite(_Hanoicolor[i], 200, 400-(_n-i-1)*27)) + _HanoiBlock[i].setScale(25, 30*i+30) + _Hanoi[0].insert(0, _HanoiBlock[i]) +_steptext = sprite.Text('步数:0', 30, 30) +_steps = {'steps' : 0} +time.sleep(1)\n` + } + return code; +} + +export const hanoi_move = function (_, generator) { + var fromNum = generator.valueToCode(this, 'FROM_NUM', generator.ORDER_ATOMIC) || '0'; + var toNum = generator.valueToCode(this, 'TO_NUM', generator.ORDER_ATOMIC) || '0'; + // var code = `move(${fromNum}, ${toNum})\ntotal_num[0]+=1\ncount_turtle.clear()\ncount_turtle.write('总步数:'+str(total_num[0]))\n`; + var code = `if len(_Hanoi[${fromNum}])>0 : + _HanoiBlockMoved = _Hanoi[${fromNum}].pop() + if len(_Hanoi[${toNum}]) > 0 : + _HanoiBlockSuppressed = _Hanoi[${toNum}].pop() + if _HanoiBlock.index(_HanoiBlockMoved) > _HanoiBlock.index(_HanoiBlockSuppressed): + print('非法移动!程序有误!') + exit() + else: + _Hanoi[${toNum}].append(_HanoiBlockSuppressed) + _HanoiBlockMoved.slideTo(${fromNum}*200+200, 180, 0.2) + _HanoiBlockMoved.slideTo(${toNum}*200+200, 180, 0.5) + _HanoiBlockMoved.slideTo(${toNum}*200+200, 400-len(_Hanoi[${toNum}])*27, 0.2) + _Hanoi[${toNum}].append(_HanoiBlockMoved) + _steps['steps'] += 1 + _steptext.changeText('步数:'+str(_steps['steps'])) +else : + print('非法移动!程序有误!') + exit() +` + return code; +} + +// sub_algorithm_5 + +export const algorithm_all_books_sequence = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `if 'mode' not in globals() or mode == 0: + sprite.clearAllSprites() + ring=[0,0,0,0,0,0,0,0,0,0] + mode=1 + n=5 + ring[5]=1 + name=['小王子','海底两万里','荷花镇的早市','孔子的故事','夏洛的网','草房子','月下看猫头鹰','会唱歌的咖啡磨','父与子','城南旧事'] + Books = [] + for i in range(1, 11, 1): + Books.append(sprite.Sprite('books/book'+str(i), (130*i-650) if i>5 else 130*i, 320 if i>5 else 120)) +else: + mode=2 + n=len(ring)-1\nring[n]=1 +time.sleep(1)\n`; + return code; +} + +export const algorithm_all_books = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `if 'mode' not in globals() or mode == 0: + sprite.clearAllSprites() + ring=[0,0,0,0,0,0,0,0,0,0] + mode=2 + n=5 + name=['小王子','海底两万里','荷花镇的早市','孔子的故事','夏洛的网','草房子','月下看猫头鹰','会唱歌的咖啡磨','父与子','城南旧事'] + Books = [] + for i in range(1, 11, 1): + Books.append(sprite.Sprite('books/book'+str(i), (130*i-650) if i>5 else 130*i, 320 if i>5 else 120)) +else: + mode=1 + n=len(ring)-1 +ring[n]=n +list=ring +temp=Books +time.sleep(1)\n`; + return code; +} + +export const algorithm_first_book = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var line1 = 'res=0\n'; + var code = line1 + "flag=ring[res]\n"; + code += `Books[res].filterBrighter()\ntime.sleep(0.1)\nBooks[res].filterOrigin()\n`; + return code; +} + +// export const algorithm_no_ring = function() { +// var code = "ring[i]==0"; +// return [code, generator.ORDER_ATOMIC]; +// }; + +export const algorithm_no_ring2 = function (_, generator) { + var code = "(('mode' not in globals())or(mode==1 and flag==0)or(mode==2 and not any(value > 0 for value in qian))or(mode==0))"; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_yes_ring2 = function (_, generator) { + var code = "(('mode' in globals())and((mode==1 and flag!=0)or(mode==2 and any(value > 0 for value in qian))))"; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_next_book = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = "res+=1\nflag=ring[res]\n"; + code += `Books[res].filterBrighter()\ntime.sleep(0.1)\nBooks[res].filterOrigin()\n`; + code = `Books[res].filterGray()\ntime.sleep(0.3)\n` + code; + return code; +} + +export const algorithm_two_left = function (_, generator) { + var code = "len(list)>=2"; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_divide_books = function () { + var code = `mid = int(len(list)/2) +qian = list[0:mid] +hou = list[mid:] +qiantemp = temp[0:mid] +houtemp = temp[mid:]\n`; + return code; +} + +export const algorithm_get_half_books = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `quchu = qian +list = hou +quchutemp = qiantemp +temp = houtemp +for i in qiantemp: + i.filterBrighter() +time.sleep(0.5) +for i in qiantemp: + i.filterGray() +time.sleep(0.5)\n`; + return code; +} + +// export const algorithm_check_half_books = function() { +// var code = "while ring[i]==0:\n if i==mid:\n flag=0\n break\n i+=1\n"; +// return code; +// }; + +export const algorithm_delete_book = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `list = quchu +temp = quchutemp +for i in qiantemp: + i.filterBrighter() +time.sleep(0.5) +for i in qiantemp: + i.filterOrigin() +for i in houtemp: + i.filterBrighter() +time.sleep(0.5) +for i in houtemp: + i.filterGray() +time.sleep(0.5)\n`; + return code; +} + +// export const algorithm_print_book = function() { +// var code = "print(i)\n"; +// return code; +// }; + +export const algorithm_print_book2 = function () { + var code = `if 'list' in globals(): + res = list[0] +Books[res].filterBrighter() +print('未消磁的书籍是第'+str(res+1)+'本《'+name[res%10]+'》。') +if res!=n: + print('答案错误!请检查程序!') +mode=0\n`; + return code; +} + +// sub_algorithm_6 + +export const algorithm_book_scale = function (_, generator) { + var FIELD_NUM = this.getFieldValue("NUM"); + const pos = { + 5: '130*i, 120', + 10: '(130*i-650) if i>5 else 130*i, 320 if i>5 else 120', + 20: '(65*i-650)+30 if i>10 else 65*i+30, 320 if i>10 else 120', + 50: '(26*i-650)+50 if i>25 else 26*i+50, 320 if i>25 else 120' + } + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `sprite.clearAllSprites() +ring = [] +name = ['小王子','海底两万里','荷花镇的早市','孔子的故事','夏洛的网','草房子','月下看猫头鹰','会唱歌的咖啡磨','父与子','城南旧事'] +Books = [] +for i in range(${FIELD_NUM}): + ring.append(0) +for i in range(1, ${FIELD_NUM}+1, 1): + Books.append(sprite.Sprite('books/book'+str(i%10 if i%10!=0 else 10), ${pos[FIELD_NUM]})) +time.sleep(1) +mode=3 +` + return code; +} + +export const algorithm_number_zero = function (_, generator) { + generator.definitions_.import_sprite = "import sprite"; + var code = "cnt=0\n"; + code += `cntText = sprite.Text('计数器:0', 30, 200)\n` + return code; +} + +export const algorithm_number_add = function (_, generator) { + generator.definitions_.import_sprite = "import sprite"; + var code = "cnt+=1\n"; + code += `cntText.changeText('计数器:'+str(cnt))\n` + return code; +} + +export const algorithm_print_number = function (_, generator) { + generator.definitions_.import_sprite = "import sprite"; + var code = "print('计数器大小:'+str(cnt))\n"; + return code; +} + +// export const algorithm_get_book_num = function() { +// var code = 'n='+this.getFieldValue('NUM')+'\n'; +// return code; +// }; + +// export const algorithm_print_sequence = function() { +// var code = 'print("顺序法查找次数为:",cnt)'; +// return code; +// }; + +// export const algorithm_print_divide = function() { +// var code = 'print("二分法查找次数为:",cnt)'; +// return code; +// }; + +// sub_algorithm_7 + +export const algorithm_init_jttl = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `sprite.clearAllSprites() +_head = 10 +_foot = 32 +_footText = sprite.Text('脚的数量:', 20, 10) +_sprite = []\n`; + return code; +} + +export const algorithm_rabbit_zero = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `_rabbit = 0\n`; + // code += `_sprite.append(sprite.Sprite('jttl/rabbit', len(_sprite)*130+130 if len(_sprite)<5 else len(_sprite)*130+130-650, 120 if len(_sprite)<5 else 320))\n`; + code += `time.sleep(1)\n`; + return code; +} + +export const algorithm_rabbit_number_in_range = function (_, generator) { + var code = `_rabbit < _head`; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_chick_calculate = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `_chick = _head - _rabbit\n`; + code += `for i in range(0, _chick, 1): + _sprite.append(sprite.Sprite('jttl/chick', len(_sprite)*130+130 if len(_sprite)<5 else len(_sprite)*130+130-650, 120 if len(_sprite)<5 else 320))\n +time.sleep(0.5) +_footText.changeText('脚的数量:'+str(_rabbit*4 + _chick*2)) +time.sleep(1)\n` + return code; +} + +export const algorithm_check_feet = function (_, generator) { + var code = `_rabbit*4 + _chick*2 == _foot`; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_print_jttl_answer = function (_, generator) { + generator.definitions_.import_sprite = "import sprite"; + var code = `print('鸡的数量:'+str(_chick)+'只;\\n兔的数量:'+str(_rabbit)+'只。')\n`; + return code; +} + +export const algorithm_rabbit_add = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `_rabbit += 1\n`; + code += `sprite.clearAllSprites() +_sprite = [] +_footText = sprite.Text('脚的数量:', 20, 10) +for i in range(0, _rabbit, 1): + _sprite.append(sprite.Sprite('jttl/rabbit', len(_sprite)*130+130 if len(_sprite)<5 else len(_sprite)*130+130-650, 120 if len(_sprite)<5 else 320))\n` + code += `time.sleep(0.5)\n`; + return code; +} + +// sub_algorithm_8 + +export const algorithm_init_fzsf = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = ``; + code += `sprite.clearAllSprites() +sprite.createBackground('/fzsf/map_ck_xxjsjs') +_S1 = sprite.Sprite('/fzsf/S1',400,225,'S1') +_S2 = sprite.Sprite('/fzsf/S2',400,225,'S2') +_S3 = sprite.Sprite('/fzsf/S3',400,225,'S3') +_S4 = sprite.Sprite('/fzsf/S4',400,225,'S4') +_S1.hide() +_S2.hide() +_S3.hide() +_S4.hide() +_text_1 = sprite.Text('S1:',0,0,'text') +_text_2 = sprite.Text('S2:',0,30,'text2') +_text_3 = sprite.Text('S3:',0,60,'text3') +_text_4 = sprite.Text('S4:',0,90,'text4') +_position = [[60, 270], [240, 50], [260, 380], [440, 190], [730, 60], [700, 400]] +_Llen = [0, 170, 230, 100, 150, 10, 30, 50] +_Slen = [0, 0, 0, 0, 0] +_tag = [0, [0, 1, 3], [0, 2, 3], [3, 4, 5], [3, 5]] +bear = sprite.Sprite('mixbear',60,270,'bear') +bear.enlargeTo(80) +_pos = 0 +time.sleep(1)\n`; + return code; +} + +export const algorithm_fz_calc = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var FIELD_PATHNAME = this.getFieldValue("PATHNAME"); + const calc = [0, [1, 3], [2, 4], [5, 7], [6]] + var code = ``; + code += `_S${FIELD_PATHNAME}.show() +time.sleep(1)\n`; + if (FIELD_PATHNAME != 4) { + code += `_Slen[${FIELD_PATHNAME}] = _Llen[${calc[FIELD_PATHNAME][0]}] + _Llen[${calc[FIELD_PATHNAME][1]}] +_text_${FIELD_PATHNAME}.changeText('S${FIELD_PATHNAME}:'+str(_Slen[${FIELD_PATHNAME}])+'m') +time.sleep(1) +_S${FIELD_PATHNAME}.hide() +time.sleep(1)\n`; + } else { + code += `_Slen[4] = _Llen[6] +_text_4.changeText('S4:'+str(_Slen[4])+'m') +time.sleep(1) +_S4.hide() +time.sleep(1)\n`; + } + return code; +} + +export const algorithm_fz_compare = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var FIELD_PATHNAME = this.getFieldValue("PATHNAME"); + var FIELD_PATHNAME2 = this.getFieldValue("PATHNAME2"); + var code = ``; + code += `_Slen[${FIELD_PATHNAME}] < _Slen[${FIELD_PATHNAME2}]`; + return [code, generator.ORDER_ATOMIC]; + // `if(_Slen[${FIELD_PATHNAME}]==0 or _Slen[${FIELD_PATHNAME2}]==0): + // print('请先计算出长度再比较!程序有误!') + // exit() + // _S${FIELD_PATHNAME}.show() + // time.sleep(0.5) + // _S${FIELD_PATHNAME}.hide() + // time.sleep(0.5) + // _S${FIELD_PATHNAME}.show() + // time.sleep(0.5) + // _S${FIELD_PATHNAME2}.show() + // time.sleep(0.5) + // _S${FIELD_PATHNAME2}.hide() + // time.sleep(0.5) + // _S${FIELD_PATHNAME2}.show() + // time.sleep(0.5) + // if(_Slen[${FIELD_PATHNAME}] < _Slen[${FIELD_PATHNAME2}]): + // _S${FIELD_PATHNAME2}.hide() + // _S${FIELD_PATHNAME}.show() + // else : + // _S${FIELD_PATHNAME}.hide() + // _S${FIELD_PATHNAME2}.show() + // time.sleep(1) + // _S${FIELD_PATHNAME}.hide() + // _S${FIELD_PATHNAME2}.hide()\n`; + // return code; +} + +export const algorithm_fz_set_min = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var FIELD_PATHNAME = this.getFieldValue("PATHNAME"); + var code = ``; + code += ` +_S1.hide() +_S2.hide() +_S3.hide() +_S4.hide() +_Smin = ${FIELD_PATHNAME} +_S${FIELD_PATHNAME}.show() +time.sleep(0.5) +_S${FIELD_PATHNAME}.hide() +time.sleep(0.5) +_S${FIELD_PATHNAME}.show() +time.sleep(1)\n`; + return code; +} + +export const algorithm_fz_move = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = ``; + code += `if(_pos == _tag[_Smin][0]): + for i in range(1, len(_tag[_Smin]), 1): + bear.slideTo(_position[_tag[_Smin][i]][0], _position[_tag[_Smin][i]][1], 1) + _pos = _tag[_Smin][len(_tag[_Smin])-1] +else: + print('移动错误!程序有误!') + exit() +_S1.hide() +_S2.hide() +_S3.hide() +_S4.hide() +if(_pos == 5): + print('成功抵达信息科技教室!')\n`; + return code; +} + +// sub_algorithm_9 + +export const algorithm_init_hxdb = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = ``; + code += `sprite.clearAllSprites() +sprite.createBackground('/hxdb/hxdbbg') +_soldier = [] +_num = sprite.Text('目前士兵数量:0',0,0,'num') +_last = sprite.Text('剩余:0',500,0,'last') +_line = 3\n`; + return code; +} + +export const algorithm_hxdb_init_soldier = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var FIELD_NUM = this.getFieldValue("NUM"); + var code = ``; + code += `for i in range(0, ${FIELD_NUM}, 1): + _soldier.append(sprite.Sprite('/hxdb/soldier', 30 + (len(_soldier)%_line)*50 + (len(_soldier)//(4*_line))*(_line+1)*50 +(len(_soldier)%3-2), 80+(len(_soldier)//_line)*100-(len(_soldier)//(4*_line))*4*100+(len(_soldier)%2))) +_num.changeText('目前士兵数量:'+str(len(_soldier)))\n`; + return code; +} + +export const algorithm_hxdb_stand_in_line = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var FIELD_NAME = this.getFieldValue("NUM"); + var code = `for i in range(0, len(_soldier), 1): + _soldier[i].slideTo(30 + (i%${FIELD_NAME})*50 + (i//(4*${FIELD_NAME}))*(${FIELD_NAME}+1)*50 +(i%3-2), 80+(i//${FIELD_NAME})*100-(i//(4*${FIELD_NAME}))*4*100+(i%2), 0.05) +_line = ${FIELD_NAME} +_last.changeText('剩余:'+str(len(_soldier)%_line)) +time.sleep(2)\n`; + return code; +} + +export const algorithm_hxdb_last_line = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var FIELD_NAME = this.getFieldValue("NUM"); + var code = `len(_soldier)%_line == ${FIELD_NAME}`; + return [code, generator.ORDER_ATOMIC]; +} + +export const algorithm_hxdb_add = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `_num.changeText('目前士兵数量:'+str(len(_soldier)+1)) +_last.changeText('剩余:') +time.sleep(0.5) +_soldier.append(sprite.Sprite('/hxdb/soldier', 30 + (len(_soldier)%_line)*50 + (len(_soldier)//(4*_line))*(_line+1)*50 +(len(_soldier)%3-2), 80+(len(_soldier)//_line)*100-(len(_soldier)//(4*_line))*4*100+(len(_soldier)%2))) +time.sleep(1)\n`; + return code; +} + +export const algorithm_hxdb_result = function (_, generator) { + generator.definitions_.import_time = "import time"; + generator.definitions_.import_sprite = "import sprite"; + var code = `print('符合要求的士兵数量为:'+str(len(_soldier)))\n`; + return code; +} + +// others + +export const hanoi_init_offline = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + generator.definitions_.import_time = "import time"; + generator.definitions_.import_math = "import math"; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var num = this.getFieldValue('NUM'); + generator.setups_['init_Hanoi'] = ` +def init_Hanoi(): + pen = turtle.Turtle() + pen.hideturtle() + pen.speed(0) + for i in range(0, 3, 1): + pen.penup() + pen.setheading(0) + pen.goto(150 * i - 200,-100) + pen.pendown() + pen.pensize(5) + pen.forward(100) + pen.goto(150 * i - 150,-100) + pen.setheading(90) + pen.forward(200)`; + generator.setups_['begin'] = ` +def begin(): + s = turtle.Turtle() + s.hideturtle() + s.penup() + s.speed(0) + s.goto(0,-150) + s.write('3') + time.sleep(1) + s.clear() + s.write('2') + time.sleep(1) + s.clear() + s.write('1') + time.sleep(1) + s.clear() + s.write('Start!') + time.sleep(1) + s.clear()\n`; + generator.setups_['move'] = ` +def move(x, y): + try: + t = tower[x].pop(-1) + a = tower_num[x].pop(-1) + if tower_num[y]!=[]: + b = tower_num[y][-1] + if a 1'; + const code = `${dict}[${key}]`; + return [code, generator.ORDER_ATOMIC]; +} + +export const dataframe_groupby = function (block, generator) { + const dict = generator.valueToCode(block, 'DICT', generator.ORDER_ATOMIC) || 'df'; + const key = generator.valueToCode(block, 'KEY', generator.ORDER_ATOMIC) || '\'tag\''; + const code = `${dict}.groupby(by=${key})`; + return [code, generator.ORDER_ATOMIC]; +} + +export const dataframe_aggregate_func = function (block, generator) { + const dict = generator.valueToCode(block, 'DICT', generator.ORDER_ATOMIC) || 'df'; + const type = block.getFieldValue('TYPE'); + const code = `${dict}.${type}()`; + return [code, generator.ORDER_ATOMIC]; +} + +export const plot_cla = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = 'import matplotlib.pyplot as plt'; + var code = 'plt.cla()\n'; + return code; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/datastructure.js b/mixly/boards/default_src/python_mixpy/generators/datastructure.js new file mode 100644 index 00000000..d9517968 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/datastructure.js @@ -0,0 +1,176 @@ +import * as Blockly from 'blockly/core'; + +export const ds_create_linkedlist = function (_, generator) { + // Create a list with any number of elements of any type. + //var dropdown_type = this.getFieldValue('TYPE'); + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var typeName = generator.variableDB_.getName(this.getFieldValue('TYPE'), + Blockly.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + var code = 'class ' + typeName + ":\n"; + code += ' def __init__(self):\n'; + var attr = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + var keyName = this.getFieldValue('KEY' + n); + attr[n] = ' self.' + keyName + " = " + (generator.valueToCode(this, 'ADD' + n, generator.ORDER_NONE) || default_value); + } + code += attr.join('\n') + '\n'; + code += ' self.next = None\n'; + code += varName + ' = ' + typeName + '()\n' + return code; +} + +export const ds_create_node = function (_, generator) { + var varName = generator.valueToCode(this, 'NODE', generator.ORDER_ASSIGNMENT) || '0'; + var typeName = generator.variableDB_.getName(this.getFieldValue('TYPE'), + Blockly.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + + var code = varName + ' = ' + typeName + '()\n'; + return code; +} + +export const ds_get_node_attr = function (_, generator) { + var varName = generator.valueToCode(this, 'NODE', generator.ORDER_ASSIGNMENT) || '0'; + var typeName = generator.variableDB_.getName(this.getFieldValue('TYPE'), + Blockly.Variables.NAME_TYPE); + var code = varName + '.' + typeName; + return [code, generator.ORDER_ATOMIC]; +} + +export const ds_set_node_attr = function (_, generator) { + var varName = generator.valueToCode(this, 'NODE', generator.ORDER_ASSIGNMENT) || '0'; + var typeName = generator.variableDB_.getName(this.getFieldValue('TYPE'), + Blockly.Variables.NAME_TYPE); + var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.' + typeName + ' = ' + argument + '\n'; + return code; +} + +export const ds_add_node_by_name = function (_, generator) { + var varName = generator.valueToCode(this, 'NODE', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'NODE2', generator.ORDER_ASSIGNMENT) || '0'; + var varName3 = generator.valueToCode(this, 'NODE3', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + if (direction == 'after') { + var code = 'now = ' + varName + '\n'; + code += 'while now != ' + varName2 + ' and now != None:\n'; + code += ' now = now.next\n'; + code += 'if now != None:\n' + code += ' ' + varName3 + '.next = now.next\n'; + code += ' ' + 'now.next = ' + varName3 + '\n'; + code += ' print("插入节点成功")\n'; + code += 'else:\n' + code += ' print("插入节点失败,未找到指定名称的节点")\n'; + } + if (direction == 'before') { + var code = 'if ' + varName + ' == ' + varName2 + ':\n'; + code += ' ' + varName3 + '.next = ' + varName + '\n'; + code += 'else:\n' + code += ' now = ' + varName + '\n'; + code += ' while now.next != ' + varName2 + " and now.next != None:\n"; + code += ' now = now.next\n'; + code += ' if now != None:\n' + code += ' ' + varName3 + '.next = now.next\n'; + code += ' now.next = ' + varName3 + '\n'; + code += ' print("插入节点成功")\n'; + code += ' else:\n' + code += ' print("插入节点失败,未找到指定名称的节点")\n'; + } + return code; +} + +export const ds_add_node_by_attr = function (_, generator) { + var varName = generator.valueToCode(this, 'NODE', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var varName3 = generator.valueToCode(this, 'NODE3', generator.ORDER_ASSIGNMENT) || '0'; + var typeName = generator.variableDB_.getName(this.getFieldValue('TYPE'), + Blockly.Variables.NAME_TYPE); + var direction = this.getFieldValue('DIR'); + if (direction == 'after') { + var code = 'now = ' + varName + '\n'; + code += 'while now.' + typeName + ' != ' + varName2 + ' and now != None:\n'; + code += ' now = now.next\n'; + code += 'if now != None:\n' + code += ' ' + varName3 + '.next = now.next\n'; + code += ' ' + 'now.next = ' + varName3 + '\n'; + code += ' print("插入节点成功")\n'; + code += 'else:\n' + code += ' print("插入节点失败,未找到指定的节点")\n'; + } + if (direction == 'before') { + var code = 'if ' + varName + '.' + typeName + ' == ' + varName2 + ':\n'; + code += ' ' + varName3 + '.next = ' + varName + '\n'; + code += 'else:\n' + code += ' now = ' + varName + '\n'; + code += ' while now.next.' + typeName + ' != ' + varName2 + "and now.next != None:\n"; + code += ' now = now.next\n'; + code += ' if now != None:\n' + code += ' ' + varName3 + '.next = now.next\n'; + code += ' now.next = ' + varName3 + '\n'; + code += ' print("插入节点成功")\n'; + code += ' else:\n' + code += ' print("插入节点失败,未找到指定的节点")\n'; + } + return code; +} + +export const ds_del_node_by_name = function (_, generator) { + var varName = generator.valueToCode(this, 'NODE', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'NODE2', generator.ORDER_ASSIGNMENT) || '0'; + + + var code = 'if ' + varName + ' == ' + varName2 + ':\n'; + code += ' ' + varName + '.next = None\n'; + code += 'else:\n' + code += ' now = ' + varName + '\n'; + code += ' while now.next != ' + varName2 + " and now.next != None:\n"; + code += ' now = now.next\n'; + code += ' if now != None:\n' + code += ' now.next = now.next.next\n'; + code += ' print("删除节点成功")\n'; + code += ' else:\n' + code += ' print("删除节点失败,未找到指定名称的节点")\n'; + + return code; +} + +export const ds_del_node_by_attr = function (_, generator) { + var varName = generator.valueToCode(this, 'NODE', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + + var typeName = generator.variableDB_.getName(this.getFieldValue('TYPE'), + Blockly.Variables.NAME_TYPE); + + var code = 'if ' + varName + '.' + typeName + ' == ' + varName2 + ':\n'; + code += ' ' + varName + '.next = None\n'; + code += 'else:\n' + code += ' now = ' + varName + '\n'; + code += ' while now.next.' + typeName + ' != ' + varName2 + " and now.next != None:\n"; + code += ' now = now.next\n'; + code += ' if now != None:\n' + code += ' now.next = now.next.next\n'; + code += ' print("删除节点成功")\n'; + code += ' else:\n' + code += ' print("删除节点失败,未找到指定的节点")\n'; + + return code; +} + +export const ds_reverse_linkedlist = function (_, generator) { + var varName = generator.valueToCode(this, 'NODE', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'NODE2', generator.ORDER_ASSIGNMENT) || '0'; + + + var code = 'ptr = ' + varName + '\n'; + code += 'before = None\n'; + code += 'while ptr != None:\n' + code += ' last = before\n'; + code += ' before = ptr\n'; + code += ' ptr = ptr.next\n'; + code += ' before.next = last\n' + code += varName2 + ' = before\n'; + return code; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/factory.js b/mixly/boards/default_src/python_mixpy/generators/factory.js new file mode 100644 index 00000000..716137d5 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/factory.js @@ -0,0 +1,86 @@ +export const factory_from_import = function (_, generator) { + var path = this.getFieldValue('path'); + var module = this.getFieldValue('module'); + generator.definitions_['import_' + path + '_' + module] = 'from ' + path + ' import ' + module; + return ''; +} + +export const factory_import = function (_, generator) { + var module = this.getFieldValue('module'); + generator.definitions_['import_' + module] = 'import ' + module; + return ''; +} + +export const factory_function_noreturn = function (_, generator) { + var NAME = this.getFieldValue('NAME'); + var code = new Array(this.itemCount_); + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || ''; + } + return NAME + '(' + code.join(', ') + ')\n'; +} + +export const factory_function_return = function (_, generator) { + var NAME = this.getFieldValue('NAME'); + var code = new Array(this.itemCount_); + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || ''; + } + return [NAME + '(' + code.join(', ') + ')', generator.ORDER_ATOMIC]; +} + +export const factory_declare = function () { + var TYPE = this.getFieldValue('TYPE'); + var NAME = this.getFieldValue('NAME'); + return NAME + ' = ' + TYPE + '()\n'; +} + +export const factory_callMethod_noreturn = function (_, generator) { + var NAME = this.getFieldValue('NAME'); + var METHOD = this.getFieldValue('METHOD'); + var code = new Array(this.itemCount_); + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || ''; + } + return NAME + '.' + METHOD + '(' + code.join(', ') + ')\n'; +} + +export const factory_callMethod_return = function (_, generator) { + var NAME = this.getFieldValue('NAME'); + var METHOD = this.getFieldValue('METHOD'); + var code = new Array(this.itemCount_); + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || ''; + } + return [NAME + '.' + METHOD + '(' + code.join(', ') + ')', generator.ORDER_ATOMIC]; +} + +export const factory_block = function () { + var VALUE = this.getFieldValue('VALUE'); + //if(!(VALUE.charAt(VALUE.length-1)==";")){ + //VALUE=VALUE+';'; + //} + return VALUE + '\n'; +} + +export const factory_block_return = function (_, generator) { + var VALUE = this.getFieldValue('VALUE'); + return [VALUE, generator.ORDER_ATOMIC]; +} + +export const factory_block_with_textarea = function () { + var VALUE = this.getFieldValue('VALUE'); + //if(!(VALUE.charAt(VALUE.length-1)==";")){ + //VALUE=VALUE+';'; + //} + return VALUE + '\n'; +} + +export const factory_block_return_with_textarea = function (_, generator) { + var VALUE = this.getFieldValue('VALUE'); + return [VALUE, generator.ORDER_ATOMIC]; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/hardware.js b/mixly/boards/default_src/python_mixpy/generators/hardware.js new file mode 100644 index 00000000..ac6bab7b --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/hardware.js @@ -0,0 +1,53 @@ +import { JSFuncs } from 'mixly'; + +export const hardware_arduino_start = function (_, generator) { + generator.definitions_['import_s4alib'] = 'import s4alib'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + // var code= v + '.start()\n'; + var code = v + ' = s4alib.s4a_start("' + JSFuncs.getCom() + '")\n'; + return code; +} + +export const inout_highlow = function (_, generator) { + // Boolean values HIGH and LOW. + var code = (this.getFieldValue('BOOL') == 'HIGH') ? '1' : '0'; + return [code, generator.ORDER_ATOMIC]; +} + +export const hardware_arduino_digital_write = function (_, generator) { + generator.definitions_['import_s4alib'] = 'import s4alib'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC); + var code = ""; + code += '' + v + '.digital_write(' + dropdown_pin + ',' + dropdown_stat + ')\n' + return code; +} + +export const hardware_arduino_digital_read = function (_, generator) { + generator.definitions_['import_s4alib'] = 'import s4alib'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var code = ""; + code = '' + v + '.digital_read(' + dropdown_pin + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const hardware_arduino_analog_read = function (_, generator) { + generator.definitions_['import_s4alib'] = 'import s4alib'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var code = ""; + code = '' + v + '.analog_read(' + dropdown_pin + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const hardware_arduino_analog_write = function (_, generator) { + generator.definitions_['import_s4alib'] = 'import s4alib'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC); + var code = ""; + code += '' + v + '.analog_write(' + dropdown_pin + ',' + value_num + ')\n' + return code; +} diff --git a/mixly/boards/default_src/python_mixpy/generators/inout.js b/mixly/boards/default_src/python_mixpy/generators/inout.js new file mode 100644 index 00000000..0561aa1e --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/inout.js @@ -0,0 +1,55 @@ +export const inout_input = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + return ['input(' + str + ')', generator.ORDER_ATOMIC]; +} + +export const inout_print = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var code = "print(" + str + ")\n"; + return code; +} + +export const inout_print_inline = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var code = "print(" + str + ',end ="")\n'; + return code; +} + +export const inout_print_end = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var end = generator.valueToCode(this, 'END', generator.ORDER_ATOMIC) || '""'; + var code = "print(" + str + ',end =' + end + ')\n'; + return code; +} + +export const inout_type_input = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var type = this.getFieldValue('DIR'); + if (type == 'str') { var code = 'input(' + str + ')' } + else if (type == 'int') { var code = 'int(input(' + str + '))' } + else if (type == 'float') { var code = 'float(input(' + str + '))' } + //var code=varname+"." + type + "(" + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const pyinout_type_input = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var type = this.getFieldValue('DIR'); + generator.definitions_['import_pyinput'] = 'import pyinput'; + if (type == 'str') { var code = 'pyinput.input(' + str + ')' } + else if (type == 'int') { var code = 'int(pyinput.input(' + str + '))' } + else if (type == 'float') { var code = 'float(pyinput.input(' + str + '))' } + //var code=varname+"." + type + "(" + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const inout_print_many = function (_, generator) { + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + var code = 'print(' + code.join(', ') + ')\n'; + return code; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/iot.js b/mixly/boards/default_src/python_mixpy/generators/iot.js new file mode 100644 index 00000000..22502dfb --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/iot.js @@ -0,0 +1,129 @@ +export const iot_mixio_connect = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC); + var username = generator.valueToCode(this, 'USERNAME', generator.ORDER_ATOMIC); + var password = generator.valueToCode(this, 'PASSWORD', generator.ORDER_ATOMIC); + var project = generator.valueToCode(this, 'PROJECT', generator.ORDER_ATOMIC); + var timestamp = Math.round(new Date()).toString(); + //var subscribe = generator.valueToCode(this, 'SUB', generator.ORDER_ASSIGNMENT) || '0'; + var a = "f'python-mqtt-" + username.replace("'", "").replace("'", "") + timestamp.replace("'", "").replace("'", "") + "'"; + var code = 'mqtt_client = mixiot.MixIO(' + server + ', 1883 ,' + username + ', ' + password + ', ' + project + ', ' + a + ')\n'; + return code; +} + +export const IOT_MIXIO_PUBLISH = function (_, generator) { + var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC); + var msg = generator.valueToCode(this, 'MSG', generator.ORDER_ATOMIC); + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.publish(' + topic + ', ' + msg + ')\n'; + return code; +} + +export const IOT_MIXIO_PUBLISHEX = function (_, generator) { + var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC); + var msg = generator.valueToCode(this, 'MSG', generator.ORDER_ATOMIC); + var q = this.getFieldValue('quality'); + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.publish(MQTT_USR_PRJ + ' + topic + ', ' + msg + ', qos='+ q +')\n'; + return code; +} + +export const IOT_MIXIO_SUBSCRIBE = function (_, generator) { + var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC); + var method = generator.valueToCode(this, 'METHOD', generator.ORDER_ATOMIC); + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.subscribe_and_set_callback(' + topic + ',' + method + ')\n'; + return code; +} + +export const IOT_MIXIO_UNSUBSCRIBE = function (_, generator) { + var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC); + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.unsubscribe(' + topic + ')\n'; + return code; +} + +export const iot_mixio_disconnect = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.disconnect()\n'; + return code; +} + +export const iot_mixio_connect_only = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.connect()\n'; + return code; +} + +export const iot_mixio_check = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.check_msg()\n'; + return code; +} + +export const iot_mixio_format_topic = function (_, generator) { + var code = 'mqtt_client.decode("utf-8").split("/")[-1]'; + return [code, generator.ORDER_ATOMIC]; +} + +export const iot_mixio_format_msg = function (_, generator) { + var code = 'mqtt_client.decode("utf-8")'; + return [code, generator.ORDER_ATOMIC]; +} + +export const IOT_FORMATTING = function (_, generator) { + generator.definitions_['import_mixpy'] = "import mixpy"; + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = 'mixpy.format_content(' + v + ', mqtt_client.client_id)'; + return [code, generator.ORDER_ATOMIC]; +} + +export const IOT_FORMAT_STRING = function (_, generator) { + generator.definitions_['import_mixpy'] = "import mixpy"; + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = 'mixpy.format_str(' + v + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const IOT_EMQX_INIT_AND_CONNECT_BY_MIXLY_CODE = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC); + var share_code = generator.valueToCode(this, 'KEY', generator.ORDER_ATOMIC); + var timestamp = Math.round(new Date()).toString(); + var a = "f'python-mqtt-" + share_code.replace("'", "").replace("'", "") + timestamp.replace("'", "").replace("'", "") + "'"; + var code = 'mqtt_client = mixiot.MixIO.from_mixly_key(' + server + ', 1883 ,' + share_code + ', ' + a + ')\n'; + return code; +} + +export const iot_mixly_key = function (_, generator) { + var code = this.getFieldValue('VISITOR_ID'); + return [code, generator.ORDER_ATOMIC]; +} + +export const iot_mixly_key_py = function (_, generator) { + var code = this.getFieldValue('VISITOR_ID'); + return ["'" + code + "'", generator.ORDER_ATOMIC]; +} + +export const IOT_EMQX_INIT_AND_CONNECT_BY_SHARE_CODE = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC); + var mixly_code = generator.valueToCode(this, 'KEY', generator.ORDER_ATOMIC); + var timestamp = Math.round(new Date()).toString(); + var a = "f'python-mqtt-" + mixly_code.replace("'", "").replace("'", "") + timestamp.replace("'", "").replace("'", "") + "'"; + var code = 'mqtt_client = mixiot.MixIO.from_share_key(' + server + ', 1883 ,' + mixly_code + ', ' + a + ')\n'; + return code; +} + +export const IOT_EMQX_PING = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.pingSync()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const IOT_MIXIO_NTP = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var addr = generator.valueToCode(this, 'addr', generator.ORDER_ATOMIC); + var code = 'mixiot.ntp(' + addr + ')'; + return [code, generator.ORDER_ATOMIC]; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/pins.js b/mixly/boards/default_src/python_mixpy/generators/pins.js new file mode 100644 index 00000000..c8fd8cee --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/pins.js @@ -0,0 +1,9 @@ +export const pins_digital = function (_, generator) { + var code = this.getFieldValue('PIN'); + return [code, generator.ORDER_ATOMIC]; +} + +export const pins_digital_write = pins_digital; +export const pins_digital_read = pins_digital; +export const pins_analog_write = pins_digital; +export const pins_analog_read = pins_digital; \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/serial.js b/mixly/boards/default_src/python_mixpy/generators/serial.js new file mode 100644 index 00000000..5692d605 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/serial.js @@ -0,0 +1,37 @@ +import * as Blockly from 'blockly/core'; +import { JSFuncs } from 'mixly'; + +export const serial_open = function (_, generator) { + generator.definitions_['import_serial'] = 'import serial'; + var time = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0' + var varName = generator.variableDB_.getName(this.getFieldValue('SER'), + Blockly.Variables.NAME_TYPE); + var bps = this.getFieldValue('BPS'); + // var code= v + '.start()\n'; + var code = varName + ' = serial.Serial("' + JSFuncs.getCom() + '", ' + bps + ', timeout=' + time + ')\n'; + return code; +} + +export const serial_write = function (_, generator) { + generator.definitions_['import_serial'] = 'import serial'; + var ser = generator.valueToCode(this, 'SER', generator.ORDER_ADDITIVE) || 'ser'; + var str = (generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'); + // var code= v + '.start()\n'; + var code = ser + '.write(' + str + ')\n'; + return code; +} + +export const serial_read_b = function (_, generator) { + generator.definitions_['import_serial'] = 'import serial'; + var ser = generator.valueToCode(this, 'SER', generator.ORDER_ADDITIVE) || 'ser'; + var len = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0' + var code = ser + '.read(' + len + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const serial_close = function (_, generator) { + generator.definitions_['import_serial'] = 'import serial'; + var ser = generator.valueToCode(this, 'SER', generator.ORDER_ADDITIVE) || 'ser'; + var code = ser + '.close()\n'; + return code; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/sklearn.js b/mixly/boards/default_src/python_mixpy/generators/sklearn.js new file mode 100644 index 00000000..2cf28e8a --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/sklearn.js @@ -0,0 +1,264 @@ +export const sklearn_make_classification = function (_, generator) { + var value_n_samples = generator.valueToCode(this, 'n_samples', generator.ORDER_ATOMIC) || '100'; + var value_n_features = generator.valueToCode(this, 'n_features', generator.ORDER_ATOMIC) || '20'; + var value_n_informative = generator.valueToCode(this, 'n_informative', generator.ORDER_ATOMIC) || '2'; + var value_n_redundant = generator.valueToCode(this, 'n_redundant', generator.ORDER_ATOMIC) || '2'; + var value_n_repeated = generator.valueToCode(this, 'n_repeated', generator.ORDER_ATOMIC) || '0'; + var value_n_classes = generator.valueToCode(this, 'n_classes', generator.ORDER_ATOMIC) || '2'; + var value_n_clusters_per_class = generator.valueToCode(this, 'n_clusters_per_class', generator.ORDER_ATOMIC) || '2'; + var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_make_classification'] = 'from sklearn.datasets import make_classification'; + var code = 'make_classification(n_samples=' + value_n_samples + ', n_features=' + value_n_features + ', n_informative=' + value_n_informative + ', n_redundant=' + value_n_redundant + ', n_repeated=' + value_n_repeated + ', n_classes=' + value_n_classes + ', n_clusters_per_class=' + value_n_clusters_per_class + ', random_state=' + value_random_state + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 生成回归样本 +export const sklearn_make_regression = function (_, generator) { + var value_n_samples = generator.valueToCode(this, 'n_samples', generator.ORDER_ATOMIC) || '100'; + var value_n_features = generator.valueToCode(this, 'n_features', generator.ORDER_ATOMIC) || '100'; + var value_n_informative = generator.valueToCode(this, 'n_informative', generator.ORDER_ATOMIC) || '10'; + var value_n_targets = generator.valueToCode(this, 'n_targets', generator.ORDER_ATOMIC) || '1'; + var value_bias = generator.valueToCode(this, 'bias', generator.ORDER_ATOMIC) || '0.0'; + var value_noise = generator.valueToCode(this, 'noise', generator.ORDER_ATOMIC) || '0.0'; + var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_make_regression'] = 'from sklearn.datasets import make_regression'; + var code = 'make_regression(n_samples=' + value_n_samples + ', n_features=' + value_n_features + ', n_informative=' + value_n_informative + ', n_targets=' + value_n_targets + ', bias=' + value_bias + ', noise=' + value_noise + ', random_state=' + value_random_state + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 生成聚类样本 +export const sklearn_make_blobs = function (_, generator) { + var value_n_samples = generator.valueToCode(this, 'n_samples', generator.ORDER_ATOMIC) || '100'; + var value_n_features = generator.valueToCode(this, 'n_features', generator.ORDER_ATOMIC) || '2'; + var value_centers = generator.valueToCode(this, 'centers', generator.ORDER_ATOMIC) || 'None'; + var value_cluster_std = generator.valueToCode(this, 'cluster_std', generator.ORDER_ATOMIC) || '1.0'; + var value_center_box = generator.valueToCode(this, 'center_box', generator.ORDER_ATOMIC) || '(-10.0,10.0)'; + var value_shuffle = generator.valueToCode(this, 'shuffle', generator.ORDER_ATOMIC) || 'True'; + var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_make_blobs'] = 'from sklearn.datasets import make_blobs'; + var code = 'make_blobs(n_samples=' + value_n_samples + ', n_features=' + value_n_features + ', centers=' + value_centers + ', cluster_std=' + value_cluster_std + ', center_box=' + value_center_box + ', shuffle=' + value_shuffle + ', random_state=' + value_random_state + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 加载数据集 +export const sklearn_load = function (_, generator) { + var dropdown_type = this.getFieldValue('type'); + var text_name = this.getFieldValue('name'); + generator.definitions_['import_sklearn_datasets'] = 'from sklearn import datasets'; + var code = text_name + ' = datasets.' + dropdown_type + '()\n'; + return code; +} + +// sklearn 获取特征值/标签值/标签/特征 +export const sklearn_data_target = function (_, generator) { + var value_name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC) || 'iris'; + var dropdown_type = this.getFieldValue('type'); + var code = value_name + '.' + dropdown_type; + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 数据集分割 +export const sklearn_train_test_split = function (_, generator) { + var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'iris_X'; + var value_train_target = generator.valueToCode(this, 'train_target', generator.ORDER_ATOMIC) || 'iris_y'; + var value_test_size = generator.valueToCode(this, 'test_size', generator.ORDER_ATOMIC) || '0.3'; + var value_rondom_state = generator.valueToCode(this, 'rondom_state', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_train_test_split'] = 'from sklearn.model_selection import train_test_split'; + if (value_train_target == 'None') { + var code = 'train_test_split(' + value_train_data + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')'; + } else { + var code = 'train_test_split(' + value_train_data + ', ' + value_train_target + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')'; + } + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 数据集分割-无标签值 +export const sklearn_train_test_split_no_target = function (_, generator) { + var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'iris_X'; + var value_test_size = generator.valueToCode(this, 'test_size', generator.ORDER_ATOMIC) || '0.3'; + var value_rondom_state = generator.valueToCode(this, 'rondom_state', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_train_test_split'] = 'from sklearn.model_selection import train_test_split'; + var code = 'train_test_split(' + value_train_data + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 初始化线性回归 +export const sklearn_LinearRegression = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var value_fit_intercept = generator.valueToCode(this, 'fit_intercept', generator.ORDER_ATOMIC) || 'True'; + var value_normalize = generator.valueToCode(this, 'normalize', generator.ORDER_ATOMIC) || 'False'; + var value_n_jobs = generator.valueToCode(this, 'n_jobs', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_linear_model'] = 'from sklearn.linear_model import LinearRegression'; + var code = value_model_name + ' = LinearRegression(fit_intercept=' + value_fit_intercept + ', normalize=' + value_normalize + ', n_jobs=' + value_n_jobs + ')\n'; + return code; +} + +// sklearn 初始化岭回归 +export const sklearn_Ridge = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var value_alpha = generator.valueToCode(this, 'alpha', generator.ORDER_ATOMIC) || '1.0'; + var value_fit_intercept = generator.valueToCode(this, 'fit_intercept', generator.ORDER_ATOMIC) || 'True'; + var value_normalize = generator.valueToCode(this, 'normalize', generator.ORDER_ATOMIC) || 'False'; + var value_max_iter = generator.valueToCode(this, 'max_iter', generator.ORDER_ATOMIC) || '300'; + var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_linear_model'] = 'from sklearn.linear_model import Ridge'; + var code = value_model_name + ' = Ridge(alpha=' + value_alpha + ', fit_intercept=' + value_fit_intercept + ', normalize=' + value_normalize + ', max_iter=' + value_max_iter + ', random_state=' + value_random_state + ')\n'; + return code; +} + +// sklearn 初始化决策树 分类/回归算法 +export const sklearn_DecisionTreeClassifier_Regressor = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var dropdown_type = this.getFieldValue('type'); + var value_max_depth = generator.valueToCode(this, 'max_depth', generator.ORDER_ATOMIC) || 'None'; + var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_' + dropdown_type] = 'from sklearn.tree import ' + dropdown_type; + var code = value_model_name + ' = ' + dropdown_type + '(max_depth=' + value_max_depth + ', random_state=' + value_random_state + ')\n'; + return code; +} + +export const sklearn_RandomForestClassifier_Regressor = function (_, generator) { + var dropdown_type = this.getFieldValue('type'); + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'Model'; + var value_n_estimators = generator.valueToCode(this, 'n_estimators', generator.ORDER_ATOMIC) || '100'; + var value_max_depth = generator.valueToCode(this, 'max_depth', generator.ORDER_ATOMIC) || 'None'; + var value_n_jobs = generator.valueToCode(this, 'n_jobs', generator.ORDER_ATOMIC) || 'None'; + var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_' + dropdown_type] = 'from sklearn.ensemble import ' + dropdown_type; + var code = value_model_name + ' = ' + dropdown_type + '(n_estimators=' + value_n_estimators + ', max_depth=' + value_max_depth + ', n_jobs=' + value_n_jobs + ', random_state=' + value_random_state + ')\n'; + return code; +} + +// sklearn 初始化K近邻 分类/回归算法 +export const sklearn_KNeighborsClassifier_Regressor = function (_, generator) { + var dropdown_type = this.getFieldValue('type'); + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var value_K = generator.valueToCode(this, 'K', generator.ORDER_ATOMIC) || '5'; + var value_n_jobs = generator.valueToCode(this, 'n_jobs', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_' + dropdown_type] = 'from sklearn.neighbors import ' + dropdown_type; + var code = value_model_name + ' = ' + dropdown_type + '(n_neighbors=' + value_K + ', n_jobs=' + value_n_jobs + ')\n'; + return code; +} + +// sklearn 初始化高斯贝叶斯分类算法 +export const sklearn_GaussianNB = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + generator.definitions_['import_sklearn_GaussianNB'] = 'from sklearn.naive_bayes import GaussianNB'; + var code = value_model_name + ' = GaussianNB()\n'; + return code; +} + +// sklearn 初始化PCA降维 +export const sklearn_pca = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'pca'; + var value_n_components = generator.valueToCode(this, 'n_components', generator.ORDER_ATOMIC) || '2'; + generator.definitions_['import_sklearn_pca'] = 'from sklearn.decomposition import PCA'; + var code = value_model_name + ' = PCA(n_components=' + value_n_components + ')\n'; + return code; +} + +export const sklearn_pca_fit_transform = function(block, generator) { + var value_model_name = generator.valueToCode(block, 'model_name', generator.ORDER_ATOMIC); + var value_train_data = generator.valueToCode(block, 'train_data', generator.ORDER_ATOMIC); + var code = value_model_name + '.fit_transform(' + value_train_data + ')'; + return [code, generator.ORDER_ATOMIC]; +}; + +// sklearn 初始K-均值聚类 +export const sklearn_KMeans = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var value_n_clusters = generator.valueToCode(this, 'n_clusters', generator.ORDER_ATOMIC) || '8'; + var value_max_iter = generator.valueToCode(this, 'max_iter', generator.ORDER_ATOMIC) || '300'; + var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_KMeans'] = 'from sklearn.cluster import KMeans'; + var code = value_model_name + ' = KMeans(n_clusters=' + value_n_clusters + ', max_iter=' + value_max_iter + ', random_state=' + value_random_state + ')\n'; + return code; +} + +export const sklearn_KMeans_fit = function(block, generator) { + var value_model_name = generator.valueToCode(block, 'model_name', generator.ORDER_ATOMIC); + var value_train_data = generator.valueToCode(block, 'train_data', generator.ORDER_ATOMIC); + var code = value_model_name + '.fit(' + value_train_data + ')\n'; + return code; +}; + +// sklearn 训练模型 +export const sklearn_fit = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train'; + var value_train_target = generator.valueToCode(this, 'train_target', generator.ORDER_ATOMIC) || 'y_train'; + if (value_train_target == 'None') { + var code = value_model_name + '.fit(' + value_train_data + ')\n'; + } else { + var code = value_model_name + '.fit(' + value_train_data + ', ' + value_train_target + ')\n'; + } + return code; +} + +// sklearn 训练模型-无标签值 +export const sklearn_fit_no_target = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train'; + var code = value_model_name + '.fit(' + value_train_data + ')\n'; + return code; +} + +// sklearn 模型预测 +export const sklearn_predict = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_test'; + var code = value_model_name + '.predict(' + value_train_data + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 计算模型得分 +export const sklearn_score = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train'; + var value_train_target = generator.valueToCode(this, 'train_target', generator.ORDER_ATOMIC) || 'y_train'; + if (value_train_target == 'None') { + var code = value_model_name + '.score(' + value_train_data + ')'; + } else { + var code = value_model_name + '.score(' + value_train_data + ', ' + value_train_target + ')'; + } + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 计算模型得分-无标签值 +export const sklearn_score_no_target = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train'; + var code = value_model_name + '.score(' + value_train_data + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 线性回归 模型获取 斜率/截距 +export const sklearn_coef_intercept = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var dropdown_type = this.getFieldValue('type'); + var code = value_model_name + '.' + dropdown_type; + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn K-均值聚类 模型获取 簇中心坐标/聚类后的标签/所有点到对应簇中心的距离平方和 +export const sklearn_cluster_centers_labels_inertia = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var dropdown_type = this.getFieldValue('type'); + var code = value_model_name + '.' + dropdown_type; + return [code, generator.ORDER_ATOMIC]; +} + +// sklearn 保存/加载模型 +export const sklearn_save_load_model = function (_, generator) { + var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + var dropdown_type = this.getFieldValue('type'); + var value_address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC) || 'D:/mixly/test.pkl'; + generator.definitions_['import_sklearn_joblib'] = 'import joblib'; + var code = ''; + if (dropdown_type == 'dump') { + code = 'joblib.dump(' + value_model_name + ', ' + value_address + ')\n'; + } else { + code = value_model_name + ' = joblib.load(' + value_address + ')\n'; + } + return code; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/system.js b/mixly/boards/default_src/python_mixpy/generators/system.js new file mode 100644 index 00000000..5e55a641 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/system.js @@ -0,0 +1,22 @@ +export const controls_millis = function (_, generator) { + generator.definitions_.import_time = "import time"; + var code = 'time.time()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const controls_end_program = function () { + return 'exit()\n'; +} + +export const time_localtime = function (_, generator) { + generator.definitions_.import_time = "import time"; + var op = this.getFieldValue('op'); + var code = "time.localtime()[" + op + "]"; + switch (op) { + case "all": + var code1 = "time.localtime()"; + return [code1, generator.ORDER_ASSIGNMENT]; + default: + return [code, generator.ORDER_ASSIGNMENT]; + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/generators/turtle.js b/mixly/boards/default_src/python_mixpy/generators/turtle.js new file mode 100644 index 00000000..bdc371bb --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/generators/turtle.js @@ -0,0 +1,422 @@ +import * as Blockly from 'blockly/core'; + +export const turtle_create = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + + //generator.definitions_['var_declare'+varName] = varName+'= '+ 'turtle.Turtle()\n'; + var code = varName + ' = ' + 'turtle.Turtle()\n'; + return code; + // return ''; +} + +export const turtle_done = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var code = 'turtle.done()\n'; + return code; +} + +export const turtle_exitonclick = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var code = 'turtle.exitonclick()\n'; + return code; +} + +export const turtle_move = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + direction + "(" + num + ')\n'; + return code; +} + +export const turtle_rotate = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + direction + "(" + num + ')\n'; + return code; +} + +export const turtle_setheading = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.setheading(' + argument + ')\n'; + return code; +} + +export const turtle_screen_delay = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.screen.delay(' + argument + ')\n'; + return code; +} + +export const turtle_goto = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var xnum = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var ynum = generator.valueToCode(this, 'val', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.goto(' + xnum + ',' + ynum + ')\n'; + return code; +} + +export const turtle_pos_shape = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var get = this.getFieldValue('DIR'); + var code = varName + '.' + get + '()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_stamp = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.stamp()\n'; + return code; +} + +export const turtle_clear = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var clear = this.getFieldValue('DIR'); + var code = varName + "." + clear + "(" + ')\n'; + return code; +} + +export const turtle_penup = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var penup = this.getFieldValue('DIR'); + var code = varName + "." + penup + "(" + ')\n'; + return code; +} + +export const turtle_fill = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var penup = this.getFieldValue('DIR'); + var code = varName + "." + penup + "_fill(" + ')\n'; + return code; +} + +export const turtle_size_speed = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = this.getFieldValue('TUR'); + var size = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + size + "(" + num + ')\n'; + return code; +} + +export const turtle_size = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.pensize(' + argument + ')\n'; + return code; +} + +export const turtle_speed = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.speed(' + argument + ')\n'; + return code; +} + +export const turtle_circle = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var circle = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + circle + "(" + num + ')\n'; + return code; +} + +export const turtle_setxy = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var xy = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + ".set" + xy + "(" + num + ')\n'; + return code; +} + +export const turtle_circle_advanced = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + ".circle (" + num + ',' + argument + ')\n'; + return code; +} + +export const turtle_visible = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var visible = this.getFieldValue('DIR'); + var code = varName + "." + visible + "(" + ')\n'; + return code; +} + +export const turtle_bgcolor = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var color = this.getFieldValue('FIELDNAME'); + var code = "turtle." + 'bgcolor' + '("' + color + '")\n'; + return code; +} + +export const turtle_title = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + const TITLE = generator.valueToCode(this, 'TITLE', generator.ORDER_ASSIGNMENT) || 'Mixly'; + var code = `turtle.title(${TITLE})\n`; + return code; +} + +export const turtle_setup = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + const WIDTH = generator.valueToCode(this, 'WIDTH', generator.ORDER_ASSIGNMENT) || '1'; + const HEIGHT = generator.valueToCode(this, 'HEIGHT', generator.ORDER_ASSIGNMENT) || 'None'; + var code = `turtle.setup(width=${WIDTH}, height=${HEIGHT})\n`; + return code; +} + +export const turtle_tracer = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + const STEP = generator.valueToCode(this, 'STEP', generator.ORDER_ASSIGNMENT) || '1'; + const DELAY = generator.valueToCode(this, 'DELAY', generator.ORDER_ASSIGNMENT) || 'None'; + var code = `turtle.tracer(${STEP}, delay=${DELAY})\n`; + return code; +} + +export const turtle_pencolor = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = this.getFieldValue('FIELDNAME'); + var code = varName + "." + 'pencolor' + '("' + color + '")\n'; + return code; +} + +export const turtle_fillcolor = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = this.getFieldValue('FIELDNAME'); + var code = varName + "." + 'fillcolor' + '("' + color + '")\n'; + return code; +} + +export const turtle_clone = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.clone()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_bgcolor_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = "turtle." + 'bgcolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_pencolor_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'pencolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_fillcolor_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'fillcolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_bgcolor_hex_new = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = "turtle." + 'bgcolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_pencolor_hex_new = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'pencolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_fillcolor_hex_new = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'fillcolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_color_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC); + var color2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC); + var code = varName + "." + 'color' + '(' + color1 + ',' + color2 + ')\n'; + return code; +} + +export const turtle_color = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color1 = this.getFieldValue('FIELDNAME'); + var color2 = this.getFieldValue('FIELDNAME2'); + var code = varName + "." + 'color' + '("' + color1 + '","' + color2 + '")\n'; + return code; +} + +export const turtle_shape = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + + var code = varName + ".shape('" + direction + "')\n"; + return code; +} + +export const turtle_shapesize = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument1 = generator.valueToCode(this, 'WID', generator.ORDER_ASSIGNMENT) || '0'; + var argument2 = generator.valueToCode(this, 'LEN', generator.ORDER_ASSIGNMENT) || '0'; + var argument3 = generator.valueToCode(this, 'OUTLINE', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + ".shapesize(" + argument1 + ',' + argument2 + ',' + argument3 + ')\n'; + return code; +} + +export const turtle_textinput = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var title = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var prompt = generator.valueToCode(this, 'PROMPT', generator.ORDER_ATOMIC); + var code = "turtle.textinput" + '(' + title + ',' + prompt + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_numinput = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var title = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var prompt = generator.valueToCode(this, 'PROMPT', generator.ORDER_ATOMIC); + var data = generator.valueToCode(this, 'DEFAULT', generator.ORDER_ATOMIC); + var min = generator.valueToCode(this, 'MIN', generator.ORDER_ATOMIC); + var max = generator.valueToCode(this, 'MAX', generator.ORDER_ATOMIC); + var code = "turtle.numinput" + '(' + title + ',' + prompt + "," + data + ',minval = ' + min + ',maxval = ' + max + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_write = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'write' + '(' + write + ')\n'; + return code; +} + +export const turtle_write_format = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var move = this.getFieldValue('MOVE'); + var align = this.getFieldValue('ALIGN'); + var fontname = generator.valueToCode(this, 'FONTNAME', generator.ORDER_ATOMIC); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var fonttype = this.getFieldValue('FONTTYPE'); + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'write' + '(' + write + ',' + move + ',align="' + align + '",font=(' + fontname + ',' + fontnum + ',"' + fonttype + '"))\n'; + return code; +} + +export const turtle_write_format_skulpt = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var move = this.getFieldValue('MOVE'); + var align = this.getFieldValue('ALIGN'); + var fontname = generator.valueToCode(this, 'FONTNAME', generator.ORDER_ATOMIC); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var fonttype = this.getFieldValue('FONTTYPE'); + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'write' + '(' + write + ',' + move + ',align="' + align + '",font=(' + fontname + ',' + fontnum + ',"' + fonttype + '"))\n'; + return code; +} + +export const turtle_color_seclet = function (_, generator) { + var colour = this.getFieldValue('COLOR'); + var code = '"' + colour + '"' + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_getscreen = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var turName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var code = varName + ' = ' + turName + '.getscreen()\n'; + return code; +} + +export const turtle_update = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = `${varName}.update()\n`; + return code; +} + +export const turtle_onkey = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None"; + var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None"; + var code = varName + ".onkey(" + callback + ", " + v + ")\n"; + return code; +} + +export const turtle_onclick = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None"; + var code = varName + ".onclick(" + callback + ")\n"; + return code; +} + +export const turtle_ontimer = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None"; + var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None"; + var code = varName + ".ontimer(" + callback + ", " + v + ")\n"; + return code; +} + +export const turtle_listen = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.listen()\n'; + return code; +} + +export const turtle_screen_savefig = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = varName + ".getcanvas().postscript(file=" + file + ")\n"; + return code; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/index.js b/mixly/boards/default_src/python_mixpy/index.js new file mode 100644 index 00000000..74e26f57 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/index.js @@ -0,0 +1,140 @@ +import * as Blockly from 'blockly/core'; +import { Profile } from 'mixly'; + +import { + PythonVariablesBlocks, + PythonControlBlocks, + PythonMathBlocks, + PythonTextBlocks, + PythonListsBlocks, + PythonDictsBlocks, + PythonLogicBlocks, + PythonStorageBlocks, + PythonProceduresBlocks, + PythonTupleBlocks, + PythonSetBlocks, + PythonHtmlBlocks, + PythonUtilityBlocks, + PythonVariablesGenerators, + PythonControlGenerators, + PythonMathGenerators, + PythonTextGenerators, + PythonListsGenerators, + PythonDictsGenerators, + PythonLogicGenerators, + PythonStorageGenerators, + PythonProceduresGenerators, + PythonTupleGenerators, + PythonSetGenerators, + PythonHtmlGenerators, + PythonUtilityGenerators, + Procedures, + Variables, + Python +} from '@mixly/python'; + +import { + PythonMixpyAIBlocks, + PythonMixpyAlgorithmBlocks, + PythonMixpyCommunicateBlocks, + PythonMixpyCVBlocks, + PythonMixpyDataBlocks, + PythonMixpyDatastructureBlocks, + PythonMixpyFactoryBlocks, + PythonMixpyHardwareBlocks, + PythonMixpyInoutBlocks, + PythonMixpyIOTBlocks, + PythonMixpyPinsBlocks, + PythonMixpySerialBlocks, + PythonMixpySKLearnBlocks, + PythonMixpySystemBlocks, + PythonMixpyTurtleBlocks, + PythonMixpyAIGenerators, + PythonMixpyAlgorithmGenerators, + PythonMixpyCommunicateGenerators, + PythonMixpyCVGenerators, + PythonMixpyDataGenerators, + PythonMixpyDatastructureGenerators, + PythonMixpyFactoryGenerators, + PythonMixpyHardwareGenerators, + PythonMixpyInoutGenerators, + PythonMixpyIOTGenerators, + PythonMixpyPinsGenerators, + PythonMixpySerialGenerators, + PythonMixpySKLearnGenerators, + PythonMixpySystemGenerators, + PythonMixpyTurtleGenerators +} from './'; + +import './css/color_mixpy_python_advance.css'; + +Object.assign(Blockly.Variables, Variables); +Object.assign(Blockly.Procedures, Procedures); +Blockly.Python = Python; +Blockly.generator = Python; + +Profile.default = {}; + +Object.assign( + Blockly.Blocks, + PythonVariablesBlocks, + PythonControlBlocks, + PythonMathBlocks, + PythonTextBlocks, + PythonListsBlocks, + PythonDictsBlocks, + PythonLogicBlocks, + PythonStorageBlocks, + PythonProceduresBlocks, + PythonTupleBlocks, + PythonSetBlocks, + PythonHtmlBlocks, + PythonUtilityBlocks, + PythonMixpyAIBlocks, + PythonMixpyAlgorithmBlocks, + PythonMixpyCommunicateBlocks, + PythonMixpyCVBlocks, + PythonMixpyDataBlocks, + PythonMixpyDatastructureBlocks, + PythonMixpyFactoryBlocks, + PythonMixpyHardwareBlocks, + PythonMixpyInoutBlocks, + PythonMixpyIOTBlocks, + PythonMixpyPinsBlocks, + PythonMixpySerialBlocks, + PythonMixpySKLearnBlocks, + PythonMixpySystemBlocks, + PythonMixpyTurtleBlocks +); + +Object.assign( + Blockly.Python.forBlock, + PythonVariablesGenerators, + PythonControlGenerators, + PythonMathGenerators, + PythonTextGenerators, + PythonListsGenerators, + PythonDictsGenerators, + PythonLogicGenerators, + PythonStorageGenerators, + PythonProceduresGenerators, + PythonTupleGenerators, + PythonSetGenerators, + PythonHtmlGenerators, + PythonUtilityGenerators, + PythonMixpyAIGenerators, + PythonMixpyAlgorithmGenerators, + PythonMixpyCommunicateGenerators, + PythonMixpyCVGenerators, + PythonMixpyDataGenerators, + PythonMixpyDatastructureGenerators, + PythonMixpyFactoryGenerators, + PythonMixpyHardwareGenerators, + PythonMixpyInoutGenerators, + PythonMixpyIOTGenerators, + PythonMixpyPinsGenerators, + PythonMixpySerialGenerators, + PythonMixpySKLearnGenerators, + PythonMixpySystemGenerators, + PythonMixpyTurtleGenerators +); \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/jsconfig.json b/mixly/boards/default_src/python_mixpy/jsconfig.json new file mode 100644 index 00000000..986b8152 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/jsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "baseUrl": "./", + "paths": { + "@mixly/python": [ + "../python" + ] + } + }, + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/config.json b/mixly/boards/default_src/python_mixpy/origin/config.json new file mode 100644 index 00000000..1621567b --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/config.json @@ -0,0 +1,22 @@ +{ + "language": "Python", + "nav": { + "run": true, + "cancel": true, + "save": { + "py": true + }, + "setting": { + "thirdPartyLibrary": true, + "pythonToBlockly": true + } + }, + "lib": { + "mixly": { + "url": [ + "http://download.mixlylibs.cloud/mixly3-packages/cloud-libs/python/libs.json" + ] + } + }, + "pythonToBlockly": false +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/AipImage.mix b/mixly/boards/default_src/python_mixpy/origin/examples/AipImage.mix new file mode 100644 index 00000000..a6abe4dc --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/AipImage.mix @@ -0,0 +1 @@ +procedurerbfilename.txtpathfreadf-1AipImageClassifyclient16448656W0GUuKLWqwkKK57ntbDfKGcRfMQOaDcARzV1DIzUsDXqC4O6SsLb9uKKimagegetOneFileresultclientadvancedGeneralD:/img.jpgimageHellomydictresultresult \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/AipNlp.mix b/mixly/boards/default_src/python_mixpy/origin/examples/AipNlp.mix new file mode 100644 index 00000000..a83bc27d --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/AipNlp.mix @@ -0,0 +1 @@ +AipNlpclient16669201LWsSsPG5YhvNSc9Rc555U3krYUBzmdyBf9CZEuXQzVQp9HE4gYULzrmCresultclientlexer\u4ECA\u5929\u5929\u6C14\u771F\u597DHellomydictresultitems \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/AipNlp_simnet.mix b/mixly/boards/default_src/python_mixpy/origin/examples/AipNlp_simnet.mix new file mode 100644 index 00000000..fb9feedb --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/AipNlp_simnet.mix @@ -0,0 +1 @@ +AipNlpclient16669201LWsSsPG5YhvNSc9Rc555U3krYUBzmdyBf9CZEuXQzVQp9HE4gYULzrmCresultclientsimnet\u7C73\u601D\u9F50\u7C73\u601D\u76AEHelloresult \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/AipOcr.mix b/mixly/boards/default_src/python_mixpy/origin/examples/AipOcr.mix new file mode 100644 index 00000000..5f986ef9 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/AipOcr.mix @@ -0,0 +1 @@ +procedurerbfilename.txtpathfreadf-1AipOcrclient14298851WhPHPqF88PxpV0yEohosGa7CFWBHpZMI5yg2eqPwUQZHuBA6imhGGLsQimagegetOneFileresultclientbasicGeneralC:/mixly.jpgimage\"language_type\"\"detect_language\"\"probability\"\"detect_direction\"CHN_ENGtruetruetrueHellomydictresultwords_result \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/AipSpeech.mix b/mixly/boards/default_src/python_mixpy/origin/examples/AipSpeech.mix new file mode 100644 index 00000000..1a10635c --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/AipSpeech.mix @@ -0,0 +1 @@ +AipSpeechclient117433591gDrAort6V1e2lKocpfunYGVFkBsF4vVpnQ5CLGFDpczCaZBRz6vWoxNresultclient\u795D\u5927\u5BB6\u7AEF\u5348\u8282\u5FEB\u4E50\uFF01wbduanwujie.mp3fMixlyresultf \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/guoqi.mix b/mixly/boards/default_src/python_mixpy/origin/examples/guoqi.mix new file mode 100644 index 00000000..9631b358 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/guoqi.mix @@ -0,0 +1 @@ +procedurepenuptinatina20x20ytina90lefttina0jiaoforwardtina60MULTIPLY1a3lefttina-198pendowntinabegintina#ffff00tina#ffff00tina0,1,2,3051iforwardtina150slefttina144endtinapenuptinaa20jiao0tinapenuptinatina-300200pendowntinabegintina#ff0000tina#ff0000tina0,1,2,3021iforwardtina600righttina90forwardtina400righttina90endtinaMULTIPLY33sqrt0.998MINUS1MULTIPLY21MULTIPLY1a1a1MULTIPLY1MULTIPLY21MULTIPLY1a1a1COS144DIVIDE1MULTIPLY1441pi180-2001000HelloMULTIPLY33sqrt0.998MINUS1MULTIPLY21MULTIPLY1a1a1MULTIPLY1MULTIPLY21MULTIPLY1a1a1COS144DIVIDE1MULTIPLY1441pi180aDIVIDE1a3MULTIPLY33sqrt0.998MINUS1MULTIPLY21MULTIPLY1a1a1MULTIPLY1MULTIPLY21MULTIPLY1a1a1COS144DIVIDE1MULTIPLY1441pi180-100160121MULTIPLY33sqrt0.998MINUS1MULTIPLY21MULTIPLY1a1a1MULTIPLY1MULTIPLY21MULTIPLY1a1a1COS144DIVIDE1MULTIPLY1441pi180-6012098MULTIPLY33sqrt0.998MINUS1MULTIPLY21MULTIPLY1a1a1MULTIPLY1MULTIPLY21MULTIPLY1a1a1COS144DIVIDE1MULTIPLY1441pi180-606074MULTIPLY33sqrt0.998MINUS1MULTIPLY21MULTIPLY1a1a1MULTIPLY1MULTIPLY21MULTIPLY1a1a1COS144DIVIDE1MULTIPLY1441pi180-1002051#ff0000tina#ff0000tinabackwardtina10 \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/map.json b/mixly/boards/default_src/python_mixpy/origin/examples/map.json new file mode 100644 index 00000000..ca86fc16 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/map.json @@ -0,0 +1,182 @@ +{ + "AipImage.mix": { + "__file__": true, + "__name__": "AipImage.mix" + }, + "AipNlp.mix": { + "__file__": true, + "__name__": "AipNlp.mix" + }, + "AipNlp_simnet.mix": { + "__file__": true, + "__name__": "AipNlp_simnet.mix" + }, + "AipOcr.mix": { + "__file__": true, + "__name__": "AipOcr.mix" + }, + "AipSpeech.mix": { + "__file__": true, + "__name__": "AipSpeech.mix" + }, + "guoqi.mix": { + "__file__": true, + "__name__": "guoqi.mix" + }, + "sin.mix": { + "__file__": true, + "__name__": "sin.mix" + }, + "人工智能mix": { + "02语音合成-1.mix": { + "__file__": true, + "__name__": "02语音合成-1.mix" + }, + "03语音识别-1.mix": { + "__file__": true, + "__name__": "03语音识别-1.mix" + }, + "03语音识别-2.mix": { + "__file__": true, + "__name__": "03语音识别-2.mix" + }, + "04图片识别-1.mix": { + "__file__": true, + "__name__": "04图片识别-1.mix" + }, + "04图片识别-2.mix": { + "__file__": true, + "__name__": "04图片识别-2.mix" + }, + "05人脸识别-1.mix": { + "__file__": true, + "__name__": "05人脸识别-1.mix" + }, + "05人脸识别-2.mix": { + "__file__": true, + "__name__": "05人脸识别-2.mix" + }, + "06文字识别-1.mix": { + "__file__": true, + "__name__": "06文字识别-1.mix" + }, + "06文字识别-2.mix": { + "__file__": true, + "__name__": "06文字识别-2.mix" + }, + "07拓展发现-1.mix": { + "__file__": true, + "__name__": "07拓展发现-1.mix" + }, + "07拓展发现-2.mix": { + "__file__": true, + "__name__": "07拓展发现-2.mix" + }, + "08文本纠错-1.mix": { + "__file__": true, + "__name__": "08文本纠错-1.mix" + }, + "08文本纠错-2.mix": { + "__file__": true, + "__name__": "08文本纠错-2.mix" + }, + "09词法分析-2.mix": { + "__file__": true, + "__name__": "09词法分析-2.mix" + }, + "09词法分析.mix": { + "__file__": true, + "__name__": "09词法分析.mix" + }, + "__file__": false, + "__name__": "人工智能mix" + }, + "海龟画图": { + "mix": { + "海龟画图01小房子_01小房子.mix": { + "__file__": true, + "__name__": "海龟画图01小房子_01小房子.mix" + }, + "海龟画图02小汽车_01正五边形.mix": { + "__file__": true, + "__name__": "海龟画图02小汽车_01正五边形.mix" + }, + "海龟画图02小汽车_02小汽车.mix": { + "__file__": true, + "__name__": "海龟画图02小汽车_02小汽车.mix" + }, + "海龟画图03小橙子_01完整橙子.mix": { + "__file__": true, + "__name__": "海龟画图03小橙子_01完整橙子.mix" + }, + "海龟画图03小橙子_02切开的橙子.mix": { + "__file__": true, + "__name__": "海龟画图03小橙子_02切开的橙子.mix" + }, + "海龟画图04盛开的向日葵_01太阳公公.mix": { + "__file__": true, + "__name__": "海龟画图04盛开的向日葵_01太阳公公.mix" + }, + "海龟画图04盛开的向日葵_02向日葵.mix": { + "__file__": true, + "__name__": "海龟画图04盛开的向日葵_02向日葵.mix" + }, + "海龟画图05炫彩螺旋线_01螺旋四边形.mix": { + "__file__": true, + "__name__": "海龟画图05炫彩螺旋线_01螺旋四边形.mix" + }, + "海龟画图05炫彩螺旋线_02彩色螺旋线.mix": { + "__file__": true, + "__name__": "海龟画图05炫彩螺旋线_02彩色螺旋线.mix" + }, + "海龟画图06米思齐Logo_01米思齐Logo.mix": { + "__file__": true, + "__name__": "海龟画图06米思齐Logo_01米思齐Logo.mix" + }, + "海龟画图07闪烁星星_01正五角星.mix": { + "__file__": true, + "__name__": "海龟画图07闪烁星星_01正五角星.mix" + }, + "海龟画图07闪烁星星_02正n角星.mix": { + "__file__": true, + "__name__": "海龟画图07闪烁星星_02正n角星.mix" + }, + "海龟画图08猜一猜_01猜性别.mix": { + "__file__": true, + "__name__": "海龟画图08猜一猜_01猜性别.mix" + }, + "海龟画图08猜一猜_02猜年龄.mix": { + "__file__": true, + "__name__": "海龟画图08猜一猜_02猜年龄.mix" + }, + "海龟画图09大树的年龄_01年轮.mix": { + "__file__": true, + "__name__": "海龟画图09大树的年龄_01年轮.mix" + }, + "海龟画图09大树的年龄_02树年龄.mix": { + "__file__": true, + "__name__": "海龟画图09大树的年龄_02树年龄.mix" + }, + "海龟画图10公共汽车_01公共汽车.mix": { + "__file__": true, + "__name__": "海龟画图10公共汽车_01公共汽车.mix" + }, + "海龟画图11美丽星空_01星空.mix": { + "__file__": true, + "__name__": "海龟画图11美丽星空_01星空.mix" + }, + "海龟画图12斐波那契数列_01输出斐波那契额数列.mix": { + "__file__": true, + "__name__": "海龟画图12斐波那契数列_01输出斐波那契额数列.mix" + }, + "海龟画图12斐波那契数列_02斐波那契额螺旋线.mix": { + "__file__": true, + "__name__": "海龟画图12斐波那契数列_02斐波那契额螺旋线.mix" + }, + "__file__": false, + "__name__": "mix" + }, + "__file__": false, + "__name__": "海龟画图" + } +} diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/sin.mix b/mixly/boards/default_src/python_mixpy/origin/examples/sin.mix new file mode 100644 index 00000000..360fab4f --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/sin.mix @@ -0,0 +1 @@ +coordinateforwardtina400lefttina22backwardtina20forwardtina20righttina44backwardtina20forwardtina20lefttina22backwardtina800forwardtina400tina90forwardtina300lefttina22backwardtina20forwardtina20righttina44backwardtina20forwardtina20lefttina22backwardtina600penuptinadraw_sin0,1,2,3-3143141itina20i20ADD20a1MULTIPLY2b1MULTIPLY1SIN90DIVIDE1i100100pendowntinatinatina5#ff0000tinaNUM\u8F93\u5165a0-2020NUM\u8F93\u5165b1-1010 \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/02语音合成-1.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/02语音合成-1.py new file mode 100644 index 00000000..2ace5b99 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/02语音合成-1.py @@ -0,0 +1,9 @@ +import aip + +import os + + +f = open("audio.mp3", 'wb') +client = aip.AipSpeech("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +f.write(client.synthesis("步行导航开始,直行后前方50米右转", options={})) +os.startfile("audio.mp3") diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/03语音识别-1.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/03语音识别-1.py new file mode 100644 index 00000000..b09b2434 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/03语音识别-1.py @@ -0,0 +1,8 @@ +import FileDialog + +import aip + + +f = open(FileDialog.getOneFile(), 'rb') +client = aip.AipSpeech("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +print(client.asr(f.read(), options={})["result"][0]) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/03语音识别-2.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/03语音识别-2.py new file mode 100644 index 00000000..c8760950 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/03语音识别-2.py @@ -0,0 +1,9 @@ +import audio + +import aip + + +audio.audio_record("d:\\1.wav",3) +f = open("d:\\1.wav", 'rb') +client = aip.AipSpeech("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +print(client.asr(f.read(), options={})["result"][0]) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/04图片识别-1.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/04图片识别-1.py new file mode 100644 index 00000000..26901cc0 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/04图片识别-1.py @@ -0,0 +1,8 @@ +import FileDialog + +import aip + + +f = open(FileDialog.getOneFile(), 'rb') +client = aip.AipImageClassify("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +print(client.advancedGeneral(f.read(), options={})["result"][0]["keyword"]) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/04图片识别-2.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/04图片识别-2.py new file mode 100644 index 00000000..fa27bcbb --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/04图片识别-2.py @@ -0,0 +1,9 @@ +import aip + +import FileDialog + + +client = aip.AipImageClassify("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +for i in FileDialog.getManyFiles(): + f = open(i, 'rb') + print(client.advancedGeneral(f.read(), options={})["result"][0]["keyword"]) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/05人脸识别-1.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/05人脸识别-1.py new file mode 100644 index 00000000..4779aa03 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/05人脸识别-1.py @@ -0,0 +1,7 @@ +import aip + +import FileDialog + + +client = aip.AipFace("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +print(client.match(FileDialog.getOneFile(),FileDialog.getOneFile(), options={})["score"]) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/05人脸识别-2.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/05人脸识别-2.py new file mode 100644 index 00000000..1ca5843b --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/05人脸识别-2.py @@ -0,0 +1,10 @@ +import aip + +import cam + +import FileDialog + + +client = aip.AipFace("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +cam.photo_capture("d:\\1.jpg","q") +print(client.match(FileDialog.getOneFile(),FileDialog.getOneFile(), options={})["score"]) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/06文字识别-1.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/06文字识别-1.py new file mode 100644 index 00000000..6dc6e760 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/06文字识别-1.py @@ -0,0 +1,8 @@ +import FileDialog + +import aip + + +f = open(FileDialog.getOneFile(), 'rb') +client = aip.AipOcr("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +print(client.basicGeneral(f.read(), options={})) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/06文字识别-2.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/06文字识别-2.py new file mode 100644 index 00000000..06d4b5f2 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/06文字识别-2.py @@ -0,0 +1,9 @@ +import FileDialog + +import aip + + +f = open(FileDialog.getOneFile(), 'rb') +client = aip.AipOcr("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +list = client.basicGeneral(f.read(), options={})["words_result"] +print(list) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/07拓展发现-1.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/07拓展发现-1.py new file mode 100644 index 00000000..bbcc93a3 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/07拓展发现-1.py @@ -0,0 +1,8 @@ +import FileDialog + +import aip + + +f = open(FileDialog.getOneFile(), 'rb') +client = aip.AipOcr("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +print(client.licensePlate(f.read(), options={})) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/07拓展发现-2.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/07拓展发现-2.py new file mode 100644 index 00000000..9fcef13c --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/07拓展发现-2.py @@ -0,0 +1,11 @@ +import FileDialog + +import aip + + +f = open(FileDialog.getOneFile(), 'rb') +f2 = open(FileDialog.getOneFile(), 'rb') +client = aip.AipOcr("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +client2 = aip.AipImageClassify("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +print(client.licensePlate(f.read(), options={})["words_result"]["number"]) +print(client2.carDetect(f2.read(), options={})) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/08文本纠错-1.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/08文本纠错-1.py new file mode 100644 index 00000000..629ff9e1 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/08文本纠错-1.py @@ -0,0 +1,5 @@ +import aip + + +client = aip.AipNlp("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +print(client.ecnet("促进创客教育与本地新形产业的整合,促进当地经济的发展。", options={})) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/08文本纠错-2.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/08文本纠错-2.py new file mode 100644 index 00000000..584ae70d --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/08文本纠错-2.py @@ -0,0 +1,10 @@ +import aip + + +client = aip.AipNlp("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +result = client.ecnet("促进创客教育与本地新形产业的整合,促进当地经济的发展。", options={}) +content = result["text"] +item = result["item"] +wrong = item["vec_fragment"][0]["ori_frag"] +right = item["vec_fragment"][0]["correct_frag"] +print(content.replace(wrong,"{}【{}】".format(wrong, right))) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/09词法分析-1.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/09词法分析-1.py new file mode 100644 index 00000000..eb3e3a70 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/09词法分析-1.py @@ -0,0 +1,10 @@ +import aip + + +client = aip.AipNlp("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +s = "" +for i in client.lexer("我爱米思齐", options={})["items"]: + if s != "": + s = s + "/" + s = s + i["item"] +print(s) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/09词法分析-2.py b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/09词法分析-2.py new file mode 100644 index 00000000..8ec8a36c --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能Py/09词法分析-2.py @@ -0,0 +1,12 @@ +import aip + + +client = aip.AipNlp("Enter Your APP_ID", "Enter Your API_KEY", "Enter Your SECRET_KEY") +word= {"r":"代词", "v":"动词", "nr":"名词"} +s = "" +for i in client.lexer("我爱米思齐", options={})["items"]: + s = s + i["item"] + s = s + "【" + s = s + word[i["pos"]] + s = s + "】" +print(s) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/02语音合成-1.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/02语音合成-1.mix new file mode 100644 index 00000000..9f15c0ea --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/02语音合成-1.mix @@ -0,0 +1 @@ +wbaudio.mp3fAipSpeechclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYclient\u6B65\u884C\u5BFC\u822A\u5F00\u59CB\uFF0C\u76F4\u884C\u540E\u524D\u65B950\u7C73\u53F3\u8F6Cfaudio.mp3 \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/03语音识别-1.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/03语音识别-1.mix new file mode 100644 index 00000000..52ab2420 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/03语音识别-1.mix @@ -0,0 +1 @@ +rbd:\\\\1.wavgetOneFilefAipSpeechclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYHelloSpeechclientreadf \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/03语音识别-2.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/03语音识别-2.mix new file mode 100644 index 00000000..5d540fde --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/03语音识别-2.mix @@ -0,0 +1 @@ +d:\\\\1.wav3rbd:\\\\1.wavfAipSpeechclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYHelloSpeechclientreadf \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/04图片识别-1.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/04图片识别-1.mix new file mode 100644 index 00000000..c1ac67eb --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/04图片识别-1.mix @@ -0,0 +1 @@ +rbfilename.txtgetOneFilefAipImageClassifyclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYHelloImageclientadvancedGeneralreadf \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/04图片识别-2.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/04图片识别-2.mix new file mode 100644 index 00000000..b4d23485 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/04图片识别-2.mix @@ -0,0 +1 @@ +AipImageClassifyclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEY0,1,2,3getManyFilesirbfilename.txtifHelloImageclientadvancedGeneralreadf \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/05人脸识别-1.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/05人脸识别-1.mix new file mode 100644 index 00000000..f1993d58 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/05人脸识别-1.mix @@ -0,0 +1 @@ +AipFaceclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYHellomydictclientC:/mixly.jpggetOneFileC:/mixpy.jpggetOneFilescore \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/05人脸识别-2.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/05人脸识别-2.mix new file mode 100644 index 00000000..5fafa17a --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/05人脸识别-2.mix @@ -0,0 +1 @@ +AipFaceclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYd:\\\\1.jpgqHellomydictclientC:/mixly.jpggetOneFileC:/mixpy.jpggetOneFilescore \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/06文字识别-1.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/06文字识别-1.mix new file mode 100644 index 00000000..6f86c3b4 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/06文字识别-1.mix @@ -0,0 +1 @@ +rbfilename.txtgetOneFilefAipOcrclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYHelloclientbasicGeneralC:/mixly.jpgreadf \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/06文字识别-2.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/06文字识别-2.mix new file mode 100644 index 00000000..9eb9deb1 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/06文字识别-2.mix @@ -0,0 +1 @@ +rbfilename.txtgetOneFilefAipOcrclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYlistmydictclientbasicGeneralC:/mixly.jpgreadfwords_resultHellolist \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/07拓展发现-1.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/07拓展发现-1.mix new file mode 100644 index 00000000..5579f2e3 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/07拓展发现-1.mix @@ -0,0 +1 @@ +rbfilename.txtgetOneFilefAipOcrclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYHelloclientlicensePlateC:/mixly.jpgreadf \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/07拓展发现-2.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/07拓展发现-2.mix new file mode 100644 index 00000000..aeda0402 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/07拓展发现-2.mix @@ -0,0 +1 @@ +rbfilename.txtgetOneFilefrbfilename.txtgetOneFilef2AipOcrclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYAipImageClassifyclient2Enter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYHellomydictmydictclientlicensePlateC:/mixly.jpgreadfwords_resultnumberHelloclient2carDetectC:/mixly.jpgreadf2 \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/08文本纠错-1.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/08文本纠错-1.mix new file mode 100644 index 00000000..acbde208 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/08文本纠错-1.mix @@ -0,0 +1 @@ +AipNlpclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYHelloclientecnet\u4FC3\u8FDB\u521B\u5BA2\u6559\u80B2\u4E0E\u672C\u5730\u65B0\u5F62\u4EA7\u4E1A\u7684\u6574\u5408\uFF0C\u4FC3\u8FDB\u5F53\u5730\u7ECF\u6D4E\u7684\u53D1\u5C55\u3002 \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/08文本纠错-2.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/08文本纠错-2.mix new file mode 100644 index 00000000..c22ef16b --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/08文本纠错-2.mix @@ -0,0 +1 @@ +AipNlpclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYresultclientecnet\u4FC3\u8FDB\u521B\u5BA2\u6559\u80B2\u4E0E\u672C\u5730\u65B0\u5F62\u4EA7\u4E1A\u7684\u6574\u5408\uFF0C\u4FC3\u8FDB\u5F53\u5730\u7ECF\u6D4E\u7684\u53D1\u5C55\u3002contentresulttextitemresultitemwrongmydictmylistitemvec_fragment0ori_fragrightmydictmylistitemvec_fragment0correct_fragHelloHello,mixlycontentmixlywrongmixpy{}\u3010{}\u3011wrongright \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/09词法分析-2.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/09词法分析-2.mix new file mode 100644 index 00000000..5b494331 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/09词法分析-2.mix @@ -0,0 +1 @@ +AipNlpclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYword\"r\"\"v\"\"nr\"\u4EE3\u8BCD\u52A8\u8BCD\u540D\u8BCDs0,1,2,3mydictclientlexer\u6211\u7231\u7C73\u601D\u9F50itemsisHellosMixlyiitemsHellos\u3010sHellos\u3010wordkeyipossHellos\u3011Hellos \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/09词法分析.mix b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/09词法分析.mix new file mode 100644 index 00000000..3211c946 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/人工智能mix/09词法分析.mix @@ -0,0 +1 @@ +AipNlpclientEnter Your APP_IDEnter Your API_KEYEnter Your SECRET_KEYs0,1,2,3mydictclientlexer\u6211\u7231\u7C73\u601D\u9F50itemsiNEQssHellos/sHellos/iitemHellos \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图01小房子_01小房子.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图01小房子_01小房子.mix new file mode 100644 index 00000000..35268229 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图01小房子_01小房子.mix @@ -0,0 +1 @@ +tinaforwardtina200lefttina150forwardtina115lefttina60forwardtina115lefttina150forwardtina40righttina90forwardtina120lefttina90forwardtina120lefttina90forwardtina120hideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图02小汽车_01正五边形.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图02小汽车_01正五边形.mix new file mode 100644 index 00000000..ecc089ce --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图02小汽车_01正五边形.mix @@ -0,0 +1 @@ +tinaangle720,1,2,3051iforwardtina120righttina90anglehideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图02小汽车_02小汽车.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图02小汽车_02小汽车.mix new file mode 100644 index 00000000..03e254a7 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图02小汽车_02小汽车.mix @@ -0,0 +1 @@ +tinatina5tina120tina-90180lefttina60tina-50150tina180forwardtina20tina90tina20360penuptinatina180forwardtina15pendowntinatina90tina5360penuptinatina180forwardtina25pendowntinaforwardtina50tina90tina20360penuptinatina180forwardtina15pendowntinatina90tina5360penuptinatina180forwardtina25pendowntinaforwardtina30hideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图03小橙子_01完整橙子.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图03小橙子_01完整橙子.mix new file mode 100644 index 00000000..9d5fea65 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图03小橙子_01完整橙子.mix @@ -0,0 +1 @@ +tinatina5#ff6600tinabegintinarighttina180tina100320righttina30tina45100endtinapenuptinatina358pendowntina#330000tinabegintinatina5360endtinahideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图03小橙子_02切开的橙子.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图03小橙子_02切开的橙子.mix new file mode 100644 index 00000000..d4164566 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图03小橙子_02切开的橙子.mix @@ -0,0 +1 @@ +tinatina10#ff6600tinatina100360penuptinatina0100pendowntinatina90#fffffftina#ff9900tina0,1,2,3081ibegintinabackwardtina90righttina90tina9045lefttina90forwardtina90endtinahideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图04盛开的向日葵_01太阳公公.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图04盛开的向日葵_01太阳公公.mix new file mode 100644 index 00000000..d79468d2 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图04盛开的向日葵_01太阳公公.mix @@ -0,0 +1 @@ +tina#ffcc33tina#ffcc33tinatina5begintinatina80360endtinapenuptinatina-40100pendowntina#000000tinatina30tina-3060penuptinatina20100pendowntinatina30tina-3060penuptinatina-2060pendowntinatina-30tina5060penuptinatina-30-30pendowntina#ffcc33tinatina600,1,2,30121itina-35120lefttina150hideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图04盛开的向日葵_02向日葵.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图04盛开的向日葵_02向日葵.mix new file mode 100644 index 00000000..d3c69189 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图04盛开的向日葵_02向日葵.mix @@ -0,0 +1 @@ +tina#000000tinatina5penuptinatina-5-5pendowntina#ffcc00tinabegintinatina-500,1,2,3061itina45150righttina90endtinapenuptinatina00tina0pendowntina#ff6600tinabegintinatina80360endtina0,1,2,3-341ipenuptinatina80MULTIPLY1i200MULTIPLY1fabs0.998i10pendowntinatina90forwardtina20MINUS1601MULTIPLY1fabs0.998i200,1,2,3-341ipenuptinatina80ADD-801MULTIPLY1fabs0.998i100ADD801MULTIPLY1i20pendowntinatina0forwardtina20MINUS1601MULTIPLY1fabs0.998i20penuptinatina00pendowntina#006600tinatina-90tina-60020penuptinatina-10-100tina-150pendowntinatina-60120tina30tina-60120tina150forwardtina100penuptinatina-15-150tina70pendowntinatina-60120tina-110tina-60120tina10forwardtina100hideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图05炫彩螺旋线_01螺旋四边形.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图05炫彩螺旋线_01螺旋四边形.mix new file mode 100644 index 00000000..7563a33c --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图05炫彩螺旋线_01螺旋四边形.mix @@ -0,0 +1 @@ +tinatina50,1,2,30501iforwardtina20MULTIPLY41irighttina90hideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图05炫彩螺旋线_02彩色螺旋线.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图05炫彩螺旋线_02彩色螺旋线.mix new file mode 100644 index 00000000..818b1b77 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图05炫彩螺旋线_02彩色螺旋线.mix @@ -0,0 +1 @@ +tinatina5colorlist'red','blue','green','yellow'0,1,2,30501itinaFF0000colorlist0QUYU1i4forwardtina20MULTIPLY41irighttina91hideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图06米思齐Logo_01米思齐Logo.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图06米思齐Logo_01米思齐Logo.mix new file mode 100644 index 00000000..d9da583c --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图06米思齐Logo_01米思齐Logo.mix @@ -0,0 +1 @@ +tina#339999tina#339999tinabegintina0,1,2,3041iforwardtina180tina-2090endtinapenuptinatina0-160pendowntina#fffffftinaFalseleftboldtinamRavie120#fffffftinapenuptinatina20-140pendowntinabegintinarighttina1200,1,2,30101iforwardtina2lefttina50,1,2,3051iforwardtina2lefttina100,1,2,30101iforwardtina10lefttina20,1,2,30101iforwardtina2lefttina40,1,2,30101iforwardtina4lefttina5lefttina100forwardtina5lefttina600,1,2,3051iforwardtina2righttina100,1,2,3051iforwardtina10righttina50,1,2,3051iforwardtina12righttina20,1,2,3051iforwardtina4righttina15lefttina90forwardtina5endtinahideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图07闪烁星星_01正五角星.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图07闪烁星星_01正五角星.mix new file mode 100644 index 00000000..91c64498 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图07闪烁星星_01正五角星.mix @@ -0,0 +1 @@ +tinatina5#ff0000tina#ffff00tinabegintina0,1,2,3051iforwardtina100righttina144endtinahideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图07闪烁星星_02正n角星.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图07闪烁星星_02正n角星.mix new file mode 100644 index 00000000..3a95ce4f --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图07闪烁星星_02正n角星.mix @@ -0,0 +1 @@ +tina#ff0000tina#ffff00tinanint\u8F93\u5165\u8BF7\u8F93\u5165\u5C16\u89D2\u4E2A\u6570\uFF08\u5947\u6570\u62164\u7684\u500D\u6570\uFF09\uFF1A200100WHILETRUEEQQUYU1n42cleartinaFalseleftnormaltinaMixly!\u65E0\u6CD5\u4E00\u7B14\u753B\u51FAMixlyHello0n\u89D2\u661FArial16nint\u8F93\u5165\u8BF7\u8F93\u5165\u5C16\u89D2\u4E2A\u6570\uFF1A200100cleartinaEQQUYU1n40angleMINUS1801DIVIDE3601nangleMINUS1801DIVIDE1801nbegintina0,1,2,305n1iforwardtina200righttina90angleendtinahideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图08猜一猜_01猜性别.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图08猜一猜_01猜性别.mix new file mode 100644 index 00000000..bbc7d9b8 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图08猜一猜_01猜性别.mix @@ -0,0 +1 @@ +age25tina#ff0000tinahideturtletinapenuptinatina-100100pendowntinay100WHILETRUEguess\u731C\u4E00\u731C\u731C\u4E00\u731C\u6211\u51E0\u5C81\uFF1F00100EQguessageFalseleftnormaltina\u4F60\u771F\u68D2\uFF0C\u731C\u5BF9\u4E86!\u9ED1\u4F5320BREAKGTguessageFalseleftnormaltina\u6211\u6BD4\u4F60\u60F3\u7684\u8981\u5C0F\u54E6\uFF01\u9ED1\u4F5310Falseleftnormaltina\u6211\u6BD4\u4F60\u60F3\u7684\u8981\u5927\u54E6\u9ED1\u4F5310penuptinayMINUS1y120tina-100100ypendowntinaWHILETRUEguess\u731C\u4E00\u731C\u731C\u4E00\u731C\u6211\u51E0\u5C81\uFF1F00100EQguessageFalseleftnormaltina\u4F60\u771F\u68D2\uFF0C\u731C\u5BF9\u4E86!\u9ED1\u4F5320BREAKFalseleftnormaltina\u5F88\u9057\u61BE\uFF0C\u731C\u9519\u4E86\uFF01\u9ED1\u4F5310 \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图08猜一猜_02猜年龄.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图08猜一猜_02猜年龄.mix new file mode 100644 index 00000000..8af3d872 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图08猜一猜_02猜年龄.mix @@ -0,0 +1 @@ +tinamygender\u5973guess\u731C\u4E00\u731C\u731C\u4E00\u731C\u6211\u662F\u7537\u751F\u8FD8\u662F\u5973\u751F\uFF1F#ff0000tinahideturtletinaEQmygenderguessFalseleftnormaltina\u4F60\u771F\u68D2\uFF0C\u731C\u5BF9\u4E86!\u9ED1\u4F5320Falseleftnormaltina\u5F88\u9057\u61BE\uFF0C\u731C\u9519\u4E86!\u9ED1\u4F5320 \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图09大树的年龄_01年轮.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图09大树的年龄_01年轮.mix new file mode 100644 index 00000000..6525960d --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图09大树的年龄_01年轮.mix @@ -0,0 +1 @@ +tinar100gap10tina5#663300tina#666600tinabegintinaWHILETRUEGTr0tina50r360rMINUS1r10gappenuptinatina90forwardtina10gaptina0pendowntinaendtinahideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图09大树的年龄_02树年龄.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图09大树的年龄_02树年龄.mix new file mode 100644 index 00000000..d76b9d6a --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图09大树的年龄_02树年龄.mix @@ -0,0 +1 @@ +tinar\u8F93\u5165\u534A\u5F84\u8BF7\u8F93\u5165\u5927\u6811\u7684\u534A\u5F841000100gap\u8F93\u5165\u95F4\u9694\u8BF7\u8F93\u5165\u5E74\u8F6E\u4E4B\u95F4\u7684\u95F4\u9694100100age0tina5#663300tina#666600tinabegintinaWHILETRUEGTr0tina50r360ageADD1age1rMINUS1r10gappenuptinatina90forwardtina10gaptina0pendowntinaendtinapenuptinatina-20-50pendowntinaFalseleftnormaltina\u5927\u6811\u5927\u6811MixlyHellostrage\u5C81\u4E86\uFF01Arial30hideturtletina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图10公共汽车_01公共汽车.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图10公共汽车_01公共汽车.mix new file mode 100644 index 00000000..1268b63a --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图10公共汽车_01公共汽车.mix @@ -0,0 +1 @@ +tinatina50,1,2,3041iEQQUYU1i20forwardtina300forwardtina150tina2090-20150340-2013050700,1,2,3041iADD1601MULTIPLY601i1304050-2020340-151033040-20-30200-20-30hideturtletinamoveandgopenuptinatina-20x50ypendowntinatina0forwardtina20distancemoveandcircle#fffffftinapenuptinatina20x20ypendowntinabegintinatina90tina40radius360endtinamoveandrectanglepenuptinatina20x20ypendowntinatina00,1,2,3041iEQQUYU1i20forwardtina300widthforwardtina150lengthrighttina90 \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图11美丽星空_01星空.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图11美丽星空_01星空.mix new file mode 100644 index 00000000..f5c5fbf0 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图11美丽星空_01星空.mix @@ -0,0 +1 @@ +movetopenuptinatina20x20ypendowntinatina0drawhousexy#000000tina#000000tinabegintinaforwardtina80lefttina90forwardtina40MULTIPLY201layerlefttina30forwardtina80lefttina120forwardtina80lefttina30forwardtina40MULTIPLY201layerlefttina90forwardtina80endtina0,1,2,305layer1i0,1,2,3041jADD1ADD1x51MULTIPLY1j20ADD1ADD1y51MULTIPLY1i20tina#001020#ffff00tina#ffff00tina-200200begintinatina-135tina60180tina175tina-9580endtina0,1,2,3061ixint-100300yint100280xyint10200-25010150-2505hideturtletinadrawstar#ffff00tina#ffff00tinabegintina0,1,2,3051iforwardtina20lenrighttina144endtinadrawwindowxy#fffffftina#fffffftinabegintina0,1,2,3041iforwardtina10lefttina90endtina \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图12斐波那契数列_01输出斐波那契额数列.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图12斐波那契数列_01输出斐波那契额数列.mix new file mode 100644 index 00000000..ea47257f --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图12斐波那契数列_01输出斐波那契额数列.mix @@ -0,0 +1 @@ +tina0,1,2,31111imiNEQi10FalseleftnormaltinaMixly!Hello0m\uFF0CArial18FalseleftnormaltinaMixly!0mArial18penuptinaforwardtina30pendowntinahideturtletinaFibonacciLTEn2fib1fibADD1MINUS1n11MINUS1n2fib \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图12斐波那契数列_02斐波那契额螺旋线.mix b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图12斐波那契数列_02斐波那契额螺旋线.mix new file mode 100644 index 00000000..835b668b --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/mix/海龟画图12斐波那契数列_02斐波那契额螺旋线.mix @@ -0,0 +1 @@ +FibonacciLTEn2fib1fibADD1MINUS1n11MINUS1n2fibtina0,1,2,31141imitina50m90hideturtletina0,1,2,3110m1iforwardtina4lefttina90DIVIDE901m \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图01小房子_01小房子.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图01小房子_01小房子.py new file mode 100644 index 00000000..7aa56147 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图01小房子_01小房子.py @@ -0,0 +1,17 @@ +import turtle + +tina= turtle.Turtle() +tina.forward(200) +tina.left(150) +tina.forward(115) +tina.left(60) +tina.forward(115) +tina.left(150) +tina.forward(40) +tina.right(90) +tina.forward(120) +tina.left(90) +tina.forward(120) +tina.left(90) +tina.forward(120) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图02小汽车_01正五边形.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图02小汽车_01正五边形.py new file mode 100644 index 00000000..ac68a8dd --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图02小汽车_01正五边形.py @@ -0,0 +1,8 @@ +import turtle + +tina= turtle.Turtle() +angle = 72 +for i in range(0, 5, 1): + tina.forward(120) + tina.right(angle) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图02小汽车_02小汽车.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图02小汽车_02小汽车.py new file mode 100644 index 00000000..5f6cd0df --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图02小汽车_02小汽车.py @@ -0,0 +1,37 @@ +import turtle + +tina= turtle.Turtle() +tina.pensize(5) +tina.setheading(120) +tina.circle ((-90),180) +tina.left(60) +tina.circle ((-50),150) +tina.setheading(180) +tina.forward(20) +tina.setheading(90) +tina.circle (20,360) +tina.penup() +tina.setheading(180) +tina.forward(15) +tina.pendown() +tina.setheading(90) +tina.circle (5,360) +tina.penup() +tina.setheading(180) +tina.forward(25) +tina.pendown() +tina.forward(50) +tina.setheading(90) +tina.circle (20,360) +tina.penup() +tina.setheading(180) +tina.forward(15) +tina.pendown() +tina.setheading(90) +tina.circle (5,360) +tina.penup() +tina.setheading(180) +tina.forward(25) +tina.pendown() +tina.forward(30) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图03小橙子_01完整橙子.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图03小橙子_01完整橙子.py new file mode 100644 index 00000000..3610db58 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图03小橙子_01完整橙子.py @@ -0,0 +1,19 @@ +import turtle + +tina= turtle.Turtle() +tina.pensize(5) +tina.fillcolor("#ff6600") +tina.begin_fill() +tina.right(180) +tina.circle (100,320) +tina.right(30) +tina.circle (45,100) +tina.end_fill() +tina.penup() +tina.goto(35,8) +tina.pendown() +tina.fillcolor("#330000") +tina.begin_fill() +tina.circle (5,360) +tina.end_fill() +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图03小橙子_02切开的橙子.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图03小橙子_02切开的橙子.py new file mode 100644 index 00000000..cf927290 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图03小橙子_02切开的橙子.py @@ -0,0 +1,21 @@ +import turtle + +tina= turtle.Turtle() +tina.pensize(10) +tina.pencolor("#ff6600") +tina.circle (100,360) +tina.penup() +tina.goto(0,100) +tina.pendown() +tina.setheading(90) +tina.pencolor("#ffffff") +tina.fillcolor("#ff9900") +for i in range(0, 8, 1): + tina.begin_fill() + tina.backward(90) + tina.right(90) + tina.circle (90,45) + tina.left(90) + tina.forward(90) + tina.end_fill() +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图04盛开的向日葵_01太阳公公.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图04盛开的向日葵_01太阳公公.py new file mode 100644 index 00000000..c9d35819 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图04盛开的向日葵_01太阳公公.py @@ -0,0 +1,34 @@ +import turtle + +tina= turtle.Turtle() +tina.pencolor("#ffcc33") +tina.fillcolor("#ffcc33") +tina.pensize(5) +tina.begin_fill() +tina.circle (80,360) +tina.end_fill() +tina.penup() +tina.goto(-40,100) +tina.pendown() +tina.pencolor("#000000") +tina.setheading(30) +tina.circle ((-30),60) +tina.penup() +tina.goto(20,100) +tina.pendown() +tina.setheading(30) +tina.circle ((-30),60) +tina.penup() +tina.goto(-20,60) +tina.pendown() +tina.setheading(-30) +tina.circle (50,60) +tina.penup() +tina.goto(-30,-30) +tina.pendown() +tina.pencolor("#ffcc33") +tina.setheading(60) +for i in range(0, 12, 1): + tina.circle ((-35),120) + tina.left(150) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图04盛开的向日葵_02向日葵.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图04盛开的向日葵_02向日葵.py new file mode 100644 index 00000000..69aa54e0 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图04盛开的向日葵_02向日葵.py @@ -0,0 +1,61 @@ +import turtle +import math + +tina= turtle.Turtle() +tina.pencolor("#000000") +tina.pensize(5) +tina.penup() +tina.goto(-5,-5) +tina.pendown() +tina.fillcolor("#ffcc00") +tina.begin_fill() +tina.setheading(-50) +for i in range(0, 6, 1): + tina.circle (45,150) + tina.right(90) +tina.end_fill() +tina.penup() +tina.goto(0,0) +tina.setheading(0) +tina.pendown() +tina.fillcolor("#ff6600") +tina.begin_fill() +tina.circle (80,360) +tina.end_fill() +for i in range(-3, 4, 1): + tina.penup() + tina.goto(i * 20,math.fabs(i) * 10) + tina.pendown() + tina.setheading(90) + tina.forward((160 - math.fabs(i) * 20)) +for i in range(-3, 4, 1): + tina.penup() + tina.goto(-80 + math.fabs(i) * 10,80 + i * 20) + tina.pendown() + tina.setheading(0) + tina.forward((160 - math.fabs(i) * 20)) +tina.penup() +tina.goto(0,0) +tina.pendown() +tina.pencolor("#006600") +tina.setheading(-90) +tina.circle ((-600),20) +tina.penup() +tina.goto(-10,-100) +tina.setheading(-150) +tina.pendown() +tina.circle ((-60),120) +tina.setheading(30) +tina.circle ((-60),120) +tina.setheading(150) +tina.forward(100) +tina.penup() +tina.goto(-15,-150) +tina.setheading(70) +tina.pendown() +tina.circle ((-60),120) +tina.setheading(-110) +tina.circle ((-60),120) +tina.setheading(10) +tina.forward(100) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图05炫彩螺旋线_01螺旋四边形.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图05炫彩螺旋线_01螺旋四边形.py new file mode 100644 index 00000000..1854429e --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图05炫彩螺旋线_01螺旋四边形.py @@ -0,0 +1,8 @@ +import turtle + +tina= turtle.Turtle() +tina.pensize(5) +for i in range(0, 50, 1): + tina.forward((4 * i)) + tina.right(90) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图05炫彩螺旋线_02彩色螺旋线.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图05炫彩螺旋线_02彩色螺旋线.py new file mode 100644 index 00000000..b9351c0d --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图05炫彩螺旋线_02彩色螺旋线.py @@ -0,0 +1,10 @@ +import turtle + +tina= turtle.Turtle() +tina.pensize(5) +colorlist = ['red','blue','green','yellow'] +for i in range(0, 50, 1): + tina.pencolor(colorlist[i % 4]) + tina.forward((4 * i)) + tina.right(91) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图06米思齐Logo_01米思齐Logo.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图06米思齐Logo_01米思齐Logo.py new file mode 100644 index 00000000..2b89a97b --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图06米思齐Logo_01米思齐Logo.py @@ -0,0 +1,55 @@ +import turtle + +tina= turtle.Turtle() +tina.pencolor("#339999") +tina.fillcolor("#339999") +tina.begin_fill() +for i in range(0, 4, 1): + tina.forward(180) + tina.circle ((-20),90) +tina.end_fill() +tina.penup() +tina.goto(0,-160) +tina.pendown() +tina.pencolor("#ffffff") +tina.write("m",False,align="left",font=("Ravie",120,"bold")) +tina.fillcolor("#ffffff") +tina.penup() +tina.goto(20,-140) +tina.pendown() +tina.begin_fill() +tina.right(120) +for i in range(0, 10, 1): + tina.forward(2) + tina.left(5) +for i in range(0, 5, 1): + tina.forward(2) + tina.left(10) +for i in range(0, 10, 1): + tina.forward(10) + tina.left(2) +for i in range(0, 10, 1): + tina.forward(2) + tina.left(4) +for i in range(0, 10, 1): + tina.forward(4) + tina.left(5) +tina.left(100) +tina.forward(5) +tina.left(60) +for i in range(0, 5, 1): + tina.forward(2) + tina.right(10) +for i in range(0, 5, 1): + tina.forward(10) + tina.right(5) +for i in range(0, 5, 1): + tina.forward(12) + tina.right(2) +for i in range(0, 5, 1): + tina.forward(4) + tina.right(15) +tina.left(90) +tina.forward(5) +tina.end_fill() +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图07闪烁星星_01正五角星.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图07闪烁星星_01正五角星.py new file mode 100644 index 00000000..13d1d6b6 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图07闪烁星星_01正五角星.py @@ -0,0 +1,12 @@ +import turtle + +tina= turtle.Turtle() +tina.pensize(5) +tina.pencolor("#ff0000") +tina.fillcolor("#ffff00") +tina.begin_fill() +for i in range(0, 5, 1): + tina.forward(100) + tina.right(144) +tina.end_fill() +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图07闪烁星星_02正n角星.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图07闪烁星星_02正n角星.py new file mode 100644 index 00000000..44cd3a22 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图07闪烁星星_02正n角星.py @@ -0,0 +1,21 @@ +import turtle + +tina= turtle.Turtle() +tina.pencolor("#ff0000") +tina.fillcolor("#ffff00") +n = int(turtle.numinput("输入","请输入尖角个数(奇数或4的倍数):",20,minval = 0,maxval = 100)) +while n % 4 == 2: + tina.clear() + tina.write("无法一笔画出" + str(n) + "角星",False,align="left",font=("Arial",16,"normal")) + n = int(turtle.numinput("输入","请输入尖角个数:",20,minval = 0,maxval = 100)) +tina.clear() +if n % 4 == 0: + angle = 180 - 360 / n +else: + angle = 180 - 180 / n +tina.begin_fill() +for i in range(0, n, 1): + tina.forward(200) + tina.right(angle) +tina.end_fill() +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图08猜一猜_01猜性别.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图08猜一猜_01猜性别.py new file mode 100644 index 00000000..e4349f65 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图08猜一猜_01猜性别.py @@ -0,0 +1,11 @@ +import turtle + +tina= turtle.Turtle() +mygender = "女" +guess = turtle.textinput("猜一猜","猜一猜我是男生还是女生?") +tina.pencolor("#ff0000") +tina.hideturtle() +if mygender == guess: + tina.write("你真棒,猜对了!",False,align="left",font=("黑体",20,"normal")) +else: + tina.write("很遗憾,猜错了!",False,align="left",font=("黑体",20,"normal")) diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图08猜一猜_02猜年龄.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图08猜一猜_02猜年龄.py new file mode 100644 index 00000000..17666ead --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图08猜一猜_02猜年龄.py @@ -0,0 +1,24 @@ +import turtle + +age = 25 +tina= turtle.Turtle() +tina.pencolor("#ff0000") +tina.hideturtle() +tina.penup() +tina.goto(-100,100) +tina.pendown() +y = 100 +while True: + guess = turtle.numinput("猜一猜","猜一猜我几岁?",0,minval = 0,maxval = 100) + if guess == age: + tina.write("你真棒,猜对了!",False,align="left",font=("黑体",20,"normal")) + break + elif guess > age: + tina.write("我比你想的要小哦!",False,align="left",font=("黑体",10,"normal")) + else: + tina.write("我比你想的要大哦",False,align="left",font=("黑体",10,"normal")) + tina.penup() + y = y - 20 + tina.goto(-100,y) + tina.pendown() +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图09大树的年龄_01年轮.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图09大树的年龄_01年轮.py new file mode 100644 index 00000000..53742319 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图09大树的年龄_01年轮.py @@ -0,0 +1,19 @@ +import turtle + +tina= turtle.Turtle() +r = 100 +gap = 10 +tina.pensize(5) +tina.pencolor("#663300") +tina.fillcolor("#666600") +tina.begin_fill() +while r > 0: + tina.circle (r,360) + r = r - gap + tina.penup() + tina.setheading(90) + tina.forward(gap) + tina.setheading(0) + tina.pendown() +tina.end_fill() +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图09大树的年龄_02树年龄.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图09大树的年龄_02树年龄.py new file mode 100644 index 00000000..9a795a1f --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图09大树的年龄_02树年龄.py @@ -0,0 +1,25 @@ +import turtle + +tina= turtle.Turtle() +r = turtle.numinput("输入半径","请输入大树的半径",100,minval = 0,maxval = 100) +gap = turtle.numinput("输入间隔","请输入年轮之间的间隔",10,minval = 0,maxval = 100) +age = 0 +tina.pensize(5) +tina.pencolor("#663300") +tina.fillcolor("#666600") +tina.begin_fill() +while r > 0: + tina.circle (r,360) + age = age + 1 + r = r - gap + tina.penup() + tina.setheading(90) + tina.forward(gap) + tina.setheading(0) + tina.pendown() +tina.end_fill() +tina.penup() +tina.goto(-20,-50) +tina.pendown() +tina.write("大树" + str(age) + "岁了!",False,align="left",font=("Arial",30,"normal")) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图10公共汽车_01公共汽车.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图10公共汽车_01公共汽车.py new file mode 100644 index 00000000..c705c4d9 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图10公共汽车_01公共汽车.py @@ -0,0 +1,52 @@ +import turtle + +def moveandgo(x, y, distance): + tina.penup() + tina.goto(x,y) + tina.pendown() + tina.setheading(0) + tina.forward(distance) + + +def moveandcircle(x, y, radius): + tina.fillcolor("#ffffff") + tina.penup() + tina.goto(x,y) + tina.pendown() + tina.begin_fill() + tina.setheading(90) + tina.circle (radius,360) + tina.end_fill() + + +def moveandrectangle(x, y, width, length): + tina.penup() + tina.goto(x,y) + tina.pendown() + tina.setheading(0) + for i in range(0, 4, 1): + if i % 2 == 0: + tina.forward(width) + else: + tina.forward(length) + tina.right(90) + + + +tina= turtle.Turtle() +tina.pensize(5) +for i in range(0, 4, 1): + if i % 2 == 0: + tina.forward(300) + else: + tina.forward(150) + tina.circle (20,90) +moveandgo(-20, 150, 340) +moveandrectangle(-20, 130, 50, 70) +for i in range(0, 4, 1): + moveandrectangle(60 + 60 * i, 130, 40, 50) +moveandgo(-20, 20, 340) +moveandgo(-15, 10, 330) +moveandcircle(40, -20, -30) +moveandcircle(200, -20, -30) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图11美丽星空_01星空.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图11美丽星空_01星空.py new file mode 100644 index 00000000..e3b68e1b --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图11美丽星空_01星空.py @@ -0,0 +1,75 @@ +import turtle + +import random + + +def moveto(x, y): + tina.penup() + tina.goto(x,y) + tina.pendown() + tina.setheading(0) + + +def drawhouse(x, y, layer): + moveto(x, y) + tina.pencolor("#000000") + tina.fillcolor("#000000") + tina.begin_fill() + tina.forward(80) + tina.left(90) + tina.forward((20 * layer)) + tina.left(30) + tina.forward(80) + tina.left(120) + tina.forward(80) + tina.left(30) + tina.forward((20 * layer)) + tina.left(90) + tina.forward(80) + tina.end_fill() + for i in range(0, layer, 1): + for j in range(0, 4, 1): + drawwindow((x + 5) + j * 20, (y + 5) + i * 20) + + +def drawstar(len): + tina.pencolor("#ffff00") + tina.fillcolor("#ffff00") + tina.begin_fill() + for i in range(0, 5, 1): + tina.forward(len) + tina.right(144) + tina.end_fill() + + +def drawwindow(x, y): + moveto(x, y) + tina.pencolor("#ffffff") + tina.fillcolor("#ffffff") + tina.begin_fill() + for i in range(0, 4, 1): + tina.forward(10) + tina.left(90) + tina.end_fill() + + + +tina= turtle.Turtle() +turtle.bgcolor("#001020") +tina.pencolor("#ffff00") +tina.fillcolor("#ffff00") +moveto(-200, 200) +tina.begin_fill() +tina.setheading(-135) +tina.circle (60,180) +tina.setheading(175) +tina.circle ((-95),80) +tina.end_fill() +for i in range(0, 6, 1): + x = random.randint(-100, 300) + y = random.randint(100, 280) + moveto(x, y) + drawstar(random.randint(10, 20)) +drawhouse(0, -250, 10) +drawhouse(150, -250, 5) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图12斐波那契数列_01输出斐波那契额数列.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图12斐波那契数列_01输出斐波那契额数列.py new file mode 100644 index 00000000..bc9fb3eb --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图12斐波那契数列_01输出斐波那契额数列.py @@ -0,0 +1,22 @@ +import turtle + +def Fibonacci(n): + if n <= 2: + fib = 1 + else: + fib = Fibonacci(n - 1) + Fibonacci(n - 2) + return fib + + + +tina= turtle.Turtle() +for i in range(1, 11, 1): + m = Fibonacci(i) + if i != 10: + tina.write(str(m) + ",",False,align="left",font=("Arial",18,"normal")) + else: + tina.write(str(m),False,align="left",font=("Arial",18,"normal")) + tina.penup() + tina.forward(30) + tina.pendown() +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图12斐波那契数列_02斐波那契额螺旋线.py b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图12斐波那契数列_02斐波那契额螺旋线.py new file mode 100644 index 00000000..b682e7fc --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/origin/examples/海龟画图/py/海龟画图12斐波那契数列_02斐波那契额螺旋线.py @@ -0,0 +1,16 @@ +import turtle + +def Fibonacci(n): + if n <= 2: + fib = 1 + else: + fib = Fibonacci(n - 1) + Fibonacci(n - 2) + return fib + + + +tina= turtle.Turtle() +for i in range(1, 14, 1): + m = Fibonacci(i) + tina.circle (m,90) +tina.hideturtle() diff --git a/mixly/boards/default_src/python_mixpy/origin/media/py.png b/mixly/boards/default_src/python_mixpy/origin/media/py.png new file mode 100644 index 00000000..e77e8fcc Binary files /dev/null and b/mixly/boards/default_src/python_mixpy/origin/media/py.png differ diff --git a/mixly/boards/default_src/python_mixpy/package.json b/mixly/boards/default_src/python_mixpy/package.json new file mode 100644 index 00000000..ccc14d84 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/package.json @@ -0,0 +1,33 @@ +{ + "name": "@mixly/python-mixpy", + "version": "1.4.0", + "description": "适用于mixly的python mixpy模块", + "scripts": { + "serve": "webpack-dev-server --config=webpack.dev.js", + "build:dev": "webpack --config=webpack.dev.js", + "build:prod": "npm run build:examples & webpack --config=webpack.prod.js", + "build:examples": "node ../../../scripts/build-examples.js -t special", + "build:examples:ob": "node ../../../scripts/build-examples.js -t special --obfuscate", + "publish:board": "npm publish --registry https://registry.npmjs.org/" + }, + "main": "./export.js", + "author": "Mixly Team", + "keywords": [ + "mixly", + "mixly-plugin", + "python-mixpy" + ], + "homepage": "https://gitee.com/bnu_mixly/mixly3/tree/master/boards/default_src/python_mixpy", + "bugs": { + "url": "https://gitee.com/bnu_mixly/mixly3/issues" + }, + "repository": { + "type": "git", + "url": "https://gitee.com/bnu_mixly/mixly3.git", + "directory": "default_src/python_mixpy" + }, + "publishConfig": { + "access": "public" + }, + "license": "Apache 2.0" +} diff --git a/mixly/boards/default_src/python_mixpy/template.xml b/mixly/boards/default_src/python_mixpy/template.xml new file mode 100644 index 00000000..46c1d15e --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/template.xml @@ -0,0 +1,3819 @@ +<%= htmlWebpackPlugin.tags.headTags.join('\n') %> + + + + + + prompt + + + + + + + Hello + + + + + + + Hello + + + + + + + Hello + + + + + , + + + + + + + + Hello + + + + + Mixly + + + + + + + + + + 2 + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + + 0,1,2,3 + + + + + 0 + + + + + 5 + + + + + 1 + + + + + + + i + + + + + + + + + DIVIDE + + + 1 + + + + + 0 + + + + + + + + + Exception as e + + + + + + + e + + + + + + + + + testThread + + + + + + + + + + testThread + + + WHILE + + + TRUE + + + + + + + Hello Mixly from Thread! + + + + + + + 10 + + + + + + + + + + + + + + 18029 + + + + + + + + + + + + + + + + + 90 + + + + + + + x + + + + + + + 15 + + + + + + + 1 + + + + + 1 + + + + + + + 0 + + + + + 0 + + + + + + + a + + + + + 1 + + + + + + + 0.998 + + + + + + + 1 + + + + + 2 + + + + + + + 4.8 + + + + + 2 + + + + + + + 1 + + + + + 100 + + + + + + + 1010 + + + + + + 1000 + + + + + 1 + + + + + 100 + + + + + + + 50 + + + + + 1 + + + + + 100 + + + + + 1 + + + + + 1000 + + + + + + + 2 + + + + + + + 1 + + + + + + + 1 + + + + + + + + + + 0 + + + + + x + + + + + 2 + + + + + + + + + + + + x + + + + + 0,1,2,3 + + + + + + + 0,1,2,3 + + + + + 0,1,2,3 + + + + + + + x + + + + + + + Mixly + + + + + Mixly + + + + + Hello + + + + + Mixly + + + + + + + + 65 + + + + + + + a + + + + + + + x + + + + + + + Mixly + + + + + + + + + + + + + + + + + + + Mixly + + + + + 0 + + + + + + + Mixly + + + + + 0 + + + + + 2 + + + + + + + Mixly + + + + + + + Mixly + + + + + + + Hello,mixly + + + + + + + Hello,mixly + + + + + 50 + + + + + * + + + + + + + Hello,mixly + + + + + l + + + + + + + -- + + + + + mylist + + + + + + + Hello,mixly + + + + + mixly + + + + + mixpy + + + + + + + I love mixly! + + + + + + + + + + + + I love mixly + + + + + + + + Random No. is {} + + + + + int + + + 1 + + + + + 100 + + + + + + + + + input('1+2*3') + + + + + + + dir + + + + + + + + + mylist + + + 1,2,3,4,5 + + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 2 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 1 + + + + + 0 + + + + + 1 + + + + + + + mylist + + + + + + + mylist + + + + + 2 + + + + + + + mylist + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + + + mylist + + + + + + + mylist + + + + + + + + x + + + + + + + mylist + + + + + 0 + + + + + + + + mytup + + + 1,2,3,4,5 + + + + + + + + mytup + + + + + 0 + + + + + + + mytup + + + + + 0 + + + + + 2 + + + + + + + mytup + + + + + + + mytup + + + + + + + mytup + + + + + + + mytup + + + + + 0 + + + + + + + mytup + + + + + + + mytup1 + + + + + mytup2 + + + + + + + + x + + + + + + + + + + mydict + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + + + + mydict + + + + + + + mydict + + + + + + + mydict + + + + + + + x + + + + + + + mydict + + + + + + + {"name":"Mixly","color":"green"} + + + + + + + mydict + + + + + results + + + + + 0 + + + + + location + + + + + name + + + + + + + + s1 + + + 1,2,3,4,5 + + + + + + + s1 + + + + + + + s1 + + + + + + + s1 + + + + + s2 + + + + + + + s1 + + + + + s2 + + + + + + + s1 + + + + + 0 + + + + + + + s1 + + + + + Mixly + + + + + + + s1 + + + + + s2 + + + + + + + x + + + + + + + + + + + + + + readme.txt + + + + + f + + + + + filename.txt + + + + + f + + + + + + + + f + + + + + filename.txt + + + + + f + + + + + + + + + + Mixly + + + + + f + + + + + + + f + + + + + + + f + + + + + 0 + + + + + + + f + + + + + + + f + + + + + + + f + + + + + + + + + path + + + + + + + path + + + + + + + filename.txt + + + + + + + srcname.txt + + + + + dstname.txt + + + + + + + filename.txt + + + + + + + path + + + + + + + f + + + + + + + f + + + + + 0 + + + + + + + reponse + + + + + https://mixio.mixly.cn + + + + + + + reponse + + + + + https://mixio.mixly.cn + + + + + + + + + + + + + + + reponse + + + + + + + + + + + mixio.mixly.cn + + + + + + + + + + + + mixio.mixly.cn + + + + + A1B2C3 + + + + + + + mixio.mixly.cn + + + + + username + + + + + password + + + + + MyProject + + + + + + + topic + + + + + msg + + + + + + + topic + + + + + msg + + + + + + + topic + + + + + method + + + + + + + topic + + + + + + + + + + method + + + + + EQ + + + msg + + + + + 1 + + + + + + + + + + + content + + "long" + "lat" + "message" + + + 0 + + + + + 1 + + + + + 2 + + + + + + + + + content + + "key1" + "key2" + "key3" + + + 0 + + + + + 1 + + + + + 2 + + + + + + + + + + + + + + + + + + + + + tina + + + + + 20 + + + + + + + tina + + + + + 90 + + + + + + + tina + + + + + 0 + + + + + + + tina + + + + + 20 + + + + + 20 + + + + + + + tina + + + + + 50 + + + + + + + tina + + + + + + + tina + + + + + + + tina + + + + + + + tina + + + + + + + tina + + + + + + + tina + + + + + + + + tina + + + + + 5 + + + + + + + tina + + + + + + + tina + + + + + 2 + + + + + 2 + + + + + 5 + + + + + + + tina + + + + + 5 + + + + + + + Mixly + + + + + + + 800 + + + + + 600 + + + + + + + 1 + + + + + 1000 + + + + + + + + #ff0000 + + + #FF0000 + + + + + + + tina + + + + + #ff0000 + + + #FF0000 + + + + + + + tina + + + + + #ff0000 + + + #FF0000 + + + + + + + tina + + + + + #ff0000 + + + #FF0000 + + + + + #ff0000 + + + #FF0000 + + + + + + + tina + + + + + + + #FF0000 + + + + + + + tina + + + + + #FF0000 + + + + + + + tina + + + + + #FF0000 + + + + + + + tina + + + + + 50 + + + + + + + tina + + + + + 50 + + + + + 360 + + + + + + + tina + + + + + + + screen + + + + + + + screen + + + + + keyfunc + + + + + Up + + + + + + keyfunc + + + + + tina + + + + + 100 + + + + + + + tina + + + + + 90 + + + + + + + + + + + + screen + + + + + clickfunc + + + + + + + + + + + clickfunc + + + + + tina + + + + + x + + + 20 + + + + + y + + + 20 + + + + + + + + + + screen + + + + + timerfunc + + + + + 3000 + + + + + + timerfunc + + + + + tina + + + + + 100 + + + + + + + tina + + + + + 90 + + + + + + + + + + + + screen + + + + + + + + screen + + + + + turtle.eps + + + + + + + tina + + + + + 10 + + + + + + + tina + + + + + Mixly! + + + + + + + tina + + + + + Mixly! + + + + Arial + + + + 8 + + + + + + + NUM + + + + + Input a number: + + + + + 10 + + + + + 0 + + + + + 100 + + + + + + + Input your name + + + + + What's your name? + + + + + + + + + + + d:\\1.wav + + + + + 3 + + + + + + + d:\\1.jpg + + + + + q + + + + + + + + client + + + + + Enter Your API_KEY + + + + + Enter Your SECRET_KEY + + + + + + + client + + + + + 今天天气真好 + + + + + + + + + + + + client + + + + + + + + + + + + + client + + + + + + + + + + + + + + + + + + client + + + + + C:/mixly.jpg + + + + + C:/mixpy.jpg + + + + + + + + + + + + client + + + + + + + + + + + + + + + + + + client + + + + + + + + + 我爱米思齐 + + + + + + + + + + + + client + + + + + + + + + 米思齐 + + + + + 米思皮 + + + + + + + + + + + + client + + + + + 米思齐团队 + + + + + 米思齐团队由一群具有共同理想的学生和老师组成,他们始终致力于为开展更好的创客教育而努力。 + + + + + + + client + + + + + 米思齐团队由一群具有共同理想的学生和老师组成,他们始终致力于为开展更好的创客教育而努力。 + + + + + 20 + + + + + + + + + + + + df1 + + + + + data.csv + + + + + + + + + df + + + + + + + df + + + + + + + array + + + + None + + + + + + array + + + + None + + + + + + array + + + + + + + array + + + + + + + + array + + + + + + + df + + + + + value + + + + False + + + + + + df + + + + + + + df + + + + + 'a','b','c','d' + + + + + x + + + + + 1.5 + + + + + 5.5 + + + + + 0.5 + + + + + + + + + 1 + + + + + + + 1 + + + + + + + array1 + + + + + array2 + + + + + + + myMatrix + + + + + + + myMatrix + + + + + + + myMatrix + + + + + + + array + + + + + + + matrix1 + + + + + matrix2 + + + + + + + array1 + + + + + array2 + + + + + + + 0,1,2,3 + + + + + + + x + + + + + + + myArray + + + + + + + myArray + + + + + myDimensions + + + + + + + myArray + + + + + + + myArray + + + + + myFeatures + + + + + 0 + + + + + + + image + + + + + templates + + + + + + + myArray + + + + + 0 + + + + + + + myArray + + + + + 0 + + + + + + + myArray + + + + + + + mylist + + + + + + + mylist + + + + + 0,1,2,3 + + + + + + + + mydict + + + + + + + mydict + + + + + 'a','b','c','d' + + + + + + + mydict + + + + + 'ABCD' + + + + + 'a','b','c','d' + + + + + + + ser1 + + + + + + + ser1 + + + + + 0 + + + + + + + df1 + + + + + tag + + + + + + + df1 + + + + + tag + + + + + + + df1 + + + + + 1 + + + + + + + df1 + + + + + GT + + + column + + + df1 + + + + + tag + + + + + + + 1 + + + + + + + + + df1 + + + + + tag + + + + + min + + + df1 + + + column + + + df1 + + + + + tag + + + + + + + + + ser1 + + + + + + + ser1 + + + + + + + 1,2,3,4 + + + + + 5,6,7,8 + + + + + + + 1,2,3,4 + + + + + 5,6,7,8 + + + + + 20,20,20,20 + + + + + tag + + + + + + + 1,2,3,4 + + + + + 5,6,7,8 + + + + + tag + + + + + + + 1,2,3,4 + + + + + 5,6,7,8 + + + + + 0.5 + + + + + tag + + + + + + + 0.25,0.35,0.1,0.3 + + + + + 'a','b','c','d' + + + + + 0.2,0,0,0 + + + + + + + 11,21,31,41,51,61,71,81,91 + + + + + 0,20,40,60,80,100 + + + + + + + + + 2 + + + + + 1 + + + + + 1 + + + + + + + + + Title + + + + + + + axis + + + + + + + 1,2,3,4 + + + + + 1,2,3,4 + + + + + + + 1 + + + + + 5 + + + + + 5 + + + + + 8 + + + + + + + 1.png + + + + + + + img + + + + + 1.jpg + + + + + + + face + + + + + haarcascade_frontalface_default.xml + + + + + + + faceRects + + + + + img + + + + + face + + + + + 1.1 + + + + + 5 + + + + + + + faceRects + + + + + img + + + + + face + + + + + 1.1 + + + + + 5 + + + + + 100 + + + + + 100 + + + + + 200 + + + + + 200 + + + + + + + + + Mixly + + + + + img + + + + + + + 2.jpg + + + + + img + + + + + + + 0 + + + + + + + + img + + + + + 0 + + + + + 0 + + + + + 100 + + + + + 100 + + + + + 3 + + + + + + + img + + + + + Mixly + + + + + 0 + + + + + 200 + + + + + 4 + + + + + 3 + + + + + + + + + 100 + + + + + 20 + + + + + 2 + + + + + 2 + + + + + 0 + + + + + 2 + + + + + 2 + + + + + + + + + + 100 + + + + + 100 + + + + + 10 + + + + + 1 + + + + + 0.0 + + + + + 0.0 + + + + + + + + + + 100 + + + + + 2 + + + + + + + + 1.0 + + + + + -10.0,10.0 + + + + + TRUE + + + + + + + + + + + + iris + + + + + + + iris_x + + + + + iris_y + + + + + 0.3 + + + + + + + + + + model + + + + + TRUE + + + + + FALSE + + + + + + + + + + model + + + + + 1.0 + + + + + TRUE + + + + + FALSE + + + + + 300 + + + + + + + + + + model + + + + + + + + + + + + + model + + + + + 100 + + + + + + + + + + + + + + + + pca + + + + + 2 + + + + + + + pca + + + + + x + + + + + + + model + + + + + 5 + + + + + + + + + + model + + + + + + + model + + + + + 8 + + + + + 300 + + + + + + + + + + + + + model + + + + + x + + + + + + + model + + + + + x_train + + + + + y_train + + + + + + + model + + + + + x_test + + + + + y_test + + + + + + + model + + + + + x_test + + + + + + + model + + + + + + + model + + + + + + + model + + + + + D:/mixly/test.pkl + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/webpack.common.js b/mixly/boards/default_src/python_mixpy/webpack.common.js new file mode 100644 index 00000000..c1bb8a8c --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/webpack.common.js @@ -0,0 +1,11 @@ +const path = require("path"); +const common = require("../../../webpack.common"); +const { merge } = require("webpack-merge"); + +module.exports = merge(common, { + resolve: { + alias: { + '@mixly/python': path.resolve(__dirname, '../python') + } + } +}); \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/webpack.dev.js b/mixly/boards/default_src/python_mixpy/webpack.dev.js new file mode 100644 index 00000000..d84bda69 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/webpack.dev.js @@ -0,0 +1,36 @@ +const path = require("path"); +const common = require("./webpack.common"); +const { merge } = require("webpack-merge"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const ESLintPlugin = require('eslint-webpack-plugin'); + +module.exports = merge(common, { + mode: "development", + devtool: 'source-map', + plugins: [ + new ESLintPlugin({ + context: process.cwd(), + }), + new HtmlWebpackPlugin({ + inject: false, + template: path.resolve(process.cwd(), 'template.xml'), + filename: 'index.xml', + minify: false + }) + ], + devServer: { + https: true, + port: 8080, + host: '0.0.0.0', + hot: false, + static: { + directory: path.join(process.cwd(), '../../../'), + watch: false + }, + devMiddleware: { + index: false, + publicPath: `/boards/default/${path.basename(process.cwd())}`, + writeToDisk: true + } + } +}); \ No newline at end of file diff --git a/mixly/boards/default_src/python_mixpy/webpack.prod.js b/mixly/boards/default_src/python_mixpy/webpack.prod.js new file mode 100644 index 00000000..0e9f3265 --- /dev/null +++ b/mixly/boards/default_src/python_mixpy/webpack.prod.js @@ -0,0 +1,27 @@ +const path = require("path"); +const common = require("./webpack.common"); +const { merge } = require("webpack-merge"); +const TerserPlugin = require("terser-webpack-plugin"); +var HtmlWebpackPlugin = require("html-webpack-plugin"); + +module.exports = merge(common, { + mode: "production", + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + extractComments: false, + }), + new HtmlWebpackPlugin({ + inject: false, + template: path.resolve(process.cwd(), 'template.xml'), + filename: 'index.xml', + minify: { + removeAttributeQuotes: true, + collapseWhitespace: true, + removeComments: true, + } + }) + ] + } +}); \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/.npmignore b/mixly/boards/default_src/python_pyodide/.npmignore new file mode 100644 index 00000000..21ab2a3e --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/.npmignore @@ -0,0 +1,3 @@ +node_modules +build +origin \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sklearn.js b/mixly/boards/default_src/python_pyodide/blocks/sklearn.js new file mode 100644 index 00000000..4a706272 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sklearn.js @@ -0,0 +1,36 @@ +/** + * @typedef {import('@mixly/python-mixpy').PythonMixpySKLearnBlocks} PythonMixpySKLearnBlocks + */ +import * as Blockly from 'blockly/core'; + +const SKLEARN_HUE = 80; + + +/** + * @override Override {@link PythonMixpySKLearnBlocks.sklearn_LinearRegression} + */ +//sklearn 初始化线性回归 +export const sklearn_LinearRegression = { + init: function () { + this.appendDummyInput() + .appendField('sklearn ' + Blockly.Msg.SKLEARN_LINEARREGRESSION_INIT); + this.appendValueInput('model_name') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput('fit_intercept') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_CALCULATE_MODEL_INTERRUPT); + this.appendValueInput('n_jobs') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_THREADS); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/effect/add.js b/mixly/boards/default_src/python_pyodide/blocks/sound/effect/add.js new file mode 100644 index 00000000..1355045a --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/effect/add.js @@ -0,0 +1,17 @@ +import * as Blockly from 'blockly/core'; + +export const sound_effect_add = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SOUND_SET_TO) + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_SOUND_EFFECT_PITCH, "pitch"], [Blockly.Msg.MIXLY_SOUND_EFFECT_PAN, "pan"]]), "EFFECT") + .appendField(Blockly.Msg.MIXLY_SOUND_EFFECT_ADD_BY); + this.appendValueInput("VALUE") + .setCheck(null) + this.appendDummyInput(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_EFFECT_ADD_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/effect/sound_effect_clear.js b/mixly/boards/default_src/python_pyodide/blocks/sound/effect/sound_effect_clear.js new file mode 100644 index 00000000..00472678 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/effect/sound_effect_clear.js @@ -0,0 +1,12 @@ +import * as Blockly from 'blockly/core'; + +export const sound_effect_clear = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_catSoundSOUND_CLEAR_EFFECTS); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_EFFECT_CLEAR_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/effect/sound_effect_set.js b/mixly/boards/default_src/python_pyodide/blocks/sound/effect/sound_effect_set.js new file mode 100644 index 00000000..d49a74b3 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/effect/sound_effect_set.js @@ -0,0 +1,17 @@ +import * as Blockly from 'blockly/core'; + +export const sound_effect_set = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SOUND_SET_TO) + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_SOUND_EFFECT_PITCH, "pitch"], [Blockly.Msg.MIXLY_SOUND_EFFECT_PAN, "pan"]]), "EFFECT") + .appendField(Blockly.Msg.MIXLY_SOUND_EFFECT_SET_TO); + this.appendValueInput("VALUE") + .setCheck(null) + this.appendDummyInput(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_EFFECT_SET_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/play/play.js b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play.js new file mode 100644 index 00000000..7f51de7a --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play.js @@ -0,0 +1,26 @@ +import * as Blockly from 'blockly/core'; + +export const sound_play = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SOUND_PLAY) + .appendField(new Blockly.FieldDropdown(this.getSoundOptions), "SOUND"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_TOOLTIP); + }, + + getSoundOptions: function() { + const options = [["Meow", "Meow"], [Blockly.Msg.MIXLY_SOUND_RECORD_OPTION, "record"]]; + + if (window.sound && window.sound.builtin) { + const recordings = Object.keys(window.sound.builtin).filter(k => k.startsWith('recording')); + recordings.forEach(recording => { + options.push([recording, recording]); + }); + } + + return options; + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_frequency.js b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_frequency.js new file mode 100644 index 00000000..92610f62 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_frequency.js @@ -0,0 +1,21 @@ +import * as Blockly from 'blockly/core'; + +export const sound_play_frequency = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SOUND_PLAY) + .appendField(Blockly.Msg.MIXLY_SOUND_FREQUENCY); + this.appendValueInput("FREQUENCY") + .setCheck(Number) + .setAlign(Blockly.ALIGN_RIGHT); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SOUND_DURATION); + this.appendValueInput("DURATION") + .setCheck(Number) + .setAlign(Blockly.ALIGN_RIGHT); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_FREQUENCY_TOOLTIP); + } +}; diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_frequency_no_duration.js b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_frequency_no_duration.js new file mode 100644 index 00000000..49ddfc42 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_frequency_no_duration.js @@ -0,0 +1,13 @@ +import * as Blockly from 'blockly/core'; + +export const sound_play_frequency_no_duration = { + init: function() { + this.setColour('#acc159'); + this.appendValueInput("FREQUENCY") + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_FREQUENCY_NO_DURATION_TOOLTIP); + } +}; diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_note_list.js b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_note_list.js new file mode 100644 index 00000000..60c14062 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_note_list.js @@ -0,0 +1,21 @@ +import * as Blockly from 'blockly/core'; + +export const sound_play_note_list = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SOUND_PLAY_NOTE_LIST) + .appendField(new Blockly.FieldDropdown([ + ["DADADADUM", "DADADADUM"], + ["BIRTHDAY", "BIRTHDAY"], + ["BA_DING", "BA_DING"], + ["JUMP_UP", "JUMP_UP"], + ["JUMP_DOWN", "JUMP_DOWN"], + ["POWER_UP", "POWER_UP"], + ["POWER_DOWN", "POWER_DOWN"] + ]), "NOTE_LIST"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_NOTE_LIST_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_wait.js b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_wait.js new file mode 100644 index 00000000..fd6ac720 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/play/play_wait.js @@ -0,0 +1,27 @@ +import * as Blockly from 'blockly/core'; + +export const sound_play_wait = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SOUND_PLAY) + .appendField(new Blockly.FieldDropdown(this.getSoundOptions), "SOUND") + .appendField(Blockly.Msg.MIXLY_SOUND_WAIT_FINISH); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_PLAY_WAIT_TOOLTIP); + }, + + getSoundOptions: function() { + const options = [["Meow", "Meow"], [Blockly.Msg.MIXLY_SOUND_RECORD_OPTION, "record"]]; + + if (window.sound && window.sound.builtin) { + const recordings = Object.keys(window.sound.builtin).filter(k => k.startsWith('recording')); + recordings.forEach(recording => { + options.push([recording, recording]); + }); + } + + return options; + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/play/record.js b/mixly/boards/default_src/python_pyodide/blocks/sound/play/record.js new file mode 100644 index 00000000..162fc681 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/play/record.js @@ -0,0 +1,12 @@ +import * as Blockly from 'blockly/core'; + +export const sound_record = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SOUND_RECORD); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_RECORD_TOOLTIP); + } +}; diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/play/sound_note.js b/mixly/boards/default_src/python_pyodide/blocks/sound/play/sound_note.js new file mode 100644 index 00000000..1a31a3b2 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/play/sound_note.js @@ -0,0 +1,27 @@ +import * as Blockly from 'blockly/core'; + +export const sound_note = { + init: function () { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(new Blockly.FieldDropdown([ + ["NOTE_A4", "440"], + ["NOTE_B3", "247"], + ["NOTE_C4", "262"], + ["NOTE_D4", "294"], + ["NOTE_E4", "330"], + ["NOTE_F4", "349"], + ["NOTE_G4", "392"], + ["NOTE_A4", "440"], + ["NOTE_B4", "494"], + ["NOTE_C5", "523"], + ["NOTE_D5", "587"], + ["NOTE_E5", "659"], + ["NOTE_F5", "698"], + ["NOTE_G5", "784"] + ]), "NOTE"); + this.setOutput(true, null); + this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_NOTE_TOOLTIP); + } +}; diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/play/sound_stop_all.js b/mixly/boards/default_src/python_pyodide/blocks/sound/play/sound_stop_all.js new file mode 100644 index 00000000..67015769 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/play/sound_stop_all.js @@ -0,0 +1,12 @@ +import * as Blockly from 'blockly/core'; + +export const sound_stop_all = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_catSoundSOUND_STOP_ALL); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_STOP_ALL_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/volume/add.js b/mixly/boards/default_src/python_pyodide/blocks/sound/volume/add.js new file mode 100644 index 00000000..4ffe4df4 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/volume/add.js @@ -0,0 +1,15 @@ +import * as Blockly from 'blockly/core'; + +export const sound_volume_add = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_catSoundSOUND_VOLUME_INCREASE); + this.appendValueInput("VALUE") + .setCheck(null); + this.appendDummyInput(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_VOLUME_ADD_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/volume/get.js b/mixly/boards/default_src/python_pyodide/blocks/sound/volume/get.js new file mode 100644 index 00000000..11cd0cfa --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/volume/get.js @@ -0,0 +1,11 @@ +import * as Blockly from 'blockly/core'; + +export const sound_volume_get = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_catSoundSOUND_VOLUME_GET); + this.setOutput(true, "Volume"); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_VOLUME_GET_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/sound/volume/set.js b/mixly/boards/default_src/python_pyodide/blocks/sound/volume/set.js new file mode 100644 index 00000000..a290ed3a --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/sound/volume/set.js @@ -0,0 +1,15 @@ +import * as Blockly from 'blockly/core'; + +export const sound_volume_set = { + init: function() { + this.setColour('#acc159'); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_catSoundSOUND_VOLUME_SET); + this.appendValueInput("VALUE") + .setCheck(null); + this.appendDummyInput(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_SOUND_VOLUME_SET_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/blocks/tensorflow.js b/mixly/boards/default_src/python_pyodide/blocks/tensorflow.js new file mode 100644 index 00000000..6ac54c7c --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/blocks/tensorflow.js @@ -0,0 +1,230 @@ +import * as Blockly from 'blockly/core'; + +const TENSORFLOW_HUE = '#1216ab'; + +Blockly.Blocks.tensorflow_init_tensor = { + init: function () { + this.appendValueInput("VAR") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_INIT_TENSOR); + this.setOutput(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_sequential = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_SEQUENTIAL); + this.setOutput(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_layers_dense = { + init: function () { + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_INIT_LAYERS_DENSE_LAYER); + this.appendValueInput("VAR1") + .setCheck(null) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_OUTPUT_DIMENSION); + this.appendValueInput("VAR2") + .setCheck(null) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_INPUT_SHAPE); + this.setOutput(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_add = { + init: function () { + this.appendValueInput("VAR1") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_MODEL); + this.appendValueInput("VAR2") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_ADD_LAYER); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_compile = { + init: function () { + this.appendValueInput("VAR1") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_COMPILE_MODEL); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_LOSS_FUNCTION_TYPE) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_TENSORFLOW_MEAN_SQUARED_ERROR, "meanSquaredError"] + ]), "VAR2"); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_OPTIMIZER) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_TENSORFLOW_SGD, "sgd"] + ]), "VAR3"); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_fit = { + init: function () { + this.appendValueInput("VAR1") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_FIT_MODEL); + this.appendValueInput("VAR2") + .setCheck(null) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_FIT_INPUT_DATA); + this.appendValueInput("VAR3") + .setCheck(null) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_FIT_TARGET_DATA); + this.appendValueInput("VAR4") + .setCheck(null) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_FIT_EPOCHS); + this.appendValueInput("VAR5") + .setCheck(null) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_FIT_VERBOSE); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_FIT_RETURN_HISTORY); + this.setInputsInline(false); + this.setOutput(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_get_loss = { + init: function () { + this.appendValueInput("VAR") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_GET_LOSS_FROM_HISTORY); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_GET_LOSS_FROM_HISTORY_2); + this.setOutput(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_predict = { + init: function () { + this.appendValueInput("VAR1") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_PREDICT); + this.appendValueInput("VAR2") + .setCheck(null) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_PREDICT_INPUT_DATA); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_PREDICT_RETURN_RESULT); + this.setInputsInline(false); + this.setOutput(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_get_tensor_data = { + init: function () { + this.appendValueInput("VAR") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_GET_TENSOR_DATA); + this.setOutput(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_save_or_export_model = { + init: function () { + this.appendValueInput("NAME1") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_MODEL); + this.appendValueInput("NAME2") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_TENSORFLOW_SAVE_MODEL, "save"], + [Blockly.Msg.MIXLY_TENSORFLOW_EXPORT_MODEL, "export"] + ]), "NAME") + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_SAVE_MODEL_NAME); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_use_load_model = { + init: function () { + this.appendValueInput("NAME") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_LOAD_MODEL) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_MODEL_NAME); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +Blockly.Blocks.tensorflow_prepare_picture = { + init: function () { + this.appendValueInput("NAME") + .setCheck(null) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_PREPARE_PICTURE_TO_TENSOR) + .appendField(Blockly.Msg.MIXLY_TENSORFLOW_PREPARE_PICTURE_READ_PICTURE); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(TENSORFLOW_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/css/color_mixpy_python_advance.css b/mixly/boards/default_src/python_pyodide/css/color_mixpy_python_advance.css new file mode 100644 index 00000000..382849b4 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/css/color_mixpy_python_advance.css @@ -0,0 +1,216 @@ +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/inout.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/inout2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ctrl.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ctrl2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/math.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/math2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/logic.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/logic2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/text.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/text2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/list3.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/list4.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/tuple.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/tuple2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/dict.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/dict2.png') no-repeat; + background-size: 100% auto; +} + + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/set.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/set2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/var.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/var2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/func.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/func2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/file.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/file2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/requests.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/requests2.png') no-repeat; + background-size: 100% auto; +} + +/* div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{ + background:url('../../../../common/media/mark/mixio.png') no-repeat; + background-size: 100% auto; +} +div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{ + background:url('../../../../common/media/mark/mixio2.png') no-repeat; + background-size: 100% auto; +} +#catMixIO.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{ + background:url('../../../../common/media/mark/mixio.png') no-repeat; + background-size: 100% auto; +} +#catMixIO.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{ + background:url('../../../../common/media/mark/mixio2.png') no-repeat; + background-size: 100% auto; +} */ + + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/turtle.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/turtle2.png') no-repeat; + background-size: 100% auto; +} + +/* div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(16) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{ + background:url('../../../../common/media/mark/ai.png') no-repeat; + background-size: 100% auto; +} +div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(16) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{ + background:url('../../../../common/media/mark/ai2.png') no-repeat; + background-size: 100% auto; +} */ +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(15)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/data.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(15)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/data2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(16)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/cv.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(16)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/cv2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(17)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/algorithm.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(17)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/algorithm2.png') no-repeat; + background-size: 100% auto; +} + +#catFactory.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/factory3.png') no-repeat; + background-size: 100% auto; +} + +#catFactory.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/factory4.png') no-repeat; + background-size: 100% auto; +} + +#catSound.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/voice.png') no-repeat; + background-size: 100% auto; +} + +#catSound.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/voice2.png') no-repeat; + background-size: 100% auto; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/export.js b/mixly/boards/default_src/python_pyodide/export.js new file mode 100644 index 00000000..ccf9bf50 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/export.js @@ -0,0 +1,11 @@ +import * as PythonPyodideSKLearnBlocks from './blocks/sklearn'; +import * as PythonPyodideSKLearnGenerators from './generators/sklearn'; +import * as PythonTensorflowBlocks from './blocks/tensorflow'; +import * as PythonTensorflowGenerators from './generators/tensorflow'; + +export { + PythonPyodideSKLearnBlocks, + PythonPyodideSKLearnGenerators, + PythonTensorflowBlocks, + PythonTensorflowGenerators +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generator.js b/mixly/boards/default_src/python_pyodide/generator.js new file mode 100644 index 00000000..ffa36fa0 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generator.js @@ -0,0 +1,46 @@ +import { Python } from '@mixly/python'; +import KEYBOARD_INTERRUPT_TEMPLATE from './templates/python/keyboard-interrupt.py'; + +Python.finish = function (code) { + // Convert the definitions dictionary into a list. + if (code !== "") { + code = code.replace(/\n/g, '\n'); + code = code.replace(/\n\s+$/, '\n'); + } + var definitions = []; + for (var name in Python.definitions_) { + definitions.push(Python.definitions_[name]); + } + var functions = []; + for (let name in Python.functions_) { + functions.push(Python.functions_[name]); + } + var setups = []; + for (let name in Python.setups_) { + setups.push(Python.setups_[name]); + } + if (setups.length !== 0) + setups.push('\n'); + var loops = []; + for (let name in Python.loops_) { + loops.push(Python.loops_[name]); + } + var codeEnd = []; + for (let name in Python.codeEnd_) { + codeEnd.push(Python.codeEnd_[name]); + } + if (codeEnd.length !== 0) + codeEnd.push('\n'); + // Clean up temporary data. + //delete Python.definitions_; + //delete Python.functionNames_; + //Python.variableDB_.reset(); + if (loops.length > 0) + return KEYBOARD_INTERRUPT_TEMPLATE + definitions.join('\n') + '\n' + functions.join('\n') + + '\n' + setups.join('') + '\n' + code + + 'while True:\n' + loops.join('') + codeEnd.join('\n'); + return KEYBOARD_INTERRUPT_TEMPLATE + definitions.join('\n') + '\n' + functions.join('\n') + '\n' + + setups.join('') + '\n' + code + codeEnd.join('\n'); +} + +export default Python; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sklearn.js b/mixly/boards/default_src/python_pyodide/generators/sklearn.js new file mode 100644 index 00000000..53dee6d7 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sklearn.js @@ -0,0 +1,13 @@ +/** + * @typedef {import('@mixly/python-mixpy').PythonMixpySKLearnGenerators} PythonMixpySKLearnGenerators + */ + +// sklearn 初始化线性回归 +export const sklearn_LinearRegression = function (_, generator) { + const value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + const value_fit_intercept = generator.valueToCode(this, 'fit_intercept', generator.ORDER_ATOMIC) || 'True'; + const value_n_jobs = generator.valueToCode(this, 'n_jobs', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_linear_model'] = 'from sklearn.linear_model import LinearRegression'; + const code = value_model_name + ' = LinearRegression(fit_intercept=' + value_fit_intercept + ', n_jobs=' + value_n_jobs + ')\n'; + return code; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/effect/add.js b/mixly/boards/default_src/python_pyodide/generators/sound/effect/add.js new file mode 100644 index 00000000..c99fd156 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/effect/add.js @@ -0,0 +1,21 @@ +export const sound_effect_add = function(_block, _generator) { + if (!_generator.definitions_['import_sound']) { + _generator.definitions_['import_sound'] = 'import sound'; + } + + const effect = _block.getFieldValue("EFFECT"); + const valueInput = _block.getInputTargetBlock("VALUE"); + let val; + + if (valueInput) { + if (valueInput.type === "math_number") { + val = valueInput.getFieldValue("NUM") || "10"; + } else { + val = _generator.valueToCode(valueInput, "VALUE", _generator.ORDER_NONE) || "10"; + } + } else { + val = "10"; + } + + return `sound.adjust_effect("${effect}", ${val})\n`; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/effect/sound_effect_clear.js b/mixly/boards/default_src/python_pyodide/generators/sound/effect/sound_effect_clear.js new file mode 100644 index 00000000..ecc7d053 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/effect/sound_effect_clear.js @@ -0,0 +1,7 @@ +export const sound_effect_clear = function(_block, _generator) { + if (!_generator.definitions_['import_sound']) { + _generator.definitions_['import_sound'] = 'import sound'; + } + + return "sound.clear_effects()\n"; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/effect/sound_effect_set.js b/mixly/boards/default_src/python_pyodide/generators/sound/effect/sound_effect_set.js new file mode 100644 index 00000000..e5e466a4 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/effect/sound_effect_set.js @@ -0,0 +1,21 @@ +export const sound_effect_set = function(_block, _generator) { + if (!_generator.definitions_['import_sound']) { + _generator.definitions_['import_sound'] = 'import sound'; + } + + const effect = _block.getFieldValue("EFFECT"); + const valueInput = _block.getInputTargetBlock("VALUE"); + let val; + + if (valueInput) { + if (valueInput.type === "math_number") { + val = valueInput.getFieldValue("NUM") || "100"; + } else { + val = _generator.valueToCode(valueInput, "VALUE", _generator.ORDER_NONE) || "100"; + } + } else { + val = "100"; + } + + return `sound.set_effect("${effect}", ${val})\n`; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/play/play.js b/mixly/boards/default_src/python_pyodide/generators/sound/play/play.js new file mode 100644 index 00000000..6fb9dac0 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/play/play.js @@ -0,0 +1,11 @@ +export const sound_play = function(_block, _generator) { + if (!_generator.definitions_['import_sound']) { + _generator.definitions_['import_sound'] = 'import sound'; + } + + const sound = _block.getFieldValue("SOUND"); + if (sound === "record") { + return `sound.record()\n`; + } + return `sound.play("${sound}")\n`; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/play/play_frequency.js b/mixly/boards/default_src/python_pyodide/generators/sound/play/play_frequency.js new file mode 100644 index 00000000..e2b8dda4 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/play/play_frequency.js @@ -0,0 +1,10 @@ +export const sound_play_frequency = function (_block, generator) { + if (!generator.definitions_['import_sound']) { + generator.definitions_['import_sound'] = 'import sound'; + } + + const frequencyInput = generator.valueToCode(this, "FREQUENCY", generator.ORDER_ATOMIC); + const durationInput = generator.valueToCode(this, "DURATION", generator.ORDER_ATOMIC); + + return `sound.play_frequency(${frequencyInput}, ${durationInput})\n`; +}; diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/play/play_frequency_no_duration.js b/mixly/boards/default_src/python_pyodide/generators/sound/play/play_frequency_no_duration.js new file mode 100644 index 00000000..a1b6c18a --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/play/play_frequency_no_duration.js @@ -0,0 +1,9 @@ +export const sound_play_frequency_no_duration = function (_block, generator) { + if (!generator.definitions_['import_sound']) { + generator.definitions_['import_sound'] = 'import sound'; + } + + const frequencyInput = generator.valueToCode(this, "FREQUENCY", generator.ORDER_ATOMIC); + + return `sound.play_frequency_no_duration(${frequencyInput})\n`; +}; diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/play/play_note_list.js b/mixly/boards/default_src/python_pyodide/generators/sound/play/play_note_list.js new file mode 100644 index 00000000..97d56b47 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/play/play_note_list.js @@ -0,0 +1,9 @@ +export const sound_play_note_list = function(_block, _generator) { + if (!_generator.definitions_['import_sound']) { + _generator.definitions_['import_sound'] = 'import sound'; + } + + const noteList = this.getFieldValue("NOTE_LIST"); + + return `sound.play_note_list("${noteList}")\n`; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/play/play_wait.js b/mixly/boards/default_src/python_pyodide/generators/sound/play/play_wait.js new file mode 100644 index 00000000..3db6d510 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/play/play_wait.js @@ -0,0 +1,12 @@ +export const sound_play_wait = function(_block, _generator) { + if (!_generator.definitions_['import_sound']) { + _generator.definitions_['import_sound'] = 'import sound'; + } + + const sound = _block.getFieldValue("SOUND"); + if (sound === "record") { + return `sound.record()\n`; + } + + return `sound.play_blocking("${sound}")\n`; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/play/record.js b/mixly/boards/default_src/python_pyodide/generators/sound/play/record.js new file mode 100644 index 00000000..1e4d04ba --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/play/record.js @@ -0,0 +1,7 @@ +export const sound_record = function(_block, _generator) { + if (!_generator.definitions_['import_sound']) { + _generator.definitions_['import_sound'] = 'import sound'; + } + + return `sound.record()\n`; +}; diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/play/sound_note.js b/mixly/boards/default_src/python_pyodide/generators/sound/play/sound_note.js new file mode 100644 index 00000000..8f243c8d --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/play/sound_note.js @@ -0,0 +1,7 @@ +export const sound_note = function (_block, generator) { + // 获取频率值(字符串格式) + const frequency = this.getFieldValue("NOTE"); + return [frequency, generator.ORDER_ATOMIC]; +}; + + diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/play/sound_stop_all.js b/mixly/boards/default_src/python_pyodide/generators/sound/play/sound_stop_all.js new file mode 100644 index 00000000..27f5817b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/play/sound_stop_all.js @@ -0,0 +1,7 @@ +export const sound_stop_all = function(_block, _generator) { + if (!_generator.definitions_['import_sound']) { + _generator.definitions_['import_sound'] = 'import sound'; + } + + return "sound.stop_all()\n"; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/volume/add.js b/mixly/boards/default_src/python_pyodide/generators/sound/volume/add.js new file mode 100644 index 00000000..c22529b1 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/volume/add.js @@ -0,0 +1,8 @@ +export const sound_volume_add = function(_block, generator) { + if (!generator.definitions_['import_sound']) { + generator.definitions_['import_sound'] = 'import sound'; + } + + const val = generator.valueToCode(_block, "VALUE", generator.ORDER_NONE) || "0"; + return `sound.adjust_volume(${val})\n`; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/volume/get.js b/mixly/boards/default_src/python_pyodide/generators/sound/volume/get.js new file mode 100644 index 00000000..e6bc88b1 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/volume/get.js @@ -0,0 +1,7 @@ +export const sound_volume_get = function(_block, generator) { + if (!generator.definitions_['import_sound']) { + generator.definitions_['import_sound'] = 'import sound'; + } + + return ['sound.get_volume()', generator.ORDER_ATOMIC]; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/sound/volume/set.js b/mixly/boards/default_src/python_pyodide/generators/sound/volume/set.js new file mode 100644 index 00000000..42649773 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/sound/volume/set.js @@ -0,0 +1,8 @@ +export const sound_volume_set = function(_block, generator) { + if (!generator.definitions_['import_sound']) { + generator.definitions_['import_sound'] = 'import sound'; + } + + const val = generator.valueToCode(_block, "VALUE", generator.ORDER_NONE) || "100"; + return `sound.set_volume(${val})\n`; +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/generators/tensorflow.js b/mixly/boards/default_src/python_pyodide/generators/tensorflow.js new file mode 100644 index 00000000..404c3b7f --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/generators/tensorflow.js @@ -0,0 +1,97 @@ +export const tensorflow_init_tensor = function (_, generator) { + var VALUE_INPUT_VAR = generator.valueToCode(this, "VAR", generator.ORDER_ATOMIC); + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + var code = 'tensorflow.tensor(' + VALUE_INPUT_VAR + ')'; + return [code, generator.ORDER_ATOMIC]; +}; + +export const tensorflow_sequential = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + var code = 'tensorflow.sequential()'; + return [code, generator.ORDER_ATOMIC]; +}; + +export const tensorflow_layers_dense = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + var VALUE_INPUT_VAR1 = generator.valueToCode(this, "VAR1", generator.ORDER_ATOMIC); + var VALUE_INPUT_VAR2 = generator.valueToCode(this, "VAR2", generator.ORDER_ATOMIC); + var code = 'tensorflow.layers.dense(units = ' + VALUE_INPUT_VAR1 + ', input_shape = ' + VALUE_INPUT_VAR2 + ')'; + return [code, generator.ORDER_ATOMIC]; +}; + +export const tensorflow_add = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + var VALUE_INPUT_VAR1 = generator.valueToCode(this, "VAR1", generator.ORDER_ATOMIC); + var VALUE_INPUT_VAR2 = generator.valueToCode(this, "VAR2", generator.ORDER_ATOMIC); + var code = VALUE_INPUT_VAR1 + '.add(' + VALUE_INPUT_VAR2 + ')\n'; + return code; +}; + +export const tensorflow_compile = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + var VALUE_INPUT_VAR1 = generator.valueToCode(this, "VAR1", generator.ORDER_ATOMIC); + var VALUE_INPUT_VAR2 = this.getFieldValue("VAR2"); + var VALUE_INPUT_VAR3 = this.getFieldValue("VAR3"); + var code = VALUE_INPUT_VAR1 + '.compile(loss = "' + VALUE_INPUT_VAR2 + '", optimizer = "' + VALUE_INPUT_VAR3 + '")\n'; + return code; +} + +export const tensorflow_fit = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + var VALUE_INPUT_VAR1 = generator.valueToCode(this, "VAR1", generator.ORDER_ATOMIC); + var VALUE_INPUT_VAR2 = generator.valueToCode(this, "VAR2", generator.ORDER_ATOMIC); + var VALUE_INPUT_VAR3 = generator.valueToCode(this, "VAR3", generator.ORDER_ATOMIC); + var VALUE_INPUT_VAR4 = generator.valueToCode(this, "VAR4", generator.ORDER_ATOMIC); + var VALUE_INPUT_VAR5 = generator.valueToCode(this, "VAR5", generator.ORDER_ATOMIC); + var code = 'await ' + VALUE_INPUT_VAR1 + '.fit(' + VALUE_INPUT_VAR2 + ', ' + VALUE_INPUT_VAR3 + ', epochs=' + VALUE_INPUT_VAR4 + ', verbose=' + VALUE_INPUT_VAR5 + ')'; + return [code, generator.ORDER_ATOMIC]; +}; + +export const tensorflow_get_loss = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + var VALUE_INPUT_VAR = generator.valueToCode(this, "VAR", generator.ORDER_ATOMIC); + var code = VALUE_INPUT_VAR + '.history.loss'; + return [code, generator.ORDER_ATOMIC]; +}; + +export const tensorflow_predict = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + var VALUE_INPUT_VAR1 = generator.valueToCode(this, "VAR1", generator.ORDER_ATOMIC); + var VALUE_INPUT_VAR2 = generator.valueToCode(this, "VAR2", generator.ORDER_ATOMIC); + var code = VALUE_INPUT_VAR1 + '.predict(' + VALUE_INPUT_VAR2 + ')'; + return [code, generator.ORDER_ATOMIC]; +}; + +export const tensorflow_get_tensor_data = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + var VALUE_INPUT_VAR1 = generator.valueToCode(this, "VAR", generator.ORDER_ATOMIC); + var code = "(await " + VALUE_INPUT_VAR1 + ".data())"; + return [code, generator.ORDER_ATOMIC]; +}; + +export const tensorflow_save_or_export_model = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + + var VALUE_INPUT_NAME1 = generator.valueToCode(this, "NAME1", generator.ORDER_ATOMIC); + var FIELD_NAME = this.getFieldValue("NAME"); + var VALUE_INPUT_NAME2 = generator.valueToCode(this, "NAME2", generator.ORDER_ATOMIC).replace(/^'|'$/g, ''); + if (FIELD_NAME == "export") { + return `await ${VALUE_INPUT_NAME1}.save("downloads://${VALUE_INPUT_NAME2}")\n`; + } + return `await ${VALUE_INPUT_NAME1}.save("indexeddb://${VALUE_INPUT_NAME2}")\n`; +}; + +export const tensorflow_use_load_model = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + + var VALUE_INPUT_NAME = generator.valueToCode(this, "NAME", generator.ORDER_ATOMIC).replace(/^'|'$/g, ''); + return [`await tensorflow.load_model("${VALUE_INPUT_NAME}")`, generator.ORDER_ATOMIC]; +}; + +export const tensorflow_prepare_picture = function (_, generator) { + generator.definitions_['import_tensorflow'] = 'import tensorflow'; + generator.definitions_['import_numpy'] = 'import numpy'; + generator.definitions_['import_PIL'] = 'import PIL'; + var VALUE_INPUT_NAME = generator.valueToCode(this, "NAME", generator.ORDER_ATOMIC); + return [`(await tensorflow.prepare_qmyixtxi(tensorflow.tensor(numpy.array(PIL.Image.open(${VALUE_INPUT_NAME}).convert('RGB')))))`, generator.ORDER_ATOMIC]; +}; diff --git a/mixly/boards/default_src/python_pyodide/index.js b/mixly/boards/default_src/python_pyodide/index.js new file mode 100644 index 00000000..6d0406cc --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/index.js @@ -0,0 +1,213 @@ +import * as Blockly from 'blockly/core'; +import './language/loader'; +import { Profile } from 'mixly'; + +import { + PythonVariablesBlocks, + PythonControlBlocks, + PythonMathBlocks, + PythonTextBlocks, + PythonListsBlocks, + PythonDictsBlocks, + PythonLogicBlocks, + PythonStorageBlocks, + PythonProceduresBlocks, + PythonTupleBlocks, + PythonSetBlocks, + PythonHtmlBlocks, + PythonUtilityBlocks, + PythonVariablesGenerators, + PythonControlGenerators, + PythonMathGenerators, + PythonTextGenerators, + PythonListsGenerators, + PythonDictsGenerators, + PythonLogicGenerators, + PythonStorageGenerators, + PythonProceduresGenerators, + PythonTupleGenerators, + PythonSetGenerators, + PythonHtmlGenerators, + PythonUtilityGenerators, + Procedures, + Variables, + Python +} from '@mixly/python'; + +import { + PythonMixpyAIBlocks, + PythonMixpyAlgorithmBlocks, + PythonMixpyCommunicateBlocks, + PythonMixpyCVBlocks, + PythonMixpyDataBlocks, + PythonMixpyDatastructureBlocks, + PythonMixpyFactoryBlocks, + PythonMixpyHardwareBlocks, + PythonMixpyInoutBlocks, + PythonMixpyIOTBlocks, + PythonMixpyPinsBlocks, + PythonMixpySerialBlocks, + PythonMixpySKLearnBlocks, + PythonMixpySystemBlocks, + PythonMixpyTurtleBlocks, + PythonMixpyAIGenerators, + PythonMixpyAlgorithmGenerators, + PythonMixpyCommunicateGenerators, + PythonMixpyCVGenerators, + PythonMixpyDataGenerators, + PythonMixpyDatastructureGenerators, + PythonMixpyFactoryGenerators, + PythonMixpyHardwareGenerators, + PythonMixpyInoutGenerators, + PythonMixpyIOTGenerators, + PythonMixpyPinsGenerators, + PythonMixpySerialGenerators, + PythonMixpySKLearnGenerators, + PythonMixpySystemGenerators, + PythonMixpyTurtleGenerators +} from '@mixly/python-mixpy'; + +import { + PythonPyodideSKLearnBlocks, + PythonPyodideSKLearnGenerators, + PythonTensorflowBlocks, + PythonTensorflowGenerators +} from './'; + +import './others/loader'; +import sound from './others/sound.js'; + +import './css/color_mixpy_python_advance.css'; + +Object.assign(Blockly.Variables, Variables); +Object.assign(Blockly.Procedures, Procedures); +Blockly.Python = Python; +Blockly.generator = Python; + +Profile.default = {}; + +Object.assign( + Blockly.Blocks, + PythonVariablesBlocks, + PythonControlBlocks, + PythonMathBlocks, + PythonTextBlocks, + PythonListsBlocks, + PythonDictsBlocks, + PythonLogicBlocks, + PythonStorageBlocks, + PythonProceduresBlocks, + PythonTupleBlocks, + PythonSetBlocks, + PythonHtmlBlocks, + PythonUtilityBlocks, + PythonMixpyAIBlocks, + PythonMixpyAlgorithmBlocks, + PythonMixpyCommunicateBlocks, + PythonMixpyCVBlocks, + PythonMixpyDataBlocks, + PythonMixpyDatastructureBlocks, + PythonMixpyFactoryBlocks, + PythonMixpyHardwareBlocks, + PythonMixpyInoutBlocks, + PythonMixpyIOTBlocks, + PythonMixpyPinsBlocks, + PythonMixpySerialBlocks, + PythonMixpySKLearnBlocks, + PythonMixpySystemBlocks, + PythonMixpyTurtleBlocks, + PythonPyodideSKLearnBlocks, + PythonTensorflowBlocks +); + +Object.assign( + Blockly.Python.forBlock, + PythonVariablesGenerators, + PythonControlGenerators, + PythonMathGenerators, + PythonTextGenerators, + PythonListsGenerators, + PythonDictsGenerators, + PythonLogicGenerators, + PythonStorageGenerators, + PythonProceduresGenerators, + PythonTupleGenerators, + PythonSetGenerators, + PythonHtmlGenerators, + PythonUtilityGenerators, + PythonMixpyAIGenerators, + PythonMixpyAlgorithmGenerators, + PythonMixpyCommunicateGenerators, + PythonMixpyCVGenerators, + PythonMixpyDataGenerators, + PythonMixpyDatastructureGenerators, + PythonMixpyFactoryGenerators, + PythonMixpyHardwareGenerators, + PythonMixpyInoutGenerators, + PythonMixpyIOTGenerators, + PythonMixpyPinsGenerators, + PythonMixpySerialGenerators, + PythonMixpySKLearnGenerators, + PythonMixpySystemGenerators, + PythonMixpyTurtleGenerators, + PythonPyodideSKLearnGenerators, + PythonTensorflowGenerators +); +import { sound_play } from './blocks/sound/play/play.js'; +import { sound_play_wait } from './blocks/sound/play/play_wait.js'; +import { sound_stop_all } from './blocks/sound/play/sound_stop_all.js'; +import { sound_effect_add } from './blocks/sound/effect/add.js'; +import { sound_effect_set } from './blocks/sound/effect/sound_effect_set.js'; +import { sound_effect_clear } from './blocks/sound/effect/sound_effect_clear.js'; +import { sound_volume_add } from './blocks/sound/volume/add.js'; +import { sound_volume_set } from './blocks/sound/volume/set.js'; +import { sound_volume_get } from './blocks/sound/volume/get.js'; +import { sound_record } from './blocks/sound/play/record.js'; +import { sound_play_frequency } from './blocks/sound/play/play_frequency.js'; +import { sound_play_frequency_no_duration } from './blocks/sound/play/play_frequency_no_duration.js'; +import { sound_play_note_list } from './blocks/sound/play/play_note_list.js'; +import { sound_note } from './blocks/sound/play/sound_note.js'; +import { sound_play as sound_play_gen } from './generators/sound/play/play.js'; +import { sound_play_wait as sound_play_wait_gen } from './generators/sound/play/play_wait.js'; +import { sound_stop_all as sound_stop_all_gen } from './generators/sound/play/sound_stop_all.js'; +import { sound_effect_add as sound_effect_add_gen } from './generators/sound/effect/add.js'; +import { sound_effect_set as sound_effect_set_gen } from './generators/sound/effect/sound_effect_set.js'; +import { sound_effect_clear as sound_effect_clear_gen } from './generators/sound/effect/sound_effect_clear.js'; +import { sound_volume_add as sound_volume_add_gen } from './generators/sound/volume/add.js'; +import { sound_volume_set as sound_volume_set_gen } from './generators/sound/volume/set.js'; +import { sound_volume_get as sound_volume_get_gen } from './generators/sound/volume/get.js'; +import { sound_record as sound_record_gen } from './generators/sound/play/record.js'; +import { sound_play_frequency as sound_play_frequency_gen } from './generators/sound/play/play_frequency.js'; +import { sound_play_frequency_no_duration as sound_play_frequency_no_duration_gen } from './generators/sound/play/play_frequency_no_duration.js'; +import { sound_play_note_list as sound_play_note_list_gen } from './generators/sound/play/play_note_list.js'; +import { sound_note as sound_note_gen } from './generators/sound/play/sound_note.js'; +const soundBlocks = { + sound_play, sound_play_wait, sound_stop_all, + sound_effect_add, sound_effect_set, sound_effect_clear, + sound_volume_add, sound_volume_set, sound_volume_get, + sound_record, + sound_play_frequency, sound_play_frequency_no_duration, + sound_play_note_list, sound_note +}; + +const soundGenerators = { + sound_play: sound_play_gen, + sound_play_wait: sound_play_wait_gen, + sound_stop_all: sound_stop_all_gen, + sound_effect_add: sound_effect_add_gen, + sound_effect_set: sound_effect_set_gen, + sound_effect_clear: sound_effect_clear_gen, + sound_volume_add: sound_volume_add_gen, + sound_volume_set: sound_volume_set_gen, + sound_volume_get: sound_volume_get_gen, + sound_record: sound_record_gen, + sound_play_frequency: sound_play_frequency_gen, + sound_play_frequency_no_duration: sound_play_frequency_no_duration_gen, + sound_play_note_list: sound_play_note_list_gen, + sound_note: sound_note_gen +}; + +Object.assign(Blockly.Blocks, soundBlocks); +Object.assign(Blockly.Python.forBlock, soundGenerators); + +window.sound = sound; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/jsconfig.json b/mixly/boards/default_src/python_pyodide/jsconfig.json new file mode 100644 index 00000000..e7d38a65 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/jsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "baseUrl": "./", + "paths": { + "@mixly/python": [ + "../python" + ], + "@mixly/python-mixpy": [ + "../python_mixpy" + ] + } + }, + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/language/en.js b/mixly/boards/default_src/python_pyodide/language/en.js new file mode 100644 index 00000000..a8e6bb3c --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/language/en.js @@ -0,0 +1,15 @@ +export const EnMsg = { + 'PYTHON_PYODIDE_IMAGE': 'Image', + 'PYTHON_PYODIDE_TOOL': 'Teachable Machine', + 'PYTHON_PYODIDE_GAME': 'Game of Life', + 'PYTHON_PYODIDE_GAME_EPOCH': 'Iterations', + 'PYTHON_PYODIDE_GAME_START': 'Start', + 'PYTHON_PYODIDE_GAME_PAUSE': 'Pause', + 'PYTHON_PYODIDE_GAME_RANDOM': 'Random Initialization', + 'PYTHON_PYODIDE_GAME_RESET': 'Reset', + 'PYTHON_PYODIDE_LOADING': 'Python3 kernel loading...', + 'PYTHON_PYODIDE_FILE_SYSTEM': 'Local File System', + 'PYTHON_PYODIDE_LOAD_FILE_SYSTEM': 'Load Local Folder' +}; + +export const EnCatgories = {}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/language/loader.js b/mixly/boards/default_src/python_pyodide/language/loader.js new file mode 100644 index 00000000..26f7ef3e --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/language/loader.js @@ -0,0 +1,12 @@ +import * as Blockly from 'blockly/core'; +import { ZhHansMsg, ZhHansCatgories } from './zh-hans'; +import { ZhHantMsg, ZhHantCatgories } from './zh-hant'; +import { EnMsg, EnCatgories } from './en'; + +// 载入语言文件 +Object.assign(Blockly.Lang.ZhHans, ZhHansMsg); +Object.assign(Blockly.Lang.ZhHant, ZhHantMsg); +Object.assign(Blockly.Lang.En, EnMsg); +Object.assign(Blockly.Lang.ZhHans.MSG, ZhHansCatgories); +Object.assign(Blockly.Lang.ZhHant.MSG, ZhHantCatgories); +Object.assign(Blockly.Lang.En.MSG, EnCatgories); \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/language/zh-hans.js b/mixly/boards/default_src/python_pyodide/language/zh-hans.js new file mode 100644 index 00000000..5504592f --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/language/zh-hans.js @@ -0,0 +1,15 @@ +export const ZhHansMsg = { + 'PYTHON_PYODIDE_IMAGE': '图像', + 'PYTHON_PYODIDE_TOOL': '可教机器', + 'PYTHON_PYODIDE_GAME': '生命游戏', + 'PYTHON_PYODIDE_GAME_EPOCH': '代数', + 'PYTHON_PYODIDE_GAME_START': '开始', + 'PYTHON_PYODIDE_GAME_PAUSE': '暂停', + 'PYTHON_PYODIDE_GAME_RANDOM': '随机初始化', + 'PYTHON_PYODIDE_GAME_RESET': '重置', + 'PYTHON_PYODIDE_LOADING': 'Python3内核载入中...', + 'PYTHON_PYODIDE_FILE_SYSTEM': '本地文件系统', + 'PYTHON_PYODIDE_LOAD_FILE_SYSTEM': '载入本地文件夹' +}; + +export const ZhHansCatgories = {}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/language/zh-hant.js b/mixly/boards/default_src/python_pyodide/language/zh-hant.js new file mode 100644 index 00000000..8d632420 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/language/zh-hant.js @@ -0,0 +1,15 @@ +export const ZhHantMsg = { + 'PYTHON_PYODIDE_IMAGE': '影像', + 'PYTHON_PYODIDE_TOOL': '可教機器', + 'PYTHON_PYODIDE_GAME': '生命遊戲', + 'PYTHON_PYODIDE_GAME_EPOCH': '代數', + 'PYTHON_PYODIDE_GAME_START': '開始', + 'PYTHON_PYODIDE_GAME_PAUSE': '暫停', + 'PYTHON_PYODIDE_GAME_RANDOM': '隨機初始化', + 'PYTHON_PYODIDE_GAME_RESET': '重置', + 'PYTHON_PYODIDE_LOADING': 'Python3核心載入...', + 'PYTHON_PYODIDE_FILE_SYSTEM': '本機檔案系統', + 'PYTHON_PYODIDE_LOAD_FILE_SYSTEM': '載入本機資料夾' +}; + +export const ZhHantCatgories = {}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/config.json b/mixly/boards/default_src/python_pyodide/origin/config.json new file mode 100644 index 00000000..dc4c9880 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/config.json @@ -0,0 +1,12 @@ +{ + "boardImg": "./media/webpy.png", + "boardType": "Python 3 Online", + "language": "Python", + "nav": { + "webrun": true, + "webcancel": true, + "save": { + "py": true + } + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/basthon.tar b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/basthon.tar new file mode 100644 index 00000000..b2e16f58 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/basthon.tar differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/requests-0.0.1-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/requests-0.0.1-py3-none-any.whl new file mode 100644 index 00000000..a06f54d4 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/requests-0.0.1-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/sprite-0.0.1-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/sprite-0.0.1-py3-none-any.whl new file mode 100644 index 00000000..4c2f5637 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/sprite-0.0.1-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/tensorflow-0.0.1-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/tensorflow-0.0.1-py3-none-any.whl new file mode 100644 index 00000000..d26e3fed Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/tensorflow-0.0.1-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/turtle-0.0.1-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/turtle-0.0.1-py3-none-any.whl new file mode 100644 index 00000000..d2c9bf02 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/modules/turtle-0.0.1-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/CLAPACK-3.2.1.zip b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/CLAPACK-3.2.1.zip new file mode 100644 index 00000000..48f4117d Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/CLAPACK-3.2.1.zip differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/PIL-9.1.1-cp311-cp311-emscripten_3_1_32_wasm32.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/PIL-9.1.1-cp311-cp311-emscripten_3_1_32_wasm32.whl new file mode 100644 index 00000000..2baaa75f Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/PIL-9.1.1-cp311-cp311-emscripten_3_1_32_wasm32.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/cycler-0.11.0-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/cycler-0.11.0-py3-none-any.whl new file mode 100644 index 00000000..98e88cec Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/cycler-0.11.0-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/distutils-1.0.0.zip b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/distutils-1.0.0.zip new file mode 100644 index 00000000..6137fc00 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/distutils-1.0.0.zip differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/fonttools-4.39.3-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/fonttools-4.39.3-py3-none-any.whl new file mode 100644 index 00000000..f2f17bc8 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/fonttools-4.39.3-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/joblib-1.2.0-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/joblib-1.2.0-py3-none-any.whl new file mode 100644 index 00000000..626f24f3 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/joblib-1.2.0-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/kiwisolver-1.4.4-cp311-cp311-emscripten_3_1_32_wasm32.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/kiwisolver-1.4.4-cp311-cp311-emscripten_3_1_32_wasm32.whl new file mode 100644 index 00000000..23ad136a Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/kiwisolver-1.4.4-cp311-cp311-emscripten_3_1_32_wasm32.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/matplotlib-3.5.2-cp311-cp311-emscripten_3_1_32_wasm32.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/matplotlib-3.5.2-cp311-cp311-emscripten_3_1_32_wasm32.whl new file mode 100644 index 00000000..b5eb0f0f Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/matplotlib-3.5.2-cp311-cp311-emscripten_3_1_32_wasm32.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/matplotlib_pyodide-0.1.1-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/matplotlib_pyodide-0.1.1-py3-none-any.whl new file mode 100644 index 00000000..edaa51d9 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/matplotlib_pyodide-0.1.1-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/numpy-1.24.2-cp311-cp311-emscripten_3_1_32_wasm32.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/numpy-1.24.2-cp311-cp311-emscripten_3_1_32_wasm32.whl new file mode 100644 index 00000000..aba7c3d3 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/numpy-1.24.2-cp311-cp311-emscripten_3_1_32_wasm32.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/opencv_python-4.7.0.72-cp311-cp311-emscripten_3_1_32_wasm32.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/opencv_python-4.7.0.72-cp311-cp311-emscripten_3_1_32_wasm32.whl new file mode 100644 index 00000000..82e9f55a Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/opencv_python-4.7.0.72-cp311-cp311-emscripten_3_1_32_wasm32.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/packaging-23.0-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/packaging-23.0-py3-none-any.whl new file mode 100644 index 00000000..12f1d67d Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/packaging-23.0-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pandas-1.5.3-cp311-cp311-emscripten_3_1_32_wasm32.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pandas-1.5.3-cp311-cp311-emscripten_3_1_32_wasm32.whl new file mode 100644 index 00000000..d583bd92 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pandas-1.5.3-cp311-cp311-emscripten_3_1_32_wasm32.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyodide.asm.js b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyodide.asm.js new file mode 100644 index 00000000..2cd73802 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyodide.asm.js @@ -0,0 +1,17 @@ +"use strict"; + +var _createPyodideModule = (() => { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return ( +function(_createPyodideModule = {}) { + +var Module=typeof _createPyodideModule!="undefined"?_createPyodideModule:{};if(typeof globalThis.BigInt64Array==="undefined"){function partsToBigIntSigned(lower,upper){return BigInt(lower)|BigInt(upper+2*(upper&2147483648))<<32n}function partsToBigIntUnsigned(lower,upper){return BigInt(lower)|BigInt(upper)<<32n}function bigIntToParts(value){var lower=Number(BigInt(value)&BigInt(4294967295))|0;var upper=Number(BigInt(value)>>32n)|0;return[lower,upper]}function createBigIntArrayShim(partsToBigInt){function createBigInt64Array(array){if(typeof array==="number"){array=new Uint32Array(2*array)}var orig_array;if(!ArrayBuffer.isView(array)){if(array.constructor&&array.constructor.name==="ArrayBuffer"){array=new Uint32Array(array)}else{orig_array=array;array=new Uint32Array(array.length*2)}}var proxy=new Proxy({slice:function(min,max){if(max===undefined){max=array.length}var new_buf=array.slice(min*2,max*2);return createBigInt64Array(new_buf)},subarray:function(min,max){var new_buf=array.subarray(min*2,max*2);return createBigInt64Array(new_buf)},[Symbol.iterator]:function*(){for(var i=0;iarray.length){throw new RangeError("offset is out of bounds")}for(var i=0;i{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;if(e&&typeof e=="object"&&e.stack){toLog=[e,e.stack]}err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process.exitCode=status;throw toThrow}logExceptionOnExit(toThrow);process.exit(status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var dynamicLibraries=Module["dynamicLibraries"]||[];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var HEAP,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||20971520;assert(INITIAL_MEMORY>=5242880,"INITIAL_MEMORY should be larger than STACK_SIZE, was "+INITIAL_MEMORY+"! (STACK_SIZE="+5242880+")");if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":2147483648/65536})}updateMemoryViews();INITIAL_MEMORY=wasmMemory.buffer.byteLength;var wasmTable=new WebAssembly.Table({"initial":6377,"element":"anyfunc"});var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var __RELOC_FUNCS__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__RELOC_FUNCS__);if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();SOCKFS.root=FS.mount(SOCKFS,{},null);PIPEFS.root=FS.mount(PIPEFS,{},null);callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPreMain(cb){__ATMAIN__.unshift(cb)}function addOnExit(cb){}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="pyodide.asm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(binaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(binaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(binaryFile)})}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(function(binary){return WebAssembly.instantiate(binary,imports)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}else{return instantiateArrayBuffer(binaryFile,imports,callback)}}function createWasm(){var info={"env":wasmImports,"wasi_snapshot_preview1":wasmImports,"GOT.mem":new Proxy(wasmImports,GOTHandler),"GOT.func":new Proxy(wasmImports,GOTHandler)};function receiveInstance(instance,module){var exports=instance.exports;exports=relocateExports(exports,1024);var metadata=getDylinkMetadata(module);if(metadata.neededDynlibs){dynamicLibraries=metadata.neededDynlibs.concat(dynamicLibraries)}mergeLibSymbols(exports,"main");Module["asm"]=exports;addOnInit(Module["asm"]["__wasm_call_ctors"]);__RELOC_FUNCS__.push(Module["asm"]["__wasm_apply_data_relocs"]);removeRunDependency("wasm-instantiate");return exports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;var ASM_CONSTS={3880638:()=>{throw new Error("intentionally triggered fatal error!")},3880695:$0=>{Hiwire.get_value($0)()},3880718:()=>{Module.UTF8ToString=UTF8ToString;Module.wasmTable=wasmTable;Module.ERRNO_CODES=ERRNO_CODES},3880822:$0=>{API._pyodide=Hiwire.pop_value($0)},3880863:($0,$1)=>{Hiwire.get_value($1).push(...Hiwire.get_value($0))},3880919:$0=>{for(let v of Hiwire.get_value($0)){if(typeof v.destroy==="function"){try{v.destroy()}catch(e){console.warn("Weird error:",e)}}}}};function console_error(msg){let jsmsg=UTF8ToString(msg);console.error(jsmsg)}function console_error_obj(obj){console.error(Hiwire.get_value(obj))}console_error_obj.sig="vi";function new_error(type,msg,err){try{return Hiwire.new_value(new API.PythonError(UTF8ToString(type),UTF8ToString(msg),err))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}new_error.sig="iiii";function fail_test(){API.fail_test=true}fail_test.sig="v";function hiwire_to_bool(val){return!!Hiwire.get_value(val)}hiwire_to_bool.sig="ii";function hiwire_init(){try{let _hiwire={objects:new Map,obj_to_key:new Map,counter:new Uint32Array([1])};Hiwire.UNDEFINED=HEAPU8[_Js_undefined+0];_hiwire.objects.set(Hiwire.UNDEFINED,[undefined,-1]);_hiwire.obj_to_key.set(undefined,Hiwire.UNDEFINED);Hiwire.JSNULL=HEAPU8[_Js_null+0];_hiwire.objects.set(Hiwire.JSNULL,[null,-1]);_hiwire.obj_to_key.set(null,Hiwire.JSNULL);Hiwire.TRUE=HEAPU8[_Js_true+0];_hiwire.objects.set(Hiwire.TRUE,[!!1,-1]);_hiwire.obj_to_key.set(!!1,Hiwire.TRUE);Hiwire.FALSE=HEAPU8[_Js_false+0];_hiwire.objects.set(Hiwire.FALSE,[!!0,-1]);_hiwire.obj_to_key.set(!!0,Hiwire.FALSE);let hiwire_next_permanent=HEAPU8[_Js_novalue]+2;Hiwire.new_value=function(jsval){let idval=_hiwire.obj_to_key.get(jsval);if(idval!==undefined){_hiwire.objects.get(idval)[1]++;return idval}while(_hiwire.objects.has(_hiwire.counter[0])){_hiwire.counter[0]+=2}idval=_hiwire.counter[0];_hiwire.objects.set(idval,[jsval,1]);_hiwire.obj_to_key.set(jsval,idval);_hiwire.counter[0]+=2;return idval};Hiwire.intern_object=function(obj){let id=hiwire_next_permanent;hiwire_next_permanent+=2;_hiwire.objects.set(id,[obj,-1]);return id};Hiwire.num_keys=function(){return Array.from(_hiwire.objects.keys()).filter(x=>x%2).length};Hiwire.get_value=function(idval){if(!idval){API.fail_test=!!1;if(_PyErr_Occurred()){let exc=_wrap_exception();let e=Hiwire.pop_value(exc);console.error(`Pyodide internal error: Argument '${idval}' to hiwire.get_value is falsy. `+"This was probably because the Python error indicator was set when get_value was called. "+"The Python error that caused this was:",e);throw e}else{console.error(`Pyodide internal error: Argument '${idval}' to hiwire.get_value is falsy`+" (but error indicator is not set).");throw new Error(`Pyodide internal error: Argument '${idval}' to hiwire.get_value is falsy`+" (but error indicator is not set).")}}if(!_hiwire.objects.has(idval)){API.fail_test=!!1;console.error(`Pyodide internal error: Undefined id ${idval}`);throw new Error(`Undefined id ${idval}`)}return _hiwire.objects.get(idval)[0]};Hiwire.decref=function(idval){if((idval&1)===0){return}let pair=_hiwire.objects.get(idval);let new_refcnt=--pair[1];if(new_refcnt===0){_hiwire.objects.delete(idval);_hiwire.obj_to_key.delete(pair[0])}};Hiwire.incref=function(idval){if((idval&1)===0){return}_hiwire.objects.get(idval)[1]++};Hiwire.pop_value=function(idval){let result=Hiwire.get_value(idval);Hiwire.decref(idval);return result};Hiwire.isPromise=function(obj){try{return!!obj&&typeof obj.then==="function"}catch(e){return!!0}};API.typedArrayAsUint8Array=function(arg){if(ArrayBuffer.isView(arg)){return new Uint8Array(arg.buffer,arg.byteOffset,arg.byteLength)}else{return new Uint8Array(arg)}};{let dtypes_str=["b","B","h","H","i","I","f","d"].join(String.fromCharCode(0));let dtypes_ptr=stringToNewUTF8(dtypes_str);let dtypes_map={};for(let[idx,val]of Object.entries(dtypes_str)){dtypes_map[val]=dtypes_ptr+Number(idx)}let buffer_datatype_map=new Map([["Int8Array",[dtypes_map["b"],1,!!1]],["Uint8Array",[dtypes_map["B"],1,!!1]],["Uint8ClampedArray",[dtypes_map["B"],1,!!1]],["Int16Array",[dtypes_map["h"],2,!!1]],["Uint16Array",[dtypes_map["H"],2,!!1]],["Int32Array",[dtypes_map["i"],4,!!1]],["Uint32Array",[dtypes_map["I"],4,!!1]],["Float32Array",[dtypes_map["f"],4,!!1]],["Float64Array",[dtypes_map["d"],8,!!1]],["DataView",[dtypes_map["B"],1,!!0]],["ArrayBuffer",[dtypes_map["B"],1,!!0]]]);Module.get_buffer_datatype=function(jsobj){return buffer_datatype_map.get(jsobj.constructor.name)||[0,0,!!0]}}Module.iterObject=function*(object){for(let k in object){if(Object.prototype.hasOwnProperty.call(object,k)){yield k}}};if(globalThis.BigInt){Module.BigInt=BigInt}else{Module.BigInt=Number}return 0}catch(e){Module.handle_js_error(e);return-1}return 0}hiwire_init.sig="i";function hiwire_incref(idval){if(idval&1){Hiwire.incref(idval)}return idval}hiwire_incref.sig="ii";function hiwire_decref(idval){Hiwire.decref(idval)}hiwire_decref.sig="vi";function hiwire_int(val){try{return Hiwire.new_value(val)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}hiwire_int.sig="ii";function hiwire_int_from_digits(digits,ndigits){try{let result=BigInt(0);for(let i=0;i>2)+i])<>2)+ndigits-1]&2147483648)<2147483647){return-4}return result}catch(e){Module.handle_js_error(e);return-1}return 0}hiwire_get_length_helper.sig="ii";function hiwire_get_length_string(idobj){try{const val=Hiwire.get_value(idobj);let result;if(typeof val.size==="number"){result=val.size}else if(typeof val.length==="number"){result=val.length}return stringToNewUTF8(" "+result.toString())}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}hiwire_get_length_string.sig="ii";function hiwire_get_bool(idobj){try{let val=Hiwire.get_value(idobj);if(!val){return!!0}if(val.size===0){if(/HTML[A-Za-z]*Element/.test(getTypeTag(val))){return!!1}return!!0}if(val.length===0&&JsArray_Check(idobj)){return!!0}if(val.byteLength===0){return!!0}return!!1}catch(e){return!!0}}hiwire_get_bool.sig="ii";function hiwire_is_function(idobj){try{return typeof Hiwire.get_value(idobj)==="function"}catch(e){return!!0}}hiwire_is_function.sig="ii";function hiwire_is_generator(idobj){try{return getTypeTag(Hiwire.get_value(idobj))==="[object Generator]"}catch(e){return!!0}}hiwire_is_generator.sig="ii";function hiwire_is_async_generator(idobj){try{return Object.prototype.toString.call(Hiwire.get_value(idobj))==="[object AsyncGenerator]"}catch(e){return!!0}}hiwire_is_async_generator.sig="ii";function hiwire_is_comlink_proxy(idobj){try{let value=Hiwire.get_value(idobj);return!!(API.Comlink&&value[API.Comlink.createEndpoint])}catch(e){return!!0}}hiwire_is_comlink_proxy.sig="ii";function hiwire_is_error(idobj){try{let value=Hiwire.get_value(idobj);return!!(value&&typeof value.stack==="string"&&typeof value.message==="string")}catch(e){return!!0}}function hiwire_is_promise(idobj){try{let obj=Hiwire.get_value(idobj);return Hiwire.isPromise(obj)}catch(e){return!!0}}hiwire_is_promise.sig="ii";function hiwire_resolve_promise(idobj){try{let obj=Hiwire.get_value(idobj);let result=Promise.resolve(obj);return Hiwire.new_value(result)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}hiwire_resolve_promise.sig="ii";function hiwire_to_string(idobj){try{return Hiwire.new_value(Hiwire.get_value(idobj).toString())}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}hiwire_to_string.sig="ii";function hiwire_typeof(idobj){return Hiwire.new_value(typeof Hiwire.get_value(idobj))}hiwire_typeof.sig="ii";function hiwire_constructor_name(idobj){try{return stringToNewUTF8(Hiwire.get_value(idobj).constructor.name)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}hiwire_constructor_name.sig="ii";function hiwire_less_than(ida,idb){try{return!!(Hiwire.get_value(ida)Hiwire.get_value(idb))}catch(e){return!!0}}hiwire_greater_than.sig="iii";function hiwire_greater_than_equal(ida,idb){try{return!!(Hiwire.get_value(ida)>=Hiwire.get_value(idb))}catch(e){return!!0}}hiwire_greater_than_equal.sig="iii";function hiwire_reversed_iterator(idarray){try{if(!Module._reversedIterator){Module._reversedIterator=class ReversedIterator{constructor(array){this._array=array;this._i=array.length-1}__length_hint__(){return this._array.length}[Symbol.toStringTag](){return"ReverseIterator"}next(){const i=this._i;const a=this._array;const done=i<0;const value=done?undefined:a[i];this._i--;return{done:done,value:value}}}}let array=Hiwire.get_value(idarray);return Hiwire.new_value(new Module._reversedIterator(array))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}hiwire_reversed_iterator.sig="ii";function hiwire_assign_to_ptr(idobj,ptr){try{let jsobj=Hiwire.get_value(idobj);Module.HEAPU8.set(API.typedArrayAsUint8Array(jsobj),ptr)}catch(e){Module.handle_js_error(e);return-1}return 0}hiwire_assign_to_ptr.sig="iii";function hiwire_assign_from_ptr(idobj,ptr){try{let jsobj=Hiwire.get_value(idobj);API.typedArrayAsUint8Array(jsobj).set(Module.HEAPU8.subarray(ptr,ptr+jsobj.byteLength))}catch(e){Module.handle_js_error(e);return-1}return 0}hiwire_assign_from_ptr.sig="iii";function hiwire_read_from_file(idobj,fd){try{let jsobj=Hiwire.get_value(idobj);let uint8_buffer=API.typedArrayAsUint8Array(jsobj);let stream=Module.FS.streams[fd];Module.FS.read(stream,uint8_buffer,0,uint8_buffer.byteLength)}catch(e){Module.handle_js_error(e);return-1}return 0}hiwire_read_from_file.sig="iii";function hiwire_write_to_file(idobj,fd){try{let jsobj=Hiwire.get_value(idobj);let uint8_buffer=API.typedArrayAsUint8Array(jsobj);let stream=Module.FS.streams[fd];Module.FS.write(stream,uint8_buffer,0,uint8_buffer.byteLength)}catch(e){Module.handle_js_error(e);return-1}return 0}hiwire_write_to_file.sig="iii";function hiwire_into_file(idobj,fd){try{let jsobj=Hiwire.get_value(idobj);let uint8_buffer=API.typedArrayAsUint8Array(jsobj);let stream=Module.FS.streams[fd];Module.FS.write(stream,uint8_buffer,0,uint8_buffer.byteLength,undefined,!!1)}catch(e){Module.handle_js_error(e);return-1}return 0}hiwire_into_file.sig="iii";function hiwire_get_buffer_info(idobj,byteLength_ptr,format_ptr,size_ptr,checked_ptr){let jsobj=Hiwire.get_value(idobj);let byteLength=jsobj.byteLength;let[format_utf8,size,checked]=Module.get_buffer_datatype(jsobj);HEAPU32[(byteLength_ptr>>2)+0]=byteLength;HEAPU32[(format_ptr>>2)+0]=format_utf8;HEAPU32[(size_ptr>>2)+0]=size;HEAPU8[checked_ptr+0]=checked}hiwire_get_buffer_info.sig="viiiii";function hiwire_subarray(idarr,start,end){try{let jsarr=Hiwire.get_value(idarr);let jssub=jsarr.subarray(start,end);return Hiwire.new_value(jssub)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}function JsArray_Check(idobj){try{let obj=Hiwire.get_value(idobj);if(Array.isArray(obj)){return!!1}let typeTag=getTypeTag(obj);if(typeTag==="[object HTMLCollection]"||typeTag==="[object NodeList]"){return!!1}if(ArrayBuffer.isView(obj)&&obj.constructor.name!=="DataView"){return!!1}return!!0}catch(e){return!!0}}JsArray_Check.sig="ii";function JsArray_New(){try{return Hiwire.new_value([])}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsArray_New.sig="i";function JsArray_Push(idarr,idval){try{Hiwire.get_value(idarr).push(Hiwire.get_value(idval))}catch(e){Module.handle_js_error(e);return-1}return 0}JsArray_Push.sig="iii";function JsArray_Push_unchecked(idarr,idval){const arr=Hiwire.get_value(idarr);arr.push(Hiwire.get_value(idval));return arr.length-1}JsArray_Push_unchecked.sig="iii";function JsArray_Get(idobj,idx){try{let obj=Hiwire.get_value(idobj);let result=obj[idx];if(result===undefined&&!(idx in obj)){return 0}return Hiwire.new_value(result)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsArray_Get.sig="iii";function JsArray_Set(idobj,idx,idval){try{Hiwire.get_value(idobj)[idx]=Hiwire.get_value(idval)}catch(e){Module.handle_js_error(e);return-1}return 0}JsArray_Set.sig="iiii";function JsArray_Delete(idobj,idx){try{let obj=Hiwire.get_value(idobj);if(idx<0||idx>=obj.length){return-1}obj.splice(idx,1)}catch(e){Module.handle_js_error(e);return-1}return 0}JsArray_Delete.sig="iii";function JsArray_Splice(idobj,idx){try{let obj=Hiwire.get_value(idobj);if(idx<0||idx>=obj.length){return 0}return Hiwire.new_value(obj.splice(idx,1))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsArray_Splice.sig="iii";function JsArray_slice(idobj,length,start,stop,step){try{let obj=Hiwire.get_value(idobj);let result;if(step===1){result=obj.slice(start,stop)}else{result=Array.from({length:length},(_,i)=>obj[start+i*step])}return Hiwire.new_value(result)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsArray_slice.sig="iiiiii";function JsArray_slice_assign(idobj,slicelength,start,stop,step,values_length,values){try{let obj=Hiwire.get_value(idobj);let jsvalues=[];for(let i=0;i>2)+i]);if(ref===0){return-1}jsvalues.push(Hiwire.pop_value(ref))}if(step===1){obj.splice(start,slicelength,...jsvalues)}else{if(values!==0){for(let i=0;i=0;i--){obj.splice(start+i*step,1)}}}}catch(e){Module.handle_js_error(e);return-1}return 0}JsArray_slice_assign.sig="iiiiiiii";function JsArray_Clear(idobj){try{let obj=Hiwire.get_value(idobj);obj.splice(0,obj.length)}catch(e){Module.handle_js_error(e);return-1}return 0}function JsObject_New(){try{return Hiwire.new_value({})}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsObject_New.sig="i";function isReservedWord(word){if(!Module.pythonReservedWords){Module.pythonReservedWords=new Set(["False","await","else","import","pass","None","break","except","in","raise","True","class","finally","is","return","and","continue","for","lambda","try","as","def","from","nonlocal","while","assert","del","global","not","with","async","elif","if","or","yield"])}return Module.pythonReservedWords.has(word)}function normalizeReservedWords(action,word){const noTrailing_=word.replace(/_*$/,"");if(!isReservedWord(noTrailing_)){return word}if(noTrailing_!==word){return word.slice(0,-1)}let action_ptr=stringToNewUTF8(action);let word_ptr=stringToNewUTF8(word);_setReservedError(action_ptr,word_ptr);_free(action_ptr);_free(word_ptr);throw new Module._PropagatePythonError}function JsObject_GetString(idobj,ptrkey){try{let jsobj=Hiwire.get_value(idobj);let jskey=normalizeReservedWords("get",UTF8ToString(ptrkey));if(jskey in jsobj){return Hiwire.new_value(jsobj[jskey])}return 0}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsObject_GetString.sig="iii";function JsObject_SetString(idobj,ptrkey,idval){try{let jsobj=Hiwire.get_value(idobj);let jskey=normalizeReservedWords("set",UTF8ToString(ptrkey));let jsval=Hiwire.get_value(idval);jsobj[jskey]=jsval}catch(e){Module.handle_js_error(e);return-1}return 0}JsObject_SetString.sig="iiii";function JsObject_DeleteString(idobj,ptrkey){try{let jsobj=Hiwire.get_value(idobj);let jskey=normalizeReservedWords("delete",UTF8ToString(ptrkey));delete jsobj[jskey]}catch(e){Module.handle_js_error(e);return-1}return 0}JsObject_DeleteString.sig="iii";function JsObject_Dir(idobj){try{let jsobj=Hiwire.get_value(idobj);let result=[];do{const names=Object.getOwnPropertyNames(jsobj);result.push(...names.filter(s=>{let c=s.charCodeAt(0);return c<48||c>57}).map(word=>isReservedWord(word.replace(/_*$/,""))?word+"_":word))}while(jsobj=Object.getPrototypeOf(jsobj));return Hiwire.new_value(result)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsObject_Dir.sig="ii";function JsObject_Entries(idobj){try{let jsobj=Hiwire.get_value(idobj);return Hiwire.new_value(Object.entries(jsobj))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsObject_Entries.sig="ii";function JsObject_Keys(idobj){try{let jsobj=Hiwire.get_value(idobj);return Hiwire.new_value(Object.keys(jsobj))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsObject_Keys.sig="ii";function JsObject_Values(idobj){try{let jsobj=Hiwire.get_value(idobj);return Hiwire.new_value(Object.values(jsobj))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsObject_Values.sig="ii";function JsString_InternFromCString(str){try{let jsstring=UTF8ToString(str);return Hiwire.intern_object(jsstring)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsString_InternFromCString.sig="ii";function JsMap_New(){try{return Hiwire.new_value(new Map)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsMap_New.sig="i";function JsMap_Set(mapid,keyid,valueid){try{let map=Hiwire.get_value(mapid);let key=Hiwire.get_value(keyid);let value=Hiwire.get_value(valueid);map.set(key,value)}catch(e){Module.handle_js_error(e);return-1}return 0}JsMap_Set.sig="iiii";function JsSet_New(){try{return Hiwire.new_value(new Set)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsSet_New.sig="i";function JsSet_Add(mapid,keyid){try{let set=Hiwire.get_value(mapid);let key=Hiwire.get_value(keyid);set.add(key)}catch(e){Module.handle_js_error(e);return-1}return 0}JsSet_Add.sig="iii";function js2python_immutable(id){try{let value=Hiwire.get_value(id);let result=Module.js2python_convertImmutable(value,id);if(result!==undefined){return result}return 0}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}js2python_immutable.sig="ii";function js2python(id){try{let value=Hiwire.get_value(id);let result=Module.js2python_convertImmutable(value,id);if(result!==undefined){return result}return _JsProxy_create(id)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}js2python.sig="ii";function js2python_convert(id,depth,default_converter){try{let defaultConverter=default_converter?Module.hiwire.get_value(default_converter):undefined;return Module.js2python_convert(id,{depth:depth,defaultConverter:defaultConverter})}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}js2python_convert.sig="iiii";function js2python_init(){try{{0;let PropagateError=Module._PropagatePythonError;function js2python_string(value){let max_code_point=0;let num_code_points=0;for(let c of value){num_code_points++;let code_point=c.codePointAt(0);max_code_point=code_point>max_code_point?code_point:max_code_point}let result=_PyUnicode_New(num_code_points,max_code_point);if(result===0){throw new PropagateError}let ptr=_PyUnicode_Data(result);if(max_code_point>65535){for(let c of value){HEAPU32[ptr/4]=c.codePointAt(0);ptr+=4}}else if(max_code_point>255){for(let c of value){HEAPU16[ptr/2]=c.codePointAt(0);ptr+=2}}else{for(let c of value){HEAPU8[ptr]=c.codePointAt(0);ptr+=1}}return result}function js2python_bigint(value){let value_orig=value;let length=0;if(value<0){value=-value}value<<=BigInt(1);while(value){length++;value>>=BigInt(32)}let stackTop=stackSave();let ptr=stackAlloc(length*4);value=value_orig;for(let i=0;i>2)+i]=Number(value&BigInt(4294967295));value>>=BigInt(32)}let result=__PyLong_FromByteArray(ptr,length*4,!!1,!!1);stackRestore(stackTop);return result}function js2python_convertImmutable(value,id){let result=js2python_convertImmutableInner(value,id);if(result===0){throw new PropagateError}return result}Module.js2python_convertImmutable=js2python_convertImmutable;function js2python_convertImmutableInner(value,id){let type=typeof value;if(type==="string"){return js2python_string(value)}else if(type==="number"){if(Number.isSafeInteger(value)){return _PyLong_FromDouble(value)}else{return _PyFloat_FromDouble(value)}}else if(type==="bigint"){return js2python_bigint(value)}else if(value===undefined||value===null){return __js2python_none()}else if(value===!!1){return __js2python_true()}else if(value===!!0){return __js2python_false()}else if(API.isPyProxy(value)){if(value.$$.ptr==0){Module.PyProxy_getPtr(value)}if(value.$$props.roundtrip){if(id===undefined){id=Hiwire.new_value(value)}return _JsProxy_create(id)}else{return __js2python_pyproxy(Module.PyProxy_getPtr(value))}}return undefined}function js2python_convertList(obj,context){let list=_PyList_New(obj.length);if(list===0){return 0}let entryid=0;let item=0;try{context.cache.set(obj,list);for(let i=0;i>2)+0]=stringToNewUTF8(errmsg);return-1}let result_id=Hiwire.new_value(res.value);HEAPU32[(result_ptr>>2)+0]=result_id;return res.done}catch(e){Module.handle_js_error(e);return-1}return 0}handle_next_result_js.sig="iiii";function JsException_new_helper(name_ptr,message_ptr,stack_ptr){try{let name=UTF8ToString(name_ptr);let message=UTF8ToString(message_ptr);let stack=UTF8ToString(stack_ptr);return Hiwire.new_value(API.deserializeError(name,message,stack))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsException_new_helper.sig="iiii";function JsProxy_GetAsyncIter_js(idobj){try{let jsobj=Hiwire.get_value(idobj);return Hiwire.new_value(jsobj[Symbol.asyncIterator]())}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsProxy_GetAsyncIter_js.sig="ii";function _agen_handle_result_js(promiseid,msg,set_result,set_exception,closing){try{let p=Hiwire.get_value(promiseid);let errmsg;if(typeof p!=="object"){errmsg=`Result of anext() should be object not ${typeof p}`}else if(typeof p.then!=="function"){if(typeof p.done==="boolean"){errmsg=`Result of anext() was not a promise, use next() instead.`}else{errmsg=`Result of anext() was not a promise.`}}if(errmsg){HEAPU32[(msg>>2)+0]=stringToNewUTF8(errmsg);return-1}_Py_IncRef(set_result);_Py_IncRef(set_exception);p.then(({done:done,value:value})=>{let id=Hiwire.new_value(value);__agen_handle_result_js_c(set_result,set_exception,done,id,closing);Hiwire.decref(id)},err=>{let id=Hiwire.new_value(err);__agen_handle_result_js_c(set_result,set_exception,-1,id,closing);Hiwire.decref(id)}).finally(()=>{_Py_DecRef(set_result);_Py_DecRef(set_exception)});return 0}catch(e){Module.handle_js_error(e);return-1}return 0}_agen_handle_result_js.sig="iiiiii";function JsArray_index_helper(list,value,start,stop){try{let o=Hiwire.get_value(list);let v=Hiwire.get_value(value);for(let i=start;iModule.pyproxy_destroy(px,msg))}function wrap(funcname){return function(val){if(API.isPyProxy(val)){val=val.copy();proxies.add(val)}let res;try{res=gen[funcname](val)}catch(e){cleanup();throw e}if(res.done){proxies.delete(res.value);cleanup()}return res}}return Hiwire.new_value({get[Symbol.toStringTag](){return"Generator"},[Symbol.iterator](){return this},next:wrap("next"),throw:wrap("throw"),return:wrap("return")})}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}wrap_generator.sig="iii";function wrap_async_generator(genid,proxiesid){try{const proxies=new Set(Hiwire.get_value(proxiesid));const gen=Hiwire.get_value(genid);const msg="This borrowed proxy was automatically destroyed "+"when an asynchronous generator completed execution. Try "+"using create_proxy or create_once_callable.";function cleanup(){proxies.forEach(px=>Module.pyproxy_destroy(px,msg))}function wrap(funcname){return async function(val){if(API.isPyProxy(val)){val=val.copy();proxies.add(val)}let res;try{res=await gen[funcname](val)}catch(e){cleanup();throw e}if(res.done){proxies.delete(res.value);cleanup()}return res}}return Hiwire.new_value({get[Symbol.toStringTag](){return"AsyncGenerator"},[Symbol.asyncIterator](){return this},next:wrap("next"),throw:wrap("throw"),return:wrap("return")})}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}wrap_async_generator.sig="iii";function JsBuffer_DecodeString_js(jsbuffer_id,encoding){try{let buffer=Hiwire.get_value(jsbuffer_id);let encoding_js;if(encoding){encoding_js=UTF8ToString(encoding)}let decoder=new TextDecoder(encoding_js,{fatal:!!1,ignoreBOM:!!1});let res;try{res=decoder.decode(buffer)}catch(e){if(e instanceof TypeError){return 0}throw e}return Hiwire.new_value(res)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsBuffer_DecodeString_js.sig="iii";function JsDoubleProxy_unwrap_helper(id){try{return Module.PyProxy_getPtr(Hiwire.get_value(id))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}JsDoubleProxy_unwrap_helper.sig="ii";function JsProxy_compute_typeflags(idobj){try{let obj=Hiwire.get_value(idobj);let type_flags=0;if(API.isPyProxy(obj)&&obj.$$.ptr===0){return 0}const constructorName=obj.constructor?obj.constructor.name:"";let typeTag=getTypeTag(obj);if(typeof obj==="function"){type_flags|=1<<9}if(typeof obj.then==="function"){type_flags|=1<<7}if(typeof obj[Symbol.iterator]==="function"){type_flags|=1<<0}if(typeof obj[Symbol.asyncIterator]==="function"){type_flags|=1<<15}if(typeof obj.next==="function"&&(typeof obj[Symbol.iterator]==="function"||typeof obj[Symbol.asyncIterator]!=="function")){type_flags|=1<<1}if(typeof obj.next==="function"&&(typeof obj[Symbol.iterator]!=="function"||typeof obj[Symbol.asyncIterator]==="function")){type_flags|=1<<18}if(typeof obj.size==="number"||typeof obj.length==="number"&&typeof obj!=="function"){type_flags|=1<<2}if(typeof obj.get==="function"){type_flags|=1<<3}if(typeof obj.set==="function"){type_flags|=1<<4}if(typeof obj.has==="function"){type_flags|=1<<5}if(typeof obj.includes==="function"){type_flags|=1<<6}if((ArrayBuffer.isView(obj)||constructorName==="ArrayBuffer")&&!(type_flags&1<<9)){type_flags|=1<<8}if(API.isPyProxy(obj)){type_flags|=1<<13}if(Array.isArray(obj)){type_flags|=1<<10}if(typeTag==="[object HTMLCollection]"||typeTag==="[object NodeList]"){type_flags|=1<<11}if(ArrayBuffer.isView(obj)&&obj.constructor.name!=="DataView"){type_flags|=1<<12}if(typeTag==="[object Generator]"){type_flags|=1<<16}if(typeTag==="[object AsyncGenerator]"){type_flags|=1<<17}if(typeof obj.stack==="string"&&typeof obj.message==="string"&&!(type_flags&(1<<9|1<<8))){type_flags|=1<<19}return type_flags}catch(e){Module.handle_js_error(e);return-1}return 0}JsProxy_compute_typeflags.sig="ii";function pyproxy_Check(x){if(x==0){return false}let val=Hiwire.get_value(x);return API.isPyProxy(val)}pyproxy_Check.sig="ii";function pyproxy_AsPyObject(x){if(x==0){return 0}let val=Hiwire.get_value(x);if(!API.isPyProxy(val)){return 0}return Module.PyProxy_getPtr(val)}pyproxy_AsPyObject.sig="ii";function destroy_proxies(proxies_id,msg_ptr){let msg=undefined;if(msg_ptr){msg=UTF8ToString(msg_ptr)}let proxies=Hiwire.get_value(proxies_id);for(let px of proxies){Module.pyproxy_destroy(px,msg,false)}}destroy_proxies.sig="vii";function destroy_proxy(proxy_id,msg_ptr){let px=Module.hiwire.get_value(proxy_id);if(px.$$props.roundtrip){return}let msg=undefined;if(msg_ptr){msg=UTF8ToString(msg_ptr)}Module.pyproxy_destroy(px,msg,false)}destroy_proxy.sig="vii";function proxy_cache_get(proxyCacheId,descr){let proxyCache=Hiwire.get_value(proxyCacheId);let proxyId=proxyCache.get(descr);if(!proxyId){return undefined}if(Hiwire.get_value(proxyId).$$.ptr){return proxyId}else{proxyCache.delete(descr);Hiwire.decref(proxyId);return undefined}}proxy_cache_get.sig="iii";function proxy_cache_set(proxyCacheId,descr,proxy){let proxyCache=Hiwire.get_value(proxyCacheId);proxyCache.set(descr,proxy)}proxy_cache_set.sig="viii";function array_to_js(array,len){return Hiwire.new_value(Array.from(HEAP32.subarray(array/4,array/4+len)))}array_to_js.sig="iii";function pyproxy_new_ex(ptrobj,capture_this,roundtrip){try{return Hiwire.new_value(Module.pyproxy_new(ptrobj,{props:{captureThis:!!capture_this,roundtrip:!!roundtrip}}))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}pyproxy_new_ex.sig="iiii";function pyproxy_new(ptrobj){try{return Hiwire.new_value(Module.pyproxy_new(ptrobj))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}pyproxy_new.sig="ii";function create_once_callable(obj){try{_Py_IncRef(obj);let alreadyCalled=!!0;function wrapper(...args){if(alreadyCalled){throw new Error("OnceProxy can only be called once")}try{return Module.callPyObject(obj,args)}finally{wrapper.destroy()}}wrapper.destroy=function(){if(alreadyCalled){throw new Error("OnceProxy has already been destroyed")}alreadyCalled=!!1;Module.finalizationRegistry.unregister(wrapper);_Py_DecRef(obj)};Module.finalizationRegistry.register(wrapper,[obj,undefined],wrapper);return Hiwire.new_value(wrapper)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}create_once_callable.sig="ii";function create_promise_handles(handle_result,handle_exception,done_callback_id){try{if(handle_result){_Py_IncRef(handle_result)}if(handle_exception){_Py_IncRef(handle_exception)}let done_callback=x=>{};if(done_callback_id){done_callback=Hiwire.get_value(done_callback_id)}let used=!!0;function checkUsed(){if(used){throw new Error("One of the promise handles has already been called.")}}function destroy(){checkUsed();used=!!1;if(handle_result){_Py_DecRef(handle_result)}if(handle_exception){_Py_DecRef(handle_exception)}}function onFulfilled(res){checkUsed();try{if(handle_result){return Module.callPyObject(handle_result,[res])}}finally{done_callback(res);destroy()}}function onRejected(err){checkUsed();try{if(handle_exception){return Module.callPyObject(handle_exception,[err])}}finally{done_callback(undefined);destroy()}}onFulfilled.destroy=destroy;onRejected.destroy=destroy;return Hiwire.new_value([onFulfilled,onRejected])}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}create_promise_handles.sig="iiii";function _python2js_buffer_inner(buf,itemsize,ndim,format,shape,strides,suboffsets){try{let converter=Module.get_converter(format,itemsize);let result=Module._python2js_buffer_recursive(buf,0,{ndim:ndim,format:format,itemsize:itemsize,shape:shape,strides:strides,suboffsets:suboffsets,converter:converter});return Hiwire.new_value(result)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}_python2js_buffer_inner.sig="iiiiiiii";function python2js_buffer_init(){try{{0;Module.processBufferFormatString=function(formatStr,errorMessage=""){if(formatStr.length>2){throw new Error("Expected format string to have length <= 2, "+`got '${formatStr}'.`+errorMessage)}let formatChar=formatStr.slice(-1);let alignChar=formatStr.slice(0,-1);let bigEndian;switch(alignChar){case"!":case">":bigEndian=!!1;break;case"<":case"@":case"=":case"":bigEndian=!!0;break;default:throw new Error(`Unrecognized alignment character ${alignChar}.`+errorMessage)}let arrayType;switch(formatChar){case"b":arrayType=Int8Array;break;case"s":case"p":case"c":case"B":case"?":arrayType=Uint8Array;break;case"h":arrayType=Int16Array;break;case"H":arrayType=Uint16Array;break;case"i":case"l":case"n":arrayType=Int32Array;break;case"I":case"L":case"N":case"P":arrayType=Uint32Array;break;case"q":if(globalThis.BigInt64Array===undefined){throw new Error("BigInt64Array is not supported on this browser."+errorMessage)}arrayType=BigInt64Array;break;case"Q":if(globalThis.BigUint64Array===undefined){throw new Error("BigUint64Array is not supported on this browser."+errorMessage)}arrayType=BigUint64Array;break;case"f":arrayType=Float32Array;break;case"d":arrayType=Float64Array;break;case"e":throw new Error("Javascript has no Float16 support.");default:throw new Error(`Unrecognized format character '${formatChar}'.`+errorMessage)}return[arrayType,bigEndian]};Module.python2js_buffer_1d_contiguous=function(ptr,stride,n){let byteLength=stride*n;return HEAP8.slice(ptr,ptr+byteLength).buffer};Module.python2js_buffer_1d_noncontiguous=function(ptr,stride,suboffset,n,itemsize){let byteLength=itemsize*n;let buffer=new Uint8Array(byteLength);for(let i=0;i=0){curptr=HEAPU32[(curptr>>2)+0]+suboffset}buffer.set(HEAP8.subarray(curptr,curptr+itemsize),i*itemsize)}return buffer.buffer};Module._python2js_buffer_recursive=function(ptr,curdim,bufferData){let n=HEAPU32[(bufferData.shape>>2)+curdim];let stride=HEAP32[(bufferData.strides>>2)+curdim];let suboffset=-1;if(bufferData.suboffsets!==0){suboffset=HEAP32[(bufferData.suboffsets>>2)+curdim]}if(curdim===bufferData.ndim-1){let arraybuffer;if(stride===bufferData.itemsize&&suboffset<0){arraybuffer=Module.python2js_buffer_1d_contiguous(ptr,stride,n)}else{arraybuffer=Module.python2js_buffer_1d_noncontiguous(ptr,stride,suboffset,n,bufferData.itemsize)}return bufferData.converter(arraybuffer)}let result=[];for(let i=0;i=0){curptr=HEAPU32[(curptr>>2)+0]+suboffset}result.push(Module._python2js_buffer_recursive(curPtr,curdim+1,bufferData))}return result};Module.get_converter=function(format,itemsize){let formatStr=UTF8ToString(format);let[ArrayType,bigEndian]=Module.processBufferFormatString(formatStr);let formatChar=formatStr.slice(-1);switch(formatChar){case"s":let decoder=new TextDecoder("utf8",{ignoreBOM:!!1});return buff=>decoder.decode(buff);case"?":return buff=>Array.from(new Uint8Array(buff),x=>!!x)}if(!bigEndian){return buff=>new ArrayType(buff)}let getFuncName;let setFuncName;switch(itemsize){case 2:getFuncName="getUint16";setFuncName="setUint16";break;case 4:getFuncName="getUint32";setFuncName="setUint32";break;case 8:getFuncName="getFloat64";setFuncName="setFloat64";break;default:throw new Error(`Unexpected size ${itemsize}`)}function swapFunc(buff){let dataview=new DataView(buff);let getFunc=dataview[getFuncName].bind(dataview);let setFunc=dataview[setFuncName].bind(dataview);for(let byte=0;bytenew ArrayType(swapFunc(buff))}}return 0}catch(e){Module.handle_js_error(e);return-1}return 0}python2js_buffer_init.sig="i";function _python2js_addto_postprocess_list(idlist,idparent,idkey,value){const list=Hiwire.get_value(idlist);const parent=Hiwire.get_value(idparent);const key=Hiwire.get_value(idkey);list.push([parent,key,value])}_python2js_addto_postprocess_list.sig="viiii";function _python2js_handle_postprocess_list(idlist,idcache){const list=Hiwire.get_value(idlist);const cache=Hiwire.get_value(idcache);for(const[parent,key,value]of list){let out_value=Hiwire.get_value(cache.get(value));if(parent.constructor.name==="Map"){parent.set(key,out_value)}else{parent[key]=out_value}}}_python2js_handle_postprocess_list.sig="vii";function _python2js_ucs1(ptr,len){try{let jsstr="";for(let i=0;i>1)+i])}return Hiwire.new_value(jsstr)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}_python2js_ucs2.sig="iii";function _python2js_ucs4(ptr,len){try{let jsstr="";for(let i=0;i>2)+i])}return Hiwire.new_value(jsstr)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}_python2js_ucs4.sig="iii";function _python2js_add_to_cache(cacheid,pyparent,jsparent){try{const cache=Hiwire.get_value(cacheid);const old_value=cache.get(pyparent);if(old_value!==undefined){Hiwire.decref(old_value)}Hiwire.incref(jsparent);cache.set(pyparent,jsparent)}catch(e){Module.handle_js_error(e);return-1}return 0}_python2js_add_to_cache.sig="iiii";function _python2js_destroy_cache(cacheid){const cache=Hiwire.get_value(cacheid);for(const[k,v]of cache.entries()){Hiwire.decref(v)}}_python2js_destroy_cache.sig="vi";function _python2js_cache_lookup(cacheid,pyparent){return Hiwire.get_value(cacheid).get(pyparent)}_python2js_cache_lookup.sig="iii";function _JsArray_PushEntry_helper(array,key,value){try{Hiwire.get_value(array).push([Hiwire.get_value(key),Hiwire.get_value(value)])}catch(e){Module.handle_js_error(e);return-1}return 0}_JsArray_PushEntry_helper.sig="iiii";function _JsArray_PostProcess_helper(jscontext,array){try{return Hiwire.new_value(Hiwire.get_value(jscontext).dict_converter(Hiwire.get_value(array)))}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}_JsArray_PostProcess_helper.sig="iii";function python2js__default_converter(jscontext,object){try{let context=Hiwire.get_value(jscontext);let proxy=Module.pyproxy_new(object);let result=context.default_converter(proxy,context.converter,context.cacheConversion);proxy.destroy();return Hiwire.new_value(result)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}python2js__default_converter.sig="iii";function python2js_custom__create_jscontext(context,idcache,dict_converter,default_converter){try{let jscontext={};if(dict_converter!==0){jscontext.dict_converter=Hiwire.get_value(dict_converter)}if(default_converter!==0){jscontext.default_converter=Hiwire.get_value(default_converter);jscontext.cacheConversion=function(input,output){if(!API.isPyProxy(input)){throw new TypeError("The first argument to cacheConversion must be a PyProxy.")}let input_ptr=Module.PyProxy_getPtr(input);let output_key=Hiwire.new_value(output);Hiwire.get_value(idcache).set(input_ptr,output_key)};jscontext.converter=function(x){if(!API.isPyProxy(x)){return x}let ptr=Module.PyProxy_getPtr(x);let res=__python2js(context,ptr);return Hiwire.pop_value(res)}}return Hiwire.new_value(jscontext)}catch(e){Module.handle_js_error(e);return 0}throw new Error("Assertion error: control reached end of function without return")}python2js_custom__create_jscontext.sig="iiiii";function destroy_proxies_js(proxies_id){try{for(let proxy of Hiwire.get_value(proxies_id)){proxy.destroy()}}catch(e){Module.handle_js_error(e);return-1}return 0}destroy_proxies_js.sig="ii";function pyodide_js_init(){!function(exports){"use strict";function __decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}function __await(v){return this instanceof __await?(this.v=v,this):new __await(v)}function __asyncGenerator(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i,g=generator.apply(thisArg,_arguments||[]),q=[];return i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i;function verb(n){g[n]&&(i[n]=function(v){return new Promise(function(a,b){q.push([n,v,a,b])>1||resume(n,v)})})}function resume(n,v){try{(r=g[n](v)).value instanceof __await?Promise.resolve(r.value.v).then(fulfill,reject):settle(q[0][2],r)}catch(e){settle(q[0][3],e)}var r}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f,v){f(v),q.shift(),q.length&&resume(q[0][0],q[0][1])}}const IN_NODE=false;let nodeFetch,nodePath,nodeFsPromisesMod,resolvePath,loadBinaryFile;if(resolvePath=IN_NODE?function(path,base){return nodePath.resolve(base||".",path)}:function(path,base){return void 0===base&&(base=location),new URL(path,base).toString()},loadBinaryFile=IN_NODE?async function(path,_file_sub_resource_hash){if(path.startsWith("file://")&&(path=path.slice("file://".length)),path.includes("://")){let response=await nodeFetch(path);if(!response.ok)throw new Error(`Failed to load '${path}': request failed.`);return new Uint8Array(await response.arrayBuffer())}{const data=await nodeFsPromisesMod.readFile(path);return new Uint8Array(data.buffer,data.byteOffset,data.byteLength)}}:async function(path,subResourceHash){const url=new URL(path,location);let options=subResourceHash?{integrity:subResourceHash}:{},response=await fetch(url,options);if(!response.ok)throw new Error(`Failed to load '${url}': request failed.`);return new Uint8Array(await response.arrayBuffer())},globalThis.document);else if(globalThis.importScripts);else if(!IN_NODE)throw new Error("Cannot determine runtime environment");function makeWarnOnce(warning){let warned=!1;return function(){warned||(warned=!0,console.warn(warning))}}function warnOnce(warning){let warned=!1;return function(_target,_key,descriptor){const key=descriptor.value?"value":"get",original=descriptor[key];return descriptor[key]=function(...args){return warned||(warned=!0,console.warn(warning)),original.call(this,...args)},descriptor}}API.isPyProxy=function(jsobj){return jsobj instanceof PyProxy},globalThis.FinalizationRegistry?Module.finalizationRegistry=new FinalizationRegistry(([ptr,cache])=>{cache&&(cache.leaked=!0,pyproxy_decref_cache(cache));try{Module._Py_DecRef(ptr)}catch(e){API.fatal_error(e)}}):Module.finalizationRegistry={register(){},unregister(){}};let trace_pyproxy_alloc,trace_pyproxy_dealloc,pyproxy_alloc_map=new Map;function pyproxy_new(ptrobj,{flags:flags_arg,cache:cache,props:props,$$:$$}={}){const flags=void 0!==flags_arg?flags_arg:Module._pyproxy_getflags(ptrobj);-1===flags&&Module._pythonexc2js();const cls=Module.getPyProxyClass(flags);let target;256&flags?(target=function(){},Object.setPrototypeOf(target,cls.prototype),delete target.length,delete target.name,target.prototype=void 0):target=Object.create(cls.prototype);const isAlias=!!$$;if(!isAlias){if(!cache){cache={cacheId:Hiwire.new_value(new Map),refcnt:0}}cache.refcnt++,$$={ptr:ptrobj,type:"PyProxy",cache:cache,flags:flags},Module.finalizationRegistry.register($$,[ptrobj,cache],$$),Module._Py_IncRef(ptrobj)}Object.defineProperty(target,"$$",{value:$$}),props||(props={}),props=Object.assign({isBound:!1,captureThis:!1,boundArgs:[],roundtrip:!1},props),Object.defineProperty(target,"$$props",{value:props});let proxy=new Proxy(target,PyProxyHandlers);return isAlias||trace_pyproxy_alloc(proxy),proxy}function _getPtr(jsobj){let ptr=jsobj.$$.ptr;if(0===ptr)throw new Error(jsobj.$$.destroyed_msg);return ptr}function _adjustArgs(proxyobj,jsthis,jsargs){const{captureThis:captureThis,boundArgs:boundArgs,boundThis:boundThis,isBound:isBound}=proxyobj.$$props;return captureThis?isBound?[boundThis].concat(boundArgs,jsargs):[jsthis].concat(jsargs):isBound?boundArgs.concat(jsargs):jsargs}Module.pyproxy_alloc_map=pyproxy_alloc_map,Module.enable_pyproxy_allocation_tracing=function(){trace_pyproxy_alloc=function(proxy){pyproxy_alloc_map.set(proxy,Error().stack)},trace_pyproxy_dealloc=function(proxy){pyproxy_alloc_map.delete(proxy)}},Module.disable_pyproxy_allocation_tracing=function(){trace_pyproxy_alloc=function(proxy){},trace_pyproxy_dealloc=function(proxy){}},Module.disable_pyproxy_allocation_tracing(),Module.pyproxy_new=pyproxy_new;let pyproxyClassMap=new Map;Module.getPyProxyClass=function(flags){const FLAG_TYPE_PAIRS=[[1,PyLengthMethods],[2,PyGetItemMethods],[4,PySetItemMethods],[8,PyContainsMethods],[16,PyIterableMethods],[32,PyIteratorMethods],[2048,PyGeneratorMethods],[512,PyAsyncIterableMethods],[1024,PyAsyncIteratorMethods],[4096,PyAsyncGeneratorMethods],[64,PyAwaitableMethods],[128,PyBufferMethods],[256,PyCallableMethods]];let result=pyproxyClassMap.get(flags);if(result)return result;let descriptors={};for(let[feature_flag,methods]of FLAG_TYPE_PAIRS)flags&feature_flag&&Object.assign(descriptors,Object.getOwnPropertyDescriptors(methods.prototype));descriptors.constructor=Object.getOwnPropertyDescriptor(PyProxy.prototype,"constructor"),Object.assign(descriptors,Object.getOwnPropertyDescriptors({$$flags:flags}));let new_proto=Object.create(PyProxy.prototype,descriptors);function NewPyProxyClass(){}return NewPyProxyClass.prototype=new_proto,pyproxyClassMap.set(flags,NewPyProxyClass),NewPyProxyClass},Module.PyProxy_getPtr=_getPtr;function pyproxy_decref_cache(cache){if(cache&&(cache.refcnt--,0===cache.refcnt)){let cache_map=Hiwire.pop_value(cache.cacheId);for(let proxy_id of cache_map.values()){const cache_entry=Hiwire.pop_value(proxy_id);cache.leaked||Module.pyproxy_destroy(cache_entry,"This borrowed attribute proxy was automatically destroyed in the process of destroying the proxy it was borrowed from. Try using the 'copy' method.",!0)}}}Module.pyproxy_destroy=function(proxy,destroyed_msg,destroy_roundtrip){if(0===proxy.$$.ptr)return;if(!destroy_roundtrip&&proxy.$$props.roundtrip)return;let ptrobj=_getPtr(proxy);Module.finalizationRegistry.unregister(proxy.$$),destroyed_msg=destroyed_msg||"Object has already been destroyed";let proxy_repr,proxy_type=proxy.type;try{proxy_repr=proxy.toString()}catch(e){if(e.pyodide_fatal_error)throw e}proxy.$$.ptr=0,destroyed_msg+=`\nThe object was of type "${proxy_type}" and `,destroyed_msg+=proxy_repr?`had repr "${proxy_repr}"`:"an error was raised when trying to generate its repr",proxy.$$.destroyed_msg=destroyed_msg,pyproxy_decref_cache(proxy.$$.cache);try{Module._Py_DecRef(ptrobj),trace_pyproxy_dealloc(proxy)}catch(e){API.fatal_error(e)}},Module.callPyObjectKwargs=function(ptrobj,jsargs,kwargs){let num_pos_args=jsargs.length,kwargs_names=Object.keys(kwargs),kwargs_values=Object.values(kwargs),num_kwargs=kwargs_names.length;jsargs.push(...kwargs_values);let idresult,idargs=Hiwire.new_value(jsargs),idkwnames=Hiwire.new_value(kwargs_names);try{idresult=Module.__pyproxy_apply(ptrobj,idargs,num_pos_args,idkwnames,num_kwargs)}catch(e){return void(API._skip_unwind_fatal_error?API.maybe_fatal_error(e):API.fatal_error(e))}finally{Hiwire.decref(idargs),Hiwire.decref(idkwnames)}0===idresult&&Module._pythonexc2js();let result=Hiwire.pop_value(idresult);return result&&"coroutine"===result.type&&result._ensure_future&&result._ensure_future(),result},Module.callPyObject=function(ptrobj,jsargs){return Module.callPyObjectKwargs(ptrobj,jsargs,{})};class PyProxy{constructor(){throw new TypeError("PyProxy is not a constructor")}get[Symbol.toStringTag](){return"PyProxy"}get type(){let ptrobj=_getPtr(this);return Hiwire.pop_value(Module.__pyproxy_type(ptrobj))}toString(){let jsref_repr,ptrobj=_getPtr(this);try{jsref_repr=Module.__pyproxy_repr(ptrobj)}catch(e){API.fatal_error(e)}return 0===jsref_repr&&Module._pythonexc2js(),Hiwire.pop_value(jsref_repr)}destroy(options={}){options=Object.assign({message:"",destroyRoundtrip:!0},options);const{message:m,destroyRoundtrip:d}=options;Module.pyproxy_destroy(this,m,d)}copy(){return pyproxy_new(_getPtr(this),{flags:this.$$flags,cache:this.$$.cache,props:this.$$props})}toJs({depth:depth=-1,pyproxies:pyproxies,create_pyproxies:create_pyproxies=!0,dict_converter:dict_converter,default_converter:default_converter}={}){let idresult,proxies_id,ptrobj=_getPtr(this),dict_converter_id=0,default_converter_id=0;proxies_id=create_pyproxies?pyproxies?Hiwire.new_value(pyproxies):Hiwire.new_value([]):0,dict_converter&&(dict_converter_id=Hiwire.new_value(dict_converter)),default_converter&&(default_converter_id=Hiwire.new_value(default_converter));try{idresult=Module._python2js_custom(ptrobj,depth,proxies_id,dict_converter_id,default_converter_id)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(proxies_id),Hiwire.decref(dict_converter_id),Hiwire.decref(default_converter_id)}return 0===idresult&&Module._pythonexc2js(),Hiwire.pop_value(idresult)}supportsLength(){return!!(1&this.$$flags)}supportsGet(){return!!(2&this.$$flags)}supportsSet(){return!!(4&this.$$flags)}supportsHas(){return!!(8&this.$$flags)}isIterable(){return!!(48&this.$$flags)}isIterator(){return!!(32&this.$$flags)}isAwaitable(){return!!(64&this.$$flags)}isBuffer(){return!!(128&this.$$flags)}isCallable(){return!!(256&this.$$flags)}}__decorate([warnOnce("supportsLength() is deprecated. Use `instanceof pyodide.ffi.PyProxyWithLength` instead.")],PyProxy.prototype,"supportsLength",null),__decorate([warnOnce("supportsGet() is deprecated. Use `instanceof pyodide.ffi.PyProxyWithGet` instead.")],PyProxy.prototype,"supportsGet",null),__decorate([warnOnce("supportsSet() is deprecated. Use `instanceof pyodide.ffi.PyProxyWithSet` instead.")],PyProxy.prototype,"supportsSet",null),__decorate([warnOnce("supportsHas() is deprecated. Use `instanceof pyodide.ffi.PyProxyWithHas` instead.")],PyProxy.prototype,"supportsHas",null),__decorate([warnOnce("isIterable() is deprecated. Use `instanceof pyodide.ffi.PyIterable` instead.")],PyProxy.prototype,"isIterable",null),__decorate([warnOnce("isIterator() is deprecated. Use `instanceof pyodide.ffi.PyIterator` instead.")],PyProxy.prototype,"isIterator",null),__decorate([warnOnce("isAwaitable() is deprecated. Use `instanceof pyodide.ffi.PyAwaitable` instead.")],PyProxy.prototype,"isAwaitable",null),__decorate([warnOnce("isBuffer() is deprecated. Use `instanceof pyodide.ffi.PyBuffer` instead.")],PyProxy.prototype,"isBuffer",null),__decorate([warnOnce("isCallable() is deprecated. Use `instanceof pyodide.ffi.PyCallable` instead.")],PyProxy.prototype,"isCallable",null);class PyProxyWithLength extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(1&obj.$$flags)}}class PyLengthMethods{get length(){let length,ptrobj=_getPtr(this);try{length=Module._PyObject_Size(ptrobj)}catch(e){API.fatal_error(e)}return-1===length&&Module._pythonexc2js(),length}}class PyProxyWithGet extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(2&obj.$$flags)}}class PyGetItemMethods{get(key){let idresult,ptrobj=_getPtr(this),idkey=Hiwire.new_value(key);try{idresult=Module.__pyproxy_getitem(ptrobj,idkey)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idkey)}if(0===idresult){if(!Module._PyErr_Occurred())return;Module._pythonexc2js()}return Hiwire.pop_value(idresult)}}class PyProxyWithSet extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(4&obj.$$flags)}}class PySetItemMethods{set(key,value){let errcode,ptrobj=_getPtr(this),idkey=Hiwire.new_value(key),idval=Hiwire.new_value(value);try{errcode=Module.__pyproxy_setitem(ptrobj,idkey,idval)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idkey),Hiwire.decref(idval)}-1===errcode&&Module._pythonexc2js()}delete(key){let errcode,ptrobj=_getPtr(this),idkey=Hiwire.new_value(key);try{errcode=Module.__pyproxy_delitem(ptrobj,idkey)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idkey)}-1===errcode&&Module._pythonexc2js()}}class PyProxyWithHas extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(8&obj.$$flags)}}class PyContainsMethods{has(key){let result,ptrobj=_getPtr(this),idkey=Hiwire.new_value(key);try{result=Module.__pyproxy_contains(ptrobj,idkey)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idkey)}return-1===result&&Module._pythonexc2js(),1===result}}class PyIterable extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(48&obj.$$flags)}}class PyIterableMethods{[Symbol.iterator](){let iterptr,ptrobj=_getPtr(this),token={};try{iterptr=Module._PyObject_GetIter(ptrobj)}catch(e){API.fatal_error(e)}0===iterptr&&Module._pythonexc2js();let result=function*(iterptr,token){try{for(;;){const item=Module.__pyproxy_iter_next(iterptr);if(0===item)break;yield Hiwire.pop_value(item)}}catch(e){API.fatal_error(e)}finally{Module.finalizationRegistry.unregister(token),Module._Py_DecRef(iterptr)}Module._PyErr_Occurred()&&Module._pythonexc2js()}(iterptr,token);return Module.finalizationRegistry.register(result,[iterptr,void 0],token),result}}class PyAsyncIterable extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(1536&obj.$$flags)}}class PyAsyncIterableMethods{[Symbol.asyncIterator](){let iterptr,ptrobj=_getPtr(this),token={};try{iterptr=Module._PyObject_GetAIter(ptrobj)}catch(e){API.fatal_error(e)}0===iterptr&&Module._pythonexc2js();let result=function(iterptr,token){return __asyncGenerator(this,arguments,function*(){try{for(;;){let item,p;try{if(item=Module.__pyproxy_aiter_next(iterptr),0===item)break;p=Hiwire.pop_value(item)}catch(e){API.fatal_error(e)}try{yield yield __await(yield __await(p))}catch(e){if(e&&"object"==typeof e&&"StopAsyncIteration"===e.type)return yield __await(void 0);throw e}finally{p.destroy()}}}finally{Module.finalizationRegistry.unregister(token),Module._Py_DecRef(iterptr)}Module._PyErr_Occurred()&&Module._pythonexc2js()})}(iterptr,token);return Module.finalizationRegistry.register(result,[iterptr,void 0],token),result}}class PyIterator extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(32&obj.$$flags)}}class PyIteratorMethods{[Symbol.iterator](){return this}next(arg){let status,done,idarg=Hiwire.new_value(arg),stackTop=stackSave(),res_ptr=stackAlloc(4);try{status=Module.__pyproxyGen_Send(_getPtr(this),idarg,res_ptr)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idarg)}let idresult=HEAPU32[0+(res_ptr>>2)];return stackRestore(stackTop),-1===status&&Module._pythonexc2js(),done=0===status,{done:done,value:Hiwire.pop_value(idresult)}}}class PyGenerator extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(2048&obj.$$flags)}}class PyGeneratorMethods{throw(exc){let status,done,idarg=Hiwire.new_value(exc),stackTop=stackSave(),res_ptr=stackAlloc(4);try{status=Module.__pyproxyGen_throw(_getPtr(this),idarg,res_ptr)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idarg)}let idresult=HEAPU32[0+(res_ptr>>2)];return stackRestore(stackTop),-1===status&&Module._pythonexc2js(),done=0===status,{done:done,value:Hiwire.pop_value(idresult)}}return(v){let status,done,idarg=Hiwire.new_value(v),stackTop=stackSave(),res_ptr=stackAlloc(4);try{status=Module.__pyproxyGen_return(_getPtr(this),idarg,res_ptr)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idarg)}let idresult=HEAPU32[0+(res_ptr>>2)];return stackRestore(stackTop),-1===status&&Module._pythonexc2js(),done=0===status,{done:done,value:Hiwire.pop_value(idresult)}}}class PyAsyncIterator extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(1024&obj.$$flags)}}class PyAsyncIteratorMethods{[Symbol.asyncIterator](){return this}async next(arg){let idresult,idarg=Hiwire.new_value(arg);try{idresult=Module.__pyproxyGen_asend(_getPtr(this),idarg)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idarg)}0===idresult&&Module._pythonexc2js();const p=Hiwire.pop_value(idresult);let value;try{value=await p}catch(e){if(e&&"object"==typeof e&&"StopAsyncIteration"===e.type)return{done:!0,value:value};throw e}finally{p.destroy()}return{done:!1,value:value}}}class PyAsyncGenerator extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(4096&obj.$$flags)}}class PyAsyncGeneratorMethods{async throw(exc){let idresult,idarg=Hiwire.new_value(exc);try{idresult=Module.__pyproxyGen_athrow(_getPtr(this),idarg)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idarg)}0===idresult&&Module._pythonexc2js();const p=Hiwire.pop_value(idresult);let value;try{value=await p}catch(e){if(e&&"object"==typeof e){if("StopAsyncIteration"===e.type)return{done:!0,value:value};if("GeneratorExit"===e.type)return{done:!0,value:value}}throw e}finally{p.destroy()}return{done:!1,value:value}}async return(v){let idresult;try{idresult=Module.__pyproxyGen_areturn(_getPtr(this))}catch(e){API.fatal_error(e)}0===idresult&&Module._pythonexc2js();const p=Hiwire.pop_value(idresult);let value;try{value=await p}catch(e){if(e&&"object"==typeof e){if("StopAsyncIteration"===e.type)return{done:!0,value:value};if("GeneratorExit"===e.type)return{done:!0,value:v}}throw e}finally{p.destroy()}return{done:!1,value:value}}}let PyProxyHandlers={isExtensible:()=>!0,has:(jsobj,jskey)=>!!Reflect.has(jsobj,jskey)||"symbol"!=typeof jskey&&(jskey.startsWith("$")&&(jskey=jskey.slice(1)),function(jsobj,jskey){let result,ptrobj=_getPtr(jsobj),idkey=Hiwire.new_value(jskey);try{result=Module.__pyproxy_hasattr(ptrobj,idkey)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idkey)}return-1===result&&Module._pythonexc2js(),0!==result}(jsobj,jskey)),get(jsobj,jskey){if(jskey in jsobj||"symbol"==typeof jskey)return Reflect.get(jsobj,jskey);jskey.startsWith("$")&&(jskey=jskey.slice(1));let idresult=function(jsobj,jskey){let idresult,ptrobj=_getPtr(jsobj),idkey=Hiwire.new_value(jskey),cacheId=jsobj.$$.cache.cacheId;try{idresult=Module.__pyproxy_getattr(ptrobj,idkey,cacheId)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idkey)}return 0===idresult&&Module._PyErr_Occurred()&&Module._pythonexc2js(),idresult}(jsobj,jskey);return 0!==idresult?Hiwire.pop_value(idresult):void 0},set(jsobj,jskey,jsval){let descr=Object.getOwnPropertyDescriptor(jsobj,jskey);if(descr&&!descr.writable)throw new TypeError(`Cannot set read only field '${jskey}'`);return"symbol"==typeof jskey?Reflect.set(jsobj,jskey,jsval):(jskey.startsWith("$")&&(jskey=jskey.slice(1)),function(jsobj,jskey,jsval){let errcode,ptrobj=_getPtr(jsobj),idkey=Hiwire.new_value(jskey),idval=Hiwire.new_value(jsval);try{errcode=Module.__pyproxy_setattr(ptrobj,idkey,idval)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idkey),Hiwire.decref(idval)}-1===errcode&&Module._pythonexc2js()}(jsobj,jskey,jsval),!0)},deleteProperty(jsobj,jskey){let descr=Object.getOwnPropertyDescriptor(jsobj,jskey);if(descr&&!descr.writable)throw new TypeError(`Cannot delete read only field '${jskey}'`);return"symbol"==typeof jskey?Reflect.deleteProperty(jsobj,jskey):(jskey.startsWith("$")&&(jskey=jskey.slice(1)),function(jsobj,jskey){let errcode,ptrobj=_getPtr(jsobj),idkey=Hiwire.new_value(jskey);try{errcode=Module.__pyproxy_delattr(ptrobj,idkey)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(idkey)}-1===errcode&&Module._pythonexc2js()}(jsobj,jskey),!descr||!!descr.configurable)},ownKeys(jsobj){let idresult,ptrobj=_getPtr(jsobj);try{idresult=Module.__pyproxy_ownKeys(ptrobj)}catch(e){API.fatal_error(e)}0===idresult&&Module._pythonexc2js();let result=Hiwire.pop_value(idresult);return result.push(...Reflect.ownKeys(jsobj)),result},apply:(jsobj,jsthis,jsargs)=>jsobj.apply(jsthis,jsargs)};class PyAwaitable extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(64&obj.$$flags)}}class PyAwaitableMethods{_ensure_future(){if(this.$$.promise)return this.$$.promise;let resolveHandle,rejectHandle,errcode,ptrobj=_getPtr(this),promise=new Promise((resolve,reject)=>{resolveHandle=resolve,rejectHandle=reject}),resolve_handle_id=Hiwire.new_value(resolveHandle),reject_handle_id=Hiwire.new_value(rejectHandle);try{errcode=Module.__pyproxy_ensure_future(ptrobj,resolve_handle_id,reject_handle_id)}catch(e){API.fatal_error(e)}finally{Hiwire.decref(reject_handle_id),Hiwire.decref(resolve_handle_id)}return-1===errcode&&Module._pythonexc2js(),this.$$.promise=promise,this.destroy(),promise}then(onFulfilled,onRejected){return this._ensure_future().then(onFulfilled,onRejected)}catch(onRejected){return this._ensure_future().catch(onRejected)}finally(onFinally){return this._ensure_future().finally(onFinally)}}class PyCallable extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(256&obj.$$flags)}}class PyCallableMethods{apply(thisArg,jsargs){return jsargs=_adjustArgs(this,thisArg,jsargs=function(...args){return args}.apply(void 0,jsargs)),Module.callPyObject(_getPtr(this),jsargs)}call(thisArg,...jsargs){return jsargs=_adjustArgs(this,thisArg,jsargs),Module.callPyObject(_getPtr(this),jsargs)}callKwargs(...jsargs){if(0===jsargs.length)throw new TypeError("callKwargs requires at least one argument (the key word argument object)");let kwargs=jsargs.pop();if(void 0!==kwargs.constructor&&"Object"!==kwargs.constructor.name)throw new TypeError("kwargs argument is not an object");return Module.callPyObjectKwargs(_getPtr(this),jsargs,kwargs)}bind(thisArg,...jsargs){const{boundArgs:boundArgsOld,boundThis:boundThisOld,isBound:isBound}=this.$$props;let boundThis=thisArg;isBound&&(boundThis=boundThisOld);let boundArgs=boundArgsOld.concat(jsargs);const props=Object.assign({},this.$$props,{boundArgs:boundArgs,isBound:!0,boundThis:boundThis}),$$=this.$$;return pyproxy_new(_getPtr(this),{$$:$$,flags:this.$$flags,props:props})}captureThis(){const props=Object.assign({},this.$$props,{captureThis:!0});return pyproxy_new(_getPtr(this),{$$:this.$$,flags:this.$$flags,props:props})}}PyCallableMethods.prototype.prototype=Function.prototype;let type_to_array_map=new Map([["i8",Int8Array],["u8",Uint8Array],["u8clamped",Uint8ClampedArray],["i16",Int16Array],["u16",Uint16Array],["i32",Int32Array],["u32",Uint32Array],["i32",Int32Array],["u32",Uint32Array],["i64",globalThis.BigInt64Array],["u64",globalThis.BigUint64Array],["f32",Float32Array],["f64",Float64Array],["dataview",DataView]]);class PyBuffer extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&!!(128&obj.$$flags)}}class PyBufferMethods{getBuffer(type){let ArrayType;if(type&&(ArrayType=type_to_array_map.get(type),void 0===ArrayType))throw new Error(`Unknown type ${type}`);let errcode,orig_stack_ptr=stackSave(),buffer_struct_ptr=stackAlloc(HEAPU32[0+(Module._buffer_struct_size>>2)]),this_ptr=_getPtr(this);try{errcode=Module.__pyproxy_get_buffer(buffer_struct_ptr,this_ptr)}catch(e){API.fatal_error(e)}-1===errcode&&Module._pythonexc2js();let startByteOffset=HEAPU32[0+(buffer_struct_ptr>>2)],minByteOffset=HEAPU32[1+(buffer_struct_ptr>>2)],maxByteOffset=HEAPU32[2+(buffer_struct_ptr>>2)],readonly=!!HEAPU32[3+(buffer_struct_ptr>>2)],format_ptr=HEAPU32[4+(buffer_struct_ptr>>2)],itemsize=HEAPU32[5+(buffer_struct_ptr>>2)],shape=Hiwire.pop_value(HEAPU32[6+(buffer_struct_ptr>>2)]),strides=Hiwire.pop_value(HEAPU32[7+(buffer_struct_ptr>>2)]),view_ptr=HEAPU32[8+(buffer_struct_ptr>>2)],c_contiguous=!!HEAPU32[9+(buffer_struct_ptr>>2)],f_contiguous=!!HEAPU32[10+(buffer_struct_ptr>>2)],format=Module.UTF8ToString(format_ptr);stackRestore(orig_stack_ptr);let success=!1;try{let bigEndian=!1;void 0===ArrayType&&([ArrayType,bigEndian]=Module.processBufferFormatString(format," In this case, you can pass an explicit type argument."));let alignment=parseInt(ArrayType.name.replace(/[^0-9]/g,""))/8||1;if(bigEndian&&alignment>1)throw new Error("Javascript has no native support for big endian buffers. In this case, you can pass an explicit type argument. For instance, `getBuffer('dataview')` will return a `DataView`which has native support for reading big endian data. Alternatively, toJs will automatically convert the buffer to little endian.");let numBytes=maxByteOffset-minByteOffset;if(0!==numBytes&&(startByteOffset%alignment!=0||minByteOffset%alignment!=0||maxByteOffset%alignment!=0))throw new Error(`Buffer does not have valid alignment for a ${ArrayType.name}`);let data,numEntries=numBytes/alignment,offset=(startByteOffset-minByteOffset)/alignment;data=0===numBytes?new ArrayType:new ArrayType(HEAPU32.buffer,minByteOffset,numEntries);for(let i of strides.keys())strides[i]/=alignment;return success=!0,Object.create(PyBufferView.prototype,Object.getOwnPropertyDescriptors({offset:offset,readonly:readonly,format:format,itemsize:itemsize,ndim:shape.length,nbytes:numBytes,shape:shape,strides:strides,data:data,c_contiguous:c_contiguous,f_contiguous:f_contiguous,_view_ptr:view_ptr,_released:!1}))}finally{if(!success)try{Module._PyBuffer_Release(view_ptr),Module._PyMem_Free(view_ptr)}catch(e){API.fatal_error(e)}}}}class PyDict extends PyProxy{static[Symbol.hasInstance](obj){return API.isPyProxy(obj)&&"dict"===obj.type}}class PyBufferView{constructor(){throw new TypeError("PyBufferView is not a constructor")}release(){if(!this._released){try{Module._PyBuffer_Release(this._view_ptr),Module._PyMem_Free(this._view_ptr)}catch(e){API.fatal_error(e)}this._released=!0,this.data=null}}}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var errorStackParser={exports:{}},stackframe={exports:{}};stackframe.exports=function(){function _isNumber(n){return!isNaN(parseFloat(n))&&isFinite(n)}function _capitalize(str){return str.charAt(0).toUpperCase()+str.substring(1)}function _getter(p){return function(){return this[p]}}var booleanProps=["isConstructor","isEval","isNative","isToplevel"],numericProps=["columnNumber","lineNumber"],stringProps=["fileName","functionName","source"],arrayProps=["args"],objectProps=["evalOrigin"],props=booleanProps.concat(numericProps,stringProps,arrayProps,objectProps);function StackFrame(obj){if(obj)for(var i=0;i-1&&(line=line.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(,.*$)/g,""));var sanitizedLine=line.replace(/^\s+/,"").replace(/\(eval code/g,"(").replace(/^.*?\s+/,""),location=sanitizedLine.match(/ (\(.+\)$)/);sanitizedLine=location?sanitizedLine.replace(location[0],""):sanitizedLine;var locationParts=this.extractLocation(location?location[1]:sanitizedLine),functionName=location&&sanitizedLine||void 0,fileName=["eval",""].indexOf(locationParts[0])>-1?void 0:locationParts[0];return new StackFrame({functionName:functionName,fileName:fileName,lineNumber:locationParts[1],columnNumber:locationParts[2],source:line})},this)},parseFFOrSafari:function(error){return error.stack.split("\n").filter(function(line){return!line.match(SAFARI_NATIVE_CODE_REGEXP)},this).map(function(line){if(line.indexOf(" > eval")>-1&&(line=line.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),-1===line.indexOf("@")&&-1===line.indexOf(":"))return new StackFrame({functionName:line});var functionNameRegex=/((.*".+"[^@]*)?[^@]*)(?:@)/,matches=line.match(functionNameRegex),functionName=matches&&matches[1]?matches[1]:void 0,locationParts=this.extractLocation(line.replace(functionNameRegex,""));return new StackFrame({functionName:functionName,fileName:locationParts[0],lineNumber:locationParts[1],columnNumber:locationParts[2],source:line})},this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(e){for(var lineRE=/Line (\d+).*script (?:in )?(\S+)/i,lines=e.message.split("\n"),result=[],i=2,len=lines.length;i/,"$2").replace(/\([^)]*\)/g,"")||void 0;functionCall.match(/\(([^)]*)\)/)&&(argsRaw=functionCall.replace(/^[^(]+\(([^)]*)\)$/,"$1"));var args=void 0===argsRaw||"[arguments not available]"===argsRaw?void 0:argsRaw.split(",");return new StackFrame({functionName:functionName,args:args,fileName:locationParts[0],lineNumber:locationParts[1],columnNumber:locationParts[2],source:line})},this)}})}(errorStackParser);var ErrorStackParser=errorStackParser.exports;function ensureCaughtObjectIsError(e){if("string"==typeof e)e=new Error(e);else if(e&&"object"==typeof e&&"ExitStatus"===e.name){let status=e.status;(e=new Exit(e.message)).status=status}else if("object"!=typeof e||null===e||"string"!=typeof e.stack||"string"!=typeof e.message){let msg=`A value of type ${typeof e} with tag ${API.getTypeTag(e)} was thrown as an error!`;try{msg+=`\nString interpolation of the thrown value gives """${e}""".`}catch(e){msg+="\nString interpolation of the thrown value fails."}try{msg+=`\nThe thrown value's toString method returns """${e.toString()}""".`}catch(e){msg+="\nThe thrown value's toString method fails."}e=new Error(msg)}return e}class CppException extends Error{constructor(ty,msg,ptr){msg||(msg=`The exception is an object of type ${ty} at address ${ptr} which does not inherit from std::exception`),super(msg),this.ty=ty}}function convertCppException(e){let[ty,msg]=Module.getExceptionMessage(e);return new CppException(ty,msg,e)}Object.defineProperty(CppException.prototype,"name",{get(){return`${this.constructor.name} ${this.ty}`}}),Tests.convertCppException=convertCppException;let fatal_error_occurred=!1;API.fatal_error=function(e){if(e&&e.pyodide_fatal_error)return;if(fatal_error_occurred)return console.error("Recursive call to fatal_error. Inner error was:"),void console.error(e);(e="number"==typeof e?convertCppException(e):ensureCaughtObjectIsError(e)).pyodide_fatal_error=!0,fatal_error_occurred=!0;const isexit=e instanceof Exit;isexit||(console.error("Pyodide has suffered a fatal error. Please report this to the Pyodide maintainers."),console.error("The cause of the fatal error was:"),API.inTestHoist?(console.error(e.toString()),console.error(e.stack)):console.error(e));try{isexit||Module._dump_traceback();let msg=`Pyodide already ${isexit?"exited":"fatally failed"} and can no longer be used.`;for(let key of Reflect.ownKeys(API.public_api))"string"==typeof key&&key.startsWith("_")||"version"===key||Object.defineProperty(API.public_api,key,{enumerable:!0,configurable:!0,get:()=>{throw new Error(msg)}});API.on_fatal&&API.on_fatal(e)}catch(err2){console.error("Another error occurred while handling the fatal error:"),console.error(err2)}throw e},API.maybe_fatal_error=function(e){if(!e||"unwind"!=e)return API.fatal_error(e)};let stderr_chars=[];function isPyodideFrame(frame){if(!frame)return!1;const fileName=frame.fileName||"";if(fileName.includes("wasm-function"))return!0;if(!fileName.includes("pyodide.asm.js"))return!1;let funcName=frame.functionName||"";return funcName.startsWith("Object.")&&(funcName=funcName.slice("Object.".length)),!(funcName in API.public_api)||"PythonError"===funcName||(frame.functionName=funcName,!1)}API.capture_stderr=function(){stderr_chars=[];const FS=Module.FS;FS.createDevice("/dev","capture_stderr",null,e=>stderr_chars.push(e)),FS.closeStream(2),FS.open("/dev/capture_stderr",1)},API.restore_stderr=function(){const FS=Module.FS;return FS.closeStream(2),FS.unlink("/dev/capture_stderr"),FS.open("/dev/stderr",1),(new TextDecoder).decode(new Uint8Array(stderr_chars))},API.fatal_loading_error=function(...args){let message=args.join(" ");if(Module._PyErr_Occurred()){API.capture_stderr(),Module._PyErr_Print();message+="\n"+API.restore_stderr()}throw new FatalPyodideError(message)},Module.handle_js_error=function(e){if(e&&e.pyodide_fatal_error)throw e;if(e instanceof Module._PropagatePythonError)return;let stack,weirdCatch,restored_error=!1;e instanceof API.PythonError&&(restored_error=Module._restore_sys_last_exception(e.__error_address));try{stack=ErrorStackParser.parse(e)}catch(_){weirdCatch=!0}if(weirdCatch&&(e=ensureCaughtObjectIsError(e)),!restored_error){let eidx=Hiwire.new_value(e),err=Module._JsProxy_create(eidx);Module._set_error(err),Module._Py_DecRef(err),Hiwire.decref(eidx)}if(!weirdCatch){if(function(frame){if(!isPyodideFrame(frame))return!1;const funcName=frame.functionName;return"PythonError"===funcName||"new_error"===funcName}(stack[0]))for(;isPyodideFrame(stack[0]);)stack.shift();for(const frame of stack){if(isPyodideFrame(frame))break;const funcnameAddr=Module.stringToNewUTF8(frame.functionName||"???"),fileNameAddr=Module.stringToNewUTF8(frame.fileName||"???.js");Module.__PyTraceback_Add(funcnameAddr,fileNameAddr,frame.lineNumber),Module._free(funcnameAddr),Module._free(fileNameAddr)}}};class PythonError extends Error{constructor(type,message,error_address){const oldLimit=Error.stackTraceLimit;Error.stackTraceLimit=1/0,super(message),Error.stackTraceLimit=oldLimit,this.type=type,this.__error_address=error_address}}API.PythonError=PythonError;class _PropagatePythonError extends Error{constructor(){super("If you are seeing this message, an internal Pyodide error has occurred. Please report it to the Pyodide maintainers.")}}class FatalPyodideError extends Error{}class Exit extends Error{}[_PropagatePythonError,FatalPyodideError,Exit,PythonError].forEach(function(errClass){Object.defineProperty(errClass.prototype,"name",{value:errClass.name})}),Module._PropagatePythonError=_PropagatePythonError,API.errorConstructors=new Map([EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError,globalThis.DOMException,globalThis.AssertionError,globalThis.SystemError].filter(x=>x).map(x=>[x.constructor.name,x])),API.deserializeError=function(name,message,stack){const err=new(API.errorConstructors.get(name)||Error)(message);return API.errorConstructors.has(name)||(err.name=name),err.message=message,err.stack=stack,err};const ffi={PyProxy:PyProxy,PyProxyWithLength:PyProxyWithLength,PyProxyWithGet:PyProxyWithGet,PyProxyWithSet:PyProxyWithSet,PyProxyWithHas:PyProxyWithHas,PyDict:PyDict,PyIterable:PyIterable,PyAsyncIterable:PyAsyncIterable,PyIterator:PyIterator,PyAsyncIterator:PyAsyncIterator,PyGenerator:PyGenerator,PyAsyncGenerator:PyAsyncGenerator,PyAwaitable:PyAwaitable,PyCallable:PyCallable,PyBuffer:PyBuffer,PyBufferView:PyBufferView,PythonError:PythonError},setCanvas2D=canvas=>{"canvas"!==canvas.id&&console.warn("If you are using canvas element for SDL library, it should have id 'canvas' to work properly."),Module.canvas=canvas},getCanvas2D=()=>Module.canvas,canvas={setCanvas2D:setCanvas2D,getCanvas2D:getCanvas2D,setCanvas3D:canvas=>{setCanvas2D(canvas)},getCanvas3D:()=>getCanvas2D()};function createLock(){let _lock=Promise.resolve();return async function(){const old_lock=_lock;let releaseLock;return _lock=new Promise(resolve=>releaseLock=resolve),await old_lock,releaseLock}}const acquireDynlibLock=createLock();async function loadDynlib(lib,global,searchDirs,readFileFunc){const releaseDynlibLock=await acquireDynlibLock();const fs=function(lib,searchDirs,readFileFunc){const dirname=lib.substring(0,lib.lastIndexOf("/"));let _searchDirs=searchDirs||[];_searchDirs=_searchDirs.concat(API.defaultLdLibraryPath,[dirname]);const resolvePath=path=>{for(const dir of _searchDirs){const fullPath=Module.PATH.join2(dir,path);if(null!==Module.FS.findObject(fullPath))return fullPath}return path};let readFile=path=>Module.FS.readFile(resolvePath(path));return void 0!==readFileFunc&&(readFile=path=>readFileFunc(resolvePath(path))),{findObject:(path,dontResolveLastLink)=>Module.FS.findObject(resolvePath(path),dontResolveLastLink),readFile:readFile}}(lib,searchDirs,readFileFunc);try{if(await Module.loadDynamicLibrary(lib,{loadAsync:!0,nodelete:!0,allowUndefined:!0,global:global,fs:fs}),global&&Module.PATH.isAbs(lib)){const libName=Module.PATH.basename(lib);Module.LDSO.loadedLibsByName[libName]||(Module.LDSO.loadedLibsByName[libName]=Module.LDSO.loadedLibsByName[lib])}}catch(e){if(e&&e.message&&e.message.includes("need to see wasm magic number"))return void console.warn(`Failed to load dynlib ${lib}. We probably just tried to load a linux .so file or something.`);throw e}finally{releaseDynlibLock()}}async function loadDynlibsFromPackage(pkg,dynlibPaths){const auditWheelLibDir=`${API.sitepackages}/${pkg.file_name.split("-")[0]}.libs`,readFileMemoized=(fn=>{let cache={};return(...args)=>{let n=args[0];if(n in cache)return cache[n];{let result=fn(n);return cache[n]=result,result}}})(Module.FS.readFile);let dynlibs;if(!!pkg.shared_library)dynlibs=dynlibPaths.map(path=>({path:path,global:!0}));else{const globalLibs=function(libs,readFileFunc){let readFile=Module.FS.readFile;void 0!==readFileFunc&&(readFile=readFileFunc);const globalLibs=new Set;return libs.forEach(lib=>{const binary=readFile(lib);Module.getDylinkMetadata(binary).neededDynlibs.forEach(lib=>{globalLibs.add(lib)})}),globalLibs}(dynlibPaths,readFileMemoized);dynlibs=dynlibPaths.map(path=>({path:path,global:globalLibs.has(Module.PATH.basename(path))||!!pkg.shared_library}))}dynlibs.sort((lib1,lib2)=>Number(lib2.global)-Number(lib1.global));for(const{path:path,global:global}of dynlibs)await loadDynlib(path,global,[auditWheelLibDir],readFileMemoized)}let cdnURL;API.loadDynlib=loadDynlib,API.loadDynlibsFromPackage=loadDynlibsFromPackage,API.packageIndexReady=async function(lockFileURL){let repodata;if(IN_NODE){await async function(){if(!IN_NODE)return;if((await import("url")).default,nodeFsPromisesMod=await import("fs/promises"),nodeFetch=globalThis.fetch?fetch:(await import("node-fetch")).default,(await import("vm")).default,nodePath=await import("path"),"undefined"!=typeof require)return;const node_modules={fs:await import("fs"),crypto:await import("crypto"),ws:await import("ws"),child_process:await import("child_process")};globalThis.require=function(mod){return node_modules[mod]}}();const package_string=await nodeFsPromisesMod.readFile(lockFileURL);repodata=JSON.parse(package_string)}else{let response=await fetch(lockFileURL);repodata=await response.json()}if(!repodata.packages)throw new Error("Loaded repodata.json does not contain the expected key 'packages'.");API.repodata_info=repodata.info,API.repodata_packages=repodata.packages,API.repodata_unvendored_stdlibs_and_test=[],API._import_name_to_package_name=new Map;for(let name of Object.keys(API.repodata_packages)){const pkg=API.repodata_packages[name];for(let import_name of pkg.imports)API._import_name_to_package_name.set(import_name,name);"cpython_module"===pkg.package_type&&API.repodata_unvendored_stdlibs_and_test.push(name)}API.repodata_unvendored_stdlibs=API.repodata_unvendored_stdlibs_and_test.filter(lib=>"test"!==lib)}(API.config.lockFileURL),API.setCdnUrl=function(url){cdnURL=url};const package_uri_regexp=/^.*?([^\/]*)\.whl$/;function _uri_to_package_name(package_uri){let match=package_uri_regexp.exec(package_uri);if(match){return match[1].toLowerCase().split("-").slice(0,-4).join("-")}}function createDonePromise(){let _resolve=()=>{},_reject=()=>{};const p=new Promise((resolve,reject)=>{_resolve=resolve,_reject=reject});return p.resolve=_resolve,p.reject=_reject,p}function addPackageToLoad(name,toLoad){if(name=name.toLowerCase(),toLoad.has(name))return;const pkg_info=API.repodata_packages[name];if(!pkg_info)throw new Error(`No known package with name '${name}'`);if(toLoad.set(name,{name:name,channel:"default channel",depends:pkg_info.depends,installPromise:void 0,done:createDonePromise()}),void 0===loadedPackages[name])for(let dep_name of pkg_info.depends)addPackageToLoad(dep_name,toLoad)}async function downloadAndInstall(name,toLoad,loaded,failed,checkIntegrity=!0){if(void 0!==loadedPackages[name])return;const pkg=toLoad.get(name);try{const buffer=await async function(name,channel,checkIntegrity=!0){let file_name,uri,file_sub_resource_hash;if("default channel"===channel){if(!(name in API.repodata_packages))throw new Error(`Internal error: no entry for package named ${name}`);file_name=API.repodata_packages[name].file_name,uri=resolvePath(file_name,API.config.indexURL),file_sub_resource_hash=API.package_loader.sub_resource_hash(API.repodata_packages[name].sha256)}else uri=channel,file_sub_resource_hash=void 0;checkIntegrity||(file_sub_resource_hash=void 0);try{return await loadBinaryFile(uri,file_sub_resource_hash)}catch(e){if(!IN_NODE||"default channel"!==channel)throw e}console.log(`Didn't find package ${file_name} locally, attempting to load from ${cdnURL}`);let binary=await loadBinaryFile(cdnURL+file_name);return console.log(`Package ${file_name} loaded from ${cdnURL}, caching the wheel in node_modules for future use.`),await nodeFsPromisesMod.writeFile(uri,binary),binary}(pkg.name,pkg.channel,checkIntegrity),installPromisDependencies=pkg.depends.map(dependency=>toLoad.has(dependency)?toLoad.get(dependency).done:Promise.resolve());await Promise.all(installPromisDependencies),await async function(name,buffer,channel){let pkg=API.repodata_packages[name];pkg||(pkg={file_name:".whl",shared_library:!1,depends:[],imports:[],install_dir:"site"});const filename=pkg.file_name,dynlibs=API.package_loader.unpack_buffer.callKwargs({buffer:buffer,filename:filename,target:pkg.install_dir,calculate_dynlibs:!0,installer:"pyodide.loadPackage",source:"default channel"===channel?"pyodide":channel});await loadDynlibsFromPackage(pkg,dynlibs)}(pkg.name,buffer,pkg.channel),loaded.add(pkg.name),loadedPackages[pkg.name]=pkg.channel}catch(err){failed.set(name,err)}finally{pkg.done.resolve()}}const acquirePackageLock=createLock(),cbDeprecationWarnOnce=makeWarnOnce("Passing a messageCallback (resp. errorCallback) as the second (resp. third) argument to loadPackage is deprecated and will be removed in v0.24. Instead use:\n { messageCallback : callbackFunc }");async function loadPackage(names,options={checkIntegrity:!0},errorCallbackDeprecated){"function"==typeof options&&(cbDeprecationWarnOnce(),options={messageCallback:options,errorCallback:errorCallbackDeprecated});const messageCallback=options.messageCallback||console.log,errorCallback=options.errorCallback||console.error;names instanceof PyProxy&&(names=names.toJs()),Array.isArray(names)||(names=[names]);const toLoad=function(names,errorCallback){const toLoad=new Map;for(let name of names){const pkgname=_uri_to_package_name(name);if(void 0===pkgname){addPackageToLoad(name,toLoad);continue}const channel=name;toLoad.has(pkgname)&&toLoad.get(pkgname).channel!==channel?errorCallback(`Loading same package ${pkgname} from ${channel} and ${toLoad.get(pkgname).channel}`):toLoad.set(pkgname,{name:pkgname,channel:channel,depends:[],installPromise:void 0,done:createDonePromise()})}return toLoad}(names,errorCallback);for(const[pkg,pkg_metadata]of toLoad){const loaded=loadedPackages[pkg];void 0!==loaded&&(toLoad.delete(pkg),loaded===pkg_metadata.channel||"default channel"===pkg_metadata.channel?messageCallback(`${pkg} already loaded from ${loaded}`):errorCallback(`URI mismatch, attempting to load package ${pkg} from ${pkg_metadata.channel} while it is already loaded from ${loaded}. To override a dependency, load the custom package first.`))}if(0===toLoad.size)return void messageCallback("No new packages to load");const packageNames=[...toLoad.keys()].join(", "),loaded=new Set,failed=new Map,releaseLock=await acquirePackageLock();try{messageCallback(`Loading ${packageNames}`);for(const[name]of toLoad)loadedPackages[name]?toLoad.delete(name):toLoad.get(name).installPromise=downloadAndInstall(name,toLoad,loaded,failed,options.checkIntegrity);if(await Promise.all(Array.from(toLoad.values()).map(({installPromise:installPromise})=>installPromise)),Module.reportUndefinedSymbols(),loaded.size>0){messageCallback(`Loaded ${Array.from(loaded).join(", ")}`)}if(failed.size>0){messageCallback(`Failed to load ${Array.from(failed.keys()).join(", ")}`);for(const[name,err]of failed)errorCallback(`The following error occurred while loading ${name}:`),errorCallback(err.message)}API.importlib.invalidate_caches()}finally{releaseLock()}}let loadedPackages={};let INITIALIZED=!1;const ttyout_ops={},ttyerr_ops={},isattys={};function refreshStreams(){INITIALIZED&&(FS.unlink("/dev/stdin"),FS.unlink("/dev/stdout"),FS.unlink("/dev/stderr"),isattys.stdin?FS.symlink("/dev/tty","/dev/stdin"):FS.createDevice("/dev","stdin",ttyout_ops.get_char),isattys.stdout?FS.symlink("/dev/tty","/dev/stdout"):FS.createDevice("/dev","stdout",null,ttyout_ops.put_char.bind(void 0,void 0)),isattys.stderr?FS.symlink("/dev/tty","/dev/stderr"):FS.createDevice("/dev","stderr",null,ttyerr_ops.put_char.bind(void 0,void 0)),FS.closeStream(0),FS.closeStream(1),FS.closeStream(2),FS.open("/dev/stdin",0),FS.open("/dev/stdout",1),FS.open("/dev/stderr",1))}function setStdinError(){isattys.stdin=!1;const get_char=()=>{throw 0};ttyout_ops.get_char=get_char,ttyerr_ops.get_char=get_char,refreshStreams()}function setStdin(options={}){if(options.stdin&&options.error)throw new TypeError("Both a stdin handler provided and the error argument was set");if(options.error)setStdinError();else{if(options.stdin){let autoEOF=options.autoEOF;autoEOF=void 0===autoEOF||autoEOF,isattys.stdin=!!options.isatty;const get_char=function(infunc,autoEOF){let index=0,buf=new Uint8Array(0),insertEOF=!1;return function(){try{if(index>=buf.length){if(insertEOF)return insertEOF=!1,null;let input=infunc();if(null==input)return null;if("number"==typeof input)return input;if("string"==typeof input)input.endsWith("\n")||(input+="\n"),buf=textencoder.encode(input);else if(ArrayBuffer.isView(input)){if(1!==input.BYTES_PER_ELEMENT)throw new Error("Expected BYTES_PER_ELEMENT to be 1");buf=input}else{if("[object ArrayBuffer]"!==Object.prototype.toString.call(input))throw new Error("Expected result to be undefined, null, string, array buffer, or array buffer view");buf=new Uint8Array(input)}if(0===buf.length)return null;autoEOF&&(insertEOF=!0),index=0}return buf[index++]}catch(e){throw console.error("Error thrown in stdin:"),console.error(e),e}}}(options.stdin,autoEOF);return ttyout_ops.get_char=get_char,ttyerr_ops.get_char=get_char,void refreshStreams()}!function(){if(IN_NODE){const BUFSIZE=256,buf=Buffer.alloc(BUFSIZE),fs=require("fs");setStdin({stdin:function(){let bytesRead;try{bytesRead=fs.readSync(process.stdin.fd,buf,0,BUFSIZE,-1)}catch(e){if(!e.toString().includes("EOF"))throw e;bytesRead=0}return 0===bytesRead?null:buf.subarray(0,bytesRead)},isatty:require("tty").isatty(process.stdin.fd)})}else setStdinError()}()}}function setDefaultStdout(){if(IN_NODE){setStdout({raw:x=>process.stdout.write(Buffer.from([x])),isatty:require("tty").isatty(process.stdout.fd)})}else setStdout({batched:x=>console.log(x)})}function setStdout(options={}){if(options.raw&&options.batched)throw new TypeError("Both a batched handler and a raw handler provided");if(!options.raw&&options.isatty)throw new TypeError("Cannot set isatty to true unless a raw handler is provided");return options.raw?(isattys.stdout=!!options.isatty,Object.assign(ttyout_ops,make_unbatched_put_char(options.raw)),void refreshStreams()):options.batched?(isattys.stdout=!1,Object.assign(ttyout_ops,make_batched_put_char(options.batched)),void refreshStreams()):void setDefaultStdout()}function setDefaultStderr(){if(IN_NODE){setStderr({raw:x=>process.stderr.write(Buffer.from([x])),isatty:require("tty").isatty(process.stderr.fd)})}else setStderr({batched:x=>console.warn(x)})}function setStderr(options={}){if(options.raw&&options.batched)throw new TypeError("Both a batched handler and a raw handler provided");if(!options.raw&&options.isatty)throw new TypeError("Cannot set isatty to true unless a raw handler is provided");return options.raw?(isattys.stderr=!!options.isatty,Object.assign(ttyerr_ops,make_unbatched_put_char(options.raw)),void refreshStreams()):options.batched?(isattys.stderr=!1,Object.assign(ttyerr_ops,make_batched_put_char(options.batched)),void refreshStreams()):void setDefaultStderr()}API.initializeStreams=function(stdin,stdout,stderr){setStdin({stdin:stdin}),stdout?setStdout({batched:stdout}):setDefaultStdout(),stderr?setStderr({batched:stderr}):setDefaultStderr();const ttyout_dev=FS.makedev(5,0),ttyerr_dev=FS.makedev(6,0);TTY.register(ttyout_dev,ttyout_ops),TTY.register(ttyerr_dev,ttyerr_ops),INITIALIZED=!0,refreshStreams()};const textencoder=new TextEncoder,textdecoder=new TextDecoder;function make_unbatched_put_char(out){return{put_char(tty,val){out(val)},fsync(){}}}function make_batched_put_char(out){let output=[];return{put_char(tty,val){null===val||10===val?(out(textdecoder.decode(new Uint8Array(output))),output=[]):0!==val&&output.push(val)},fsync(tty){output&&output.length>0&&(out(textdecoder.decode(new Uint8Array(output))),output=[])}}}API.loadBinaryFile=loadBinaryFile,API.rawRun=function(code){const code_ptr=Module.stringToNewUTF8(code);Module.API.capture_stderr();let errcode=Module._PyRun_SimpleString(code_ptr);Module._free(code_ptr);return[errcode,Module.API.restore_stderr().trim()]},API.runPythonInternal=function(code){return API._pyodide._base.eval_code(code,API.runPythonInternal_dict)};const positionalCallbackWarnOnce=makeWarnOnce("Passing a messageCallback (resp. errorCallback) as the second (resp. third) argument to loadPackageFromImports is deprecated and will be removed in v0.24. Instead use:\n { messageCallback : callbackFunc }");API.saveState=()=>API.pyodide_py._state.save_state(),API.restoreState=state=>API.pyodide_py._state.restore_state(state);class PyodideAPI{static async loadPackagesFromImports(code,options={checkIntegrity:!0},errorCallbackDeprecated){"function"==typeof options&&(positionalCallbackWarnOnce(),options={messageCallback:options,errorCallback:errorCallbackDeprecated});let imports,pyimports=API.pyodide_code.find_imports(code);try{imports=pyimports.toJs()}finally{pyimports.destroy()}if(0===imports.length)return;let packageNames=API._import_name_to_package_name,packages=new Set;for(let name of imports)packageNames.has(name)&&packages.add(packageNames.get(name));packages.size&&await loadPackage(Array.from(packages),options)}static runPython(code,options={}){return options.globals||(options.globals=API.globals),API.pyodide_code.eval_code(code,options.globals,options.locals)}static async runPythonAsync(code,options={}){return options.globals||(options.globals=API.globals),await API.pyodide_code.eval_code_async(code,options.globals,options.locals)}static registerJsModule(name,module){API.pyodide_ffi.register_js_module(name,module)}static unregisterJsModule(name){API.pyodide_ffi.unregister_js_module(name)}static toPy(obj,{depth:depth,defaultConverter:defaultConverter}={depth:-1}){switch(typeof obj){case"string":case"number":case"boolean":case"bigint":case"undefined":return obj}if(!obj||API.isPyProxy(obj))return obj;let obj_id=0,py_result=0,result=0;try{obj_id=Hiwire.new_value(obj);try{py_result=Module.js2python_convert(obj_id,{depth:depth,defaultConverter:defaultConverter})}catch(e){throw e instanceof Module._PropagatePythonError&&Module._pythonexc2js(),e}if(Module._JsProxy_Check(py_result))return obj;result=Module._python2js(py_result),0===result&&Module._pythonexc2js()}finally{Hiwire.decref(obj_id),Module._Py_DecRef(py_result)}return Hiwire.pop_value(result)}static pyimport(mod_name){return API.importlib.import_module(mod_name)}static unpackArchive(buffer,format,options={}){if(!ArrayBuffer.isView(buffer)&&"[object ArrayBuffer]"!==API.getTypeTag(buffer))throw new TypeError("Expected argument 'buffer' to be an ArrayBuffer or an ArrayBuffer view");API.typedArrayAsUint8Array(buffer);let extract_dir=options.extractDir;API.package_loader.unpack_buffer.callKwargs({buffer:buffer,format:format,extract_dir:extract_dir,installer:"pyodide.unpackArchive"})}static async mountNativeFS(path,fileSystemHandle){if("FileSystemDirectoryHandle"!==fileSystemHandle.constructor.name)throw new TypeError("Expected argument 'fileSystemHandle' to be a FileSystemDirectoryHandle");return null==Module.FS.findObject(path)&&Module.FS.mkdirTree(path),Module.FS.mount(Module.FS.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:fileSystemHandle},path),await new Promise((resolve,_)=>Module.FS.syncfs(!0,resolve)),{syncfs:async()=>new Promise((resolve,_)=>Module.FS.syncfs(!1,resolve))}}static registerComlink(Comlink){API._Comlink=Comlink}static setInterruptBuffer(interrupt_buffer){Module.HEAP8[Module._Py_EMSCRIPTEN_SIGNAL_HANDLING]=!!interrupt_buffer,Module.Py_EmscriptenSignalBuffer=interrupt_buffer}static checkInterrupt(){Module.__PyErr_CheckSignals()&&Module._pythonexc2js()}static isPyProxy(jsobj){return console.warn("pyodide.isPyProxy() is deprecated. Use `instanceof pyodide.ffi.PyProxy` instead."),this.isPyProxy=API.isPyProxy,API.isPyProxy(jsobj)}static get PyBuffer(){return console.warn("pyodide.PyBuffer is deprecated. Use `pyodide.ffi.PyBufferView` instead."),Object.defineProperty(this,"PyBuffer",{value:PyBufferView}),PyBufferView}static get PyProxyBuffer(){return console.warn("pyodide.PyProxyBuffer is deprecated. Use `pyodide.ffi.PyBuffer` instead."),Object.defineProperty(this,"PyProxyBuffer",{value:PyBuffer}),PyBuffer}static get PythonError(){return console.warn("pyodide.PythonError is deprecated. Use `pyodide.ffi.PythonError` instead."),Object.defineProperty(this,"PythonError",{value:PythonError}),PythonError}}PyodideAPI.version="0.23.2",PyodideAPI.loadPackage=loadPackage,PyodideAPI.loadedPackages=loadedPackages,PyodideAPI.ffi=ffi,PyodideAPI.setStdin=setStdin,PyodideAPI.setStdout=setStdout,PyodideAPI.setStderr=setStderr,PyodideAPI.globals={},PyodideAPI.FS={},PyodideAPI.PATH={},PyodideAPI.canvas=canvas,PyodideAPI.ERRNO_CODES={},PyodideAPI.pyodide_py={},API.makePublicAPI=function(){let d=Object.getOwnPropertyDescriptors(PyodideAPI);delete d.prototype;const pyodideAPI=Object.create({},d);return API.public_api=pyodideAPI,pyodideAPI.FS=Module.FS,pyodideAPI.PATH=Module.PATH,pyodideAPI.ERRNO_CODES=Module.ERRNO_CODES,pyodideAPI._module=Module,pyodideAPI._api=API,pyodideAPI},exports.PyodideAPI=PyodideAPI,Object.defineProperty(exports,"__esModule",{value:!0})}({})}const API=Module.API;const Hiwire={};const Tests={};API.tests=Tests;API.version="0.23.2";Module.hiwire=Hiwire;const getTypeTag=x=>Object.prototype.toString.call(x);API.getTypeTag=getTypeTag;pyodide_js_init();function descr_set_trampoline_call(set,obj,value,closure){return wasmTable.get(set)(obj,value,closure)}descr_set_trampoline_call.sig="iiiii";function descr_get_trampoline_call(get,obj,closure){return wasmTable.get(get)(obj,closure)}descr_get_trampoline_call.sig="iiii";function _PyCFunctionWithKeywords_TrampolineCall(func,self,args,kw){return wasmTable.get(func)(self,args,kw)}_PyCFunctionWithKeywords_TrampolineCall.sig="iiiii";function _PyImport_InitFunc_TrampolineCall(func){return wasmTable.get(func)()}_PyImport_InitFunc_TrampolineCall.sig="ii";function _Py_emscripten_runtime(){var info;if(typeof navigator=="object"){info=navigator.userAgent}else if(typeof process=="object"){info="Node.js ".concat(process.version)}else{info="UNKNOWN"}var len=lengthBytesUTF8(info)+1;var res=_malloc(len);if(res)stringToUTF8(info,res,len);return res}_Py_emscripten_runtime.sig="i";function _Py_CheckEmscriptenSignals_Helper(){if(!Module.Py_EmscriptenSignalBuffer){return 0}try{let result=Module.Py_EmscriptenSignalBuffer[0];Module.Py_EmscriptenSignalBuffer[0]=0;return result}catch(e){return 0}}_Py_CheckEmscriptenSignals_Helper.sig="i";function unbox_small_structs(type_ptr){var type_id=HEAPU16[(type_ptr+6>>1)+0];while(type_id===13){var elements=HEAPU32[(type_ptr+8>>2)+0];var first_element=HEAPU32[(elements>>2)+0];if(first_element===0){type_id=0;break}else if(HEAPU32[(elements>>2)+1]===0){type_ptr=first_element;type_id=HEAPU16[(first_element+6>>1)+0]}else{break}}return[type_ptr,type_id]}function ffi_call_js(cif,fn,rvalue,avalue){var abi=HEAPU32[(cif>>2)+0];var nargs=HEAPU32[(cif>>2)+1];var nfixedargs=HEAPU32[(cif>>2)+6];var arg_types_ptr=HEAPU32[(cif>>2)+2];var rtype_unboxed=unbox_small_structs(HEAPU32[(cif>>2)+3]);var rtype_ptr=rtype_unboxed[0];var rtype_id=rtype_unboxed[1];var orig_stack_ptr=stackSave();var cur_stack_ptr=orig_stack_ptr;var args=[];var ret_by_arg=false;if(rtype_id===15){throw new Error("complex ret marshalling nyi")}if(rtype_id<0||rtype_id>15){throw new Error("Unexpected rtype "+rtype_id)}if(rtype_id===4||rtype_id===13){args.push(rvalue);ret_by_arg=true}for(var i=0;i>2)+i];var arg_unboxed=unbox_small_structs(HEAPU32[(arg_types_ptr>>2)+i]);var arg_type_ptr=arg_unboxed[0];var arg_type_id=arg_unboxed[1];switch(arg_type_id){case 1:case 10:case 9:case 14:args.push(HEAPU32[(arg_ptr>>2)+0]);break;case 2:args.push(HEAPF32[(arg_ptr>>2)+0]);break;case 3:args.push(HEAPF64[(arg_ptr>>3)+0]);break;case 5:args.push(HEAPU8[arg_ptr+0]);break;case 6:args.push(HEAP8[arg_ptr+0]);break;case 7:args.push(HEAPU16[(arg_ptr>>1)+0]);break;case 8:args.push(HEAP16[(arg_ptr>>1)+0]);break;case 11:case 12:args.push(HEAPU64[(arg_ptr>>3)+0]);break;case 4:args.push(HEAPU64[(arg_ptr>>3)+0]);args.push(HEAPU64[(arg_ptr>>3)+1]);break;case 13:var size=HEAPU32[(arg_type_ptr>>2)+0];var align=HEAPU16[(arg_type_ptr+4>>1)+0];cur_stack_ptr-=size,cur_stack_ptr&=~(align-1);HEAP8.subarray(cur_stack_ptr,cur_stack_ptr+size).set(HEAP8.subarray(arg_ptr,arg_ptr+size));args.push(cur_stack_ptr);break;case 15:throw new Error("complex marshalling nyi");default:throw new Error("Unexpected type "+arg_type_id)}}if(nfixedargs!=nargs){var struct_arg_info=[];for(var i=nargs-1;i>=nfixedargs;i--){var arg_ptr=HEAPU32[(avalue>>2)+i];var arg_unboxed=unbox_small_structs(HEAPU32[(arg_types_ptr>>2)+i]);var arg_type_ptr=arg_unboxed[0];var arg_type_id=arg_unboxed[1];switch(arg_type_id){case 5:case 6:cur_stack_ptr-=1,cur_stack_ptr&=~(1-1);HEAPU8[cur_stack_ptr+0]=HEAPU8[arg_ptr+0];break;case 7:case 8:cur_stack_ptr-=2,cur_stack_ptr&=~(2-1);HEAPU16[(cur_stack_ptr>>1)+0]=HEAPU16[(arg_ptr>>1)+0];break;case 1:case 9:case 10:case 14:case 2:cur_stack_ptr-=4,cur_stack_ptr&=~(4-1);HEAPU32[(cur_stack_ptr>>2)+0]=HEAPU32[(arg_ptr>>2)+0];break;case 3:case 11:case 12:cur_stack_ptr-=8,cur_stack_ptr&=~(8-1);HEAPU32[(cur_stack_ptr>>2)+0]=HEAPU32[(arg_ptr>>2)+0];HEAPU32[(cur_stack_ptr>>2)+1]=HEAPU32[(arg_ptr>>2)+1];break;case 4:cur_stack_ptr-=16,cur_stack_ptr&=~(8-1);HEAPU32[(cur_stack_ptr>>2)+0]=HEAPU32[(arg_ptr>>2)+0];HEAPU32[(cur_stack_ptr>>2)+1]=HEAPU32[(arg_ptr>>2)+1];HEAPU32[(cur_stack_ptr>>2)+2]=HEAPU32[(arg_ptr>>2)+2];HEAPU32[(cur_stack_ptr>>2)+3]=HEAPU32[(arg_ptr>>2)+3];break;case 13:cur_stack_ptr-=4,cur_stack_ptr&=~(4-1);struct_arg_info.push([cur_stack_ptr,arg_ptr,HEAPU32[(arg_type_ptr>>2)+0],HEAPU16[(arg_type_ptr+4>>1)+0]]);break;case 15:throw new Error("complex arg marshalling nyi");default:throw new Error("Unexpected argtype "+arg_type_id)}}args.push(cur_stack_ptr);for(var i=0;i>2)+0]=cur_stack_ptr}}stackRestore(cur_stack_ptr);stackAlloc(0);var result=(0,getWasmTableEntry(fn).apply(null,args));stackRestore(orig_stack_ptr);if(ret_by_arg){return}switch(rtype_id){case 0:break;case 1:case 9:case 10:case 14:HEAPU32[(rvalue>>2)+0]=result;break;case 2:HEAPF32[(rvalue>>2)+0]=result;break;case 3:HEAPF64[(rvalue>>3)+0]=result;break;case 5:case 6:HEAPU8[rvalue+0]=result;break;case 7:case 8:HEAPU16[(rvalue>>1)+0]=result;break;case 11:case 12:HEAPU64[(rvalue>>3)+0]=result;break;case 15:throw new Error("complex ret marshalling nyi");default:throw new Error("Unexpected rtype "+rtype_id)}}ffi_call_js.sig="viiii";function ffi_closure_alloc_js(size,code){var closure=_malloc(size);var index=getEmptyTableSlot();HEAPU32[(code>>2)+0]=index;HEAPU32[(closure>>2)+0]=index;return closure}ffi_closure_alloc_js.sig="iii";function ffi_closure_free_js(closure){var index=HEAPU32[(closure>>2)+0];freeTableIndexes.push(index);_free(closure)}ffi_closure_free_js.sig="vi";function ffi_prep_closure_loc_js(closure,cif,fun,user_data,codeloc){var abi=HEAPU32[(cif>>2)+0];var nargs=HEAPU32[(cif>>2)+1];var nfixedargs=HEAPU32[(cif>>2)+6];var arg_types_ptr=HEAPU32[(cif>>2)+2];var rtype_unboxed=unbox_small_structs(HEAPU32[(cif>>2)+3]);var rtype_ptr=rtype_unboxed[0];var rtype_id=rtype_unboxed[1];var sig;var ret_by_arg=false;switch(rtype_id){case 0:sig="v";break;case 13:case 4:sig="vi";ret_by_arg=true;break;case 1:case 5:case 6:case 7:case 8:case 9:case 10:case 14:sig="i";break;case 2:sig="f";break;case 3:sig="d";break;case 11:case 12:sig="j";break;case 15:throw new Error("complex ret marshalling nyi");default:throw new Error("Unexpected rtype "+rtype_id)}var unboxed_arg_type_id_list=[];var unboxed_arg_type_info_list=[];for(var i=0;i>2)+i]);var arg_type_ptr=arg_unboxed[0];var arg_type_id=arg_unboxed[1];unboxed_arg_type_id_list.push(arg_type_id);unboxed_arg_type_info_list.push([HEAPU32[(arg_type_ptr>>2)+0],HEAPU16[(arg_type_ptr+4>>1)+0]])}for(var i=0;i>2)+carg_idx]=cur_ptr;HEAPU8[cur_ptr+0]=cur_arg;break;case 7:case 8:cur_ptr-=2,cur_ptr&=~(4-1);HEAPU32[(args_ptr>>2)+carg_idx]=cur_ptr;HEAPU16[(cur_ptr>>1)+0]=cur_arg;break;case 1:case 9:case 10:case 14:cur_ptr-=4,cur_ptr&=~(4-1);HEAPU32[(args_ptr>>2)+carg_idx]=cur_ptr;HEAPU32[(cur_ptr>>2)+0]=cur_arg;break;case 13:cur_ptr-=arg_size,cur_ptr&=~(arg_align-1);HEAP8.subarray(cur_ptr,cur_ptr+arg_size).set(HEAP8.subarray(cur_arg,cur_arg+arg_size));HEAPU32[(args_ptr>>2)+carg_idx]=cur_ptr;break;case 2:cur_ptr-=4,cur_ptr&=~(4-1);HEAPU32[(args_ptr>>2)+carg_idx]=cur_ptr;HEAPF32[(cur_ptr>>2)+0]=cur_arg;break;case 3:cur_ptr-=8,cur_ptr&=~(8-1);HEAPU32[(args_ptr>>2)+carg_idx]=cur_ptr;HEAPF64[(cur_ptr>>3)+0]=cur_arg;break;case 11:case 12:cur_ptr-=8,cur_ptr&=~(8-1);HEAPU32[(args_ptr>>2)+carg_idx]=cur_ptr;HEAPU64[(cur_ptr>>3)+0]=cur_arg;break;case 4:cur_ptr-=16,cur_ptr&=~(8-1);HEAPU32[(args_ptr>>2)+carg_idx]=cur_ptr;HEAPU64[(cur_ptr>>3)+0]=cur_arg;cur_arg=args[jsarg_idx++];HEAPU64[(cur_ptr>>3)+1]=cur_arg;break}}var varargs=args[args.length-1];for(;carg_idx>2)+0];cur_ptr-=arg_size,cur_ptr&=~(arg_align-1);HEAP8.subarray(cur_ptr,cur_ptr+arg_size).set(HEAP8.subarray(struct_ptr,struct_ptr+arg_size));HEAPU32[(args_ptr>>2)+carg_idx]=cur_ptr}else{HEAPU32[(args_ptr>>2)+carg_idx]=varargs}varargs+=4}stackRestore(cur_ptr);stackAlloc(0);0;getWasmTableEntry(HEAPU32[(closure>>2)+2])(HEAPU32[(closure>>2)+1],ret_ptr,args_ptr,HEAPU32[(closure>>2)+3]);stackRestore(orig_stack_ptr);if(!ret_by_arg){switch(sig[0]){case"i":return HEAPU32[(ret_ptr>>2)+0];case"j":return HEAPU64[(ret_ptr>>3)+0];case"d":return HEAPF64[(ret_ptr>>3)+0];case"f":return HEAPF32[(ret_ptr>>2)+0]}}}try{var wasm_trampoline=convertJsFunctionToWasm(trampoline,sig)}catch(e){return 1}setWasmTableEntry(codeloc,wasm_trampoline);HEAPU32[(closure>>2)+1]=cif;HEAPU32[(closure>>2)+2]=fun;HEAPU32[(closure>>2)+3]=user_data;return 0}ffi_prep_closure_loc_js.sig="iiiiii";function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}Module["ExitStatus"]=ExitStatus;var GOT={};Module["GOT"]=GOT;var CurrentModuleWeakSymbols=new Set([]);Module["CurrentModuleWeakSymbols"]=CurrentModuleWeakSymbols;var GOTHandler={get:function(obj,symName){var rtn=GOT[symName];if(!rtn){rtn=GOT[symName]=new WebAssembly.Global({"value":"i32","mutable":true})}if(!CurrentModuleWeakSymbols.has(symName)){rtn.required=true}return rtn}};Module["GOTHandler"]=GOTHandler;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}Module["callRuntimeCallbacks"]=callRuntimeCallbacks;var wasmTableMirror=[];Module["wasmTableMirror"]=wasmTableMirror;function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}Module["getWasmTableEntry"]=getWasmTableEntry;function exception_decRef(info){if(info.release_ref()&&!info.get_rethrown()){var destructor=info.get_destructor();if(destructor){getWasmTableEntry(destructor)(info.excPtr)}___cxa_free_exception(info.excPtr)}}Module["exception_decRef"]=exception_decRef;function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}Module["ExceptionInfo"]=ExceptionInfo;function ___cxa_decrement_exception_refcount(ptr){if(!ptr)return;exception_decRef(new ExceptionInfo(ptr))}Module["___cxa_decrement_exception_refcount"]=___cxa_decrement_exception_refcount;___cxa_decrement_exception_refcount.sig="vp";function decrementExceptionRefcount(ptr){___cxa_decrement_exception_refcount(ptr)}Module["decrementExceptionRefcount"]=decrementExceptionRefcount;function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}Module["withStackSave"]=withStackSave;function demangle(func){demangle.recursionGuard=(demangle.recursionGuard|0)+1;if(demangle.recursionGuard>1)return func;return withStackSave(function(){try{var s=func;if(s.startsWith("__Z"))s=s.substr(1);var len=lengthBytesUTF8(s)+1;var buf=stackAlloc(len);stringToUTF8(s,buf,len);var status=stackAlloc(4);var ret=___cxa_demangle(buf,0,0,status);if(HEAP32[status>>2]===0&&ret){return UTF8ToString(ret)}}catch(e){}finally{_free(ret);if(demangle.recursionGuard<2)--demangle.recursionGuard}return func})}Module["demangle"]=demangle;function getDylinkMetadata(binary){var offset=0;var end=0;function getU8(){return binary[offset++]}function getLEB(){var ret=0;var mul=1;while(1){var byte=binary[offset++];ret+=(byte&127)*mul;mul*=128;if(!(byte&128))break}return ret}function getString(){var len=getLEB();offset+=len;return UTF8ArrayToString(binary,offset-len,len)}function failIf(condition,message){if(condition)throw new Error(message)}var name="dylink.0";if(binary instanceof WebAssembly.Module){var dylinkSection=WebAssembly.Module.customSections(binary,name);if(dylinkSection.length===0){name="dylink";dylinkSection=WebAssembly.Module.customSections(binary,name)}failIf(dylinkSection.length===0,"need dylink section");binary=new Uint8Array(dylinkSection[0]);end=binary.length}else{var int32View=new Uint32Array(new Uint8Array(binary.subarray(0,24)).buffer);var magicNumberFound=int32View[0]==1836278016;failIf(!magicNumberFound,"need to see wasm magic number");failIf(binary[8]!==0,"need the dylink section to be first");offset=9;var section_size=getLEB();end=offset+section_size;name=getString()}var customSection={neededDynlibs:[],tlsExports:new Set,weakImports:new Set};if(name=="dylink"){customSection.memorySize=getLEB();customSection.memoryAlign=getLEB();customSection.tableSize=getLEB();customSection.tableAlign=getLEB();var neededDynlibsCount=getLEB();for(var i=0;i>2];var message_addr=HEAPU32[message_addr_addr>>2];var type=UTF8ToString(type_addr);_free(type_addr);var message;if(message_addr){message=UTF8ToString(message_addr);_free(message_addr)}return[type,message]})}Module["getExceptionMessageCommon"]=getExceptionMessageCommon;function getExceptionMessage(ptr){return getExceptionMessageCommon(ptr)}Module["getExceptionMessage"]=getExceptionMessage;function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP64[ptr>>3];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort("invalid type for getValue: "+type)}}Module["getValue"]=getValue;function exception_addRef(info){info.add_ref()}Module["exception_addRef"]=exception_addRef;function ___cxa_increment_exception_refcount(ptr){if(!ptr)return;exception_addRef(new ExceptionInfo(ptr))}Module["___cxa_increment_exception_refcount"]=___cxa_increment_exception_refcount;___cxa_increment_exception_refcount.sig="vp";function incrementExceptionRefcount(ptr){___cxa_increment_exception_refcount(ptr)}Module["incrementExceptionRefcount"]=incrementExceptionRefcount;function asmjsMangle(x){var unmangledSymbols=["stackAlloc","stackSave","stackRestore","getTempRet0","setTempRet0"];return x.indexOf("dynCall_")==0||unmangledSymbols.includes(x)?x:"_"+x}Module["asmjsMangle"]=asmjsMangle;function isSymbolDefined(symName){var existing=wasmImports[symName];if(!existing||existing.stub){return false}return true}Module["isSymbolDefined"]=isSymbolDefined;function mergeLibSymbols(exports,libName){for(var sym in exports){if(!exports.hasOwnProperty(sym)){continue}const setImport=target=>{if(!isSymbolDefined(target)){wasmImports[target]=exports[sym]}};setImport(sym);const main_alias="__main_argc_argv";if(sym=="main"){setImport(main_alias)}if(sym==main_alias){setImport("main")}if(sym.startsWith("dynCall_")&&!Module.hasOwnProperty(sym)){Module[sym]=exports[sym]}}}Module["mergeLibSymbols"]=mergeLibSymbols;function newDSO(name,handle,syms){var dso={refcount:Infinity,name:name,module:syms,global:true};LDSO.loadedLibsByName[name]=dso;if(handle!=undefined){LDSO.loadedLibsByHandle[handle]=dso}return dso}Module["newDSO"]=newDSO;var LDSO={loadedLibsByName:{},loadedLibsByHandle:{},init:()=>newDSO("__main__",0,wasmImports)};Module["LDSO"]=LDSO;var ___heap_base=9186144;Module["___heap_base"]=___heap_base;function zeroMemory(address,size){HEAPU8.fill(0,address,address+size);return address}Module["zeroMemory"]=zeroMemory;function getMemory(size){if(runtimeInitialized){return zeroMemory(_malloc(size),size)}var ret=___heap_base;var end=ret+size+15&-16;___heap_base=end;GOT["__heap_base"].value=end;return ret}Module["getMemory"]=getMemory;function isInternalSym(symName){return["__cpp_exception","__c_longjmp","__wasm_apply_data_relocs","__dso_handle","__tls_size","__tls_align","__set_stack_limits","_emscripten_tls_init","__wasm_init_tls","__wasm_call_ctors","__start_em_asm","__stop_em_asm"].includes(symName)}Module["isInternalSym"]=isInternalSym;function uleb128Encode(n,target){if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}}Module["uleb128Encode"]=uleb128Encode;function sigToWasmTypes(sig){var typeNames={"i":"i32","j":"i32","f":"f32","d":"f64","p":"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i>0];if(firstLoad){var memAlign=Math.pow(2,metadata.memoryAlign);memAlign=Math.max(memAlign,16);var memoryBase=metadata.memorySize?alignMemory(getMemory(metadata.memorySize+memAlign),memAlign):0;var tableBase=metadata.tableSize?wasmTable.length:0;if(handle){HEAP8[handle+8>>0]=1;HEAPU32[handle+12>>2]=memoryBase;HEAP32[handle+16>>2]=metadata.memorySize;HEAPU32[handle+20>>2]=tableBase;HEAP32[handle+24>>2]=metadata.tableSize}}else{memoryBase=HEAPU32[handle+12>>2];tableBase=HEAPU32[handle+20>>2]}var tableGrowthNeeded=tableBase+metadata.tableSize-wasmTable.length;if(tableGrowthNeeded>0){wasmTable.grow(tableGrowthNeeded)}var moduleExports;function resolveSymbol(sym){var resolved=resolveGlobalSymbol(sym).sym;if(!resolved){resolved=moduleExports[sym]}return resolved}var proxyHandler={"get":function(stubs,prop){switch(prop){case"__memory_base":return memoryBase;case"__table_base":return tableBase}if(prop in wasmImports&&!wasmImports[prop].stub){return wasmImports[prop]}if(!(prop in stubs)){var resolved;stubs[prop]=function(){if(!resolved)resolved=resolveSymbol(prop);return resolved.apply(null,arguments)}}return stubs[prop]}};var proxy=new Proxy({},proxyHandler);var info={"GOT.mem":new Proxy({},GOTHandler),"GOT.func":new Proxy({},GOTHandler),"env":proxy,wasi_snapshot_preview1:proxy};function postInstantiation(instance){updateTableMap(tableBase,metadata.tableSize);moduleExports=relocateExports(instance.exports,memoryBase);if(!flags.allowUndefined){reportUndefinedSymbols()}function addEmAsm(addr,body){var args=[];var arity=0;for(;arity<16;arity++){if(body.indexOf("$"+arity)!=-1){args.push("$"+arity)}else{break}}args=args.join(",");var func="("+args+" ) => { "+body+"};";ASM_CONSTS[start]=eval(func)}if("__start_em_asm"in moduleExports){var start=moduleExports["__start_em_asm"];var stop=moduleExports["__stop_em_asm"];while(startresolve(new Uint8Array(data)),reject)})}if(!readBinary){throw new Error(libFile+": file not found, and synchronous loading of external files is not available")}return readBinary(libFile)}function getLibModule(){if(typeof preloadedWasm!="undefined"&&preloadedWasm[lib]){var libModule=preloadedWasm[lib];return flags.loadAsync?Promise.resolve(libModule):libModule}if(flags.loadAsync){return loadLibData(lib).then(function(libData){return loadWebAssemblyModule(libData,flags,handle)})}return loadWebAssemblyModule(loadLibData(lib),flags,handle)}function moduleLoaded(libModule){if(dso.global){mergeLibSymbols(libModule,lib)}dso.module=libModule}if(flags.loadAsync){return getLibModule().then(function(libModule){moduleLoaded(libModule);return true})}moduleLoaded(getLibModule());return true}Module["loadDynamicLibrary"]=loadDynamicLibrary;function reportUndefinedSymbols(){for(var symName in GOT){if(GOT[symName].value==0){var value=resolveGlobalSymbol(symName,true).sym;if(!value&&!GOT[symName].required){continue}if(typeof value=="function"){GOT[symName].value=addFunction(value,value.sig)}else if(typeof value=="number"){GOT[symName].value=value}else{throw new Error("bad export type for `"+symName+"`: "+typeof value)}}}}Module["reportUndefinedSymbols"]=reportUndefinedSymbols;function preloadDylibs(){if(!dynamicLibraries.length){reportUndefinedSymbols();return}addRunDependency("preloadDylibs");dynamicLibraries.reduce(function(chain,lib){return chain.then(function(){return loadDynamicLibrary(lib,{loadAsync:true,global:true,nodelete:true,allowUndefined:true})})},Promise.resolve()).then(function(){reportUndefinedSymbols();removeRunDependency("preloadDylibs")})}Module["preloadDylibs"]=preloadDylibs;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function jsStackTrace(){var error=new Error;if(!error.stack){try{throw new Error}catch(e){error=e}if(!error.stack){return"(no stack trace available)"}}return error.stack.toString()}Module["jsStackTrace"]=jsStackTrace;function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}Module["demangleAll"]=demangleAll;function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}Module["stackTrace"]=stackTrace;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}Module["___assert_fail"]=___assert_fail;___assert_fail.sig="vppip";function ___call_sighandler(fp,sig){getWasmTableEntry(fp)(sig)}Module["___call_sighandler"]=___call_sighandler;___call_sighandler.sig="vpi";var exceptionCaught=[];Module["exceptionCaught"]=exceptionCaught;var uncaughtExceptionCount=0;Module["uncaughtExceptionCount"]=uncaughtExceptionCount;function ___cxa_begin_catch(ptr){var info=new ExceptionInfo(ptr);if(!info.get_caught()){info.set_caught(true);uncaughtExceptionCount--}info.set_rethrown(false);exceptionCaught.push(info);exception_addRef(info);return info.get_exception_ptr()}Module["___cxa_begin_catch"]=___cxa_begin_catch;___cxa_begin_catch.sig="pp";function ___cxa_current_primary_exception(){if(!exceptionCaught.length){return 0}var info=exceptionCaught[exceptionCaught.length-1];exception_addRef(info);return info.excPtr}Module["___cxa_current_primary_exception"]=___cxa_current_primary_exception;var exceptionLast=0;Module["exceptionLast"]=exceptionLast;function ___cxa_end_catch(){_setThrew(0);var info=exceptionCaught.pop();exception_decRef(info);exceptionLast=0}Module["___cxa_end_catch"]=___cxa_end_catch;___cxa_end_catch.sig="v";function ___resumeException(ptr){if(!exceptionLast){exceptionLast=ptr}throw ptr}Module["___resumeException"]=___resumeException;___resumeException.sig="vp";function ___cxa_find_matching_catch(){var thrown=exceptionLast;if(!thrown){setTempRet0(0);return 0}var info=new ExceptionInfo(thrown);info.set_adjusted_ptr(thrown);var thrownType=info.get_type();if(!thrownType){setTempRet0(0);return thrown}for(var i=0;ipath.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};Module["PATH"]=PATH;function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return()=>{crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return()=>crypto_module["randomBytes"](1)[0]}catch(e){}}return()=>abort("randomDevice")}Module["getRandomDevice"]=getRandomDevice;var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};Module["TTY"]=TTY;function mmapAlloc(size){size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)}Module["mmapAlloc"]=mmapAlloc;var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)}Module["asyncLoad"]=asyncLoad;var IDBFS={dbs:{},indexedDB:()=>{if(typeof indexedDB!="undefined")return indexedDB;var ret=null;if(typeof window=="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function(mount){return MEMFS.mount.apply(null,arguments)},syncfs:(mount,populate,callback)=>{IDBFS.getLocalSet(mount,(err,local)=>{if(err)return callback(err);IDBFS.getRemoteSet(mount,(err,remote)=>{if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},quit:()=>{Object.values(IDBFS.dbs).forEach(value=>value.close());IDBFS.dbs={}},getDB:(name,callback)=>{var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=e=>{var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}};req.onsuccess=()=>{db=req.result;IDBFS.dbs[name]=db;callback(null,db)};req.onerror=e=>{callback(this.error);e.preventDefault()}},getLocalSet:(mount,callback)=>{var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return p=>{return PATH.join2(root,p)}}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={"timestamp":stat.mtime}}return callback(null,{type:"local",entries:entries})},getRemoteSet:(mount,callback)=>{var entries={};IDBFS.getDB(mount.mountpoint,(err,db)=>{if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=e=>{callback(this.error);e.preventDefault()};var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=event=>{var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={"timestamp":cursor.key};cursor.continue()}}catch(e){return callback(e)}})},loadLocalEntry:(path,callback)=>{var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{"timestamp":stat.mtime,"mode":stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{"timestamp":stat.mtime,"mode":stat.mode,"contents":node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:(path,entry,callback)=>{try{if(FS.isDir(entry["mode"])){FS.mkdirTree(path,entry["mode"])}else if(FS.isFile(entry["mode"])){FS.writeFile(path,entry["contents"],{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry["mode"]);FS.utime(path,entry["timestamp"],entry["timestamp"])}catch(e){return callback(e)}callback(null)},removeLocalEntry:(path,callback)=>{try{var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:(store,path,callback)=>{var req=store.get(path);req.onsuccess=event=>{callback(null,event.target.result)};req.onerror=e=>{callback(this.error);e.preventDefault()}},storeRemoteEntry:(store,path,entry,callback)=>{try{var req=store.put(entry,path)}catch(e){callback(e);return}req.onsuccess=()=>{callback(null)};req.onerror=e=>{callback(this.error);e.preventDefault()}},removeRemoteEntry:(store,path,callback)=>{var req=store.delete(path);req.onsuccess=()=>{callback(null)};req.onerror=e=>{callback(this.error);e.preventDefault()}},reconcile:(src,dst,callback)=>{var total=0;var create=[];Object.keys(src.entries).forEach(function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e["timestamp"].getTime()!=e2["timestamp"].getTime()){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(function(key){if(!src.entries[key]){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=e=>{done(this.error);e.preventDefault()};transaction.oncomplete=e=>{if(!errored){callback(null)}};create.sort().forEach(path=>{if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(err,entry)=>{if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,(err,entry)=>{if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(path=>{if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};Module["IDBFS"]=IDBFS;var ERRNO_CODES={};Module["ERRNO_CODES"]=ERRNO_CODES;var NODEFS={isWindows:false,staticInit:()=>{NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process.binding("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={1024:flags["O_APPEND"],64:flags["O_CREAT"],128:flags["O_EXCL"],256:flags["O_NOCTTY"],0:flags["O_RDONLY"],2:flags["O_RDWR"],4096:flags["O_SYNC"],512:flags["O_TRUNC"],1:flags["O_WRONLY"],131072:flags["O_NOFOLLOW"]}},convertNodeCode:e=>{var code=e.code;return ERRNO_CODES[code]},mount:mount=>{return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)},createNode:(parent,name,mode,dev)=>{if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(28)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node},getMode:path=>{var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}return stat.mode},realPath:node=>{var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)},flagsForNode:flags=>{flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;flags&=~65536;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(flags){throw new FS.ErrnoError(28)}return newFlags},node_ops:{getattr:node=>{var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr:(node,attr)=>{var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},lookup:(parent,name)=>{var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)},mknod:(parent,name,mode,dev)=>{var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}return node},rename:(oldNode,newDir,newName)=>{var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}oldNode.name=newName},unlink:(parent,name)=>{var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},rmdir:(parent,name)=>{var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},readdir:node=>{var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},symlink:(parent,newName,oldPath)=>{var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},readlink:node=>{var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=nodePath.relative(nodePath.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;if(e.code==="UNKNOWN")throw new FS.ErrnoError(28);throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}}},stream_ops:{open:stream=>{var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},close:stream=>{try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},read:(stream,buffer,offset,length,position)=>{if(length===0)return 0;try{return fs.readSync(stream.nfd,Buffer.from(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},write:(stream,buffer,offset,length,position)=>{try{return fs.writeSync(stream.nfd,Buffer.from(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},llseek:(stream,offset,whence)=>{var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap:(stream,length,position,prot,flags)=>{if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr=mmapAlloc(length);NODEFS.stream_ops.read(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}},msync:(stream,buffer,offset,length,mmapFlags)=>{NODEFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};Module["NODEFS"]=NODEFS;var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size},write:function(stream,buffer,offset,length,position){throw new FS.ErrnoError(29)},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(28)}return position}}};Module["WORKERFS"]=WORKERFS;var PROXYFS={mount:function(mount){return PROXYFS.createNode(null,"/",mount.opts.fs.lstat(mount.opts.root).mode,0)},createNode:function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=PROXYFS.node_ops;node.stream_ops=PROXYFS.stream_ops;return node},realPath:function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)},node_ops:{getattr:function(node){var path=PROXYFS.realPath(node);var stat;try{stat=node.mount.opts.fs.lstat(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr:function(node,attr){var path=PROXYFS.realPath(node);try{if(attr.mode!==undefined){node.mount.opts.fs.chmod(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);node.mount.opts.fs.utime(path,date,date)}if(attr.size!==undefined){node.mount.opts.fs.truncate(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},lookup:function(parent,name){try{var path=PATH.join2(PROXYFS.realPath(parent),name);var mode=parent.mount.opts.fs.lstat(path).mode;var node=PROXYFS.createNode(parent,name,mode);return node}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},mknod:function(parent,name,mode,dev){var node=PROXYFS.createNode(parent,name,mode,dev);var path=PROXYFS.realPath(node);try{if(FS.isDir(node.mode)){node.mount.opts.fs.mkdir(path,node.mode)}else{node.mount.opts.fs.writeFile(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node},rename:function(oldNode,newDir,newName){var oldPath=PROXYFS.realPath(oldNode);var newPath=PATH.join2(PROXYFS.realPath(newDir),newName);try{oldNode.mount.opts.fs.rename(oldPath,newPath);oldNode.name=newName;oldNode.parent=newDir}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},unlink:function(parent,name){var path=PATH.join2(PROXYFS.realPath(parent),name);try{parent.mount.opts.fs.unlink(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},rmdir:function(parent,name){var path=PATH.join2(PROXYFS.realPath(parent),name);try{parent.mount.opts.fs.rmdir(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},readdir:function(node){var path=PROXYFS.realPath(node);try{return node.mount.opts.fs.readdir(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},symlink:function(parent,newName,oldPath){var newPath=PATH.join2(PROXYFS.realPath(parent),newName);try{parent.mount.opts.fs.symlink(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},readlink:function(node){var path=PROXYFS.realPath(node);try{return node.mount.opts.fs.readlink(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}},stream_ops:{open:function(stream){var path=PROXYFS.realPath(stream.node);try{stream.nfd=stream.node.mount.opts.fs.open(path,stream.flags)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},close:function(stream){try{stream.node.mount.opts.fs.close(stream.nfd)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},read:function(stream,buffer,offset,length,position){try{return stream.node.mount.opts.fs.read(stream.nfd,buffer,offset,length,position)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},write:function(stream,buffer,offset,length,position){try{return stream.node.mount.opts.fs.write(stream.nfd,buffer,offset,length,position)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=stream.node.node_ops.getattr(stream.node);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}}};Module["PROXYFS"]=PROXYFS;var LZ4={DIR_MODE:16895,FILE_MODE:33279,CHUNK_SIZE:-1,codec:null,init:function(){if(LZ4.codec)return;LZ4.codec=function(){var MiniLZ4=function(){var exports={};exports.uncompress=function(input,output,sIdx,eIdx){sIdx=sIdx||0;eIdx=eIdx||input.length-sIdx;for(var i=sIdx,n=eIdx,j=0;i>4;if(literals_length>0){var l=literals_length+240;while(l===255){l=input[i++];literals_length+=l}var end=i+literals_length;while(ij)return-(i-2);var match_length=token&15;var l=match_length+240;while(l===255){l=input[i++];match_length+=l}var pos=j-offset;var end=j+match_length+4;while(jmaxInputSize?0:isize+isize/255+16|0};exports.compress=function(src,dst,sIdx,eIdx){hashTable.set(empty);return compressBlock(src,dst,0,sIdx||0,eIdx||dst.length)};function compressBlock(src,dst,pos,sIdx,eIdx){var dpos=sIdx;var dlen=eIdx-sIdx;var anchor=0;if(src.length>=maxInputSize)throw new Error("input too large");if(src.length>mfLimit){var n=exports.compressBound(src.length);if(dlen>>hashShift;var ref=hashTable[hash]-1;hashTable[hash]=pos+1;if(ref<0||pos-ref>>>16>0||((src[ref+3]<<8|src[ref+2])!=sequenceHighBits||(src[ref+1]<<8|src[ref])!=sequenceLowBits)){step=findMatchAttempts++>>skipStrength;pos+=step;continue}findMatchAttempts=(1<=runMask){dst[dpos++]=(runMask<254;len-=255){dst[dpos++]=255}dst[dpos++]=len}else{dst[dpos++]=(literals_length<>8;if(match_length>=mlMask){match_length-=mlMask;while(match_length>=255){match_length-=255;dst[dpos++]=255}dst[dpos++]=match_length}anchor=pos}}if(anchor==0)return 0;literals_length=src.length-anchor;if(literals_length>=runMask){dst[dpos++]=runMask<254;ln-=255){dst[dpos++]=255}dst[dpos++]=ln}else{dst[dpos++]=literals_length<0){assert(compressedSize<=bound);compressed=compressed.subarray(0,compressedSize);compressedChunks.push(compressed);total+=compressedSize;successes.push(1);if(verify){var back=exports.uncompress(compressed,temp);assert(back===chunk.length,[back,chunk.length]);for(var i=0;i=0){currChunk=compressedData["cachedChunks"][found]}else{compressedData["cachedIndexes"].pop();compressedData["cachedIndexes"].unshift(chunkIndex);currChunk=compressedData["cachedChunks"].pop();compressedData["cachedChunks"].unshift(currChunk);if(compressedData["debug"]){out("decompressing chunk "+chunkIndex);Module["decompressedChunks"]=(Module["decompressedChunks"]||0)+1}var compressed=compressedData["data"].subarray(compressedStart,compressedStart+compressedSize);var originalSize=LZ4.codec.uncompress(compressed,currChunk);if(chunkIndex{path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS,"PROXYFS":PROXYFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;_fflush(0);for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload=(()=>{}),onerror=(()=>{}))=>{var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload=(()=>{}),onerror=(()=>{}))=>{var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};Module["FS"]=FS;var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];HEAPU32[buf+96>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+104>>2]=tempI64[0],HEAP32[buf+108>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};Module["SYSCALLS"]=SYSCALLS;function ___syscall__newselect(nfds,readfds,writefds,exceptfds,timeout){try{var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);var check=function(fd,low,high,val){return fd<32?low&val:high&val};for(var fd=0;fd>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall__newselect"]=___syscall__newselect;var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data)}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i>2]=value;return value}Module["setErrNo"]=setErrNo;var Sockets={BUFFER_SIZE:10240,MAX_BUFFER_SIZE:10485760,nextFd:1,fds:{},nextport:1,maxport:65535,peer:null,connections:{},portmap:{},localAddr:4261412874,addrPool:[33554442,50331658,67108874,83886090,100663306,117440522,134217738,150994954,167772170,184549386,201326602,218103818,234881034]};Module["Sockets"]=Sockets;function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}Module["inetPton4"]=inetPton4;function jstoi_q(str){return parseInt(str)}Module["jstoi_q"]=jstoi_q;function inetPton6(str){var words;var w,offset,z,i;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0}Module["writeSockaddr"]=writeSockaddr;var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};Module["DNS"]=DNS;function ___syscall_accept4(fd,addr,addrlen,flags){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_accept4"]=___syscall_accept4;function inetNtop4(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}Module["inetNtop4"]=inetNtop4;function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}Module["readSockaddr"]=readSockaddr;function getSocketAddress(addrp,addrlen,allowNull){if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}Module["getSocketAddress"]=getSocketAddress;function ___syscall_bind(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_bind"]=___syscall_bind;___syscall_bind.sig="iipi";function ___syscall_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_chdir"]=___syscall_chdir;___syscall_chdir.sig="ip";function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_chmod"]=___syscall_chmod;___syscall_chmod.sig="ipi";function ___syscall_connect(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_connect"]=___syscall_connect;___syscall_connect.sig="iipi";function ___syscall_dup(fd){try{var old=SYSCALLS.getStreamFromFD(fd);return FS.createStream(old,0).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_dup"]=___syscall_dup;___syscall_dup.sig="ii";function ___syscall_dup3(fd,suggestFD,flags){try{var old=SYSCALLS.getStreamFromFD(fd);if(old.fd===suggestFD)return-28;var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.createStream(old,suggestFD,suggestFD+1).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_dup3"]=___syscall_dup3;function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_faccessat"]=___syscall_faccessat;___syscall_faccessat.sig="iipii";function ___syscall_fadvise64(fd,offset,len,advice){return 0}Module["___syscall_fadvise64"]=___syscall_fadvise64;var MAX_INT53=9007199254740992;Module["MAX_INT53"]=MAX_INT53;var MIN_INT53=-9007199254740992;Module["MIN_INT53"]=MIN_INT53;function bigintToI53Checked(num){return numMAX_INT53?NaN:Number(num)}Module["bigintToI53Checked"]=bigintToI53Checked;function ___syscall_fallocate(fd,mode,offset,len){try{offset=bigintToI53Checked(offset);if(isNaN(offset))return-61;len=bigintToI53Checked(len);if(isNaN(len))return-61;var stream=SYSCALLS.getStreamFromFD(fd);FS.allocate(stream,offset,len);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fallocate"]=___syscall_fallocate;function ___syscall_fchdir(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.chdir(stream.path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchdir"]=___syscall_fchdir;function ___syscall_fchmod(fd,mode){try{FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchmod"]=___syscall_fchmod;function ___syscall_fchmodat(dirfd,path,mode,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchmodat"]=___syscall_fchmodat;___syscall_fchmodat.sig="iipip";function ___syscall_fchown32(fd,owner,group){try{FS.fchown(fd,owner,group);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchown32"]=___syscall_fchown32;function ___syscall_fchownat(dirfd,path,owner,group,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;flags=flags&~256;path=SYSCALLS.calculateAt(dirfd,path);(nofollow?FS.lchown:FS.chown)(path,owner,group);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchownat"]=___syscall_fchownat;___syscall_fchownat.sig="iipiii";function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fcntl64"]=___syscall_fcntl64;___syscall_fcntl64.sig="iiip";function ___syscall_fdatasync(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fdatasync"]=___syscall_fdatasync;function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fstat64"]=___syscall_fstat64;___syscall_fstat64.sig="iip";function ___syscall_statfs64(path,size,buf){try{path=SYSCALLS.getStr(path);HEAP32[buf+4>>2]=4096;HEAP32[buf+40>>2]=4096;HEAP32[buf+8>>2]=1e6;HEAP32[buf+12>>2]=5e5;HEAP32[buf+16>>2]=5e5;HEAP32[buf+20>>2]=FS.nextInode;HEAP32[buf+24>>2]=1e6;HEAP32[buf+28>>2]=42;HEAP32[buf+44>>2]=2;HEAP32[buf+36>>2]=255;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_statfs64"]=___syscall_statfs64;___syscall_statfs64.sig="ippp";function ___syscall_fstatfs64(fd,size,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return ___syscall_statfs64(0,size,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fstatfs64"]=___syscall_fstatfs64;function ___syscall_ftruncate64(fd,length){try{length=bigintToI53Checked(length);if(isNaN(length))return-61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_ftruncate64"]=___syscall_ftruncate64;___syscall_ftruncate64.sig="iij";function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_getdents64"]=___syscall_getdents64;___syscall_getdents64.sig="iipi";function ___syscall_getpeername(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);if(!sock.daddr){return-53}var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.daddr),sock.dport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_getpeername"]=___syscall_getpeername;function ___syscall_getsockname(fd,addr,addrlen){try{err("__syscall_getsockname "+fd);var sock=getSocketFromFD(fd);var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_getsockname"]=___syscall_getsockname;function ___syscall_getsockopt(fd,level,optname,optval,optlen){try{var sock=getSocketFromFD(fd);if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-50}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_getsockopt"]=___syscall_getsockopt;function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_ioctl"]=___syscall_ioctl;___syscall_ioctl.sig="iiip";function ___syscall_linkat(olddirfd,oldpath,newdirfd,newpath,flags){return-34}Module["___syscall_linkat"]=___syscall_linkat;function ___syscall_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_listen"]=___syscall_listen;function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_lstat64"]=___syscall_lstat64;___syscall_lstat64.sig="ipp";function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_mkdirat"]=___syscall_mkdirat;___syscall_mkdirat.sig="iipi";function ___syscall_mknodat(dirfd,path,mode,dev){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_mknodat"]=___syscall_mknodat;___syscall_mknodat.sig="iipii";function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_newfstatat"]=___syscall_newfstatat;___syscall_newfstatat.sig="iippi";function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_openat"]=___syscall_openat;___syscall_openat.sig="iipip";var PIPEFS={BUCKET_BUFFER_SIZE:8192,mount:function(mount){return FS.createNode(null,"/",16384|511,0)},createPipe:function(){var pipe={buckets:[],refcnt:2};pipe.buckets.push({buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0});var rName=PIPEFS.nextname();var wName=PIPEFS.nextname();var rNode=FS.createNode(PIPEFS.root,rName,4096,0);var wNode=FS.createNode(PIPEFS.root,wName,4096,0);rNode.pipe=pipe;wNode.pipe=pipe;var readableStream=FS.createStream({path:rName,node:rNode,flags:0,seekable:false,stream_ops:PIPEFS.stream_ops});rNode.stream=readableStream;var writableStream=FS.createStream({path:wName,node:wNode,flags:1,seekable:false,stream_ops:PIPEFS.stream_ops});wNode.stream=writableStream;return{readable_fd:readableStream.fd,writable_fd:writableStream.fd}},stream_ops:{poll:function(stream){var pipe=stream.node.pipe;if((stream.flags&2097155)===1){return 256|4}if(pipe.buckets.length>0){for(var i=0;i0){return 64|1}}}return 0},ioctl:function(stream,request,varargs){return 28},fsync:function(stream){return 28},read:function(stream,buffer,offset,length,position){var pipe=stream.node.pipe;var currentLength=0;for(var i=0;i=dataLen){currBucket.buffer.set(data,currBucket.offset);currBucket.offset+=dataLen;return dataLen}else if(freeBytesInCurrBuffer>0){currBucket.buffer.set(data.subarray(0,freeBytesInCurrBuffer),currBucket.offset);currBucket.offset+=freeBytesInCurrBuffer;data=data.subarray(freeBytesInCurrBuffer,data.byteLength)}var numBuckets=data.byteLength/PIPEFS.BUCKET_BUFFER_SIZE|0;var remElements=data.byteLength%PIPEFS.BUCKET_BUFFER_SIZE;for(var i=0;i0){var newBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:data.byteLength,roffset:0};pipe.buckets.push(newBucket);newBucket.buffer.set(data)}return dataLen},close:function(stream){var pipe=stream.node.pipe;pipe.refcnt--;if(pipe.refcnt===0){pipe.buckets=null}}},nextname:function(){if(!PIPEFS.nextname.current){PIPEFS.nextname.current=0}return"pipe["+PIPEFS.nextname.current+++"]"}};Module["PIPEFS"]=PIPEFS;function ___syscall_pipe(fdPtr){try{if(fdPtr==0){throw new FS.ErrnoError(21)}var res=PIPEFS.createPipe();HEAP32[fdPtr>>2]=res.readable_fd;HEAP32[fdPtr+4>>2]=res.writable_fd;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_pipe"]=___syscall_pipe;___syscall_pipe.sig="ip";function ___syscall_poll(fds,nfds,timeout){try{var nonzero=0;for(var i=0;i>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_poll"]=___syscall_poll;___syscall_poll.sig="ipii";function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_readlinkat"]=___syscall_readlinkat;___syscall_readlinkat.sig="vippp";function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_recvfrom"]=___syscall_recvfrom;function ___syscall_recvmsg(fd,message,flags){try{var sock=getSocketFromFD(fd);var iov=HEAPU32[message+8>>2];var num=HEAP32[message+12>>2];var total=0;for(var i=0;i>2]}var msg=sock.sock_ops.recvmsg(sock,total);if(!msg)return 0;var name=HEAPU32[message>>2];if(name){var errno=writeSockaddr(name,sock.family,DNS.lookup_name(msg.addr),msg.port)}var bytesRead=0;var bytesRemaining=msg.buffer.byteLength;for(var i=0;bytesRemaining>0&&i>2];var iovlen=HEAP32[iov+(8*i+4)>>2];if(!iovlen){continue}var length=Math.min(iovlen,bytesRemaining);var buf=msg.buffer.subarray(bytesRead,bytesRead+length);HEAPU8.set(buf,iovbase+bytesRead);bytesRead+=length;bytesRemaining-=length}return bytesRead}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_recvmsg"]=___syscall_recvmsg;function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_renameat"]=___syscall_renameat;___syscall_renameat.sig="iipip";function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_rmdir"]=___syscall_rmdir;___syscall_rmdir.sig="ip";function ___syscall_sendmsg(fd,message,flags){try{var sock=getSocketFromFD(fd);var iov=HEAPU32[message+8>>2];var num=HEAP32[message+12>>2];var addr,port;var name=HEAPU32[message>>2];var namelen=HEAP32[message+4>>2];if(name){var info=readSockaddr(name,namelen);if(info.errno)return-info.errno;port=info.port;addr=DNS.lookup_addr(info.addr)||info.addr}var total=0;for(var i=0;i>2]}var view=new Uint8Array(total);var offset=0;for(var i=0;i>2];var iovlen=HEAP32[iov+(8*i+4)>>2];for(var j=0;j>0]}}return sock.sock_ops.sendmsg(sock,view,0,total,addr,port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_sendmsg"]=___syscall_sendmsg;function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_sendto"]=___syscall_sendto;___syscall_sendto.sig="iipiipi";function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_socket"]=___syscall_socket;function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_stat64"]=___syscall_stat64;___syscall_stat64.sig="ipp";function ___syscall_symlink(target,linkpath){try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_symlink"]=___syscall_symlink;___syscall_symlink.sig="ipp";function ___syscall_symlinkat(target,newdirfd,linkpath){try{linkpath=SYSCALLS.calculateAt(newdirfd,linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_symlinkat"]=___syscall_symlinkat;function ___syscall_truncate64(path,length){try{length=bigintToI53Checked(length);if(isNaN(length))return-61;path=SYSCALLS.getStr(path);FS.truncate(path,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_truncate64"]=___syscall_truncate64;___syscall_truncate64.sig="ipj";function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_unlinkat"]=___syscall_unlinkat;___syscall_unlinkat.sig="iipi";function readI53FromI64(ptr){return HEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296}Module["readI53FromI64"]=readI53FromI64;function ___syscall_utimensat(dirfd,path,times,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path,true);if(!times){var atime=Date.now();var mtime=atime}else{var seconds=readI53FromI64(times);var nanoseconds=HEAP32[times+8>>2];atime=seconds*1e3+nanoseconds/(1e3*1e3);times+=16;seconds=readI53FromI64(times);nanoseconds=HEAP32[times+8>>2];mtime=seconds*1e3+nanoseconds/(1e3*1e3)}FS.utime(path,atime,mtime);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_utimensat"]=___syscall_utimensat;___syscall_utimensat.sig="iippi";var ___table_base=new WebAssembly.Global({"value":"i32","mutable":false},1);Module["___table_base"]=___table_base;var ENV={};Module["ENV"]=ENV;function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}Module["allocateUTF8OnStack"]=allocateUTF8OnStack;function dlSetError(msg){withStackSave(function(){var cmsg=allocateUTF8OnStack(msg);___dl_seterr(cmsg,0)})}Module["dlSetError"]=dlSetError;function dlopenInternal(handle,jsflags){var filename=UTF8ToString(handle+28);var flags=HEAP32[handle+4>>2];filename=PATH.normalize(filename);var searchpaths=[];var isValidFile=filename=>{var target=FS.findObject(filename);return target&&!target.isFolder&&!target.isDevice};if(!isValidFile(filename)){if(ENV["LD_LIBRARY_PATH"]){searchpaths=ENV["LD_LIBRARY_PATH"].split(":")}for(var ident in searchpaths){var searchfile=PATH.join2(searchpaths[ident],filename);if(isValidFile(searchfile)){filename=searchfile;break}}}var combinedFlags={global:Boolean(flags&256),nodelete:Boolean(flags&4096),loadAsync:jsflags.loadAsync,fs:jsflags.fs};if(jsflags.loadAsync){return loadDynamicLibrary(filename,combinedFlags,handle)}try{return loadDynamicLibrary(filename,combinedFlags,handle)}catch(e){dlSetError("Could not load dynamic lib: "+filename+"\n"+e);return 0}}Module["dlopenInternal"]=dlopenInternal;function __dlopen_js(handle){var jsflags={loadAsync:false,fs:FS};return dlopenInternal(handle,jsflags)}Module["__dlopen_js"]=__dlopen_js;__dlopen_js.sig="pp";function __dlsym_js(handle,symbol,symbolIndex){symbol=UTF8ToString(symbol);var result;var newSymIndex;var lib=LDSO.loadedLibsByHandle[handle];if(!lib.module.hasOwnProperty(symbol)){dlSetError('Tried to lookup unknown symbol "'+symbol+'" in dynamic lib: '+lib.name);return 0}newSymIndex=Object.keys(lib.module).indexOf(symbol);result=lib.module[symbol];if(typeof result=="function"){var addr=getFunctionAddress(result);if(addr){result=addr}else{result=addFunction(result,result.sig);HEAPU32[symbolIndex>>2]=newSymIndex}}return result}Module["__dlsym_js"]=__dlsym_js;__dlsym_js.sig="pppp";function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}Module["handleException"]=handleException;function callUserCallback(func){if(ABORT){return}try{func()}catch(e){handleException(e)}}Module["callUserCallback"]=callUserCallback;function __emscripten_dlopen_js(handle,onsuccess,onerror,user_data){function errorCallback(e){var filename=UTF8ToString(HEAPU32[handle+28>>2]);dlSetError("Could not load dynamic lib: "+filename+"\n"+e);callUserCallback(function(){getWasmTableEntry(onerror)(handle,user_data)})}function successCallback(){callUserCallback(function(){getWasmTableEntry(onsuccess)(handle,user_data)})}var promise=dlopenInternal(handle,{loadAsync:true});if(promise){promise.then(successCallback,errorCallback)}else{errorCallback()}}Module["__emscripten_dlopen_js"]=__emscripten_dlopen_js;__emscripten_dlopen_js.sig="vppp";function __emscripten_err(str){err(UTF8ToString(str))}Module["__emscripten_err"]=__emscripten_err;__emscripten_err.sig="vp";var nowIsMonotonic=true;Module["nowIsMonotonic"]=nowIsMonotonic;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}Module["__emscripten_get_now_is_monotonic"]=__emscripten_get_now_is_monotonic;__emscripten_get_now_is_monotonic.sig="i";function __emscripten_get_progname(str,len){stringToUTF8(thisProgram,str,len)}Module["__emscripten_get_progname"]=__emscripten_get_progname;__emscripten_get_progname.sig="vpp";function __emscripten_out(str){out(UTF8ToString(str))}Module["__emscripten_out"]=__emscripten_out;__emscripten_out.sig="vp";function __emscripten_throw_longjmp(){throw Infinity}Module["__emscripten_throw_longjmp"]=__emscripten_throw_longjmp;__emscripten_throw_longjmp.sig="v";function __gmtime_js(time,tmPtr){var date=new Date(readI53FromI64(time)*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}Module["__gmtime_js"]=__gmtime_js;__gmtime_js.sig="ipp";function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}Module["__isLeapYear"]=__isLeapYear;var __MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];Module["__MONTH_DAYS_LEAP_CUMULATIVE"]=__MONTH_DAYS_LEAP_CUMULATIVE;var __MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];Module["__MONTH_DAYS_REGULAR_CUMULATIVE"]=__MONTH_DAYS_REGULAR_CUMULATIVE;function __yday_from_date(date){var isLeapYear=__isLeapYear(date.getFullYear());var monthDaysCumulative=isLeapYear?__MONTH_DAYS_LEAP_CUMULATIVE:__MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday}Module["__yday_from_date"]=__yday_from_date;function __localtime_js(time,tmPtr){var date=new Date(readI53FromI64(time)*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=__yday_from_date(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}Module["__localtime_js"]=__localtime_js;__localtime_js.sig="ipp";function __mktime_js(tmPtr){var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=__yday_from_date(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getYear();return date.getTime()/1e3|0}Module["__mktime_js"]=__mktime_js;__mktime_js.sig="ip";function __mmap_js(len,prot,flags,fd,off,allocated,addr){try{var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,off,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["__mmap_js"]=__mmap_js;__mmap_js.sig="ipiiippp";function __msync_js(addr,len,prot,flags,fd,offset){try{SYSCALLS.doMsync(addr,SYSCALLS.getStreamFromFD(fd),len,flags,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["__msync_js"]=__msync_js;__msync_js.sig="ippiiip";function __munmap_js(addr,len,prot,flags,fd,offset){try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}FS.munmap(stream)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["__munmap_js"]=__munmap_js;__munmap_js.sig="ippiiip";var timers={};Module["timers"]=timers;var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process.hrtime();return t[0]*1e3+t[1]/1e6}}else _emscripten_get_now=()=>performance.now();Module["_emscripten_get_now"]=_emscripten_get_now;_emscripten_get_now.sig="d";function __setitimer_js(which,timeout_ms){if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id:id,timeout_ms:timeout_ms};return 0}Module["__setitimer_js"]=__setitimer_js;__setitimer_js.sig="iid";function __timegm_js(tmPtr){var time=Date.UTC(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var date=new Date(time);HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return date.getTime()/1e3|0}Module["__timegm_js"]=__timegm_js;__timegm_js.sig="ip";function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}Module["allocateUTF8"]=allocateUTF8;function __tzset_js(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}Module["__tzset_js"]=__tzset_js;__tzset_js.sig="vppp";function _abort(){abort("")}Module["_abort"]=_abort;_abort.sig="v";var readEmAsmArgsArray=[];Module["readEmAsmArgsArray"]=readEmAsmArgsArray;function readEmAsmArgs(sigPtr,buf){readEmAsmArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readEmAsmArgsArray.push(ch==105?HEAP32[buf]:(ch==106?HEAP64:HEAPF64)[buf++>>1]);++buf}return readEmAsmArgsArray}Module["readEmAsmArgs"]=readEmAsmArgs;function runEmAsmFunction(code,sigPtr,argbuf){var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}Module["runEmAsmFunction"]=runEmAsmFunction;runEmAsmFunction.sig="ippp";function _emscripten_asm_const_int(code,sigPtr,argbuf){return runEmAsmFunction(code,sigPtr,argbuf)}Module["_emscripten_asm_const_int"]=_emscripten_asm_const_int;_emscripten_asm_const_int.sig="ippp";function _emscripten_console_error(str){console.error(UTF8ToString(str))}Module["_emscripten_console_error"]=_emscripten_console_error;_emscripten_console_error.sig="vp";function _emscripten_console_log(str){console.log(UTF8ToString(str))}Module["_emscripten_console_log"]=_emscripten_console_log;_emscripten_console_log.sig="vp";function _emscripten_console_warn(str){console.warn(UTF8ToString(str))}Module["_emscripten_console_warn"]=_emscripten_console_warn;_emscripten_console_warn.sig="vp";function _emscripten_date_now(){return Date.now()}Module["_emscripten_date_now"]=_emscripten_date_now;_emscripten_date_now.sig="d";function _emscripten_exit_with_live_runtime(){throw"unwind"}Module["_emscripten_exit_with_live_runtime"]=_emscripten_exit_with_live_runtime;_emscripten_exit_with_live_runtime.sig="v";function getHeapMax(){return 2147483648}Module["getHeapMax"]=getHeapMax;function _emscripten_get_heap_max(){return getHeapMax()}Module["_emscripten_get_heap_max"]=_emscripten_get_heap_max;_emscripten_get_heap_max.sig="p";function _emscripten_get_now_res(){if(ENVIRONMENT_IS_NODE){return 1}else return 1e3}Module["_emscripten_get_now_res"]=_emscripten_get_now_res;function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}Module["__webgl_enable_ANGLE_instanced_arrays"]=__webgl_enable_ANGLE_instanced_arrays;function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}Module["__webgl_enable_OES_vertex_array_object"]=__webgl_enable_OES_vertex_array_object;function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}Module["__webgl_enable_WEBGL_draw_buffers"]=__webgl_enable_WEBGL_draw_buffers;function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}Module["__webgl_enable_WEBGL_multi_draw"]=__webgl_enable_WEBGL_multi_draw;var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents=="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};Module["GL"]=GL;function _emscripten_glActiveTexture(x0){GLctx["activeTexture"](x0)}Module["_emscripten_glActiveTexture"]=_emscripten_glActiveTexture;_emscripten_glActiveTexture.sig="vi";function _emscripten_glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}Module["_emscripten_glAttachShader"]=_emscripten_glAttachShader;_emscripten_glAttachShader.sig="vii";function _emscripten_glBeginQueryEXT(target,id){GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])}Module["_emscripten_glBeginQueryEXT"]=_emscripten_glBeginQueryEXT;_emscripten_glBeginQueryEXT.sig="vii";function _emscripten_glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}Module["_emscripten_glBindAttribLocation"]=_emscripten_glBindAttribLocation;_emscripten_glBindAttribLocation.sig="viii";function _emscripten_glBindBuffer(target,buffer){GLctx.bindBuffer(target,GL.buffers[buffer])}Module["_emscripten_glBindBuffer"]=_emscripten_glBindBuffer;_emscripten_glBindBuffer.sig="vii";function _emscripten_glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])}Module["_emscripten_glBindFramebuffer"]=_emscripten_glBindFramebuffer;_emscripten_glBindFramebuffer.sig="vii";function _emscripten_glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}Module["_emscripten_glBindRenderbuffer"]=_emscripten_glBindRenderbuffer;_emscripten_glBindRenderbuffer.sig="vii";function _emscripten_glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}Module["_emscripten_glBindTexture"]=_emscripten_glBindTexture;_emscripten_glBindTexture.sig="vii";function _emscripten_glBindVertexArrayOES(vao){GLctx["bindVertexArray"](GL.vaos[vao])}Module["_emscripten_glBindVertexArrayOES"]=_emscripten_glBindVertexArrayOES;_emscripten_glBindVertexArrayOES.sig="vi";function _emscripten_glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1,x2,x3)}Module["_emscripten_glBlendColor"]=_emscripten_glBlendColor;_emscripten_glBlendColor.sig="vffff";function _emscripten_glBlendEquation(x0){GLctx["blendEquation"](x0)}Module["_emscripten_glBlendEquation"]=_emscripten_glBlendEquation;_emscripten_glBlendEquation.sig="vi";function _emscripten_glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}Module["_emscripten_glBlendEquationSeparate"]=_emscripten_glBlendEquationSeparate;_emscripten_glBlendEquationSeparate.sig="vii";function _emscripten_glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}Module["_emscripten_glBlendFunc"]=_emscripten_glBlendFunc;_emscripten_glBlendFunc.sig="vii";function _emscripten_glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}Module["_emscripten_glBlendFuncSeparate"]=_emscripten_glBlendFuncSeparate;_emscripten_glBlendFuncSeparate.sig="viiii";function _emscripten_glBufferData(target,size,data,usage){GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}Module["_emscripten_glBufferData"]=_emscripten_glBufferData;_emscripten_glBufferData.sig="viiii";function _emscripten_glBufferSubData(target,offset,size,data){GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}Module["_emscripten_glBufferSubData"]=_emscripten_glBufferSubData;_emscripten_glBufferSubData.sig="viiii";function _emscripten_glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}Module["_emscripten_glCheckFramebufferStatus"]=_emscripten_glCheckFramebufferStatus;_emscripten_glCheckFramebufferStatus.sig="ii";function _emscripten_glClear(x0){GLctx["clear"](x0)}Module["_emscripten_glClear"]=_emscripten_glClear;_emscripten_glClear.sig="vi";function _emscripten_glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}Module["_emscripten_glClearColor"]=_emscripten_glClearColor;_emscripten_glClearColor.sig="vffff";function _emscripten_glClearDepthf(x0){GLctx["clearDepth"](x0)}Module["_emscripten_glClearDepthf"]=_emscripten_glClearDepthf;_emscripten_glClearDepthf.sig="vf";function _emscripten_glClearStencil(x0){GLctx["clearStencil"](x0)}Module["_emscripten_glClearStencil"]=_emscripten_glClearStencil;_emscripten_glClearStencil.sig="vi";function _emscripten_glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}Module["_emscripten_glColorMask"]=_emscripten_glColorMask;_emscripten_glColorMask.sig="viiii";function _emscripten_glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}Module["_emscripten_glCompileShader"]=_emscripten_glCompileShader;_emscripten_glCompileShader.sig="vi";function _emscripten_glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}Module["_emscripten_glCompressedTexImage2D"]=_emscripten_glCompressedTexImage2D;_emscripten_glCompressedTexImage2D.sig="viiiiiiii";function _emscripten_glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}Module["_emscripten_glCompressedTexSubImage2D"]=_emscripten_glCompressedTexSubImage2D;_emscripten_glCompressedTexSubImage2D.sig="viiiiiiiii";function _emscripten_glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}Module["_emscripten_glCopyTexImage2D"]=_emscripten_glCopyTexImage2D;_emscripten_glCopyTexImage2D.sig="viiiiiiii";function _emscripten_glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}Module["_emscripten_glCopyTexSubImage2D"]=_emscripten_glCopyTexSubImage2D;_emscripten_glCopyTexSubImage2D.sig="viiiiiiii";function _emscripten_glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}Module["_emscripten_glCreateProgram"]=_emscripten_glCreateProgram;_emscripten_glCreateProgram.sig="i";function _emscripten_glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}Module["_emscripten_glCreateShader"]=_emscripten_glCreateShader;_emscripten_glCreateShader.sig="ii";function _emscripten_glCullFace(x0){GLctx["cullFace"](x0)}Module["_emscripten_glCullFace"]=_emscripten_glCullFace;_emscripten_glCullFace.sig="vi";function _emscripten_glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null}}Module["_emscripten_glDeleteBuffers"]=_emscripten_glDeleteBuffers;_emscripten_glDeleteBuffers.sig="vii";function _emscripten_glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}Module["_emscripten_glDeleteFramebuffers"]=_emscripten_glDeleteFramebuffers;_emscripten_glDeleteFramebuffers.sig="vii";function _emscripten_glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}Module["_emscripten_glDeleteProgram"]=_emscripten_glDeleteProgram;_emscripten_glDeleteProgram.sig="vi";function _emscripten_glDeleteQueriesEXT(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}}Module["_emscripten_glDeleteQueriesEXT"]=_emscripten_glDeleteQueriesEXT;_emscripten_glDeleteQueriesEXT.sig="vii";function _emscripten_glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}Module["_emscripten_glDeleteRenderbuffers"]=_emscripten_glDeleteRenderbuffers;_emscripten_glDeleteRenderbuffers.sig="vii";function _emscripten_glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}Module["_emscripten_glDeleteShader"]=_emscripten_glDeleteShader;_emscripten_glDeleteShader.sig="vi";function _emscripten_glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}Module["_emscripten_glDeleteTextures"]=_emscripten_glDeleteTextures;_emscripten_glDeleteTextures.sig="vii";function _emscripten_glDeleteVertexArraysOES(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}Module["_emscripten_glDeleteVertexArraysOES"]=_emscripten_glDeleteVertexArraysOES;_emscripten_glDeleteVertexArraysOES.sig="vii";function _emscripten_glDepthFunc(x0){GLctx["depthFunc"](x0)}Module["_emscripten_glDepthFunc"]=_emscripten_glDepthFunc;_emscripten_glDepthFunc.sig="vi";function _emscripten_glDepthMask(flag){GLctx.depthMask(!!flag)}Module["_emscripten_glDepthMask"]=_emscripten_glDepthMask;_emscripten_glDepthMask.sig="vi";function _emscripten_glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}Module["_emscripten_glDepthRangef"]=_emscripten_glDepthRangef;_emscripten_glDepthRangef.sig="vii";function _emscripten_glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}Module["_emscripten_glDetachShader"]=_emscripten_glDetachShader;_emscripten_glDetachShader.sig="vii";function _emscripten_glDisable(x0){GLctx["disable"](x0)}Module["_emscripten_glDisable"]=_emscripten_glDisable;_emscripten_glDisable.sig="vi";function _emscripten_glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}Module["_emscripten_glDisableVertexAttribArray"]=_emscripten_glDisableVertexAttribArray;_emscripten_glDisableVertexAttribArray.sig="vi";function _emscripten_glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}Module["_emscripten_glDrawArrays"]=_emscripten_glDrawArrays;_emscripten_glDrawArrays.sig="viii";function _emscripten_glDrawArraysInstancedANGLE(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_emscripten_glDrawArraysInstancedANGLE"]=_emscripten_glDrawArraysInstancedANGLE;_emscripten_glDrawArraysInstancedANGLE.sig="viiii";var tempFixedLengthArray=[];Module["tempFixedLengthArray"]=tempFixedLengthArray;function _emscripten_glDrawBuffersWEBGL(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}Module["_emscripten_glDrawBuffersWEBGL"]=_emscripten_glDrawBuffersWEBGL;_emscripten_glDrawBuffersWEBGL.sig="vii";function _emscripten_glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}Module["_emscripten_glDrawElements"]=_emscripten_glDrawElements;_emscripten_glDrawElements.sig="viiii";function _emscripten_glDrawElementsInstancedANGLE(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_emscripten_glDrawElementsInstancedANGLE"]=_emscripten_glDrawElementsInstancedANGLE;_emscripten_glDrawElementsInstancedANGLE.sig="viiiii";function _emscripten_glEnable(x0){GLctx["enable"](x0)}Module["_emscripten_glEnable"]=_emscripten_glEnable;_emscripten_glEnable.sig="vi";function _emscripten_glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}Module["_emscripten_glEnableVertexAttribArray"]=_emscripten_glEnableVertexAttribArray;_emscripten_glEnableVertexAttribArray.sig="vi";function _emscripten_glEndQueryEXT(target){GLctx.disjointTimerQueryExt["endQueryEXT"](target)}Module["_emscripten_glEndQueryEXT"]=_emscripten_glEndQueryEXT;_emscripten_glEndQueryEXT.sig="vi";function _emscripten_glFinish(){GLctx["finish"]()}Module["_emscripten_glFinish"]=_emscripten_glFinish;_emscripten_glFinish.sig="v";function _emscripten_glFlush(){GLctx["flush"]()}Module["_emscripten_glFlush"]=_emscripten_glFlush;_emscripten_glFlush.sig="v";function _emscripten_glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}Module["_emscripten_glFramebufferRenderbuffer"]=_emscripten_glFramebufferRenderbuffer;_emscripten_glFramebufferRenderbuffer.sig="viiii";function _emscripten_glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}Module["_emscripten_glFramebufferTexture2D"]=_emscripten_glFramebufferTexture2D;_emscripten_glFramebufferTexture2D.sig="viiiii";function _emscripten_glFrontFace(x0){GLctx["frontFace"](x0)}Module["_emscripten_glFrontFace"]=_emscripten_glFrontFace;_emscripten_glFrontFace.sig="vi";function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}Module["__glGenObject"]=__glGenObject;__glGenObject.sig="vii";function _emscripten_glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}Module["_emscripten_glGenBuffers"]=_emscripten_glGenBuffers;_emscripten_glGenBuffers.sig="vii";function _emscripten_glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}Module["_emscripten_glGenFramebuffers"]=_emscripten_glGenFramebuffers;_emscripten_glGenFramebuffers.sig="vii";function _emscripten_glGenQueriesEXT(n,ids){for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;HEAP32[ids+i*4>>2]=id}}Module["_emscripten_glGenQueriesEXT"]=_emscripten_glGenQueriesEXT;_emscripten_glGenQueriesEXT.sig="vii";function _emscripten_glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}Module["_emscripten_glGenRenderbuffers"]=_emscripten_glGenRenderbuffers;_emscripten_glGenRenderbuffers.sig="vii";function _emscripten_glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}Module["_emscripten_glGenTextures"]=_emscripten_glGenTextures;_emscripten_glGenTextures.sig="vii";function _emscripten_glGenVertexArraysOES(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}Module["_emscripten_glGenVertexArraysOES"]=_emscripten_glGenVertexArraysOES;_emscripten_glGenVertexArraysOES.sig="vii";function _emscripten_glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}Module["_emscripten_glGenerateMipmap"]=_emscripten_glGenerateMipmap;_emscripten_glGenerateMipmap.sig="vi";function __glGetActiveAttribOrUniform(funcName,program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}}Module["__glGetActiveAttribOrUniform"]=__glGetActiveAttribOrUniform;function _emscripten_glGetActiveAttrib(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)}Module["_emscripten_glGetActiveAttrib"]=_emscripten_glGetActiveAttrib;_emscripten_glGetActiveAttrib.sig="viiiiiii";function _emscripten_glGetActiveUniform(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)}Module["_emscripten_glGetActiveUniform"]=_emscripten_glGetActiveUniform;_emscripten_glGetActiveUniform.sig="viiiiiii";function _emscripten_glGetAttachedShaders(program,maxCount,count,shaders){var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i>2]=id}}Module["_emscripten_glGetAttachedShaders"]=_emscripten_glGetAttachedShaders;_emscripten_glGetAttachedShaders.sig="viiii";function _emscripten_glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}Module["_emscripten_glGetAttribLocation"]=_emscripten_glGetAttribLocation;_emscripten_glGetAttribLocation.sig="iii";function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}Module["writeI53ToI64"]=writeI53ToI64;function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}Module["emscriptenWebGLGet"]=emscriptenWebGLGet;function _emscripten_glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,4)}Module["_emscripten_glGetBooleanv"]=_emscripten_glGetBooleanv;_emscripten_glGetBooleanv.sig="vii";function _emscripten_glGetBufferParameteriv(target,value,data){if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)}Module["_emscripten_glGetBufferParameteriv"]=_emscripten_glGetBufferParameteriv;_emscripten_glGetBufferParameteriv.sig="viii";function _emscripten_glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}Module["_emscripten_glGetError"]=_emscripten_glGetError;_emscripten_glGetError.sig="i";function _emscripten_glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}Module["_emscripten_glGetFloatv"]=_emscripten_glGetFloatv;_emscripten_glGetFloatv.sig="vii";function _emscripten_glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result}Module["_emscripten_glGetFramebufferAttachmentParameteriv"]=_emscripten_glGetFramebufferAttachmentParameteriv;_emscripten_glGetFramebufferAttachmentParameteriv.sig="viiii";function _emscripten_glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}Module["_emscripten_glGetIntegerv"]=_emscripten_glGetIntegerv;_emscripten_glGetIntegerv.sig="vii";function _emscripten_glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}Module["_emscripten_glGetProgramInfoLog"]=_emscripten_glGetProgramInfoLog;_emscripten_glGetProgramInfoLog.sig="viiii";function _emscripten_glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}Module["_emscripten_glGetProgramiv"]=_emscripten_glGetProgramiv;_emscripten_glGetProgramiv.sig="viii";function _emscripten_glGetQueryObjecti64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;{param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}Module["_emscripten_glGetQueryObjecti64vEXT"]=_emscripten_glGetQueryObjecti64vEXT;_emscripten_glGetQueryObjecti64vEXT.sig="viii";function _emscripten_glGetQueryObjectivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}Module["_emscripten_glGetQueryObjectivEXT"]=_emscripten_glGetQueryObjectivEXT;_emscripten_glGetQueryObjectivEXT.sig="viii";function _emscripten_glGetQueryObjectui64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;{param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}Module["_emscripten_glGetQueryObjectui64vEXT"]=_emscripten_glGetQueryObjectui64vEXT;_emscripten_glGetQueryObjectui64vEXT.sig="viii";function _emscripten_glGetQueryObjectuivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}Module["_emscripten_glGetQueryObjectuivEXT"]=_emscripten_glGetQueryObjectuivEXT;_emscripten_glGetQueryObjectuivEXT.sig="viii";function _emscripten_glGetQueryivEXT(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)}Module["_emscripten_glGetQueryivEXT"]=_emscripten_glGetQueryivEXT;_emscripten_glGetQueryivEXT.sig="viii";function _emscripten_glGetRenderbufferParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)}Module["_emscripten_glGetRenderbufferParameteriv"]=_emscripten_glGetRenderbufferParameteriv;_emscripten_glGetRenderbufferParameteriv.sig="viii";function _emscripten_glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}Module["_emscripten_glGetShaderInfoLog"]=_emscripten_glGetShaderInfoLog;_emscripten_glGetShaderInfoLog.sig="viiii";function _emscripten_glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision}Module["_emscripten_glGetShaderPrecisionFormat"]=_emscripten_glGetShaderPrecisionFormat;_emscripten_glGetShaderPrecisionFormat.sig="viiii";function _emscripten_glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}Module["_emscripten_glGetShaderSource"]=_emscripten_glGetShaderSource;_emscripten_glGetShaderSource.sig="viiii";function _emscripten_glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}Module["_emscripten_glGetShaderiv"]=_emscripten_glGetShaderiv;_emscripten_glGetShaderiv.sig="viii";function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}Module["stringToNewUTF8"]=stringToNewUTF8;function _emscripten_glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}Module["_emscripten_glGetString"]=_emscripten_glGetString;_emscripten_glGetString.sig="ii";function _emscripten_glGetTexParameterfv(target,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx.getTexParameter(target,pname)}Module["_emscripten_glGetTexParameterfv"]=_emscripten_glGetTexParameterfv;_emscripten_glGetTexParameterfv.sig="viii";function _emscripten_glGetTexParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)}Module["_emscripten_glGetTexParameteriv"]=_emscripten_glGetTexParameteriv;_emscripten_glGetTexParameteriv.sig="viii";function webglGetLeftBracePos(name){return name.slice(-1)=="]"&&name.lastIndexOf("[")}Module["webglGetLeftBracePos"]=webglGetLeftBracePos;function webglPrepareUniformLocationsBeforeFirstUse(program){var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}}Module["webglGetUniformLocation"]=webglGetUniformLocation;function emscriptenWebGLGetUniform(program,location,params,type){if(!params){GL.recordError(1281);return}program=GL.programs[program];webglPrepareUniformLocationsBeforeFirstUse(program);var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break}}}}Module["emscriptenWebGLGetUniform"]=emscriptenWebGLGetUniform;function _emscripten_glGetUniformfv(program,location,params){emscriptenWebGLGetUniform(program,location,params,2)}Module["_emscripten_glGetUniformfv"]=_emscripten_glGetUniformfv;_emscripten_glGetUniformfv.sig="viii";function _emscripten_glGetUniformiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}Module["_emscripten_glGetUniformiv"]=_emscripten_glGetUniformiv;_emscripten_glGetUniformiv.sig="viii";function _emscripten_glGetVertexAttribPointerv(index,pname,pointer){if(!pointer){GL.recordError(1281);return}HEAP32[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)}Module["_emscripten_glGetVertexAttribPointerv"]=_emscripten_glGetVertexAttribPointerv;_emscripten_glGetVertexAttribPointerv.sig="viii";function emscriptenWebGLGetVertexAttrib(index,pname,params,type){if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break;case 5:HEAP32[params>>2]=Math.fround(data);break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;case 5:HEAP32[params+i*4>>2]=Math.fround(data[i]);break}}}}Module["emscriptenWebGLGetVertexAttrib"]=emscriptenWebGLGetVertexAttrib;function _emscripten_glGetVertexAttribfv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,2)}Module["_emscripten_glGetVertexAttribfv"]=_emscripten_glGetVertexAttribfv;_emscripten_glGetVertexAttribfv.sig="viii";function _emscripten_glGetVertexAttribiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,5)}Module["_emscripten_glGetVertexAttribiv"]=_emscripten_glGetVertexAttribiv;_emscripten_glGetVertexAttribiv.sig="viii";function _emscripten_glHint(x0,x1){GLctx["hint"](x0,x1)}Module["_emscripten_glHint"]=_emscripten_glHint;_emscripten_glHint.sig="vii";function _emscripten_glIsBuffer(buffer){var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)}Module["_emscripten_glIsBuffer"]=_emscripten_glIsBuffer;_emscripten_glIsBuffer.sig="ii";function _emscripten_glIsEnabled(x0){return GLctx["isEnabled"](x0)}Module["_emscripten_glIsEnabled"]=_emscripten_glIsEnabled;_emscripten_glIsEnabled.sig="ii";function _emscripten_glIsFramebuffer(framebuffer){var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)}Module["_emscripten_glIsFramebuffer"]=_emscripten_glIsFramebuffer;_emscripten_glIsFramebuffer.sig="ii";function _emscripten_glIsProgram(program){program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)}Module["_emscripten_glIsProgram"]=_emscripten_glIsProgram;_emscripten_glIsProgram.sig="ii";function _emscripten_glIsQueryEXT(id){var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)}Module["_emscripten_glIsQueryEXT"]=_emscripten_glIsQueryEXT;_emscripten_glIsQueryEXT.sig="ii";function _emscripten_glIsRenderbuffer(renderbuffer){var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)}Module["_emscripten_glIsRenderbuffer"]=_emscripten_glIsRenderbuffer;_emscripten_glIsRenderbuffer.sig="ii";function _emscripten_glIsShader(shader){var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)}Module["_emscripten_glIsShader"]=_emscripten_glIsShader;_emscripten_glIsShader.sig="ii";function _emscripten_glIsTexture(id){var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)}Module["_emscripten_glIsTexture"]=_emscripten_glIsTexture;_emscripten_glIsTexture.sig="ii";function _emscripten_glIsVertexArrayOES(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}Module["_emscripten_glIsVertexArrayOES"]=_emscripten_glIsVertexArrayOES;_emscripten_glIsVertexArrayOES.sig="ii";function _emscripten_glLineWidth(x0){GLctx["lineWidth"](x0)}Module["_emscripten_glLineWidth"]=_emscripten_glLineWidth;_emscripten_glLineWidth.sig="vf";function _emscripten_glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}Module["_emscripten_glLinkProgram"]=_emscripten_glLinkProgram;_emscripten_glLinkProgram.sig="vi";function _emscripten_glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}Module["_emscripten_glPixelStorei"]=_emscripten_glPixelStorei;_emscripten_glPixelStorei.sig="vii";function _emscripten_glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}Module["_emscripten_glPolygonOffset"]=_emscripten_glPolygonOffset;_emscripten_glPolygonOffset.sig="vff";function _emscripten_glQueryCounterEXT(id,target){GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)}Module["_emscripten_glQueryCounterEXT"]=_emscripten_glQueryCounterEXT;_emscripten_glQueryCounterEXT.sig="vii";function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}Module["computeUnpackAlignedImageSize"]=computeUnpackAlignedImageSize;function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4};return colorChannels[format-6402]||1}Module["__colorChannelsInGlTextureFormat"]=__colorChannelsInGlTextureFormat;function heapObjectForWebGLType(type){type-=5120;if(type==1)return HEAPU8;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922)return HEAPU32;return HEAPU16}Module["heapObjectForWebGLType"]=heapObjectForWebGLType;function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}Module["heapAccessShiftForWebGLHeap"]=heapAccessShiftForWebGLHeap;function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}Module["emscriptenWebGLGetTexPixelData"]=emscriptenWebGLGetTexPixelData;function _emscripten_glReadPixels(x,y,width,height,format,type,pixels){var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}Module["_emscripten_glReadPixels"]=_emscripten_glReadPixels;_emscripten_glReadPixels.sig="viiiiiii";function _emscripten_glReleaseShaderCompiler(){}Module["_emscripten_glReleaseShaderCompiler"]=_emscripten_glReleaseShaderCompiler;_emscripten_glReleaseShaderCompiler.sig="v";function _emscripten_glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}Module["_emscripten_glRenderbufferStorage"]=_emscripten_glRenderbufferStorage;_emscripten_glRenderbufferStorage.sig="viiii";function _emscripten_glSampleCoverage(value,invert){GLctx.sampleCoverage(value,!!invert)}Module["_emscripten_glSampleCoverage"]=_emscripten_glSampleCoverage;_emscripten_glSampleCoverage.sig="vii";function _emscripten_glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}Module["_emscripten_glScissor"]=_emscripten_glScissor;_emscripten_glScissor.sig="viiii";function _emscripten_glShaderBinary(){GL.recordError(1280)}Module["_emscripten_glShaderBinary"]=_emscripten_glShaderBinary;_emscripten_glShaderBinary.sig="v";function _emscripten_glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}Module["_emscripten_glShaderSource"]=_emscripten_glShaderSource;_emscripten_glShaderSource.sig="viiii";function _emscripten_glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,x2)}Module["_emscripten_glStencilFunc"]=_emscripten_glStencilFunc;_emscripten_glStencilFunc.sig="viii";function _emscripten_glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}Module["_emscripten_glStencilFuncSeparate"]=_emscripten_glStencilFuncSeparate;_emscripten_glStencilFuncSeparate.sig="viiii";function _emscripten_glStencilMask(x0){GLctx["stencilMask"](x0)}Module["_emscripten_glStencilMask"]=_emscripten_glStencilMask;_emscripten_glStencilMask.sig="vi";function _emscripten_glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}Module["_emscripten_glStencilMaskSeparate"]=_emscripten_glStencilMaskSeparate;_emscripten_glStencilMaskSeparate.sig="vii";function _emscripten_glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}Module["_emscripten_glStencilOp"]=_emscripten_glStencilOp;_emscripten_glStencilOp.sig="viii";function _emscripten_glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}Module["_emscripten_glStencilOpSeparate"]=_emscripten_glStencilOpSeparate;_emscripten_glStencilOpSeparate.sig="viiii";function _emscripten_glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}Module["_emscripten_glTexImage2D"]=_emscripten_glTexImage2D;_emscripten_glTexImage2D.sig="viiiiiiiii";function _emscripten_glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}Module["_emscripten_glTexParameterf"]=_emscripten_glTexParameterf;_emscripten_glTexParameterf.sig="viii";function _emscripten_glTexParameterfv(target,pname,params){var param=HEAPF32[params>>2];GLctx.texParameterf(target,pname,param)}Module["_emscripten_glTexParameterfv"]=_emscripten_glTexParameterfv;_emscripten_glTexParameterfv.sig="viii";function _emscripten_glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}Module["_emscripten_glTexParameteri"]=_emscripten_glTexParameteri;_emscripten_glTexParameteri.sig="viii";function _emscripten_glTexParameteriv(target,pname,params){var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)}Module["_emscripten_glTexParameteriv"]=_emscripten_glTexParameteriv;_emscripten_glTexParameteriv.sig="viii";function _emscripten_glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}Module["_emscripten_glTexSubImage2D"]=_emscripten_glTexSubImage2D;_emscripten_glTexSubImage2D.sig="viiiiiiiii";function _emscripten_glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}Module["_emscripten_glUniform1f"]=_emscripten_glUniform1f;_emscripten_glUniform1f.sig="vif";var miniTempWebGLFloatBuffers=[];Module["miniTempWebGLFloatBuffers"]=miniTempWebGLFloatBuffers;function _emscripten_glUniform1fv(location,count,value){if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)}Module["_emscripten_glUniform1fv"]=_emscripten_glUniform1fv;_emscripten_glUniform1fv.sig="viii";function _emscripten_glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}Module["_emscripten_glUniform1i"]=_emscripten_glUniform1i;_emscripten_glUniform1i.sig="vii";var __miniTempWebGLIntBuffers=[];Module["__miniTempWebGLIntBuffers"]=__miniTempWebGLIntBuffers;function _emscripten_glUniform1iv(location,count,value){if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}Module["_emscripten_glUniform1iv"]=_emscripten_glUniform1iv;_emscripten_glUniform1iv.sig="viii";function _emscripten_glUniform2f(location,v0,v1){GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)}Module["_emscripten_glUniform2f"]=_emscripten_glUniform2f;_emscripten_glUniform2f.sig="viff";function _emscripten_glUniform2fv(location,count,value){if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}Module["_emscripten_glUniform2fv"]=_emscripten_glUniform2fv;_emscripten_glUniform2fv.sig="viii";function _emscripten_glUniform2i(location,v0,v1){GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)}Module["_emscripten_glUniform2i"]=_emscripten_glUniform2i;_emscripten_glUniform2i.sig="viii";function _emscripten_glUniform2iv(location,count,value){if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}Module["_emscripten_glUniform2iv"]=_emscripten_glUniform2iv;_emscripten_glUniform2iv.sig="viii";function _emscripten_glUniform3f(location,v0,v1,v2){GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)}Module["_emscripten_glUniform3f"]=_emscripten_glUniform3f;_emscripten_glUniform3f.sig="vifff";function _emscripten_glUniform3fv(location,count,value){if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}Module["_emscripten_glUniform3fv"]=_emscripten_glUniform3fv;_emscripten_glUniform3fv.sig="viii";function _emscripten_glUniform3i(location,v0,v1,v2){GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)}Module["_emscripten_glUniform3i"]=_emscripten_glUniform3i;_emscripten_glUniform3i.sig="viiii";function _emscripten_glUniform3iv(location,count,value){if(count<=96){var view=__miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)}Module["_emscripten_glUniform3iv"]=_emscripten_glUniform3iv;_emscripten_glUniform3iv.sig="viii";function _emscripten_glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)}Module["_emscripten_glUniform4f"]=_emscripten_glUniform4f;_emscripten_glUniform4f.sig="viffff";function _emscripten_glUniform4fv(location,count,value){if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}Module["_emscripten_glUniform4fv"]=_emscripten_glUniform4fv;_emscripten_glUniform4fv.sig="viii";function _emscripten_glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)}Module["_emscripten_glUniform4i"]=_emscripten_glUniform4i;_emscripten_glUniform4i.sig="viiiii";function _emscripten_glUniform4iv(location,count,value){if(count<=72){var view=__miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)}Module["_emscripten_glUniform4iv"]=_emscripten_glUniform4iv;_emscripten_glUniform4iv.sig="viii";function _emscripten_glUniformMatrix2fv(location,count,transpose,value){if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}Module["_emscripten_glUniformMatrix2fv"]=_emscripten_glUniformMatrix2fv;_emscripten_glUniformMatrix2fv.sig="viiii";function _emscripten_glUniformMatrix3fv(location,count,transpose,value){if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}Module["_emscripten_glUniformMatrix3fv"]=_emscripten_glUniformMatrix3fv;_emscripten_glUniformMatrix3fv.sig="viiii";function _emscripten_glUniformMatrix4fv(location,count,transpose,value){if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}Module["_emscripten_glUniformMatrix4fv"]=_emscripten_glUniformMatrix4fv;_emscripten_glUniformMatrix4fv.sig="viiii";function _emscripten_glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}Module["_emscripten_glUseProgram"]=_emscripten_glUseProgram;_emscripten_glUseProgram.sig="vi";function _emscripten_glValidateProgram(program){GLctx.validateProgram(GL.programs[program])}Module["_emscripten_glValidateProgram"]=_emscripten_glValidateProgram;_emscripten_glValidateProgram.sig="vi";function _emscripten_glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,x1)}Module["_emscripten_glVertexAttrib1f"]=_emscripten_glVertexAttrib1f;_emscripten_glVertexAttrib1f.sig="vif";function _emscripten_glVertexAttrib1fv(index,v){GLctx.vertexAttrib1f(index,HEAPF32[v>>2])}Module["_emscripten_glVertexAttrib1fv"]=_emscripten_glVertexAttrib1fv;_emscripten_glVertexAttrib1fv.sig="vii";function _emscripten_glVertexAttrib2f(x0,x1,x2){GLctx["vertexAttrib2f"](x0,x1,x2)}Module["_emscripten_glVertexAttrib2f"]=_emscripten_glVertexAttrib2f;_emscripten_glVertexAttrib2f.sig="viff";function _emscripten_glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(index,HEAPF32[v>>2],HEAPF32[v+4>>2])}Module["_emscripten_glVertexAttrib2fv"]=_emscripten_glVertexAttrib2fv;_emscripten_glVertexAttrib2fv.sig="vii";function _emscripten_glVertexAttrib3f(x0,x1,x2,x3){GLctx["vertexAttrib3f"](x0,x1,x2,x3)}Module["_emscripten_glVertexAttrib3f"]=_emscripten_glVertexAttrib3f;_emscripten_glVertexAttrib3f.sig="vifff";function _emscripten_glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2])}Module["_emscripten_glVertexAttrib3fv"]=_emscripten_glVertexAttrib3fv;_emscripten_glVertexAttrib3fv.sig="vii";function _emscripten_glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}Module["_emscripten_glVertexAttrib4f"]=_emscripten_glVertexAttrib4f;_emscripten_glVertexAttrib4f.sig="viffff";function _emscripten_glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}Module["_emscripten_glVertexAttrib4fv"]=_emscripten_glVertexAttrib4fv;_emscripten_glVertexAttrib4fv.sig="vii";function _emscripten_glVertexAttribDivisorANGLE(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_emscripten_glVertexAttribDivisorANGLE"]=_emscripten_glVertexAttribDivisorANGLE;_emscripten_glVertexAttribDivisorANGLE.sig="vii";function _emscripten_glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}Module["_emscripten_glVertexAttribPointer"]=_emscripten_glVertexAttribPointer;_emscripten_glVertexAttribPointer.sig="viiiiii";function _emscripten_glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}Module["_emscripten_glViewport"]=_emscripten_glViewport;_emscripten_glViewport.sig="viiii";function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}Module["_emscripten_memcpy_big"]=_emscripten_memcpy_big;_emscripten_memcpy_big.sig="vppp";function HandleAllocator(){this.allocated=[];this.freelist=[];this.get=function(id){return this.allocated[id]};this.allocate=function(handle){let id;if(this.freelist.length>0){id=this.freelist.pop();this.allocated[id]=handle}else{id=this.allocated.length;this.allocated.push(handle)}return id};this.free=function(id){delete this.allocated[id];this.freelist.push(id)}}Module["HandleAllocator"]=HandleAllocator;var promiseMap=new HandleAllocator;Module["promiseMap"]=promiseMap;function makePromise(){var promiseInfo={};promiseInfo.promise=new Promise((resolve,reject)=>{promiseInfo.reject=reject;promiseInfo.resolve=resolve});promiseInfo.id=promiseMap.allocate(promiseInfo);return promiseInfo}Module["makePromise"]=makePromise;function _emscripten_promise_create(){return makePromise().id}Module["_emscripten_promise_create"]=_emscripten_promise_create;_emscripten_promise_create.sig="p";function _emscripten_promise_destroy(id){promiseMap.free(id)}Module["_emscripten_promise_destroy"]=_emscripten_promise_destroy;_emscripten_promise_destroy.sig="vp";function getPromise(id){return promiseMap.get(id).promise}Module["getPromise"]=getPromise;function _emscripten_promise_resolve(id,result,value){var info=promiseMap.get(id);switch(result){case 0:info.resolve(value);return;case 1:info.resolve(getPromise(value));return;case 2:info.resolve(getPromise(value));_emscripten_promise_destroy(value);return;case 3:info.reject(value);return}}Module["_emscripten_promise_resolve"]=_emscripten_promise_resolve;_emscripten_promise_resolve.sig="vpip";function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{wasmMemory.grow(size-b.byteLength+65535>>>16);updateMemoryViews();return 1}catch(e){}}Module["emscripten_realloc_buffer"]=emscripten_realloc_buffer;function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}Module["_emscripten_resize_heap"]=_emscripten_resize_heap;_emscripten_resize_heap.sig="ip";function getExecutableName(){return thisProgram||"./this.program"}Module["getExecutableName"]=getExecutableName;function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}Module["getEnvStrings"]=getEnvStrings;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}Module["_environ_get"]=_environ_get;_environ_get.sig="ipp";function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}Module["_environ_sizes_get"]=_environ_sizes_get;_environ_sizes_get.sig="ipp";function _proc_exit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}Module["_proc_exit"]=_proc_exit;_proc_exit.sig="vi";function exitJS(status,implicit){EXITSTATUS=status;_proc_exit(status)}Module["exitJS"]=exitJS;var _exit=exitJS;Module["_exit"]=_exit;_exit.sig="vi";function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_close"]=_fd_close;_fd_close.sig="ii";function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_fdstat_get"]=_fd_fdstat_get;_fd_fdstat_get.sig="iip";function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_pread"]=_fd_pread;_fd_pread.sig="iippjp";function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret}Module["doWritev"]=doWritev;function _fd_pwrite(fd,iov,iovcnt,offset,pnum){try{offset=bigintToI53Checked(offset);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt,offset);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_pwrite"]=_fd_pwrite;_fd_pwrite.sig="iippjp";function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_read"]=_fd_read;_fd_read.sig="iippp";function _fd_seek(fd,offset,whence,newOffset){try{offset=bigintToI53Checked(offset);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_seek"]=_fd_seek;_fd_seek.sig="iijip";function _fd_sync(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);if(stream.stream_ops&&stream.stream_ops.fsync){return stream.stream_ops.fsync(stream)}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_sync"]=_fd_sync;_fd_sync.sig="ii";function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_write"]=_fd_write;_fd_write.sig="iippp";function _getaddrinfo(node,service,hint,out){var addrs=[];var canon=null;var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai,last;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAP32[ai+24>>2]=canon;HEAPU32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}Module["_getaddrinfo"]=_getaddrinfo;_getaddrinfo.sig="ipppp";function _getentropy(buffer,size){if(!_getentropy.randomDevice){_getentropy.randomDevice=getRandomDevice()}for(var i=0;i>0]=_getentropy.randomDevice()}return 0}Module["_getentropy"]=_getentropy;_getentropy.sig="ipp";function getHostByName(name){var ret=_malloc(20);var nameBuf=_malloc(name.length+1);stringToUTF8(name,nameBuf,name.length+1);HEAPU32[ret>>2]=nameBuf;var aliasesBuf=_malloc(4);HEAPU32[aliasesBuf>>2]=0;HEAPU32[ret+4>>2]=aliasesBuf;var afinet=2;HEAP32[ret+8>>2]=afinet;HEAP32[ret+12>>2]=4;var addrListBuf=_malloc(12);HEAPU32[addrListBuf>>2]=addrListBuf+8;HEAPU32[addrListBuf+4>>2]=0;HEAP32[addrListBuf+8>>2]=inetPton4(DNS.lookup_name(name));HEAPU32[ret+16>>2]=addrListBuf;return ret}Module["getHostByName"]=getHostByName;function _gethostbyaddr(addr,addrlen,type){if(type!==2){setErrNo(5);return null}addr=HEAP32[addr>>2];var host=inetNtop4(addr);var lookup=DNS.lookup_addr(host);if(lookup){host=lookup}return getHostByName(host)}Module["_gethostbyaddr"]=_gethostbyaddr;_gethostbyaddr.sig="ipii";function _gethostbyname(name){return getHostByName(UTF8ToString(name))}Module["_gethostbyname"]=_gethostbyname;_gethostbyname.sig="pp";function _getloadavg(loadavg,nelem){var limit=Math.min(nelem,3);var doubleSize=8;for(var i=0;i>3]=.1}return limit}Module["_getloadavg"]=_getloadavg;_getloadavg.sig="ipi";function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}Module["_getnameinfo"]=_getnameinfo;_getnameinfo.sig="ipipipii";var Protocols={list:[],map:{}};Module["Protocols"]=Protocols;function _setprotoent(stayopen){function allocprotoent(name,proto,aliases){var nameBuf=_malloc(name.length+1);writeAsciiToMemory(name,nameBuf);var j=0;var length=aliases.length;var aliasListBuf=_malloc((length+1)*4);for(var i=0;i>2]=aliasBuf}HEAPU32[aliasListBuf+j>>2]=0;var pe=_malloc(12);HEAPU32[pe>>2]=nameBuf;HEAPU32[pe+4>>2]=aliasListBuf;HEAP32[pe+8>>2]=proto;return pe}var list=Protocols.list;var map=Protocols.map;if(list.length===0){var entry=allocprotoent("tcp",6,["TCP"]);list.push(entry);map["tcp"]=map["6"]=entry;entry=allocprotoent("udp",17,["UDP"]);list.push(entry);map["udp"]=map["17"]=entry}_setprotoent.index=0}Module["_setprotoent"]=_setprotoent;function _getprotobyname(name){name=UTF8ToString(name);_setprotoent(true);var result=Protocols.map[name];return result}Module["_getprotobyname"]=_getprotobyname;function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}Module["__arraySum"]=__arraySum;var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];Module["__MONTH_DAYS_LEAP"]=__MONTH_DAYS_LEAP;var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];Module["__MONTH_DAYS_REGULAR"]=__MONTH_DAYS_REGULAR;function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}Module["__addDays"]=__addDays;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module["writeArrayToMemory"]=writeArrayToMemory;function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}Module["_strftime"]=_strftime;_strftime.sig="ppppp";function _strftime_l(s,maxsize,format,tm,loc){return _strftime(s,maxsize,format,tm)}Module["_strftime_l"]=_strftime_l;_strftime_l.sig="pppppp";function _system(command){if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGINT":return 2;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15}return 2};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;setErrNo(52);return-1}Module["_system"]=_system;_system.sig="ip";function ptrToString(ptr){return"0x"+ptr.toString(16).padStart(8,"0")}Module["ptrToString"]=ptrToString;function _emscripten_notify_memory_growth(memoryIndex){updateMemoryViews()}Module["_emscripten_notify_memory_growth"]=_emscripten_notify_memory_growth;function ___asctime_r(tmPtr,buf){var date={tm_sec:HEAP32[tmPtr>>2],tm_min:HEAP32[tmPtr+4>>2],tm_hour:HEAP32[tmPtr+8>>2],tm_mday:HEAP32[tmPtr+12>>2],tm_mon:HEAP32[tmPtr+16>>2],tm_year:HEAP32[tmPtr+20>>2],tm_wday:HEAP32[tmPtr+24>>2]};var days=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var s=days[date.tm_wday]+" "+months[date.tm_mon]+(date.tm_mday<10?" ":" ")+date.tm_mday+(date.tm_hour<10?" 0":" ")+date.tm_hour+(date.tm_min<10?":0":":")+date.tm_min+(date.tm_sec<10?":0":":")+date.tm_sec+" "+(1900+date.tm_year)+"\n";stringToUTF8(s,buf,26);return buf}Module["___asctime_r"]=___asctime_r;___asctime_r.sig="ppp";function _strptime(buf,format,tm){var pattern=UTF8ToString(format);var SPECIAL_CHARS="\\!@#$^&*()+=-[]/{}|:<>?,.";for(var i=0,ii=SPECIAL_CHARS.length;i=0;i=pattern.indexOf("%")){capture.push(pattern[i+1]);pattern=pattern.replace(new RegExp("\\%"+pattern[i+1],"g"),"")}var matches=new RegExp("^"+pattern,"i").exec(UTF8ToString(buf));function initDate(){function fixup(value,min,max){return typeof value!="number"||isNaN(value)?min:value>=min?value<=max?value:max:min}return{year:fixup(HEAP32[tm+20>>2]+1900,1970,9999),month:fixup(HEAP32[tm+16>>2],0,11),day:fixup(HEAP32[tm+12>>2],1,31),hour:fixup(HEAP32[tm+8>>2],0,23),min:fixup(HEAP32[tm+4>>2],0,59),sec:fixup(HEAP32[tm>>2],0,59)}}if(matches){var date=initDate();var value;var getMatch=symbol=>{var pos=capture.indexOf(symbol);if(pos>=0){return matches[pos+1]}return};if(value=getMatch("S")){date.sec=jstoi_q(value)}if(value=getMatch("M")){date.min=jstoi_q(value)}if(value=getMatch("H")){date.hour=jstoi_q(value)}else if(value=getMatch("I")){var hour=jstoi_q(value);if(value=getMatch("p")){hour+=value.toUpperCase()[0]==="P"?12:0}date.hour=hour}if(value=getMatch("Y")){date.year=jstoi_q(value)}else if(value=getMatch("y")){var year=jstoi_q(value);if(value=getMatch("C")){year+=jstoi_q(value)*100}else{year+=year<69?2e3:1900}date.year=year}if(value=getMatch("m")){date.month=jstoi_q(value)-1}else if(value=getMatch("b")){date.month=MONTH_NUMBERS[value.substring(0,3).toUpperCase()]||0}if(value=getMatch("d")){date.day=jstoi_q(value)}else if(value=getMatch("j")){var day=jstoi_q(value);var leapYear=__isLeapYear(date.year);for(var month=0;month<12;++month){var daysUntilMonth=__arraySum(leapYear?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,month-1);if(day<=daysUntilMonth+(leapYear?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[month]){date.day=day-daysUntilMonth}}}else if(value=getMatch("a")){var weekDay=value.substring(0,3).toUpperCase();if(value=getMatch("U")){var weekDayNumber=DAY_NUMBERS_SUN_FIRST[weekDay];var weekNumber=jstoi_q(value);var janFirst=new Date(date.year,0,1);var endDate;if(janFirst.getDay()===0){endDate=__addDays(janFirst,weekDayNumber+7*(weekNumber-1))}else{endDate=__addDays(janFirst,7-janFirst.getDay()+weekDayNumber+7*(weekNumber-1))}date.day=endDate.getDate();date.month=endDate.getMonth()}else if(value=getMatch("W")){var weekDayNumber=DAY_NUMBERS_MON_FIRST[weekDay];var weekNumber=jstoi_q(value);var janFirst=new Date(date.year,0,1);var endDate;if(janFirst.getDay()===1){endDate=__addDays(janFirst,weekDayNumber+7*(weekNumber-1))}else{endDate=__addDays(janFirst,7-janFirst.getDay()+1+weekDayNumber+7*(weekNumber-1))}date.day=endDate.getDate();date.month=endDate.getMonth()}}var fullDate=new Date(date.year,date.month,date.day,date.hour,date.min,date.sec,0);HEAP32[tm>>2]=fullDate.getSeconds();HEAP32[tm+4>>2]=fullDate.getMinutes();HEAP32[tm+8>>2]=fullDate.getHours();HEAP32[tm+12>>2]=fullDate.getDate();HEAP32[tm+16>>2]=fullDate.getMonth();HEAP32[tm+20>>2]=fullDate.getFullYear()-1900;HEAP32[tm+24>>2]=fullDate.getDay();HEAP32[tm+28>>2]=__arraySum(__isLeapYear(fullDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,fullDate.getMonth()-1)+fullDate.getDate()-1;HEAP32[tm+32>>2]=0;return buf+intArrayFromString(matches[0]).length-1}return 0}Module["_strptime"]=_strptime;_strptime.sig="pppp";function _strptime_l(buf,format,tm){return _strptime(buf,format,tm)}Module["_strptime_l"]=_strptime_l;_strptime_l.sig="pppp";var ERRNO_MESSAGES={0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"};Module["ERRNO_MESSAGES"]=ERRNO_MESSAGES;function _gethostbyname_r(name,ret,buf,buflen,out,err){var data=_gethostbyname(name);_memcpy(ret,data,20);_free(data);HEAP32[err>>2]=0;HEAPU32[out>>2]=ret;return 0}Module["_gethostbyname_r"]=_gethostbyname_r;_gethostbyname_r.sig="ipppipp";function _endprotoent(){}Module["_endprotoent"]=_endprotoent;function _getprotoent(number){if(_setprotoent.index===Protocols.list.length){return 0}var result=Protocols.list[_setprotoent.index++];return result}Module["_getprotoent"]=_getprotoent;function _getprotobynumber(number){_setprotoent(true);var result=Protocols.map[number];return result}Module["_getprotobynumber"]=_getprotobynumber;function _emscripten_run_script(ptr){eval(UTF8ToString(ptr))}Module["_emscripten_run_script"]=_emscripten_run_script;_emscripten_run_script.sig="vp";function _emscripten_run_script_int(ptr){return eval(UTF8ToString(ptr))|0}Module["_emscripten_run_script_int"]=_emscripten_run_script_int;_emscripten_run_script_int.sig="ip";function _emscripten_run_script_string(ptr){var s=eval(UTF8ToString(ptr));if(s==null){return 0}s+="";var me=_emscripten_run_script_string;var len=lengthBytesUTF8(s);if(!me.bufferSize||me.bufferSize=4){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]|0}else{callstack+=line+"\n";continue}}var haveSourceMap=false;if(flags&8){var orig=emscripten_source_map.originalPositionFor({line:lineno,column:column});haveSourceMap=orig&&orig.source;if(haveSourceMap){if(flags&64){orig.source=orig.source.substring(orig.source.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=" at "+symbolName+" ("+orig.source+":"+orig.line+":"+orig.column+")\n"}}if(flags&16||!haveSourceMap){if(flags&64){file=file.substring(file.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=(haveSourceMap?" = "+symbolName:" at "+symbolName)+" ("+file+":"+lineno+":"+column+")\n"}if(flags&128&&stack_args[0]){if(stack_args[1]==symbolName&&stack_args[2].length>0){callstack=callstack.replace(/\s+$/,"");callstack+=" with values: "+stack_args[1]+stack_args[2]+"\n"}stack_args=traverseStack(stack_args[0])}}callstack=callstack.replace(/\s+$/,"");return callstack}Module["_emscripten_get_callstack_js"]=_emscripten_get_callstack_js;function _emscripten_get_callstack(flags,str,maxbytes){var callstack=_emscripten_get_callstack_js(flags);if(!str||maxbytes<=0){return lengthBytesUTF8(callstack)+1}var bytesWrittenExcludingNull=stringToUTF8(callstack,str,maxbytes);return bytesWrittenExcludingNull+1}Module["_emscripten_get_callstack"]=_emscripten_get_callstack;function _emscripten_log_js(flags,str){if(flags&24){str=str.replace(/\s+$/,"");str+=(str.length>0?"\n":"")+_emscripten_get_callstack_js(flags)}if(flags&1){if(flags&4){console.error(str)}else if(flags&2){console.warn(str)}else if(flags&512){console.info(str)}else if(flags&256){console.debug(str)}else{console.log(str)}}else if(flags&6){err(str)}else{out(str)}}Module["_emscripten_log_js"]=_emscripten_log_js;function reallyNegative(x){return x<0||x===0&&1/x===-Infinity}Module["reallyNegative"]=reallyNegative;function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}Module["convertI32PairToI53"]=convertI32PairToI53;function convertU32PairToI53(lo,hi){return(lo>>>0)+(hi>>>0)*4294967296}Module["convertU32PairToI53"]=convertU32PairToI53;function reSign(value,bits){if(value<=0){return value}var half=bits<=32?Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}Module["reSign"]=reSign;function unSign(value,bits){if(value>=0){return value}return bits<=32?2*Math.abs(1<>3];argIndex+=8}else if(type=="i64"){ret=[HEAP32[argIndex>>2],HEAP32[argIndex+4>>2]];argIndex+=8}else{type="i32";ret=HEAP32[argIndex>>2];argIndex+=4}return ret}var ret=[];var curr,next,currArg;while(1){var startTextIndex=textIndex;curr=HEAP8[textIndex>>0];if(curr===0)break;next=HEAP8[textIndex+1>>0];if(curr==37){var flagAlwaysSigned=false;var flagLeftAlign=false;var flagAlternative=false;var flagZeroPad=false;var flagPadSign=false;flagsLoop:while(1){switch(next){case 43:flagAlwaysSigned=true;break;case 45:flagLeftAlign=true;break;case 35:flagAlternative=true;break;case 48:if(flagZeroPad){break flagsLoop}else{flagZeroPad=true;break}case 32:flagPadSign=true;break;default:break flagsLoop}textIndex++;next=HEAP8[textIndex+1>>0]}var width=0;if(next==42){width=getNextArg("i32");textIndex++;next=HEAP8[textIndex+1>>0]}else{while(next>=48&&next<=57){width=width*10+(next-48);textIndex++;next=HEAP8[textIndex+1>>0]}}var precisionSet=false,precision=-1;if(next==46){precision=0;precisionSet=true;textIndex++;next=HEAP8[textIndex+1>>0];if(next==42){precision=getNextArg("i32");textIndex++}else{while(1){var precisionChr=HEAP8[textIndex+1>>0];if(precisionChr<48||precisionChr>57)break;precision=precision*10+(precisionChr-48);textIndex++}}next=HEAP8[textIndex+1>>0]}if(precision<0){precision=6;precisionSet=false}var argSize;switch(String.fromCharCode(next)){case"h":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==104){textIndex++;argSize=1}else{argSize=2}break;case"l":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==108){textIndex++;argSize=8}else{argSize=4}break;case"L":case"q":case"j":argSize=8;break;case"z":case"t":case"I":argSize=4;break;default:argSize=null}if(argSize)textIndex++;next=HEAP8[textIndex+1>>0];switch(String.fromCharCode(next)){case"d":case"i":case"u":case"o":case"x":case"X":case"p":{var signed=next==100||next==105;argSize=argSize||4;currArg=getNextArg("i"+argSize*8);var argText;if(argSize==8){currArg=next==117?convertU32PairToI53(currArg[0],currArg[1]):convertI32PairToI53(currArg[0],currArg[1])}if(argSize<=4){var limit=Math.pow(256,argSize)-1;currArg=(signed?reSign:unSign)(currArg&limit,argSize*8)}var currAbsArg=Math.abs(currArg);var prefix="";if(next==100||next==105){argText=reSign(currArg,8*argSize).toString(10)}else if(next==117){argText=unSign(currArg,8*argSize).toString(10);currArg=Math.abs(currArg)}else if(next==111){argText=(flagAlternative?"0":"")+currAbsArg.toString(8)}else if(next==120||next==88){prefix=flagAlternative&&currArg!=0?"0x":"";if(currArg<0){currArg=-currArg;argText=(currAbsArg-1).toString(16);var buffer=[];for(var i=0;i=0){if(flagAlwaysSigned){prefix="+"+prefix}else if(flagPadSign){prefix=" "+prefix}}if(argText.charAt(0)=="-"){prefix="-"+prefix;argText=argText.substr(1)}while(prefix.length+argText.lengthexponent&&exponent>=-4){next=(next==103?"f":"F").charCodeAt(0);precision-=exponent+1}else{next=(next==103?"e":"E").charCodeAt(0);precision--}effectivePrecision=Math.min(precision,20)}if(next==101||next==69){argText=currArg.toExponential(effectivePrecision);if(/[eE][-+]\d$/.test(argText)){argText=argText.slice(0,-1)+"0"+argText.slice(-1)}}else if(next==102||next==70){argText=currArg.toFixed(effectivePrecision);if(currArg===0&&reallyNegative(currArg)){argText="-"+argText}}var parts=argText.split("e");if(isGeneral&&!flagAlternative){while(parts[0].length>1&&parts[0].includes(".")&&(parts[0].slice(-1)=="0"||parts[0].slice(-1)==".")){parts[0]=parts[0].slice(0,-1)}}else{if(flagAlternative&&argText.indexOf(".")==-1)parts[0]+=".";while(precision>effectivePrecision++)parts[0]+="0"}argText=parts[0]+(parts.length>1?"e"+parts[1]:"");if(next==69)argText=argText.toUpperCase();if(currArg>=0){if(flagAlwaysSigned){argText="+"+argText}else if(flagPadSign){argText=" "+argText}}}while(argText.length>0])}}else{ret=ret.concat(intArrayFromString("(null)".substr(0,argLength),true))}if(flagLeftAlign){while(argLength0){ret.push(32)}if(!flagLeftAlign)ret.push(getNextArg("i8"));break}case"n":{var ptr=getNextArg("i32*");HEAP32[ptr>>2]=ret.length;break}case"%":{ret.push(curr);break}default:{for(var i=startTextIndex;i>0])}}}textIndex+=2}else{ret.push(curr);textIndex+=1}}return ret}Module["formatString"]=formatString;function _emscripten_log(flags,format,varargs){var result=formatString(format,varargs);var str=UTF8ArrayToString(result,0);_emscripten_log_js(flags,str)}Module["_emscripten_log"]=_emscripten_log;_emscripten_log.sig="vipp";function _emscripten_get_compiler_setting(name){throw"You must build with -sRETAIN_COMPILER_SETTINGS for getCompilerSetting or emscripten_get_compiler_setting to work"}Module["_emscripten_get_compiler_setting"]=_emscripten_get_compiler_setting;_emscripten_get_compiler_setting.sig="pp";function _emscripten_has_asyncify(){return 0}Module["_emscripten_has_asyncify"]=_emscripten_has_asyncify;function _emscripten_debugger(){debugger}Module["_emscripten_debugger"]=_emscripten_debugger;function _emscripten_print_double(x,to,max){var str=x+"";if(to)return stringToUTF8(str,to,max);else return lengthBytesUTF8(str)}Module["_emscripten_print_double"]=_emscripten_print_double;_emscripten_print_double.sig="iipi";function convertFrameToPC(frame){abort("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER");return 0}Module["convertFrameToPC"]=convertFrameToPC;function _emscripten_return_address(level){var callstack=jsStackTrace().split("\n");if(callstack[0]=="Error"){callstack.shift()}var caller=callstack[level+3];return convertFrameToPC(caller)}Module["_emscripten_return_address"]=_emscripten_return_address;_emscripten_return_address.sig="pi";var UNWIND_CACHE={};Module["UNWIND_CACHE"]=UNWIND_CACHE;function saveInUnwindCache(callstack){callstack.forEach(frame=>{var pc=convertFrameToPC(frame);if(pc){UNWIND_CACHE[pc]=frame}})}Module["saveInUnwindCache"]=saveInUnwindCache;function _emscripten_stack_snapshot(){var callstack=jsStackTrace().split("\n");if(callstack[0]=="Error"){callstack.shift()}saveInUnwindCache(callstack);UNWIND_CACHE.last_addr=convertFrameToPC(callstack[3]);UNWIND_CACHE.last_stack=callstack;return UNWIND_CACHE.last_addr}Module["_emscripten_stack_snapshot"]=_emscripten_stack_snapshot;_emscripten_stack_snapshot.sig="p";function _emscripten_stack_unwind_buffer(addr,buffer,count){var stack;if(UNWIND_CACHE.last_addr==addr){stack=UNWIND_CACHE.last_stack}else{stack=jsStackTrace().split("\n");if(stack[0]=="Error"){stack.shift()}saveInUnwindCache(stack)}var offset=3;while(stack[offset]&&convertFrameToPC(stack[offset])!=addr){++offset}for(var i=0;i>2]=convertFrameToPC(stack[i+offset])}return i}Module["_emscripten_stack_unwind_buffer"]=_emscripten_stack_unwind_buffer;_emscripten_stack_unwind_buffer.sig="ippi";function _emscripten_pc_get_function(pc){abort("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER")}Module["_emscripten_pc_get_function"]=_emscripten_pc_get_function;function convertPCtoSourceLocation(pc){if(UNWIND_CACHE.last_get_source_pc==pc)return UNWIND_CACHE.last_source;var match;var source;if(!source){var frame=UNWIND_CACHE[pc];if(!frame)return null;if(match=/\((.*):(\d+):(\d+)\)$/.exec(frame)){source={file:match[1],line:match[2],column:match[3]}}else if(match=/@(.*):(\d+):(\d+)/.exec(frame)){source={file:match[1],line:match[2],column:match[3]}}}UNWIND_CACHE.last_get_source_pc=pc;UNWIND_CACHE.last_source=source;return source}Module["convertPCtoSourceLocation"]=convertPCtoSourceLocation;function _emscripten_pc_get_file(pc){var result=convertPCtoSourceLocation(pc);if(!result)return 0;if(_emscripten_pc_get_file.ret)_free(_emscripten_pc_get_file.ret);_emscripten_pc_get_file.ret=allocateUTF8(result.file);return _emscripten_pc_get_file.ret}Module["_emscripten_pc_get_file"]=_emscripten_pc_get_file;_emscripten_pc_get_file.sig="pp";function _emscripten_pc_get_line(pc){var result=convertPCtoSourceLocation(pc);return result?result.line:0}Module["_emscripten_pc_get_line"]=_emscripten_pc_get_line;_emscripten_pc_get_line.sig="ip";function _emscripten_pc_get_column(pc){var result=convertPCtoSourceLocation(pc);return result?result.column||0:0}Module["_emscripten_pc_get_column"]=_emscripten_pc_get_column;_emscripten_pc_get_column.sig="ip";function _emscripten_get_module_name(buf,length){return stringToUTF8(wasmBinaryFile,buf,length)}Module["_emscripten_get_module_name"]=_emscripten_get_module_name;_emscripten_get_module_name.sig="ppp";function _emscripten_asm_const_double(code,sigPtr,argbuf){return runEmAsmFunction(code,sigPtr,argbuf)}Module["_emscripten_asm_const_double"]=_emscripten_asm_const_double;_emscripten_asm_const_double.sig="dppp";var _emscripten_asm_const_ptr=_emscripten_asm_const_int;Module["_emscripten_asm_const_ptr"]=_emscripten_asm_const_ptr;function runMainThreadEmAsm(code,sigPtr,argbuf,sync){var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}Module["runMainThreadEmAsm"]=runMainThreadEmAsm;runMainThreadEmAsm.sig="iippi";function _emscripten_asm_const_int_sync_on_main_thread(code,sigPtr,argbuf){return runMainThreadEmAsm(code,sigPtr,argbuf,1)}Module["_emscripten_asm_const_int_sync_on_main_thread"]=_emscripten_asm_const_int_sync_on_main_thread;_emscripten_asm_const_int_sync_on_main_thread.sig="iiii";var _emscripten_asm_const_double_sync_on_main_thread=_emscripten_asm_const_int_sync_on_main_thread;Module["_emscripten_asm_const_double_sync_on_main_thread"]=_emscripten_asm_const_double_sync_on_main_thread;function _emscripten_asm_const_async_on_main_thread(code,sigPtr,argbuf){return runMainThreadEmAsm(code,sigPtr,argbuf,0)}Module["_emscripten_asm_const_async_on_main_thread"]=_emscripten_asm_const_async_on_main_thread;function jstoi_s(str){return Number(str)}Module["jstoi_s"]=jstoi_s;function __Unwind_Backtrace(func,arg){var trace=_emscripten_get_callstack_js();var parts=trace.split("\n");for(var i=0;i{if(ctx.state==="suspended")ctx.resume()})}})})}Module["autoResumeAudioContext"]=autoResumeAudioContext;function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=0;Object.assign(argCache,arguments);return dynCall(sig,ptr,argCache)}}Module["getDynCaller"]=getDynCaller;function _emscripten_force_exit(status){noExitRuntime=false;_exit(status)}Module["_emscripten_force_exit"]=_emscripten_force_exit;_emscripten_force_exit.sig="vi";function _emscripten_throw_number(number){throw number}Module["_emscripten_throw_number"]=_emscripten_throw_number;function _emscripten_throw_string(str){throw UTF8ToString(str)}Module["_emscripten_throw_string"]=_emscripten_throw_string;function runtimeKeepalivePush(){}Module["runtimeKeepalivePush"]=runtimeKeepalivePush;runtimeKeepalivePush.sig="v";function runtimeKeepalivePop(){}Module["runtimeKeepalivePop"]=runtimeKeepalivePop;runtimeKeepalivePop.sig="v";var _emscripten_runtime_keepalive_push=runtimeKeepalivePush;Module["_emscripten_runtime_keepalive_push"]=_emscripten_runtime_keepalive_push;var _emscripten_runtime_keepalive_pop=runtimeKeepalivePop;Module["_emscripten_runtime_keepalive_pop"]=_emscripten_runtime_keepalive_pop;function _emscripten_runtime_keepalive_check(){return keepRuntimeAlive()}Module["_emscripten_runtime_keepalive_check"]=_emscripten_runtime_keepalive_check;function maybeExit(){}Module["maybeExit"]=maybeExit;function safeSetTimeout(func,timeout){return setTimeout(function(){callUserCallback(func)},timeout)}Module["safeSetTimeout"]=safeSetTimeout;var ___global_base=1024;Module["___global_base"]=___global_base;function __emscripten_fs_load_embedded_files(ptr){do{var name_addr=HEAPU32[ptr>>2];ptr+=4;var len=HEAPU32[ptr>>2];ptr+=4;var content=HEAPU32[ptr>>2];ptr+=4;var name=UTF8ToString(name_addr);FS.createPath("/",PATH.dirname(name),true,true);FS.createDataFile(name,null,HEAP8.subarray(content,content+len),true,true,true)}while(HEAPU32[ptr>>2])}Module["__emscripten_fs_load_embedded_files"]=__emscripten_fs_load_embedded_files;__emscripten_fs_load_embedded_files.sig="vp";var POINTER_SIZE=4;Module["POINTER_SIZE"]=POINTER_SIZE;function getNativeTypeSize(type){switch(type){case"i1":case"i8":case"u8":return 1;case"i16":case"u16":return 2;case"i32":case"u32":return 4;case"i64":case"u64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return POINTER_SIZE}if(type[0]==="i"){const bits=Number(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}return 0}}}Module["getNativeTypeSize"]=getNativeTypeSize;var STACK_SIZE=5242880;Module["STACK_SIZE"]=STACK_SIZE;var STACK_ALIGN=16;Module["STACK_ALIGN"]=STACK_ALIGN;var ASSERTIONS=0;Module["ASSERTIONS"]=ASSERTIONS;function writeI53ToI64Clamped(ptr,num){if(num>0x8000000000000000){HEAPU32[ptr>>2]=4294967295;HEAPU32[ptr+4>>2]=2147483647}else if(num<-0x8000000000000000){HEAPU32[ptr>>2]=0;HEAPU32[ptr+4>>2]=2147483648}else{HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}}Module["writeI53ToI64Clamped"]=writeI53ToI64Clamped;function writeI53ToI64Signaling(ptr,num){if(num>0x8000000000000000||num<-0x8000000000000000){throw"RangeError:"+num}HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}Module["writeI53ToI64Signaling"]=writeI53ToI64Signaling;function writeI53ToU64Clamped(ptr,num){if(num>0x10000000000000000)HEAPU32[ptr>>2]=HEAPU32[ptr+4>>2]=4294967295;else if(num<0)HEAPU32[ptr>>2]=HEAPU32[ptr+4>>2]=0;else{HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}}Module["writeI53ToU64Clamped"]=writeI53ToU64Clamped;function writeI53ToU64Signaling(ptr,num){if(num<0||num>0x10000000000000000){throw"RangeError:"+num}HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}Module["writeI53ToU64Signaling"]=writeI53ToU64Signaling;function readI53FromU64(ptr){return HEAPU32[ptr>>2]+HEAPU32[ptr+4>>2]*4294967296}Module["readI53FromU64"]=readI53FromU64;function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}Module["convertI32PairToI53Checked"]=convertI32PairToI53Checked;function getCFunc(ident){var func=Module["_"+ident];return func}Module["getCFunc"]=getCFunc;function ccall(ident,returnType,argTypes,args,opts){var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;itype==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}}Module["cwrap"]=cwrap;function removeFunction(index){functionsInTableMap.delete(getWasmTableEntry(index));freeTableIndexes.push(index)}Module["removeFunction"]=removeFunction;function _emscripten_math_cbrt(x){return Math.cbrt(x)}Module["_emscripten_math_cbrt"]=_emscripten_math_cbrt;function _emscripten_math_pow(x,y){return Math.pow(x,y)}Module["_emscripten_math_pow"]=_emscripten_math_pow;function _emscripten_math_random(){return Math.random()}Module["_emscripten_math_random"]=_emscripten_math_random;function _emscripten_math_sign(x){return Math.sign(x)}Module["_emscripten_math_sign"]=_emscripten_math_sign;function _emscripten_math_sqrt(x){return Math.sqrt(x)}Module["_emscripten_math_sqrt"]=_emscripten_math_sqrt;function _emscripten_math_exp(x){return Math.exp(x)}Module["_emscripten_math_exp"]=_emscripten_math_exp;function _emscripten_math_expm1(x){return Math.expm1(x)}Module["_emscripten_math_expm1"]=_emscripten_math_expm1;function _emscripten_math_fmod(x,y){return x%y}Module["_emscripten_math_fmod"]=_emscripten_math_fmod;function _emscripten_math_log(x){return Math.log(x)}Module["_emscripten_math_log"]=_emscripten_math_log;function _emscripten_math_log1p(x){return Math.log1p(x)}Module["_emscripten_math_log1p"]=_emscripten_math_log1p;function _emscripten_math_log10(x){return Math.log10(x)}Module["_emscripten_math_log10"]=_emscripten_math_log10;function _emscripten_math_log2(x){return Math.log2(x)}Module["_emscripten_math_log2"]=_emscripten_math_log2;function _emscripten_math_round(x){return Math.round(x)}Module["_emscripten_math_round"]=_emscripten_math_round;function _emscripten_math_acos(x){return Math.acos(x)}Module["_emscripten_math_acos"]=_emscripten_math_acos;function _emscripten_math_acosh(x){return Math.acosh(x)}Module["_emscripten_math_acosh"]=_emscripten_math_acosh;function _emscripten_math_asin(x){return Math.asin(x)}Module["_emscripten_math_asin"]=_emscripten_math_asin;function _emscripten_math_asinh(x){return Math.asinh(x)}Module["_emscripten_math_asinh"]=_emscripten_math_asinh;function _emscripten_math_atan(x){return Math.atan(x)}Module["_emscripten_math_atan"]=_emscripten_math_atan;function _emscripten_math_atanh(x){return Math.atanh(x)}Module["_emscripten_math_atanh"]=_emscripten_math_atanh;function _emscripten_math_atan2(y,x){return Math.atan2(y,x)}Module["_emscripten_math_atan2"]=_emscripten_math_atan2;function _emscripten_math_cos(x){return Math.cos(x)}Module["_emscripten_math_cos"]=_emscripten_math_cos;function _emscripten_math_cosh(x){return Math.cosh(x)}Module["_emscripten_math_cosh"]=_emscripten_math_cosh;function _emscripten_math_hypot(count,varargs){var args=[];for(var i=0;i>3)+i]);return Math.hypot.apply(null,args)}Module["_emscripten_math_hypot"]=_emscripten_math_hypot;_emscripten_math_hypot.sig="iip";function _emscripten_math_sin(x){return Math.sin(x)}Module["_emscripten_math_sin"]=_emscripten_math_sin;function _emscripten_math_sinh(x){return Math.sinh(x)}Module["_emscripten_math_sinh"]=_emscripten_math_sinh;function _emscripten_math_tan(x){return Math.tan(x)}Module["_emscripten_math_tan"]=_emscripten_math_tan;function _emscripten_math_tanh(x){return Math.tanh(x)}Module["_emscripten_math_tanh"]=_emscripten_math_tanh;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function AsciiToString(ptr){var str="";while(1){var ch=HEAPU8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;Module["UTF16Decoder"]=UTF16Decoder;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}Module["UTF16ToString"]=UTF16ToString;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}Module["stringToUTF16"]=stringToUTF16;function lengthBytesUTF16(str){return str.length*2}Module["lengthBytesUTF16"]=lengthBytesUTF16;function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}Module["stringToUTF32"]=stringToUTF32;function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}Module["lengthBytesUTF32"]=lengthBytesUTF32;function writeStringToMemory(string,buffer,dontAddNull){warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module["writeStringToMemory"]=writeStringToMemory;function ___syscall_rename(old_path,new_path){try{old_path=SYSCALLS.getStr(old_path);new_path=SYSCALLS.getStr(new_path);FS.rename(old_path,new_path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_rename"]=___syscall_rename;___syscall_rename.sig="ipp";var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence2?UTF8ToString(cString):cString}Module["maybeCStringToJsString"]=maybeCStringToJsString;var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];Module["specialHTMLTargets"]=specialHTMLTargets;function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement}Module["findEventTarget"]=findEventTarget;function registerKeyEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.keyEvent)JSEvents.keyEvent=_malloc(176);var keyEventHandlerFunc=function(e){var keyEventData=JSEvents.keyEvent;HEAPF64[keyEventData>>3]=e.timeStamp;var idx=keyEventData>>2;HEAP32[idx+2]=e.location;HEAP32[idx+3]=e.ctrlKey;HEAP32[idx+4]=e.shiftKey;HEAP32[idx+5]=e.altKey;HEAP32[idx+6]=e.metaKey;HEAP32[idx+7]=e.repeat;HEAP32[idx+8]=e.charCode;HEAP32[idx+9]=e.keyCode;HEAP32[idx+10]=e.which;stringToUTF8(e.key||"",keyEventData+44,32);stringToUTF8(e.code||"",keyEventData+76,32);stringToUTF8(e.char||"",keyEventData+108,32);stringToUTF8(e.locale||"",keyEventData+140,32);if(getWasmTableEntry(callbackfunc)(eventTypeId,keyEventData,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:keyEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerKeyEventCallback"]=registerKeyEventCallback;function findCanvasEventTarget(target){return findEventTarget(target)}Module["findCanvasEventTarget"]=findCanvasEventTarget;function _emscripten_set_keypress_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerKeyEventCallback(target,userData,useCapture,callbackfunc,1,"keypress",targetThread);return 0}Module["_emscripten_set_keypress_callback_on_thread"]=_emscripten_set_keypress_callback_on_thread;_emscripten_set_keypress_callback_on_thread.sig="iiiiii";function _emscripten_set_keydown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerKeyEventCallback(target,userData,useCapture,callbackfunc,2,"keydown",targetThread);return 0}Module["_emscripten_set_keydown_callback_on_thread"]=_emscripten_set_keydown_callback_on_thread;_emscripten_set_keydown_callback_on_thread.sig="iiiiii";function _emscripten_set_keyup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerKeyEventCallback(target,userData,useCapture,callbackfunc,3,"keyup",targetThread);return 0}Module["_emscripten_set_keyup_callback_on_thread"]=_emscripten_set_keyup_callback_on_thread;_emscripten_set_keyup_callback_on_thread.sig="iiiiii";function getBoundingClientRect(e){return specialHTMLTargets.indexOf(e)<0?e.getBoundingClientRect():{"left":0,"top":0}}Module["getBoundingClientRect"]=getBoundingClientRect;function fillMouseEventData(eventStruct,e,target){HEAPF64[eventStruct>>3]=e.timeStamp;var idx=eventStruct>>2;HEAP32[idx+2]=e.screenX;HEAP32[idx+3]=e.screenY;HEAP32[idx+4]=e.clientX;HEAP32[idx+5]=e.clientY;HEAP32[idx+6]=e.ctrlKey;HEAP32[idx+7]=e.shiftKey;HEAP32[idx+8]=e.altKey;HEAP32[idx+9]=e.metaKey;HEAP16[idx*2+20]=e.button;HEAP16[idx*2+21]=e.buttons;HEAP32[idx+11]=e["movementX"];HEAP32[idx+12]=e["movementY"];var rect=getBoundingClientRect(target);HEAP32[idx+13]=e.clientX-rect.left;HEAP32[idx+14]=e.clientY-rect.top}Module["fillMouseEventData"]=fillMouseEventData;function registerMouseEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.mouseEvent)JSEvents.mouseEvent=_malloc(72);target=findEventTarget(target);var mouseEventHandlerFunc=function(e=event){fillMouseEventData(JSEvents.mouseEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.mouseEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString!="mousemove"&&eventTypeString!="mouseenter"&&eventTypeString!="mouseleave",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:mouseEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerMouseEventCallback"]=registerMouseEventCallback;function _emscripten_set_click_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,4,"click",targetThread);return 0}Module["_emscripten_set_click_callback_on_thread"]=_emscripten_set_click_callback_on_thread;_emscripten_set_click_callback_on_thread.sig="iiiiii";function _emscripten_set_mousedown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,5,"mousedown",targetThread);return 0}Module["_emscripten_set_mousedown_callback_on_thread"]=_emscripten_set_mousedown_callback_on_thread;_emscripten_set_mousedown_callback_on_thread.sig="iiiiii";function _emscripten_set_mouseup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,6,"mouseup",targetThread);return 0}Module["_emscripten_set_mouseup_callback_on_thread"]=_emscripten_set_mouseup_callback_on_thread;_emscripten_set_mouseup_callback_on_thread.sig="iiiiii";function _emscripten_set_dblclick_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,7,"dblclick",targetThread);return 0}Module["_emscripten_set_dblclick_callback_on_thread"]=_emscripten_set_dblclick_callback_on_thread;_emscripten_set_dblclick_callback_on_thread.sig="iiiiii";function _emscripten_set_mousemove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,8,"mousemove",targetThread);return 0}Module["_emscripten_set_mousemove_callback_on_thread"]=_emscripten_set_mousemove_callback_on_thread;_emscripten_set_mousemove_callback_on_thread.sig="iiiiii";function _emscripten_set_mouseenter_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,33,"mouseenter",targetThread);return 0}Module["_emscripten_set_mouseenter_callback_on_thread"]=_emscripten_set_mouseenter_callback_on_thread;_emscripten_set_mouseenter_callback_on_thread.sig="iiiiii";function _emscripten_set_mouseleave_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,34,"mouseleave",targetThread);return 0}Module["_emscripten_set_mouseleave_callback_on_thread"]=_emscripten_set_mouseleave_callback_on_thread;_emscripten_set_mouseleave_callback_on_thread.sig="iiiiii";function _emscripten_set_mouseover_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,35,"mouseover",targetThread);return 0}Module["_emscripten_set_mouseover_callback_on_thread"]=_emscripten_set_mouseover_callback_on_thread;_emscripten_set_mouseover_callback_on_thread.sig="iiiiii";function _emscripten_set_mouseout_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,36,"mouseout",targetThread);return 0}Module["_emscripten_set_mouseout_callback_on_thread"]=_emscripten_set_mouseout_callback_on_thread;_emscripten_set_mouseout_callback_on_thread.sig="iiiiii";function _emscripten_get_mouse_status(mouseState){if(!JSEvents.mouseEvent)return-7;HEAP8.set(HEAP8.subarray(JSEvents.mouseEvent,JSEvents.mouseEvent+72),mouseState);return 0}Module["_emscripten_get_mouse_status"]=_emscripten_get_mouse_status;_emscripten_get_mouse_status.sig="ii";function registerWheelEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.wheelEvent)JSEvents.wheelEvent=_malloc(104);var wheelHandlerFunc=function(e=event){var wheelEvent=JSEvents.wheelEvent;fillMouseEventData(wheelEvent,e,target);HEAPF64[wheelEvent+72>>3]=e["deltaX"];HEAPF64[wheelEvent+80>>3]=e["deltaY"];HEAPF64[wheelEvent+88>>3]=e["deltaZ"];HEAP32[wheelEvent+96>>2]=e["deltaMode"];if(getWasmTableEntry(callbackfunc)(eventTypeId,wheelEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:wheelHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerWheelEventCallback"]=registerWheelEventCallback;function _emscripten_set_wheel_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target=findEventTarget(target);if(typeof target.onwheel!="undefined"){registerWheelEventCallback(target,userData,useCapture,callbackfunc,9,"wheel",targetThread);return 0}else{return-1}}Module["_emscripten_set_wheel_callback_on_thread"]=_emscripten_set_wheel_callback_on_thread;_emscripten_set_wheel_callback_on_thread.sig="iiiiii";function registerUiEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.uiEvent)JSEvents.uiEvent=_malloc(36);target=findEventTarget(target);var uiEventHandlerFunc=function(e=event){if(e.target!=target){return}var b=document.body;if(!b){return}var uiEvent=JSEvents.uiEvent;HEAP32[uiEvent>>2]=e.detail;HEAP32[uiEvent+4>>2]=b.clientWidth;HEAP32[uiEvent+8>>2]=b.clientHeight;HEAP32[uiEvent+12>>2]=innerWidth;HEAP32[uiEvent+16>>2]=innerHeight;HEAP32[uiEvent+20>>2]=outerWidth;HEAP32[uiEvent+24>>2]=outerHeight;HEAP32[uiEvent+28>>2]=pageXOffset;HEAP32[uiEvent+32>>2]=pageYOffset;if(getWasmTableEntry(callbackfunc)(eventTypeId,uiEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:uiEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerUiEventCallback"]=registerUiEventCallback;function _emscripten_set_resize_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerUiEventCallback(target,userData,useCapture,callbackfunc,10,"resize",targetThread);return 0}Module["_emscripten_set_resize_callback_on_thread"]=_emscripten_set_resize_callback_on_thread;_emscripten_set_resize_callback_on_thread.sig="iiiiii";function _emscripten_set_scroll_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerUiEventCallback(target,userData,useCapture,callbackfunc,11,"scroll",targetThread);return 0}Module["_emscripten_set_scroll_callback_on_thread"]=_emscripten_set_scroll_callback_on_thread;_emscripten_set_scroll_callback_on_thread.sig="iiiiii";function registerFocusEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.focusEvent)JSEvents.focusEvent=_malloc(256);var focusEventHandlerFunc=function(e=event){var nodeName=JSEvents.getNodeNameForTarget(e.target);var id=e.target.id?e.target.id:"";var focusEvent=JSEvents.focusEvent;stringToUTF8(nodeName,focusEvent+0,128);stringToUTF8(id,focusEvent+128,128);if(getWasmTableEntry(callbackfunc)(eventTypeId,focusEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:focusEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerFocusEventCallback"]=registerFocusEventCallback;function _emscripten_set_blur_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerFocusEventCallback(target,userData,useCapture,callbackfunc,12,"blur",targetThread);return 0}Module["_emscripten_set_blur_callback_on_thread"]=_emscripten_set_blur_callback_on_thread;_emscripten_set_blur_callback_on_thread.sig="iiiiii";function _emscripten_set_focus_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerFocusEventCallback(target,userData,useCapture,callbackfunc,13,"focus",targetThread);return 0}Module["_emscripten_set_focus_callback_on_thread"]=_emscripten_set_focus_callback_on_thread;_emscripten_set_focus_callback_on_thread.sig="iiiiii";function _emscripten_set_focusin_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerFocusEventCallback(target,userData,useCapture,callbackfunc,14,"focusin",targetThread);return 0}Module["_emscripten_set_focusin_callback_on_thread"]=_emscripten_set_focusin_callback_on_thread;_emscripten_set_focusin_callback_on_thread.sig="iiiiii";function _emscripten_set_focusout_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerFocusEventCallback(target,userData,useCapture,callbackfunc,15,"focusout",targetThread);return 0}Module["_emscripten_set_focusout_callback_on_thread"]=_emscripten_set_focusout_callback_on_thread;_emscripten_set_focusout_callback_on_thread.sig="iiiiii";function fillDeviceOrientationEventData(eventStruct,e,target){HEAPF64[eventStruct>>3]=e.alpha;HEAPF64[eventStruct+8>>3]=e.beta;HEAPF64[eventStruct+16>>3]=e.gamma;HEAP32[eventStruct+24>>2]=e.absolute}Module["fillDeviceOrientationEventData"]=fillDeviceOrientationEventData;function registerDeviceOrientationEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.deviceOrientationEvent)JSEvents.deviceOrientationEvent=_malloc(32);var deviceOrientationEventHandlerFunc=function(e=event){fillDeviceOrientationEventData(JSEvents.deviceOrientationEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.deviceOrientationEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:deviceOrientationEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerDeviceOrientationEventCallback"]=registerDeviceOrientationEventCallback;function _emscripten_set_deviceorientation_callback_on_thread(userData,useCapture,callbackfunc,targetThread){registerDeviceOrientationEventCallback(2,userData,useCapture,callbackfunc,16,"deviceorientation",targetThread);return 0}Module["_emscripten_set_deviceorientation_callback_on_thread"]=_emscripten_set_deviceorientation_callback_on_thread;_emscripten_set_deviceorientation_callback_on_thread.sig="iiiii";function _emscripten_get_deviceorientation_status(orientationState){if(!JSEvents.deviceOrientationEvent)return-7;HEAP32.set(HEAP32.subarray(JSEvents.deviceOrientationEvent,32),orientationState);return 0}Module["_emscripten_get_deviceorientation_status"]=_emscripten_get_deviceorientation_status;_emscripten_get_deviceorientation_status.sig="ii";function fillDeviceMotionEventData(eventStruct,e,target){var supportedFields=0;var a=e["acceleration"];supportedFields|=a&&1;var ag=e["accelerationIncludingGravity"];supportedFields|=ag&&2;var rr=e["rotationRate"];supportedFields|=rr&&4;a=a||{};ag=ag||{};rr=rr||{};HEAPF64[eventStruct>>3]=a["x"];HEAPF64[eventStruct+8>>3]=a["y"];HEAPF64[eventStruct+16>>3]=a["z"];HEAPF64[eventStruct+24>>3]=ag["x"];HEAPF64[eventStruct+32>>3]=ag["y"];HEAPF64[eventStruct+40>>3]=ag["z"];HEAPF64[eventStruct+48>>3]=rr["alpha"];HEAPF64[eventStruct+56>>3]=rr["beta"];HEAPF64[eventStruct+64>>3]=rr["gamma"]}Module["fillDeviceMotionEventData"]=fillDeviceMotionEventData;function registerDeviceMotionEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.deviceMotionEvent)JSEvents.deviceMotionEvent=_malloc(80);var deviceMotionEventHandlerFunc=function(e=event){fillDeviceMotionEventData(JSEvents.deviceMotionEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.deviceMotionEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:deviceMotionEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerDeviceMotionEventCallback"]=registerDeviceMotionEventCallback;function _emscripten_set_devicemotion_callback_on_thread(userData,useCapture,callbackfunc,targetThread){registerDeviceMotionEventCallback(2,userData,useCapture,callbackfunc,17,"devicemotion",targetThread);return 0}Module["_emscripten_set_devicemotion_callback_on_thread"]=_emscripten_set_devicemotion_callback_on_thread;_emscripten_set_devicemotion_callback_on_thread.sig="iiiii";function _emscripten_get_devicemotion_status(motionState){if(!JSEvents.deviceMotionEvent)return-7;HEAP32.set(HEAP32.subarray(JSEvents.deviceMotionEvent,80),motionState);return 0}Module["_emscripten_get_devicemotion_status"]=_emscripten_get_devicemotion_status;_emscripten_get_devicemotion_status.sig="ii";function screenOrientation(){if(!screen)return undefined;return screen.orientation||screen.mozOrientation||screen.webkitOrientation||screen.msOrientation}Module["screenOrientation"]=screenOrientation;function fillOrientationChangeEventData(eventStruct){var orientations=["portrait-primary","portrait-secondary","landscape-primary","landscape-secondary"];var orientations2=["portrait","portrait","landscape","landscape"];var orientationString=screenOrientation();var orientation=orientations.indexOf(orientationString);if(orientation==-1){orientation=orientations2.indexOf(orientationString)}HEAP32[eventStruct>>2]=1<>2]=orientation}Module["fillOrientationChangeEventData"]=fillOrientationChangeEventData;function registerOrientationChangeEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.orientationChangeEvent)JSEvents.orientationChangeEvent=_malloc(8);var orientationChangeEventHandlerFunc=function(e=event){var orientationChangeEvent=JSEvents.orientationChangeEvent;fillOrientationChangeEventData(orientationChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,orientationChangeEvent,userData))e.preventDefault()};if(eventTypeString=="orientationchange"&&screen.mozOrientation!==undefined){eventTypeString="mozorientationchange"}var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:orientationChangeEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerOrientationChangeEventCallback"]=registerOrientationChangeEventCallback;function _emscripten_set_orientationchange_callback_on_thread(userData,useCapture,callbackfunc,targetThread){if(!screen||!screen["addEventListener"])return-1;registerOrientationChangeEventCallback(screen,userData,useCapture,callbackfunc,18,"orientationchange",targetThread);return 0}Module["_emscripten_set_orientationchange_callback_on_thread"]=_emscripten_set_orientationchange_callback_on_thread;_emscripten_set_orientationchange_callback_on_thread.sig="iiiii";function _emscripten_get_orientation_status(orientationChangeEvent){if(!screenOrientation()&&typeof orientation=="undefined")return-1;fillOrientationChangeEventData(orientationChangeEvent);return 0}Module["_emscripten_get_orientation_status"]=_emscripten_get_orientation_status;_emscripten_get_orientation_status.sig="ii";function _emscripten_lock_orientation(allowedOrientations){var orientations=[];if(allowedOrientations&1)orientations.push("portrait-primary");if(allowedOrientations&2)orientations.push("portrait-secondary");if(allowedOrientations&4)orientations.push("landscape-primary");if(allowedOrientations&8)orientations.push("landscape-secondary");var succeeded;if(screen.lockOrientation){succeeded=screen.lockOrientation(orientations)}else if(screen.mozLockOrientation){succeeded=screen.mozLockOrientation(orientations)}else if(screen.webkitLockOrientation){succeeded=screen.webkitLockOrientation(orientations)}else if(screen.msLockOrientation){succeeded=screen.msLockOrientation(orientations)}else{return-1}if(succeeded){return 0}return-6}Module["_emscripten_lock_orientation"]=_emscripten_lock_orientation;_emscripten_lock_orientation.sig="ii";function _emscripten_unlock_orientation(){if(screen.unlockOrientation){screen.unlockOrientation()}else if(screen.mozUnlockOrientation){screen.mozUnlockOrientation()}else if(screen.webkitUnlockOrientation){screen.webkitUnlockOrientation()}else if(screen.msUnlockOrientation){screen.msUnlockOrientation()}else{return-1}return 0}Module["_emscripten_unlock_orientation"]=_emscripten_unlock_orientation;_emscripten_unlock_orientation.sig="i";function fillFullscreenChangeEventData(eventStruct){var fullscreenElement=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement;var isFullscreen=!!fullscreenElement;HEAP32[eventStruct>>2]=isFullscreen;HEAP32[eventStruct+4>>2]=JSEvents.fullscreenEnabled();var reportedElement=isFullscreen?fullscreenElement:JSEvents.previousFullscreenElement;var nodeName=JSEvents.getNodeNameForTarget(reportedElement);var id=reportedElement&&reportedElement.id?reportedElement.id:"";stringToUTF8(nodeName,eventStruct+8,128);stringToUTF8(id,eventStruct+136,128);HEAP32[eventStruct+264>>2]=reportedElement?reportedElement.clientWidth:0;HEAP32[eventStruct+268>>2]=reportedElement?reportedElement.clientHeight:0;HEAP32[eventStruct+272>>2]=screen.width;HEAP32[eventStruct+276>>2]=screen.height;if(isFullscreen){JSEvents.previousFullscreenElement=fullscreenElement}}Module["fillFullscreenChangeEventData"]=fillFullscreenChangeEventData;function registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.fullscreenChangeEvent)JSEvents.fullscreenChangeEvent=_malloc(280);var fullscreenChangeEventhandlerFunc=function(e=event){var fullscreenChangeEvent=JSEvents.fullscreenChangeEvent;fillFullscreenChangeEventData(fullscreenChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,fullscreenChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:fullscreenChangeEventhandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerFullscreenChangeEventCallback"]=registerFullscreenChangeEventCallback;function _emscripten_set_fullscreenchange_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"fullscreenchange",targetThread);registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"webkitfullscreenchange",targetThread);return 0}Module["_emscripten_set_fullscreenchange_callback_on_thread"]=_emscripten_set_fullscreenchange_callback_on_thread;_emscripten_set_fullscreenchange_callback_on_thread.sig="iiiiii";function _emscripten_get_fullscreen_status(fullscreenStatus){if(!JSEvents.fullscreenEnabled())return-1;fillFullscreenChangeEventData(fullscreenStatus);return 0}Module["_emscripten_get_fullscreen_status"]=_emscripten_get_fullscreen_status;_emscripten_get_fullscreen_status.sig="ii";function _emscripten_get_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;HEAP32[width>>2]=canvas.width;HEAP32[height>>2]=canvas.height}Module["_emscripten_get_canvas_element_size"]=_emscripten_get_canvas_element_size;_emscripten_get_canvas_element_size.sig="ippp";function getCanvasElementSize(target){return withStackSave(function(){var w=stackAlloc(8);var h=w+4;var targetInt=stackAlloc(target.id.length+1);stringToUTF8(target.id,targetInt,target.id.length+1);var ret=_emscripten_get_canvas_element_size(targetInt,w,h);var size=[HEAP32[w>>2],HEAP32[h>>2]];return size})}Module["getCanvasElementSize"]=getCanvasElementSize;function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;return 0}Module["_emscripten_set_canvas_element_size"]=_emscripten_set_canvas_element_size;_emscripten_set_canvas_element_size.sig="iiii";function setCanvasElementSize(target,width,height){if(!target.controlTransferredOffscreen){target.width=width;target.height=height}else{withStackSave(function(){var targetInt=stackAlloc(target.id.length+1);stringToUTF8(target.id,targetInt,target.id.length+1);_emscripten_set_canvas_element_size(targetInt,width,height)})}}Module["setCanvasElementSize"]=setCanvasElementSize;function registerRestoreOldStyle(canvas){var canvasSize=getCanvasElementSize(canvas);var oldWidth=canvasSize[0];var oldHeight=canvasSize[1];var oldCssWidth=canvas.style.width;var oldCssHeight=canvas.style.height;var oldBackgroundColor=canvas.style.backgroundColor;var oldDocumentBackgroundColor=document.body.style.backgroundColor;var oldPaddingLeft=canvas.style.paddingLeft;var oldPaddingRight=canvas.style.paddingRight;var oldPaddingTop=canvas.style.paddingTop;var oldPaddingBottom=canvas.style.paddingBottom;var oldMarginLeft=canvas.style.marginLeft;var oldMarginRight=canvas.style.marginRight;var oldMarginTop=canvas.style.marginTop;var oldMarginBottom=canvas.style.marginBottom;var oldDocumentBodyMargin=document.body.style.margin;var oldDocumentOverflow=document.documentElement.style.overflow;var oldDocumentScroll=document.body.scroll;var oldImageRendering=canvas.style.imageRendering;function restoreOldStyle(){var fullscreenElement=document.fullscreenElement||document.webkitFullscreenElement;if(!fullscreenElement){document.removeEventListener("fullscreenchange",restoreOldStyle);document.removeEventListener("webkitfullscreenchange",restoreOldStyle);setCanvasElementSize(canvas,oldWidth,oldHeight);canvas.style.width=oldCssWidth;canvas.style.height=oldCssHeight;canvas.style.backgroundColor=oldBackgroundColor;if(!oldDocumentBackgroundColor)document.body.style.backgroundColor="white";document.body.style.backgroundColor=oldDocumentBackgroundColor;canvas.style.paddingLeft=oldPaddingLeft;canvas.style.paddingRight=oldPaddingRight;canvas.style.paddingTop=oldPaddingTop;canvas.style.paddingBottom=oldPaddingBottom;canvas.style.marginLeft=oldMarginLeft;canvas.style.marginRight=oldMarginRight;canvas.style.marginTop=oldMarginTop;canvas.style.marginBottom=oldMarginBottom;document.body.style.margin=oldDocumentBodyMargin;document.documentElement.style.overflow=oldDocumentOverflow;document.body.scroll=oldDocumentScroll;canvas.style.imageRendering=oldImageRendering;if(canvas.GLctxObject)canvas.GLctxObject.GLctx.viewport(0,0,oldWidth,oldHeight);if(currentFullscreenStrategy.canvasResizedCallback){getWasmTableEntry(currentFullscreenStrategy.canvasResizedCallback)(37,0,currentFullscreenStrategy.canvasResizedCallbackUserData)}}}document.addEventListener("fullscreenchange",restoreOldStyle);document.addEventListener("webkitfullscreenchange",restoreOldStyle);return restoreOldStyle}Module["registerRestoreOldStyle"]=registerRestoreOldStyle;function setLetterbox(element,topBottom,leftRight){element.style.paddingLeft=element.style.paddingRight=leftRight+"px";element.style.paddingTop=element.style.paddingBottom=topBottom+"px"}Module["setLetterbox"]=setLetterbox;function JSEvents_resizeCanvasForFullscreen(target,strategy){var restoreOldStyle=registerRestoreOldStyle(target);var cssWidth=strategy.softFullscreen?innerWidth:screen.width;var cssHeight=strategy.softFullscreen?innerHeight:screen.height;var rect=getBoundingClientRect(target);var windowedCssWidth=rect.width;var windowedCssHeight=rect.height;var canvasSize=getCanvasElementSize(target);var windowedRttWidth=canvasSize[0];var windowedRttHeight=canvasSize[1];if(strategy.scaleMode==3){setLetterbox(target,(cssHeight-windowedCssHeight)/2,(cssWidth-windowedCssWidth)/2);cssWidth=windowedCssWidth;cssHeight=windowedCssHeight}else if(strategy.scaleMode==2){if(cssWidth*windowedRttHeightx*h)w=h*x/y|0;topMargin=(screenHeight-h)/2|0}if(inPixelPerfectFullscreenMode){setCanvasElementSize(canvas,w,h);if(canvas.GLctxObject)canvas.GLctxObject.GLctx.viewport(0,0,w,h)}if(inHiDPIFullscreenMode){topMargin/=dpr;w/=dpr;h/=dpr;w=Math.round(w*1e4)/1e4;h=Math.round(h*1e4)/1e4;topMargin=Math.round(topMargin*1e4)/1e4}if(inCenteredWithoutScalingFullscreenMode){var t=(innerHeight-jstoi_q(canvas.style.height))/2;var b=(innerWidth-jstoi_q(canvas.style.width))/2;setLetterbox(canvas,t,b)}else{canvas.style.width=w+"px";canvas.style.height=h+"px";var b=(innerWidth-w)/2;setLetterbox(canvas,topMargin,b)}if(!inCenteredWithoutScalingFullscreenMode&¤tFullscreenStrategy.canvasResizedCallback){getWasmTableEntry(currentFullscreenStrategy.canvasResizedCallback)(37,0,currentFullscreenStrategy.canvasResizedCallbackUserData)}}Module["softFullscreenResizeWebGLRenderTarget"]=softFullscreenResizeWebGLRenderTarget;function doRequestFullscreen(target,strategy){if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;if(!target.requestFullscreen&&!target.webkitRequestFullscreen){return-3}var canPerformRequests=JSEvents.canPerformEventHandlerRequests();if(!canPerformRequests){if(strategy.deferUntilInEventHandler){JSEvents.deferCall(JSEvents_requestFullscreen,1,[target,strategy]);return 1}return-2}return JSEvents_requestFullscreen(target,strategy)}Module["doRequestFullscreen"]=doRequestFullscreen;function _emscripten_request_fullscreen(target,deferUntilInEventHandler){var strategy={scaleMode:0,canvasResolutionScaleMode:0,filteringMode:0,deferUntilInEventHandler:deferUntilInEventHandler,canvasResizedCallbackTargetThread:2};return doRequestFullscreen(target,strategy)}Module["_emscripten_request_fullscreen"]=_emscripten_request_fullscreen;_emscripten_request_fullscreen.sig="iii";function _emscripten_request_fullscreen_strategy(target,deferUntilInEventHandler,fullscreenStrategy){var strategy={scaleMode:HEAP32[fullscreenStrategy>>2],canvasResolutionScaleMode:HEAP32[fullscreenStrategy+4>>2],filteringMode:HEAP32[fullscreenStrategy+8>>2],deferUntilInEventHandler:deferUntilInEventHandler,canvasResizedCallback:HEAP32[fullscreenStrategy+12>>2],canvasResizedCallbackUserData:HEAP32[fullscreenStrategy+16>>2]};return doRequestFullscreen(target,strategy)}Module["_emscripten_request_fullscreen_strategy"]=_emscripten_request_fullscreen_strategy;_emscripten_request_fullscreen_strategy.sig="iiii";function _emscripten_enter_soft_fullscreen(target,fullscreenStrategy){target=findEventTarget(target);if(!target)return-4;var strategy={scaleMode:HEAP32[fullscreenStrategy>>2],canvasResolutionScaleMode:HEAP32[fullscreenStrategy+4>>2],filteringMode:HEAP32[fullscreenStrategy+8>>2],canvasResizedCallback:HEAP32[fullscreenStrategy+12>>2],canvasResizedCallbackUserData:HEAP32[fullscreenStrategy+16>>2],target:target,softFullscreen:true};var restoreOldStyle=JSEvents_resizeCanvasForFullscreen(target,strategy);document.documentElement.style.overflow="hidden";document.body.scroll="no";document.body.style.margin="0px";var hiddenElements=hideEverythingExceptGivenElement(target);function restoreWindowedState(){restoreOldStyle();restoreHiddenElements(hiddenElements);removeEventListener("resize",softFullscreenResizeWebGLRenderTarget);if(strategy.canvasResizedCallback){getWasmTableEntry(strategy.canvasResizedCallback)(37,0,strategy.canvasResizedCallbackUserData)}currentFullscreenStrategy=0}restoreOldWindowedStyle=restoreWindowedState;currentFullscreenStrategy=strategy;addEventListener("resize",softFullscreenResizeWebGLRenderTarget);if(strategy.canvasResizedCallback){getWasmTableEntry(strategy.canvasResizedCallback)(37,0,strategy.canvasResizedCallbackUserData)}return 0}Module["_emscripten_enter_soft_fullscreen"]=_emscripten_enter_soft_fullscreen;_emscripten_enter_soft_fullscreen.sig="iii";function _emscripten_exit_soft_fullscreen(){if(restoreOldWindowedStyle)restoreOldWindowedStyle();restoreOldWindowedStyle=null;return 0}Module["_emscripten_exit_soft_fullscreen"]=_emscripten_exit_soft_fullscreen;_emscripten_exit_soft_fullscreen.sig="i";function _emscripten_exit_fullscreen(){if(!JSEvents.fullscreenEnabled())return-1;JSEvents.removeDeferredCalls(JSEvents_requestFullscreen);var d=specialHTMLTargets[1];if(d.exitFullscreen){d.fullscreenElement&&d.exitFullscreen()}else if(d.webkitExitFullscreen){d.webkitFullscreenElement&&d.webkitExitFullscreen()}else{return-1}return 0}Module["_emscripten_exit_fullscreen"]=_emscripten_exit_fullscreen;_emscripten_exit_fullscreen.sig="i";function fillPointerlockChangeEventData(eventStruct){var pointerLockElement=document.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement||document.msPointerLockElement;var isPointerlocked=!!pointerLockElement;HEAP32[eventStruct>>2]=isPointerlocked;var nodeName=JSEvents.getNodeNameForTarget(pointerLockElement);var id=pointerLockElement&&pointerLockElement.id?pointerLockElement.id:"";stringToUTF8(nodeName,eventStruct+4,128);stringToUTF8(id,eventStruct+132,128)}Module["fillPointerlockChangeEventData"]=fillPointerlockChangeEventData;function registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.pointerlockChangeEvent)JSEvents.pointerlockChangeEvent=_malloc(260);var pointerlockChangeEventHandlerFunc=function(e=event){var pointerlockChangeEvent=JSEvents.pointerlockChangeEvent;fillPointerlockChangeEventData(pointerlockChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,pointerlockChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:pointerlockChangeEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerPointerlockChangeEventCallback"]=registerPointerlockChangeEventCallback;function _emscripten_set_pointerlockchange_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){if(!document||!document.body||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"pointerlockchange",targetThread);registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mozpointerlockchange",targetThread);registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"webkitpointerlockchange",targetThread);registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mspointerlockchange",targetThread);return 0}Module["_emscripten_set_pointerlockchange_callback_on_thread"]=_emscripten_set_pointerlockchange_callback_on_thread;_emscripten_set_pointerlockchange_callback_on_thread.sig="iiiiii";function registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){var pointerlockErrorEventHandlerFunc=function(e=event){if(getWasmTableEntry(callbackfunc)(eventTypeId,0,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:pointerlockErrorEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerPointerlockErrorEventCallback"]=registerPointerlockErrorEventCallback;function _emscripten_set_pointerlockerror_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){if(!document||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"pointerlockerror",targetThread);registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"mozpointerlockerror",targetThread);registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"webkitpointerlockerror",targetThread);registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"mspointerlockerror",targetThread);return 0}Module["_emscripten_set_pointerlockerror_callback_on_thread"]=_emscripten_set_pointerlockerror_callback_on_thread;_emscripten_set_pointerlockerror_callback_on_thread.sig="iiiiii";function _emscripten_get_pointerlock_status(pointerlockStatus){if(pointerlockStatus)fillPointerlockChangeEventData(pointerlockStatus);if(!document.body||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}return 0}Module["_emscripten_get_pointerlock_status"]=_emscripten_get_pointerlock_status;_emscripten_get_pointerlock_status.sig="ii";function requestPointerLock(target){if(target.requestPointerLock){target.requestPointerLock()}else{if(document.body.requestPointerLock){return-3}return-1}return 0}Module["requestPointerLock"]=requestPointerLock;function _emscripten_request_pointerlock(target,deferUntilInEventHandler){target=findEventTarget(target);if(!target)return-4;if(!target.requestPointerLock){return-1}var canPerformRequests=JSEvents.canPerformEventHandlerRequests();if(!canPerformRequests){if(deferUntilInEventHandler){JSEvents.deferCall(requestPointerLock,2,[target]);return 1}return-2}return requestPointerLock(target)}Module["_emscripten_request_pointerlock"]=_emscripten_request_pointerlock;_emscripten_request_pointerlock.sig="iii";function _emscripten_exit_pointerlock(){JSEvents.removeDeferredCalls(requestPointerLock);if(document.exitPointerLock){document.exitPointerLock()}else{return-1}return 0}Module["_emscripten_exit_pointerlock"]=_emscripten_exit_pointerlock;_emscripten_exit_pointerlock.sig="i";function _emscripten_vibrate(msecs){if(!navigator.vibrate)return-1;navigator.vibrate(msecs);return 0}Module["_emscripten_vibrate"]=_emscripten_vibrate;_emscripten_vibrate.sig="ii";function _emscripten_vibrate_pattern(msecsArray,numEntries){if(!navigator.vibrate)return-1;var vibrateList=[];for(var i=0;i>2];vibrateList.push(msecs)}navigator.vibrate(vibrateList);return 0}Module["_emscripten_vibrate_pattern"]=_emscripten_vibrate_pattern;_emscripten_vibrate_pattern.sig="iii";function fillVisibilityChangeEventData(eventStruct){var visibilityStates=["hidden","visible","prerender","unloaded"];var visibilityState=visibilityStates.indexOf(document.visibilityState);HEAP32[eventStruct>>2]=document.hidden;HEAP32[eventStruct+4>>2]=visibilityState}Module["fillVisibilityChangeEventData"]=fillVisibilityChangeEventData;function registerVisibilityChangeEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.visibilityChangeEvent)JSEvents.visibilityChangeEvent=_malloc(8);var visibilityChangeEventHandlerFunc=function(e=event){var visibilityChangeEvent=JSEvents.visibilityChangeEvent;fillVisibilityChangeEventData(visibilityChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,visibilityChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:visibilityChangeEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerVisibilityChangeEventCallback"]=registerVisibilityChangeEventCallback;function _emscripten_set_visibilitychange_callback_on_thread(userData,useCapture,callbackfunc,targetThread){if(!specialHTMLTargets[1]){return-4}registerVisibilityChangeEventCallback(specialHTMLTargets[1],userData,useCapture,callbackfunc,21,"visibilitychange",targetThread);return 0}Module["_emscripten_set_visibilitychange_callback_on_thread"]=_emscripten_set_visibilitychange_callback_on_thread;_emscripten_set_visibilitychange_callback_on_thread.sig="iiiii";function _emscripten_get_visibility_status(visibilityStatus){if(typeof document.visibilityState=="undefined"&&typeof document.hidden=="undefined"){return-1}fillVisibilityChangeEventData(visibilityStatus);return 0}Module["_emscripten_get_visibility_status"]=_emscripten_get_visibility_status;_emscripten_get_visibility_status.sig="ii";function registerTouchEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.touchEvent)JSEvents.touchEvent=_malloc(1696);target=findEventTarget(target);var touchEventHandlerFunc=function(e){var t,touches={},et=e.touches;for(var i=0;i>3]=e.timeStamp;var idx=touchEvent>>2;HEAP32[idx+3]=e.ctrlKey;HEAP32[idx+4]=e.shiftKey;HEAP32[idx+5]=e.altKey;HEAP32[idx+6]=e.metaKey;idx+=7;var targetRect=getBoundingClientRect(target);var numTouches=0;for(var i in touches){t=touches[i];HEAP32[idx+0]=t.identifier;HEAP32[idx+1]=t.screenX;HEAP32[idx+2]=t.screenY;HEAP32[idx+3]=t.clientX;HEAP32[idx+4]=t.clientY;HEAP32[idx+5]=t.pageX;HEAP32[idx+6]=t.pageY;HEAP32[idx+7]=t.isChanged;HEAP32[idx+8]=t.onTarget;HEAP32[idx+9]=t.clientX-targetRect.left;HEAP32[idx+10]=t.clientY-targetRect.top;idx+=13;if(++numTouches>31){break}}HEAP32[touchEvent+8>>2]=numTouches;if(getWasmTableEntry(callbackfunc)(eventTypeId,touchEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString=="touchstart"||eventTypeString=="touchend",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:touchEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerTouchEventCallback"]=registerTouchEventCallback;function _emscripten_set_touchstart_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,22,"touchstart",targetThread);return 0}Module["_emscripten_set_touchstart_callback_on_thread"]=_emscripten_set_touchstart_callback_on_thread;_emscripten_set_touchstart_callback_on_thread.sig="iiiiii";function _emscripten_set_touchend_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,23,"touchend",targetThread);return 0}Module["_emscripten_set_touchend_callback_on_thread"]=_emscripten_set_touchend_callback_on_thread;_emscripten_set_touchend_callback_on_thread.sig="iiiiii";function _emscripten_set_touchmove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,24,"touchmove",targetThread);return 0}Module["_emscripten_set_touchmove_callback_on_thread"]=_emscripten_set_touchmove_callback_on_thread;_emscripten_set_touchmove_callback_on_thread.sig="iiiiii";function _emscripten_set_touchcancel_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,25,"touchcancel",targetThread);return 0}Module["_emscripten_set_touchcancel_callback_on_thread"]=_emscripten_set_touchcancel_callback_on_thread;_emscripten_set_touchcancel_callback_on_thread.sig="iiiiii";function fillGamepadEventData(eventStruct,e){HEAPF64[eventStruct>>3]=e.timestamp;for(var i=0;i>3]=e.axes[i]}for(var i=0;i>3]=e.buttons[i].value}else{HEAPF64[eventStruct+i*8+528>>3]=e.buttons[i]}}for(var i=0;i>2]=e.buttons[i].pressed}else{HEAP32[eventStruct+i*4+1040>>2]=e.buttons[i]==1}}HEAP32[eventStruct+1296>>2]=e.connected;HEAP32[eventStruct+1300>>2]=e.index;HEAP32[eventStruct+8>>2]=e.axes.length;HEAP32[eventStruct+12>>2]=e.buttons.length;stringToUTF8(e.id,eventStruct+1304,64);stringToUTF8(e.mapping,eventStruct+1368,64)}Module["fillGamepadEventData"]=fillGamepadEventData;function registerGamepadEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.gamepadEvent)JSEvents.gamepadEvent=_malloc(1432);var gamepadEventHandlerFunc=function(e=event){var gamepadEvent=JSEvents.gamepadEvent;fillGamepadEventData(gamepadEvent,e["gamepad"]);if(getWasmTableEntry(callbackfunc)(eventTypeId,gamepadEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:gamepadEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerGamepadEventCallback"]=registerGamepadEventCallback;function _emscripten_set_gamepadconnected_callback_on_thread(userData,useCapture,callbackfunc,targetThread){if(!navigator.getGamepads&&!navigator.webkitGetGamepads)return-1;registerGamepadEventCallback(2,userData,useCapture,callbackfunc,26,"gamepadconnected",targetThread);return 0}Module["_emscripten_set_gamepadconnected_callback_on_thread"]=_emscripten_set_gamepadconnected_callback_on_thread;_emscripten_set_gamepadconnected_callback_on_thread.sig="iiiii";function _emscripten_set_gamepaddisconnected_callback_on_thread(userData,useCapture,callbackfunc,targetThread){if(!navigator.getGamepads&&!navigator.webkitGetGamepads)return-1;registerGamepadEventCallback(2,userData,useCapture,callbackfunc,27,"gamepaddisconnected",targetThread);return 0}Module["_emscripten_set_gamepaddisconnected_callback_on_thread"]=_emscripten_set_gamepaddisconnected_callback_on_thread;_emscripten_set_gamepaddisconnected_callback_on_thread.sig="iiiii";function _emscripten_sample_gamepad_data(){return(JSEvents.lastGamepadState=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads():null)?0:-1}Module["_emscripten_sample_gamepad_data"]=_emscripten_sample_gamepad_data;_emscripten_sample_gamepad_data.sig="i";function _emscripten_get_num_gamepads(){return JSEvents.lastGamepadState.length}Module["_emscripten_get_num_gamepads"]=_emscripten_get_num_gamepads;_emscripten_get_num_gamepads.sig="i";function _emscripten_get_gamepad_status(index,gamepadState){if(index<0||index>=JSEvents.lastGamepadState.length)return-5;if(!JSEvents.lastGamepadState[index])return-7;fillGamepadEventData(gamepadState,JSEvents.lastGamepadState[index]);return 0}Module["_emscripten_get_gamepad_status"]=_emscripten_get_gamepad_status;_emscripten_get_gamepad_status.sig="iii";function registerBeforeUnloadEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){var beforeUnloadEventHandlerFunc=function(e=event){var confirmationMessage=getWasmTableEntry(callbackfunc)(eventTypeId,0,userData);if(confirmationMessage){confirmationMessage=UTF8ToString(confirmationMessage)}if(confirmationMessage){e.preventDefault();e.returnValue=confirmationMessage;return confirmationMessage}};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:beforeUnloadEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerBeforeUnloadEventCallback"]=registerBeforeUnloadEventCallback;function _emscripten_set_beforeunload_callback_on_thread(userData,callbackfunc,targetThread){if(typeof onbeforeunload=="undefined")return-1;if(targetThread!==1)return-5;registerBeforeUnloadEventCallback(2,userData,true,callbackfunc,28,"beforeunload");return 0}Module["_emscripten_set_beforeunload_callback_on_thread"]=_emscripten_set_beforeunload_callback_on_thread;_emscripten_set_beforeunload_callback_on_thread.sig="iii";function fillBatteryEventData(eventStruct,e){HEAPF64[eventStruct>>3]=e.chargingTime;HEAPF64[eventStruct+8>>3]=e.dischargingTime;HEAPF64[eventStruct+16>>3]=e.level;HEAP32[eventStruct+24>>2]=e.charging}Module["fillBatteryEventData"]=fillBatteryEventData;function battery(){return navigator.battery||navigator.mozBattery||navigator.webkitBattery}Module["battery"]=battery;function registerBatteryEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.batteryEvent)JSEvents.batteryEvent=_malloc(32);var batteryEventHandlerFunc=function(e=event){var batteryEvent=JSEvents.batteryEvent;fillBatteryEventData(batteryEvent,battery());if(getWasmTableEntry(callbackfunc)(eventTypeId,batteryEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:batteryEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["registerBatteryEventCallback"]=registerBatteryEventCallback;function _emscripten_set_batterychargingchange_callback_on_thread(userData,callbackfunc,targetThread){if(!battery())return-1;registerBatteryEventCallback(battery(),userData,true,callbackfunc,29,"chargingchange",targetThread);return 0}Module["_emscripten_set_batterychargingchange_callback_on_thread"]=_emscripten_set_batterychargingchange_callback_on_thread;_emscripten_set_batterychargingchange_callback_on_thread.sig="iii";function _emscripten_set_batterylevelchange_callback_on_thread(userData,callbackfunc,targetThread){if(!battery())return-1;registerBatteryEventCallback(battery(),userData,true,callbackfunc,30,"levelchange",targetThread);return 0}Module["_emscripten_set_batterylevelchange_callback_on_thread"]=_emscripten_set_batterylevelchange_callback_on_thread;_emscripten_set_batterylevelchange_callback_on_thread.sig="iii";function _emscripten_get_battery_status(batteryState){if(!battery())return-1;fillBatteryEventData(batteryState,battery());return 0}Module["_emscripten_get_battery_status"]=_emscripten_get_battery_status;_emscripten_get_battery_status.sig="ii";function _emscripten_set_element_css_size(target,width,height){target=findEventTarget(target);if(!target)return-4;target.style.width=width+"px";target.style.height=height+"px";return 0}Module["_emscripten_set_element_css_size"]=_emscripten_set_element_css_size;_emscripten_set_element_css_size.sig="iiii";function _emscripten_get_element_css_size(target,width,height){target=findEventTarget(target);if(!target)return-4;var rect=getBoundingClientRect(target);HEAPF64[width>>3]=rect.width;HEAPF64[height>>3]=rect.height;return 0}Module["_emscripten_get_element_css_size"]=_emscripten_get_element_css_size;_emscripten_get_element_css_size.sig="iiii";function _emscripten_html5_remove_all_event_listeners(){JSEvents.removeAllEventListeners()}Module["_emscripten_html5_remove_all_event_listeners"]=_emscripten_html5_remove_all_event_listeners;_emscripten_html5_remove_all_event_listeners.sig="v";function _emscripten_request_animation_frame(cb,userData){return requestAnimationFrame(function(timeStamp){getWasmTableEntry(cb)(timeStamp,userData)})}Module["_emscripten_request_animation_frame"]=_emscripten_request_animation_frame;function _emscripten_cancel_animation_frame(id){cancelAnimationFrame(id)}Module["_emscripten_cancel_animation_frame"]=_emscripten_cancel_animation_frame;function _emscripten_request_animation_frame_loop(cb,userData){function tick(timeStamp){if(getWasmTableEntry(cb)(timeStamp,userData)){requestAnimationFrame(tick)}}return requestAnimationFrame(tick)}Module["_emscripten_request_animation_frame_loop"]=_emscripten_request_animation_frame_loop;function _emscripten_performance_now(){return performance.now()}Module["_emscripten_performance_now"]=_emscripten_performance_now;function _emscripten_get_device_pixel_ratio(){return typeof devicePixelRatio=="number"&&devicePixelRatio||1}Module["_emscripten_get_device_pixel_ratio"]=_emscripten_get_device_pixel_ratio;_emscripten_get_device_pixel_ratio.sig="d";function checkWasiClock(clock_id){return clock_id==0||clock_id==1||clock_id==2||clock_id==3}Module["checkWasiClock"]=checkWasiClock;function _clock_time_get(clk_id,ignored_precision,ptime){if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=Date.now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP32[ptime>>2]=nsec>>>0;HEAP32[ptime+4>>2]=nsec/Math.pow(2,32)>>>0;return 0}Module["_clock_time_get"]=_clock_time_get;_clock_time_get.sig="iijp";function _clock_res_get(clk_id,pres){if(!checkWasiClock(clk_id)){return 28}var nsec;if(clk_id===0){nsec=1e3*1e3}else if(nowIsMonotonic){nsec=_emscripten_get_now_res()}else{return 52}HEAP32[pres>>2]=nsec>>>0;HEAP32[pres+4>>2]=nsec/Math.pow(2,32)>>>0;return 0}Module["_clock_res_get"]=_clock_res_get;_clock_res_get.sig="iip";function __dlsym_catchup_js(handle,symbolIndex){var lib=LDSO.loadedLibsByHandle[handle];var symDict=lib.module;var symName=Object.keys(symDict)[symbolIndex];var sym=symDict[symName];var result=addFunction(sym,sym.sig);return result}Module["__dlsym_catchup_js"]=__dlsym_catchup_js;__dlsym_catchup_js.sig="ppp";function createDyncallWrapper(sig){var sections=[];var prelude=[0,97,115,109,1,0,0,0];sections.push(prelude);var wrappersig=[sig[0].replace("j","i"),"i",sig.slice(1).replace(/j/g,"ii")].join("");var typeSectionBody=[3];generateFuncType(wrappersig,typeSectionBody);generateFuncType(sig,typeSectionBody);generateFuncType("vi",typeSectionBody);var typeSection=[1];uleb128Encode(typeSectionBody.length,typeSection);typeSection.push.apply(typeSection,typeSectionBody);sections.push(typeSection);var importSection=[2,15,2,1,101,1,116,1,112,0,0,1,101,1,114,0,2];sections.push(importSection);var functionSection=[3,2,1,0];sections.push(functionSection);var exportSection=[7,5,1,1,102,0,1];sections.push(exportSection);var convert_code=[];if(sig[0]==="j"){convert_code=[1,1,126]}else{convert_code.push(0)}function localGet(j){convert_code.push(32);uleb128Encode(j,convert_code)}var j=1;for(var i=1;i{setImmediateWrapped.mapping[id]=undefined;func()});return id}Module["setImmediateWrapped"]=setImmediateWrapped;function clearImmediateWrapped(id){clearImmediate(setImmediateWrapped.mapping[id]);setImmediateWrapped.mapping[id]=undefined}Module["clearImmediateWrapped"]=clearImmediateWrapped;function polyfillSetImmediate(){}Module["polyfillSetImmediate"]=polyfillSetImmediate;function _emscripten_set_immediate(cb,userData){polyfillSetImmediate();return emSetImmediate(function(){callUserCallback(function(){getWasmTableEntry(cb)(userData)})})}Module["_emscripten_set_immediate"]=_emscripten_set_immediate;_emscripten_set_immediate.sig="ipp";function _emscripten_clear_immediate(id){emClearImmediate(id)}Module["_emscripten_clear_immediate"]=_emscripten_clear_immediate;_emscripten_clear_immediate.sig="vi";function _emscripten_set_immediate_loop(cb,userData){polyfillSetImmediate();function tick(){callUserCallback(function(){if(getWasmTableEntry(cb)(userData)){emSetImmediate(tick)}else{}})}emSetImmediate(tick)}Module["_emscripten_set_immediate_loop"]=_emscripten_set_immediate_loop;_emscripten_set_immediate_loop.sig="ipp";function _emscripten_set_timeout(cb,msecs,userData){return safeSetTimeout(()=>getWasmTableEntry(cb)(userData),msecs)}Module["_emscripten_set_timeout"]=_emscripten_set_timeout;_emscripten_set_timeout.sig="ipdp";function _emscripten_clear_timeout(id){clearTimeout(id)}Module["_emscripten_clear_timeout"]=_emscripten_clear_timeout;_emscripten_clear_timeout.sig="vi";function _emscripten_set_timeout_loop(cb,msecs,userData){function tick(){var t=performance.now();var n=t+msecs;callUserCallback(function(){if(getWasmTableEntry(cb)(t,userData)){setTimeout(tick,n-performance.now())}})}return setTimeout(tick,0)}Module["_emscripten_set_timeout_loop"]=_emscripten_set_timeout_loop;_emscripten_set_timeout_loop.sig="vpdp";function _emscripten_set_interval(cb,msecs,userData){return setInterval(function(){callUserCallback(function(){getWasmTableEntry(cb)(userData)})},msecs)}Module["_emscripten_set_interval"]=_emscripten_set_interval;_emscripten_set_interval.sig="ipdp";function _emscripten_clear_interval(id){clearInterval(id)}Module["_emscripten_clear_interval"]=_emscripten_clear_interval;_emscripten_clear_interval.sig="vi";function makePromiseCallback(callback,userData){return value=>{var stack=stackSave();var resultPtr=stackAlloc(POINTER_SIZE);HEAPU32[resultPtr>>2]=0;try{var result=getWasmTableEntry(callback)(resultPtr,userData,value);var resultVal=HEAPU32[resultPtr>>2]}catch(e){if(typeof e!=="number"){throw 0}throw e}finally{stackRestore(stack)}switch(result){case 0:return resultVal;case 1:return getPromise(resultVal);case 2:var ret=getPromise(resultVal);_emscripten_promise_destroy(resultVal);return ret;case 3:throw resultVal}}}Module["makePromiseCallback"]=makePromiseCallback;function _emscripten_promise_then(id,onFulfilled,onRejected,userData){var promise=getPromise(id);var newId=promiseMap.allocate({promise:promise.then(makePromiseCallback(onFulfilled,userData),makePromiseCallback(onRejected,userData))});return newId}Module["_emscripten_promise_then"]=_emscripten_promise_then;_emscripten_promise_then.sig="ppppp";function _emscripten_promise_all(idBuf,resultBuf,size){var promises=[];for(var i=0;i>2];promises[i]=getPromise(id)}var id=promiseMap.allocate({promise:Promise.all(promises).then(results=>{if(resultBuf){for(var i=0;i>2]=result}}return resultBuf})});return id}Module["_emscripten_promise_all"]=_emscripten_promise_all;_emscripten_promise_all.sig="pppp";function _llvm_eh_typeid_for(type){return type}Module["_llvm_eh_typeid_for"]=_llvm_eh_typeid_for;_llvm_eh_typeid_for.sig="ip";function ___cxa_get_exception_ptr(ptr){return new ExceptionInfo(ptr).get_exception_ptr()}Module["___cxa_get_exception_ptr"]=___cxa_get_exception_ptr;___cxa_get_exception_ptr.sig="pp";function ___cxa_call_unexpected(exception){err("Unexpected exception thrown, this is not properly supported - aborting");ABORT=true;throw exception}Module["___cxa_call_unexpected"]=___cxa_call_unexpected;function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}Module["_emscripten_set_main_loop_timing"]=_emscripten_set_main_loop_timing;_emscripten_set_main_loop_timing.sig="iii";function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}out('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}Module["setMainLoop"]=setMainLoop;var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining{assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=event=>{out("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;preloadedAudios[name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",()=>finish(audio),false);audio.onerror=function audio_onerror(event){if(done)return;err("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(function(){finish(audio)},1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);var wasmPlugin={"asyncWasmLoadPromise":new Promise(function(resolve,reject){return resolve()}),"canHandle":function(name){return!Module.noWasmDecoding&&name.endsWith(".so")},"handle":function(byteArray,name,onload,onerror){wasmPlugin["asyncWasmLoadPromise"]=wasmPlugin["asyncWasmLoadPromise"].then(()=>loadWebAssemblyModule(byteArray,{loadAsync:true,nodelete:true})).then(module=>{preloadedWasm[name]=module;onload()},err=>{console.warn("Couldn't instantiate wasm: "+name+" '"+err+"'");onerror()})}};Module["preloadPlugins"].push(wasmPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(()=>{});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(()=>{});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",ev=>{if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},handledByPreloadPlugin:function(byteArray,fullname,finish,onerror){Browser.init();var handled=false;Module["preloadPlugins"].forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||function(){};CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout:function(func,timeout){return safeSetTimeout(func,timeout)},safeRequestAnimationFrame:function(func){return Browser.requestAnimationFrame(function(){callUserCallback(func)})},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(function(listener){listener(canvas.width,canvas.height)})},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h{if(onload)getWasmTableEntry(onload)(file)},()=>{if(onerror)getWasmTableEntry(onerror)(file)},true);return 0}Module["_emscripten_run_preload_plugins"]=_emscripten_run_preload_plugins;_emscripten_run_preload_plugins.sig="iiii";function _emscripten_run_preload_plugins_data(data,size,suffix,arg,onload,onerror){var _suffix=UTF8ToString(suffix);if(!Browser.asyncPrepareDataCounter)Browser.asyncPrepareDataCounter=0;var name="prepare_data_"+Browser.asyncPrepareDataCounter+++"."+_suffix;var lengthAsUTF8=lengthBytesUTF8(name);var cname=_malloc(lengthAsUTF8+1);stringToUTF8(name,cname,lengthAsUTF8+1);FS.createPreloadedFile("/",name,HEAPU8.subarray(data,data+size),true,true,()=>{if(onload)getWasmTableEntry(onload)(arg,cname)},()=>{if(onerror)getWasmTableEntry(onerror)(arg)},true)}Module["_emscripten_run_preload_plugins_data"]=_emscripten_run_preload_plugins_data;_emscripten_run_preload_plugins_data.sig="viiiiii";function _emscripten_async_run_script(script,millis){safeSetTimeout(function(){_emscripten_run_script(script)},millis)}Module["_emscripten_async_run_script"]=_emscripten_async_run_script;function _emscripten_async_load_script(url,onload,onerror){onload=getWasmTableEntry(onload);onerror=getWasmTableEntry(onerror);assert(runDependencies===0,"async_load_script must be run when no other dependencies are active");var script=document.createElement("script");script.onload=function script_onload(){if(onload){if(runDependencies>0){dependenciesFulfilled=onload}else{onload()}}};script.onerror=()=>{if(onerror)onerror()};script.src=UTF8ToString(url);document.body.appendChild(script)}Module["_emscripten_async_load_script"]=_emscripten_async_load_script;function _emscripten_get_main_loop_timing(mode,value){if(mode)HEAP32[mode>>2]=Browser.mainLoop.timingMode;if(value)HEAP32[value>>2]=Browser.mainLoop.timingValue}Module["_emscripten_get_main_loop_timing"]=_emscripten_get_main_loop_timing;_emscripten_get_main_loop_timing.sig="vii";function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop){var browserIterationFunc=getWasmTableEntry(func);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop)}Module["_emscripten_set_main_loop"]=_emscripten_set_main_loop;_emscripten_set_main_loop.sig="viii";function _emscripten_set_main_loop_arg(func,arg,fps,simulateInfiniteLoop){var browserIterationFunc=()=>getWasmTableEntry(func)(arg);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg)}Module["_emscripten_set_main_loop_arg"]=_emscripten_set_main_loop_arg;_emscripten_set_main_loop_arg.sig="viiii";function _emscripten_cancel_main_loop(){Browser.mainLoop.pause();Browser.mainLoop.func=null}Module["_emscripten_cancel_main_loop"]=_emscripten_cancel_main_loop;_emscripten_cancel_main_loop.sig="v";function _emscripten_pause_main_loop(){Browser.mainLoop.pause()}Module["_emscripten_pause_main_loop"]=_emscripten_pause_main_loop;_emscripten_pause_main_loop.sig="v";function _emscripten_resume_main_loop(){Browser.mainLoop.resume()}Module["_emscripten_resume_main_loop"]=_emscripten_resume_main_loop;_emscripten_resume_main_loop.sig="v";function __emscripten_push_main_loop_blocker(func,arg,name){Browser.mainLoop.queue.push({func:function(){getWasmTableEntry(func)(arg)},name:UTF8ToString(name),counted:true});Browser.mainLoop.updateStatus()}Module["__emscripten_push_main_loop_blocker"]=__emscripten_push_main_loop_blocker;function __emscripten_push_uncounted_main_loop_blocker(func,arg,name){Browser.mainLoop.queue.push({func:function(){getWasmTableEntry(func)(arg)},name:UTF8ToString(name),counted:false});Browser.mainLoop.updateStatus()}Module["__emscripten_push_uncounted_main_loop_blocker"]=__emscripten_push_uncounted_main_loop_blocker;function _emscripten_set_main_loop_expected_blockers(num){Browser.mainLoop.expectedBlockers=num;Browser.mainLoop.remainingBlockers=num;Browser.mainLoop.updateStatus()}Module["_emscripten_set_main_loop_expected_blockers"]=_emscripten_set_main_loop_expected_blockers;_emscripten_set_main_loop_expected_blockers.sig="vi";function _emscripten_async_call(func,arg,millis){function wrapper(){getWasmTableEntry(func)(arg)}if(millis>=0||ENVIRONMENT_IS_NODE){safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}Module["_emscripten_async_call"]=_emscripten_async_call;_emscripten_async_call.sig="vppi";function _emscripten_get_window_title(){var buflen=256;if(!_emscripten_get_window_title.buffer){_emscripten_get_window_title.buffer=_malloc(buflen)}stringToUTF8(document.title,_emscripten_get_window_title.buffer,buflen);return _emscripten_get_window_title.buffer}Module["_emscripten_get_window_title"]=_emscripten_get_window_title;_emscripten_get_window_title.sig="iv";function _emscripten_set_window_title(title){setWindowTitle(UTF8ToString(title))}Module["_emscripten_set_window_title"]=_emscripten_set_window_title;_emscripten_set_window_title.sig="vi";function _emscripten_get_screen_size(width,height){HEAP32[width>>2]=screen.width;HEAP32[height>>2]=screen.height}Module["_emscripten_get_screen_size"]=_emscripten_get_screen_size;_emscripten_get_screen_size.sig="vii";function _emscripten_hide_mouse(){var styleSheet=document.styleSheets[0];var rules=styleSheet.cssRules;for(var i=0;i>2]=canvas.width;HEAP32[height>>2]=canvas.height;HEAP32[isFullscreen>>2]=Browser.isFullscreen?1:0}Module["_emscripten_get_canvas_size"]=_emscripten_get_canvas_size;_emscripten_get_canvas_size.sig="viii";function _emscripten_create_worker(url){url=UTF8ToString(url);var id=Browser.workers.length;var info={worker:new Worker(url),callbacks:[],awaited:0,buffer:0,bufferSize:0};info.worker.onmessage=function info_worker_onmessage(msg){if(ABORT)return;var info=Browser.workers[id];if(!info)return;var callbackId=msg.data["callbackId"];var callbackInfo=info.callbacks[callbackId];if(!callbackInfo)return;if(msg.data["finalResponse"]){info.awaited--;info.callbacks[callbackId]=null}var data=msg.data["data"];if(data){if(!data.byteLength)data=new Uint8Array(data);if(!info.buffer||info.bufferSize>2]=canvas.width;HEAP32[h>>2]=canvas.height;return buf}return 0}Module["_emscripten_get_preloaded_image_data"]=_emscripten_get_preloaded_image_data;_emscripten_get_preloaded_image_data.sig="iiii";function _emscripten_get_preloaded_image_data_from_FILE(file,w,h){var fd=_fileno(file);var stream=FS.getStream(fd);if(stream){return _emscripten_get_preloaded_image_data(stream.path,w,h)}return 0}Module["_emscripten_get_preloaded_image_data_from_FILE"]=_emscripten_get_preloaded_image_data_from_FILE;_emscripten_get_preloaded_image_data_from_FILE.sig="iiii";var wget={wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:function(){var handle=wget.nextWgetRequestHandle;wget.nextWgetRequestHandle++;return handle}};Module["wget"]=wget;function _emscripten_async_wget(url,file,onload,onerror){var _url=UTF8ToString(url);var _file=UTF8ToString(file);_file=PATH_FS.resolve(_file);function doCallback(callback){if(callback){callUserCallback(function(){withStackSave(function(){getWasmTableEntry(callback)(allocateUTF8OnStack(_file))})})}}var destinationDirectory=PATH.dirname(_file);FS.createPreloadedFile(destinationDirectory,PATH.basename(_file),_url,true,true,function(){doCallback(onload)},function(){doCallback(onerror)},false,false,function(){try{FS.unlink(_file)}catch(e){}FS.mkdirTree(destinationDirectory)})}Module["_emscripten_async_wget"]=_emscripten_async_wget;_emscripten_async_wget.sig="viiii";function _emscripten_async_wget_data(url,arg,onload,onerror){asyncLoad(UTF8ToString(url),function(byteArray){callUserCallback(function(){var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);getWasmTableEntry(onload)(arg,buffer,byteArray.length);_free(buffer)})},function(){if(onerror){callUserCallback(function(){getWasmTableEntry(onerror)(arg)})}},true)}Module["_emscripten_async_wget_data"]=_emscripten_async_wget_data;_emscripten_async_wget_data.sig="viiii";function _emscripten_async_wget2(url,file,request,param,arg,onload,onerror,onprogress){var _url=UTF8ToString(url);var _file=UTF8ToString(file);_file=PATH_FS.resolve(_file);var _request=UTF8ToString(request);var _param=UTF8ToString(param);var index=_file.lastIndexOf("/");var http=new XMLHttpRequest;http.open(_request,_url,true);http.responseType="arraybuffer";var handle=wget.getNextWgetRequestHandle();var destinationDirectory=PATH.dirname(_file);http.onload=function http_onload(e){if(http.status>=200&&http.status<300){try{FS.unlink(_file)}catch(e){}FS.mkdirTree(destinationDirectory);FS.createDataFile(_file.substr(0,index),_file.substr(index+1),new Uint8Array(http.response),true,true,false);if(onload){withStackSave(function(){getWasmTableEntry(onload)(handle,arg,allocateUTF8OnStack(_file))})}}else{if(onerror)getWasmTableEntry(onerror)(handle,arg,http.status)}delete wget.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror)getWasmTableEntry(onerror)(handle,arg,http.status);delete wget.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(e.lengthComputable||e.lengthComputable===undefined&&e.total!=0){var percentComplete=e.loaded/e.total*100;if(onprogress)getWasmTableEntry(onprogress)(handle,arg,percentComplete)}};http.onabort=function http_onabort(e){delete wget.wgetRequests[handle]};if(_request=="POST"){http.setRequestHeader("Content-type","application/x-www-form-urlencoded");http.send(_param)}else{http.send(null)}wget.wgetRequests[handle]=http;return handle}Module["_emscripten_async_wget2"]=_emscripten_async_wget2;_emscripten_async_wget2.sig="iiiiiiiii";function _emscripten_async_wget2_data(url,request,param,arg,free,onload,onerror,onprogress){var _url=UTF8ToString(url);var _request=UTF8ToString(request);var _param=UTF8ToString(param);var http=new XMLHttpRequest;http.open(_request,_url,true);http.responseType="arraybuffer";var handle=wget.getNextWgetRequestHandle();function onerrorjs(){if(onerror){var statusText=0;if(http.statusText){var len=lengthBytesUTF8(http.statusText)+1;statusText=stackAlloc(len);stringToUTF8(http.statusText,statusText,len)}getWasmTableEntry(onerror)(handle,arg,http.status,statusText)}}http.onload=function http_onload(e){if(http.status>=200&&http.status<300||http.status===0&&_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)getWasmTableEntry(onload)(handle,arg,buffer,byteArray.length);if(free)_free(buffer)}else{onerrorjs()}delete wget.wgetRequests[handle]};http.onerror=function http_onerror(e){onerrorjs();delete wget.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)getWasmTableEntry(onprogress)(handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0)};http.onabort=function http_onabort(e){delete wget.wgetRequests[handle]};if(_request=="POST"){http.setRequestHeader("Content-type","application/x-www-form-urlencoded");http.send(_param)}else{http.send(null)}wget.wgetRequests[handle]=http;return handle}Module["_emscripten_async_wget2_data"]=_emscripten_async_wget2_data;_emscripten_async_wget2_data.sig="iiiiiiiii";function _emscripten_async_wget2_abort(handle){var http=wget.wgetRequests[handle];if(http){http.abort()}}Module["_emscripten_async_wget2_abort"]=_emscripten_async_wget2_abort;_emscripten_async_wget2_abort.sig="vi";function _setNetworkCallback(event,userData,callback){function _callback(data){try{if(event==="error"){withStackSave(function(){var msg=allocateUTF8OnStack(data[2]);getWasmTableEntry(callback)(data[0],data[1],msg,userData)})}else{getWasmTableEntry(callback)(data,userData)}}catch(e){if(!(e instanceof ExitStatus)){if(e&&typeof e=="object"&&e.stack)err("exception thrown: "+[e,e.stack]);throw e}}}Module["websocket"]["on"](event,callback?_callback:null)}Module["_setNetworkCallback"]=_setNetworkCallback;function _emscripten_set_socket_error_callback(userData,callback){_setNetworkCallback("error",userData,callback)}Module["_emscripten_set_socket_error_callback"]=_emscripten_set_socket_error_callback;function _emscripten_set_socket_open_callback(userData,callback){_setNetworkCallback("open",userData,callback)}Module["_emscripten_set_socket_open_callback"]=_emscripten_set_socket_open_callback;function _emscripten_set_socket_listen_callback(userData,callback){_setNetworkCallback("listen",userData,callback)}Module["_emscripten_set_socket_listen_callback"]=_emscripten_set_socket_listen_callback;function _emscripten_set_socket_connection_callback(userData,callback){_setNetworkCallback("connection",userData,callback)}Module["_emscripten_set_socket_connection_callback"]=_emscripten_set_socket_connection_callback;function _emscripten_set_socket_message_callback(userData,callback){_setNetworkCallback("message",userData,callback)}Module["_emscripten_set_socket_message_callback"]=_emscripten_set_socket_message_callback;function _emscripten_set_socket_close_callback(userData,callback){_setNetworkCallback("close",userData,callback)}Module["_emscripten_set_socket_close_callback"]=_emscripten_set_socket_close_callback;var ALLOC_NORMAL=0;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;var ALLOC_STACK=1;Module["ALLOC_STACK"]=ALLOC_STACK;function allocate(slab,allocator){var ret;if(allocator==ALLOC_STACK){ret=stackAlloc(slab.length)}else{ret=_malloc(slab.length)}if(!slab.subarray&&!slab.slice){slab=new Uint8Array(slab)}HEAPU8.set(slab,ret);return ret}Module["allocate"]=allocate;function _emscripten_is_main_browser_thread(){return!ENVIRONMENT_IS_WORKER}Module["_emscripten_is_main_browser_thread"]=_emscripten_is_main_browser_thread;var WS={sockets:[null],socketEvent:null};Module["WS"]=WS;function _emscripten_websocket_get_ready_state(socketId,readyState){var socket=WS.sockets[socketId];if(!socket){return-3}HEAP16[readyState>>1]=socket.readyState;return 0}Module["_emscripten_websocket_get_ready_state"]=_emscripten_websocket_get_ready_state;_emscripten_websocket_get_ready_state.sig="iii";function _emscripten_websocket_get_buffered_amount(socketId,bufferedAmount){var socket=WS.sockets[socketId];if(!socket){return-3}tempI64=[socket.bufferedAmount>>>0,(tempDouble=socket.bufferedAmount,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[bufferedAmount>>2]=tempI64[0],HEAP32[bufferedAmount+4>>2]=tempI64[1];return 0}Module["_emscripten_websocket_get_buffered_amount"]=_emscripten_websocket_get_buffered_amount;_emscripten_websocket_get_buffered_amount.sig="iii";function _emscripten_websocket_get_extensions(socketId,extensions,extensionsLength){var socket=WS.sockets[socketId];if(!socket){return-3}if(!extensions)return-5;stringToUTF8(socket.extensions,extensions,extensionsLength);return 0}Module["_emscripten_websocket_get_extensions"]=_emscripten_websocket_get_extensions;_emscripten_websocket_get_extensions.sig="iiii";function _emscripten_websocket_get_extensions_length(socketId,extensionsLength){var socket=WS.sockets[socketId];if(!socket){return-3}if(!extensionsLength)return-5;HEAP32[extensionsLength>>2]=lengthBytesUTF8(socket.extensions)+1;return 0}Module["_emscripten_websocket_get_extensions_length"]=_emscripten_websocket_get_extensions_length;_emscripten_websocket_get_extensions_length.sig="iii";function _emscripten_websocket_get_protocol(socketId,protocol,protocolLength){var socket=WS.sockets[socketId];if(!socket){return-3}if(!protocol)return-5;stringToUTF8(socket.protocol,protocol,protocolLength);return 0}Module["_emscripten_websocket_get_protocol"]=_emscripten_websocket_get_protocol;_emscripten_websocket_get_protocol.sig="iiii";function _emscripten_websocket_get_protocol_length(socketId,protocolLength){var socket=WS.sockets[socketId];if(!socket){return-3}if(!protocolLength)return-5;HEAP32[protocolLength>>2]=lengthBytesUTF8(socket.protocol)+1;return 0}Module["_emscripten_websocket_get_protocol_length"]=_emscripten_websocket_get_protocol_length;_emscripten_websocket_get_protocol_length.sig="iii";function _emscripten_websocket_get_url(socketId,url,urlLength){var socket=WS.sockets[socketId];if(!socket){return-3}if(!url)return-5;stringToUTF8(socket.url,url,urlLength);return 0}Module["_emscripten_websocket_get_url"]=_emscripten_websocket_get_url;_emscripten_websocket_get_url.sig="iiii";function _emscripten_websocket_get_url_length(socketId,urlLength){var socket=WS.sockets[socketId];if(!socket){return-3}if(!urlLength)return-5;HEAP32[urlLength>>2]=lengthBytesUTF8(socket.url)+1;return 0}Module["_emscripten_websocket_get_url_length"]=_emscripten_websocket_get_url_length;_emscripten_websocket_get_url_length.sig="iii";function _emscripten_websocket_set_onopen_callback_on_thread(socketId,userData,callbackFunc,thread){if(!WS.socketEvent)WS.socketEvent=_malloc(1024);var socket=WS.sockets[socketId];if(!socket){return-3}socket.onopen=function(e){HEAPU32[WS.socketEvent>>2]=socketId;getWasmTableEntry(callbackFunc)(0,WS.socketEvent,userData)};return 0}Module["_emscripten_websocket_set_onopen_callback_on_thread"]=_emscripten_websocket_set_onopen_callback_on_thread;_emscripten_websocket_set_onopen_callback_on_thread.sig="iiiii";function _emscripten_websocket_set_onerror_callback_on_thread(socketId,userData,callbackFunc,thread){if(!WS.socketEvent)WS.socketEvent=_malloc(1024);var socket=WS.sockets[socketId];if(!socket){return-3}socket.onerror=function(e){HEAPU32[WS.socketEvent>>2]=socketId;getWasmTableEntry(callbackFunc)(0,WS.socketEvent,userData)};return 0}Module["_emscripten_websocket_set_onerror_callback_on_thread"]=_emscripten_websocket_set_onerror_callback_on_thread;_emscripten_websocket_set_onerror_callback_on_thread.sig="iiiii";function _emscripten_websocket_set_onclose_callback_on_thread(socketId,userData,callbackFunc,thread){if(!WS.socketEvent)WS.socketEvent=_malloc(1024);var socket=WS.sockets[socketId];if(!socket){return-3}socket.onclose=function(e){HEAPU32[WS.socketEvent>>2]=socketId;HEAPU32[WS.socketEvent+4>>2]=e.wasClean;HEAPU32[WS.socketEvent+8>>2]=e.code;stringToUTF8(e.reason,WS.socketEvent+10,512);getWasmTableEntry(callbackFunc)(0,WS.socketEvent,userData)};return 0}Module["_emscripten_websocket_set_onclose_callback_on_thread"]=_emscripten_websocket_set_onclose_callback_on_thread;_emscripten_websocket_set_onclose_callback_on_thread.sig="iiiii";function _emscripten_websocket_set_onmessage_callback_on_thread(socketId,userData,callbackFunc,thread){if(!WS.socketEvent)WS.socketEvent=_malloc(1024);var socket=WS.sockets[socketId];if(!socket){return-3}socket.onmessage=function(e){HEAPU32[WS.socketEvent>>2]=socketId;if(typeof e.data=="string"){var len=lengthBytesUTF8(e.data)+1;var buf=_malloc(len);stringToUTF8(e.data,buf,len);HEAPU32[WS.socketEvent+12>>2]=1}else{var len=e.data.byteLength;var buf=_malloc(len);HEAP8.set(new Uint8Array(e.data),buf);HEAPU32[WS.socketEvent+12>>2]=0}HEAPU32[WS.socketEvent+4>>2]=buf;HEAPU32[WS.socketEvent+8>>2]=len;getWasmTableEntry(callbackFunc)(0,WS.socketEvent,userData);_free(buf)};return 0}Module["_emscripten_websocket_set_onmessage_callback_on_thread"]=_emscripten_websocket_set_onmessage_callback_on_thread;_emscripten_websocket_set_onmessage_callback_on_thread.sig="iiiii";function _emscripten_websocket_new(createAttributes){if(typeof WebSocket=="undefined"){return-1}if(!createAttributes){return-5}var createAttrs=createAttributes>>2;var url=UTF8ToString(HEAP32[createAttrs]);var protocols=HEAP32[createAttrs+1];var socket=protocols?new WebSocket(url,UTF8ToString(protocols).split(",")):new WebSocket(url);socket.binaryType="arraybuffer";var socketId=WS.sockets.length;WS.sockets[socketId]=socket;return socketId}Module["_emscripten_websocket_new"]=_emscripten_websocket_new;_emscripten_websocket_new.sig="ii";function _emscripten_websocket_send_utf8_text(socketId,textData){var socket=WS.sockets[socketId];if(!socket){return-3}var str=UTF8ToString(textData);socket.send(str);return 0}Module["_emscripten_websocket_send_utf8_text"]=_emscripten_websocket_send_utf8_text;_emscripten_websocket_send_utf8_text.sig="iii";function _emscripten_websocket_send_binary(socketId,binaryData,dataLength){var socket=WS.sockets[socketId];if(!socket){return-3}socket.send(HEAPU8.subarray(binaryData,binaryData+dataLength));return 0}Module["_emscripten_websocket_send_binary"]=_emscripten_websocket_send_binary;_emscripten_websocket_send_binary.sig="iiii";function _emscripten_websocket_close(socketId,code,reason){var socket=WS.sockets[socketId];if(!socket){return-3}var reasonStr=reason?UTF8ToString(reason):undefined;if(reason)socket.close(code||undefined,UTF8ToString(reason));else if(code)socket.close(code);else socket.close();return 0}Module["_emscripten_websocket_close"]=_emscripten_websocket_close;_emscripten_websocket_close.sig="iiii";function _emscripten_websocket_delete(socketId){var socket=WS.sockets[socketId];if(!socket){return-3}socket.onopen=socket.onerror=socket.onclose=socket.onmessage=null;delete WS.sockets[socketId];return 0}Module["_emscripten_websocket_delete"]=_emscripten_websocket_delete;_emscripten_websocket_delete.sig="ii";function _emscripten_websocket_is_supported(){return typeof WebSocket!="undefined"}Module["_emscripten_websocket_is_supported"]=_emscripten_websocket_is_supported;_emscripten_websocket_is_supported.sig="i";function _emscripten_websocket_deinitialize(){for(var i in WS.sockets){var socket=WS.sockets[i];if(socket){socket.close();_emscripten_websocket_delete(i)}}WS.sockets=[]}Module["_emscripten_websocket_deinitialize"]=_emscripten_websocket_deinitialize;_emscripten_websocket_deinitialize.sig="v";function _emscripten_webgl_enable_ANGLE_instanced_arrays(ctx){return __webgl_enable_ANGLE_instanced_arrays(GL.contexts[ctx].GLctx)}Module["_emscripten_webgl_enable_ANGLE_instanced_arrays"]=_emscripten_webgl_enable_ANGLE_instanced_arrays;function _emscripten_webgl_enable_OES_vertex_array_object(ctx){return __webgl_enable_OES_vertex_array_object(GL.contexts[ctx].GLctx)}Module["_emscripten_webgl_enable_OES_vertex_array_object"]=_emscripten_webgl_enable_OES_vertex_array_object;function _emscripten_webgl_enable_WEBGL_draw_buffers(ctx){return __webgl_enable_WEBGL_draw_buffers(GL.contexts[ctx].GLctx)}Module["_emscripten_webgl_enable_WEBGL_draw_buffers"]=_emscripten_webgl_enable_WEBGL_draw_buffers;function _emscripten_webgl_enable_WEBGL_multi_draw(ctx){return __webgl_enable_WEBGL_multi_draw(GL.contexts[ctx].GLctx)}Module["_emscripten_webgl_enable_WEBGL_multi_draw"]=_emscripten_webgl_enable_WEBGL_multi_draw;function _glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}Module["_glPixelStorei"]=_glPixelStorei;_glPixelStorei.sig="vii";function _glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}Module["_glGetString"]=_glGetString;_glGetString.sig="ii";function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}Module["_glGetIntegerv"]=_glGetIntegerv;_glGetIntegerv.sig="vii";function _glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}Module["_glGetFloatv"]=_glGetFloatv;_glGetFloatv.sig="vii";function _glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,4)}Module["_glGetBooleanv"]=_glGetBooleanv;_glGetBooleanv.sig="vii";function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}Module["_glDeleteTextures"]=_glDeleteTextures;_glDeleteTextures.sig="vii";function _glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}Module["_glCompressedTexImage2D"]=_glCompressedTexImage2D;_glCompressedTexImage2D.sig="viiiiiiii";function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}Module["_glCompressedTexSubImage2D"]=_glCompressedTexSubImage2D;_glCompressedTexSubImage2D.sig="viiiiiiiii";function _glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}Module["_glTexImage2D"]=_glTexImage2D;_glTexImage2D.sig="viiiiiiiii";function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}Module["_glTexSubImage2D"]=_glTexSubImage2D;_glTexSubImage2D.sig="viiiiiiiii";function _glReadPixels(x,y,width,height,format,type,pixels){var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}Module["_glReadPixels"]=_glReadPixels;_glReadPixels.sig="viiiiiii";function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}Module["_glBindTexture"]=_glBindTexture;_glBindTexture.sig="vii";function _glGetTexParameterfv(target,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx.getTexParameter(target,pname)}Module["_glGetTexParameterfv"]=_glGetTexParameterfv;_glGetTexParameterfv.sig="viii";function _glGetTexParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)}Module["_glGetTexParameteriv"]=_glGetTexParameteriv;_glGetTexParameteriv.sig="viii";function _glTexParameterfv(target,pname,params){var param=HEAPF32[params>>2];GLctx.texParameterf(target,pname,param)}Module["_glTexParameterfv"]=_glTexParameterfv;_glTexParameterfv.sig="viii";function _glTexParameteriv(target,pname,params){var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)}Module["_glTexParameteriv"]=_glTexParameteriv;_glTexParameteriv.sig="viii";function _glIsTexture(id){var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)}Module["_glIsTexture"]=_glIsTexture;_glIsTexture.sig="ii";function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}Module["_glGenBuffers"]=_glGenBuffers;_glGenBuffers.sig="vii";function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}Module["_glGenTextures"]=_glGenTextures;_glGenTextures.sig="vii";function _glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null}}Module["_glDeleteBuffers"]=_glDeleteBuffers;_glDeleteBuffers.sig="vii";function _glGetBufferParameteriv(target,value,data){if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)}Module["_glGetBufferParameteriv"]=_glGetBufferParameteriv;_glGetBufferParameteriv.sig="viii";function _glBufferData(target,size,data,usage){GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}Module["_glBufferData"]=_glBufferData;_glBufferData.sig="viiii";function _glBufferSubData(target,offset,size,data){GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}Module["_glBufferSubData"]=_glBufferSubData;_glBufferSubData.sig="viiii";function _glGenQueriesEXT(n,ids){for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;HEAP32[ids+i*4>>2]=id}}Module["_glGenQueriesEXT"]=_glGenQueriesEXT;_glGenQueriesEXT.sig="vii";function _glDeleteQueriesEXT(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}}Module["_glDeleteQueriesEXT"]=_glDeleteQueriesEXT;_glDeleteQueriesEXT.sig="vii";function _glIsQueryEXT(id){var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)}Module["_glIsQueryEXT"]=_glIsQueryEXT;_glIsQueryEXT.sig="ii";function _glBeginQueryEXT(target,id){GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])}Module["_glBeginQueryEXT"]=_glBeginQueryEXT;_glBeginQueryEXT.sig="vii";function _glEndQueryEXT(target){GLctx.disjointTimerQueryExt["endQueryEXT"](target)}Module["_glEndQueryEXT"]=_glEndQueryEXT;_glEndQueryEXT.sig="vi";function _glQueryCounterEXT(id,target){GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)}Module["_glQueryCounterEXT"]=_glQueryCounterEXT;_glQueryCounterEXT.sig="vii";function _glGetQueryivEXT(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)}Module["_glGetQueryivEXT"]=_glGetQueryivEXT;_glGetQueryivEXT.sig="viii";function _glGetQueryObjectivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}Module["_glGetQueryObjectivEXT"]=_glGetQueryObjectivEXT;_glGetQueryObjectivEXT.sig="viii";function _glGetQueryObjectuivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}Module["_glGetQueryObjectuivEXT"]=_glGetQueryObjectuivEXT;_glGetQueryObjectuivEXT.sig="viii";function _glGetQueryObjecti64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;{param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}Module["_glGetQueryObjecti64vEXT"]=_glGetQueryObjecti64vEXT;_glGetQueryObjecti64vEXT.sig="viii";function _glGetQueryObjectui64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;{param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}Module["_glGetQueryObjectui64vEXT"]=_glGetQueryObjectui64vEXT;_glGetQueryObjectui64vEXT.sig="viii";function _glIsBuffer(buffer){var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)}Module["_glIsBuffer"]=_glIsBuffer;_glIsBuffer.sig="ii";function _glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}Module["_glGenRenderbuffers"]=_glGenRenderbuffers;_glGenRenderbuffers.sig="vii";function _glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}Module["_glDeleteRenderbuffers"]=_glDeleteRenderbuffers;_glDeleteRenderbuffers.sig="vii";function _glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}Module["_glBindRenderbuffer"]=_glBindRenderbuffer;_glBindRenderbuffer.sig="vii";function _glGetRenderbufferParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)}Module["_glGetRenderbufferParameteriv"]=_glGetRenderbufferParameteriv;_glGetRenderbufferParameteriv.sig="viii";function _glIsRenderbuffer(renderbuffer){var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)}Module["_glIsRenderbuffer"]=_glIsRenderbuffer;_glIsRenderbuffer.sig="ii";function _glGetUniformfv(program,location,params){emscriptenWebGLGetUniform(program,location,params,2)}Module["_glGetUniformfv"]=_glGetUniformfv;_glGetUniformfv.sig="viii";function _glGetUniformiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}Module["_glGetUniformiv"]=_glGetUniformiv;_glGetUniformiv.sig="viii";function _glGetUniformLocation(program,name){name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex>2]=GLctx.getVertexAttribOffset(index,pname)}Module["_glGetVertexAttribPointerv"]=_glGetVertexAttribPointerv;_glGetVertexAttribPointerv.sig="viii";function _glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}Module["_glUniform1f"]=_glUniform1f;_glUniform1f.sig="vif";function _glUniform2f(location,v0,v1){GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)}Module["_glUniform2f"]=_glUniform2f;_glUniform2f.sig="viff";function _glUniform3f(location,v0,v1,v2){GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)}Module["_glUniform3f"]=_glUniform3f;_glUniform3f.sig="vifff";function _glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)}Module["_glUniform4f"]=_glUniform4f;_glUniform4f.sig="viffff";function _glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}Module["_glUniform1i"]=_glUniform1i;_glUniform1i.sig="vii";function _glUniform2i(location,v0,v1){GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)}Module["_glUniform2i"]=_glUniform2i;_glUniform2i.sig="viii";function _glUniform3i(location,v0,v1,v2){GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)}Module["_glUniform3i"]=_glUniform3i;_glUniform3i.sig="viiii";function _glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)}Module["_glUniform4i"]=_glUniform4i;_glUniform4i.sig="viiiii";function _glUniform1iv(location,count,value){if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}Module["_glUniform1iv"]=_glUniform1iv;_glUniform1iv.sig="viii";function _glUniform2iv(location,count,value){if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}Module["_glUniform2iv"]=_glUniform2iv;_glUniform2iv.sig="viii";function _glUniform3iv(location,count,value){if(count<=96){var view=__miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)}Module["_glUniform3iv"]=_glUniform3iv;_glUniform3iv.sig="viii";function _glUniform4iv(location,count,value){if(count<=72){var view=__miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)}Module["_glUniform4iv"]=_glUniform4iv;_glUniform4iv.sig="viii";function _glUniform1fv(location,count,value){if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)}Module["_glUniform1fv"]=_glUniform1fv;_glUniform1fv.sig="viii";function _glUniform2fv(location,count,value){if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}Module["_glUniform2fv"]=_glUniform2fv;_glUniform2fv.sig="viii";function _glUniform3fv(location,count,value){if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}Module["_glUniform3fv"]=_glUniform3fv;_glUniform3fv.sig="viii";function _glUniform4fv(location,count,value){if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}Module["_glUniform4fv"]=_glUniform4fv;_glUniform4fv.sig="viii";function _glUniformMatrix2fv(location,count,transpose,value){if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}Module["_glUniformMatrix2fv"]=_glUniformMatrix2fv;_glUniformMatrix2fv.sig="viiii";function _glUniformMatrix3fv(location,count,transpose,value){if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}Module["_glUniformMatrix3fv"]=_glUniformMatrix3fv;_glUniformMatrix3fv.sig="viiii";function _glUniformMatrix4fv(location,count,transpose,value){if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}Module["_glUniformMatrix4fv"]=_glUniformMatrix4fv;_glUniformMatrix4fv.sig="viiii";function _glBindBuffer(target,buffer){GLctx.bindBuffer(target,GL.buffers[buffer])}Module["_glBindBuffer"]=_glBindBuffer;_glBindBuffer.sig="vii";function _glVertexAttrib1fv(index,v){GLctx.vertexAttrib1f(index,HEAPF32[v>>2])}Module["_glVertexAttrib1fv"]=_glVertexAttrib1fv;_glVertexAttrib1fv.sig="vii";function _glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(index,HEAPF32[v>>2],HEAPF32[v+4>>2])}Module["_glVertexAttrib2fv"]=_glVertexAttrib2fv;_glVertexAttrib2fv.sig="vii";function _glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2])}Module["_glVertexAttrib3fv"]=_glVertexAttrib3fv;_glVertexAttrib3fv.sig="vii";function _glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}Module["_glVertexAttrib4fv"]=_glVertexAttrib4fv;_glVertexAttrib4fv.sig="vii";function _glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}Module["_glGetAttribLocation"]=_glGetAttribLocation;_glGetAttribLocation.sig="iii";function _glGetActiveAttrib(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)}Module["_glGetActiveAttrib"]=_glGetActiveAttrib;_glGetActiveAttrib.sig="viiiiiii";function _glGetActiveUniform(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)}Module["_glGetActiveUniform"]=_glGetActiveUniform;_glGetActiveUniform.sig="viiiiiii";function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}Module["_glCreateShader"]=_glCreateShader;_glCreateShader.sig="ii";function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}Module["_glDeleteShader"]=_glDeleteShader;_glDeleteShader.sig="vi";function _glGetAttachedShaders(program,maxCount,count,shaders){var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i>2]=id}}Module["_glGetAttachedShaders"]=_glGetAttachedShaders;_glGetAttachedShaders.sig="viiii";function _glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}Module["_glShaderSource"]=_glShaderSource;_glShaderSource.sig="viiii";function _glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}Module["_glGetShaderSource"]=_glGetShaderSource;_glGetShaderSource.sig="viiii";function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}Module["_glCompileShader"]=_glCompileShader;_glCompileShader.sig="vi";function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}Module["_glGetShaderInfoLog"]=_glGetShaderInfoLog;_glGetShaderInfoLog.sig="viiii";function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}Module["_glGetShaderiv"]=_glGetShaderiv;_glGetShaderiv.sig="viii";function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}Module["_glGetProgramiv"]=_glGetProgramiv;_glGetProgramiv.sig="viii";function _glIsShader(shader){var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)}Module["_glIsShader"]=_glIsShader;_glIsShader.sig="ii";function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}Module["_glCreateProgram"]=_glCreateProgram;_glCreateProgram.sig="i";function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}Module["_glDeleteProgram"]=_glDeleteProgram;_glDeleteProgram.sig="vi";function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}Module["_glAttachShader"]=_glAttachShader;_glAttachShader.sig="vii";function _glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}Module["_glDetachShader"]=_glDetachShader;_glDetachShader.sig="vii";function _glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision}Module["_glGetShaderPrecisionFormat"]=_glGetShaderPrecisionFormat;_glGetShaderPrecisionFormat.sig="viiii";function _glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}Module["_glLinkProgram"]=_glLinkProgram;_glLinkProgram.sig="vi";function _glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}Module["_glGetProgramInfoLog"]=_glGetProgramInfoLog;_glGetProgramInfoLog.sig="viiii";function _glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}Module["_glUseProgram"]=_glUseProgram;_glUseProgram.sig="vi";function _glValidateProgram(program){GLctx.validateProgram(GL.programs[program])}Module["_glValidateProgram"]=_glValidateProgram;_glValidateProgram.sig="vi";function _glIsProgram(program){program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)}Module["_glIsProgram"]=_glIsProgram;_glIsProgram.sig="ii";function _glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}Module["_glBindAttribLocation"]=_glBindAttribLocation;_glBindAttribLocation.sig="viii";function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])}Module["_glBindFramebuffer"]=_glBindFramebuffer;_glBindFramebuffer.sig="vii";function _glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}Module["_glGenFramebuffers"]=_glGenFramebuffers;_glGenFramebuffers.sig="vii";function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}Module["_glDeleteFramebuffers"]=_glDeleteFramebuffers;_glDeleteFramebuffers.sig="vii";function _glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}Module["_glFramebufferRenderbuffer"]=_glFramebufferRenderbuffer;_glFramebufferRenderbuffer.sig="viiii";function _glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}Module["_glFramebufferTexture2D"]=_glFramebufferTexture2D;_glFramebufferTexture2D.sig="viiiii";function _glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result}Module["_glGetFramebufferAttachmentParameteriv"]=_glGetFramebufferAttachmentParameteriv;_glGetFramebufferAttachmentParameteriv.sig="viiii";function _glIsFramebuffer(framebuffer){var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)}Module["_glIsFramebuffer"]=_glIsFramebuffer;_glIsFramebuffer.sig="ii";function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}Module["_glGenVertexArrays"]=_glGenVertexArrays;_glGenVertexArrays.sig="vii";function _glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}Module["_glDeleteVertexArrays"]=_glDeleteVertexArrays;_glDeleteVertexArrays.sig="vii";function _glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}Module["_glBindVertexArray"]=_glBindVertexArray;_glBindVertexArray.sig="vi";function _glIsVertexArray(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}Module["_glIsVertexArray"]=_glIsVertexArray;_glIsVertexArray.sig="ii";function _glVertexPointer(){throw"Legacy GL function (glVertexPointer) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."}Module["_glVertexPointer"]=_glVertexPointer;function _glMatrixMode(){throw"Legacy GL function (glMatrixMode) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."}Module["_glMatrixMode"]=_glMatrixMode;function _glBegin(){throw"Legacy GL function (glBegin) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."}Module["_glBegin"]=_glBegin;function _glLoadIdentity(){throw"Legacy GL function (glLoadIdentity) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."}Module["_glLoadIdentity"]=_glLoadIdentity;function _glGenVertexArraysOES(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}Module["_glGenVertexArraysOES"]=_glGenVertexArraysOES;_glGenVertexArraysOES.sig="vii";function _glDeleteVertexArraysOES(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}Module["_glDeleteVertexArraysOES"]=_glDeleteVertexArraysOES;_glDeleteVertexArraysOES.sig="vii";function _glBindVertexArrayOES(vao){GLctx["bindVertexArray"](GL.vaos[vao])}Module["_glBindVertexArrayOES"]=_glBindVertexArrayOES;_glBindVertexArrayOES.sig="vi";function _glIsVertexArrayOES(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}Module["_glIsVertexArrayOES"]=_glIsVertexArrayOES;_glIsVertexArrayOES.sig="ii";function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}Module["_glVertexAttribPointer"]=_glVertexAttribPointer;_glVertexAttribPointer.sig="viiiiii";function _glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}Module["_glEnableVertexAttribArray"]=_glEnableVertexAttribArray;_glEnableVertexAttribArray.sig="vi";function _glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}Module["_glDisableVertexAttribArray"]=_glDisableVertexAttribArray;_glDisableVertexAttribArray.sig="vi";function _glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}Module["_glDrawArrays"]=_glDrawArrays;_glDrawArrays.sig="viii";function _glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}Module["_glDrawElements"]=_glDrawElements;_glDrawElements.sig="viiii";function _glShaderBinary(){GL.recordError(1280)}Module["_glShaderBinary"]=_glShaderBinary;_glShaderBinary.sig="v";function _glReleaseShaderCompiler(){}Module["_glReleaseShaderCompiler"]=_glReleaseShaderCompiler;_glReleaseShaderCompiler.sig="v";function _glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}Module["_glGetError"]=_glGetError;_glGetError.sig="i";function _glVertexAttribDivisor(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_glVertexAttribDivisor"]=_glVertexAttribDivisor;_glVertexAttribDivisor.sig="vii";function _glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_glDrawArraysInstanced"]=_glDrawArraysInstanced;_glDrawArraysInstanced.sig="viiii";function _glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_glDrawElementsInstanced"]=_glDrawElementsInstanced;_glDrawElementsInstanced.sig="viiiii";function _glVertexAttribDivisorNV(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_glVertexAttribDivisorNV"]=_glVertexAttribDivisorNV;_glVertexAttribDivisorNV.sig="vii";function _glDrawArraysInstancedNV(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_glDrawArraysInstancedNV"]=_glDrawArraysInstancedNV;_glDrawArraysInstancedNV.sig="viiii";function _glDrawElementsInstancedNV(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_glDrawElementsInstancedNV"]=_glDrawElementsInstancedNV;_glDrawElementsInstancedNV.sig="viiiii";function _glVertexAttribDivisorEXT(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_glVertexAttribDivisorEXT"]=_glVertexAttribDivisorEXT;_glVertexAttribDivisorEXT.sig="vii";function _glDrawArraysInstancedEXT(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_glDrawArraysInstancedEXT"]=_glDrawArraysInstancedEXT;_glDrawArraysInstancedEXT.sig="viiii";function _glDrawElementsInstancedEXT(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_glDrawElementsInstancedEXT"]=_glDrawElementsInstancedEXT;_glDrawElementsInstancedEXT.sig="viiiii";function _glVertexAttribDivisorARB(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_glVertexAttribDivisorARB"]=_glVertexAttribDivisorARB;_glVertexAttribDivisorARB.sig="vii";function _glDrawArraysInstancedARB(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_glDrawArraysInstancedARB"]=_glDrawArraysInstancedARB;_glDrawArraysInstancedARB.sig="viiii";function _glDrawElementsInstancedARB(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_glDrawElementsInstancedARB"]=_glDrawElementsInstancedARB;_glDrawElementsInstancedARB.sig="viiiii";function _glVertexAttribDivisorANGLE(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_glVertexAttribDivisorANGLE"]=_glVertexAttribDivisorANGLE;_glVertexAttribDivisorANGLE.sig="vii";function _glDrawArraysInstancedANGLE(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_glDrawArraysInstancedANGLE"]=_glDrawArraysInstancedANGLE;_glDrawArraysInstancedANGLE.sig="viiii";function _glDrawElementsInstancedANGLE(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_glDrawElementsInstancedANGLE"]=_glDrawElementsInstancedANGLE;_glDrawElementsInstancedANGLE.sig="viiiii";function _glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}Module["_glDrawBuffers"]=_glDrawBuffers;_glDrawBuffers.sig="vii";function _glDrawBuffersEXT(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}Module["_glDrawBuffersEXT"]=_glDrawBuffersEXT;_glDrawBuffersEXT.sig="vii";function _glDrawBuffersWEBGL(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}Module["_glDrawBuffersWEBGL"]=_glDrawBuffersWEBGL;_glDrawBuffersWEBGL.sig="vii";function _glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}Module["_glColorMask"]=_glColorMask;_glColorMask.sig="viiii";function _glDepthMask(flag){GLctx.depthMask(!!flag)}Module["_glDepthMask"]=_glDepthMask;_glDepthMask.sig="vi";function _glSampleCoverage(value,invert){GLctx.sampleCoverage(value,!!invert)}Module["_glSampleCoverage"]=_glSampleCoverage;_glSampleCoverage.sig="vii";function _glMultiDrawArrays(mode,firsts,counts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,drawcount)}Module["_glMultiDrawArrays"]=_glMultiDrawArrays;_glMultiDrawArrays.sig="viiii";function _glMultiDrawArraysANGLE(mode,firsts,counts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,drawcount)}Module["_glMultiDrawArraysANGLE"]=_glMultiDrawArraysANGLE;_glMultiDrawArraysANGLE.sig="viiii";function _glMultiDrawArraysWEBGL(mode,firsts,counts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,drawcount)}Module["_glMultiDrawArraysWEBGL"]=_glMultiDrawArraysWEBGL;_glMultiDrawArraysWEBGL.sig="viiii";function _glMultiDrawArraysInstancedANGLE(mode,firsts,counts,instanceCounts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysInstancedWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,HEAP32,instanceCounts>>2,drawcount)}Module["_glMultiDrawArraysInstancedANGLE"]=_glMultiDrawArraysInstancedANGLE;_glMultiDrawArraysInstancedANGLE.sig="viiiii";function _glMultiDrawArraysInstancedWEBGL(mode,firsts,counts,instanceCounts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysInstancedWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,HEAP32,instanceCounts>>2,drawcount)}Module["_glMultiDrawArraysInstancedWEBGL"]=_glMultiDrawArraysInstancedWEBGL;_glMultiDrawArraysInstancedWEBGL.sig="viiiii";function _glMultiDrawElements(mode,counts,type,offsets,drawcount){GLctx.multiDrawWebgl["multiDrawElementsWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,drawcount)}Module["_glMultiDrawElements"]=_glMultiDrawElements;_glMultiDrawElements.sig="viiiii";function _glMultiDrawElementsANGLE(mode,counts,type,offsets,drawcount){GLctx.multiDrawWebgl["multiDrawElementsWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,drawcount)}Module["_glMultiDrawElementsANGLE"]=_glMultiDrawElementsANGLE;_glMultiDrawElementsANGLE.sig="viiiii";function _glMultiDrawElementsWEBGL(mode,counts,type,offsets,drawcount){GLctx.multiDrawWebgl["multiDrawElementsWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,drawcount)}Module["_glMultiDrawElementsWEBGL"]=_glMultiDrawElementsWEBGL;_glMultiDrawElementsWEBGL.sig="viiiii";function _glMultiDrawElementsInstancedANGLE(mode,counts,type,offsets,instanceCounts,drawcount){GLctx.multiDrawWebgl["multiDrawElementsInstancedWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,HEAP32,instanceCounts>>2,drawcount)}Module["_glMultiDrawElementsInstancedANGLE"]=_glMultiDrawElementsInstancedANGLE;_glMultiDrawElementsInstancedANGLE.sig="viiiiii";function _glMultiDrawElementsInstancedWEBGL(mode,counts,type,offsets,instanceCounts,drawcount){GLctx.multiDrawWebgl["multiDrawElementsInstancedWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,HEAP32,instanceCounts>>2,drawcount)}Module["_glMultiDrawElementsInstancedWEBGL"]=_glMultiDrawElementsInstancedWEBGL;_glMultiDrawElementsInstancedWEBGL.sig="viiiiii";function _glFinish(){GLctx["finish"]()}Module["_glFinish"]=_glFinish;_glFinish.sig="v";function _glFlush(){GLctx["flush"]()}Module["_glFlush"]=_glFlush;_glFlush.sig="v";function _glClearDepth(x0){GLctx["clearDepth"](x0)}Module["_glClearDepth"]=_glClearDepth;_glClearDepth.sig="vi";function _glClearDepthf(x0){GLctx["clearDepth"](x0)}Module["_glClearDepthf"]=_glClearDepthf;_glClearDepthf.sig="vf";function _glDepthFunc(x0){GLctx["depthFunc"](x0)}Module["_glDepthFunc"]=_glDepthFunc;_glDepthFunc.sig="vi";function _glEnable(x0){GLctx["enable"](x0)}Module["_glEnable"]=_glEnable;_glEnable.sig="vi";function _glDisable(x0){GLctx["disable"](x0)}Module["_glDisable"]=_glDisable;_glDisable.sig="vi";function _glFrontFace(x0){GLctx["frontFace"](x0)}Module["_glFrontFace"]=_glFrontFace;_glFrontFace.sig="vi";function _glCullFace(x0){GLctx["cullFace"](x0)}Module["_glCullFace"]=_glCullFace;_glCullFace.sig="vi";function _glClear(x0){GLctx["clear"](x0)}Module["_glClear"]=_glClear;_glClear.sig="vi";function _glLineWidth(x0){GLctx["lineWidth"](x0)}Module["_glLineWidth"]=_glLineWidth;_glLineWidth.sig="vf";function _glClearStencil(x0){GLctx["clearStencil"](x0)}Module["_glClearStencil"]=_glClearStencil;_glClearStencil.sig="vi";function _glStencilMask(x0){GLctx["stencilMask"](x0)}Module["_glStencilMask"]=_glStencilMask;_glStencilMask.sig="vi";function _glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}Module["_glCheckFramebufferStatus"]=_glCheckFramebufferStatus;_glCheckFramebufferStatus.sig="ii";function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}Module["_glGenerateMipmap"]=_glGenerateMipmap;_glGenerateMipmap.sig="vi";function _glActiveTexture(x0){GLctx["activeTexture"](x0)}Module["_glActiveTexture"]=_glActiveTexture;_glActiveTexture.sig="vi";function _glBlendEquation(x0){GLctx["blendEquation"](x0)}Module["_glBlendEquation"]=_glBlendEquation;_glBlendEquation.sig="vi";function _glIsEnabled(x0){return GLctx["isEnabled"](x0)}Module["_glIsEnabled"]=_glIsEnabled;_glIsEnabled.sig="ii";function _glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}Module["_glBlendFunc"]=_glBlendFunc;_glBlendFunc.sig="vii";function _glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}Module["_glBlendEquationSeparate"]=_glBlendEquationSeparate;_glBlendEquationSeparate.sig="vii";function _glDepthRange(x0,x1){GLctx["depthRange"](x0,x1)}Module["_glDepthRange"]=_glDepthRange;_glDepthRange.sig="vii";function _glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}Module["_glDepthRangef"]=_glDepthRangef;_glDepthRangef.sig="vii";function _glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}Module["_glStencilMaskSeparate"]=_glStencilMaskSeparate;_glStencilMaskSeparate.sig="vii";function _glHint(x0,x1){GLctx["hint"](x0,x1)}Module["_glHint"]=_glHint;_glHint.sig="vii";function _glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}Module["_glPolygonOffset"]=_glPolygonOffset;_glPolygonOffset.sig="vff";function _glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,x1)}Module["_glVertexAttrib1f"]=_glVertexAttrib1f;_glVertexAttrib1f.sig="vif";function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}Module["_glTexParameteri"]=_glTexParameteri;_glTexParameteri.sig="viii";function _glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}Module["_glTexParameterf"]=_glTexParameterf;_glTexParameterf.sig="viii";function _glVertexAttrib2f(x0,x1,x2){GLctx["vertexAttrib2f"](x0,x1,x2)}Module["_glVertexAttrib2f"]=_glVertexAttrib2f;_glVertexAttrib2f.sig="viff";function _glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,x2)}Module["_glStencilFunc"]=_glStencilFunc;_glStencilFunc.sig="viii";function _glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}Module["_glStencilOp"]=_glStencilOp;_glStencilOp.sig="viii";function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}Module["_glViewport"]=_glViewport;_glViewport.sig="viiii";function _glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}Module["_glClearColor"]=_glClearColor;_glClearColor.sig="vffff";function _glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}Module["_glScissor"]=_glScissor;_glScissor.sig="viiii";function _glVertexAttrib3f(x0,x1,x2,x3){GLctx["vertexAttrib3f"](x0,x1,x2,x3)}Module["_glVertexAttrib3f"]=_glVertexAttrib3f;_glVertexAttrib3f.sig="vifff";function _glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}Module["_glRenderbufferStorage"]=_glRenderbufferStorage;_glRenderbufferStorage.sig="viiii";function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}Module["_glBlendFuncSeparate"]=_glBlendFuncSeparate;_glBlendFuncSeparate.sig="viiii";function _glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1,x2,x3)}Module["_glBlendColor"]=_glBlendColor;_glBlendColor.sig="vffff";function _glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}Module["_glStencilFuncSeparate"]=_glStencilFuncSeparate;_glStencilFuncSeparate.sig="viiii";function _glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}Module["_glStencilOpSeparate"]=_glStencilOpSeparate;_glStencilOpSeparate.sig="viiii";function _glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}Module["_glVertexAttrib4f"]=_glVertexAttrib4f;_glVertexAttrib4f.sig="viffff";function _glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}Module["_glCopyTexImage2D"]=_glCopyTexImage2D;_glCopyTexImage2D.sig="viiiiiiii";function _glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}Module["_glCopyTexSubImage2D"]=_glCopyTexSubImage2D;_glCopyTexSubImage2D.sig="viiiiiiii";function _emscripten_glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}Module["_emscripten_glGenVertexArrays"]=_emscripten_glGenVertexArrays;_emscripten_glGenVertexArrays.sig="vii";function _emscripten_glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}Module["_emscripten_glDeleteVertexArrays"]=_emscripten_glDeleteVertexArrays;_emscripten_glDeleteVertexArrays.sig="vii";function _emscripten_glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}Module["_emscripten_glBindVertexArray"]=_emscripten_glBindVertexArray;_emscripten_glBindVertexArray.sig="vi";function _emscripten_glIsVertexArray(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}Module["_emscripten_glIsVertexArray"]=_emscripten_glIsVertexArray;_emscripten_glIsVertexArray.sig="ii";function _emscripten_glVertexPointer(){throw"Legacy GL function (glVertexPointer) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."}Module["_emscripten_glVertexPointer"]=_emscripten_glVertexPointer;function _emscripten_glMatrixMode(){throw"Legacy GL function (glMatrixMode) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."}Module["_emscripten_glMatrixMode"]=_emscripten_glMatrixMode;function _emscripten_glBegin(){throw"Legacy GL function (glBegin) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."}Module["_emscripten_glBegin"]=_emscripten_glBegin;function _emscripten_glLoadIdentity(){throw"Legacy GL function (glLoadIdentity) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."}Module["_emscripten_glLoadIdentity"]=_emscripten_glLoadIdentity;function _emscripten_glVertexAttribDivisor(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_emscripten_glVertexAttribDivisor"]=_emscripten_glVertexAttribDivisor;_emscripten_glVertexAttribDivisor.sig="vii";function _emscripten_glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_emscripten_glDrawArraysInstanced"]=_emscripten_glDrawArraysInstanced;_emscripten_glDrawArraysInstanced.sig="viiii";function _emscripten_glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_emscripten_glDrawElementsInstanced"]=_emscripten_glDrawElementsInstanced;_emscripten_glDrawElementsInstanced.sig="viiiii";function _emscripten_glVertexAttribDivisorNV(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_emscripten_glVertexAttribDivisorNV"]=_emscripten_glVertexAttribDivisorNV;_emscripten_glVertexAttribDivisorNV.sig="vii";function _emscripten_glDrawArraysInstancedNV(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_emscripten_glDrawArraysInstancedNV"]=_emscripten_glDrawArraysInstancedNV;_emscripten_glDrawArraysInstancedNV.sig="viiii";function _emscripten_glDrawElementsInstancedNV(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_emscripten_glDrawElementsInstancedNV"]=_emscripten_glDrawElementsInstancedNV;_emscripten_glDrawElementsInstancedNV.sig="viiiii";function _emscripten_glVertexAttribDivisorEXT(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_emscripten_glVertexAttribDivisorEXT"]=_emscripten_glVertexAttribDivisorEXT;_emscripten_glVertexAttribDivisorEXT.sig="vii";function _emscripten_glDrawArraysInstancedEXT(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_emscripten_glDrawArraysInstancedEXT"]=_emscripten_glDrawArraysInstancedEXT;_emscripten_glDrawArraysInstancedEXT.sig="viiii";function _emscripten_glDrawElementsInstancedEXT(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_emscripten_glDrawElementsInstancedEXT"]=_emscripten_glDrawElementsInstancedEXT;_emscripten_glDrawElementsInstancedEXT.sig="viiiii";function _emscripten_glVertexAttribDivisorARB(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}Module["_emscripten_glVertexAttribDivisorARB"]=_emscripten_glVertexAttribDivisorARB;_emscripten_glVertexAttribDivisorARB.sig="vii";function _emscripten_glDrawArraysInstancedARB(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}Module["_emscripten_glDrawArraysInstancedARB"]=_emscripten_glDrawArraysInstancedARB;_emscripten_glDrawArraysInstancedARB.sig="viiii";function _emscripten_glDrawElementsInstancedARB(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}Module["_emscripten_glDrawElementsInstancedARB"]=_emscripten_glDrawElementsInstancedARB;_emscripten_glDrawElementsInstancedARB.sig="viiiii";function _emscripten_glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}Module["_emscripten_glDrawBuffers"]=_emscripten_glDrawBuffers;_emscripten_glDrawBuffers.sig="vii";function _emscripten_glDrawBuffersEXT(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}Module["_emscripten_glDrawBuffersEXT"]=_emscripten_glDrawBuffersEXT;_emscripten_glDrawBuffersEXT.sig="vii";function _emscripten_glMultiDrawArrays(mode,firsts,counts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,drawcount)}Module["_emscripten_glMultiDrawArrays"]=_emscripten_glMultiDrawArrays;_emscripten_glMultiDrawArrays.sig="viiii";function _emscripten_glMultiDrawArraysANGLE(mode,firsts,counts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,drawcount)}Module["_emscripten_glMultiDrawArraysANGLE"]=_emscripten_glMultiDrawArraysANGLE;_emscripten_glMultiDrawArraysANGLE.sig="viiii";function _emscripten_glMultiDrawArraysWEBGL(mode,firsts,counts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,drawcount)}Module["_emscripten_glMultiDrawArraysWEBGL"]=_emscripten_glMultiDrawArraysWEBGL;_emscripten_glMultiDrawArraysWEBGL.sig="viiii";function _emscripten_glMultiDrawArraysInstancedANGLE(mode,firsts,counts,instanceCounts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysInstancedWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,HEAP32,instanceCounts>>2,drawcount)}Module["_emscripten_glMultiDrawArraysInstancedANGLE"]=_emscripten_glMultiDrawArraysInstancedANGLE;_emscripten_glMultiDrawArraysInstancedANGLE.sig="viiiii";function _emscripten_glMultiDrawArraysInstancedWEBGL(mode,firsts,counts,instanceCounts,drawcount){GLctx.multiDrawWebgl["multiDrawArraysInstancedWEBGL"](mode,HEAP32,firsts>>2,HEAP32,counts>>2,HEAP32,instanceCounts>>2,drawcount)}Module["_emscripten_glMultiDrawArraysInstancedWEBGL"]=_emscripten_glMultiDrawArraysInstancedWEBGL;_emscripten_glMultiDrawArraysInstancedWEBGL.sig="viiiii";function _emscripten_glMultiDrawElements(mode,counts,type,offsets,drawcount){GLctx.multiDrawWebgl["multiDrawElementsWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,drawcount)}Module["_emscripten_glMultiDrawElements"]=_emscripten_glMultiDrawElements;_emscripten_glMultiDrawElements.sig="viiiii";function _emscripten_glMultiDrawElementsANGLE(mode,counts,type,offsets,drawcount){GLctx.multiDrawWebgl["multiDrawElementsWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,drawcount)}Module["_emscripten_glMultiDrawElementsANGLE"]=_emscripten_glMultiDrawElementsANGLE;_emscripten_glMultiDrawElementsANGLE.sig="viiiii";function _emscripten_glMultiDrawElementsWEBGL(mode,counts,type,offsets,drawcount){GLctx.multiDrawWebgl["multiDrawElementsWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,drawcount)}Module["_emscripten_glMultiDrawElementsWEBGL"]=_emscripten_glMultiDrawElementsWEBGL;_emscripten_glMultiDrawElementsWEBGL.sig="viiiii";function _emscripten_glMultiDrawElementsInstancedANGLE(mode,counts,type,offsets,instanceCounts,drawcount){GLctx.multiDrawWebgl["multiDrawElementsInstancedWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,HEAP32,instanceCounts>>2,drawcount)}Module["_emscripten_glMultiDrawElementsInstancedANGLE"]=_emscripten_glMultiDrawElementsInstancedANGLE;_emscripten_glMultiDrawElementsInstancedANGLE.sig="viiiiii";function _emscripten_glMultiDrawElementsInstancedWEBGL(mode,counts,type,offsets,instanceCounts,drawcount){GLctx.multiDrawWebgl["multiDrawElementsInstancedWEBGL"](mode,HEAP32,counts>>2,type,HEAP32,offsets>>2,HEAP32,instanceCounts>>2,drawcount)}Module["_emscripten_glMultiDrawElementsInstancedWEBGL"]=_emscripten_glMultiDrawElementsInstancedWEBGL;_emscripten_glMultiDrawElementsInstancedWEBGL.sig="viiiiii";function _emscripten_glClearDepth(x0){GLctx["clearDepth"](x0)}Module["_emscripten_glClearDepth"]=_emscripten_glClearDepth;_emscripten_glClearDepth.sig="vi";function _emscripten_glDepthRange(x0,x1){GLctx["depthRange"](x0,x1)}Module["_emscripten_glDepthRange"]=_emscripten_glDepthRange;_emscripten_glDepthRange.sig="vii";function writeGLArray(arr,dst,dstLength,heapType){var len=arr.length;var writeLength=dstLength>2)+i]=arr[i]}return len}Module["writeGLArray"]=writeGLArray;function _emscripten_webgl_init_context_attributes(attributes){var a=attributes>>2;for(var i=0;i<56>>2;++i){HEAP32[a+i]=0}HEAP32[a+(0>>2)]=HEAP32[a+(4>>2)]=HEAP32[a+(12>>2)]=HEAP32[a+(16>>2)]=HEAP32[a+(32>>2)]=HEAP32[a+(40>>2)]=1}Module["_emscripten_webgl_init_context_attributes"]=_emscripten_webgl_init_context_attributes;var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];Module["__emscripten_webgl_power_preferences"]=__emscripten_webgl_power_preferences;function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=HEAP32[a+(24>>2)];var contextAttributes={"alpha":!!HEAP32[a+(0>>2)],"depth":!!HEAP32[a+(4>>2)],"stencil":!!HEAP32[a+(8>>2)],"antialias":!!HEAP32[a+(12>>2)],"premultipliedAlpha":!!HEAP32[a+(16>>2)],"preserveDrawingBuffer":!!HEAP32[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!HEAP32[a+(28>>2)],majorVersion:HEAP32[a+(32>>2)],minorVersion:HEAP32[a+(36>>2)],enableExtensionsByDefault:HEAP32[a+(40>>2)],explicitSwapControl:HEAP32[a+(44>>2)],proxyContextToMainThread:HEAP32[a+(48>>2)],renderViaOffscreenBackBuffer:HEAP32[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}Module["_emscripten_webgl_do_create_context"]=_emscripten_webgl_do_create_context;_emscripten_webgl_do_create_context.sig="iii";var _emscripten_webgl_create_context=_emscripten_webgl_do_create_context;Module["_emscripten_webgl_create_context"]=_emscripten_webgl_create_context;_emscripten_webgl_create_context.sig="iii";function _emscripten_webgl_do_get_current_context(){return GL.currentContext?GL.currentContext.handle:0}Module["_emscripten_webgl_do_get_current_context"]=_emscripten_webgl_do_get_current_context;var _emscripten_webgl_get_current_context=_emscripten_webgl_do_get_current_context;Module["_emscripten_webgl_get_current_context"]=_emscripten_webgl_get_current_context;_emscripten_webgl_get_current_context.sig="i";function _emscripten_webgl_do_commit_frame(){if(!GL.currentContext||!GL.currentContext.GLctx){return-3}if(!GL.currentContext.attributes.explicitSwapControl){return-3}return 0}Module["_emscripten_webgl_do_commit_frame"]=_emscripten_webgl_do_commit_frame;_emscripten_webgl_do_commit_frame.sig="i";var _emscripten_webgl_commit_frame=_emscripten_webgl_do_commit_frame;Module["_emscripten_webgl_commit_frame"]=_emscripten_webgl_commit_frame;_emscripten_webgl_commit_frame.sig="i";function _emscripten_webgl_make_context_current(contextHandle){var success=GL.makeContextCurrent(contextHandle);return success?0:-5}Module["_emscripten_webgl_make_context_current"]=_emscripten_webgl_make_context_current;_emscripten_webgl_make_context_current.sig="ii";function _emscripten_webgl_get_drawing_buffer_size(contextHandle,width,height){var GLContext=GL.getContext(contextHandle);if(!GLContext||!GLContext.GLctx||!width||!height){return-5}HEAP32[width>>2]=GLContext.GLctx.drawingBufferWidth;HEAP32[height>>2]=GLContext.GLctx.drawingBufferHeight;return 0}Module["_emscripten_webgl_get_drawing_buffer_size"]=_emscripten_webgl_get_drawing_buffer_size;_emscripten_webgl_get_drawing_buffer_size.sig="iiii";function _emscripten_webgl_get_context_attributes(c,a){if(!a)return-5;c=GL.contexts[c];if(!c)return-3;var t=c.GLctx;if(!t)return-3;t=t.getContextAttributes();HEAP32[a>>2]=t.alpha;HEAP32[a+4>>2]=t.depth;HEAP32[a+8>>2]=t.stencil;HEAP32[a+12>>2]=t.antialias;HEAP32[a+16>>2]=t.premultipliedAlpha;HEAP32[a+20>>2]=t.preserveDrawingBuffer;var power=t["powerPreference"]&&__emscripten_webgl_power_preferences.indexOf(t["powerPreference"]);HEAP32[a+24>>2]=power;HEAP32[a+28>>2]=t.failIfMajorPerformanceCaveat;HEAP32[a+32>>2]=c.version;HEAP32[a+36>>2]=0;HEAP32[a+40>>2]=c.attributes.enableExtensionsByDefault;return 0}Module["_emscripten_webgl_get_context_attributes"]=_emscripten_webgl_get_context_attributes;_emscripten_webgl_get_context_attributes.sig="iii";function _emscripten_webgl_destroy_context(contextHandle){if(GL.currentContext==contextHandle)GL.currentContext=0;GL.deleteContext(contextHandle)}Module["_emscripten_webgl_destroy_context"]=_emscripten_webgl_destroy_context;_emscripten_webgl_destroy_context.sig="vi";function _emscripten_webgl_enable_extension(contextHandle,extension){var context=GL.getContext(contextHandle);var extString=UTF8ToString(extension);if(extString.startsWith("GL_"))extString=extString.substr(3);if(extString=="ANGLE_instanced_arrays")__webgl_enable_ANGLE_instanced_arrays(GLctx);if(extString=="OES_vertex_array_object")__webgl_enable_OES_vertex_array_object(GLctx);if(extString=="WEBGL_draw_buffers")__webgl_enable_WEBGL_draw_buffers(GLctx);if(extString=="WEBGL_multi_draw")__webgl_enable_WEBGL_multi_draw(GLctx);var ext=context.GLctx.getExtension(extString);return!!ext}Module["_emscripten_webgl_enable_extension"]=_emscripten_webgl_enable_extension;_emscripten_webgl_enable_extension.sig="iii";function _emscripten_supports_offscreencanvas(){return 0}Module["_emscripten_supports_offscreencanvas"]=_emscripten_supports_offscreencanvas;function __registerWebGlEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){var webGlEventHandlerFunc=function(e=event){if(getWasmTableEntry(callbackfunc)(eventTypeId,0,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:webGlEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}Module["__registerWebGlEventCallback"]=__registerWebGlEventCallback;function _emscripten_set_webglcontextlost_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerWebGlEventCallback(target,userData,useCapture,callbackfunc,31,"webglcontextlost",targetThread);return 0}Module["_emscripten_set_webglcontextlost_callback_on_thread"]=_emscripten_set_webglcontextlost_callback_on_thread;_emscripten_set_webglcontextlost_callback_on_thread.sig="iiiiii";function _emscripten_set_webglcontextrestored_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){__registerWebGlEventCallback(target,userData,useCapture,callbackfunc,32,"webglcontextrestored",targetThread);return 0}Module["_emscripten_set_webglcontextrestored_callback_on_thread"]=_emscripten_set_webglcontextrestored_callback_on_thread;_emscripten_set_webglcontextrestored_callback_on_thread.sig="iiiiii";function _emscripten_is_webgl_context_lost(contextHandle){return!GL.contexts[contextHandle]||GL.contexts[contextHandle].GLctx.isContextLost()}Module["_emscripten_is_webgl_context_lost"]=_emscripten_is_webgl_context_lost;_emscripten_is_webgl_context_lost.sig="ii";function _emscripten_webgl_get_supported_extensions(){return stringToNewUTF8(GLctx.getSupportedExtensions().join(" "))}Module["_emscripten_webgl_get_supported_extensions"]=_emscripten_webgl_get_supported_extensions;_emscripten_webgl_get_supported_extensions.sig="i";function _emscripten_webgl_get_program_parameter_d(program,param){return GLctx.getProgramParameter(GL.programs[program],param)}Module["_emscripten_webgl_get_program_parameter_d"]=_emscripten_webgl_get_program_parameter_d;_emscripten_webgl_get_program_parameter_d.sig="fii";function _emscripten_webgl_get_program_info_log_utf8(program){return stringToNewUTF8(GLctx.getProgramInfoLog(GL.programs[program]))}Module["_emscripten_webgl_get_program_info_log_utf8"]=_emscripten_webgl_get_program_info_log_utf8;_emscripten_webgl_get_program_info_log_utf8.sig="ii";function _emscripten_webgl_get_shader_parameter_d(shader,param){return GLctx.getShaderParameter(GL.shaders[shader],param)}Module["_emscripten_webgl_get_shader_parameter_d"]=_emscripten_webgl_get_shader_parameter_d;_emscripten_webgl_get_shader_parameter_d.sig="fii";function _emscripten_webgl_get_shader_info_log_utf8(shader){return stringToNewUTF8(GLctx.getShaderInfoLog(GL.shaders[shader]))}Module["_emscripten_webgl_get_shader_info_log_utf8"]=_emscripten_webgl_get_shader_info_log_utf8;_emscripten_webgl_get_shader_info_log_utf8.sig="ii";function _emscripten_webgl_get_shader_source_utf8(shader){return stringToNewUTF8(GLctx.getShaderSource(GL.shaders[shader]))}Module["_emscripten_webgl_get_shader_source_utf8"]=_emscripten_webgl_get_shader_source_utf8;_emscripten_webgl_get_shader_source_utf8.sig="ii";function _emscripten_webgl_get_vertex_attrib_d(index,param){return GLctx.getVertexAttrib(index,param)}Module["_emscripten_webgl_get_vertex_attrib_d"]=_emscripten_webgl_get_vertex_attrib_d;_emscripten_webgl_get_vertex_attrib_d.sig="iii";function _emscripten_webgl_get_vertex_attrib_o(index,param){var obj=GLctx.getVertexAttrib(index,param);return obj&&obj.name}Module["_emscripten_webgl_get_vertex_attrib_o"]=_emscripten_webgl_get_vertex_attrib_o;_emscripten_webgl_get_vertex_attrib_o.sig="iii";function _emscripten_webgl_get_vertex_attrib_v(index,param,dst,dstLength,dstType){return writeGLArray(GLctx.getVertexAttrib(index,param),dst,dstLength,dstType)}Module["_emscripten_webgl_get_vertex_attrib_v"]=_emscripten_webgl_get_vertex_attrib_v;_emscripten_webgl_get_vertex_attrib_v.sig="iiiiii";function _emscripten_webgl_get_uniform_d(program,location){return GLctx.getUniform(GL.programs[program],webglGetUniformLocation(location))}Module["_emscripten_webgl_get_uniform_d"]=_emscripten_webgl_get_uniform_d;_emscripten_webgl_get_uniform_d.sig="fii";function _emscripten_webgl_get_uniform_v(program,location,dst,dstLength,dstType){return writeGLArray(GLctx.getUniform(GL.programs[program],webglGetUniformLocation(location)),dst,dstLength,dstType)}Module["_emscripten_webgl_get_uniform_v"]=_emscripten_webgl_get_uniform_v;_emscripten_webgl_get_uniform_v.sig="iiiiii";function _emscripten_webgl_get_parameter_v(param,dst,dstLength,dstType){return writeGLArray(GLctx.getParameter(param),dst,dstLength,dstType)}Module["_emscripten_webgl_get_parameter_v"]=_emscripten_webgl_get_parameter_v;_emscripten_webgl_get_parameter_v.sig="iiiii";function _emscripten_webgl_get_parameter_d(param){return GLctx.getParameter(param)}Module["_emscripten_webgl_get_parameter_d"]=_emscripten_webgl_get_parameter_d;_emscripten_webgl_get_parameter_d.sig="fi";function _emscripten_webgl_get_parameter_o(param){var obj=GLctx.getParameter(param);return obj&&obj.name}Module["_emscripten_webgl_get_parameter_o"]=_emscripten_webgl_get_parameter_o;_emscripten_webgl_get_parameter_o.sig="ii";function _emscripten_webgl_get_parameter_utf8(param){return stringToNewUTF8(GLctx.getParameter(param))}Module["_emscripten_webgl_get_parameter_utf8"]=_emscripten_webgl_get_parameter_utf8;_emscripten_webgl_get_parameter_utf8.sig="ii";function _emscripten_webgl_get_parameter_i64v(param,dst){writeI53ToI64(dst,GLctx.getParameter(param))}Module["_emscripten_webgl_get_parameter_i64v"]=_emscripten_webgl_get_parameter_i64v;_emscripten_webgl_get_parameter_i64v.sig="vii";var EGL={errorCode:12288,defaultDisplayInitialized:false,currentContext:0,currentReadSurface:0,currentDrawSurface:0,contextAttributes:{alpha:false,depth:false,stencil:false,antialias:false},stringCache:{},setErrorCode:function(code){EGL.errorCode=code},chooseConfig:function(display,attribList,config,config_size,numConfigs){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(attribList){for(;;){var param=HEAP32[attribList>>2];if(param==12321){var alphaSize=HEAP32[attribList+4>>2];EGL.contextAttributes.alpha=alphaSize>0}else if(param==12325){var depthSize=HEAP32[attribList+4>>2];EGL.contextAttributes.depth=depthSize>0}else if(param==12326){var stencilSize=HEAP32[attribList+4>>2];EGL.contextAttributes.stencil=stencilSize>0}else if(param==12337){var samples=HEAP32[attribList+4>>2];EGL.contextAttributes.antialias=samples>0}else if(param==12338){var samples=HEAP32[attribList+4>>2];EGL.contextAttributes.antialias=samples==1}else if(param==12544){var requestedPriority=HEAP32[attribList+4>>2];EGL.contextAttributes.lowLatency=requestedPriority!=12547}else if(param==12344){break}attribList+=8}}if((!config||!config_size)&&!numConfigs){EGL.setErrorCode(12300);return 0}if(numConfigs){HEAP32[numConfigs>>2]=1}if(config&&config_size>0){HEAP32[config>>2]=62002}EGL.setErrorCode(12288);return 1}};Module["EGL"]=EGL;function _eglGetDisplay(nativeDisplayType){EGL.setErrorCode(12288);return 62e3}Module["_eglGetDisplay"]=_eglGetDisplay;_eglGetDisplay.sig="ii";function _eglInitialize(display,majorVersion,minorVersion){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(majorVersion){HEAP32[majorVersion>>2]=1}if(minorVersion){HEAP32[minorVersion>>2]=4}EGL.defaultDisplayInitialized=true;EGL.setErrorCode(12288);return 1}Module["_eglInitialize"]=_eglInitialize;_eglInitialize.sig="iiii";function _eglTerminate(display){if(display!=62e3){EGL.setErrorCode(12296);return 0}EGL.currentContext=0;EGL.currentReadSurface=0;EGL.currentDrawSurface=0;EGL.defaultDisplayInitialized=false;EGL.setErrorCode(12288);return 1}Module["_eglTerminate"]=_eglTerminate;_eglTerminate.sig="ii";function _eglGetConfigs(display,configs,config_size,numConfigs){return EGL.chooseConfig(display,0,configs,config_size,numConfigs)}Module["_eglGetConfigs"]=_eglGetConfigs;_eglGetConfigs.sig="iiiii";function _eglChooseConfig(display,attrib_list,configs,config_size,numConfigs){return EGL.chooseConfig(display,attrib_list,configs,config_size,numConfigs)}Module["_eglChooseConfig"]=_eglChooseConfig;_eglChooseConfig.sig="iiiiii";function _eglGetConfigAttrib(display,config,attribute,value){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(config!=62002){EGL.setErrorCode(12293);return 0}if(!value){EGL.setErrorCode(12300);return 0}EGL.setErrorCode(12288);switch(attribute){case 12320:HEAP32[value>>2]=EGL.contextAttributes.alpha?32:24;return 1;case 12321:HEAP32[value>>2]=EGL.contextAttributes.alpha?8:0;return 1;case 12322:HEAP32[value>>2]=8;return 1;case 12323:HEAP32[value>>2]=8;return 1;case 12324:HEAP32[value>>2]=8;return 1;case 12325:HEAP32[value>>2]=EGL.contextAttributes.depth?24:0;return 1;case 12326:HEAP32[value>>2]=EGL.contextAttributes.stencil?8:0;return 1;case 12327:HEAP32[value>>2]=12344;return 1;case 12328:HEAP32[value>>2]=62002;return 1;case 12329:HEAP32[value>>2]=0;return 1;case 12330:HEAP32[value>>2]=4096;return 1;case 12331:HEAP32[value>>2]=16777216;return 1;case 12332:HEAP32[value>>2]=4096;return 1;case 12333:HEAP32[value>>2]=0;return 1;case 12334:HEAP32[value>>2]=0;return 1;case 12335:HEAP32[value>>2]=12344;return 1;case 12337:HEAP32[value>>2]=EGL.contextAttributes.antialias?4:0;return 1;case 12338:HEAP32[value>>2]=EGL.contextAttributes.antialias?1:0;return 1;case 12339:HEAP32[value>>2]=4;return 1;case 12340:HEAP32[value>>2]=12344;return 1;case 12341:case 12342:case 12343:HEAP32[value>>2]=-1;return 1;case 12345:case 12346:HEAP32[value>>2]=0;return 1;case 12347:HEAP32[value>>2]=0;return 1;case 12348:HEAP32[value>>2]=1;return 1;case 12349:case 12350:HEAP32[value>>2]=0;return 1;case 12351:HEAP32[value>>2]=12430;return 1;case 12352:HEAP32[value>>2]=4;return 1;case 12354:HEAP32[value>>2]=0;return 1;default:EGL.setErrorCode(12292);return 0}}Module["_eglGetConfigAttrib"]=_eglGetConfigAttrib;_eglGetConfigAttrib.sig="iiiii";function _eglCreateWindowSurface(display,config,win,attrib_list){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(config!=62002){EGL.setErrorCode(12293);return 0}EGL.setErrorCode(12288);return 62006}Module["_eglCreateWindowSurface"]=_eglCreateWindowSurface;_eglCreateWindowSurface.sig="iiiii";function _eglDestroySurface(display,surface){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(surface!=62006){EGL.setErrorCode(12301);return 1}if(EGL.currentReadSurface==surface){EGL.currentReadSurface=0}if(EGL.currentDrawSurface==surface){EGL.currentDrawSurface=0}EGL.setErrorCode(12288);return 1}Module["_eglDestroySurface"]=_eglDestroySurface;_eglDestroySurface.sig="iii";function _eglCreateContext(display,config,hmm,contextAttribs){if(display!=62e3){EGL.setErrorCode(12296);return 0}var glesContextVersion=1;for(;;){var param=HEAP32[contextAttribs>>2];if(param==12440){glesContextVersion=HEAP32[contextAttribs+4>>2]}else if(param==12344){break}else{EGL.setErrorCode(12292);return 0}contextAttribs+=8}if(glesContextVersion!=2){EGL.setErrorCode(12293);return 0}EGL.contextAttributes.majorVersion=glesContextVersion-1;EGL.contextAttributes.minorVersion=0;EGL.context=GL.createContext(Module["canvas"],EGL.contextAttributes);if(EGL.context!=0){EGL.setErrorCode(12288);GL.makeContextCurrent(EGL.context);Module.useWebGL=true;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});GL.makeContextCurrent(null);return 62004}else{EGL.setErrorCode(12297);return 0}}Module["_eglCreateContext"]=_eglCreateContext;_eglCreateContext.sig="iiiii";function _eglDestroyContext(display,context){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=62004){EGL.setErrorCode(12294);return 0}GL.deleteContext(EGL.context);EGL.setErrorCode(12288);if(EGL.currentContext==context){EGL.currentContext=0}return 1}Module["_eglDestroyContext"]=_eglDestroyContext;_eglDestroyContext.sig="iii";function _eglQuerySurface(display,surface,attribute,value){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(surface!=62006){EGL.setErrorCode(12301);return 0}if(!value){EGL.setErrorCode(12300);return 0}EGL.setErrorCode(12288);switch(attribute){case 12328:HEAP32[value>>2]=62002;return 1;case 12376:return 1;case 12375:HEAP32[value>>2]=Module["canvas"].width;return 1;case 12374:HEAP32[value>>2]=Module["canvas"].height;return 1;case 12432:HEAP32[value>>2]=-1;return 1;case 12433:HEAP32[value>>2]=-1;return 1;case 12434:HEAP32[value>>2]=-1;return 1;case 12422:HEAP32[value>>2]=12420;return 1;case 12441:HEAP32[value>>2]=12442;return 1;case 12435:HEAP32[value>>2]=12437;return 1;case 12416:case 12417:case 12418:case 12419:return 1;default:EGL.setErrorCode(12292);return 0}}Module["_eglQuerySurface"]=_eglQuerySurface;_eglQuerySurface.sig="iiiii";function _eglQueryContext(display,context,attribute,value){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=62004){EGL.setErrorCode(12294);return 0}if(!value){EGL.setErrorCode(12300);return 0}EGL.setErrorCode(12288);switch(attribute){case 12328:HEAP32[value>>2]=62002;return 1;case 12439:HEAP32[value>>2]=12448;return 1;case 12440:HEAP32[value>>2]=EGL.contextAttributes.majorVersion+1;return 1;case 12422:HEAP32[value>>2]=12420;return 1;default:EGL.setErrorCode(12292);return 0}}Module["_eglQueryContext"]=_eglQueryContext;_eglQueryContext.sig="iiiii";function _eglGetError(){return EGL.errorCode}Module["_eglGetError"]=_eglGetError;_eglGetError.sig="i";function _eglQueryString(display,name){if(display!=62e3){EGL.setErrorCode(12296);return 0}EGL.setErrorCode(12288);if(EGL.stringCache[name])return EGL.stringCache[name];var ret;switch(name){case 12371:ret=allocateUTF8("Emscripten");break;case 12372:ret=allocateUTF8("1.4 Emscripten EGL");break;case 12373:ret=allocateUTF8("");break;case 12429:ret=allocateUTF8("OpenGL_ES");break;default:EGL.setErrorCode(12300);return 0}EGL.stringCache[name]=ret;return ret}Module["_eglQueryString"]=_eglQueryString;_eglQueryString.sig="iii";function _eglBindAPI(api){if(api==12448){EGL.setErrorCode(12288);return 1}EGL.setErrorCode(12300);return 0}Module["_eglBindAPI"]=_eglBindAPI;_eglBindAPI.sig="ii";function _eglQueryAPI(){EGL.setErrorCode(12288);return 12448}Module["_eglQueryAPI"]=_eglQueryAPI;_eglQueryAPI.sig="i";function _eglWaitClient(){EGL.setErrorCode(12288);return 1}Module["_eglWaitClient"]=_eglWaitClient;_eglWaitClient.sig="i";function _eglWaitNative(nativeEngineId){EGL.setErrorCode(12288);return 1}Module["_eglWaitNative"]=_eglWaitNative;_eglWaitNative.sig="ii";var _eglWaitGL=_eglWaitClient;Module["_eglWaitGL"]=_eglWaitGL;function _eglSwapInterval(display,interval){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(interval==0)_emscripten_set_main_loop_timing(0,0);else _emscripten_set_main_loop_timing(1,interval);EGL.setErrorCode(12288);return 1}Module["_eglSwapInterval"]=_eglSwapInterval;_eglSwapInterval.sig="iii";function _eglMakeCurrent(display,draw,read,context){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=0&&context!=62004){EGL.setErrorCode(12294);return 0}if(read!=0&&read!=62006||draw!=0&&draw!=62006){EGL.setErrorCode(12301);return 0}GL.makeContextCurrent(context?EGL.context:null);EGL.currentContext=context;EGL.currentDrawSurface=draw;EGL.currentReadSurface=read;EGL.setErrorCode(12288);return 1}Module["_eglMakeCurrent"]=_eglMakeCurrent;_eglMakeCurrent.sig="iiiii";function _eglGetCurrentContext(){return EGL.currentContext}Module["_eglGetCurrentContext"]=_eglGetCurrentContext;_eglGetCurrentContext.sig="i";function _eglGetCurrentSurface(readdraw){if(readdraw==12378){return EGL.currentReadSurface}else if(readdraw==12377){return EGL.currentDrawSurface}else{EGL.setErrorCode(12300);return 0}}Module["_eglGetCurrentSurface"]=_eglGetCurrentSurface;_eglGetCurrentSurface.sig="ii";function _eglGetCurrentDisplay(){return EGL.currentContext?62e3:0}Module["_eglGetCurrentDisplay"]=_eglGetCurrentDisplay;_eglGetCurrentDisplay.sig="i";function _eglSwapBuffers(){if(!EGL.defaultDisplayInitialized){EGL.setErrorCode(12289)}else if(!Module.ctx){EGL.setErrorCode(12290)}else if(Module.ctx.isContextLost()){EGL.setErrorCode(12302)}else{EGL.setErrorCode(12288);return 1}return 0}Module["_eglSwapBuffers"]=_eglSwapBuffers;_eglSwapBuffers.sig="iii";function _eglReleaseThread(){EGL.currentContext=0;EGL.currentReadSurface=0;EGL.currentDrawSurface=0;EGL.setErrorCode(12288);return 1}Module["_eglReleaseThread"]=_eglReleaseThread;_eglReleaseThread.sig="i";var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;if(ENVIRONMENT_IS_NODE){NODEFS.staticInit()}ERRNO_CODES={"EPERM":63,"ENOENT":44,"ESRCH":71,"EINTR":27,"EIO":29,"ENXIO":60,"E2BIG":1,"ENOEXEC":45,"EBADF":8,"ECHILD":12,"EAGAIN":6,"EWOULDBLOCK":6,"ENOMEM":48,"EACCES":2,"EFAULT":21,"ENOTBLK":105,"EBUSY":10,"EEXIST":20,"EXDEV":75,"ENODEV":43,"ENOTDIR":54,"EISDIR":31,"EINVAL":28,"ENFILE":41,"EMFILE":33,"ENOTTY":59,"ETXTBSY":74,"EFBIG":22,"ENOSPC":51,"ESPIPE":70,"EROFS":69,"EMLINK":34,"EPIPE":64,"EDOM":18,"ERANGE":68,"ENOMSG":49,"EIDRM":24,"ECHRNG":106,"EL2NSYNC":156,"EL3HLT":107,"EL3RST":108,"ELNRNG":109,"EUNATCH":110,"ENOCSI":111,"EL2HLT":112,"EDEADLK":16,"ENOLCK":46,"EBADE":113,"EBADR":114,"EXFULL":115,"ENOANO":104,"EBADRQC":103,"EBADSLT":102,"EDEADLOCK":16,"EBFONT":101,"ENOSTR":100,"ENODATA":116,"ETIME":117,"ENOSR":118,"ENONET":119,"ENOPKG":120,"EREMOTE":121,"ENOLINK":47,"EADV":122,"ESRMNT":123,"ECOMM":124,"EPROTO":65,"EMULTIHOP":36,"EDOTDOT":125,"EBADMSG":9,"ENOTUNIQ":126,"EBADFD":127,"EREMCHG":128,"ELIBACC":129,"ELIBBAD":130,"ELIBSCN":131,"ELIBMAX":132,"ELIBEXEC":133,"ENOSYS":52,"ENOTEMPTY":55,"ENAMETOOLONG":37,"ELOOP":32,"EOPNOTSUPP":138,"EPFNOSUPPORT":139,"ECONNRESET":15,"ENOBUFS":42,"EAFNOSUPPORT":5,"EPROTOTYPE":67,"ENOTSOCK":57,"ENOPROTOOPT":50,"ESHUTDOWN":140,"ECONNREFUSED":14,"EADDRINUSE":3,"ECONNABORTED":13,"ENETUNREACH":40,"ENETDOWN":38,"ETIMEDOUT":73,"EHOSTDOWN":142,"EHOSTUNREACH":23,"EINPROGRESS":26,"EALREADY":7,"EDESTADDRREQ":17,"EMSGSIZE":35,"EPROTONOSUPPORT":66,"ESOCKTNOSUPPORT":137,"EADDRNOTAVAIL":4,"ENETRESET":39,"EISCONN":30,"ENOTCONN":53,"ETOOMANYREFS":141,"EUSERS":136,"EDQUOT":19,"ESTALE":72,"ENOTSUP":138,"ENOMEDIUM":148,"EILSEQ":25,"EOVERFLOW":61,"ECANCELED":11,"ENOTRECOVERABLE":56,"EOWNERDEAD":62,"ESTRPIPE":135};var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var __miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){__miniTempWebGLIntBuffers[i]=__miniTempWebGLIntBuffersStorage.subarray(0,i+1)}var emSetImmediate;var emClearImmediate;if(typeof setImmediate!="undefined"){emSetImmediate=setImmediateWrapped;emClearImmediate=clearImmediateWrapped}else if(typeof addEventListener=="function"){var __setImmediate_id_counter=0;var __setImmediate_queue=[];var __setImmediate_message_id="_si";var __setImmediate_cb=e=>{if(e.data===__setImmediate_message_id){e.stopPropagation();__setImmediate_queue.shift()();++__setImmediate_id_counter}};addEventListener("message",__setImmediate_cb,true);emSetImmediate=func=>{postMessage(__setImmediate_message_id,"*");return __setImmediate_id_counter+__setImmediate_queue.push(func)-1};emClearImmediate=id=>{var index=id-__setImmediate_id_counter;if(index>=0&&index<__setImmediate_queue.length)__setImmediate_queue[index]=()=>{}}}Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var preloadedWasm={};var preloadedImages={};var preloadedAudios={};var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i>2;args.forEach(arg=>{HEAP32[argv_ptr++]=allocateUTF8OnStack(arg)});HEAP32[argv_ptr]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}var dylibsLoaded=false;LDSO.init();function run(args=arguments_){if(runDependencies>0){return}if(!dylibsLoaded){preloadDylibs();dylibsLoaded=true;if(runDependencies>0){return}}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); + + + return _createPyodideModule.ready +} + +); +})(); +globalThis._createPyodideModule = _createPyodideModule; diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyodide.asm.wasm b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyodide.asm.wasm new file mode 100644 index 00000000..26f1b2e3 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyodide.asm.wasm differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyodide.js b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyodide.js new file mode 100644 index 00000000..37b35898 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyodide.js @@ -0,0 +1,2 @@ +!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?factory(exports):"function"==typeof define&&define.amd?define(["exports"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).loadPyodide={})}(this,(function(exports){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var errorStackParser={exports:{}},stackframe={exports:{}};!function(module,exports){module.exports=function(){function _isNumber(n){return!isNaN(parseFloat(n))&&isFinite(n)}function _capitalize(str){return str.charAt(0).toUpperCase()+str.substring(1)}function _getter(p){return function(){return this[p]}}var booleanProps=["isConstructor","isEval","isNative","isToplevel"],numericProps=["columnNumber","lineNumber"],stringProps=["fileName","functionName","source"],arrayProps=["args"],objectProps=["evalOrigin"],props=booleanProps.concat(numericProps,stringProps,arrayProps,objectProps);function StackFrame(obj){if(obj)for(var i=0;i-1&&(line=line.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(,.*$)/g,""));var sanitizedLine=line.replace(/^\s+/,"").replace(/\(eval code/g,"(").replace(/^.*?\s+/,""),location=sanitizedLine.match(/ (\(.+\)$)/);sanitizedLine=location?sanitizedLine.replace(location[0],""):sanitizedLine;var locationParts=this.extractLocation(location?location[1]:sanitizedLine),functionName=location&&sanitizedLine||void 0,fileName=["eval",""].indexOf(locationParts[0])>-1?void 0:locationParts[0];return new StackFrame({functionName:functionName,fileName:fileName,lineNumber:locationParts[1],columnNumber:locationParts[2],source:line})}),this)},parseFFOrSafari:function(error){return error.stack.split("\n").filter((function(line){return!line.match(SAFARI_NATIVE_CODE_REGEXP)}),this).map((function(line){if(line.indexOf(" > eval")>-1&&(line=line.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),-1===line.indexOf("@")&&-1===line.indexOf(":"))return new StackFrame({functionName:line});var functionNameRegex=/((.*".+"[^@]*)?[^@]*)(?:@)/,matches=line.match(functionNameRegex),functionName=matches&&matches[1]?matches[1]:void 0,locationParts=this.extractLocation(line.replace(functionNameRegex,""));return new StackFrame({functionName:functionName,fileName:locationParts[0],lineNumber:locationParts[1],columnNumber:locationParts[2],source:line})}),this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(e){for(var lineRE=/Line (\d+).*script (?:in )?(\S+)/i,lines=e.message.split("\n"),result=[],i=2,len=lines.length;i/,"$2").replace(/\([^)]*\)/g,"")||void 0;functionCall.match(/\(([^)]*)\)/)&&(argsRaw=functionCall.replace(/^[^(]+\(([^)]*)\)$/,"$1"));var args=void 0===argsRaw||"[arguments not available]"===argsRaw?void 0:argsRaw.split(",");return new StackFrame({functionName:functionName,args:args,fileName:locationParts[0],lineNumber:locationParts[1],columnNumber:locationParts[2],source:line})}),this)}})}(errorStackParser);var ErrorStackParser=errorStackParser.exports;const IN_NODE=false;let nodeUrlMod,nodeFetch,nodePath,nodeVmMod,nodeFsPromisesMod,resolvePath,pathSep,loadBinaryFile,loadScript;if(resolvePath=IN_NODE?function(path,base){return nodePath.resolve(base||".",path)}:function(path,base){return void 0===base&&(base=location),new URL(path,base).toString()},IN_NODE||(pathSep="/"),loadBinaryFile=IN_NODE?async function(path,_file_sub_resource_hash){if(path.startsWith("file://")&&(path=path.slice("file://".length)),path.includes("://")){let response=await nodeFetch(path);if(!response.ok)throw new Error(`Failed to load '${path}': request failed.`);return new Uint8Array(await response.arrayBuffer())}{const data=await nodeFsPromisesMod.readFile(path);return new Uint8Array(data.buffer,data.byteOffset,data.byteLength)}}:async function(path,subResourceHash){const url=new URL(path,location);let options=subResourceHash?{integrity:subResourceHash}:{},response=await fetch(url,options);if(!response.ok)throw new Error(`Failed to load '${url}': request failed.`);return new Uint8Array(await response.arrayBuffer())},globalThis.document)loadScript=async url=>await import(/* webpackIgnore: true */url);else if(globalThis.importScripts)loadScript=async url=>{try{globalThis.importScripts(url)}catch(e){if(!(e instanceof TypeError))throw e;await import(/* webpackIgnore: true */url)}};else{if(!IN_NODE)throw new Error("Cannot determine runtime environment");loadScript=async function(url){url.startsWith("file://")&&(url=url.slice("file://".length));url.includes("://")?nodeVmMod.runInThisContext(await(await nodeFetch(url)).text()):await import(/* webpackIgnore: true */nodeUrlMod.pathToFileURL(url).href)}}function __values(o){var s="function"==typeof Symbol&&Symbol.iterator,m=s&&o[s],i=0;if(m)return m.call(o);if(o&&"number"==typeof o.length)return{next:function(){return o&&i>=o.length&&(o=void 0),{value:o&&o[i++],done:!o}}};throw new TypeError(s?"Object is not iterable.":"Symbol.iterator is not defined.")}function __asyncValues(o){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i,m=o[Symbol.asyncIterator];return m?m.call(o):(o=__values(o),i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i);function verb(n){i[n]=o[n]&&function(v){return new Promise((function(resolve,reject){(function(resolve,reject,d,v){Promise.resolve(v).then((function(v){resolve({value:v,done:d})}),reject)})(resolve,reject,(v=o[n](v)).done,v.value)}))}}}const getFsHandles=async dirHandle=>{const handles=[];await async function collect(curDirHandle){var e_1,_a;try{for(var _c,_b=__asyncValues(curDirHandle.values());!(_c=await _b.next()).done;){const entry=_c.value;handles.push(entry),"directory"===entry.kind&&await collect(entry)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&await _a.call(_b)}finally{if(e_1)throw e_1.error}}}(dirHandle);const result=new Map;result.set(".",dirHandle);for(const handle of handles){const relativePath=(await dirHandle.resolve(handle)).join("/");result.set(relativePath,handle)}return result};function initializeFileSystem(Module,config){let stdLibURL;stdLibURL=null!=config.stdLibURL?config.stdLibURL:config.indexURL+"python_stdlib.zip",function(Module,stdlibURL){const stdlibPromise=loadBinaryFile(stdlibURL);Module.preRun.push((()=>{const pymajor=Module._py_version_major(),pyminor=Module._py_version_minor();Module.FS.mkdirTree("/lib"),Module.FS.mkdirTree(`/lib/python${pymajor}.${pyminor}/site-packages`),Module.addRunDependency("install-stdlib"),stdlibPromise.then((stdlib=>{Module.FS.writeFile(`/lib/python${pymajor}${pyminor}.zip`,stdlib)})).catch((e=>{console.error("Error occurred while installing the standard library:"),console.error(e)})).finally((()=>{Module.removeRunDependency("install-stdlib")}))}))}(Module,stdLibURL),function(Module,path){Module.preRun.push((function(){try{Module.FS.mkdirTree(path)}catch(e){console.error(`Error occurred while making a home directory '${path}':`),console.error(e),console.error("Using '/' for a home directory instead"),path="/"}Module.ENV.HOME=path,Module.FS.chdir(path)}))}(Module,config.homedir),function(Module,mounts){Module.preRun.push((()=>{for(const mount of mounts)Module.FS.mkdirTree(mount),Module.FS.mount(Module.FS.filesystems.NODEFS,{root:mount},mount)}))}(Module,config._node_mounts),Module.preRun.push((()=>function(module){const FS=module.FS,MEMFS=module.FS.filesystems.MEMFS,PATH=module.PATH,nativeFSAsync={DIR_MODE:16895,FILE_MODE:33279,mount:function(mount){if(!mount.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return MEMFS.mount.apply(null,arguments)},syncfs:async(mount,populate,callback)=>{try{const local=nativeFSAsync.getLocalSet(mount),remote=await nativeFSAsync.getRemoteSet(mount),src=populate?remote:local,dst=populate?local:remote;await nativeFSAsync.reconcile(mount,src,dst),callback(null)}catch(e){callback(e)}},getLocalSet:mount=>{let entries=Object.create(null);function isRealDir(p){return"."!==p&&".."!==p}function toAbsolute(root){return p=>PATH.join2(root,p)}let check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));for(;check.length;){let path=check.pop(),stat=FS.stat(path);FS.isDir(stat.mode)&&check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path))),entries[path]={timestamp:stat.mtime,mode:stat.mode}}return{type:"local",entries:entries}},getRemoteSet:async mount=>{const entries=Object.create(null),handles=await getFsHandles(mount.opts.fileSystemHandle);for(const[path,handle]of handles)"."!==path&&(entries[PATH.join2(mount.mountpoint,path)]={timestamp:"file"===handle.kind?(await handle.getFile()).lastModifiedDate:new Date,mode:"file"===handle.kind?nativeFSAsync.FILE_MODE:nativeFSAsync.DIR_MODE});return{type:"remote",entries:entries,handles:handles}},loadLocalEntry:path=>{const node=FS.lookupPath(path).node,stat=FS.stat(path);if(FS.isDir(stat.mode))return{timestamp:stat.mtime,mode:stat.mode};if(FS.isFile(stat.mode))return node.contents=MEMFS.getFileDataAsTypedArray(node),{timestamp:stat.mtime,mode:stat.mode,contents:node.contents};throw new Error("node type not supported")},storeLocalEntry:(path,entry)=>{if(FS.isDir(entry.mode))FS.mkdirTree(path,entry.mode);else{if(!FS.isFile(entry.mode))throw new Error("node type not supported");FS.writeFile(path,entry.contents,{canOwn:!0})}FS.chmod(path,entry.mode),FS.utime(path,entry.timestamp,entry.timestamp)},removeLocalEntry:path=>{var stat=FS.stat(path);FS.isDir(stat.mode)?FS.rmdir(path):FS.isFile(stat.mode)&&FS.unlink(path)},loadRemoteEntry:async handle=>{if("file"===handle.kind){const file=await handle.getFile();return{contents:new Uint8Array(await file.arrayBuffer()),mode:nativeFSAsync.FILE_MODE,timestamp:file.lastModifiedDate}}if("directory"===handle.kind)return{mode:nativeFSAsync.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+handle.kind)},storeRemoteEntry:async(handles,path,entry)=>{const parentDirHandle=handles.get(PATH.dirname(path)),handle=FS.isFile(entry.mode)?await parentDirHandle.getFileHandle(PATH.basename(path),{create:!0}):await parentDirHandle.getDirectoryHandle(PATH.basename(path),{create:!0});if("file"===handle.kind){const writable=await handle.createWritable();await writable.write(entry.contents),await writable.close()}handles.set(path,handle)},removeRemoteEntry:async(handles,path)=>{const parentDirHandle=handles.get(PATH.dirname(path));await parentDirHandle.removeEntry(PATH.basename(path)),handles.delete(path)},reconcile:async(mount,src,dst)=>{let total=0;const create=[];Object.keys(src.entries).forEach((function(key){const e=src.entries[key],e2=dst.entries[key];(!e2||FS.isFile(e.mode)&&e.timestamp.getTime()>e2.timestamp.getTime())&&(create.push(key),total++)})),create.sort();const remove=[];if(Object.keys(dst.entries).forEach((function(key){src.entries[key]||(remove.push(key),total++)})),remove.sort().reverse(),!total)return;const handles="remote"===src.type?src.handles:dst.handles;for(const path of create){const relPath=PATH.normalize(path.replace(mount.mountpoint,"/")).substring(1);if("local"===dst.type){const handle=handles.get(relPath),entry=await nativeFSAsync.loadRemoteEntry(handle);nativeFSAsync.storeLocalEntry(path,entry)}else{const entry=nativeFSAsync.loadLocalEntry(path);await nativeFSAsync.storeRemoteEntry(handles,relPath,entry)}}for(const path of remove)if("local"===dst.type)nativeFSAsync.removeLocalEntry(path);else{const relPath=PATH.normalize(path.replace(mount.mountpoint,"/")).substring(1);await nativeFSAsync.removeRemoteEntry(handles,relPath)}}};module.FS.filesystems.NATIVEFS_ASYNC=nativeFSAsync}(Module)))}function finalizeBootstrap(API,config){API.runPythonInternal_dict=API._pyodide._base.eval_code("{}"),API.importlib=API.runPythonInternal("import importlib; importlib");let import_module=API.importlib.import_module;API.sys=import_module("sys"),API.sys.path.insert(0,config.homedir),API.os=import_module("os");let globals=API.runPythonInternal("import __main__; __main__.__dict__"),builtins=API.runPythonInternal("import builtins; builtins.__dict__");var builtins_dict;API.globals=(builtins_dict=builtins,new Proxy(globals,{get:(target,symbol)=>"get"===symbol?key=>{let result=target.get(key);return void 0===result&&(result=builtins_dict.get(key)),result}:"has"===symbol?key=>target.has(key)||builtins_dict.has(key):Reflect.get(target,symbol)}));let importhook=API._pyodide._importhook;importhook.register_js_finder(),importhook.register_js_module("js",config.jsglobals);let pyodide=API.makePublicAPI();return importhook.register_js_module("pyodide_js",pyodide),API.pyodide_py=import_module("pyodide"),API.pyodide_code=import_module("pyodide.code"),API.pyodide_ffi=import_module("pyodide.ffi"),API.package_loader=import_module("pyodide._package_loader"),API.sitepackages=API.package_loader.SITE_PACKAGES.__str__(),API.dsodir=API.package_loader.DSO_DIR.__str__(),API.defaultLdLibraryPath=[API.dsodir,API.sitepackages],API.os.environ.__setitem__("LD_LIBRARY_PATH",API.defaultLdLibraryPath.join(":")),pyodide.pyodide_py=API.pyodide_py,pyodide.globals=API.globals,pyodide}async function loadPyodide(options={}){await async function(){if(!IN_NODE)return;if(nodeUrlMod=(await import("url")).default,nodeFsPromisesMod=await import("fs/promises"),nodeFetch=globalThis.fetch?fetch:(await import("node-fetch")).default,nodeVmMod=(await import("vm")).default,nodePath=await import("path"),pathSep=nodePath.sep,"undefined"!=typeof require)return;const node_modules={fs:await import("fs"),crypto:await import("crypto"),ws:await import("ws"),child_process:await import("child_process")};globalThis.require=function(mod){return node_modules[mod]}}();let indexURL=options.indexURL||function(){let err;try{throw new Error}catch(e){err=e}let fileName=ErrorStackParser.parse(err)[0].fileName;const indexOfLastSlash=fileName.lastIndexOf(pathSep);if(-1===indexOfLastSlash)throw new Error("Could not extract indexURL path from pyodide module location");return fileName.slice(0,indexOfLastSlash)}();indexURL=resolvePath(indexURL),indexURL.endsWith("/")||(indexURL+="/"),options.indexURL=indexURL;const default_config={fullStdLib:!1,jsglobals:globalThis,stdin:globalThis.prompt?globalThis.prompt:void 0,homedir:"/home/pyodide",lockFileURL:indexURL+"repodata.json",args:[],_node_mounts:[]},config=Object.assign(default_config,options),Module=function(){let Module={noImageDecoding:!0,noAudioDecoding:!0,noWasmDecoding:!1,preRun:[],quit:(status,toThrow)=>{throw Module.exited={status:status,toThrow:toThrow},toThrow}};return Module}();Module.print=config.stdout,Module.printErr=config.stderr,Module.arguments=config.args;const API={config:config};Module.API=API,initializeFileSystem(Module,config);const moduleLoaded=new Promise((r=>Module.postRun=r));if(Module.locateFile=path=>config.indexURL+path,"function"!=typeof _createPyodideModule){const scriptSrc=`${config.indexURL}pyodide.asm.js`;await loadScript(scriptSrc)}if(await _createPyodideModule(Module),await moduleLoaded,Module.exited)throw Module.exited.toThrow;if("0.23.2"!==API.version)throw new Error(`Pyodide version does not match: '0.23.2' <==> '${API.version}'. If you updated the Pyodide version, make sure you also updated the 'indexURL' parameter passed to loadPyodide.`);Module.locateFile=path=>{throw new Error("Didn't expect to load any more file_packager files!")};let[err,captured_stderr]=API.rawRun("import _pyodide_core");err&&Module.API.fatal_loading_error("Failed to import _pyodide_core\n",captured_stderr);const pyodide=finalizeBootstrap(API,config);if(pyodide.version.includes("dev")||API.setCdnUrl(`https://cdn.jsdelivr.net/pyodide/v${pyodide.version}/full/`),await API.packageIndexReady,API._pyodide._importhook.register_module_not_found_hook(API._import_name_to_package_name,API.repodata_unvendored_stdlibs_and_test),"0.23.2"!==API.repodata_info.version)throw new Error("Lock file version doesn't match Pyodide version");return API.package_loader.init_loaded_packages(),config.fullStdLib&&await pyodide.loadPackage(API.repodata_unvendored_stdlibs),API.initializeStreams(config.stdin,config.stdout,config.stderr),pyodide}globalThis.loadPyodide=loadPyodide,exports.loadPyodide=loadPyodide,exports.version="0.23.2",Object.defineProperty(exports,"__esModule",{value:!0})})); +//# sourceMappingURL=pyodide.js.map diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyparsing-3.0.9-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyparsing-3.0.9-py3-none-any.whl new file mode 100644 index 00000000..0c775dd0 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pyparsing-3.0.9-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/python_dateutil-2.8.2-py2.py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/python_dateutil-2.8.2-py2.py3-none-any.whl new file mode 100644 index 00000000..c45a852a Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/python_dateutil-2.8.2-py2.py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/python_stdlib.zip b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/python_stdlib.zip new file mode 100644 index 00000000..e577bc5b Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/python_stdlib.zip differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pytz-2023.3-py2.py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pytz-2023.3-py2.py3-none-any.whl new file mode 100644 index 00000000..574f4823 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/pytz-2023.3-py2.py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/scikit_learn-1.2.2-cp311-cp311-emscripten_3_1_32_wasm32.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/scikit_learn-1.2.2-cp311-cp311-emscripten_3_1_32_wasm32.whl new file mode 100644 index 00000000..ed1f7c93 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/scikit_learn-1.2.2-cp311-cp311-emscripten_3_1_32_wasm32.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/scipy-1.9.3-cp311-cp311-emscripten_3_1_32_wasm32.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/scipy-1.9.3-cp311-cp311-emscripten_3_1_32_wasm32.whl new file mode 100644 index 00000000..bcf98894 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/scipy-1.9.3-cp311-cp311-emscripten_3_1_32_wasm32.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/six-1.16.0-py2.py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/six-1.16.0-py2.py3-none-any.whl new file mode 100644 index 00000000..531a1226 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/six-1.16.0-py2.py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/threadpoolctl-3.1.0-py3-none-any.whl b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/threadpoolctl-3.1.0-py3-none-any.whl new file mode 100644 index 00000000..1de83eb2 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/pyodide/threadpoolctl-3.1.0-py3-none-any.whl differ diff --git a/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/repodata.json b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/repodata.json new file mode 100644 index 00000000..986b0714 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/deps/0.62.21/python3/repodata.json @@ -0,0 +1,3394 @@ +{ + "info": { + "arch": "wasm32", + "platform": "emscripten_3_1_32", + "version": "0.23.2", + "python": "3.11.2" + }, + "packages": { + "asciitree": { + "name": "asciitree", + "version": "0.3.3", + "file_name": "asciitree-0.3.3-py3-none-any.whl", + "install_dir": "site", + "sha256": "66cc8d74651342f43016314220c30b29d65b088c273b05dd7b678e5542f00989", + "package_type": "package", + "imports": [ + "asciitree" + ], + "depends": [] + }, + "astropy": { + "name": "astropy", + "version": "5.2.2", + "file_name": "astropy-5.2.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "402a3e18d67c21196220214597576e3616d2672d8dfbbc384a26012cf9e52404", + "package_type": "package", + "imports": [ + "astropy" + ], + "depends": [ + "distutils", + "packaging", + "numpy", + "pyerfa", + "pyyaml" + ] + }, + "atomicwrites": { + "name": "atomicwrites", + "version": "1.4.1", + "file_name": "atomicwrites-1.4.1-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "8978ff9f0f9c331c0a4fe2e0b59c7a1121bc220574c52c333d04be6089be543e", + "package_type": "package", + "imports": [ + "atomicwrites" + ], + "depends": [] + }, + "attrs": { + "name": "attrs", + "version": "22.2.0", + "file_name": "attrs-22.2.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "c797e7c5503945b747ce5fa88fec3116fd4f20ccd6b602c0587a11968721ad17", + "package_type": "package", + "imports": [ + "attr", + "attrs" + ], + "depends": [ + "six" + ] + }, + "autograd": { + "name": "autograd", + "version": "1.5", + "file_name": "autograd-1.5-py3-none-any.whl", + "install_dir": "site", + "sha256": "eff6571873a398a8e820c48681b0ac73492f748b5879a717e648d8dcc28c5d30", + "package_type": "package", + "imports": [ + "autograd" + ], + "depends": [ + "numpy", + "future" + ], + "unvendored_tests": true + }, + "autograd-tests": { + "name": "autograd-tests", + "version": "1.5", + "depends": [ + "autograd" + ], + "imports": [], + "file_name": "autograd-tests.tar", + "install_dir": "site", + "sha256": "d35afb3665b8445e27e43e5977befa46e54b75307a9fd8cca759a26027b6c8bb" + }, + "bcrypt": { + "name": "bcrypt", + "version": "4.0.1", + "file_name": "bcrypt-4.0.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "72fa88e87f711a22ca8ff438a25743bbd9d04ddfce629674e828d9cfcbdde45b", + "package_type": "package", + "imports": [ + "bcrypt" + ], + "depends": [] + }, + "beautifulsoup4": { + "name": "beautifulsoup4", + "version": "4.12.0", + "file_name": "beautifulsoup4-4.12.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "021de7676fac299bca3777644550e160488ee821740360441621b3223f69b42d", + "package_type": "package", + "imports": [ + "bs4" + ], + "depends": [ + "soupsieve" + ], + "unvendored_tests": true + }, + "beautifulsoup4-tests": { + "name": "beautifulsoup4-tests", + "version": "4.12.0", + "depends": [ + "beautifulsoup4" + ], + "imports": [], + "file_name": "beautifulsoup4-tests.tar", + "install_dir": "site", + "sha256": "1f5b8d77e4134b39037fb1ab290b7def57ffcf2f69c287f34da839581d6aa54d" + }, + "biopython": { + "name": "biopython", + "version": "1.81", + "file_name": "biopython-1.81-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "8f713f270116305f272d17d035dfff81939c20d1c30b6f0367a9cb0c2e7e062b", + "package_type": "package", + "imports": [ + "Bio", + "BioSQL" + ], + "depends": [ + "numpy" + ] + }, + "bitarray": { + "name": "bitarray", + "version": "2.7.3", + "file_name": "bitarray-2.7.3-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "707c511ed8fa56f86f24eafb12595e717686145b2bf5219bcc1919178f139651", + "package_type": "package", + "imports": [ + "bitarray" + ], + "depends": [], + "unvendored_tests": true + }, + "bitarray-tests": { + "name": "bitarray-tests", + "version": "2.7.3", + "depends": [ + "bitarray" + ], + "imports": [], + "file_name": "bitarray-tests.tar", + "install_dir": "site", + "sha256": "2879fe13f0c64acd221713f0d9768e0f0dca464e82f635c26e1a824b2cabc72a" + }, + "bleach": { + "name": "bleach", + "version": "6.0.0", + "file_name": "bleach-6.0.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "560e02c0814d10d6e60a87379c4ec4fde263e7aab95690e9ca121b7b9dd85f76", + "package_type": "package", + "imports": [ + "bleach" + ], + "depends": [ + "webencodings", + "packaging", + "six" + ] + }, + "bokeh": { + "name": "bokeh", + "version": "3.1.0", + "file_name": "bokeh-3.1.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "bc8eb691186ab6ac53cb99ac236826311e84c35373ab39195d298a71d3e58bba", + "package_type": "package", + "imports": [ + "bokeh" + ], + "depends": [ + "distutils", + "numpy", + "jinja2", + "pillow", + "python-dateutil", + "six", + "typing-extensions", + "pyyaml" + ] + }, + "boost-histogram": { + "name": "boost-histogram", + "version": "1.3.2", + "file_name": "boost_histogram-1.3.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "30b9ac13cfca3e68c6d8e865c6d3c2f6ed9c6b3a41f1f57b45a14ec482022473", + "package_type": "package", + "imports": [ + "boost_histogram" + ], + "depends": [ + "numpy" + ] + }, + "brotli": { + "name": "brotli", + "version": "1.0.9", + "file_name": "Brotli-1.0.9-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "66604604c5268310bdc476e1f71f6d8f063bd3db3685a9fb305e15012bfd6546", + "package_type": "package", + "imports": [ + "brotli" + ], + "depends": [] + }, + "cbor-diag": { + "name": "cbor-diag", + "version": "1.0.0", + "file_name": "cbor_diag-1.0.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "a02789aa2cbb9d69c9063c60956f5a22c14c32dcf272e5dff5b01128e4eacaa4", + "package_type": "package", + "imports": [ + "cbor_diag" + ], + "depends": [] + }, + "certifi": { + "name": "certifi", + "version": "2022.12.7", + "file_name": "certifi-2022.12.7-py3-none-any.whl", + "install_dir": "site", + "sha256": "c5ab0743b202a63554c0c527f89aadbe8853bfe03fd5fa2786d3b0d158a1cbc8", + "package_type": "package", + "imports": [ + "certifi" + ], + "depends": [] + }, + "cffi": { + "name": "cffi", + "version": "1.15.1", + "file_name": "cffi-1.15.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "338878901ac68d2956cfdd87f6d9ef97625232427060d1c307bb324f89bfaf52", + "package_type": "package", + "imports": [ + "cffi" + ], + "depends": [ + "pycparser" + ] + }, + "cffi_example": { + "name": "cffi_example", + "version": "0.1", + "file_name": "cffi_example-0.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "aa5a538303f227eca23802ee59aa9208974f098563d4e65ec4a5a9dc22a6ff45", + "package_type": "package", + "imports": [ + "cffi_example" + ], + "depends": [ + "cffi" + ] + }, + "cftime": { + "name": "cftime", + "version": "1.6.2", + "file_name": "cftime-1.6.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "175492cb1e464bf2f41e2f7657c7523252c6c2e0c49a3e144fe31a64fa4d41ee", + "package_type": "package", + "imports": [ + "cftime" + ], + "depends": [ + "numpy" + ] + }, + "clapack": { + "name": "CLAPACK", + "version": "3.2.1", + "file_name": "CLAPACK-3.2.1.zip", + "install_dir": "dynlib", + "sha256": "73b55c979bad450be2b7fc09a13130b21f87a5e01a62f6e809b4c6057c154ee8", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [] + }, + "click": { + "name": "click", + "version": "8.1.3", + "file_name": "click-8.1.3-py3-none-any.whl", + "install_dir": "site", + "sha256": "d3e354afc7e845ef9945bcefa27b16ed52eaa7d71fa2d4dc5144d301bcea7238", + "package_type": "package", + "imports": [ + "click" + ], + "depends": [] + }, + "cligj": { + "name": "cligj", + "version": "0.7.2", + "file_name": "cligj-0.7.2-py3-none-any.whl", + "install_dir": "site", + "sha256": "2e2c6d9738e15bce6cf5b8e3f988f2a983c27058d520bff4d7158a83c2efe84d", + "package_type": "package", + "imports": [ + "cligj" + ], + "depends": [ + "click" + ] + }, + "cloudpickle": { + "name": "cloudpickle", + "version": "2.2.1", + "file_name": "cloudpickle-2.2.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "dadaa94d41c13d9eb11cec4099f94c86459c33ed927de58e2e3d5a724c0f86bb", + "package_type": "package", + "imports": [ + "cloudpickle" + ], + "depends": [] + }, + "cmyt": { + "name": "cmyt", + "version": "1.1.3", + "file_name": "cmyt-1.1.3-py3-none-any.whl", + "install_dir": "site", + "sha256": "170f478ff86fb916c93916ff707cc0723af175dabdeaa432a79e29e49ee762f7", + "package_type": "package", + "imports": [ + "cmyt" + ], + "depends": [ + "colorspacious", + "matplotlib", + "more-itertools", + "numpy" + ], + "unvendored_tests": true + }, + "cmyt-tests": { + "name": "cmyt-tests", + "version": "1.1.3", + "depends": [ + "cmyt" + ], + "imports": [], + "file_name": "cmyt-tests.tar", + "install_dir": "site", + "sha256": "7c7ef93dbc03bf20c365942e334a9540955a0541ea493591858d0dc12b35a614" + }, + "colorspacious": { + "name": "colorspacious", + "version": "1.1.2", + "file_name": "colorspacious-1.1.2-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "e0388980b1a1e91d3692f9e7cd8e36fe5149b277ac2c8360f83473483bf87d9d", + "package_type": "package", + "imports": [ + "colorspacious" + ], + "depends": [ + "numpy" + ] + }, + "coverage": { + "name": "coverage", + "version": "7.2.2", + "file_name": "coverage-7.2.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "cf31cbe7ea676a0f9e2ad7f25f88c65930112474684a867849491d5a0d440700", + "package_type": "package", + "imports": [ + "coverage" + ], + "depends": [ + "sqlite3" + ] + }, + "cpp-exceptions-test": { + "name": "cpp-exceptions-test", + "version": "0.1", + "file_name": "cpp-exceptions-test-0.1.zip", + "install_dir": "dynlib", + "sha256": "82cc6d92dee239161dd8fcb4e5f93e1c18e9d7109d6c6dcdfe6f043b551a27e3", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [] + }, + "cramjam": { + "name": "cramjam", + "version": "2.6.2", + "file_name": "cramjam-2.6.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "921d01498f5a7db974968f54be348bd66330cb670b6ca492974eb2a19e4670b0", + "package_type": "package", + "imports": [ + "cramjam" + ], + "depends": [] + }, + "cryptography": { + "name": "cryptography", + "version": "39.0.2", + "file_name": "cryptography-39.0.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "f368dc68c53ec705524d083d1a1c35584fc46e79f904966f361e08b0be539029", + "package_type": "package", + "imports": [ + "cryptography" + ], + "depends": [ + "openssl", + "six", + "cffi" + ] + }, + "cssselect": { + "name": "cssselect", + "version": "1.2.0", + "file_name": "cssselect-1.2.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "eee7bc8916a6713d527fd5e97b6ad7c95f61f764d6e930b581664554f16f2cb9", + "package_type": "package", + "imports": [ + "cssselect" + ], + "depends": [] + }, + "cycler": { + "name": "cycler", + "version": "0.11.0", + "file_name": "cycler-0.11.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "715422f9a0aa8ef2e12f52be31436a4633e94471aa6c640bd981fe85ea0181f3", + "package_type": "package", + "imports": [ + "cycler" + ], + "depends": [ + "six" + ] + }, + "cytoolz": { + "name": "cytoolz", + "version": "0.12.1", + "file_name": "cytoolz-0.12.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "f8e3cfa6bb5da28677e055d173f48e94b5b049d192572961e850bd4a9901521a", + "package_type": "package", + "imports": [ + "cytoolz" + ], + "depends": [ + "nose", + "toolz" + ], + "unvendored_tests": true + }, + "cytoolz-tests": { + "name": "cytoolz-tests", + "version": "0.12.1", + "depends": [ + "cytoolz" + ], + "imports": [], + "file_name": "cytoolz-tests.tar", + "install_dir": "site", + "sha256": "50f5ed07f800d3b5648084b90453f4ae79bdf82462bb74b569d5aad80892c3f6" + }, + "decorator": { + "name": "decorator", + "version": "5.1.1", + "file_name": "decorator-5.1.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "6cc53a998b8316a18934484f4f09e3ec746178abc8dfd7c7becaacb0ba16a54a", + "package_type": "package", + "imports": [ + "decorator" + ], + "depends": [] + }, + "demes": { + "name": "demes", + "version": "0.2.2", + "file_name": "demes-0.2.2-py3-none-any.whl", + "install_dir": "site", + "sha256": "b16b2a0cb52041f5be4f6a7af158cefea8541bbcf06c63b64add91163f974ed0", + "package_type": "package", + "imports": [ + "demes" + ], + "depends": [ + "attrs", + "ruamel.yaml" + ] + }, + "distlib": { + "name": "distlib", + "version": "0.3.6", + "file_name": "distlib-0.3.6-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "84fce31a5dd9ac945d690c4d1eac99776a58976c9a284048edd56989947255ef", + "package_type": "package", + "imports": [ + "distlib" + ], + "depends": [] + }, + "distutils": { + "name": "distutils", + "version": "1.0.0", + "file_name": "distutils-1.0.0.zip", + "install_dir": "stdlib", + "sha256": "a38d780bcf5614ab40287ab1ddd81d79a154e98f81bb01e363dc80f4f99ee2f8", + "package_type": "cpython_module", + "imports": [ + "distutils" + ], + "shared_library": true, + "depends": [] + }, + "docutils": { + "name": "docutils", + "version": "0.19", + "file_name": "docutils-0.19-py3-none-any.whl", + "install_dir": "site", + "sha256": "65d3816528adbb7a3d3a8afa642ba654123bb3a3a8dd1aafcc81e8b104a09be1", + "package_type": "package", + "imports": [ + "docutils" + ], + "depends": [] + }, + "exceptiongroup": { + "name": "exceptiongroup", + "version": "1.1.1", + "file_name": "exceptiongroup-1.1.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "165a660eea757578663f96d03483c80cdcacd8d5970289a33ae51757472b4b16", + "package_type": "package", + "imports": [ + "exceptiongroup" + ], + "depends": [] + }, + "fastparquet": { + "name": "fastparquet", + "version": "2023.2.0", + "file_name": "fastparquet-2023.2.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "01207f997c764e47c79dafed2a1d7e35702af629139e0e0c459c7c9616b093c9", + "package_type": "package", + "imports": [ + "fastparquet" + ], + "depends": [ + "cramjam", + "numpy", + "pandas", + "fsspec", + "packaging" + ] + }, + "fiona": { + "name": "fiona", + "version": "1.8.22", + "file_name": "Fiona-1.8.22-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "8876b768870a6d505519aa622fd2674e05218b677051a595b477c2507ed0249c", + "package_type": "package", + "imports": [ + "fiona" + ], + "depends": [ + "attrs", + "certifi", + "setuptools", + "six", + "click", + "cligj" + ] + }, + "fonttools": { + "name": "fonttools", + "version": "4.39.3", + "file_name": "fonttools-4.39.3-py3-none-any.whl", + "install_dir": "site", + "sha256": "f8ccbaedcb29eda3bff523f22f52f9504d9c9c5617d4a611233d77b178bc81f1", + "package_type": "package", + "imports": [ + "fontTools" + ], + "depends": [] + }, + "fpcast-test": { + "name": "fpcast-test", + "version": "0.1", + "file_name": "fpcast_test-0.1.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "4abf97dceb81e0b37c9d36a25e993bd07fbf47f99efae32aafe1c464f920a48c", + "package_type": "package", + "imports": [ + "fpcast_test" + ], + "depends": [] + }, + "fsspec": { + "name": "fsspec", + "version": "2023.3.0", + "file_name": "fsspec-2023.3.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "0a29156759516c0a5a46db6c0bcfc1b09e4d70bc978667b617c215e8bcba4048", + "package_type": "package", + "imports": [ + "fsspec" + ], + "depends": [], + "unvendored_tests": true + }, + "fsspec-tests": { + "name": "fsspec-tests", + "version": "2023.3.0", + "depends": [ + "fsspec" + ], + "imports": [], + "file_name": "fsspec-tests.tar", + "install_dir": "site", + "sha256": "d6831d564e8644d9b91c9b76b0636fd5ed6a27456d5a5cade2954c66c347e255" + }, + "future": { + "name": "future", + "version": "0.18.3", + "file_name": "future-0.18.3-py3-none-any.whl", + "install_dir": "site", + "sha256": "acedaa743e9431cb5d3bc5931081e95eaa04ff438ccd2630f1893fb07d22254f", + "package_type": "package", + "imports": [ + "future" + ], + "depends": [], + "unvendored_tests": true + }, + "future-tests": { + "name": "future-tests", + "version": "0.18.3", + "depends": [ + "future" + ], + "imports": [], + "file_name": "future-tests.tar", + "install_dir": "site", + "sha256": "1eeec74ec79feb1995c0ef8aa570df9a7811e0cac600c83ee2fab02691557c99" + }, + "galpy": { + "name": "galpy", + "version": "1.8.3", + "file_name": "galpy-1.8.3-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "317c96aba71bb58d7f0be3a5f8ff33e2e6590379526c9acb98f3699de489df99", + "package_type": "package", + "imports": [ + "galpy" + ], + "depends": [ + "numpy", + "scipy", + "matplotlib", + "astropy", + "future", + "setuptools" + ] + }, + "gdal": { + "name": "gdal", + "version": "3.5.1", + "file_name": "gdal-3.5.1.zip", + "install_dir": "dynlib", + "sha256": "1cdf0a1bf28c2dae1f2c422d5fbb27ca3c0d592a7d286f451bc47626c0c5f71d", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [ + "geos" + ] + }, + "gensim": { + "name": "gensim", + "version": "4.3.1", + "file_name": "gensim-4.3.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "4cb0348cb14e80183cdaa5e0ae72c13eb534840aae743568b9d1f048d76dfde0", + "package_type": "package", + "imports": [ + "gensim" + ], + "depends": [ + "numpy", + "scipy", + "six", + "smart_open" + ], + "unvendored_tests": true + }, + "gensim-tests": { + "name": "gensim-tests", + "version": "4.3.1", + "depends": [ + "gensim" + ], + "imports": [], + "file_name": "gensim-tests.tar", + "install_dir": "site", + "sha256": "2bb43448c1a588591ecfead52a497cd5c04171c3ad538d51a2f0b82f2685f094" + }, + "geopandas": { + "name": "geopandas", + "version": "0.12.2", + "file_name": "geopandas-0.12.2-py3-none-any.whl", + "install_dir": "site", + "sha256": "ec791b931bcedbf52186f52a3fd4af51c12b25cc3ce35de301adb040ffe4aa81", + "package_type": "package", + "imports": [ + "geopandas" + ], + "depends": [ + "shapely", + "fiona", + "pyproj", + "packaging", + "pandas" + ], + "unvendored_tests": true + }, + "geopandas-tests": { + "name": "geopandas-tests", + "version": "0.12.2", + "depends": [ + "geopandas" + ], + "imports": [], + "file_name": "geopandas-tests.tar", + "install_dir": "site", + "sha256": "e00b0f0844dc718b516b1ba662e8a0c7f62aca08b848759e4432299eaedca52e" + }, + "geos": { + "name": "geos", + "version": "3.10.3", + "file_name": "geos-3.10.3.zip", + "install_dir": "dynlib", + "sha256": "863ce030e9a51ece5f2e6062938c451138fe6d4ddb8205e00bf645e16791df9a", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [] + }, + "gmpy2": { + "name": "gmpy2", + "version": "2.1.5", + "file_name": "gmpy2-2.1.5-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "e59c058b7741baa3067c2e7ae390fc4c4c8649b739688479ab208e69b4af0b1a", + "package_type": "package", + "imports": [ + "gmpy2" + ], + "depends": [] + }, + "gsw": { + "name": "gsw", + "version": "3.6.16", + "file_name": "gsw-3.6.16-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "c67fa755ac03b8343517385720fe8dd898c0301294950311eec219e5fff52c5a", + "package_type": "package", + "imports": [ + "gsw" + ], + "depends": [ + "numpy" + ], + "unvendored_tests": true + }, + "gsw-tests": { + "name": "gsw-tests", + "version": "3.6.16", + "depends": [ + "gsw" + ], + "imports": [], + "file_name": "gsw-tests.tar", + "install_dir": "site", + "sha256": "2a20723606d7c9f91509f3c8baefb88f72fe7fd8b915d1ddd996d0d2732b3141" + }, + "h5py": { + "name": "h5py", + "version": "3.7.0", + "file_name": "h5py-3.7.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "106c5b955b24a5830a22fcaeef527b5994aeb4e9ec50ef23b293ad696ce26094", + "package_type": "package", + "imports": [ + "h5py" + ], + "depends": [ + "numpy", + "pkgconfig" + ], + "unvendored_tests": true + }, + "h5py-tests": { + "name": "h5py-tests", + "version": "3.7.0", + "depends": [ + "h5py" + ], + "imports": [], + "file_name": "h5py-tests.tar", + "install_dir": "site", + "sha256": "62c4cecb3e1e26577ce29ef3f3c6748eb5e068a48b1469b99bfdf4e47e5014d9" + }, + "hashlib": { + "name": "hashlib", + "version": "1.0.0", + "file_name": "hashlib-1.0.0.zip", + "install_dir": "stdlib", + "sha256": "351b30cf6267e3c9237a1b1cebcfb2830d20e3c624edd0d5bc24f8bbd9655b4e", + "package_type": "cpython_module", + "imports": [ + "_hashlib" + ], + "shared_library": true, + "depends": [ + "openssl" + ] + }, + "html5lib": { + "name": "html5lib", + "version": "1.1", + "file_name": "html5lib-1.1-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "3ae1b36845a863f549584d987adc858fb4526226398d878a0b6e234253e2965f", + "package_type": "package", + "imports": [ + "html5lib" + ], + "depends": [ + "webencodings", + "six" + ] + }, + "idna": { + "name": "idna", + "version": "3.4", + "file_name": "idna-3.4-py3-none-any.whl", + "install_dir": "site", + "sha256": "02638b50deb5708b003794c5f84f3a1086552b8ceb56bc9f5439ef8b1b39193f", + "package_type": "package", + "imports": [ + "idna" + ], + "depends": [] + }, + "imageio": { + "name": "imageio", + "version": "2.27.0", + "file_name": "imageio-2.27.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "dfaf5ca37936c1f954c1b5051b1dd7e48b0266502996fdde9c0bb23047cf3505", + "package_type": "package", + "imports": [ + "imageio" + ], + "depends": [ + "numpy", + "pillow" + ] + }, + "iniconfig": { + "name": "iniconfig", + "version": "2.0.0", + "file_name": "iniconfig-2.0.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "e24a1d8a679b02590e532cfd5060a40b5ea2fd475d8958eddfe424062b9bc6c0", + "package_type": "package", + "imports": [ + "iniconfig" + ], + "depends": [] + }, + "jedi": { + "name": "jedi", + "version": "0.18.2", + "file_name": "jedi-0.18.2-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "6fab5c4d42d83dc6a6f556db9e2eaf6268ff85394797af3d86b02d9d2f3c06b2", + "package_type": "package", + "imports": [ + "jedi" + ], + "depends": [ + "parso" + ], + "unvendored_tests": true + }, + "jedi-tests": { + "name": "jedi-tests", + "version": "0.18.2", + "depends": [ + "jedi" + ], + "imports": [], + "file_name": "jedi-tests.tar", + "install_dir": "site", + "sha256": "6e0339084e1b3c71216b1d4e5da5657f3fc6cd1d9b8cb468020d4ec9d89ed937" + }, + "jinja2": { + "name": "Jinja2", + "version": "3.1.2", + "file_name": "Jinja2-3.1.2-py3-none-any.whl", + "install_dir": "site", + "sha256": "538233eab5eb8339e1a3017fc8205401c254f44e17eee9ed217d8d7f0c3bb6bb", + "package_type": "package", + "imports": [ + "jinja2" + ], + "depends": [ + "markupsafe" + ] + }, + "joblib": { + "name": "joblib", + "version": "1.2.0", + "file_name": "joblib-1.2.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "0ba88f4e49f3fa3f248d824ecba3377faa1b73d42011e6fd3c2a305a4ea4e0b2", + "package_type": "package", + "imports": [ + "joblib" + ], + "depends": [ + "distutils" + ], + "unvendored_tests": true + }, + "joblib-tests": { + "name": "joblib-tests", + "version": "1.2.0", + "depends": [ + "joblib" + ], + "imports": [], + "file_name": "joblib-tests.tar", + "install_dir": "site", + "sha256": "2996778bced2b0ae2cbe2530e0c2ac58af9c5d4be949086f1dd6542791d724f1" + }, + "jsonschema": { + "name": "jsonschema", + "version": "4.17.3", + "file_name": "jsonschema-4.17.3-py3-none-any.whl", + "install_dir": "site", + "sha256": "42a939a54f9b0b86dda2ca951114c06cf0f177c4f7ab34ab605a3fb796821cb7", + "package_type": "package", + "imports": [ + "jsonschema" + ], + "depends": [ + "attrs", + "pyrsistent" + ], + "unvendored_tests": true + }, + "jsonschema-tests": { + "name": "jsonschema-tests", + "version": "4.17.3", + "depends": [ + "jsonschema" + ], + "imports": [], + "file_name": "jsonschema-tests.tar", + "install_dir": "site", + "sha256": "4936b26457701889a16d8344e7a398fee371b4b72d4074366da6b6df35521581" + }, + "kiwisolver": { + "name": "kiwisolver", + "version": "1.4.4", + "file_name": "kiwisolver-1.4.4-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "df3dfb24fffe728203953863023715cc426ec3a82fd224742f4a7b207c1a5421", + "package_type": "package", + "imports": [ + "kiwisolver" + ], + "depends": [] + }, + "lazy-object-proxy": { + "name": "lazy-object-proxy", + "version": "1.9.0", + "file_name": "lazy_object_proxy-1.9.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "90b9c036391526b285b83f157b7be0fb73379efc9aec4b472b277dcf75c4eac5", + "package_type": "package", + "imports": [ + "lazy_object_proxy" + ], + "depends": [] + }, + "libhdf5": { + "name": "libhdf5", + "version": "1.12.1", + "file_name": "libhdf5-1.12.1.zip", + "install_dir": "dynlib", + "sha256": "9f8721d5d487e67b5eb88aad6abfc50285212d38cf028fa57d20ca2e63b3f7af", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [] + }, + "libheif": { + "name": "libheif", + "version": "1.12.0", + "file_name": "libheif-1.12.0.zip", + "install_dir": "dynlib", + "sha256": "e9b60b5607dc4a877530a621da8600c87dc19d7322cc640ff3a1ed24f1f8901a", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [] + }, + "libmagic": { + "name": "libmagic", + "version": "5.42", + "file_name": "libmagic-5.42.zip", + "install_dir": "dynlib", + "sha256": "78e6aaaac561c9f64e799ce20ee4625f8e6e34e1dccda58cd243cfc1d9b6f171", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [] + }, + "lightgbm": { + "name": "lightgbm", + "version": "3.3.5", + "file_name": "lightgbm-3.3.5-py3-none-any.whl", + "install_dir": "site", + "sha256": "9ca27b158b53bc30aaab45502202ac95a2e9def1abe66fefca25303121e67d34", + "package_type": "package", + "imports": [ + "lightgbm" + ], + "depends": [ + "numpy", + "scipy", + "scikit-learn" + ] + }, + "logbook": { + "name": "logbook", + "version": "1.5.3", + "file_name": "Logbook-1.5.3-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "1b3389af603594d5df0b5668735c3867a643396aab50099869c0c92ecb25d0bc", + "package_type": "package", + "imports": [ + "logbook" + ], + "depends": [] + }, + "lxml": { + "name": "lxml", + "version": "4.9.2", + "file_name": "lxml-4.9.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "8194f6c50a292024699e747afa2e3add9ce4cccba3807842e56ca99ab4af32f0", + "package_type": "package", + "imports": [ + "lxml" + ], + "depends": [] + }, + "lzma": { + "name": "lzma", + "version": "1.0.0", + "file_name": "lzma-1.0.0.zip", + "install_dir": "stdlib", + "sha256": "dc61ced6fcb112cbe290cedf0fc3339ea7d8aa1819610dae188dd4d50e1c6e3f", + "package_type": "cpython_module", + "imports": [ + "lzma", + "_lzma" + ], + "shared_library": true, + "depends": [] + }, + "markupsafe": { + "name": "MarkupSafe", + "version": "2.1.2", + "file_name": "MarkupSafe-2.1.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "483a327b92dd189db202925cd0356bb2bfcbced94a01fefb6ff635883742e382", + "package_type": "package", + "imports": [ + "markupsafe" + ], + "depends": [] + }, + "matplotlib": { + "name": "matplotlib", + "version": "3.5.2", + "file_name": "matplotlib-3.5.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "a2c1a1ffabd8e07365381a59a55e5bd4282f4490b1e8a05e70261beb7c92e524", + "package_type": "package", + "imports": [ + "pylab", + "mpl_toolkits", + "matplotlib", + "pylab" + ], + "depends": [ + "cycler", + "fonttools", + "kiwisolver", + "numpy", + "packaging", + "pillow", + "pyparsing", + "python-dateutil", + "pytz", + "matplotlib-pyodide" + ], + "unvendored_tests": true + }, + "matplotlib-pyodide": { + "name": "matplotlib-pyodide", + "version": "0.1.1", + "file_name": "matplotlib_pyodide-0.1.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "2cebba09244d8d178aba9b33fc44a4635ffa31b854ca85c888690292d2ad7923", + "package_type": "package", + "imports": [ + "matplotlib_pyodide" + ], + "depends": [] + }, + "matplotlib-tests": { + "name": "matplotlib-tests", + "version": "3.5.2", + "depends": [ + "matplotlib" + ], + "imports": [], + "file_name": "matplotlib-tests.tar", + "install_dir": "site", + "sha256": "5305beaf9fd16dbbca7913b61e061d70df2d94e1b89e05b6c3f1eee87e84e1d1" + }, + "micropip": { + "name": "micropip", + "version": "0.3.0", + "file_name": "micropip-0.3.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "42316342df2f8c421aec9e5a85856e9315e95b0b8f0317657988e545c2cfbc2e", + "package_type": "package", + "imports": [ + "micropip" + ], + "depends": [ + "packaging" + ] + }, + "mne": { + "name": "mne", + "version": "1.3.1", + "file_name": "mne-1.3.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "2968ebd5986f8f08710d9308ae51e7362f009fa4d961e1c9fe22f796a8fd8fb2", + "package_type": "package", + "imports": [ + "mne" + ], + "depends": [ + "distutils", + "numpy", + "scipy", + "setuptools", + "decorator" + ], + "unvendored_tests": true + }, + "mne-tests": { + "name": "mne-tests", + "version": "1.3.1", + "depends": [ + "mne" + ], + "imports": [], + "file_name": "mne-tests.tar", + "install_dir": "site", + "sha256": "92fbed6d4969db015d1eafb47335637640340a8efbdb28f72fd464fbbd9ea019" + }, + "more-itertools": { + "name": "more-itertools", + "version": "9.1.0", + "file_name": "more_itertools-9.1.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "bc2b8c97ad31208cf02552ae84ac40cf03f336c692bb846aa9446d64543502f5", + "package_type": "package", + "imports": [ + "more_itertools" + ], + "depends": [] + }, + "mpmath": { + "name": "mpmath", + "version": "1.3.0", + "file_name": "mpmath-1.3.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "69840af5fdada9029fc1ed9d078cd8485546b4f4dc404eb5bc07ac9dc15bb1d8", + "package_type": "package", + "imports": [ + "mpmath" + ], + "depends": [], + "unvendored_tests": true + }, + "mpmath-tests": { + "name": "mpmath-tests", + "version": "1.3.0", + "depends": [ + "mpmath" + ], + "imports": [], + "file_name": "mpmath-tests.tar", + "install_dir": "site", + "sha256": "500cb363fae69ac68e51620decac394db96ce932ea40d8a93862e52d43c5c250" + }, + "msgpack": { + "name": "msgpack", + "version": "1.0.5", + "file_name": "msgpack-1.0.5-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "c63d9b96b43ecbe63cf65a7782afc271880cf9d24f8a6ef51034baf4c5ef9950", + "package_type": "package", + "imports": [ + "msgpack" + ], + "depends": [] + }, + "msprime": { + "name": "msprime", + "version": "1.2.0", + "file_name": "msprime-1.2.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "6a04926bb1f3e28baf7f4c755916b1682357388b186032804ac6fb8ca664213d", + "package_type": "package", + "imports": [ + "msprime" + ], + "depends": [ + "numpy", + "newick", + "tskit", + "demes" + ] + }, + "multidict": { + "name": "multidict", + "version": "6.0.4", + "file_name": "multidict-6.0.4-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "1a65f7a60c445020cd17d9050550a3480a22e676d39d63404996465e9a3ed1e1", + "package_type": "package", + "imports": [ + "multidict" + ], + "depends": [] + }, + "munch": { + "name": "munch", + "version": "2.5.0", + "file_name": "munch-2.5.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "bca5ef0ba4f778cc82dd1d76f50c7c6978f50e052b59ac69b45d9513d4c14349", + "package_type": "package", + "imports": [ + "munch" + ], + "depends": [ + "setuptools", + "six" + ] + }, + "mypy": { + "name": "mypy", + "version": "1.1.1", + "file_name": "mypy-1.1.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "4b7b5e9e8c8fb1b37bee8b0a33b19c7804c4253a25c5dd7eb37941bfa45115fc", + "package_type": "package", + "imports": [ + "mypyc", + "mypy" + ], + "depends": [], + "unvendored_tests": true + }, + "mypy-tests": { + "name": "mypy-tests", + "version": "1.1.1", + "depends": [ + "mypy" + ], + "imports": [], + "file_name": "mypy-tests.tar", + "install_dir": "site", + "sha256": "821cacf9a27d88ee0bf76e259253c93ee0309749dbf65b3eddb43025694b6466" + }, + "networkx": { + "name": "networkx", + "version": "3.0", + "file_name": "networkx-3.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "3673da1c5145001e0904904f2800bd1b7c4c8ad5309d5439797701d2aceec86a", + "package_type": "package", + "imports": [ + "networkx" + ], + "depends": [ + "decorator", + "setuptools", + "matplotlib", + "numpy" + ], + "unvendored_tests": true + }, + "networkx-tests": { + "name": "networkx-tests", + "version": "3.0", + "depends": [ + "networkx" + ], + "imports": [], + "file_name": "networkx-tests.tar", + "install_dir": "site", + "sha256": "04ff5dfe9964b8c1cb8105fe6421f2d0c6639a3ab7a23ff52f96048eb130f72a" + }, + "newick": { + "name": "newick", + "version": "1.9.0", + "file_name": "newick-1.9.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "5ce26deca207d1b30cfe437ee62752f530da4aa19f9f593af2801e6efc9cc318", + "package_type": "package", + "imports": [ + "newick" + ], + "depends": [] + }, + "nlopt": { + "name": "nlopt", + "version": "2.7.0", + "file_name": "nlopt-2.7.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "83185f2f8857bd4db6cd2ca4558b62f1ca67ceb41138ecfe1d323c931211e8f8", + "package_type": "package", + "imports": [ + "nlopt" + ], + "depends": [ + "numpy" + ] + }, + "nltk": { + "name": "nltk", + "version": "3.8.1", + "file_name": "nltk-3.8.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "ecb67abea42107de0b3763519dccdbf58631cbceecfc0a6d29adaf16a3968816", + "package_type": "package", + "imports": [ + "nltk" + ], + "depends": [ + "regex", + "sqlite3" + ], + "unvendored_tests": true + }, + "nltk-tests": { + "name": "nltk-tests", + "version": "3.8.1", + "depends": [ + "nltk" + ], + "imports": [], + "file_name": "nltk-tests.tar", + "install_dir": "site", + "sha256": "6fb1cea9ddc76be465aeeda145c1fd60b1a0286abfc3cd0bbaec6391b0bfa7da" + }, + "nose": { + "name": "nose", + "version": "1.3.7", + "file_name": "nose-1.3.7-py3-none-any.whl", + "install_dir": "site", + "sha256": "d89ec222fb105f3066587d4765bba5f6c11d79aef4f03498a6724a38df5ba03b", + "package_type": "package", + "imports": [ + "nose" + ], + "depends": [ + "setuptools" + ] + }, + "numcodecs": { + "name": "numcodecs", + "version": "0.11.0", + "file_name": "numcodecs-0.11.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "7e4ae4fc3daba32ef2a368aced0ca64ba2bef3727b604468fff544333a0c5ceb", + "package_type": "package", + "imports": [ + "numcodecs" + ], + "depends": [ + "numpy", + "msgpack" + ], + "unvendored_tests": true + }, + "numcodecs-tests": { + "name": "numcodecs-tests", + "version": "0.11.0", + "depends": [ + "numcodecs" + ], + "imports": [], + "file_name": "numcodecs-tests.tar", + "install_dir": "site", + "sha256": "098f2b75700462f771f0a1576e84cccef39201679e258c33f14792eaff3095fe" + }, + "numpy": { + "name": "numpy", + "version": "1.24.2", + "file_name": "numpy-1.24.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "7f8dd3ba24b50410375ad5505c67e26dee230aeec94bd0cef5dc2bdccd945569", + "package_type": "package", + "imports": [ + "numpy" + ], + "depends": [], + "unvendored_tests": true + }, + "numpy-tests": { + "name": "numpy-tests", + "version": "1.24.2", + "depends": [ + "numpy" + ], + "imports": [], + "file_name": "numpy-tests.tar", + "install_dir": "site", + "sha256": "661d0141b18348edb8afc1ccfdcb601a98781e32a60b6e6852ee2dd051a4055c" + }, + "opencv-python": { + "name": "opencv-python", + "version": "4.7.0.72", + "file_name": "opencv_python-4.7.0.72-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "e0c61946736462e67b5d3c223a682cd73add6e020db57ad5bb7c3f9192410a7f", + "package_type": "package", + "imports": [ + "cv2" + ], + "depends": [ + "numpy" + ] + }, + "openssl": { + "name": "openssl", + "version": "1.1.1n", + "file_name": "openssl-1.1.1n.zip", + "install_dir": "dynlib", + "sha256": "f7298aa6920b0f3990bf9892cb0472f8be31663c026e36fe5ba6ce8d90388d84", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [] + }, + "optlang": { + "name": "optlang", + "version": "1.6.1", + "file_name": "optlang-1.6.1-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "d44b36331d9fe77080ca468fc9c9d12cf9b79727fa01f718f850b3615b275722", + "package_type": "package", + "imports": [ + "optlang" + ], + "depends": [ + "sympy", + "six", + "swiglpk" + ], + "unvendored_tests": true + }, + "optlang-tests": { + "name": "optlang-tests", + "version": "1.6.1", + "depends": [ + "optlang" + ], + "imports": [], + "file_name": "optlang-tests.tar", + "install_dir": "site", + "sha256": "df1fda5013fe53a5a4f1c2dd2eff633130e798663b731ec056a97abcc3415dd0" + }, + "packaging": { + "name": "packaging", + "version": "23.0", + "file_name": "packaging-23.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "b6f5cc68563fdba1e35b952bd98692153c19620bd6f0d31754765e926c95d51f", + "package_type": "package", + "imports": [ + "packaging" + ], + "depends": [] + }, + "pandas": { + "name": "pandas", + "version": "1.5.3", + "file_name": "pandas-1.5.3-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "630ac2e0850b345f8b2d978d36468dee5b00aadd2a6c596e6dd7656491052a94", + "package_type": "package", + "imports": [ + "pandas" + ], + "depends": [ + "numpy", + "python-dateutil", + "pytz" + ], + "unvendored_tests": true + }, + "pandas-tests": { + "name": "pandas-tests", + "version": "1.5.3", + "depends": [ + "pandas" + ], + "imports": [], + "file_name": "pandas-tests.tar", + "install_dir": "site", + "sha256": "c5c1eb7055114d0a6cf86eba2edf3075b41ac4c455e1616d0549eb298fedfd58" + }, + "parso": { + "name": "parso", + "version": "0.8.3", + "file_name": "parso-0.8.3-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "c0f005026d7e9750712f8c4f50d969c036e33e560ff259af78715e220ea79bca", + "package_type": "package", + "imports": [ + "parso" + ], + "depends": [] + }, + "patsy": { + "name": "patsy", + "version": "0.5.3", + "file_name": "patsy-0.5.3-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "b6f91ffbb18dab5ae578f565ec554841685370a7727569337854bb8b6544844f", + "package_type": "package", + "imports": [ + "patsy" + ], + "depends": [ + "numpy", + "six" + ], + "unvendored_tests": true + }, + "patsy-tests": { + "name": "patsy-tests", + "version": "0.5.3", + "depends": [ + "patsy" + ], + "imports": [], + "file_name": "patsy-tests.tar", + "install_dir": "site", + "sha256": "512c48d5c1923df3ed800d6b3313fdf34cdec0b6ae1fe2d162060fde95f9be6c" + }, + "pillow": { + "name": "Pillow", + "version": "9.1.1", + "file_name": "PIL-9.1.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "7f82a3ccaf1e59f827ddab42299087bc329a040dd2df6d45a4676dce9bed60d6", + "package_type": "package", + "imports": [ + "PIL" + ], + "depends": [] + }, + "pillow_heif": { + "name": "pillow_heif", + "version": "0.8.0", + "file_name": "pillow_heif-0.8.0-cp36-abi3-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "3616f54c54a44056c36113d4ab21337c7eb7cad918c67a37222560704485d714", + "package_type": "package", + "imports": [ + "pillow_heif" + ], + "depends": [ + "cffi", + "pillow", + "libheif" + ] + }, + "pkgconfig": { + "name": "pkgconfig", + "version": "1.5.5", + "file_name": "pkgconfig-1.5.5-py3-none-any.whl", + "install_dir": "site", + "sha256": "960017f8f4575dce53b5649ae29d7cf314ea42b6d7fe2f0d87e26601f68bfc3d", + "package_type": "package", + "imports": [ + "pkgconfig" + ], + "depends": [] + }, + "pluggy": { + "name": "pluggy", + "version": "1.0.0", + "file_name": "pluggy-1.0.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "dff800c260803d274e3e724cd0d188a33c6a33864aecf5d019b8662ba4b77b6d", + "package_type": "package", + "imports": [ + "pluggy" + ], + "depends": [] + }, + "py": { + "name": "py", + "version": "1.11.0", + "file_name": "py-1.11.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "feb801585aa9e6f909194025151a312c0331f102b1281c95d8dd222eff47ae9d", + "package_type": "package", + "imports": [ + "py" + ], + "depends": [] + }, + "pyb2d": { + "name": "pyb2d", + "version": "0.7.2", + "file_name": "b2d-0.7.4-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "3c6d5e29fdac3f6368912ce35b0d905aa8b5da2ec5ba9eec3f9f4522b28999df", + "package_type": "package", + "imports": [ + "b2d" + ], + "depends": [ + "numpy", + "pydantic", + "setuptools" + ] + }, + "pyclipper": { + "name": "pyclipper", + "version": "1.3.0.post4", + "file_name": "pyclipper-1.3.0.post4-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "9ba1de8d6c6ce30efccb4824440736af204227e92608785d4490041b05ebd706", + "package_type": "package", + "imports": [ + "pyclipper" + ], + "depends": [] + }, + "pycparser": { + "name": "pycparser", + "version": "2.21", + "file_name": "pycparser-2.21-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "506fd095f3796b8ee523dbef4ff64ec5d3cde5f5c8f19129b4d205db3411db38", + "package_type": "package", + "imports": [ + "pycparser" + ], + "depends": [] + }, + "pycryptodome": { + "name": "pycryptodome", + "version": "3.17", + "file_name": "pycryptodome-3.17-cp35-abi3-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "3d02a2de66cf84818bd9f89b2839b4ff6c39a544b8b50684b597709b139eaa4d", + "package_type": "package", + "imports": [ + "Crypto" + ], + "depends": [], + "unvendored_tests": true + }, + "pycryptodome-tests": { + "name": "pycryptodome-tests", + "version": "3.17", + "depends": [ + "pycryptodome" + ], + "imports": [], + "file_name": "pycryptodome-tests.tar", + "install_dir": "site", + "sha256": "6d131ae39233f08fe2c474a72b84be10ed59259e0dc07da6bfb81f2b0d0eeaec" + }, + "pydantic": { + "name": "pydantic", + "version": "1.10.7", + "file_name": "pydantic-1.10.7-py3-none-any.whl", + "install_dir": "site", + "sha256": "30f5a637ca988f1f3d985a47fd5685270a576520b68234b9d1bc4d54cae6b74f", + "package_type": "package", + "imports": [ + "pydantic" + ], + "depends": [ + "typing-extensions" + ] + }, + "pydecimal": { + "name": "pydecimal", + "version": "1.0.0", + "file_name": "pydecimal-1.0.0.zip", + "install_dir": "stdlib", + "sha256": "012033ece1c48709d97f9bf3045ec6d95bd5f1a3a8ac312e609c5a1c2c0fb014", + "package_type": "cpython_module", + "imports": [ + "_pydecimal" + ], + "shared_library": true, + "depends": [] + }, + "pydoc_data": { + "name": "pydoc_data", + "version": "1.0.0", + "file_name": "pydoc_data-1.0.0.zip", + "install_dir": "stdlib", + "sha256": "2529835b36bd6eb1b57531c219487cbfe5672500a9c9a72f1db0117bac67ae97", + "package_type": "cpython_module", + "imports": [ + "pydoc_data" + ], + "shared_library": true, + "depends": [] + }, + "pyerfa": { + "name": "pyerfa", + "version": "2.0.0.3", + "file_name": "pyerfa-2.0.0.3-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "8e3eb922bba5564371a39e4043ab3b1bd9aea7cd741d291c72c5d4c3a50fb497", + "package_type": "package", + "imports": [ + "erfa" + ], + "depends": [ + "numpy" + ], + "unvendored_tests": true + }, + "pyerfa-tests": { + "name": "pyerfa-tests", + "version": "2.0.0.3", + "depends": [ + "pyerfa" + ], + "imports": [], + "file_name": "pyerfa-tests.tar", + "install_dir": "site", + "sha256": "8d8a2c138bf70ca0a41f90b52788a7251f93a55cef7008cb2b4f47b15cfb2d33" + }, + "pygments": { + "name": "Pygments", + "version": "2.14.0", + "file_name": "Pygments-2.14.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "341ce300289ff53fd32aadb73b639e19192d8fed3e4715bb8833e7555300f3b0", + "package_type": "package", + "imports": [ + "pygments" + ], + "depends": [] + }, + "pyheif": { + "name": "pyheif", + "version": "0.7.1", + "file_name": "pyheif-0.7.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "e5de5c3c095df98e10743af52d3c68d6fa5948edd4c11ed3eb3f40d2aac4e765", + "package_type": "package", + "imports": [ + "pyheif" + ], + "depends": [ + "cffi" + ] + }, + "pyinstrument": { + "name": "pyinstrument", + "version": "4.4.0", + "file_name": "pyinstrument-4.4.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "184c27f10f7a0209066d7fe24a5fb8b305788ca9c0b68011761ad4762c482939", + "package_type": "package", + "imports": [ + "pyinstrument" + ], + "depends": [] + }, + "pynacl": { + "name": "pynacl", + "version": "1.5.0", + "file_name": "PyNaCl-1.5.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "d49256d3b753de10a07776f70f1629887421705c93c146b9911537afadb14873", + "package_type": "package", + "imports": [ + "nacl" + ], + "depends": [ + "cffi" + ] + }, + "pyodide-http": { + "name": "pyodide-http", + "version": "0.2.0", + "file_name": "pyodide_http-0.2.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "a456cf92b1bc959d308b8b5b7f9c0de485c5ddb0ec80a5d0132b841660af90a9", + "package_type": "package", + "imports": [ + "pyodide_http" + ], + "depends": [] + }, + "pyparsing": { + "name": "pyparsing", + "version": "3.0.9", + "file_name": "pyparsing-3.0.9-py3-none-any.whl", + "install_dir": "site", + "sha256": "a6e25119501a7dbdba29af9f474a9b387921f9c375b46cd346359fb6f7b346e4", + "package_type": "package", + "imports": [ + "pyparsing" + ], + "depends": [] + }, + "pyproj": { + "name": "pyproj", + "version": "3.4.1", + "file_name": "pyproj-3.4.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "cd7aad0a62dd78b2ac4835d03fc0fdce950d88e7ed4ccdde89106c97a73926c3", + "package_type": "package", + "imports": [ + "pyproj" + ], + "depends": [ + "certifi", + "sqlite3" + ] + }, + "pyrsistent": { + "name": "pyrsistent", + "version": "0.19.3", + "file_name": "pyrsistent-0.19.3-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "409ffe13eb12ee8e1cbe9ac63b8cc3ab8e2811e11660d42593ca9c0caaea0cfd", + "package_type": "package", + "imports": [ + "_pyrsistent_version", + "pyrsistent" + ], + "depends": [] + }, + "pytest": { + "name": "pytest", + "version": "7.2.2", + "file_name": "pytest-7.2.2-py3-none-any.whl", + "install_dir": "site", + "sha256": "40b2e1db523aca2b364c8437ef9d12c7df2403d5a815b5daffa00f80eca311b9", + "package_type": "package", + "imports": [ + "_pytest", + "pytest" + ], + "depends": [ + "atomicwrites", + "attrs", + "more-itertools", + "pluggy", + "py", + "setuptools", + "six", + "iniconfig", + "exceptiongroup" + ] + }, + "pytest-benchmark": { + "name": "pytest-benchmark", + "version": "4.0.0", + "file_name": "pytest_benchmark-4.0.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "243dc9c51d59e5ddb30aa78c4da46ffc9f368bbc3149974be524c064248f307d", + "package_type": "package", + "imports": [ + "pytest_benchmark" + ], + "depends": [] + }, + "python-dateutil": { + "name": "python-dateutil", + "version": "2.8.2", + "file_name": "python_dateutil-2.8.2-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "11c7712e243c4d78e98c259f0937a3431c1f584eff45da4e75d7bcf3e52c1403", + "package_type": "package", + "imports": [ + "dateutil" + ], + "depends": [ + "six" + ] + }, + "python-magic": { + "name": "python-magic", + "version": "0.4.27", + "file_name": "python_magic-0.4.27-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "def4d2d4a6223edb4fb1e73711a0b489335493fb9171efab6aa242e165eaddb4", + "package_type": "package", + "imports": [ + "magic" + ], + "depends": [ + "libmagic" + ] + }, + "python-sat": { + "name": "python-sat", + "version": "0.1.7.dev26", + "file_name": "python_sat-0.1.7.dev26-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "6124edc8a2c0598760666d3ceb58a134da1a6f31d9429188dffee41c4e5b537b", + "package_type": "package", + "imports": [ + "pysat" + ], + "depends": [ + "six" + ] + }, + "python_solvespace": { + "name": "python_solvespace", + "version": "3.0.8", + "file_name": "python_solvespace-3.0.8-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "b5dadcdb9c68a36b920155ad30c63ec7959600d2a3372604626f2a170931f354", + "package_type": "package", + "imports": [ + "python_solvespace" + ], + "depends": [] + }, + "pytz": { + "name": "pytz", + "version": "2023.3", + "file_name": "pytz-2023.3-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "b3e7537895d0a8c265c50957ae847c878573a79a8ed287ed0f3268593a45c9b6", + "package_type": "package", + "imports": [ + "pytz" + ], + "depends": [] + }, + "pywavelets": { + "name": "pywavelets", + "version": "1.4.1", + "file_name": "PyWavelets-1.4.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "764f9c15b3d689ffd898e9af0fd0a027fcb99c8bdcd2978b0cad12899fe13910", + "package_type": "package", + "imports": [ + "pywt" + ], + "depends": [ + "distutils", + "numpy", + "matplotlib", + "scipy" + ], + "unvendored_tests": true + }, + "pywavelets-tests": { + "name": "pywavelets-tests", + "version": "1.4.1", + "depends": [ + "pywavelets" + ], + "imports": [], + "file_name": "pywavelets-tests.tar", + "install_dir": "site", + "sha256": "a5acf543d88c2c6f0d578b562571385f009d1dc6732bcf763b6ab3f85a1cb220" + }, + "pyxel": { + "name": "pyxel", + "version": "1.9.10", + "file_name": "pyxel-1.9.10-cp37-abi3-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "eb914046ffd881eeb4a870ab03ebfce6c7cc4725fe4023d3e63d980b4564a791", + "package_type": "package", + "imports": [ + "pyxel" + ], + "depends": [] + }, + "pyyaml": { + "name": "pyyaml", + "version": "6.0", + "file_name": "PyYAML-6.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "80e7cd64fb2828cce3ccf8763c201d7faa5623d5b21afdc8867f9b2de2b85c82", + "package_type": "package", + "imports": [ + "_yaml", + "yaml" + ], + "depends": [] + }, + "rebound": { + "name": "rebound", + "version": "3.19.8", + "file_name": "rebound-3.19.8-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "4591a8b5d4fd171918886619b33b49e70ebcd9fe8f0de9cd5ea15b5209a4016f", + "package_type": "package", + "imports": [ + "rebound" + ], + "depends": [ + "numpy" + ] + }, + "reboundx": { + "name": "reboundx", + "version": "3.7.1", + "file_name": "reboundx-3.7.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "360f77af303db09539d7c7e7e40d2622da75d70b80dba272f984cdd7ee9c3dc3", + "package_type": "package", + "imports": [ + "reboundx" + ], + "depends": [ + "rebound", + "numpy" + ] + }, + "regex": { + "name": "regex", + "version": "2023.3.23", + "file_name": "regex-2023.3.23-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "4da247c4a32d44d2b4effc8056ddfb0ab01cecd7a57906510892168c67f606b3", + "package_type": "package", + "imports": [ + "regex" + ], + "depends": [], + "unvendored_tests": true + }, + "regex-tests": { + "name": "regex-tests", + "version": "2023.3.23", + "depends": [ + "regex" + ], + "imports": [], + "file_name": "regex-tests.tar", + "install_dir": "site", + "sha256": "4ae64071df33adbc242d3ac649d6c62a6e52a80705faa99e19a83b2297657dd4" + }, + "retrying": { + "name": "retrying", + "version": "1.3.4", + "file_name": "retrying-1.3.4-py3-none-any.whl", + "install_dir": "site", + "sha256": "cfc1af86ed8e0e6dd78e6272d5a944c32b4fdd8a5e3275e7f7f244cad00ddad6", + "package_type": "package", + "imports": [ + "retrying" + ], + "depends": [ + "six" + ] + }, + "robotraconteur": { + "name": "RobotRaconteur", + "version": "0.15.1", + "file_name": "RobotRaconteur-0.15.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "7cbc71fbe230106c397bd590161770380447fdd915d7b87d698cf54f2ccebbd0", + "package_type": "package", + "imports": [ + "RobotRaconteur" + ], + "depends": [ + "numpy" + ] + }, + "ruamel.yaml": { + "name": "ruamel.yaml", + "version": "0.17.21", + "file_name": "ruamel.yaml-0.17.21-py3-none-any.whl", + "install_dir": "site", + "sha256": "9c4a42c61eeff4ca56716b35da20eb0079556676c59f76d0134d7700c46bd791", + "package_type": "package", + "imports": [ + "ruamel" + ], + "depends": [] + }, + "scikit-image": { + "name": "scikit-image", + "version": "0.19.3", + "file_name": "scikit_image-0.19.3-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "1f812e55891a30a4aa2b21423d5967ed5078cc8fee7a53520a2b73a2571b4769", + "package_type": "package", + "imports": [ + "skimage" + ], + "depends": [ + "packaging", + "numpy", + "scipy", + "networkx", + "pillow", + "imageio", + "pywavelets" + ], + "unvendored_tests": true + }, + "scikit-image-tests": { + "name": "scikit-image-tests", + "version": "0.19.3", + "depends": [ + "scikit-image" + ], + "imports": [], + "file_name": "scikit-image-tests.tar", + "install_dir": "site", + "sha256": "0c89e7255a96d77bc232a02d08d0e787d928f42069a4d78f1225ab7cf5a55d35" + }, + "scikit-learn": { + "name": "scikit-learn", + "version": "1.2.2", + "file_name": "scikit_learn-1.2.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "18ae7aa517712eece11a72414dbf24d5ad497b55a80ff11bed5baf8b4605b2b9", + "package_type": "package", + "imports": [ + "sklearn" + ], + "depends": [ + "scipy", + "joblib", + "threadpoolctl" + ], + "unvendored_tests": true + }, + "scikit-learn-tests": { + "name": "scikit-learn-tests", + "version": "1.2.2", + "depends": [ + "scikit-learn" + ], + "imports": [], + "file_name": "scikit-learn-tests.tar", + "install_dir": "site", + "sha256": "7433607ef2a4d0fc5edbdb670e65ca8b7ef5028dac36cc415ea1138efbf43dba" + }, + "scipy": { + "name": "scipy", + "version": "1.9.3", + "file_name": "scipy-1.9.3-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "8a34a8a5988ca2c5277f55f5020b3181a9a39edd946c046ce79677744a2695d7", + "package_type": "package", + "imports": [ + "scipy" + ], + "depends": [ + "numpy", + "clapack" + ], + "unvendored_tests": true + }, + "scipy-tests": { + "name": "scipy-tests", + "version": "1.9.3", + "depends": [ + "scipy" + ], + "imports": [], + "file_name": "scipy-tests.tar", + "install_dir": "site", + "sha256": "d858db64cc53e0b7888d1deab7ad77ce101a6d637378eb2105d4b5eb9da16b1b" + }, + "setuptools": { + "name": "setuptools", + "version": "67.6.1", + "file_name": "setuptools-67.6.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "0e8f5786afa8788c206278b15acc895f41d8e3086d8893e76e04eb17755bf009", + "package_type": "package", + "imports": [ + "_distutils_hack", + "pkg_resources", + "setuptools" + ], + "depends": [ + "distutils", + "pyparsing" + ] + }, + "shapely": { + "name": "shapely", + "version": "1.8.2", + "file_name": "Shapely-1.8.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "b8279b686c5512172292c30ec3c77f0da180efb72546e2fb771f0830c15213da", + "package_type": "package", + "imports": [ + "shapely" + ], + "depends": [ + "numpy" + ], + "unvendored_tests": true + }, + "shapely-tests": { + "name": "shapely-tests", + "version": "1.8.2", + "depends": [ + "shapely" + ], + "imports": [], + "file_name": "shapely-tests.tar", + "install_dir": "site", + "sha256": "0e0eef1e733417fd6c06ae9654c467dc68af4fe282e49a2930c87c496ffd4e52" + }, + "sharedlib-test": { + "name": "sharedlib-test", + "version": "1.0", + "file_name": "sharedlib-test-1.0.zip", + "install_dir": "dynlib", + "sha256": "39085dacc3b4c6c5efc6ac259a2ef4343e9cdee429f308cbcb39a46b5aa68afb", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [] + }, + "sharedlib-test-py": { + "name": "sharedlib-test-py", + "version": "1.0", + "file_name": "sharedlib_test_py-1.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "7bcb20966e6088b05b9c59bde47ed3a1c22c554629389217bcf40b1e9f3c6ca8", + "package_type": "package", + "imports": [ + "sharedlib_test" + ], + "depends": [ + "sharedlib-test" + ] + }, + "six": { + "name": "six", + "version": "1.16.0", + "file_name": "six-1.16.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "61cd0e5b8bd38dcd22a84f457295ac0085284bebf68c6372de3e2e79f52c2f5c", + "package_type": "package", + "imports": [ + "six" + ], + "depends": [] + }, + "smart_open": { + "name": "smart_open", + "version": "6.3.0", + "file_name": "smart_open-6.3.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "36b124177935a73cede6cd4b85a187083df4f8e26e39ea79d999cbd8c07709b3", + "package_type": "package", + "imports": [ + "smart_open" + ], + "depends": [] + }, + "soupsieve": { + "name": "soupsieve", + "version": "2.4", + "file_name": "soupsieve-2.4-py3-none-any.whl", + "install_dir": "site", + "sha256": "4e43188920f5dc029cb5c1fba0393fc9d037f58c9d5b908720b4b24abbf2ea39", + "package_type": "package", + "imports": [ + "soupsieve" + ], + "depends": [] + }, + "sqlalchemy": { + "name": "sqlalchemy", + "version": "2.0.7", + "file_name": "SQLAlchemy-2.0.7-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "19c564b0d8a2e94605d9260915edbce2e47149497388cbc9323cfaff034315ee", + "package_type": "package", + "imports": [ + "sqlalchemy" + ], + "depends": [ + "sqlite3", + "typing-extensions" + ], + "unvendored_tests": true + }, + "sqlalchemy-tests": { + "name": "sqlalchemy-tests", + "version": "2.0.7", + "depends": [ + "sqlalchemy" + ], + "imports": [], + "file_name": "sqlalchemy-tests.tar", + "install_dir": "site", + "sha256": "868307f00b1d9d650f9637f2f7ff81d2bedf9b7f1d41dedb664e43f262d3ccf0" + }, + "sqlite3": { + "name": "sqlite3", + "version": "1.0.0", + "file_name": "sqlite3-1.0.0.zip", + "install_dir": "stdlib", + "sha256": "eae6acbeda5f92aa753aa665ef674ccc7038988fbb4270e1f4b11c263835dfba", + "package_type": "cpython_module", + "imports": [ + "sqlite3", + "_sqlite3" + ], + "shared_library": true, + "depends": [] + }, + "ssl": { + "name": "ssl", + "version": "1.0.0", + "file_name": "ssl-1.0.0.zip", + "install_dir": "stdlib", + "sha256": "1c12a94cf06ff4e1f4dc06a02867487cabf0a768981ff99c670194406eb13345", + "package_type": "cpython_module", + "imports": [ + "ssl", + "_ssl" + ], + "shared_library": true, + "depends": [ + "openssl" + ] + }, + "statsmodels": { + "name": "statsmodels", + "version": "0.13.5", + "file_name": "statsmodels-0.13.5-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "168573c13262792f96de003302a44f9a39b967730586b95ff45d448f6b664ac4", + "package_type": "package", + "imports": [ + "statsmodels" + ], + "depends": [ + "distutils", + "numpy", + "scipy", + "pandas", + "patsy", + "packaging" + ], + "unvendored_tests": true + }, + "statsmodels-tests": { + "name": "statsmodels-tests", + "version": "0.13.5", + "depends": [ + "statsmodels" + ], + "imports": [], + "file_name": "statsmodels-tests.tar", + "install_dir": "site", + "sha256": "1ed9ee5b06fcbe22462ecd66abe02e274370db14d06867926a4b7e9912402438" + }, + "suitesparse": { + "name": "suitesparse", + "version": "5.11.0", + "file_name": "suitesparse-5.11.0.zip", + "install_dir": "dynlib", + "sha256": "a599eca1e566028dea32fd739a3eb1c9e8b7e71d325b766d022aa11b88ae9f67", + "package_type": "shared_library", + "imports": [], + "shared_library": true, + "depends": [ + "clapack" + ] + }, + "svgwrite": { + "name": "svgwrite", + "version": "1.4.3", + "file_name": "svgwrite-1.4.3-py3-none-any.whl", + "install_dir": "site", + "sha256": "4fbfaf3552a5c20aab532d3979de6849ce868cda1337e74010c5808e153334ea", + "package_type": "package", + "imports": [ + "svgwrite" + ], + "depends": [] + }, + "swiglpk": { + "name": "swiglpk", + "version": "5.0.8", + "file_name": "swiglpk-5.0.8-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "b4a90557ce25eb64f70a92503e006f2428fb589109590c7ab18b0ec048c2f720", + "package_type": "package", + "imports": [ + "swiglpk" + ], + "depends": [] + }, + "sympy": { + "name": "sympy", + "version": "1.11.1", + "file_name": "sympy-1.11.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "a28cc1df962686ed807efc8aa51edc12ceb45a4b5f166fa5a7a97a8b9387987d", + "package_type": "package", + "imports": [ + "isympy", + "sympy" + ], + "depends": [ + "distutils", + "mpmath" + ], + "unvendored_tests": true + }, + "sympy-tests": { + "name": "sympy-tests", + "version": "1.11.1", + "depends": [ + "sympy" + ], + "imports": [], + "file_name": "sympy-tests.tar", + "install_dir": "site", + "sha256": "d4c8d40dfd7d3ac98a40a472a22ba761a7f2a0c6659f5664022796abb45795f4" + }, + "tblib": { + "name": "tblib", + "version": "1.7.0", + "file_name": "pyodide_tblib-1.7.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "b9014858fe46dff2f549007556067b23d1cac2b5b2b629552375c74120d64741", + "package_type": "package", + "imports": [ + "tblib" + ], + "depends": [] + }, + "termcolor": { + "name": "termcolor", + "version": "2.2.0", + "file_name": "termcolor-2.2.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "6ea3207c34f0beab475b6f9b2360d7ca02693fb3071f3caaaff1201dc625d08d", + "package_type": "package", + "imports": [ + "termcolor" + ], + "depends": [] + }, + "test": { + "name": "test", + "version": "1.0.0", + "file_name": "test-1.0.0.zip", + "install_dir": "stdlib", + "sha256": "fc13f4bcd03baf3fd8b505fa34dfdab788b7fe8d5bfc2884b9a6e0104e8bfad5", + "package_type": "cpython_module", + "imports": [ + "test" + ], + "shared_library": true, + "depends": [] + }, + "threadpoolctl": { + "name": "threadpoolctl", + "version": "3.1.0", + "file_name": "threadpoolctl-3.1.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "7e5387d5f12cd8771020fbf65cc34d45d080c5139cb608ef279e22b395bc302f", + "package_type": "package", + "imports": [ + "threadpoolctl" + ], + "depends": [] + }, + "tomli": { + "name": "tomli", + "version": "2.0.1", + "file_name": "tomli-2.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "77ccae97ce22e836c4384dd7d203e8d81261e4226fae87411ed75153a8ef9b74", + "package_type": "package", + "imports": [ + "tomli" + ], + "depends": [] + }, + "tomli-w": { + "name": "tomli-w", + "version": "1.0.0", + "file_name": "tomli_w-1.0.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "99fd45ac04f853d378a8fcd58115eaa3d37faaefb2e3e7e2f2a375d1b246cbea", + "package_type": "package", + "imports": [ + "tomli_w" + ], + "depends": [] + }, + "toolz": { + "name": "toolz", + "version": "0.12.0", + "file_name": "toolz-0.12.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "a59268f19546670bb1182009ee7fbd6c017cf30fd9e9544fb39c0634c73a15de", + "package_type": "package", + "imports": [ + "tlz", + "toolz" + ], + "depends": [], + "unvendored_tests": true + }, + "toolz-tests": { + "name": "toolz-tests", + "version": "0.12.0", + "depends": [ + "toolz" + ], + "imports": [], + "file_name": "toolz-tests.tar", + "install_dir": "site", + "sha256": "809c117cda60a7ef7aa9292c76dd314362e8b7454e69b88dc6d5424ba03b22a8" + }, + "tqdm": { + "name": "tqdm", + "version": "4.65.0", + "file_name": "tqdm-4.65.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "358e9d9d5bc4b9d219b3708da5f25f6cd5453fe83e9c167df76c67c11b8791f9", + "package_type": "package", + "imports": [ + "tqdm" + ], + "depends": [] + }, + "traits": { + "name": "traits", + "version": "6.4.1", + "file_name": "traits-6.4.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "bfcde3e3a4978d16c9f45ba2569d37251c48994f6725c45c38bc27edfe94bb4e", + "package_type": "package", + "imports": [ + "traits" + ], + "depends": [], + "unvendored_tests": true + }, + "traits-tests": { + "name": "traits-tests", + "version": "6.4.1", + "depends": [ + "traits" + ], + "imports": [], + "file_name": "traits-tests.tar", + "install_dir": "site", + "sha256": "29ee56fd473a911af798f02dcac2f17949d35ed41fc48a1236bc0e32f99c3c08" + }, + "tskit": { + "name": "tskit", + "version": "0.5.4", + "file_name": "tskit-0.5.4-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "d883ac534b4d38b2d43bae6250fa4fb3ded77183c09bfed9e26d68570e406d14", + "package_type": "package", + "imports": [ + "tskit" + ], + "depends": [ + "numpy", + "svgwrite", + "jsonschema" + ] + }, + "typing-extensions": { + "name": "typing-extensions", + "version": "4.5.0", + "file_name": "typing_extensions-4.5.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "f7c6e2663c4b6e15678a4bcf1c6c9257bfc2b0dc44ac3f8d0762c3e47e5e3828", + "package_type": "package", + "imports": [ + "typing_extensions" + ], + "depends": [] + }, + "uncertainties": { + "name": "uncertainties", + "version": "3.1.7", + "file_name": "uncertainties-3.1.7-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "91d7b12337d604eaa893648e1e4583abab703446df6ff1aab3df07b2c551bf0f", + "package_type": "package", + "imports": [ + "uncertainties" + ], + "depends": [ + "future" + ], + "unvendored_tests": true + }, + "uncertainties-tests": { + "name": "uncertainties-tests", + "version": "3.1.7", + "depends": [ + "uncertainties" + ], + "imports": [], + "file_name": "uncertainties-tests.tar", + "install_dir": "site", + "sha256": "70c82a2ba2f4e68a3f53aa56cea7e3f666cbb53d621deb45ab2c14d1c128685a" + }, + "unyt": { + "name": "unyt", + "version": "2.9.5", + "file_name": "unyt-2.9.5-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "a06c023a3e0e8c471bf9559ea5747e500c03032772bdf9596da73d5710d5f242", + "package_type": "package", + "imports": [ + "unyt" + ], + "depends": [ + "numpy", + "sympy" + ], + "unvendored_tests": true + }, + "unyt-tests": { + "name": "unyt-tests", + "version": "2.9.5", + "depends": [ + "unyt" + ], + "imports": [], + "file_name": "unyt-tests.tar", + "install_dir": "site", + "sha256": "40b2546f4898a5b8df00eb6c202fee4756f0d877feb2b6bdd519fd8a6a041950" + }, + "webencodings": { + "name": "webencodings", + "version": "0.5.1", + "file_name": "webencodings-0.5.1-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "314e24d48f869306c88f89a94268933b19778d6495982baa7db96d97ff60f9db", + "package_type": "package", + "imports": [ + "webencodings" + ], + "depends": [] + }, + "wrapt": { + "name": "wrapt", + "version": "1.15.0", + "file_name": "wrapt-1.15.0-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "7a8ccfc853211739c2e1c05f1901995ea71eaa1e7316de9bcd2ce98b716f0d44", + "package_type": "package", + "imports": [ + "wrapt" + ], + "depends": [] + }, + "xarray": { + "name": "xarray", + "version": "2023.3.0", + "file_name": "xarray-2023.3.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "e02320e3cf482f7f660eba64a9cc4973ca37f88567dea1371499db8b06559f80", + "package_type": "package", + "imports": [ + "xarray" + ], + "depends": [ + "numpy", + "packaging", + "pandas" + ], + "unvendored_tests": true + }, + "xarray-tests": { + "name": "xarray-tests", + "version": "2023.3.0", + "depends": [ + "xarray" + ], + "imports": [], + "file_name": "xarray-tests.tar", + "install_dir": "site", + "sha256": "0629095623c4772faf9d1dc22b939b62db74bacb919461a72450333749faeebc" + }, + "xgboost": { + "name": "xgboost", + "version": "1.6.1", + "file_name": "xgboost-1.6.1-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "1268e1d243df750d95b90ce8ae7b847d9b51d891a1952013b3102e67c7bcdb3c", + "package_type": "package", + "imports": [ + "xgboost" + ], + "depends": [ + "numpy", + "scipy", + "setuptools" + ] + }, + "xlrd": { + "name": "xlrd", + "version": "2.0.1", + "file_name": "xlrd-2.0.1-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "1c628b3f44ecab464cd455926c325e394a6d310d515c8c38eb9ee1c014d1d5a7", + "package_type": "package", + "imports": [ + "xlrd" + ], + "depends": [] + }, + "yarl": { + "name": "yarl", + "version": "1.8.2", + "file_name": "yarl-1.8.2-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "d58af29907765ae29ca45646d3a8d70dde2f21305763f366e7cb3e2296de4485", + "package_type": "package", + "imports": [ + "yarl" + ], + "depends": [ + "multidict", + "idna" + ] + }, + "yt": { + "name": "yt", + "version": "4.1.4", + "file_name": "yt-4.1.4-cp311-cp311-emscripten_3_1_32_wasm32.whl", + "install_dir": "site", + "sha256": "0f36a886fe0e4f1444bceecf5a3de6e88b7bb949a1b80c451561b5fa4e0e4c75", + "package_type": "package", + "imports": [ + "yt" + ], + "depends": [ + "numpy", + "matplotlib", + "sympy", + "setuptools", + "packaging", + "unyt", + "cmyt", + "colorspacious", + "tqdm", + "tomli", + "tomli-w" + ] + }, + "zarr": { + "name": "zarr", + "version": "2.13.3", + "file_name": "zarr-2.13.3-py3-none-any.whl", + "install_dir": "site", + "sha256": "88bb8e18685f35b654a32be9d0cb4c6ba4c67c9c5970989b095866993de544a2", + "package_type": "package", + "imports": [ + "zarr" + ], + "depends": [ + "numpy", + "asciitree", + "numcodecs" + ], + "unvendored_tests": true + }, + "zarr-tests": { + "name": "zarr-tests", + "version": "2.13.3", + "depends": [ + "zarr" + ], + "imports": [], + "file_name": "zarr-tests.tar", + "install_dir": "site", + "sha256": "6282b81c7a74f0351c2e9335588efd23eb2267c66878f01acf2fb9b692903052" + }, + "basthon": { + "name": "basthon", + "version": "0.0.1", + "file_name": "{basthonRoot}/basthon.tar", + "install_dir": "site", + "sha256": "b5a93ab7ee451de522c3c9e7091af9102c627ade493c9bc65bae8217ac7e5ae2", + "depends": [], + "imports": [ + "basthon" + ] + }, + "binarytree": { + "name": "binarytree", + "version": "6.5.1", + "file_name": "https://files.pythonhosted.org/packages/38/a2/53b9f2647bc337e40d895b55cf79b45157a348c9216884b56e2cb6cdbbf2/binarytree-6.5.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "9d5db315f0520afec5a53b52c6ef6e30984e43f5ccf59c1416496a422ab2f4aa", + "imports": [ + "binarytree" + ], + "depends": [ + "graphviz", + "setuptools", + "setuptools-scm" + ] + }, + "branca": { + "name": "branca", + "version": "0.5.0", + "file_name": "https://files.pythonhosted.org/packages/6c/e2/16ce27dbfbc48b460e95aa2e900e905d3f1069b89d992820234d41f0db95/branca-0.5.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "781ff32bf82979584b0004bd84c254cfccda26bc31b2f7333346d03fb7b97741", + "imports": [ + "branca" + ], + "depends": [ + "jinja2" + ] + }, + "drawsvg": { + "name": "drawSvg", + "version": "1.8.3", + "file_name": "https://files.pythonhosted.org/packages/65/07/6326bed81257671a3c3fd1f525bb9074c0bad61cb58ce77425dde2f18ee7/drawSvg-1.8.3-py3-none-any.whl", + "install_dir": "site", + "sha256": "2cef5cd3cc5cc01236da0142aa9afe053c2e9235861d38f6f77353ff8edb957f", + "imports": [ + "drawSvg" + ], + "depends": [ + "imageio", + "numpy" + ] + }, + "exif": { + "name": "exif", + "version": "1.6.0", + "file_name": "https://files.pythonhosted.org/packages/25/75/acd3f11d4717bce8da4957c2b4e6e4d26a3ea079ecc61d42f6f07e30ca5c/exif-1.6.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "2d002b5740eb897da43de1e6a8f4ebacf5171b4d0b8bc0182c70aebde1be86d3", + "imports": [ + "exif" + ], + "depends": [ + "plum-py" + ] + }, + "filelock": { + "name": "filelock", + "version": "3.8.0", + "file_name": "https://files.pythonhosted.org/packages/94/b3/ff2845971788613e646e667043fdb5f128e2e540aefa09a3c55be8290d6d/filelock-3.8.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4", + "imports": [ + "filelock" + ], + "depends": [] + }, + "faker": { + "name": "Faker", + "version": "20.1.0", + "file_name": "https://files.pythonhosted.org/packages/cc/9a/74db0cf3115df2f71edcaf8d86ed556195ac31575212c20425820f81bfd0/Faker-20.1.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "aeb3e26742863d1e387f9d156f1c36e14af63bf5e6f36fb39b8c27f6a903be38", + "imports": [ + "faker" + ], + "depends": [ + "python-dateutil" + ] + }, + "folium": { + "name": "folium", + "version": "0.12.1.post1", + "file_name": "https://files.pythonhosted.org/packages/b9/05/bb30dc97efa1b431c88deac7a77af3d62df1423574c4fe2d5a10a4932e85/folium-0.12.1.post1-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "e856ae1de0b322a719b01ceed64ea16f6f011bd28ed22e954a7f7884313da672", + "imports": [ + "folium" + ], + "depends": [ + "branca", + "jinja2", + "numpy", + "requests" + ] + }, + "geojson": { + "name": "geojson", + "version": "3.1.0", + "file_name": "https://files.pythonhosted.org/packages/8e/1b/4f57660aa148d3e3043d048b7e1ab87dfeb85204d0fdb5b4e19c08202162/geojson-3.1.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "68a9771827237adb8c0c71f8527509c8f5bef61733aa434cefc9c9d4f0ebe8f3", + "imports": [ + "geojson" + ], + "depends": [] + }, + "ipythonblocks": { + "name": "ipythonblocks", + "version": "1.9.0", + "file_name": "https://files.pythonhosted.org/packages/0a/2e/2ffc1f1f17fe48f98c9004b2612336384827b5c5889340027fd6046a7e7a/ipythonblocks-1.9.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "111858436fdb28289fde627b5b7c4a448e84c1cf6ada6387941dc4cbb19f6616", + "imports": [ + "ipythonblocks" + ], + "depends": [ + "ipython", + "pillow", + "requests" + ] + }, + "iso8601": { + "name": "iso8601", + "version": "1.0.2", + "file_name": "https://files.pythonhosted.org/packages/df/e5/589bc81d410139ec4e4f37d9af5a50987566abf6d087b3c4fbed708109a9/iso8601-1.0.2-py3-none-any.whl", + "install_dir": "site", + "sha256": "d7bc01b1c2a43b259570bb307f057abc578786ea734ba2b87b836c5efc5bd443", + "imports": [], + "depends": [] + }, + "lolviz": { + "name": "lolviz", + "version": "1.4.4", + "file_name": "https://files.pythonhosted.org/packages/8e/93/bbfea1761c00bd36ab15c6c24ebf9ad9392f8c352dd68e528067ecc7379d/lolviz-1.4.4.tar.gz", + "install_dir": "site", + "sha256": "336451e490ebbe178e80b8cfdaa93399b75f5be73e20202827e7fa75cfa7d44a", + "imports": [ + "lolviz" + ], + "depends": [ + "graphviz" + ] + }, + "osmiter": { + "name": "osmiter", + "version": "1.2.0", + "file_name": "https://files.pythonhosted.org/packages/83/97/386b8caa3292cae8b0576888afbbee6c1003299619cfcc2f18758b2ffa55/osmiter-1.2.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "ea443a40c3adbb0989a1e12912467654b54ac709c54e5f7f118cb5a597df128c", + "imports": [ + "osmiter" + ], + "depends": [ + "iso8601", + "lzma", + "protobuf", + "typing-extensions" + ] + }, + "plum-py": { + "name": "plum-py", + "version": "0.8.7", + "file_name": "https://files.pythonhosted.org/packages/2f/da/8a9bdf5d3ea4b13d3142e0c77d6e85e4c2668aef6e4b9d5e9a6619049bdc/plum_py-0.8.7-py3-none-any.whl", + "install_dir": "site", + "sha256": "d791f059ef159adbe3c3b036557b5b431fa07db226a9de106a74e5e57441741d", + "imports": [ + "plum" + ], + "depends": [] + }, + "protobuf": { + "name": "protobuf", + "version": "4.21.5", + "file_name": "https://files.pythonhosted.org/packages/59/29/1ae13c23a166b3ce3ae4975e8bc7a4fe7f3e4f39568544b3125321bafca7/protobuf-4.21.5-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "bf711b451212dc5b0fa45ae7dada07d8e71a4b0ff0bc8e4783ee145f47ac4f82", + "imports": [ + "google" + ], + "depends": [] + }, + "pyflakes": { + "name": "pyflakes", + "version": "3.1.0", + "file_name": "https://files.pythonhosted.org/packages/00/e9/1e1fd7fae559bfd07704991e9a59dd1349b72423c904256c073ce88a9940/pyflakes-3.1.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", + "imports": [ + "pyflakes" + ], + "depends": [] + }, + "pycodestyle": { + "name": "pycodestyle", + "version": "2.11.0", + "file_name": "https://files.pythonhosted.org/packages/31/c2/e1508ed4395793f69e40fd8c6b5a690e1d568e649aae9492076a7b6befb4/pycodestyle-2.11.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8", + "imports": [ + "pycodestyle" + ], + "depends": [] + }, + "pyroutelib3": { + "name": "pyroutelib3", + "version": "1.7.2", + "file_name": "https://files.pythonhosted.org/packages/ce/11/32a4f4c5fbd2c5ed1f2361c8e724d06f92a0bf9ed879e2f60f328a2c9068/pyroutelib3-1.7.2-py3-none-any.whl", + "install_dir": "site", + "sha256": "4b50dfcce7e6b469fc7e90f9d67397acb3a07e90939c8ecd8e6a3f84d1244065", + "imports": [ + "pyroutelib3" + ], + "depends": [ + "filelock", + "osmiter", + "typing-extensions" + ] + }, + "qrcode": { + "name": "qrcode", + "version": "6.1", + "file_name": "https://files.pythonhosted.org/packages/42/87/4a3a77e59ab7493d64da1f69bf1c2e899a4cf81e51b2baa855e8cc8115be/qrcode-6.1-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "3996ee560fc39532910603704c82980ff6d4d5d629f9c3f25f34174ce8606cf5", + "imports": [ + "qrcode" + ], + "depends": [ + "six", + "pillow" + ] + }, + "setuptools-scm": { + "name": "setuptools-scm", + "version": "7.0.5", + "file_name": "https://files.pythonhosted.org/packages/01/ed/75a20e7b075e8ecb1f84e8debf833917905d8790b78008915bd68dddd5c4/setuptools_scm-7.0.5-py3-none-any.whl", + "install_dir": "site", + "sha256": "7930f720905e03ccd1e1d821db521bff7ec2ac9cf0ceb6552dd73d24a45d3b02", + "imports": [ + "setuptools_scm" + ], + "depends": [ + "packaging", + "setuptools", + "tomli", + "typing-extensions" + ] + }, + "fastjsonschema": { + "name": "fastjsonschema", + "version": "2.16.2", + "file_name": "https://files.pythonhosted.org/packages/e4/be/cf1b876348070a23cb0c3ebfee7a452ad3a91b07b456dade3bd514656009/fastjsonschema-2.16.2-py3-none-any.whl", + "install_dir": "site", + "sha256": "21f918e8d9a1a4ba9c22e09574ba72267a6762d47822db9add95f6454e51cc1c", + "imports": [ + "fastjsonschema" + ], + "depends": [] + }, + "jupyter-core": { + "name": "jupyter_core", + "version": "5.1.0", + "file_name": "https://files.pythonhosted.org/packages/ba/88/c829e2cef67fa173ab512a054d1ba7047c2559b311e9f9e7c55b0a9d8278/jupyter_core-5.1.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "f5740d99606958544396914b08e67b668f45e7eff99ab47a7f4bcead419c02f4", + "imports": [], + "depends": [ + "platformdirs", + "traitlets" + ] + }, + "nbformat": { + "name": "nbformat", + "version": "5.7.0", + "file_name": "https://files.pythonhosted.org/packages/5c/9f/957655d02f43b8bff77e6da08c94472b1229c13e7455bbd662163c9b78c0/nbformat-5.7.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "1b05ec2c552c2f1adc745f4eddce1eac8ca9ffd59bb9fd859e827eaa031319f9", + "imports": [], + "depends": [ + "fastjsonschema", + "jsonschema", + "jupyter-core", + "traitlets" + ] + }, + "et-xmlfile": { + "name": "et-xmlfile", + "version": "1.1.0", + "file_name": "https://files.pythonhosted.org/packages/96/c2/3dd434b0108730014f1b96fd286040dc3bcb70066346f7e01ec2ac95865f/et_xmlfile-1.1.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada", + "imports": [ + "et_xmlfile" + ], + "depends": [] + }, + "mocodo": { + "name": "mocodo", + "version": "4.2.0", + "file_name": "https://files.pythonhosted.org/packages/b8/61/9f32dd38f2d28bf53e880bd56c2f9172d498f893ee1fd62c6e50a996ec6c/mocodo-4.2.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "ab3bbf8567144ac693adfcbeb0f2a012d34ecbfc877fa3402f0a30aff814f509", + "imports": [ + "mocodo" + ], + "depends": [ + "IPython", + "requests", + "setuptools" + ] + }, + "openpyxl": { + "name": "openpyxl", + "version": "3.1.2", + "file_name": "https://files.pythonhosted.org/packages/6a/94/a59521de836ef0da54aaf50da6c4da8fb4072fb3053fa71f052fd9399e7a/openpyxl-3.1.2-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5", + "imports": [ + "openpyxl" + ], + "depends": [ + "et-xmlfile" + ] + }, + "platformdirs": { + "name": "platformdirs", + "version": "2.6.0", + "file_name": "https://files.pythonhosted.org/packages/87/69/cd019a9473bcdfb38983e2d550ccb239264fc4c2fc32c42ac1b1cc2506b6/platformdirs-2.6.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca", + "imports": [], + "depends": [] + }, + "plotly": { + "name": "plotly", + "version": "5.11.0", + "file_name": "https://files.pythonhosted.org/packages/8b/9c/b4a50d20b05dbf36abce70869d794fa1e2fc398af4ef91e20da5e5c288bd/plotly-5.11.0-py2.py3-none-any.whl", + "install_dir": "site", + "sha256": "52fd74b08aa4fd5a55b9d3034a30dbb746e572d7ed84897422f927fdf687ea5f", + "imports": [ + "_plotly_future_", + "_plotly_utils", + "jupyterlab_plotly", + "plotly" + ], + "depends": [ + "distutils", + "tenacity", + "nbformat", + "ipython" + ] + }, + "gpx": { + "name": "gpx", + "version": "0.2.1", + "file_name": "https://files.pythonhosted.org/packages/58/4b/29a9d230f8dd07828904bb94c3c4ae5e8b3d9415b1878f4141bdf59234b4/gpx-0.2.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "10f34830d1cc7b35e3ee40d07b57ff7c8006c9e5b2b01111d111f23da9fa1e1d", + "imports": [ + "gpx" + ], + "depends": [ + "lxml", + "python-dateutil" + ] + }, + "tenacity": { + "name": "tenacity", + "version": "8.1.0", + "file_name": "https://files.pythonhosted.org/packages/a5/94/933ce16d18450ccf518a6da5bd51418611e8776b992070b9f40b2f9cedff/tenacity-8.1.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "35525cd47f82830069f0d6b73f7eb83bc5b73ee2fff0437952cedf98b27653ac", + "imports": [ + "tenacity" + ], + "depends": [] + }, + "traitlets": { + "name": "traitlets", + "version": "5.7.0", + "file_name": "https://files.pythonhosted.org/packages/da/31/a4740b0177838e5b1b50478cff4de09e5373ba8e5ed0998ae045b42218df/traitlets-5.7.0-py3-none-any.whl", + "install_dir": "site", + "sha256": "61832ea7b7f910f5745e27e9bb269a181fd15af76027d99560299209d5b17c94", + "imports": [], + "depends": [] + }, + "graphviz": { + "name": "graphviz", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/graphviz-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "8a804fc54b31d990b901fa01ad16681b44b4769819991b2b76ca1fcc2b5abe07", + "imports": [ + "graphviz" + ], + "depends": [ + "setuptools" + ] + }, + "proj4py": { + "name": "proj4py", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/proj4py-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "d945e7bce468e141e6f30983e2325f3ccb2c9b2fa7993f4eedbba7c5eebbe836", + "imports": [ + "proj4py" + ], + "depends": [ + "setuptools" + ] + }, + "ipython": { + "name": "IPython", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/IPython-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "20694c9035a5f6e9a6e11218220cd1afe87395a4e989f5617bfd9a4fa3e2fb25", + "imports": [ + "IPython" + ], + "depends": [] + }, + "rcviz": { + "name": "rcviz", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/rcviz-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "58a041d60d035e406a4bbc844b25699477766e71921754447d2bc69726df4feb", + "imports": [ + "rcviz" + ], + "depends": [ + "graphviz" + ] + }, + "tutor": { + "name": "tutor", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/tutor-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "10133e39b67f5e4e580f8f05e8bb45dab4a9b17f51d145c05bacbbe7f4608c85", + "imports": [ + "tutor" + ], + "depends": [ + "setuptools" + ] + }, + "turtle": { + "name": "turtle", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/turtle-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "cb2b4be41f72511141cae44868efd4b616d763f7f617770c553acb9bc8f47644", + "imports": [ + "turtle" + ], + "depends": [] + }, + "requests": { + "name": "requests", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/requests-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "740eb2eadf2005bf6891bdf92d642ea22bbd96fdd846623ada8965ee94ab1c51", + "imports": [ + "requests" + ], + "depends": [] + }, + "p5": { + "name": "p5", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/p5-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "24cc75c207dca44887f0b87c0b12ef2d4e465fc1e7ff610cbf40e444e3e1e835", + "imports": [ + "p5" + ], + "depends": [ + "setuptools" + ] + }, + "sprite": { + "name": "sprite", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/sprite-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "61fafc4414e20ef7c9be14d057ec7c273da57888eba5f2c91ee0553ccc03ad34", + "imports": [ + "sprite" + ], + "depends": [] + }, + "tensorflow": { + "name": "tensorflow", + "version": "0.0.1", + "file_name": "{basthonRoot}/modules/tensorflow-0.0.1-py3-none-any.whl", + "install_dir": "site", + "sha256": "734415520a240e19f44c6121f0e237300c9f82ce87635a9e40a6639d0f35c888", + "imports": [ + "tensorflow" + ], + "depends": [] + } + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/map.json b/mixly/boards/default_src/python_pyodide/origin/examples/map.json new file mode 100644 index 00000000..e7a15873 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/map.json @@ -0,0 +1,238 @@ +{ + "大同出版社-五年级": { + "上册": { + "第12课判断闰年.mix": { + "__file__": true, + "__name__": "第12课判断闰年.mix" + }, + "第13课让计算机会数数1.mix": { + "__file__": true, + "__name__": "第13课让计算机会数数1.mix" + }, + "第13课让计算机会数数2.mix": { + "__file__": true, + "__name__": "第13课让计算机会数数2.mix" + }, + "第14课for循环.mix": { + "__file__": true, + "__name__": "第14课for循环.mix" + }, + "第14课趣味数玩具.mix": { + "__file__": true, + "__name__": "第14课趣味数玩具.mix" + }, + "第15课破译密码.mix": { + "__file__": true, + "__name__": "第15课破译密码.mix" + }, + "第8课动物园购票.mix": { + "__file__": true, + "__name__": "第8课动物园购票.mix" + }, + "第8课计算购书费.mix": { + "__file__": true, + "__name__": "第8课计算购书费.mix" + }, + "__file__": false, + "__name__": "上册" + }, + "下册": { + "第12课网页排名算法.mix": { + "__file__": true, + "__name__": "第12课网页排名算法.mix" + }, + "第1课比较交换找最大值.mix": { + "__file__": true, + "__name__": "第1课比较交换找最大值.mix" + }, + "第2课选择排序(未要求代码).mix": { + "__file__": true, + "__name__": "第2课选择排序(未要求代码).mix" + }, + "第4课冒泡排序.mix": { + "__file__": true, + "__name__": "第4课冒泡排序.mix" + }, + "第6课用算数求解鸡兔同笼.mix": { + "__file__": true, + "__name__": "第6课用算数求解鸡兔同笼.mix" + }, + "第6课遍历求解鸡兔同笼.mix": { + "__file__": true, + "__name__": "第6课遍历求解鸡兔同笼.mix" + }, + "第7课兔子增长算法.mix": { + "__file__": true, + "__name__": "第7课兔子增长算法.mix" + }, + "__file__": false, + "__name__": "下册" + }, + "__file__": false, + "__name__": "大同出版社-五年级" + }, + "教学指南米思齐修订版": { + "八年级": { + "18-2 从物联网服务平台获取数据(python).mix": { + "__file__": true, + "__name__": "18-2 从物联网服务平台获取数据(python).mix" + }, + "18-3 数据处理(python).mix": { + "__file__": true, + "__name__": "18-3 数据处理(python).mix" + }, + "19-3 数据可视化(python).mix": { + "__file__": true, + "__name__": "19-3 数据可视化(python).mix" + }, + "22-2 身高记录仪系统分析端(python).mix": { + "__file__": true, + "__name__": "22-2 身高记录仪系统分析端(python).mix" + }, + "22-22 手速测试仪系统分析端(python).mix": { + "__file__": true, + "__name__": "22-22 手速测试仪系统分析端(python).mix" + }, + "9-1 利用HTTP获取互联网中的数据(python).mix": { + "__file__": true, + "__name__": "9-1 利用HTTP获取互联网中的数据(python).mix" + }, + "9-2 解析数据(python).mix": { + "__file__": true, + "__name__": "9-2 解析数据(python).mix" + }, + "__file__": false, + "__name__": "八年级" + }, + "六年级": { + "第10课.mix": { + "__file__": true, + "__name__": "第10课.mix" + }, + "第12课": { + "判断平年与闰年.mix": { + "__file__": true, + "__name__": "判断平年与闰年.mix" + }, + "根据输入的气温给出提示.mix": { + "__file__": true, + "__name__": "根据输入的气温给出提示.mix" + }, + "购买火车票.mix": { + "__file__": true, + "__name__": "购买火车票.mix" + }, + "__file__": false, + "__name__": "第12课" + }, + "第13课": { + "从1数到100.mix": { + "__file__": true, + "__name__": "从1数到100.mix" + }, + "数数.mix": { + "__file__": true, + "__name__": "数数.mix" + }, + "输出1-n的所有偶数.mix": { + "__file__": true, + "__name__": "输出1-n的所有偶数.mix" + }, + "输出1-n能被5整除的数.mix": { + "__file__": true, + "__name__": "输出1-n能被5整除的数.mix" + }, + "__file__": false, + "__name__": "第13课" + }, + "第15课": { + "三位密码锁.mix": { + "__file__": true, + "__name__": "三位密码锁.mix" + }, + "找到所有水仙花数.mix": { + "__file__": true, + "__name__": "找到所有水仙花数.mix" + }, + "破解时间估算.mix": { + "__file__": true, + "__name__": "破解时间估算.mix" + }, + "__file__": false, + "__name__": "第15课" + }, + "第16课": { + "找出最大数.mix": { + "__file__": true, + "__name__": "找出最大数.mix" + }, + "找出最小数.mix": { + "__file__": true, + "__name__": "找出最小数.mix" + }, + "__file__": false, + "__name__": "第16课" + }, + "第17课": { + "从大到小的选择排序.mix": { + "__file__": true, + "__name__": "从大到小的选择排序.mix" + }, + "排序.mix": { + "__file__": true, + "__name__": "排序.mix" + }, + "__file__": false, + "__name__": "第17课" + }, + "第19课": { + "冒泡排序(for循环).mix": { + "__file__": true, + "__name__": "冒泡排序(for循环).mix" + }, + "冒泡排序.mix": { + "__file__": true, + "__name__": "冒泡排序.mix" + }, + "__file__": false, + "__name__": "第19课" + }, + "第21课.mix": { + "__file__": true, + "__name__": "第21课.mix" + }, + "第23课.mix": { + "__file__": true, + "__name__": "第23课.mix" + }, + "第3课.mix": { + "__file__": true, + "__name__": "第3课.mix" + }, + "第8课": { + "买水果算价格.mix": { + "__file__": true, + "__name__": "买水果算价格.mix" + }, + "公园购票.mix": { + "__file__": true, + "__name__": "公园购票.mix" + }, + "比较两个数并输出较小数.mix": { + "__file__": true, + "__name__": "比较两个数并输出较小数.mix" + }, + "温度转换.mix": { + "__file__": true, + "__name__": "温度转换.mix" + }, + "__file__": false, + "__name__": "第8课" + }, + "__file__": false, + "__name__": "六年级" + }, + "__file__": false, + "__name__": "教学指南米思齐修订版" + } +} diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第12课判断闰年.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第12课判断闰年.mix new file mode 100644 index 00000000..6344357e --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第12课判断闰年.mix @@ -0,0 +1 @@ +yearint请输入一个年份:ANDEQQUYU1year40NEQQUYU1year1000year是闰年EQQUYU1year4000year是闰年year是平年{}eWVhciA9IGludChpbnB1dCgn6K+36L6T5YWl5LiA5Liq5bm05Lu977yaJykpCmlmIHllYXIgJSA0ID09IDAgYW5kIHllYXIgJSAxMDAgIT0gMDoKICAgIHByaW50KHllYXIsICfmmK/pl7DlubQnKQplbGlmIHllYXIgJSA0MDAgPT0gMDoKICAgIHByaW50KHllYXIsICfmmK/pl7DlubQnKQplbHNlOgogICAgcHJpbnQoeWVhciwgJ+aYr+W5s+W5tCcpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数1.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数1.mix new file mode 100644 index 00000000..127e553b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数1.mix @@ -0,0 +1 @@ +start_timei1WHILETRUELTEi1000HelloiiADD1i1end_time输出1~1000所花时间为MINUS1end_time1start_time{}aW1wb3J0IHRpbWUKCgpzdGFydF90aW1lID0gdGltZS50aW1lKCkKaSA9IDEKd2hpbGUgaSA8PSAxMDAwOgogICAgcHJpbnQoaSkKICAgIGkgPSBpICsgMQplbmRfdGltZSA9IHRpbWUudGltZSgpCnByaW50KCfovpPlh7oxfjEwMDDmiYDoirHml7bpl7TkuLonLCBlbmRfdGltZSAtIHN0YXJ0X3RpbWUsICfnp5InKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数2.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数2.mix new file mode 100644 index 00000000..4e01533e --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数2.mix @@ -0,0 +1 @@ +start_timei1sum0WHILETRUELTEi1000000sumADD1sum1iiADD1i11+2+……+1000000=sumend_time累加1~1000000所花时间为MINUS1end_time1start_time{}aW1wb3J0IHRpbWUKCgpzdGFydF90aW1lID0gdGltZS50aW1lKCkKaSA9IDEKc3VtMiA9IDAKd2hpbGUgaSA8PSAxMDAwMDAwOgogICAgc3VtMiA9IHN1bTIgKyBpCiAgICBpID0gaSArIDEKcHJpbnQoJzErMivigKbigKYrMTAwMDAwMD0nLCBzdW0yKQplbmRfdGltZSA9IHRpbWUudGltZSgpCnByaW50KCfntK/liqAxfjEwMDAwMDDmiYDoirHml7bpl7TkuLonLCBlbmRfdGltZSAtIHN0YXJ0X3RpbWUsICfnp5InKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第14课for循环.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第14课for循环.mix new file mode 100644 index 00000000..928e1e83 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第14课for循环.mix @@ -0,0 +1 @@ +'welcome','to','our','world'strHellostr{}Zm9yIHN0cjIgaW4gWyd3ZWxjb21lJywndG8nLCdvdXInLCd3b3JsZCddOgogICAgcHJpbnQoc3RyMixlbmQgPSIiKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第14课趣味数玩具.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第14课趣味数玩具.mix new file mode 100644 index 00000000..f1d210d5 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第14课趣味数玩具.mix @@ -0,0 +1 @@ +n101WHILETRUELTEn200ANDEQQUYU1n53EQQUYU1n72符合条件的玩具数量:nnADD1n3{}biA9IDEwMQp3aGlsZSBuIDw9IDIwMDoKICAgIGlmIG4gJSA1ID09IDMgYW5kIG4gJSA3ID09IDI6CiAgICAgICAgcHJpbnQoJ+espuWQiOadoeS7tueahOeOqeWFt+aVsOmHj++8micsIG4pCiAgICBuID0gbiArIDMK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第15课破译密码.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第15课破译密码.mix new file mode 100644 index 00000000..a484d4bb --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第15课破译密码.mix @@ -0,0 +1 @@ +tint请输入密码每一位符号种类数:nPOWER1t8nsecDIVIDE1n5800000secminDIVIDE1sec60hourDIVIDE1min60dayDIVIDE1hour24yearDIVIDE1day365共需要year年破解此密码{}dCA9IGludChpbnB1dCgn6K+36L6T5YWl5a+G56CB5q+P5LiA5L2N56ym5Y+356eN57G75pWw77yaJykpCm4gPSB0ICoqIDgKcHJpbnQoJ+WFsScsIG4sICfnp40nKQpzZWMgPSBuIC8gNTgwMDAwMApwcmludCgn5YWxJywgc2VjLCAn56eSJykKbWluMiA9IHNlYyAvIDYwCmhvdXIgPSBtaW4yIC8gNjAKZGF5ID0gaG91ciAvIDI0CnllYXIgPSBkYXkgLyAzNjUKcHJpbnQoJ+WFsemcgOimgScsIHllYXIsICflubTnoLTop6PmraTlr4bnoIEnKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第8课动物园购票.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第8课动物园购票.mix new file mode 100644 index 00000000..2fdd942b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第8课动物园购票.mix @@ -0,0 +1 @@ +heightfloat请输入您的身高(米):LTheight1.2您的身高为:height米,免票您的身高为:height米,可以购买半价票{}aGVpZ2h0ID0gZmxvYXQoaW5wdXQoJ+ivt+i+k+WFpeaCqOeahOi6q+mrmO+8iOexs++8ie+8micpKQppZiBoZWlnaHQgPCAxLjI6CiAgICBwcmludCgn5oKo55qE6Lqr6auY5Li677yaJywgaGVpZ2h0LCAn57Gz77yM5YWN56WoJykKZWxzZToKICAgIHByaW50KCfmgqjnmoTouqvpq5jkuLrvvJonLCBoZWlnaHQsICfnsbPvvIzlj6/ku6XotK3kubDljYrku7fnpagnKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第8课计算购书费.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第8课计算购书费.mix new file mode 100644 index 00000000..13ccd426 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/上册/第8课计算购书费.mix @@ -0,0 +1 @@ +aint输入科普书的册数:hMULTIPLY1a8bint输入故事书的册数:jMULTIPLY1b9sADD1h9j购书费用是:s{}YSA9IGludChpbnB1dCgn6L6T5YWl56eR5pmu5Lmm55qE5YaM5pWw77yaJykpCmggPSBhICogOApiID0gaW50KGlucHV0KCfovpPlhaXmlYXkuovkuabnmoTlhozmlbDvvJonKSkKaiA9IGIgKiA5CnMgPSBoICsgagpwcmludCgn6LSt5Lmm6LS555So5piv77yaJywgcykK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第12课网页排名算法.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第12课网页排名算法.mix new file mode 100644 index 00000000..9dfca5d2 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第12课网页排名算法.mix @@ -0,0 +1 @@ +page'C','D''A','C','D''B''A','B','C'links0,0,0,0wangy0WHILETRUELTwangyLENmylistlinkslinkedmylistpage0wangyin'A'A0,1,2,3linkedmylistlinks00ADD1mylistlinks01in'B'B0,1,2,3linkedmylistlinks10ADD1mylistlinks11in'C'C0,1,2,3linkedmylistlinks20ADD1mylistlinks21in'D'D0,1,2,3linkedmylistlinks30ADD1mylistlinks31wangyADD1wangy1Hellolinksmost1INDEXmylistlinks0MAXmylistlinksmost265ADD1most11AHellomost2{}aW1wb3J0IG1hdGgKCgpwYWdlID0gW1snQycsJ0QnXSwgWydBJywnQycsJ0QnXSwgWydCJ10sIFsnQScsJ0InLCdDJ11dCmxpbmtzID0gWzAsMCwwLDBdCndhbmd5ID0gMAp3aGlsZSB3YW5neSA8IGxlbihsaW5rcyk6CiAgICBsaW5rZWQgPSBwYWdlW3dhbmd5XQogICAgaWYgJ0EnIGluIGxpbmtlZDoKICAgICAgICBsaW5rc1swXSA9IGxpbmtzWzBdICsgMQogICAgaWYgJ0InIGluIGxpbmtlZDoKICAgICAgICBsaW5rc1sxXSA9IGxpbmtzWzFdICsgMQogICAgaWYgJ0MnIGluIGxpbmtlZDoKICAgICAgICBsaW5rc1syXSA9IGxpbmtzWzJdICsgMQogICAgaWYgJ0QnIGluIGxpbmtlZDoKICAgICAgICBsaW5rc1szXSA9IGxpbmtzWzNdICsgMQogICAgd2FuZ3kgPSB3YW5neSArIDEKcHJpbnQobGlua3MpCm1vc3QxID0gbGlua3MuaW5kZXgobWF4KGxpbmtzKSkKbW9zdDIgPSBjaHIoKG1vc3QxICsgb3JkKCdBJykpKQpwcmludChtb3N0MikK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第1课比较交换找最大值.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第1课比较交换找最大值.mix new file mode 100644 index 00000000..3b4328d8 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第1课比较交换找最大值.mix @@ -0,0 +1 @@ +num17,19,15,20,19ccLENnumanum0i1WHILETRUELTiccGTnum0iaanum0iiADD1i1最大数为a{}aW1wb3J0IG1hdGgKCgpudW0gPSBbMTcsMTksMTUsMjAsMTldCmNjID0gbGVuKG51bSkKYSA9IG51bVswXQppID0gMQp3aGlsZSBpIDwgY2M6CiAgICBpZiBudW1baV0gPiBhOgogICAgICAgIGEgPSBudW1baV0KICAgIGkgPSBpICsgMQpwcmludCgn5pyA5aSn5pWw5Li6JywgYSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第2课选择排序(未要求代码).mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第2课选择排序(未要求代码).mix new file mode 100644 index 00000000..a46bb53d --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第2课选择排序(未要求代码).mix @@ -0,0 +1 @@ +data64,25,12,22,11,90,88,77,55,33nLENmylistdatai0WHILETRUELTiMINUS1n1maxijADD1i1WHILETRUELTjnGTmylistdata0jmylistdata0maxmaxjjADD1j1NEQmaxiamylistdata0maxmylistdata0max0mylistdata0imylistdata0i0aiADD1i1排序后的数:data{}aW1wb3J0IG1hdGgKCgpkYXRhID0gWzY0LDI1LDEyLDIyLDExLDkwLDg4LDc3LDU1LDMzXQpuID0gbGVuKGRhdGEpCmkgPSAwCndoaWxlIGkgPCBuIC0gMToKICAgIG1heDIgPSBpCiAgICBqID0gaSArIDEKICAgIHdoaWxlIGogPCBuOgogICAgICAgIGlmIGRhdGFbal0gPiBkYXRhW21heDJdOgogICAgICAgICAgICBtYXgyID0gagogICAgICAgIGogPSBqICsgMQogICAgaWYgbWF4MiAhPSBpOgogICAgICAgIGEgPSBkYXRhW21heDJdCiAgICAgICAgZGF0YVttYXgyXSA9IGRhdGFbaV0KICAgICAgICBkYXRhW2ldID0gYQogICAgaSA9IGkgKyAxCnByaW50KCfmjpLluo/lkI7nmoTmlbDvvJonLCBkYXRhKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第4课冒泡排序.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第4课冒泡排序.mix new file mode 100644 index 00000000..dbc1dfa6 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第4课冒泡排序.mix @@ -0,0 +1 @@ +data470,411,589,364,516排序前数据:datanLENmylistdatai0WHILETRUELTiMINUS1n1j0WHILETRUELTjMINUS1MINUS1n1i1GTmylistdata0jmylistdata0ADD1j1amylistdata0jmylistdata0j0mylistdata0ADD1j1mylistdata0ADD1j10ajADD1j1ADD1i1轮遍历:dataiADD1i1排序后数据:data{}aW1wb3J0IG1hdGgKCgpkYXRhID0gWzQ3MCw0MTEsNTg5LDM2NCw1MTZdCnByaW50KCfmjpLluo/liY3mlbDmja7vvJonLCBkYXRhKQpuID0gbGVuKGRhdGEpCmkgPSAwCndoaWxlIGkgPCBuIC0gMToKICAgIGogPSAwCiAgICB3aGlsZSBqIDwgKG4gLSBpKSAtIDE6CiAgICAgICAgaWYgZGF0YVtqXSA+IGRhdGFbKGogKyAxKV06CiAgICAgICAgICAgIGEgPSBkYXRhW2pdCiAgICAgICAgICAgIGRhdGFbal0gPSBkYXRhWyhqICsgMSldCiAgICAgICAgICAgIGRhdGFbKGogKyAxKV0gPSBhCiAgICAgICAgaiA9IGogKyAxCiAgICAgICAgcHJpbnQoJ+esrCcsIGkgKyAxLCAn6L2u6YGN5Y6G77yaJywgZGF0YSkKICAgIGkgPSBpICsgMQpwcmludCgn5o6S5bqP5ZCO5pWw5o2u77yaJywgZGF0YSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第6课用算数求解鸡兔同笼.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第6课用算数求解鸡兔同笼.mix new file mode 100644 index 00000000..de4e3e6b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第6课用算数求解鸡兔同笼.mix @@ -0,0 +1 @@ +aint一共有多少个头:bint一共有多少只脚:cDIVIDE1MINUS1MULTIPLY1a41b2鸡有:intxc兔有:intxMINUS1a4c{}YSA9IGludChpbnB1dCgn5LiA5YWx5pyJ5aSa5bCR5Liq5aS077yaJykpCmIgPSBpbnQoaW5wdXQoJ+S4gOWFseacieWkmuWwkeWPquiEmu+8micpKQpjID0gKGEgKiA0IC0gYikgLyAyCnByaW50KCfpuKHmnInvvJonLCBpbnQoYyksICflj6onKQpwcmludCgn5YWU5pyJ77yaJywgaW50KChhIC0gYykpLCAn5Y+qJykK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第6课遍历求解鸡兔同笼.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第6课遍历求解鸡兔同笼.mix new file mode 100644 index 00000000..b42142d9 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第6课遍历求解鸡兔同笼.mix @@ -0,0 +1 @@ +a35b0WHILETRUEcADD1MULTIPLY1a21MULTIPLY1b4EQc94鸡的数量:a兔的数量:bBREAKaMINUS1a1bADD1b1{}YSA9IDM1CmIgPSAwCndoaWxlIFRydWU6CiAgICBjID0gYSAqIDIgKyBiICogNAogICAgaWYgYyA9PSA5NDoKICAgICAgICBwcmludCgn6bih55qE5pWw6YeP77yaJywgYSkKICAgICAgICBwcmludCgn5YWU55qE5pWw6YeP77yaJywgYikKICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICBhID0gYSAtIDEKICAgICAgICBiID0gYiArIDEK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第7课兔子增长算法.mix b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第7课兔子增长算法.mix new file mode 100644 index 00000000..fad3bb93 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/大同出版社-五年级/下册/第7课兔子增长算法.mix @@ -0,0 +1 @@ +F0,1,1n3WHILETRUELTEn12appendF0F0n0ADD1F0MINUS1n11F0MINUS1n2nADD1n1第12个月的兔子数量是:F12{}RiA9IFswLDEsMV0KbiA9IDMKd2hpbGUgbiA8PSAxMjoKICAgIEYuYXBwZW5kKDApCiAgICBGW25dID0gRlsobiAtIDEpXSArIEZbKG4gLSAyKV0KICAgIG4gPSBuICsgMQpwcmludCgn56ysMTLkuKrmnIjnmoTlhZTlrZDmlbDph4/mmK/vvJonLCBGWzEyXSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/18-2 从物联网服务平台获取数据(python).mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/18-2 从物联网服务平台获取数据(python).mix new file mode 100644 index 00000000..45067f70 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/18-2 从物联网服务平台获取数据(python).mix @@ -0,0 +1 @@ +reponsegethttps://mixio.org/api/v1/getData?user=demo@mixly.org&password=b81e53f441d90152cdfb9731c5db92da&project=通用演示&topic=光照强度&num=10Hellotextreponsemydict{"name":"Mixly","color":"green"}textreponse0,1,2,3mydictdataiHelloi{}aW1wb3J0IHJlcXVlc3RzCmltcG9ydCBqc29uCgoKcmVwb25zZSA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly9taXhpby5vcmcvYXBpL3YxL2dldERhdGE/dXNlcj1kZW1vQG1peGx5Lm9yZyZwYXNzd29yZD1iODFlNTNmNDQxZDkwMTUyY2RmYjk3MzFjNWRiOTJkYSZwcm9qZWN0PemAmueUqOa8lOekuiZ0b3BpYz3lhYnnhaflvLrluqYmbnVtPTEwJykKcHJpbnQocmVwb25zZS50ZXh0KQpteWRpY3QgPSBqc29uLmxvYWRzKHJlcG9uc2UudGV4dCkKZm9yIGkgaW4gbXlkaWN0WydkYXRhJ106CiAgICBwcmludChpKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/18-3 数据处理(python).mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/18-3 数据处理(python).mix new file mode 100644 index 00000000..a7c82d49 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/18-3 数据处理(python).mix @@ -0,0 +1 @@ +reponsegethttps://mixio.org/api/v1/getData?user=demo@mixly.org&password=b81e53f441d90152cdfb9731c5db92da&project=通用演示&topic=光照强度&num=10ttextreponseHellotmydict{"name":"Mixly","color":"green"}tmylistxmydictdata0,1,2,3mylistii0floatidf1mylistdf1Truedf1Hello平均光照:Mixlyxmeandf1columndf1Hello最大光照:Mixlyxtaildf11Hello最小光照:Mixlyxheaddf11Hellodf1GTcolumndf1160.4Hellodf1{}aW1wb3J0IHJlcXVlc3RzCmltcG9ydCBqc29uCmltcG9ydCBwYW5kYXMKCgpyZXBvbnNlID0gcmVxdWVzdHMuZ2V0KCdodHRwczovL21peGlvLm9yZy9hcGkvdjEvZ2V0RGF0YT91c2VyPWRlbW9AbWl4bHkub3JnJnBhc3N3b3JkPWI4MWU1M2Y0NDFkOTAxNTJjZGZiOTczMWM1ZGI5MmRhJnByb2plY3Q96YCa55So5ryU56S6JnRvcGljPeWFieeFp+W8uuW6piZudW09MTAnKQp0ID0gcmVwb25zZS50ZXh0CnByaW50KHQpCm15ZGljdCA9IGpzb24ubG9hZHModCkKbXlsaXN0ID0gbGlzdChteWRpY3RbJ2RhdGEnXSkKZm9yIGkgaW4gbXlsaXN0OgogICAgaVsn5YC8J10gPSBmbG9hdChpWyflgLwnXSkKZGYxID0gcGFuZGFzLkRhdGFGcmFtZShteWxpc3QpCmRmMSA9IGRmMS5zb3J0X3ZhbHVlcyhieT0n5YC8JywgYXNjZW5kaW5nPVRydWUpCnByaW50KCgn5bmz5Z2H5YWJ54Wn77yaJyArIHN0cihkZjFbJ+WAvCddLm1lYW4oKSkpKQpwcmludCgoJ+acgOWkp+WFieeFp++8micgKyBzdHIoZGYxLnRhaWwoMSkpKSkKcHJpbnQoKCfmnIDlsI/lhYnnhafvvJonICsgc3RyKGRmMS5oZWFkKDEpKSkpCnByaW50KGRmMVsoZGYxWyflgLwnXSA+IDE2MC40KV0pCnByaW50KGRmMSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/19-3 数据可视化(python).mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/19-3 数据可视化(python).mix new file mode 100644 index 00000000..96f98014 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/19-3 数据可视化(python).mix @@ -0,0 +1 @@ +reponsegethttps://mixio.org/api/v1/getData?user=demo@mixly.org&password=b81e53f441d90152cdfb9731c5db92da&project=通用演示&topic=光照强度&num=10ttextreponseHellotmydict{"name":"Mixly","color":"green"}tmylistxmydictdatadf1mylistxtimeylightplot1,2,3,4df1时间5,6,7,8df1{}aW1wb3J0IHJlcXVlc3RzCmltcG9ydCBqc29uCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKaW1wb3J0IHBhbmRhcwppbXBvcnQgcHlsYWIKCgpyZXBvbnNlID0gcmVxdWVzdHMuZ2V0KCdodHRwczovL21peGlvLm9yZy9hcGkvdjEvZ2V0RGF0YT91c2VyPWRlbW9AbWl4bHkub3JnJnBhc3N3b3JkPWI4MWU1M2Y0NDFkOTAxNTJjZGZiOTczMWM1ZGI5MmRhJnByb2plY3Q96YCa55So5ryU56S6JnRvcGljPeWFieeFp+W8uuW6piZudW09MTAnKQp0ID0gcmVwb25zZS50ZXh0CnByaW50KHQpCm15ZGljdCA9IGpzb24ubG9hZHModCkKbXlsaXN0ID0gbGlzdChteWRpY3RbJ2RhdGEnXSkKcGx0LmNsYSgpCmRmMSA9IHBhbmRhcy5EYXRhRnJhbWUobXlsaXN0KQpweWxhYi54bGFiZWwoJ3RpbWUnLCBmb250cHJvcGVydGllcyA9ICJTVFNvbmciKQpweWxhYi55bGFiZWwoJ2xpZ2h0JywgZm9udHByb3BlcnRpZXMgPSAiU1RTb25nIikKcHlsYWIucGxvdChkZjFbJ+aXtumXtCddLGRmMVsn5YC8J10pCnB5bGFiLnNob3coKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/22-2 身高记录仪系统分析端(python).mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/22-2 身高记录仪系统分析端(python).mix new file mode 100644 index 00000000..97d36e01 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/22-2 身高记录仪系统分析端(python).mix @@ -0,0 +1 @@ +reponsegethttps://mixio.org/api/v1/getData?user=demo@mixly.org&password=b81e53f441d90152cdfb9731c5db92da&project=%E9%80%9A%E7%94%A8%E6%BC%94%E7%A4%BA&topic=%E5%AD%A6%E7%94%9F%E4%BF%A1%E6%81%AF&num=10Hellotextreponsemydict{"name":"Mixly","color":"green"}textreponsemylistmydictdata0,1,2,3mylistiHellomydicti{}aW1wb3J0IHJlcXVlc3RzCmltcG9ydCBqc29uCgoKcmVwb25zZSA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly9taXhpby5vcmcvYXBpL3YxL2dldERhdGE/dXNlcj1kZW1vQG1peGx5Lm9yZyZwYXNzd29yZD1iODFlNTNmNDQxZDkwMTUyY2RmYjk3MzFjNWRiOTJkYSZwcm9qZWN0PSVFOSU4MCU5QSVFNyU5NCVBOCVFNiVCQyU5NCVFNyVBNCVCQSZ0b3BpYz0lRTUlQUQlQTYlRTclOTQlOUYlRTQlQkYlQTElRTYlODElQUYmbnVtPTEwJykKcHJpbnQocmVwb25zZS50ZXh0KQpteWRpY3QgPSBqc29uLmxvYWRzKHJlcG9uc2UudGV4dCkKbXlsaXN0ID0gbXlkaWN0WydkYXRhJ10KZm9yIGkgaW4gbXlsaXN0OgogICAgcHJpbnQoaVsn5YC8J10pCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/22-22 手速测试仪系统分析端(python).mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/22-22 手速测试仪系统分析端(python).mix new file mode 100644 index 00000000..9464ef79 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/22-22 手速测试仪系统分析端(python).mix @@ -0,0 +1 @@ +reponsegethttps://mixio.mixly.cn/api/v1/getData?user=demo@mixly.org&password=b81e53f441d90152cdfb9731c5db92da&project=%E9%80%9A%E7%94%A8%E6%BC%94%E7%A4%BA&topic=%E5%AD%A6%E7%94%9F%E4%BF%A1%E6%81%AF&num=10Hellotextreponsemydict{"name":"Mixly","color":"green"}textreponsemylistmydictdata0,1,2,3mylistiHellomydicti{}aW1wb3J0IHJlcXVlc3RzCmltcG9ydCBqc29uCgoKcmVwb25zZSA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly9taXhpby5taXhseS5jbi9hcGkvdjEvZ2V0RGF0YT91c2VyPWRlbW9AbWl4bHkub3JnJnBhc3N3b3JkPWI4MWU1M2Y0NDFkOTAxNTJjZGZiOTczMWM1ZGI5MmRhJnByb2plY3Q9JUU5JTgwJTlBJUU3JTk0JUE4JUU2JUJDJTk0JUU3JUE0JUJBJnRvcGljPSVFNSVBRCVBNiVFNyU5NCU5RiVFNCVCRiVBMSVFNiU4MSVBRiZudW09MTAnKQpwcmludChyZXBvbnNlLnRleHQpCm15ZGljdCA9IGpzb24ubG9hZHMocmVwb25zZS50ZXh0KQpteWxpc3QgPSBteWRpY3RbJ2RhdGEnXQpmb3IgaSBpbiBteWxpc3Q6CiAgICBwcmludChpWyflgLwnXSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/9-1 利用HTTP获取互联网中的数据(python).mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/9-1 利用HTTP获取互联网中的数据(python).mix new file mode 100644 index 00000000..fec14a71 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/9-1 利用HTTP获取互联网中的数据(python).mix @@ -0,0 +1 @@ +reponsegethttps://mixio.mixly.cn/api/v1/getData?user=@4DDJ53C9&password=MixIO_public&project=default&topic=%E5%85%89%E7%85%A7&num=10Hellotextreponsemydict{"name":"Mixly","color":"green"}textreponse0,1,2,3mydictdataiHelloi{}aW1wb3J0IHJlcXVlc3RzCmltcG9ydCBqc29uCgoKcmVwb25zZSA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly9taXhpby5taXhseS5jbi9hcGkvdjEvZ2V0RGF0YT91c2VyPUA0RERKNTNDOSZwYXNzd29yZD1NaXhJT19wdWJsaWMmcHJvamVjdD1kZWZhdWx0JnRvcGljPSVFNSU4NSU4OSVFNyU4NSVBNyZudW09MTAnKQpwcmludChyZXBvbnNlLnRleHQpCm15ZGljdCA9IGpzb24ubG9hZHMocmVwb25zZS50ZXh0KQpmb3IgaSBpbiBteWRpY3RbJ2RhdGEnXToKICAgIHByaW50KGkpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/9-2 解析数据(python).mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/9-2 解析数据(python).mix new file mode 100644 index 00000000..5088f5fb --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/八年级/9-2 解析数据(python).mix @@ -0,0 +1 @@ +reponsegethttps://api.seniverse.com/v3/weather/now.json?key=S-aQOUspDKoNviXm6&location=beijing&language=zh-Hans&unit=cmydict{"name":"Mixly","color":"green"}textreponse城市mydictresults0locationname天气mydictresults0nowtext温度mydictresults0nowtemperature城市:城市天气:天气温度:温度{}aW1wb3J0IHJlcXVlc3RzCmltcG9ydCBqc29uCgoKcmVwb25zZSA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly9hcGkuc2VuaXZlcnNlLmNvbS92My93ZWF0aGVyL25vdy5qc29uP2tleT1TLWFRT1VzcERLb052aVhtNiZsb2NhdGlvbj1iZWlqaW5nJmxhbmd1YWdlPXpoLUhhbnMmdW5pdD1jJykKbXlkaWN0ID0ganNvbi5sb2FkcyhyZXBvbnNlLnRleHQpCuWfjuW4giA9IG15ZGljdFsncmVzdWx0cyddWzBdWydsb2NhdGlvbiddWyduYW1lJ10K5aSp5rCUID0gbXlkaWN0WydyZXN1bHRzJ11bMF1bJ25vdyddWyd0ZXh0J10K5rip5bqmID0gbXlkaWN0WydyZXN1bHRzJ11bMF1bJ25vdyddWyd0ZW1wZXJhdHVyZSddCnByaW50KCfln47luILvvJonLCDln47luIIpCnByaW50KCflpKnmsJTvvJonLCDlpKnmsJQpCnByaW50KCfmuKnluqbvvJonLCDmuKnluqYpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第10课.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第10课.mix new file mode 100644 index 00000000..06be21a5 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第10课.mix @@ -0,0 +1 @@ +目标数58WHILETRUEnint猜一个整数:LTn目标数猜小了!请继续。GTn目标数猜大了!请继续。恭喜,猜对了!BREAK{}X0U3XzlCX0FFX0U2X0EwXzg3X0U2Xzk1X0IwID0gNTgKd2hpbGUgVHJ1ZToKICAgIG4gPSBpbnQoaW5wdXQoJ+eMnOS4gOS4quaVtOaVsO+8micpKQogICAgaWYgbiA8IF9FN185Ql9BRV9FNl9BMF84N19FNl85NV9CMDoKICAgICAgICBwcmludCgn54yc5bCP5LqG77yB6K+357un57ut44CCJyxlbmQgPSIiKQogICAgZWxpZiBuID4gX0U3XzlCX0FFX0U2X0EwXzg3X0U2Xzk1X0IwOgogICAgICAgIHByaW50KCfnjJzlpKfkuobvvIHor7fnu6fnu63jgIInLGVuZCA9IiIpCiAgICBlbHNlOgogICAgICAgIHByaW50KCfmga3llpzvvIznjJzlr7nkuobvvIEnLGVuZCA9IiIpCiAgICAgICAgYnJlYWsK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第12课/判断平年与闰年.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第12课/判断平年与闰年.mix new file mode 100644 index 00000000..1340fff8 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第12课/判断平年与闰年.mix @@ -0,0 +1 @@ +yearint请输入一个年份:ANDEQQUYU1year40NEQQUYU1year4100year这是闰年EQQUYU1year4000year这是闰年year这是平年{}eWVhciA9IGludChpbnB1dCgn6K+36L6T5YWl5LiA5Liq5bm05Lu977yaJykpCmlmIHllYXIgJSA0ID09IDAgYW5kIHllYXIgJSA0ICE9IDEwMDoKICAgIHByaW50KHllYXIsICfov5nmmK/pl7DlubQnKQplbGlmIHllYXIgJSA0MDAgPT0gMDoKICAgIHByaW50KHllYXIsICfov5nmmK/pl7DlubQnKQplbHNlOgogICAgcHJpbnQoeWVhciwgJ+i/meaYr+W5s+W5tCcpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第12课/根据输入的气温给出提示.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第12课/根据输入的气温给出提示.mix new file mode 100644 index 00000000..071e4455 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第12课/根据输入的气温给出提示.mix @@ -0,0 +1 @@ +temperaturefloat请输入气温:LTtemperature15今天有点冷,要穿厚一些的衣服LTELTE15xtemperature30今天有点气候宜人,适合穿春秋装今天有点热,要穿薄一些的衣服并适当防晒{}dGVtcGVyYXR1cmUgPSBmbG9hdChpbnB1dCgn6K+36L6T5YWl5rCU5rip77yaJykpCmlmIHRlbXBlcmF0dXJlIDwgMTU6CiAgICBwcmludCgn5LuK5aSp5pyJ54K55Ya377yM6KaB56m/5Y6a5LiA5Lqb55qE6KGj5pyNJyxlbmQgPSIiKQplbGlmIDE1IDw9IHRlbXBlcmF0dXJlIDw9IDMwOgogICAgcHJpbnQoJ+S7iuWkqeacieeCueawlOWAmeWunOS6uu+8jOmAguWQiOepv+aYpeeni+ijhScsZW5kID0iIikKZWxzZToKICAgIHByaW50KCfku4rlpKnmnInngrnng63vvIzopoHnqb/oloTkuIDkupvnmoTooaPmnI3lubbpgILlvZPpmLLmmZInLGVuZCA9IiIpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第12课/购买火车票.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第12课/购买火车票.mix new file mode 100644 index 00000000..991bc382 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第12课/购买火车票.mix @@ -0,0 +1 @@ +nlint请输入乘车人的年龄:GTEnl14nl岁,请购买全价票LTELT6xnl14nl岁,请购买儿童优惠票nl岁,由持票成年人免费携带{}bmwgPSBpbnQoaW5wdXQoJ+ivt+i+k+WFpeS5mOi9puS6uueahOW5tOm+hO+8micpKQppZiBubCA+PSAxNDoKICAgIHByaW50KG5sLCAn5bKB77yM6K+36LSt5Lmw5YWo5Lu356WoJykKZWxpZiA2IDw9IG5sIDwgMTQ6CiAgICBwcmludChubCwgJ+Wyge+8jOivt+i0reS5sOWEv+erpeS8mOaDoOelqCcpCmVsc2U6CiAgICBwcmludChubCwgJ+Wyge+8jOeUseaMgeelqOaIkOW5tOS6uuWFjei0ueaQuuW4picpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/从1数到100.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/从1数到100.mix new file mode 100644 index 00000000..bad4b09a --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/从1数到100.mix @@ -0,0 +1 @@ +c1WHILETRUELTEc100HellocADDac1{}YyA9IDEKd2hpbGUgYyA8PSAxMDA6CiAgICBwcmludChjLGVuZCA9IiIpCiAgICBjICs9IDEK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/数数.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/数数.mix new file mode 100644 index 00000000..fc45f64f --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/数数.mix @@ -0,0 +1 @@ +starti0trueiADD1i1GTEMINUS11start1end开始时间18029start开始时间18029end经历时间MINUS1end1start{}aW1wb3J0IHRpbWUKaW1wb3J0IGRhdGF0aW1lCgoKc3RhcnQgPSB0aW1lLnRpbWUoKQppID0gMAp3aGlsZSBUcnVlOgogICAgaSA9IGkgKyAxCiAgICBpZiAodGltZS50aW1lKCkgLSBzdGFydCA+PSAxKToKICAgICAgICBicmVhawplbmQgPSB0aW1lLnRpbWUoKQpwcmludCgn5byA5aeL5pe26Ze0JywgZGF0YXRpbWUuZGF0YXRpbWUuZnJvbXRpbWVzdGFtcChzdGFydCkpCnByaW50KCflvIDlp4vml7bpl7QnLCBkYXRhdGltZS5kYXRhdGltZS5mcm9tdGltZXN0YW1wKGVuZCkpCnByaW50KCfnu4/ljobml7bpl7QnLCBlbmQgLSBzdGFydCkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/输出1-n的所有偶数.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/输出1-n的所有偶数.mix new file mode 100644 index 00000000..9c1dd752 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/输出1-n的所有偶数.mix @@ -0,0 +1 @@ +nint请输入自然数n:c2WHILETRUELTEcnHellocADDac2{}biA9IGludChpbnB1dCgn6K+36L6T5YWl6Ieq54S25pWwbu+8micpKQpjID0gMgp3aGlsZSBjIDw9IG46CiAgICBwcmludChjLGVuZCA9IiIpCiAgICBjICs9IDIK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/输出1-n能被5整除的数.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/输出1-n能被5整除的数.mix new file mode 100644 index 00000000..cd347ab7 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第13课/输出1-n能被5整除的数.mix @@ -0,0 +1 @@ +nint请输入自然数n:c1WHILETRUELTEcnEQQUYU1c50HellocADDac1{}biA9IGludChpbnB1dCgn6K+36L6T5YWl6Ieq54S25pWwbu+8micpKQpjID0gMQp3aGlsZSBjIDw9IG46CiAgICBpZiBjICUgNSA9PSAwOgogICAgICAgIHByaW50KGMsZW5kID0iIikKICAgIGMgKz0gMQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第15课/三位密码锁.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第15课/三位密码锁.mix new file mode 100644 index 00000000..c73bd69b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第15课/三位密码锁.mix @@ -0,0 +1 @@ +0,1,2,30101i0,1,2,30101ji3j{}Zm9yIGkgaW4gcmFuZ2UoMCwgMTAsIDEpOgogICAgZm9yIGogaW4gcmFuZ2UoMCwgMTAsIDEpOgogICAgICAgIHByaW50KGksICczJywgaikK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第15课/找到所有水仙花数.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第15课/找到所有水仙花数.mix new file mode 100644 index 00000000..69709dd0 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第15课/找到所有水仙花数.mix @@ -0,0 +1 @@ +0,1,2,30101i0,1,2,30101j0,1,2,30101kEQADD1ADD1MULTIPLY1i1001MULTIPLY1j101kADD1ADD1POWER1i31POWER1j31POWER1k1i3j{}Zm9yIGkgaW4gcmFuZ2UoMCwgMTAsIDEpOgogICAgZm9yIGogaW4gcmFuZ2UoMCwgMTAsIDEpOgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIDEwLCAxKToKICAgICAgICAgICAgaWYgKGkgKiAxMDAgKyBqICogMTApICsgayA9PSAoaSAqKiAzICsgaiAqKiAzKSArIGsgKiogMToKICAgICAgICAgICAgICAgIHByaW50KGksICczJywgaikK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第15课/破解时间估算.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第15课/破解时间估算.mix new file mode 100644 index 00000000..0252f80c --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第15课/破解时间估算.mix @@ -0,0 +1 @@ +tint请输入密码每一位符号种类数:starti0WHILETRUELTMINUS11start1iADD1i1end本机用时:MINUS1end1start秒, 一共能数数inPOWER1t6密码的字符组合共nsecintDIVIDE1n1iminu4.8DIVIDE1sec602hour4.8DIVIDE1minu602用枚举法破解需要sec{}aW1wb3J0IHRpbWUKCgp0ID0gaW50KGlucHV0KCfor7fovpPlhaXlr4bnoIHmr4/kuIDkvY3nrKblj7fnp43nsbvmlbDvvJonKSkKc3RhcnQgPSB0aW1lLnRpbWUoKQppID0gMAp3aGlsZSB0aW1lLnRpbWUoKSAtIHN0YXJ0IDwgMToKICAgIGkgPSBpICsgMQplbmQgPSB0aW1lLnRpbWUoKQpwcmludCgn5pys5py655So5pe277yaJywgZW5kIC0gc3RhcnQsICfnp5IsIOS4gOWFseiDveaVsOaVsCcsIGksICfkuKonKQpuID0gdCAqKiA2CnByaW50KCflr4bnoIHnmoTlrZfnrKbnu4TlkIjlhbEnLCBuLCAn56eNJykKc2VjID0gaW50KChuIC8gaSkpCm1pbnUgPSByb3VuZChzZWMgLyA2MCwgMikKaG91ciA9IHJvdW5kKG1pbnUgLyA2MCwgMikKcHJpbnQoJ+eUqOaemuS4vuazleegtOino+mcgOimgScsIHNlYywgJ+enkicpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第16课/找出最大数.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第16课/找出最大数.mix new file mode 100644 index 00000000..d5419d57 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第16课/找出最大数.mix @@ -0,0 +1 @@ +box24,91,42,108,35ccLENmylistboxamylistbox0i1WHILETRUELTiccGTmylistboxiaamylistboxiADDai1最大数为:a{}aW1wb3J0IG1hdGgKCgpib3ggPSBbMjQsOTEsNDIsMTA4LDM1XQpjYyA9IGxlbihib3gpCmEgPSBib3hbMF0KaSA9IDEKd2hpbGUgaSA8IGNjOgogICAgaWYgYm94W2ldID4gYToKICAgICAgICBhID0gYm94W2ldCiAgICBpICs9IDEKcHJpbnQoJ+acgOWkp+aVsOS4uu+8micsIGEpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第16课/找出最小数.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第16课/找出最小数.mix new file mode 100644 index 00000000..a08fbfd0 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第16课/找出最小数.mix @@ -0,0 +1 @@ +box24,91,42,108,35ccLENmylistboxamylistbox0i1WHILETRUEGTiccGTmylistboxiaamylistboxiADDai1最小数为:a{}aW1wb3J0IG1hdGgKCgpib3ggPSBbMjQsOTEsNDIsMTA4LDM1XQpjYyA9IGxlbihib3gpCmEgPSBib3hbMF0KaSA9IDEKd2hpbGUgaSA+IGNjOgogICAgaWYgYm94W2ldID4gYToKICAgICAgICBhID0gYm94W2ldCiAgICBpICs9IDEKcHJpbnQoJ+acgOWwj+aVsOS4uu+8micsIGEpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第17课/从大到小的选择排序.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第17课/从大到小的选择排序.mix new file mode 100644 index 00000000..04aa281b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第17课/从大到小的选择排序.mix @@ -0,0 +1 @@ +data64,25,12,22,11,90,88,77,55,33nLENmylistdatai0WHILETRUELTiMINUS1n1maxijADD1i1WHILETRUELTjnGTmylistdata0jmylistdata0maxmaxjjADD1j1NEQmaxiamylistdata0maxmylistdata0max0mylistdata0imylistdata0i0aiADD1i1排序后的数:data{}aW1wb3J0IG1hdGgKCgpkYXRhID0gWzY0LDI1LDEyLDIyLDExLDkwLDg4LDc3LDU1LDMzXQpuID0gbGVuKGRhdGEpCmkgPSAwCndoaWxlIGkgPCBuIC0gMToKICAgIG1heDIgPSBpCiAgICBqID0gaSArIDEKICAgIHdoaWxlIGogPCBuOgogICAgICAgIGlmIGRhdGFbal0gPiBkYXRhW21heDJdOgogICAgICAgICAgICBtYXgyID0gagogICAgICAgIGogPSBqICsgMQogICAgaWYgbWF4MiAhPSBpOgogICAgICAgIGEgPSBkYXRhW21heDJdCiAgICAgICAgZGF0YVttYXgyXSA9IGRhdGFbaV0KICAgICAgICBkYXRhW2ldID0gYQogICAgaSA9IGkgKyAxCnByaW50KCfmjpLluo/lkI7nmoTmlbDvvJonLCBkYXRhKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第17课/排序.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第17课/排序.mix new file mode 100644 index 00000000..ed2ecc34 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第17课/排序.mix @@ -0,0 +1 @@ +data64,25,12,22,11,90,88,77,55,33dataNUMERIC1dataHellodata{}ZnJvbSBtaXhweSBpbXBvcnQgbGlzdHNfc29ydAoKCmRhdGEgPSBbNjQsMjUsMTIsMjIsMTEsOTAsODgsNzcsNTUsMzNdCmRhdGEgPSBsaXN0c19zb3J0KGRhdGEsICJOVU1FUklDIiwgRmFsc2UpCnByaW50KGRhdGEsZW5kID0iIikK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第19课/冒泡排序(for循环).mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第19课/冒泡排序(for循环).mix new file mode 100644 index 00000000..17c1c6ff --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第19课/冒泡排序(for循环).mix @@ -0,0 +1 @@ +data62,3,25,129,311,93,88,156,72,29,336,858,168,108,27排序前数据:datanLENmylistdatai0WHILETRUELTiMINUS1n1j0WHILETRUELTjMINUS1MINUS1n1i1GTmylistdata0jmylistdata0ADD1j1amylistdata0jmylistdata0j0mylistdata0ADD1j1mylistdata0ADD1j10ajADD1j1ADD1i1轮遍历:dataiADD1i1排序后数据:data{}aW1wb3J0IG1hdGgKCgpkYXRhID0gWzYyLDMsMjUsMTI5LDMxMSw5Myw4OCwxNTYsNzIsMjksMzM2LDg1OCwxNjgsMTA4LDI3XQpwcmludCgn5o6S5bqP5YmN5pWw5o2u77yaJywgZGF0YSkKbiA9IGxlbihkYXRhKQppID0gMAp3aGlsZSBpIDwgbiAtIDE6CiAgICBqID0gMAogICAgd2hpbGUgaiA8IChuIC0gaSkgLSAxOgogICAgICAgIGlmIGRhdGFbal0gPiBkYXRhWyhqICsgMSldOgogICAgICAgICAgICBhID0gZGF0YVtqXQogICAgICAgICAgICBkYXRhW2pdID0gZGF0YVsoaiArIDEpXQogICAgICAgICAgICBkYXRhWyhqICsgMSldID0gYQogICAgICAgIGogPSBqICsgMQogICAgICAgIHByaW50KCfnrKwnLCBpICsgMSwgJ+i9rumBjeWOhu+8micsIGRhdGEpCiAgICBpID0gaSArIDEKcHJpbnQoJ+aOkuW6j+WQjuaVsOaNru+8micsIGRhdGEpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第19课/冒泡排序.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第19课/冒泡排序.mix new file mode 100644 index 00000000..e72dc37c --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第19课/冒泡排序.mix @@ -0,0 +1 @@ +xmmpxnLENmylistlb0,1,2,305n1i0,1,2,305MINUS1MINUS1n1i11jjGTmylistlb0jmylistlb0ADD1j1lsmylistlb0jmylistlb0j0mylistlb0ADD1j1mylistlb0ADD1j10lsADD1i1轮遍历:lblblb67,156,72,99,336,168,108,27排序前数据:lbpxlblb排序后数据:pxlb{}aW1wb3J0IG1hdGgKCmRlZiBtbXB4KHgpOgogICAgbiA9IGxlbihsYikKICAgIGZvciBpIGluIHJhbmdlKDAsIG4sIDEpOgogICAgICAgIGZvciBqIGluIHJhbmdlKDAsIChuIC0gaSkgLSAxLCAxKToKICAgICAgICAgICAgaWYgbGJbal0gPiBsYlsoaiArIDEpXToKICAgICAgICAgICAgICAgIGxzID0gbGJbal0KICAgICAgICAgICAgICAgIGxiW2pdID0gbGJbKGogKyAxKV0KICAgICAgICAgICAgICAgIGxiWyhqICsgMSldID0gbHMKICAgICAgICAgICAgcHJpbnQoJ+esrCcsIGkgKyAxLCAn6L2u6YGN5Y6G77yaJywgbGIpCiAgICByZXR1cm4gbGIKCgoKbGIgPSBbNjcsMTU2LDcyLDk5LDMzNiwxNjgsMTA4LDI3XQpwcmludCgn5o6S5bqP5YmN5pWw5o2u77yaJywgbGIpCnB4bGIgPSBtbXB4KGxiKQpwcmludCgn5o6S5bqP5ZCO5pWw5o2u77yaJywgcHhsYikK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第21课.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第21课.mix new file mode 100644 index 00000000..4fc0054c --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第21课.mix @@ -0,0 +1 @@ +a35b0WHILETRUEcADD1MULTIPLY1a21MULTIPLY1b4EQc94鸡的数量:a兔的数量:bBREAKaMINUS1a1bADD1b1{}YSA9IDM1CmIgPSAwCndoaWxlIFRydWU6CiAgICBjID0gYSAqIDIgKyBiICogNAogICAgaWYgYyA9PSA5NDoKICAgICAgICBwcmludCgn6bih55qE5pWw6YeP77yaJywgYSkKICAgICAgICBwcmludCgn5YWU55qE5pWw6YeP77yaJywgYikKICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICBhID0gYSAtIDEKICAgICAgICBiID0gYiArIDEK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第23课.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第23课.mix new file mode 100644 index 00000000..d2893673 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第23课.mix @@ -0,0 +1 @@ +F0,1,1n3WHILETRUELTEn12appendF0F0n0ADD1F0MINUS1n11F0MINUS1n2nADD1n1第12个月的兔子数量是:F12{}RiA9IFswLDEsMV0KbiA9IDMKd2hpbGUgbiA8PSAxMjoKICAgIEYuYXBwZW5kKDApCiAgICBGW25dID0gRlsobiAtIDEpXSArIEZbKG4gLSAyKV0KICAgIG4gPSBuICsgMQpwcmludCgn56ysMTLkuKrmnIjnmoTlhZTlrZDmlbDph4/mmK/vvJonLCBGWzEyXSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第3课.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第3课.mix new file mode 100644 index 00000000..ef0fc70d --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第3课.mix @@ -0,0 +1 @@ +xynabcmoveHelloHelloxMixly-->Mixlyyint输入汉诺塔层数:ABChanoiEQn1acMINUS1n1acbacMINUS1n1bac{}ZGVmIG1vdmUoeCwgeSk6CiAgICBwcmludCgoeCArICgnLS0+JyArIHkpKSkKCmRlZiBoYW5vaShuLCBhLCBiLCBjKToKICAgIGlmIG4gPT0gMToKICAgICAgICBtb3ZlKGEsIGMpCiAgICBlbHNlOgogICAgICAgIGhhbm9pKG4gLSAxLCBhLCBjLCBiKQogICAgICAgIG1vdmUoYSwgYykKICAgICAgICBoYW5vaShuIC0gMSwgYiwgYSwgYykKCgoKaGFub2koaW50KGlucHV0KCfovpPlhaXmsYnor7rloZTlsYLmlbDvvJonKSksICdBJywgJ0InLCAnQycpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/买水果算价格.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/买水果算价格.mix new file mode 100644 index 00000000..6977d0b0 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/买水果算价格.mix @@ -0,0 +1 @@ +afloat输入苹果的质量:bfloat输入香蕉的质量:cMULTIPLYa8.5dMULTIPLYb12.5eADDcd总金额:e{}YSA9IGZsb2F0KGlucHV0KCfovpPlhaXoi7nmnpznmoTotKjph4/vvJonKSkKYiA9IGZsb2F0KGlucHV0KCfovpPlhaXpppnolYnnmoTotKjph4/vvJonKSkKYyA9IGEgKiA4LjUKZCA9IGIgKiAxMi41CmUgPSBjICsgZApwcmludCgn5oC76YeR6aKd77yaJywgZSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/公园购票.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/公园购票.mix new file mode 100644 index 00000000..f5924bea --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/公园购票.mix @@ -0,0 +1 @@ +heightint请输入身高(厘米):LTheight120身高为height厘米,可以购买半价票,5元身高为height厘米,可以购买全价票,10元{}aGVpZ2h0ID0gaW50KGlucHV0KCfor7fovpPlhaXouqvpq5jvvIjljpjnsbPvvInvvJonKSkKaWYgaGVpZ2h0IDwgMTIwOgogICAgcHJpbnQoJ+i6q+mrmOS4uicsIGhlaWdodCwgJ+WOmOexs++8jOWPr+S7pei0reS5sOWNiuS7t+elqO+8jDXlhYMnKQplbHNlOgogICAgcHJpbnQoJ+i6q+mrmOS4uicsIGhlaWdodCwgJ+WOmOexs++8jOWPr+S7pei0reS5sOWFqOS7t+elqO+8jDEw5YWDJykK \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/比较两个数并输出较小数.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/比较两个数并输出较小数.mix new file mode 100644 index 00000000..37ed7626 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/比较两个数并输出较小数.mix @@ -0,0 +1 @@ +aint输入自然数a:bint输入自然数b:LTEabcacb两个数中的最小数是:c{}YSA9IGludChpbnB1dCgn6L6T5YWl6Ieq54S25pWwYTonKSkKYiA9IGludChpbnB1dCgn6L6T5YWl6Ieq54S25pWwYjonKSkKaWYgYSA8PSBiOgogICAgYyA9IGEKZWxzZToKICAgIGMgPSBiCnByaW50KCfkuKTkuKrmlbDkuK3nmoTmnIDlsI/mlbDmmK/vvJonLCBjKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/温度转换.mix b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/温度转换.mix new file mode 100644 index 00000000..e4aa4d74 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/examples/教学指南米思齐修订版/六年级/第8课/温度转换.mix @@ -0,0 +1 @@ +华氏温度float请输入一个华氏温度的值:摄氏温度DIVIDE1MULTIPLY58.5MINUS1华氏温度329对应的摄氏温度为:摄氏温度{}5Y2O5rCP5rip5bqmID0gZmxvYXQoaW5wdXQoJ+ivt+i+k+WFpeS4gOS4quWNjuawj+a4qeW6pueahOWAvO+8micpKQrmkYTmsI/muKnluqYgPSAoNSAqICjljY7msI/muKnluqYgLSAzMikpIC8gOQpwcmludCgn5a+55bqU55qE5pGE5rCP5rip5bqm5Li677yaJywg5pGE5rCP5rip5bqmKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/origin/media/webpy.png b/mixly/boards/default_src/python_pyodide/origin/media/webpy.png new file mode 100644 index 00000000..ce0e40cd Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/media/webpy.png differ diff --git a/mixly/boards/default_src/python_pyodide/origin/media/webpy0.png b/mixly/boards/default_src/python_pyodide/origin/media/webpy0.png new file mode 100644 index 00000000..14da1b69 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/media/webpy0.png differ diff --git a/mixly/boards/default_src/python_pyodide/origin/teachableModel/group1-shard1of3.bin b/mixly/boards/default_src/python_pyodide/origin/teachableModel/group1-shard1of3.bin new file mode 100644 index 00000000..1ec46e46 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/teachableModel/group1-shard1of3.bin differ diff --git a/mixly/boards/default_src/python_pyodide/origin/teachableModel/group1-shard2of3.bin b/mixly/boards/default_src/python_pyodide/origin/teachableModel/group1-shard2of3.bin new file mode 100644 index 00000000..8e4e48d2 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/teachableModel/group1-shard2of3.bin differ diff --git a/mixly/boards/default_src/python_pyodide/origin/teachableModel/group1-shard3of3.bin b/mixly/boards/default_src/python_pyodide/origin/teachableModel/group1-shard3of3.bin new file mode 100644 index 00000000..ee27b467 Binary files /dev/null and b/mixly/boards/default_src/python_pyodide/origin/teachableModel/group1-shard3of3.bin differ diff --git a/mixly/boards/default_src/python_pyodide/origin/teachableModel/model.json b/mixly/boards/default_src/python_pyodide/origin/teachableModel/model.json new file mode 100644 index 00000000..157cbfe1 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/origin/teachableModel/model.json @@ -0,0 +1,7096 @@ +{ + "weightsManifest": [ + { + "paths": [ + "group1-shard1of3.bin", + "group1-shard2of3.bin", + "group1-shard3of3.bin" + ], + "weights": [ + { + "dtype": "float32", + "shape": [], + "name": "module_apply_default/hub_input/Mul/y" + }, + { + "dtype": "float32", + "shape": [], + "name": "module_apply_default/hub_input/Sub/y" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 3, + 32 + ], + "name": "module/MobilenetV2/Conv/weights" + }, + { + "dtype": "float32", + "shape": [ + 32 + ], + "name": "module_apply_default/MobilenetV2/Conv/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 32, + 1 + ], + "name": "module/MobilenetV2/expanded_conv/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 32 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 32, + 16 + ], + "name": "module/MobilenetV2/expanded_conv/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 16 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 16, + 96 + ], + "name": "module/MobilenetV2/expanded_conv_1/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 96 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_1/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 96, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_1/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 96 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_1/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 96, + 24 + ], + "name": "module/MobilenetV2/expanded_conv_1/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 24 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_1/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 24, + 144 + ], + "name": "module/MobilenetV2/expanded_conv_2/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 144 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_2/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 144, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_2/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 144 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_2/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 144, + 24 + ], + "name": "module/MobilenetV2/expanded_conv_2/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 24 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_2/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 24, + 144 + ], + "name": "module/MobilenetV2/expanded_conv_3/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 144 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_3/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 144, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_3/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 144 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_3/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 144, + 32 + ], + "name": "module/MobilenetV2/expanded_conv_3/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 32 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_3/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 32, + 192 + ], + "name": "module/MobilenetV2/expanded_conv_4/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 192 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_4/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 192, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_4/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 192 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_4/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 192, + 32 + ], + "name": "module/MobilenetV2/expanded_conv_4/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 32 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_4/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 32, + 192 + ], + "name": "module/MobilenetV2/expanded_conv_5/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 192 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_5/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 192, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_5/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 192 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_5/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 192, + 32 + ], + "name": "module/MobilenetV2/expanded_conv_5/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 32 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_5/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 32, + 192 + ], + "name": "module/MobilenetV2/expanded_conv_6/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 192 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_6/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 192, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_6/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 192 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_6/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 192, + 64 + ], + "name": "module/MobilenetV2/expanded_conv_6/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 64 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_6/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 64, + 384 + ], + "name": "module/MobilenetV2/expanded_conv_7/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 384 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_7/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 384, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_7/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 384 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_7/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 384, + 64 + ], + "name": "module/MobilenetV2/expanded_conv_7/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 64 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_7/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 64, + 384 + ], + "name": "module/MobilenetV2/expanded_conv_8/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 384 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_8/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 384, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_8/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 384 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_8/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 384, + 64 + ], + "name": "module/MobilenetV2/expanded_conv_8/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 64 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_8/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 64, + 384 + ], + "name": "module/MobilenetV2/expanded_conv_9/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 384 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_9/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 384, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_9/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 384 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_9/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 384, + 64 + ], + "name": "module/MobilenetV2/expanded_conv_9/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 64 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_9/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 64, + 384 + ], + "name": "module/MobilenetV2/expanded_conv_10/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 384 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_10/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 384, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_10/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 384 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_10/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 384, + 96 + ], + "name": "module/MobilenetV2/expanded_conv_10/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 96 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_10/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 96, + 576 + ], + "name": "module/MobilenetV2/expanded_conv_11/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 576 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_11/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 576, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_11/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 576 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_11/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 576, + 96 + ], + "name": "module/MobilenetV2/expanded_conv_11/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 96 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_11/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 96, + 576 + ], + "name": "module/MobilenetV2/expanded_conv_12/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 576 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_12/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 576, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_12/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 576 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_12/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 576, + 96 + ], + "name": "module/MobilenetV2/expanded_conv_12/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 96 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_12/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 96, + 576 + ], + "name": "module/MobilenetV2/expanded_conv_13/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 576 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_13/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 576, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_13/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 576 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_13/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 576, + 160 + ], + "name": "module/MobilenetV2/expanded_conv_13/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 160 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_13/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 160, + 960 + ], + "name": "module/MobilenetV2/expanded_conv_14/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 960 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_14/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 960, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_14/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 960 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_14/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 960, + 160 + ], + "name": "module/MobilenetV2/expanded_conv_14/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 160 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_14/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 160, + 960 + ], + "name": "module/MobilenetV2/expanded_conv_15/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 960 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_15/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 960, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_15/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 960 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_15/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 960, + 160 + ], + "name": "module/MobilenetV2/expanded_conv_15/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 160 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_15/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 160, + 960 + ], + "name": "module/MobilenetV2/expanded_conv_16/expand/weights" + }, + { + "dtype": "float32", + "shape": [ + 960 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_16/expand/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 3, + 3, + 960, + 1 + ], + "name": "module/MobilenetV2/expanded_conv_16/depthwise/depthwise_weights" + }, + { + "dtype": "float32", + "shape": [ + 960 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_16/depthwise/depthwise_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 960, + 320 + ], + "name": "module/MobilenetV2/expanded_conv_16/project/weights" + }, + { + "dtype": "float32", + "shape": [ + 320 + ], + "name": "module_apply_default/MobilenetV2/expanded_conv_16/project/Conv2D_bn_offset" + }, + { + "dtype": "float32", + "shape": [ + 1, + 1, + 320, + 1280 + ], + "name": "module/MobilenetV2/Conv_1/weights" + }, + { + "dtype": "float32", + "shape": [ + 1280 + ], + "name": "module_apply_default/MobilenetV2/Conv_1/Conv2D_bn_offset" + } + ] + } + ], + "modelTopology": { + "node": [ + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "shape": { + "shape": { + "dim": [ + { + "size": "-1" + }, + { + "size": "224" + }, + { + "size": "224" + }, + { + "size": "3" + } + ] + } + } + }, + "name": "images", + "op": "Placeholder" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": {} + } + } + }, + "name": "module_apply_default/hub_input/Mul/y", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": {} + } + } + }, + "name": "module_apply_default/hub_input/Sub/y", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "32" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/Conv/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "32" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/Conv/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "32" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "32" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "32" + }, + { + "size": "16" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "16" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "16" + }, + { + "size": "96" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_1/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "96" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_1/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "96" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_1/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "96" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_1/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "96" + }, + { + "size": "24" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_1/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "24" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_1/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "24" + }, + { + "size": "144" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_2/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "144" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_2/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "144" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_2/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "144" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_2/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "144" + }, + { + "size": "24" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_2/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "24" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_2/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "24" + }, + { + "size": "144" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_3/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "144" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_3/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "144" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_3/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "144" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_3/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "144" + }, + { + "size": "32" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_3/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "32" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_3/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "32" + }, + { + "size": "192" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_4/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "192" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_4/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "192" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_4/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "192" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_4/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "192" + }, + { + "size": "32" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_4/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "32" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_4/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "32" + }, + { + "size": "192" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_5/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "192" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_5/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "192" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_5/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "192" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_5/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "192" + }, + { + "size": "32" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_5/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "32" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_5/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "32" + }, + { + "size": "192" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_6/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "192" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_6/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "192" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_6/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "192" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_6/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "192" + }, + { + "size": "64" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_6/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "64" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_6/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "64" + }, + { + "size": "384" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_7/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "384" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_7/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "384" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_7/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "384" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_7/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "384" + }, + { + "size": "64" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_7/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "64" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_7/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "64" + }, + { + "size": "384" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_8/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "384" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_8/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "384" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_8/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "384" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_8/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "384" + }, + { + "size": "64" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_8/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "64" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_8/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "64" + }, + { + "size": "384" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_9/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "384" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_9/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "384" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_9/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "384" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_9/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "384" + }, + { + "size": "64" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_9/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "64" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_9/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "64" + }, + { + "size": "384" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_10/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "384" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_10/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "384" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_10/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "384" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_10/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "384" + }, + { + "size": "96" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_10/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "96" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_10/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "96" + }, + { + "size": "576" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_11/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "576" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_11/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "576" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_11/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "576" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_11/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "576" + }, + { + "size": "96" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_11/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "96" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_11/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "96" + }, + { + "size": "576" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_12/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "576" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_12/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "576" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_12/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "576" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_12/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "576" + }, + { + "size": "96" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_12/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "96" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_12/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "96" + }, + { + "size": "576" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_13/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "576" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_13/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "576" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_13/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "576" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_13/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "576" + }, + { + "size": "160" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_13/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "160" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_13/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "160" + }, + { + "size": "960" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_14/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "960" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_14/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "960" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_14/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "960" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_14/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "960" + }, + { + "size": "160" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_14/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "160" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_14/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "160" + }, + { + "size": "960" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_15/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "960" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_15/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "960" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_15/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "960" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_15/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "960" + }, + { + "size": "160" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_15/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "160" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_15/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "160" + }, + { + "size": "960" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_16/expand/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "960" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_16/expand/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "3" + }, + { + "size": "3" + }, + { + "size": "960" + }, + { + "size": "1" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_16/depthwise/depthwise_weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "960" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_16/depthwise/depthwise_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "960" + }, + { + "size": "320" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/expanded_conv_16/project/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "320" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_16/project/Conv2D_bn_offset", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1" + }, + { + "size": "1" + }, + { + "size": "320" + }, + { + "size": "1280" + } + ] + } + } + } + }, + "name": "module/MobilenetV2/Conv_1/weights", + "op": "Const" + }, + { + "attr": { + "dtype": { + "type": "DT_FLOAT" + }, + "value": { + "tensor": { + "dtype": "DT_FLOAT", + "tensorShape": { + "dim": [ + { + "size": "1280" + } + ] + } + } + } + }, + "name": "module_apply_default/MobilenetV2/Conv_1/Conv2D_bn_offset", + "op": "Const" + }, + { + "input": [ + "images", + "module_apply_default/hub_input/Mul/y" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/hub_input/Mul", + "op": "Mul" + }, + { + "input": [ + "module_apply_default/hub_input/Mul", + "module_apply_default/hub_input/Sub/y" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/hub_input/Sub", + "op": "Sub" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/hub_input/Sub", + "module/MobilenetV2/Conv/weights", + "module_apply_default/MobilenetV2/Conv/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "2", + "2", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/Conv/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/Conv/Relu6", + "module/MobilenetV2/expanded_conv/depthwise/depthwise_weights" + ], + "attr": { + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "padding": { + "s": "U0FNRQ==" + }, + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv/depthwise/depthwise_bn_offset" + ], + "attr": { + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv/depthwise/Relu6", + "module/MobilenetV2/expanded_conv/project/weights", + "module_apply_default/MobilenetV2/expanded_conv/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv/project/BatchNorm/FusedBatchNorm", + "module/MobilenetV2/expanded_conv_1/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_1/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_1/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_1/expand/Relu6", + "module/MobilenetV2/expanded_conv_1/depthwise/depthwise_weights" + ], + "attr": { + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "strides": { + "list": { + "i": [ + "1", + "2", + "2", + "1" + ] + } + }, + "padding": { + "s": "U0FNRQ==" + }, + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_1/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_1/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_1/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_1/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_1/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_1/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_1/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_1/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_1/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_1/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_1/project/BatchNorm/FusedBatchNorm", + "module/MobilenetV2/expanded_conv_2/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_2/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_2/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_2/expand/Relu6", + "module/MobilenetV2/expanded_conv_2/depthwise/depthwise_weights" + ], + "attr": { + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_2/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_2/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_2/depthwise/depthwise_bn_offset" + ], + "attr": { + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_2/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_2/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_2/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_2/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_2/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_2/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_2/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_1/project/BatchNorm/FusedBatchNorm", + "module_apply_default/MobilenetV2/expanded_conv_2/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_2/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_2/add", + "module/MobilenetV2/expanded_conv_3/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_3/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_3/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_3/expand/Relu6", + "module/MobilenetV2/expanded_conv_3/depthwise/depthwise_weights" + ], + "attr": { + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "2", + "2", + "1" + ] + } + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_3/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_3/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_3/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_3/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_3/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_3/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_3/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_3/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_3/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_3/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_3/project/BatchNorm/FusedBatchNorm", + "module/MobilenetV2/expanded_conv_4/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_4/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_4/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_4/expand/Relu6", + "module/MobilenetV2/expanded_conv_4/depthwise/depthwise_weights" + ], + "attr": { + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_4/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_4/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_4/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_4/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_4/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_4/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_4/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_4/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_4/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_4/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_3/project/BatchNorm/FusedBatchNorm", + "module_apply_default/MobilenetV2/expanded_conv_4/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_4/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_4/add", + "module/MobilenetV2/expanded_conv_5/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_5/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_5/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_5/expand/Relu6", + "module/MobilenetV2/expanded_conv_5/depthwise/depthwise_weights" + ], + "attr": { + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "padding": { + "s": "U0FNRQ==" + }, + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_5/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_5/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_5/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_5/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_5/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_5/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_5/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_5/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_5/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_5/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_4/add", + "module_apply_default/MobilenetV2/expanded_conv_5/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_5/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_5/add", + "module/MobilenetV2/expanded_conv_6/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_6/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_6/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_6/expand/Relu6", + "module/MobilenetV2/expanded_conv_6/depthwise/depthwise_weights" + ], + "attr": { + "padding": { + "s": "U0FNRQ==" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + }, + "strides": { + "list": { + "i": [ + "1", + "2", + "2", + "1" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_6/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_6/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_6/depthwise/depthwise_bn_offset" + ], + "attr": { + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_6/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_6/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_6/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_6/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_6/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_6/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_6/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_6/project/BatchNorm/FusedBatchNorm", + "module/MobilenetV2/expanded_conv_7/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_7/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_7/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_7/expand/Relu6", + "module/MobilenetV2/expanded_conv_7/depthwise/depthwise_weights" + ], + "attr": { + "padding": { + "s": "U0FNRQ==" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_7/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_7/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_7/depthwise/depthwise_bn_offset" + ], + "attr": { + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_7/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_7/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_7/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_7/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_7/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_7/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_7/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_6/project/BatchNorm/FusedBatchNorm", + "module_apply_default/MobilenetV2/expanded_conv_7/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_7/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_7/add", + "module/MobilenetV2/expanded_conv_8/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_8/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_8/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_8/expand/Relu6", + "module/MobilenetV2/expanded_conv_8/depthwise/depthwise_weights" + ], + "attr": { + "padding": { + "s": "U0FNRQ==" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_8/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_8/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_8/depthwise/depthwise_bn_offset" + ], + "attr": { + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_8/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_8/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_8/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_8/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_8/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_8/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_8/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_7/add", + "module_apply_default/MobilenetV2/expanded_conv_8/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_8/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_8/add", + "module/MobilenetV2/expanded_conv_9/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_9/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_9/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_9/expand/Relu6", + "module/MobilenetV2/expanded_conv_9/depthwise/depthwise_weights" + ], + "attr": { + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_9/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_9/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_9/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_9/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_9/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_9/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_9/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_9/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_9/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_9/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_8/add", + "module_apply_default/MobilenetV2/expanded_conv_9/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_9/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_9/add", + "module/MobilenetV2/expanded_conv_10/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_10/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_10/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_10/expand/Relu6", + "module/MobilenetV2/expanded_conv_10/depthwise/depthwise_weights" + ], + "attr": { + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_10/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_10/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_10/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_10/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_10/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_10/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_10/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_10/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_10/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_10/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_10/project/BatchNorm/FusedBatchNorm", + "module/MobilenetV2/expanded_conv_11/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_11/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_11/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_11/expand/Relu6", + "module/MobilenetV2/expanded_conv_11/depthwise/depthwise_weights" + ], + "attr": { + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "padding": { + "s": "U0FNRQ==" + }, + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_11/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_11/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_11/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_11/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_11/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_11/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_11/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_11/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_11/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_11/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_10/project/BatchNorm/FusedBatchNorm", + "module_apply_default/MobilenetV2/expanded_conv_11/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_11/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_11/add", + "module/MobilenetV2/expanded_conv_12/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_12/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_12/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_12/expand/Relu6", + "module/MobilenetV2/expanded_conv_12/depthwise/depthwise_weights" + ], + "attr": { + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_12/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_12/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_12/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_12/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_12/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_12/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_12/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_12/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_12/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_12/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_11/add", + "module_apply_default/MobilenetV2/expanded_conv_12/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_12/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_12/add", + "module/MobilenetV2/expanded_conv_13/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_13/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_13/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_13/expand/Relu6", + "module/MobilenetV2/expanded_conv_13/depthwise/depthwise_weights" + ], + "attr": { + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "strides": { + "list": { + "i": [ + "1", + "2", + "2", + "1" + ] + } + }, + "padding": { + "s": "U0FNRQ==" + }, + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_13/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_13/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_13/depthwise/depthwise_bn_offset" + ], + "attr": { + "data_format": { + "s": "TkhXQw==" + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_13/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_13/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_13/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_13/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_13/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_13/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_13/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_13/project/BatchNorm/FusedBatchNorm", + "module/MobilenetV2/expanded_conv_14/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_14/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_14/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_14/expand/Relu6", + "module/MobilenetV2/expanded_conv_14/depthwise/depthwise_weights" + ], + "attr": { + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_14/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_14/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_14/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_14/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_14/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_14/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_14/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_14/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_14/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_14/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_13/project/BatchNorm/FusedBatchNorm", + "module_apply_default/MobilenetV2/expanded_conv_14/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_14/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_14/add", + "module/MobilenetV2/expanded_conv_15/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_15/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_15/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_15/expand/Relu6", + "module/MobilenetV2/expanded_conv_15/depthwise/depthwise_weights" + ], + "attr": { + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_15/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_15/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_15/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_15/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_15/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_15/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_15/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_15/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_15/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_15/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_14/add", + "module_apply_default/MobilenetV2/expanded_conv_15/project/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_15/add", + "op": "Add" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_15/add", + "module/MobilenetV2/expanded_conv_16/expand/weights", + "module_apply_default/MobilenetV2/expanded_conv_16/expand/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_16/expand/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_16/expand/Relu6", + "module/MobilenetV2/expanded_conv_16/depthwise/depthwise_weights" + ], + "attr": { + "padding": { + "s": "U0FNRQ==" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_16/depthwise/depthwise", + "op": "DepthwiseConv2dNative" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_16/depthwise/depthwise", + "module_apply_default/MobilenetV2/expanded_conv_16/depthwise/depthwise_bn_offset" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_16/depthwise/BatchNorm/FusedBatchNorm", + "op": "BiasAdd" + }, + { + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_16/depthwise/BatchNorm/FusedBatchNorm" + ], + "attr": { + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_16/depthwise/Relu6", + "op": "Relu6" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_16/depthwise/Relu6", + "module/MobilenetV2/expanded_conv_16/project/weights", + "module_apply_default/MobilenetV2/expanded_conv_16/project/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/expanded_conv_16/project/BatchNorm/FusedBatchNorm", + "op": "_FusedConv2D" + }, + { + "device": "/device:CPU:0", + "input": [ + "module_apply_default/MobilenetV2/expanded_conv_16/project/BatchNorm/FusedBatchNorm", + "module/MobilenetV2/Conv_1/weights", + "module_apply_default/MobilenetV2/Conv_1/Conv2D_bn_offset" + ], + "attr": { + "explicit_paddings": { + "list": {} + }, + "epsilon": { + "f": 0.0 + }, + "data_format": { + "s": "TkhXQw==" + }, + "use_cudnn_on_gpu": { + "b": true + }, + "padding": { + "s": "U0FNRQ==" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "num_args": { + "i": "1" + }, + "T": { + "type": "DT_FLOAT" + }, + "dilations": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "fused_ops": { + "list": { + "s": [ + "Qmlhc0FkZA==", + "UmVsdTY=" + ] + } + } + }, + "name": "module_apply_default/MobilenetV2/Conv_1/Relu6", + "op": "_FusedConv2D" + }, + { + "input": [ + "module_apply_default/MobilenetV2/Conv_1/Relu6" + ], + "attr": { + "padding": { + "s": "VkFMSUQ=" + }, + "strides": { + "list": { + "i": [ + "1", + "1", + "1", + "1" + ] + } + }, + "ksize": { + "list": { + "i": [ + "1", + "7", + "7", + "1" + ] + } + }, + "T": { + "type": "DT_FLOAT" + }, + "data_format": { + "s": "TkhXQw==" + } + }, + "name": "module_apply_default/MobilenetV2/Logits/AvgPool", + "op": "AvgPool" + }, + { + "input": [ + "module_apply_default/MobilenetV2/Logits/AvgPool" + ], + "attr": { + "squeeze_dims": { + "list": { + "i": [ + "1", + "2" + ] + } + }, + "T": { + "type": "DT_FLOAT" + } + }, + "name": "module_apply_default/hub_output/feature_vector/SpatialSqueeze", + "op": "Squeeze" + } + ], + "library": {}, + "versions": {} + }, + "generatedBy": "1.14.0", + "convertedBy": "TensorFlow.js Converter v1.2.10.1", + "format": "graph-model" +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/filesystem-file-tree.js b/mixly/boards/default_src/python_pyodide/others/filesystem-file-tree.js new file mode 100644 index 00000000..098f7f8e --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/filesystem-file-tree.js @@ -0,0 +1,45 @@ +import * as path from 'path'; +import { FileTree, Debug } from 'mixly'; +import FileSystemFS from './filesystem-fs'; + + +export default class FileSystemFileTree extends FileTree { + constructor() { + super(new FileSystemFS()); + } + + async readFolder(inPath) { + let output = []; + try { + const fs = this.getFS(); + const status = await fs.isDirectory(inPath); + if (!status) { + return output; + } + const children = await fs.readDirectory(inPath); + for (let data of children) { + const dataPath = path.join(inPath, data); + const isDirectory = await fs.isDirectory(dataPath); + if (isDirectory) { + const isDirEmpty = await fs.isDirectoryEmpty(dataPath); + output.push({ + type: 'folder', + id: dataPath, + children: !isDirEmpty, + title: `/${this.getRootFolderName()}${dataPath}` + }); + } else { + output.push({ + type: 'file', + id: dataPath, + children: false, + title: `/${this.getRootFolderName()}${dataPath}` + }); + } + } + } catch (error) { + Debug.error(error); + } + return output; + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/filesystem-fs.js b/mixly/boards/default_src/python_pyodide/others/filesystem-fs.js new file mode 100644 index 00000000..4e974afa --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/filesystem-fs.js @@ -0,0 +1,129 @@ +import { WebAccessFS } from '@zenfs/dom'; +import { get, set } from 'idb-keyval'; +import { FS } from 'mixly'; + + +class WebAccessFSExt extends WebAccessFS { + constructor(handle) { + super(handle); + } + + async readFile(path) { + const handle = await this.getHandle(path); + if (handle instanceof window.FileSystemFileHandle) { + const file = await handle.getFile(); + const text = await file.text(); + return text; + } + return ''; + } +} + + +export default class FileSystemFS extends FS { + #fs_ = null; + #encoder_ = new TextEncoder(); + + constructor() { + super(); + } + + async showDirectoryPicker() { + const directoryHandle = await window.showDirectoryPicker({ mode: 'readwrite' }); + const permissionStatus = await directoryHandle.requestPermission({ mode: 'readwrite' }); + if (permissionStatus !== 'granted') { + throw new Error('readwrite access to directory not granted'); + } + await this.setFSCache(directoryHandle); + this.#fs_ = new WebAccessFSExt(directoryHandle); + return directoryHandle; + } + + async loadFS() { + let directoryHandle = await this.getFSCache(); + if (!directoryHandle) { + return null; + } + const permissionStatus = await directoryHandle.requestPermission({ mode: 'readwrite' }); + if (permissionStatus !== 'granted') { + throw new Error('readwrite access to directory not granted'); + } + this.#fs_ = new WebAccessFSExt(directoryHandle); + return directoryHandle; + } + + async getFSCache() { + return get('mixly-pyodide-fs'); + } + + async setFSCache(data) { + await set('mixly-pyodide-fs', data); + } + + async createFile(filePath) { + return this.#fs_.createFile(filePath, ''); + } + + async readFile(path) { + return this.#fs_.readFile(path); + } + + async writeFile(path, data) { + const encodedArray = this.#encoder_.encode(data); + return this.#fs_.writeFile(path, encodedArray); + } + + async isFile(path) { + const stats = await this.#fs_.stat(path); + if (stats && stats.mode === 33279) { + return true; + } + return false; + } + + async renameFile(oldFilePath, newFilePath) { + return await this.#fs_.rename(oldFilePath, newFilePath); + } + + async moveFile(oldFilePath, newFilePath) { + return this.renameFile(oldFilePath, newFilePath); + } + + async deleteFile(filePath) { + return this.#fs_.unlink(filePath); + } + + async createDirectory(folderPath) { + return this.#fs_.mkdir(folderPath, 0o777); + } + + async readDirectory(path) { + const result = await this.#fs_.readdir(path); + return result; + } + + async isDirectory(path) { + const stats = await this.#fs_.stat(path); + if (stats && stats.mode === 16895) { + return true; + } + return false; + } + + async isDirectoryEmpty(path) { + const result = await this.readDirectory(path); + return !result?.length; + } + + async renameDirectory(oldFolderPath, newFolderPath) { + return this.#fs_.rename(oldFolderPath, newFolderPath); + } + + async moveDirectory(oldFolderPath, newFolderPath) { + return this.#fs_.rename(oldFolderPath, newFolderPath); + } + + async deleteDirectory(folderPath) { + return this.#fs_.rmdir(folderPath); + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/loader.js b/mixly/boards/default_src/python_pyodide/others/loader.js new file mode 100644 index 00000000..17f70cb7 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/loader.js @@ -0,0 +1,333 @@ +import NavExt from './nav-ext'; +import * as tf from '@tensorflow/tfjs'; +import './tensorflow'; +import './sound.js'; + +import * as Blockly from 'blockly/core'; +NavExt.init(); +window.tf = tf; + +// let featureExtractor; +// featureExtractor = await tf.loadGraphModel("../common/media/tfmodel/model.json"); +// window.featureExtractor = featureExtractor; + +function closeModal() { + document.getElementById('modalOverlay').style.display = 'none'; +} + +// 从IndexedDB删除单个模型 +async function deleteModel(modelName) { + try { + await tf.io.removeModel(`indexeddb://${modelName}`); + // 从UI移除 + const modelItem = document.querySelector(`.model-item[data-model-name="${modelName}"]`); + if (modelItem) modelItem.remove(); + } catch (error) { + console.error('删除模型失败:', error); + alert('删除模型失败: ' + error.message); + } +} + +// 显示单个模型项 +function displayModelItem(modelName) { + const modelsList = document.getElementById('imported-models'); + if ([...modelsList.children].some(item => item.dataset.modelName === modelName)) { + return; + } + const modelItem = document.createElement('div'); + modelItem.className = 'model-item'; + modelItem.dataset.modelName = modelName; + modelItem.innerHTML = ` +
+ ${modelName} + +
+ `; + + // 绑定删除事件 + modelItem.querySelector('.delete-model').addEventListener('click', () => { + deleteModel(modelName); + }); + + modelsList.appendChild(modelItem); +} + +// 清空所有模型 +async function clearAllModels() { + try { + const modelInfos = await tf.io.listModels(); + const deletePromises = Object.keys(modelInfos) + .map(path => path.replace('indexeddb://', '')) + .map(modelName => tf.io.removeModel(`indexeddb://${modelName}`)); + + await Promise.all(deletePromises); + document.getElementById('imported-models').innerHTML = ''; + } catch (error) { + console.error('清空模型失败:', error); + alert('清空模型失败: ' + error.message); + } +} + +// 加载并显示所有模型 +async function loadAndDisplayAllModels() { + try { + const modelInfos = await tf.io.listModels(); + document.getElementById('imported-models').innerHTML = ''; + for (const [path] of Object.entries(modelInfos)) { + const modelName = path.replace('indexeddb://', ''); + displayModelItem(modelName); + } + } catch (error) { + console.error('加载模型列表失败:', error); + } +} + +async function createModal() { + const overlay = document.createElement('div'); + overlay.id = 'modalOverlay'; + Object.assign(overlay.style, { + display: 'none', + position: 'fixed', + top: '0', + left: '0', + width: '100%', + height: '100%', + backgroundColor: 'rgba(0,0,0,0.5)', + zIndex: '20011216', + pointerEvents: 'auto' + }); + const content = document.createElement('div'); + Object.assign(content.style, { + backgroundColor: 'white', + width: '60%', + maxHeight: '80%', + margin: '12vh auto', + padding: '20px 30px', + borderRadius: '12px' + }); + content.innerHTML = ` +

选择本地模型

+
+ + +
+ 导入模型名称: + + +
+
+
+ ❌ 模型结构描述文件(model.json) + +
未选择
+
+
+ ❌ 权重文件(model.weights.bin) +
0 个已选择
+
+
+
+
+
+

已导入模型

+
+ + +
+
+
+
加载中...
+
+
+
+ +
+
+ `; + overlay.appendChild(content); + document.body.appendChild(overlay); + + content.querySelector('.close-btn').addEventListener('click', closeModal); + overlay.addEventListener('click', (e) => { + if (e.target === overlay) closeModal(); + }); + // 获取DOM元素 + const modelUpload = document.getElementById('model-upload'); + const modelHandle = document.getElementById('model-handle'); + const outputDiv = document.getElementById('output'); + + let jsonFile = null; + let weightFiles = []; + + modelUpload.addEventListener('change', async (event) => { + const files = event.target.files; + + // 获取状态元素 + const jsonStatus = document.getElementById('json-status'); + const weightsStatus = document.getElementById('weights-status'); + + // 重置状态显示(保持完整文件名描述) + jsonStatus.querySelector('span').textContent = '❌ 模型结构描述文件(model.json)'; + jsonStatus.querySelector('div').textContent = '未选择'; + weightsStatus.querySelector('span').textContent = '❌ 权重文件(model.weights.bin)'; + weightsStatus.querySelector('div').textContent = '0 个已选择'; + + // 分离 JSON 和权重文件 + weightFiles = []; + for (let i = 0; i < files.length; i++) { + if (files[i].name.endsWith('.json')) { + jsonFile = files[i]; + } else { + weightFiles.push(files[i]); + } + } + + if (!jsonFile) { + alert('未找到 model.json 文件'); + return; + } + + outputDiv.innerHTML = '正在处理上传的模型文件...'; + + if (jsonFile) { + jsonStatus.querySelector('span').textContent = '✅ 模型结构描述文件(model.json)'; + jsonStatus.querySelector('div').textContent = '已选择'; + const modelName = jsonFile.name.replace('.json', ''); + document.getElementById('model-name').value = modelName; + } + + if (weightFiles.length > 0) { + weightsStatus.querySelector('span').textContent = '✅ 权重文件(model.weights.bin)'; + weightsStatus.querySelector('div').textContent = `${weightFiles.length} 个已选择`; + } + }); + + modelHandle.addEventListener('click', async () => { + try { + const modelNameInput = document.getElementById('model-name'); + const modelName = modelNameInput.value || 'mixly-model'; + + const model = await tf.loadLayersModel( + tf.io.browserFiles([jsonFile, ...weightFiles]) + ); + await model.save(`indexeddb://${modelName}`); + loadAndDisplayAllModels(); + outputDiv.innerHTML = `模型已成功保存为 ${modelName}!`; + } catch (error) { + outputDiv.innerHTML = `保存模型出错: ${error.message}`; + console.error(error); + } + }) + + content.querySelector('#refresh-models').addEventListener('click', loadAndDisplayAllModels); + content.querySelector('#clear-models').addEventListener('click', async () => { + if (confirm('确定要删除所有模型吗?此操作不可恢复!')) { + await clearAllModels(); + } + }); +} + +createModal(); + +// 使用立即执行的异步函数,避免 top-level await 导致模块异步加载 +(async () => { + await loadAndDisplayAllModels(); +})(); + +function openModal() { + loadAndDisplayAllModels(); + document.getElementById('modalOverlay').style.display = 'block'; +} + +const workspace = Blockly.getMainWorkspace(); +workspace.registerButtonCallback('handleModels', function () { + openModal(); +}); + + +async function prepare_qmyixtxi(imgTensor) { + let net = null; + + if (window.featureExtractor) { + net = window.featureExtractor; + } else { + net = await tf.loadGraphModel("../common/media/tfmodel/model.json"); + window.featureExtractor = net; + } + const preprocessedImg = imgTensor + .resizeBilinear([224, 224]) + .toFloat() + .div(tf.scalar(127.5)) + .sub(tf.scalar(1)) + .expandDims(0); + + const features = window.featureExtractor.predict(preprocessedImg); + + let activation = features; + return activation; +} +window.prepare_qmyixtxi = prepare_qmyixtxi; diff --git a/mixly/boards/default_src/python_pyodide/others/nav-ext.js b/mixly/boards/default_src/python_pyodide/others/nav-ext.js new file mode 100644 index 00000000..d8f0b7e0 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/nav-ext.js @@ -0,0 +1,43 @@ +import { app, Nav, Debug } from 'mixly'; +import * as Blockly from 'blockly/core'; +import PythonShell from './python-shell'; + +const NavExt = {}; + +NavExt.init = async function () { + const nav = app.getNav(); + + nav.register({ + icon: 'icon-play-circled', + title: '', + id: 'python-run-btn', + displayText: Blockly.Msg.MSG['run'], + preconditionFn: () => { + return true; + }, + callback: () => { + PythonShell.run().catch(Debug.error); + }, + scopeType: Nav.Scope.LEFT, + weight: 4 + }); + + nav.register({ + icon: 'icon-cancel', + title: '', + id: 'python-stop-btn', + displayText: Blockly.Msg.MSG['stop'], + preconditionFn: () => { + return true; + }, + callback: () => { + PythonShell.stop().catch(Debug.error); + }, + scopeType: Nav.Scope.LEFT, + weight: 5 + }); + + await PythonShell.init(); +} + +export default NavExt; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/pixi-sprite.js b/mixly/boards/default_src/python_pyodide/others/pixi-sprite.js new file mode 100644 index 00000000..8d2d0e6b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/pixi-sprite.js @@ -0,0 +1,664 @@ +import PIXI from 'pixi.js'; +import $ from 'jquery'; + + +const mixlySprite = { + stage: new PIXI.Container(), + pointer: { x: 0, y: 0 }, + backgroundSprite: null, + sprites: {}, + texts: {}, + counter: 0, + keys: {}, + state: false, + running: false, + repeatPlay: () => { }, + + displayTag: false, + processingDisplayEvent: null, + + successDisplayEvents: [], + successProcessingDisplayEvents: [], + + startTime: performance.now(), + timer: 0, + lastFrameTime: null, + lastSecond: null, + targetFPS: 60, + frameCount: 0, + currentFPS: 60, + + canvasHeight: 450, + canvasWidth: 800 +}; + +mixlySprite.gameLoop = () => { + if (mixlySprite.state == true) { + mixlySprite.repeatPlay(); + mixlySprite.gameLoopDisplay(); + } + mixlySprite.timer = performance.now() - mixlySprite.startTime; +} +mixlySprite.animate = (currentTime) => { + const deltaTime = currentTime - mixlySprite.lastFrameTime; + + if (deltaTime >= 1000 / mixlySprite.targetFPS) { + mixlySprite.frameCount++; + mixlySprite.gameLoop(); + mixlySprite.renderer.render(mixlySprite.stage); + mixlySprite.lastFrameTime = currentTime; + } + if (currentTime - mixlySprite.lastSecond >= 1000) { + mixlySprite.currentFPS = mixlySprite.frameCount; + mixlySprite.frameCount = 0; + mixlySprite.lastSecond = currentTime; + } + requestAnimationFrame(mixlySprite.animate); +} + +mixlySprite.createBackground = (img, mode = 0) => { + var player; + if (mode == 0) { + // eslint-disable-next-line new-cap + player = new PIXI.Sprite.fromImage(`../common/media/spriteimg/${img}.png`); + } + player.name = 'background'; + player.anchor.set(0.5); + player.x = mixlySprite.canvasWidth / 2; + player.y = mixlySprite.canvasHeight / 2; + + // const $canvas = $('#spriteContainer canvas'); + // const canvasWidth = $canvas.width(); + // const canvasHeight = $canvas.height(); + // player.width = ($('body').width() / 2); + // player.height = ($('body').width() / 2)/canvasWidth*canvasHeight; + + player.width = mixlySprite.canvasWidth; + player.height = mixlySprite.canvasHeight; + + player.interactive = true; + player.buttonMode = true; + player.isDown = false; + player.isUp = true; + player.on('mousedown', function () { + this.isDown = true; + this.isUp = false; + if (mixlySprite.state) this.runningMouseDown(); + }) + .on('mouseup', function () { + this.isDown = false; + this.isUp = true; + }) + .on('mouseupoutside', function () { + this.isDown = false; + this.isUp = true; + }); + player.runningMouseDown = new Function(""); + if (mixlySprite.backgroundSprite && mixlySprite.backgroundSprite.parent) { + // 如果子节点已经在父节点中,需要先移除 + mixlySprite.stage.removeChild(mixlySprite.backgroundSprite); + } + mixlySprite.backgroundSprite = player; + mixlySprite.stage.addChildAt(mixlySprite.backgroundSprite, 0); + return 0; +} + +mixlySprite.createASprite = (img, x = mixlySprite.canvasWidth / 2, y = mixlySprite.canvasHeight / 2, name = '', mode = 0) => { + if (name == '') { + name = 'sprite' + (++mixlySprite.counter); + } + var player; + if (mode == 0) { + // eslint-disable-next-line new-cap + player = new PIXI.Sprite.fromImage(`../common/media/spriteimg/${img}.png`); + } + if (!mixlySprite.sprites[name] && !mixlySprite.texts[name]) { + player.name = name; + player.anchor.set(0.5); + player.x = x; + player.y = y; + player.interactive = true; + player.buttonMode = true; + player.isDown = false; + player.isUp = true; + player.on('mousedown', function (event) { + this.isDown = true; + this.isUp = false; + if (!mixlySprite.state) { + this.data = event.data; + this.alpha = 0.5; + this.dragging = true; + } else this.runningMouseDown(); + }) + .on('mouseup', function () { + this.isDown = false; + this.isUp = true; + if (!mixlySprite.state) { + this.alpha = 1; + this.dragging = false; + this.data = null; + } + }) + .on('mouseupoutside', function () { + this.isDown = false; + this.isUp = true; + if (!mixlySprite.state) { + this.alpha = 1; + this.dragging = false; + this.data = null; + } + }) + .on('mousemove', function () { + if (!mixlySprite.state) + if (this.dragging) { + var newPosition = this.data.getLocalPosition(this.parent); + this.position.x = newPosition.x; + this.position.y = newPosition.y; + } + }) + player.runningMouseDown = new Function(""); + player.show = function () { + this.visible = true; + }; + player.hide = function () { + this.visible = false; + }; + player.enlarge = function (s) { + const ratio = this.height / this.width; + var measure = Math.sqrt(this.height * this.width); + measure += s; + this.width = Math.sqrt(measure * measure / ratio); + this.height = this.width * ratio; + }; + player.enlargeTo = function (s) { + var ratio = this.height / this.width; + this.width = Math.sqrt(s * s / ratio); + this.height = this.width * ratio; + }; + + player.expandTo = async function (s, time = 1) { + if (mixlySprite.running) { + mixlySprite.displayTag = true; + mixlySprite.processingDisplayEvent = { + sprite: this, + targetS: s, + totalTime: time * 1000, + startTime: performance.now(), + displayType: 'expand' + }; + + var prom = new Promise((resolve) => { + if (mixlySprite.displayTag === false) { + resolve(); + } else { + const checkTagInterval = setInterval(() => { + if (mixlySprite.displayTag === false) { + clearInterval(checkTagInterval); + resolve(); + } + }, 10); + } + }); + return await prom; + } + mixlySprite.successProcessingDisplayEvents.push({ + sprite: this, + targetS: s, + totalTime: time * 1000, + startTime: performance.now(), + displayType: 'expand' + }); + return 0; + }; + + player.move = function (step) { + this.x += step * Math.cos(this.rotation); + this.y += step * Math.sin(this.rotation); + }; + player.moveTo = function (x, y) { + this.x = x; + this.y = y; + }; + player.slideTo = async function (x, y, time = 1) { + if (mixlySprite.running) { + mixlySprite.displayTag = true; + mixlySprite.processingDisplayEvent = { + sprite: this, + targetX: x, + targetY: y, + totalTime: time * 1000, + startTime: performance.now(), + displayType: 'slide' + }; + + var prom = new Promise((resolve) => { + const checkTagInterval = setInterval(() => { + if (mixlySprite.displayTag === false) { + clearInterval(checkTagInterval); + resolve(); + } + }, 10); + }); + + return await prom; + } + mixlySprite.successProcessingDisplayEvents.push({ + sprite: this, + targetX: x, + targetY: y, + totalTime: time * 1000, + startTime: performance.now(), + displayType: 'slide' + }); + return 0; + }; + player.addX = function (step) { + this.x += step; + }; + player.addY = function (step) { + this.y += step; + }; + player.rotate = function (degree) { + this.rotation += Math.PI / 180 * degree; + }; + player.rotateTo = function (degree) { + this.rotation = Math.PI / 180 * degree; + }; + player.circleTo = async function (degree, time = 1) { + if (mixlySprite.running) { + mixlySprite.displayTag = true; + mixlySprite.processingDisplayEvent = { + sprite: this, + targetDegree: degree, + totalTime: time * 1000, + startTime: performance.now(), + displayType: 'circle' + }; + var prom = new Promise((resolve) => { + if (mixlySprite.displayTag === false) { + resolve(); + } else { + const checkTagInterval = setInterval(() => { + if (mixlySprite.displayTag === false) { + clearInterval(checkTagInterval); + resolve(); + } + }, 10); + } + }); + return await prom; + } + mixlySprite.successProcessingDisplayEvents.push({ + sprite: this, + targetDegree: degree, + totalTime: time * 1000, + startTime: performance.now(), + displayType: 'circle' + }); + return 0; + }; + player.hit = function (sprite) { + return mixlySprite.hitTestRectangle(this, sprite); + }; + player.outOfScreen = function () { + return this.y >= mixlySprite.renderer.height || this.y <= 0 || this.x <= 0 || this.x >= mixlySprite.renderer.width; + }; + player.mouseAction = function (func) { + this.runningMouseDown = func; + }; + + // new + player.setScale = function (h = 0, w = 0) { + if (h == 0) h = this.height; + if (w == 0) w = this.width; + this.height = h; + this.width = w; + } + player.filterGray = function () { + const grayscaleFilter = new PIXI.filters.ColorMatrixFilter(); + grayscaleFilter.blackAndWhite(); + this.filters = [grayscaleFilter]; + } + player.filterBrighter = function () { + const brightnessFilter = new PIXI.filters.ColorMatrixFilter(); + brightnessFilter.brightness(1.25); // 增加亮度 + this.filters = [brightnessFilter]; + } + player.filterOrigin = function () { + this.filters = null; + } + + mixlySprite.stage.addChild(player); + mixlySprite.sprites[name] = player; + } + return name; +} + +mixlySprite.clearAllSprites = () => { + if (mixlySprite.backgroundSprite && mixlySprite.backgroundSprite.parent) mixlySprite.backgroundSprite.parent.removeChild(mixlySprite.backgroundSprite); + for (const name in mixlySprite.sprites) { + mixlySprite.sprites[name].parent.removeChild(mixlySprite.sprites[name]); + delete mixlySprite.sprites[name]; + } + for (const name in mixlySprite.texts) { + mixlySprite.texts[name].parent.removeChild(mixlySprite.texts[name]); + delete mixlySprite.texts[name]; + } + mixlySprite.counter = 0; + mixlySprite.clearTimer(); + return 0; +} + +mixlySprite.createText = (text, x = mixlySprite.canvasWidth / 2, y = mixlySprite.canvasHeight / 2, name = '') => { + if (name == '') { + name = 'text' + (++mixlySprite.counter); + } + if (!mixlySprite.sprites[name] && !mixlySprite.texts[name]) { + var textObj = new PIXI.Text(text); + textObj.name = name; + textObj.x = x; + textObj.y = y; + textObj.interactive = true; + textObj.buttonMode = true; + textObj.on('mousedown', function (event) { + this.isDown = true; + this.isUp = false; + if (!mixlySprite.state) { + this.data = event.data; + this.alpha = 0.5; + this.dragging = true; + } else this.runningMouseDown(); + }) + .on('mouseup', function () { + this.isDown = false; + this.isUp = true; + if (!mixlySprite.state) { + this.alpha = 1; + this.dragging = false; + this.data = null; + } + }) + .on('mouseupoutside', function () { + this.isDown = false; + this.isUp = true; + if (!mixlySprite.state) { + this.alpha = 1; + this.dragging = false; + this.data = null; + } + }) + .on('mousemove', function () { + if (!mixlySprite.state) + if (this.dragging) { + var newPosition = this.data.getLocalPosition(this.parent); + this.position.x = newPosition.x; + this.position.y = newPosition.y; + } + }); + textObj.runningMouseDown = new Function(""); + textObj.changeText = function (text) { + this.text = text; + }; + textObj.show = function () { + this.visible = true; + }; + textObj.hide = function () { + this.visible = false; + }; + mixlySprite.stage.addChild(textObj); + mixlySprite.texts[name] = textObj; + } + return name; +} + +mixlySprite.hitTestRectangle = (r1, r2) => { + let hit, combinedHalfWidths, combinedHalfHeights, vx, vy; + hit = false; + r1.centerX = r1.x + r1.width / 2; + r1.centerY = r1.y + r1.height / 2; + r2.centerX = r2.x + r2.width / 2; + r2.centerY = r2.y + r2.height / 2; + r1.halfWidth = r1.width / 2; + r1.halfHeight = r1.height / 2; + r2.halfWidth = r2.width / 2; + r2.halfHeight = r2.height / 2; + vx = r1.centerX - r2.centerX; + vy = r1.centerY - r2.centerY; + combinedHalfWidths = r1.halfWidth + r2.halfWidth; + combinedHalfHeights = r1.halfHeight + r2.halfHeight; + if (Math.abs(vx) < combinedHalfWidths) { + if (Math.abs(vy) < combinedHalfHeights) { + hit = true; + } else { + hit = false; + } + } else { + hit = false; + } + return hit; +}; + +mixlySprite.repeat = (func) => { + mixlySprite.repeatPlay = func; +} + +mixlySprite.isKeyboardHit = (keyvalue) => { + if (!mixlySprite.keys[keyvalue]) { + let key = mixlySprite.keyboard(keyvalue); + mixlySprite.keys[keyvalue] = key; + } + return mixlySprite.keys[keyvalue].isDown; +} + +mixlySprite.keyboardListener = (keyvalue, func) => { + if (!mixlySprite.keys[keyvalue]) { + let key = mixlySprite.keyboard(keyvalue); + key.press = function () { + if (mixlySprite.state) func(); + }; + mixlySprite.keys[keyvalue] = key; + } else { + mixlySprite.keys[keyvalue].press = function () { + if (mixlySprite.state) func(); + }; + } +} +mixlySprite.keyboard = (value) => { + let key = {}; + key.value = value; + key.isDown = false; + key.isUp = true; + key.press = undefined; + key.release = undefined; + key.downHandler = event => { + if (event.key === key.value) { + if (key.isUp && key.press) key.press(); + key.isDown = true; + key.isUp = false; + event.preventDefault(); + } + }; + key.upHandler = event => { + if (event.key === key.value) { + if (key.isDown && key.release) key.release(); + key.isDown = false; + key.isUp = true; + event.preventDefault(); + } + }; + const downListener = key.downHandler.bind(key); + const upListener = key.upHandler.bind(key); + window.addEventListener( + "keydown", downListener, false + ); + window.addEventListener( + "keyup", upListener, false + ); + key.unsubscribe = () => { + window.removeEventListener("keydown", downListener); + window.removeEventListener("keyup", upListener); + }; + return key; +} + +mixlySprite.clearTimer = () => { + mixlySprite.startTime = performance.now(); +} + +mixlySprite.gameLoopDisplay = () => { + if (mixlySprite.processingDisplayEvent) { + const pSE = mixlySprite.processingDisplayEvent; + switch (pSE.displayType) { + case 'slide': + if (performance.now() >= pSE.totalTime + pSE.startTime) { + pSE.sprite.moveTo(pSE.targetX, pSE.targetY); + mixlySprite.displayTag = false; + mixlySprite.processingDisplayEvent = null; + } else { + var leftLoops = mixlySprite.currentFPS * (pSE.totalTime + pSE.startTime - performance.now()) / 1000; + if (leftLoops >= 1) { + pSE.sprite.addX((pSE.targetX - pSE.sprite.x) / leftLoops); + pSE.sprite.addY((pSE.targetY - pSE.sprite.y) / leftLoops); + } + } + break; + case 'expand': + if (performance.now() >= pSE.totalTime + pSE.startTime) { + pSE.sprite.enlargeTo(pSE.targetS); + mixlySprite.displayTag = false; + mixlySprite.processingDisplayEvent = null; + } else { + var leftLoops = mixlySprite.currentFPS * (pSE.totalTime + pSE.startTime - performance.now()) / 1000; + if (leftLoops >= 1) { + pSE.sprite.enlarge((pSE.targetS - Math.sqrt(pSE.sprite.height * pSE.sprite.width)) / leftLoops); + } + } + break; + case 'circle': + if (performance.now() >= pSE.totalTime + pSE.startTime) { + pSE.sprite.rotateTo(pSE.targetDegree); + mixlySprite.displayTag = false; + mixlySprite.processingDisplayEvent = null; + } else { + var leftLoops = mixlySprite.currentFPS * (pSE.totalTime + pSE.startTime - performance.now()) / 1000; + if (leftLoops >= 1) { + pSE.sprite.rotate((pSE.targetDegree - pSE.sprite.rotation * 180 / Math.PI) / leftLoops); + } + } + break; + } + } + + if (!mixlySprite.running) { + if (mixlySprite.successProcessingDisplayEvents.length) { + for (var pSEindex = mixlySprite.successProcessingDisplayEvents.length - 1; pSEindex >= 0; pSEindex--) { + const pSE = mixlySprite.successProcessingDisplayEvents[pSEindex]; + switch (pSE.displayType) { + case 'slide': + if (performance.now() >= pSE.totalTime + pSE.startTime) { + pSE.sprite.moveTo(pSE.targetX, pSE.targetY); + mixlySprite.successProcessingDisplayEvents.splice(pSEindex, 1); + } else { + var leftLoops = mixlySprite.currentFPS * (pSE.totalTime + pSE.startTime - performance.now()) / 1000; + if (leftLoops >= 1) { + pSE.sprite.addX((pSE.targetX - pSE.sprite.x) / leftLoops); + pSE.sprite.addY((pSE.targetY - pSE.sprite.y) / leftLoops); + } + } + break; + case 'expand': + if (performance.now() >= pSE.totalTime + pSE.startTime) { + pSE.sprite.enlargeTo(pSE.targetS); + mixlySprite.successProcessingDisplayEvents.splice(pSEindex, 1); + } else { + var leftLoops = mixlySprite.currentFPS * (pSE.totalTime + pSE.startTime - performance.now()) / 1000; + if (leftLoops >= 1) { + pSE.sprite.enlarge((pSE.targetS - Math.sqrt(pSE.sprite.height * pSE.sprite.width)) / leftLoops); + } + } + break; + case 'circle': + if (performance.now() >= pSE.totalTime + pSE.startTime) { + pSE.sprite.rotateTo(pSE.targetDegree); + mixlySprite.successProcessingDisplayEvents.splice(pSEindex, 1); + } else { + var leftLoops = mixlySprite.currentFPS * (pSE.totalTime + pSE.startTime - performance.now()) / 1000; + if (leftLoops >= 1) { + pSE.sprite.rotate((pSE.targetDegree - pSE.sprite.rotation * 180 / Math.PI) / leftLoops); + } + } + break; + } + } + } + } +} + +mixlySprite.changeWidth = (w) => { + const $canvas = $(mixlySprite.renderer.view); + const canvasWidth = $canvas.width(); + const canvasHeight = $canvas.height(); + $canvas.width(w); + $canvas.height(w / canvasWidth * canvasHeight); +} + +mixlySprite.kill = () => { + mixlySprite.state = false; + mixlySprite.repeatPlay = new Function(); + for (let i in mixlySprite.keys) { + mixlySprite.keys[i].unsubscribe(); + delete mixlySprite.keys[i]; + } + mixlySprite.processingDisplayEvent = null; + mixlySprite.displayTag = false; + mixlySprite.running = false; + mixlySprite.clearTimer(); +} + +mixlySprite.runit = (container) => { + const $container = $(container); + $container.empty(); + // Keep the scale mode to nearest + PIXI.SCALE_MODES.DEFAULT = PIXI.SCALE_MODES.NEAREST; + mixlySprite.renderer = PIXI.autoDetectRenderer(mixlySprite.canvasWidth, mixlySprite.canvasHeight, { backgroundColor: 0x00FFFFFF }); + $container.append(mixlySprite.renderer.view); + // Create mixlySprite.stage container + // mixlySprite.stage = new PIXI.Container(); + mixlySprite.pointer = { x: 0, y: 0 }; + mixlySprite.stage.sortableChildren = true; + mixlySprite.stage.interactive = true; + mixlySprite.stage.on("mousemove", (event = PIXI.InteractionEvent) => { + mixlySprite.pointer.x = event.data.global.x; + mixlySprite.pointer.y = event.data.global.y; + }); + mixlySprite.lastFrameTime = 0; + mixlySprite.running = true; + if (!mixlySprite.lastFrameTime) { + mixlySprite.lastFrameTime = performance.now(); + mixlySprite.lastSecond = performance.now(); + } + mixlySprite.animate(performance.now()); + mixlySprite.repeatPlay = new Function(); + for (let i in mixlySprite.keys) { + mixlySprite.keys[i].unsubscribe(); + delete mixlySprite.keys[i]; + } + if (mixlySprite.backgroundSprite) { + mixlySprite.backgroundSprite.runningMouseDown = new Function(); + } + for (let i in mixlySprite.sprites) { + mixlySprite.sprites[i].runningMouseDown = new Function(); + } + for (let i in mixlySprite.texts) { + mixlySprite.texts[i].runningMouseDown = new Function(); + } + mixlySprite.processingDisplayEvent = null; + mixlySprite.displayTag = false; + mixlySprite.clearTimer(); + mixlySprite.changeWidth($('body').width() / 2); + mixlySprite.state = true; +} + +window.mixlySprite = mixlySprite; + +export default mixlySprite; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/python-shell.js b/mixly/boards/default_src/python_pyodide/others/python-shell.js new file mode 100644 index 00000000..ee766d1e --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/python-shell.js @@ -0,0 +1,274 @@ +import * as Blockly from 'blockly/core'; +import * as path from 'path'; +import $ from 'jquery'; +import { createApp } from 'vue'; +import mixlySprite from './pixi-sprite'; +import { + Workspace, + Env, + Msg, + HTMLTemplate, + Debug, + app +} from 'mixly'; +import { KernelLoader } from '@basthon/kernel-loader'; +import StatusBarImage from './statusbar-image'; +import StatusBarFileSystem from './statusbar-filesystem'; +import StatusBarTool from './statusbar-tool'; +import StatusBarGame from './statusbar-game'; +import TeachableMachineApp from './teachableMachine/App.vue'; +import LOADER_TEMPLATE from '../templates/html/loader.html'; + +import 'element-plus/dist/index.css'; + + +export default class PythonShell { + static { + HTMLTemplate.add( + 'html/statusbar/loader.html', + new HTMLTemplate(LOADER_TEMPLATE) + ); + + this.pythonShell = null; + this.kernelLoaded = false; + this.$loader = $(HTMLTemplate.get('html/statusbar/loader.html').render({ + msg: { + loading: Blockly.Msg.PYTHON_PYODIDE_LOADING + } + })); + this.statusBarImage = null; + this.statusBarFileSystem = null; + + this.init = async function () { + const footerBar = app.getFooterBar(); + const $content = footerBar.getContent(); + $content.after(this.$loader); + + const projectPath = path.relative(Env.indexDirPath, Env.boardDirPath); + const loader = new KernelLoader({ + rootPath: path.join(projectPath, 'deps'), + language: 'python3', + }); + + const kernel = await loader.kernelAvailable(); + if (!kernel) { + return; + } + await kernel.init(); + await kernel.loaded(); + + this.loader = loader; + this.kernel = kernel; + this.statusBarImage = StatusBarImage.init(); + this.statusBarFileSystem = StatusBarFileSystem.init(); + this.statusBarTool = StatusBarTool.init(); + const teachableMachineApp = createApp(TeachableMachineApp); + teachableMachineApp.mount(this.statusBarTool.getContent()[0]); + this.statusBarGame = StatusBarGame.init(); + this.pythonShell = new PythonShell(); + this.pyodide = window.pyodide; + this.interruptBuffer = new Uint8Array(new ArrayBuffer(1)); + this.pyodide.setInterruptBuffer(this.interruptBuffer); + this.kernelLoaded = true; + this.$loader.remove(); + if (this.$loader && this.$loader.remove) { + this.$loader.remove(); + } + this.$loader = null; + } + + this.run = async function () { + if (!this.kernelLoaded) { + return; + } + const mainWorkspace = Workspace.getMain(); + const editor = mainWorkspace.getEditorsManager().getActive(); + const code = editor.getCode(); + return this.pythonShell.run(code); + } + + this.stop = async function () { + if (!this.kernelLoaded) { + return; + } + return this.pythonShell.stop(); + } + } + + #statusBarTerminal_ = null; + #statusBarImage_ = null; + #statusBarsManager_ = null; + #cursor_ = { + row: 0, + column: 0 + }; + #prompt_ = ''; + #inputResolve_ = null; + #inputReject_ = null; + #waittingForInput_ = false; + #running_ = false; + #kernel_ = null; + #onCursorChangeEvent_ = () => this.#onCursorChange_(); + #commands_ = [ + { + name: 'REPL-Enter', + bindKey: 'Enter', + exec: (editor) => { + const session = editor.getSession(); + const cursor = session.selection.getCursor(); + if (cursor.row === this.#cursor_.row) { + const newPos = this.#statusBarTerminal_.getEndPos(); + let str = this.#statusBarTerminal_.getValueRange(this.#cursor_, newPos); + str = str.replace(this.#prompt_, ''); + this.#inputResolve_?.(str); + this.#inputResolve_ = null; + this.#inputReject_ = null; + this.#statusBarTerminal_.addValue('\n'); + this.#exitInput_(); + } + return false; + } + }, { + name: 'REPL-ChangeEditor', + bindKey: 'Delete|Ctrl-X|Backspace', + exec: (editor) => { + const session = editor.getSession(); + const cursor = session.selection.getCursor(); + if (cursor.row < this.#cursor_.row || cursor.column <= this.#cursor_.column) { + return true; + } + return false; + } + } + ]; + + constructor() { + const mainWorkspace = Workspace.getMain(); + this.#statusBarsManager_ = mainWorkspace.getStatusBarsManager(); + this.#statusBarTerminal_ = this.#statusBarsManager_.getStatusBarById('output'); + this.#statusBarImage_ = this.#statusBarsManager_.getStatusBarById('images'); + this.#kernel_ = PythonShell.kernel; + this.#addEventsListener_(); + } + + #addEventsListener_() { + this.#kernel_.addEventListener('eval.finished', () => { + this.#running_ = false; + this.#statusBarTerminal_.addValue(`\n==${Msg.Lang['shell.finish']}==`); + this.syncfs(false).catch(Debug.error); + }); + + this.#kernel_.addEventListener('eval.output', (data) => { + this.#statusBarTerminal_.addValue(data.content); + }); + + this.#kernel_.addEventListener('eval.error', () => { + this.#running_ = false; + this.#statusBarTerminal_.addValue(`\n==${Msg.Lang['shell.finish']}==`); + }); + + this.#kernel_.addEventListener('eval.input', (data) => { + const prompt = String(data?.content?.prompt); + this.#statusBarTerminal_.addValue(prompt); + this.#prompt_ = prompt; + this.#inputResolve_ = data.resolve; + this.#inputReject_ = data.reject; + this.#enterInput_(); + }); + + this.#kernel_.addEventListener('eval.display', (data) => { + this.#statusBarsManager_.changeTo('images'); + this.#statusBarImage_.display(data); + }); + } + + #onCursorChange_() { + const editor = this.#statusBarTerminal_.getEditor(); + const session = editor.getSession(); + const cursor = session.selection.getCursor(); + editor.setReadOnly( + cursor.row < this.#cursor_.row || cursor.column < this.#cursor_.column + ); + } + + #enterInput_() { + if (!this.#running_) { + return; + } + this.#waittingForInput_ = true; + this.#cursor_ = this.#statusBarTerminal_.getEndPos(); + const editor = this.#statusBarTerminal_.getEditor(); + editor.setReadOnly(false); + editor.focus(); + const session = editor.getSession(); + session.selection.on('changeCursor', this.#onCursorChangeEvent_); + editor.commands.addCommands(this.#commands_); + } + + #exitInput_() { + this.#waittingForInput_ = false; + const editor = this.#statusBarTerminal_.getEditor(); + const session = editor.getSession(); + session.selection.off('changeCursor', this.#onCursorChangeEvent_); + editor.commands.removeCommands(this.#commands_); + this.#prompt_ = ''; + this.#inputResolve_?.(''); + // this.#inputReject_?.({}); + this.cursor_ = { row: 0, column: 0 }; + editor.setReadOnly(true); + } + + async run(code) { + await this.stop(); + await this.syncfs(true); + if (code.indexOf('import turtle') !== -1) { + code += '\nturtle.done()\n'; + } + if (code.indexOf('import matplotlib.pyplot') !== -1) { + code += '\nplt.clf()\n'; + } + mixlySprite.runit(this.#statusBarImage_.getContent()[0]); + if (code.indexOf('import sprite') !== -1 || code.indexOf('from sprite import') !== -1) { + this.#statusBarsManager_.changeTo('images'); + } else { + this.#statusBarsManager_.changeTo('output'); + } + this.#statusBarsManager_.show(); + this.#statusBarTerminal_.setValue(`${Msg.Lang['shell.running']}...\n`); + this.#running_ = true; + this.#kernel_.dispatchEvent('eval.request', { + code, + interactive: false, + }); + } + + async stop() { + if (this.#waittingForInput_) { + this.#exitInput_(); + } + if (this.#running_) { + const timeout = 5; + PythonShell.interruptBuffer[0] = 2; + const startTime = Number(new Date()); + while (Number(new Date()) - startTime < timeout * 1000) { + if (this.#running_) { + PythonShell.interruptBuffer[0] = 2; + await this.sleep(100); + } else { + break; + } + } + this.#running_ = false; + } + } + + async syncfs(populate = false) { + return new Promise((resolve) => { + window.pyodide.FS.syncfs(populate, resolve); + }); + } + + sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/sound.js b/mixly/boards/default_src/python_pyodide/others/sound.js new file mode 100644 index 00000000..7e79c88d --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/sound.js @@ -0,0 +1,1825 @@ +window.addEventListener('error', (event) => { + if (event.error && event.error.message && event.error.message.includes('openOrClosedShadowRoot')) { + console.warn('捕获到Blockly DOM操作错误,这通常是无害的:', event.error.message); + event.preventDefault(); + return false; + } + + if (event.error && event.error.message && ( + event.error.message.includes('DOM') || + event.error.message.includes('Element') || + event.error.message.includes('Node') + )) { + console.warn('捕获到DOM操作错误:', event.error.message); + event.preventDefault(); + return false; + } +}); + +window.addEventListener('unhandledrejection', (event) => { + if (event.reason && event.reason.message && event.reason.message.includes('openOrClosedShadowRoot')) { + console.warn('捕获到未处理的Promise拒绝(Blockly DOM错误):', event.reason.message); + event.preventDefault(); + return false; + } +}); + +const originalConsoleError = console.error; +console.error = function(...args) { + const message = args.join(' '); + if (message.includes('openOrClosedShadowRoot') || + message.includes('DOM') || + message.includes('Element') || + message.includes('Node')) { + console.warn('过滤的DOM错误:', ...args); + return; + } + originalConsoleError.apply(console, args); +}; + +const safeDOM = { + appendChild: (parent, child) => { + try { + if (parent && child && parent.appendChild) { + return parent.appendChild(child); + } + } catch (error) { + console.warn('安全DOM添加失败:', error.message); + } + return null; + }, + + removeChild: (parent, child) => { + try { + if (parent && child && parent.removeChild && child.parentNode === parent) { + return parent.removeChild(child); + } + } catch (error) { + console.warn('安全DOM移除失败:', error.message); + } + return null; + }, + + querySelector: (container, selector) => { + try { + if (container && container.querySelector) { + return container.querySelector(selector); + } + } catch (error) { + console.warn('安全DOM查询失败:', error.message); + } + return null; + }, + + exists: (element) => { + return element && element.parentNode && document.contains(element); + } +}; + +const sound = { + + volume: 100, + + effects: { + pitch: 0, + pan: 0 + }, + + builtin: { + "Meow": "meow" + }, + + isRecording: false, + mediaRecorder: null, + recordedChunks: [], + recordedAudio: null, + + activeAudios: [], + + isStopped: false, + abortController: null, + + blockAllAudio: false, + + audioHistory: [], + + soundQueue: [], + isProcessingQueue: false, + currentlyPlaying: null, + + initAudioContext: () => { + if (!sound.audioContext) { + try { + sound.audioContext = new (window.AudioContext || window.webkitAudioContext)(); + } catch (error) { + console.error("Error initializing audio context:", error); + } + } + }, + + createAudio: (src) => { + if (sound.blockAllAudio || sound.isStopped || + (sound.abortController && sound.abortController.signal.aborted)) { + const fakeAudio = { + play: () => Promise.reject(new Error('Audio playback blocked')), + pause: () => {}, + currentTime: 0, + src: '', + volume: 1, + playbackRate: 1, + onended: null, + onerror: null, + onloadstart: null, + oncanplay: null, + onplay: null, + onpause: null, + tagName: 'AUDIO', + addEventListener: () => {}, + removeEventListener: () => {}, + load: () => {}, + duration: 0, + ended: false, + paused: true, + muted: false, + readyState: 0, + networkState: 0, + preload: 'none' + }; + return fakeAudio; + } + return new Audio(src); + }, + + play: async (name) => { + try { + if (sound.isStopped) { + return; + } + + if (sound.abortController && sound.abortController.signal.aborted) { + return; + } + + if (sound.blockAllAudio) { + return; + } + + if (sound.soundQueue.length > 0 || sound.isProcessingQueue) { + sound.soundQueue.push({ + name, + resolve: () => {}, + reject: () => {} + }); + sound.processQueue(); + return; + } + + if (sound.activeAudios.length > 0) { + + sound.activeAudios.forEach(audio => { + try { + if (audio && audio.tagName === 'AUDIO') { + audio.pause(); + audio.currentTime = 0; + audio.src = ''; + } + } catch (error) { + console.warn("停止现有音频时出错:", error); + } + }); + sound.activeAudios = []; + } + + if (name.startsWith('recording') && sound.builtin[name]) { + if (sound.blockAllAudio || sound.isStopped) { + return; + } + + const audio = sound.createAudio(sound.builtin[name]); + audio.volume = sound.volume / 100; + + const currentPitch = sound.effects.pitch; + const currentPan = sound.effects.pan; + + if (currentPitch !== 0 || currentPan !== 0) { + sound.initAudioContext(); + if (sound.audioContext) { + try { + const source = sound.audioContext.createMediaElementSource(audio); + const gainNode = sound.audioContext.createGain(); + + if (currentPitch !== 0) { + const pitchShift = sound.audioContext.createBiquadFilter(); + pitchShift.type = 'peaking'; + pitchShift.frequency.setValueAtTime(1000, sound.audioContext.currentTime); + pitchShift.Q.setValueAtTime(1, sound.audioContext.currentTime); + + const pitchGain = Math.max(-20, Math.min(20, currentPitch * 0.8)); + pitchShift.gain.setValueAtTime(pitchGain, sound.audioContext.currentTime); + + source.connect(pitchShift); + pitchShift.connect(gainNode); + } else { + source.connect(gainNode); + } + + if (currentPan !== 0) { + const panNode = sound.audioContext.createStereoPanner(); + const panValue = Math.max(-1, Math.min(1, (currentPan / 100) * 1.5)); + panNode.pan.setValueAtTime(panValue, sound.audioContext.currentTime); + + gainNode.connect(panNode); + panNode.connect(sound.audioContext.destination); + } else { + gainNode.connect(sound.audioContext.destination); + } + + gainNode.gain.setValueAtTime(sound.volume / 100, sound.audioContext.currentTime); + } catch (error) { + console.warn("应用增强音效失败,使用默认播放:", error); + audio.play().catch(error => { + if (error.name !== 'AbortError') { + console.error("Error playing recorded audio:", error); + } + }); + return; + } + } else { + console.warn("音频上下文初始化失败,无法应用增强音效"); + audio.play().catch(error => { + if (error.name !== 'AbortError') { + console.error("Error playing recorded audio:", error); + } + }); + return; + } + } else { + audio.play().catch(error => { + if (error.name !== 'AbortError') { + console.error("Error playing recorded audio:", error); + } + }); + return; + } + + sound.activeAudios.push(audio); + + audio.onended = () => { + const index = sound.activeAudios.indexOf(audio); + if (index > -1) { + sound.activeAudios.splice(index, 1); + } + }; + + audio.play().catch(error => { + if (error.name !== 'AbortError') { + console.error("Error playing recorded audio:", error); + } + const index = sound.activeAudios.indexOf(audio); + if (index > -1) { + sound.activeAudios.splice(index, 1); + } + }); + return; + } + + if (name === "Meow") { + sound.initAudioContext(); + + if (sound.audioContext) { + const oscillator = sound.audioContext.createOscillator(); + const gainNode = sound.audioContext.createGain(); + + let frequency = 440; + + if (sound.effects.pitch !== 0) { + frequency *= Math.pow(2, sound.effects.pitch / 12); + } + + oscillator.frequency.setValueAtTime(frequency, sound.audioContext.currentTime); + oscillator.type = 'sine'; + + gainNode.gain.setValueAtTime(sound.volume / 100, sound.audioContext.currentTime); + + if (sound.effects.pan !== 0) { + const panNode = sound.audioContext.createStereoPanner(); + const panValue = sound.effects.pan / 100; + panNode.pan.setValueAtTime(panValue, sound.audioContext.currentTime); + + oscillator.connect(panNode); + panNode.connect(gainNode); + } else { + oscillator.connect(gainNode); + } + + gainNode.connect(sound.audioContext.destination); + + oscillator.start(); + oscillator.stop(sound.audioContext.currentTime + 0.5); + } + } + } catch (error) { + console.error("Error in sound.play:", error); + } + }, + + _playAudioInternal: async (name) => { + return new Promise((resolve, reject) => { + try { + if (sound.isStopped || sound.blockAllAudio) { + reject(new Error('Playback blocked')); + return; + } + + if (name.startsWith('recording') && sound.builtin[name]) { + const audio = sound.createAudio(sound.builtin[name]); + audio.volume = sound.volume / 100; + + const currentPitch = sound.effects.pitch; + const currentPan = sound.effects.pan; + + if (currentPitch !== 0 || currentPan !== 0) { + sound.initAudioContext(); + if (sound.audioContext) { + try { + const source = sound.audioContext.createMediaElementSource(audio); + const gainNode = sound.audioContext.createGain(); + + if (currentPitch !== 0) { + const pitchShift = sound.audioContext.createBiquadFilter(); + pitchShift.type = 'peaking'; + pitchShift.frequency.setValueAtTime(1000, sound.audioContext.currentTime); + pitchShift.Q.setValueAtTime(1, sound.audioContext.currentTime); + const pitchGain = Math.max(-20, Math.min(20, currentPitch * 0.8)); + pitchShift.gain.setValueAtTime(pitchGain, sound.audioContext.currentTime); + source.connect(pitchShift); + pitchShift.connect(gainNode); + } else { + source.connect(gainNode); + } + + if (currentPan !== 0) { + const panNode = sound.audioContext.createStereoPanner(); + const panValue = Math.max(-1, Math.min(1, (currentPan / 100) * 1.5)); + panNode.pan.setValueAtTime(panValue, sound.audioContext.currentTime); + gainNode.connect(panNode); + panNode.connect(sound.audioContext.destination); + } else { + gainNode.connect(sound.audioContext.destination); + } + + gainNode.gain.setValueAtTime(sound.volume / 100, sound.audioContext.currentTime); + } catch (error) { + console.warn("应用音效失败:", error); + } + } + } + + audio.onended = () => { + const index = sound.activeAudios.indexOf(audio); + if (index > -1) { + sound.activeAudios.splice(index, 1); + } + resolve(); + }; + + audio.onerror = (error) => { + console.error(`音频播放失败: ${name}`, error); + const index = sound.activeAudios.indexOf(audio); + if (index > -1) { + sound.activeAudios.splice(index, 1); + } + reject(error); + }; + + sound.activeAudios.push(audio); + audio.play().catch(error => { + if (error.name === 'AbortError') { + resolve(); + } else { + console.error("播放音频失败:", error); + reject(error); + } + }); + + } else if (name === "Meow") { + sound.initAudioContext(); + if (sound.audioContext) { + const oscillator = sound.audioContext.createOscillator(); + const gainNode = sound.audioContext.createGain(); + + let frequency = 440; + if (sound.effects.pitch !== 0) { + frequency *= Math.pow(2, sound.effects.pitch / 12); + } + + oscillator.frequency.setValueAtTime(frequency, sound.audioContext.currentTime); + oscillator.type = 'sine'; + gainNode.gain.setValueAtTime(sound.volume / 100, sound.audioContext.currentTime); + + if (sound.effects.pan !== 0) { + const panNode = sound.audioContext.createStereoPanner(); + const panValue = sound.effects.pan / 100; + panNode.pan.setValueAtTime(panValue, sound.audioContext.currentTime); + oscillator.connect(panNode); + panNode.connect(gainNode); + } else { + oscillator.connect(gainNode); + } + + gainNode.connect(sound.audioContext.destination); + + oscillator.start(); + oscillator.stop(sound.audioContext.currentTime + 0.5); + + setTimeout(() => { + resolve(); + }, 500); + } else { + reject(new Error('AudioContext not available')); + } + } else { + reject(new Error(`Unknown sound: ${name}`)); + } + } catch (error) { + console.error("内部播放错误:", error); + reject(error); + } + }); + }, + + processQueue: async () => { + if (sound.isProcessingQueue || sound.soundQueue.length === 0) { + return; + } + + sound.isProcessingQueue = true; + + while (sound.soundQueue.length > 0) { + const queueItem = sound.soundQueue.shift(); + + try { + if (queueItem.type === 'frequency') { + const { frequency, duration, resolve } = queueItem; + + sound.currentlyPlaying = { type: 'frequency', frequency, startTime: Date.now() }; + + await new Promise((freqResolve) => { + sound.initAudioContext(); + + if (sound.audioContext) { + const oscillator = sound.audioContext.createOscillator(); + const gainNode = sound.audioContext.createGain(); + + oscillator.frequency.setValueAtTime(frequency, sound.audioContext.currentTime); + oscillator.type = 'sine'; + + const currentPitch = sound.effects.pitch; + if (currentPitch !== 0) { + oscillator.frequency.setValueAtTime( + frequency * Math.pow(2, currentPitch / 12), + sound.audioContext.currentTime + ); + } + + gainNode.gain.setValueAtTime(sound.volume / 100, sound.audioContext.currentTime); + oscillator.connect(gainNode); + gainNode.connect(sound.audioContext.destination); + + oscillator.onended = () => { + sound.currentlyPlaying = null; + freqResolve(); + }; + + oscillator.start(); + oscillator.stop(sound.audioContext.currentTime + duration / 1000); + } else { + freqResolve(); + } + }); + + sound.currentlyPlaying = null; + resolve(); + } else { + const { name, resolve } = queueItem; + + sound.currentlyPlaying = { name, startTime: Date.now() }; + await sound._playAudioInternal(name); + sound.currentlyPlaying = null; + resolve(); + } + } catch (error) { + console.error(`队列播放失败:`, error); + sound.currentlyPlaying = null; + if (queueItem.reject) { + queueItem.reject(error); + } + } + } + + sound.isProcessingQueue = false; + }, + + play_blocking: (name) => { + return new Promise((resolve, reject) => { + sound.soundQueue.push({ name, resolve, reject }); + sound.processQueue(); + }); + }, + + stop_all: () => { + try { + sound.isStopped = true; + sound.blockAllAudio = true; + + if (sound.soundQueue.length > 0) { + sound.soundQueue.forEach(({ reject }) => { + reject(new Error('Playback stopped')); + }); + sound.soundQueue = []; + } + sound.isProcessingQueue = false; + sound.currentlyPlaying = null; + + if (sound.abortController) { + sound.abortController.abort(); + } + sound.abortController = new AbortController(); + + if (sound.activeAudios.length > 0) { + sound.activeAudios.forEach((audio) => { + try { + if (audio && audio.tagName === 'AUDIO') { + audio.pause(); + audio.currentTime = 0; + audio.src = ''; + audio.load(); + audio.onended = null; + audio.onerror = null; + audio.onloadstart = null; + audio.oncanplay = null; + audio.onplay = null; + audio.onpause = null; + } + } catch (error) { + console.warn(`停止音频时出错:`, error); + } + }); + + sound.activeAudios = []; + } + + if (sound.audioContext) { + try { + sound.audioContext.close(); + sound.audioContext = null; + } catch (error) { + console.warn("关闭音频上下文时出错:", error); + } + } + + sound.effects.pitch = 0; + sound.effects.pan = 0; + + const allAudioElements = document.querySelectorAll('audio'); + if (allAudioElements.length > 0) { + allAudioElements.forEach((audio) => { + try { + audio.pause(); + audio.currentTime = 0; + audio.src = ''; + } catch (error) { + console.warn(`停止页面音频元素时出错:`, error); + } + }); + } + + setTimeout(() => { + sound.isStopped = false; + sound.blockAllAudio = false; + }, 100); + } catch (error) { + console.error("Error in sound.stop_all:", error); + } + }, + + adjust_volume: (change) => { + const newVolume = Math.max(0, Math.min(100, sound.volume + change)); + sound.volume = newVolume; + }, + + set_volume: (value) => { + sound.volume = Math.max(0, Math.min(100, value)); + }, + + get_volume: () => { + return sound.volume; + }, + + noteFrequencies: { + "NOTE_B3": 247, + "NOTE_C4": 262, + "NOTE_D4": 294, + "NOTE_E4": 330, + "NOTE_F4": 349, + "NOTE_G4": 392, + "NOTE_A4": 440, + "NOTE_B4": 494, + "NOTE_C5": 523, + "NOTE_D5": 587, + "NOTE_E5": 659, + "NOTE_F5": 698, + "NOTE_G5": 784 + }, + + // 播放指定频率的声音(带持续时间) + play_frequency: (frequency, duration = 1000) => { + try { + sound.initAudioContext(); + + if (sound.audioContext) { + const oscillator = sound.audioContext.createOscillator(); + const gainNode = sound.audioContext.createGain(); + + oscillator.frequency.setValueAtTime(frequency, sound.audioContext.currentTime); + oscillator.type = 'sine'; + + const currentPitch = sound.effects.pitch; + if (currentPitch !== 0) { + oscillator.frequency.setValueAtTime( + frequency * Math.pow(2, currentPitch / 12), + sound.audioContext.currentTime + ); + } + + gainNode.gain.setValueAtTime(sound.volume / 100, sound.audioContext.currentTime); + + oscillator.connect(gainNode); + gainNode.connect(sound.audioContext.destination); + + oscillator.start(); + oscillator.stop(sound.audioContext.currentTime + duration / 1000); + console.log(`播放频率: ${frequency}Hz, 持续时间: ${duration}ms, 音量: ${sound.volume}%`); + } + } catch (error) { + console.error("播放频率声音失败:", error); + } + }, + + // 播放指定频率的声音(持续播放,无持续时间限制) + play_frequency_continuous: (frequency) => { + try { + sound.initAudioContext(); + + if (sound.audioContext) { + const oscillator = sound.audioContext.createOscillator(); + const gainNode = sound.audioContext.createGain(); + + oscillator.frequency.setValueAtTime(frequency, sound.audioContext.currentTime); + oscillator.type = 'sine'; + + const currentPitch = sound.effects.pitch; + if (currentPitch !== 0) { + oscillator.frequency.setValueAtTime( + frequency * Math.pow(2, currentPitch / 12), + sound.audioContext.currentTime + ); + } + + gainNode.gain.setValueAtTime(sound.volume / 100, sound.audioContext.currentTime); + + oscillator.connect(gainNode); + gainNode.connect(sound.audioContext.destination); + + oscillator.start(); + oscillator.stop(sound.audioContext.currentTime + 2); // 默认播放2秒 + console.log(`播放频率(持续): ${frequency}Hz, 无持续时间限制, 音量: ${sound.volume}%`); + } + } catch (error) { + console.error("播放频率声音失败:", error); + } + }, + + // 播放指定频率的声音(阻塞版本,使用队列,带持续时间) + play_frequency_blocking: (frequency, duration = 1000) => { + console.log(`=== 🔒 阻塞播放频率(加入队列): ${frequency}Hz, ${duration}ms ===`); + + return new Promise((resolve, reject) => { + const queueItem = { + type: 'frequency', + frequency, + duration: duration, + resolve, + reject + }; + + sound.soundQueue.push(queueItem); + console.log(`✅ 频率已加入声音队列,当前队列长度: ${sound.soundQueue.length}`); + sound.processQueue(); + }); + }, + + // 播放指定频率的声音(阻塞版本,使用队列,持续播放) + play_frequency_continuous_blocking: (frequency) => { + console.log(`=== 🔒 阻塞播放频率(持续,加入队列): ${frequency}Hz ===`); + + return new Promise((resolve, reject) => { + const duration = 2000; // 持续播放默认2秒 + + const queueItem = { + type: 'frequency', + frequency, + duration: duration, + resolve, + reject + }; + + sound.soundQueue.push(queueItem); + console.log(`✅ 频率(持续)已加入声音队列,当前队列长度: ${sound.soundQueue.length}`); + sound.processQueue(); + }); + }, + + play_note_list: (noteList) => { + try { + const noteSequences = { + "DADADADUM": [ + { note: "NOTE_D4", duration: 500 }, + { note: "NOTE_A4", duration: 500 }, + { note: "NOTE_D4", duration: 500 }, + { note: "NOTE_A4", duration: 500 }, + { note: "NOTE_D4", duration: 500 }, + { note: "NOTE_A4", duration: 500 }, + { note: "NOTE_D4", duration: 500 }, + { note: "NOTE_A4", duration: 500 } + ], + "BIRTHDAY": [ + { note: "NOTE_C4", duration: 400 }, + { note: "NOTE_C4", duration: 400 }, + { note: "NOTE_D4", duration: 800 }, + { note: "NOTE_C4", duration: 800 }, + { note: "NOTE_F4", duration: 800 }, + { note: "NOTE_E4", duration: 1600 } + ], + "BA_DING": [ + { note: "NOTE_C5", duration: 200 }, + { note: "NOTE_E5", duration: 200 }, + { note: "NOTE_G5", duration: 400 } + ], + "JUMP_UP": [ + { note: "NOTE_C5", duration: 100 }, + { note: "NOTE_E5", duration: 100 }, + { note: "NOTE_G5", duration: 100 } + ], + "JUMP_DOWN": [ + { note: "NOTE_G5", duration: 100 }, + { note: "NOTE_E5", duration: 100 }, + { note: "NOTE_C5", duration: 100 } + ], + "POWER_UP": [ + { note: "NOTE_C4", duration: 150 }, + { note: "NOTE_E4", duration: 150 }, + { note: "NOTE_G4", duration: 150 }, + { note: "NOTE_C5", duration: 300 } + ], + "POWER_DOWN": [ + { note: "NOTE_C5", duration: 150 }, + { note: "NOTE_G4", duration: 150 }, + { note: "NOTE_E4", duration: 150 }, + { note: "NOTE_C4", duration: 300 } + ] + }; + + const sequence = noteSequences[noteList]; + if (sequence) { + let currentTime = 0; + + sequence.forEach((item) => { + const frequency = sound.noteFrequencies[item.note] || 440; + const duration = item.duration; + + setTimeout(() => { + sound.play_frequency(frequency, duration); + }, currentTime); + + currentTime += duration; + }); + } else { + console.warn(`未知的音符列表: ${noteList}`); + } + } catch (error) { + console.error("播放音符列表失败:", error); + } + }, + + play_note_list_blocking: (noteList) => { + return new Promise((resolve, reject) => { + (async () => { + try { + const noteSequences = { + "DADADADUM": [ + { note: "NOTE_D4", duration: 500 }, + { note: "NOTE_A4", duration: 500 }, + { note: "NOTE_D4", duration: 500 }, + { note: "NOTE_A4", duration: 500 }, + { note: "NOTE_D4", duration: 500 }, + { note: "NOTE_A4", duration: 500 }, + { note: "NOTE_D4", duration: 500 }, + { note: "NOTE_A4", duration: 500 } + ], + "BIRTHDAY": [ + { note: "NOTE_C4", duration: 400 }, + { note: "NOTE_C4", duration: 400 }, + { note: "NOTE_D4", duration: 800 }, + { note: "NOTE_C4", duration: 800 }, + { note: "NOTE_F4", duration: 800 }, + { note: "NOTE_E4", duration: 1600 } + ], + "BA_DING": [ + { note: "NOTE_C5", duration: 200 }, + { note: "NOTE_E5", duration: 200 }, + { note: "NOTE_G5", duration: 400 } + ], + "JUMP_UP": [ + { note: "NOTE_C5", duration: 100 }, + { note: "NOTE_E5", duration: 100 }, + { note: "NOTE_G5", duration: 100 } + ], + "JUMP_DOWN": [ + { note: "NOTE_G5", duration: 100 }, + { note: "NOTE_E5", duration: 100 }, + { note: "NOTE_C5", duration: 100 } + ], + "POWER_UP": [ + { note: "NOTE_C4", duration: 150 }, + { note: "NOTE_E4", duration: 150 }, + { note: "NOTE_G4", duration: 150 }, + { note: "NOTE_C5", duration: 300 } + ], + "POWER_DOWN": [ + { note: "NOTE_C5", duration: 150 }, + { note: "NOTE_G4", duration: 150 }, + { note: "NOTE_E4", duration: 150 }, + { note: "NOTE_C4", duration: 300 } + ] + }; + + const sequence = noteSequences[noteList]; + if (sequence) { + for (const item of sequence) { + const frequency = sound.noteFrequencies[item.note] || 440; + await sound.play_frequency_blocking(frequency, item.duration); + } + + resolve(); + } else { + console.warn(`未知的音符列表: ${noteList}`); + reject(new Error(`未知的音符列表: ${noteList}`)); + } + } catch (error) { + console.error("播放音符列表失败:", error); + reject(error); + } + })(); + }); + }, + + adjust_effect: (effect, change) => { + if (effect === "pitch") { + sound.effects.pitch = Math.max(-24, Math.min(24, sound.effects.pitch + change)); + } else if (effect === "pan") { + sound.effects.pan = Math.max(-100, Math.min(100, sound.effects.pan + change)); + } + }, + + set_effect: (effect, value) => { + if (effect === "pitch") { + sound.effects.pitch = Math.max(-24, Math.min(24, value)); + } else if (effect === "pan") { + sound.effects.pan = Math.max(-100, Math.min(100, value)); + } + }, + + clear_effects: () => { + sound.effects.pitch = 0; + sound.effects.pan = 0; + }, + + record: () => { + if (sound.isRecording) { + return; + } + + try { + navigator.mediaDevices.getUserMedia({ audio: true }) + .then(stream => { + sound.mediaRecorder = new MediaRecorder(stream); + sound.recordedChunks = []; + + sound.mediaRecorder.ondataavailable = (event) => { + if (event.data.size > 0) { + sound.recordedChunks.push(event.data); + } + }; + + sound.mediaRecorder.onstart = () => { + sound.isRecording = true; + }; + + sound.mediaRecorder.onstop = () => { + sound.isRecording = false; + + const audioBlob = new Blob(sound.recordedChunks, { type: 'audio/wav' }); + sound.recordedAudio = URL.createObjectURL(audioBlob); + + stream.getTracks().forEach(track => { + track.stop(); + }); + + sound.showPlaybackInterface(audioBlob); + }; + + sound.mediaRecorder.onerror = (event) => { + console.error("MediaRecorder 错误:", event.error); + sound.isRecording = false; + }; + + sound.mediaRecorder.start(100); + + sound.showRecordInterface(); + }) + .catch(error => { + console.error("获取麦克风权限失败:", error); + alert("无法访问麦克风,请检查权限设置。错误: " + error.message); + }); + } catch (error) { + console.error("录制功能初始化失败:", error); + alert("录制功能初始化失败: " + error.message); + } + }, + + showRecordInterface: () => { + const recordModal = document.createElement('div'); + recordModal.id = 'recordModal'; + recordModal.style.cssText = ` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 10000; + `; + + const recordContent = document.createElement('div'); + recordContent.style.cssText = ` + background: white; + border-radius: 10px; + padding: 20px; + text-align: center; + min-width: 300px; + box-shadow: 0 4px 20px rgba(0,0,0,0.3); + `; + + recordContent.innerHTML = ` +

录制声音

+
+
+
+
+
+ +
+
正在录制...
+ `; + + recordModal.appendChild(recordContent); + + try { + safeDOM.appendChild(document.body, recordModal); + } catch (error) { + console.error("添加录制界面到DOM失败:", error); + return; + } + + recordModal.addEventListener('click', (event) => { + if (event.target.id === 'stopRecord') { + try { + if (sound.mediaRecorder && sound.isRecording) { + sound.mediaRecorder.stop(); + } else { + console.warn("MediaRecorder 不存在或未在录制状态"); + } + } catch (error) { + console.error("停止录制时出错:", error); + alert("停止录制时出错: " + error.message); + } + } + }); + + const waveformBars = recordModal.querySelector('#waveformBars'); + if (waveformBars) { + for (let i = 0; i < 20; i++) { + const bar = document.createElement('div'); + bar.style.cssText = ` + position: absolute; + left: ${i * 10}px; + bottom: 0; + width: 8px; + height: 20px; + background: #4a90e2; + border-radius: 2px; + transition: height 0.1s ease; + `; + waveformBars.appendChild(bar); + } + + const updateWaveform = () => { + if (sound.isRecording && recordModal.parentNode) { + const bars = waveformBars.children; + for (let i = 0; i < bars.length; i++) { + const height = Math.random() * 60 + 20; + bars[i].style.height = height + 'px'; + bars[i].style.background = `hsl(${200 + Math.random() * 60}, 70%, 60%)`; + } + } + }; + + const waveformInterval = setInterval(updateWaveform, 100); + recordModal.waveformInterval = waveformInterval; + } + + let volumeLevel = 0; + const volumeMeter = recordModal.querySelector('#volumeMeter'); + const statusDiv = recordModal.querySelector('#status'); + + if (volumeMeter && statusDiv) { + const volumeInterval = setInterval(() => { + if (sound.isRecording && recordModal.parentNode) { + volumeLevel = Math.random() * 60 + 40; + volumeMeter.style.height = volumeLevel + '%'; + statusDiv.textContent = `正在录制... 音量: ${Math.round(volumeLevel)}%`; + + volumeMeter.style.opacity = 0.8 + (volumeLevel / 100) * 0.2; + } else { + clearInterval(volumeInterval); + if (statusDiv && recordModal.parentNode) { + statusDiv.textContent = "录制完成"; + statusDiv.style.color = "#4CAF50"; + } + if (volumeMeter && recordModal.parentNode) { + volumeMeter.style.height = "100%"; + volumeMeter.style.background = "linear-gradient(to top, #4CAF50, #4CAF50)"; + } + } + }, 200); + + recordModal.volumeInterval = volumeInterval; + } else { + console.error("找不到音量计或状态显示元素"); + } + + const keyHandler = (event) => { + if (event.code === 'Space' && sound.isRecording) { + event.preventDefault(); + if (sound.mediaRecorder) { + sound.mediaRecorder.stop(); + } + } + }; + + document.addEventListener('keydown', keyHandler); + + recordModal.keyHandler = keyHandler; + }, + + showPlaybackInterface: (audioBlob) => { + const recordModal = document.getElementById('recordModal'); + if (recordModal) { + if (recordModal.volumeInterval) clearInterval(recordModal.volumeInterval); + if (recordModal.waveformInterval) clearInterval(recordModal.waveformInterval); + if (recordModal.keyHandler) document.removeEventListener('keydown', recordModal.keyHandler); + + try { + if (safeDOM.exists(recordModal)) { + safeDOM.removeChild(document.body, recordModal); + } + } catch (error) { + console.warn("移除录制界面时出错:", error); + } + } + + const playbackModal = document.createElement('div'); + playbackModal.id = 'playbackModal'; + playbackModal.style.cssText = ` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 10000; + `; + + const playbackContent = document.createElement('div'); + playbackContent.style.cssText = ` + background: white; + border-radius: 10px; + padding: 20px; + text-align: center; + min-width: 350px; + box-shadow: 0 4px 20px rgba(0,0,0,0.3); + `; + + playbackContent.innerHTML = ` +

录音完成

+
+
+
+
+ +
+
+ + +
+ `; + + playbackModal.appendChild(playbackContent); + + try { + safeDOM.appendChild(document.body, playbackModal); + } catch (error) { + console.error("添加播放界面到DOM失败:", error); + return; + } + + const playButton = playbackModal.querySelector('#playRecording'); + if (playButton) { + playButton.onclick = () => { + try { + const audio = sound.createAudio(sound.recordedAudio); + audio.play().catch(error => { + console.error("播放录音失败:", error); + alert("播放录音失败: " + error.message); + }); + + const waveformLine = playbackModal.querySelector('#waveformLine'); + if (waveformLine) { + waveformLine.style.background = '#FF5722'; + setTimeout(() => { + if (waveformLine.parentNode) { + waveformLine.style.background = '#4a90e2'; + } + }, 1000); + } + } catch (error) { + console.error("播放录音时出错:", error); + alert("播放录音时出错: " + error.message); + } + }; + } + + const reRecordButton = playbackModal.querySelector('#reRecord'); + if (reRecordButton) { + reRecordButton.onclick = () => { + try { + if (safeDOM.exists(playbackModal)) { + safeDOM.removeChild(document.body, playbackModal); + } + sound.record(); + } catch (error) { + console.error("重新录制时出错:", error); + alert("重新录制时出错: " + error.message); + } + }; + } + + const saveButton = playbackModal.querySelector('#saveRecording'); + if (saveButton) { + saveButton.onclick = () => { + try { + sound.saveRecording(audioBlob); + if (safeDOM.exists(playbackModal)) { + safeDOM.removeChild(document.body, playbackModal); + } + } catch (error) { + console.error("添加到列表时出错:", error); + alert("添加到列表时出错: " + error.message); + } + }; + } + + sound.createWaveformDisplay(audioBlob, playbackModal); + }, + + createWaveformDisplay: async (audioBlob, container) => { + try { + if (!container || !container.parentNode) { + console.warn("波形显示容器不存在或已被移除"); + return; + } + + const arrayBuffer = await audioBlob.arrayBuffer(); + const audioContext = new (window.AudioContext || window.webkitAudioContext)(); + const audioBuffer = await audioContext.decodeAudioData(arrayBuffer); + + const channelData = audioBuffer.getChannelData(0); + const waveformContainer = container.querySelector('#playbackWaveform'); + + if (waveformContainer && waveformContainer.parentNode) { + waveformContainer.innerHTML = ''; + + const barCount = 100; + const step = Math.floor(channelData.length / barCount); + + for (let i = 0; i < barCount; i++) { + const start = i * step; + const end = start + step; + let sum = 0; + + for (let j = start; j < end; j++) { + sum += Math.abs(channelData[j] || 0); + } + + const average = sum / step; + const height = Math.max(2, average * 100); + + const bar = document.createElement('div'); + bar.style.cssText = ` + position: absolute; + left: ${(i / barCount) * 100}%; + bottom: 0; + width: ${100 / barCount}%; + height: ${height}%; + background: #4a90e2; + border-radius: 1px; + `; + waveformContainer.appendChild(bar); + } + } + } catch (error) { + console.error("创建波形显示失败:", error); + } + }, + + saveRecording: (audioBlob) => { + try { + const existingRecordings = Object.keys(sound.builtin).filter(k => k.startsWith('recording')); + + const recordingName = `recording${existingRecordings.length + 1}`; + + const audioToSave = audioBlob ? URL.createObjectURL(audioBlob) : sound.recordedAudio; + if (!audioToSave) { + throw new Error("录音数据不存在"); + } + + sound.builtin[recordingName] = audioToSave; + + alert(`录音已保存为: ${recordingName}`); + + const playbackModal = document.getElementById('playbackModal'); + if (safeDOM.exists(playbackModal)) { + const playButton = safeDOM.querySelector(playbackModal, '#playRecording'); + if (playButton) { + playButton.innerHTML = ` 播放 ${recordingName}`; + } + } + + } catch (error) { + console.error("保存录音失败:", error); + alert("保存录音失败: " + error.message); + } + } +}; + +export default sound; + +const originalAudio = window.Audio; +window.Audio = function(src) { + if (sound.blockAllAudio || sound.isStopped || + (sound.abortController && sound.abortController.signal.aborted)) { + const fakeAudio = { + play: () => Promise.reject(new Error('Audio playback blocked globally')), + pause: () => {}, + currentTime: 0, + src: '', + volume: 1, + playbackRate: 1, + onended: null, + onerror: null, + onloadstart: null, + oncanplay: null, + onplay: null, + onpause: null, + tagName: 'AUDIO', + addEventListener: () => {}, + removeEventListener: () => {}, + load: () => {}, + duration: 0, + ended: false, + paused: true, + muted: false, + readyState: 0, + networkState: 0, + preload: 'none' + }; + return fakeAudio; + } + // eslint-disable-next-line new-cap + return new originalAudio(src); +}; + +window.Audio.original = originalAudio; + +if (typeof window !== 'undefined') { + const originalConsoleError = console.error; + console.error = function(...args) { + const message = args.join(' '); + if (message.includes('sound') && ( + message.includes('no-unused-vars') || + message.includes('no-trailing-spaces') || + message.includes('new-cap') + )) { + console.warn('过滤的sound模块ESLint错误:', ...args); + return; + } + originalConsoleError.apply(console, args); + }; +} + +function patchPythonShell() { + const originalRemove = Element.prototype.remove; + Element.prototype.remove = function() { + if (!this) { + console.warn('尝试在null对象上调用remove(),已安全忽略'); + return; + } + if (typeof this.remove !== 'function') { + console.warn('对象没有remove方法,已安全忽略'); + return; + } + try { + return originalRemove.call(this); + } catch (error) { + console.warn('remove()调用失败,已安全处理:', error); + } + }; + + if (window.$ && window.$.fn && window.$.fn.remove) { + const originalJQueryRemove = window.$.fn.remove; + window.$.fn.remove = function() { + if (!this || this.length === 0) { + console.warn('尝试在空的jQuery对象上调用remove(),已安全忽略'); + return this; + } + try { + return originalJQueryRemove.call(this); + } catch (error) { + console.warn('jQuery remove()调用失败,已安全处理:', error); + return this; + } + }; + } +} + +let isInjecting = false; + +function isKeyboardInterruptError(error) { + if (!error) { + return false; + } + if (error.name === 'PythonError' || error.name === 'KeyboardInterrupt') { + const message = error.message || String(error); + return message.includes('KeyboardInterrupt') || message.includes('interrupted'); + } + return false; +} + +function injectSoundToPython() { + if (isInjecting) { + return false; + } + if (window.pyodide && window.pyodide.globals) { + try { + isInjecting = true; + const pythonSound = { + play: (name) => { + return sound.play(name); + }, + play_blocking: (name) => { + return sound.play_blocking(name); + }, + stop_all: () => { + return sound.stop_all(); + }, + adjust_volume: (change) => { + return sound.adjust_volume(change); + }, + set_volume: (value) => { + return sound.set_volume(value); + }, + get_volume: () => { + return sound.get_volume(); + }, + adjust_effect: (effect, change) => { + return sound.adjust_effect(effect, change); + }, + set_effect: (effect, value) => { + return sound.set_effect(effect, value); + }, + clear_effects: () => { + return sound.clear_effects(); + }, + play_frequency: (frequency, duration) => { + console.log(`Python调用: sound.play_frequency(${frequency}, ${duration})`); + // 自动判断是否需要阻塞 + if (sound.soundQueue.length > 0 || sound.isProcessingQueue) { + return sound.play_frequency_blocking(frequency, duration); + } + return sound.play_frequency(frequency, duration); + }, + play_frequency_no_duration: (frequency) => { + console.log(`Python调用: sound.play_frequency_no_duration(${frequency})`); + // 自动判断是否需要阻塞 + if (sound.soundQueue.length > 0 || sound.isProcessingQueue) { + return sound.play_frequency_continuous_blocking(frequency); + } + return sound.play_frequency_continuous(frequency); + }, + play_frequency_blocking: (frequency, duration) => { + console.log(`Python调用: sound.play_frequency_blocking(${frequency}, ${duration})`); + return sound.play_frequency_blocking(frequency, duration); + }, + play_frequency_continuous: (frequency) => { + console.log(`Python调用: sound.play_frequency_continuous(${frequency})`); + return sound.play_frequency_continuous(frequency); + }, + play_frequency_continuous_blocking: (frequency) => { + console.log(`Python调用: sound.play_frequency_continuous_blocking(${frequency})`); + return sound.play_frequency_continuous_blocking(frequency); + }, + play_note_list: (noteList) => { + return sound.play_note_list(noteList); + }, + play_note_list_blocking: (noteList) => { + return sound.play_note_list_blocking(noteList); + }, + record: () => { + return sound.record(); + }, + volume: sound.volume, + effects: sound.effects + }; + + window.pyodide.globals.set('sound', pythonSound); + + const ModuleType = window.pyodide.pyimport('types').ModuleType; + const soundModule = new ModuleType('sound'); + + Object.keys(pythonSound).forEach(key => { + if (typeof pythonSound[key] === 'function') { + soundModule[key] = pythonSound[key]; + } else { + soundModule[key] = pythonSound[key]; + } + }); + try { + window.pyodide.runPython(` +import sys +sys.modules['sound'] = sound + +# 创建同步版本的play_blocking包装函数 +import asyncio +from js import Promise + +# 保存原始的play_blocking(返回Promise的版本) +_original_play_blocking = sound.play_blocking + +def _sync_play_blocking(name): + """同步版本的play_blocking,会等待声音播放完成""" + promise = _original_play_blocking(name) + # 使用Pyodide的Promise支持 + # 在Pyodide中,可以直接等待JS Promise + import pyodide + if hasattr(pyodide, 'ffi') and hasattr(pyodide.ffi, 'run_sync'): + # Pyodide 0.21+ + try: + return pyodide.ffi.run_sync(promise) + except Exception: + return None + else: + # 降级方案:使用asyncio + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + # 将JS Promise转换为Python awaitable + async def wait_promise(): + try: + return await promise + except Exception: + return None + + try: + return loop.run_until_complete(wait_promise()) + except Exception: + return None + +# 替换sound.play_blocking为同步版本 +sound.play_blocking = _sync_play_blocking + +# 创建同步版本的play_frequency包装函数 +_original_play_frequency = sound.play_frequency + +def _sync_play_frequency(frequency, duration): + """同步版本的play_frequency,会自动判断是否需要阻塞""" + promise = _original_play_frequency(frequency, duration) + # 使用Pyodide的Promise支持 + import pyodide + if hasattr(pyodide, 'ffi') and hasattr(pyodide.ffi, 'run_sync'): + try: + return pyodide.ffi.run_sync(promise) + except Exception: + return None + else: + import asyncio + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + async def wait_promise(): + try: + return await promise + except Exception: + return None + + try: + return loop.run_until_complete(wait_promise()) + except Exception: + return None + +# 创建同步版本的play_frequency_no_duration包装函数 +_original_play_frequency_no_duration = sound.play_frequency_no_duration + +def _sync_play_frequency_no_duration(frequency): + """同步版本的play_frequency_no_duration,会自动判断是否需要阻塞""" + promise = _original_play_frequency_no_duration(frequency) + # 使用Pyodide的Promise支持 + import pyodide + if hasattr(pyodide, 'ffi') and hasattr(pyodide.ffi, 'run_sync'): + try: + return pyodide.ffi.run_sync(promise) + except Exception: + return None + else: + import asyncio + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + async def wait_promise(): + try: + return await promise + except Exception: + return None + + try: + return loop.run_until_complete(wait_promise()) + except Exception: + return None + +# 替换为同步版本 +sound.play_frequency = _sync_play_frequency +sound.play_frequency_no_duration = _sync_play_frequency_no_duration + +# 创建同步版本的play_frequency_continuous_blocking包装函数 +_original_play_frequency_continuous_blocking = sound.play_frequency_continuous_blocking + +def _sync_play_frequency_continuous_blocking(frequency): + """同步版本的play_frequency_continuous_blocking,会等待频率播放完成""" + promise = _original_play_frequency_continuous_blocking(frequency) + # 使用Pyodide的Promise支持 + import pyodide + if hasattr(pyodide, 'ffi') and hasattr(pyodide.ffi, 'run_sync'): + return pyodide.ffi.run_sync(promise) + else: + import asyncio + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + async def wait_promise(): + return await promise + + return loop.run_until_complete(wait_promise()) + +# 替换为同步版本 +sound.play_frequency_continuous_blocking = _sync_play_frequency_continuous_blocking + +# 创建同步版本的play_frequency_blocking包装函数 +_original_play_frequency_blocking = sound.play_frequency_blocking + +def _sync_play_frequency_blocking(frequency, duration): + """同步版本的play_frequency_blocking,会等待频率播放完成""" + promise = _original_play_frequency_blocking(frequency, duration) + # 使用Pyodide的Promise支持 + import pyodide + if hasattr(pyodide, 'ffi') and hasattr(pyodide.ffi, 'run_sync'): + try: + return pyodide.ffi.run_sync(promise) + except Exception: + return None + else: + import asyncio + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + async def wait_promise(): + try: + return await promise + except Exception: + return None + + try: + return loop.run_until_complete(wait_promise()) + except Exception: + return None + +# 创建同步版本的play_note_list_blocking包装函数 +_original_play_note_list_blocking = sound.play_note_list_blocking + +def _sync_play_note_list_blocking(note_list): + """同步版本的play_note_list_blocking,会等待音符列表播放完成""" + promise = _original_play_note_list_blocking(note_list) + # 使用Pyodide的Promise支持 + import pyodide + if hasattr(pyodide, 'ffi') and hasattr(pyodide.ffi, 'run_sync'): + try: + return pyodide.ffi.run_sync(promise) + except Exception: + return None + else: + import asyncio + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + async def wait_promise(): + try: + return await promise + except Exception: + return None + + try: + return loop.run_until_complete(wait_promise()) + except Exception: + return None + +# 替换为同步版本 +sound.play_frequency_blocking = _sync_play_frequency_blocking +sound.play_note_list_blocking = _sync_play_note_list_blocking + `); + } catch (runError) { + if (isKeyboardInterruptError(runError)) { + isInjecting = false; + return false; + } + throw runError; + } + + const testSound = window.pyodide.globals.get('sound'); + if (testSound) { + isInjecting = false; + return true; + } + isInjecting = false; + console.error('Sound对象注入失败:验证时未找到对象'); + return false; + } catch (error) { + isInjecting = false; + if (isKeyboardInterruptError(error)) { + return false; + } + console.error('注入sound对象到Python环境失败:', error); + return false; + } + } + return false; +} + +function initializeSoundSystem() { + if (injectSoundToPython()) { + return; + } + + const soundInjectionInterval = setInterval(() => { + if (injectSoundToPython()) { + clearInterval(soundInjectionInterval); + } + }, 100); + + setTimeout(() => { + clearInterval(soundInjectionInterval); + }, 10000); +} + +function startAllSystems() { + patchPythonShell(); + initializeSoundSystem(); +} + +function forceInjectSound() { + if (window.pyodide && window.pyodide.globals) { + try { + const existingSound = window.pyodide.globals.get('sound'); + if (!existingSound) { + injectSoundToPython(); + } + } catch (error) { + if (isKeyboardInterruptError(error)) { + return; + } + console.warn('强制注入检查失败:', error); + } + } +} + +function interceptPythonExecution() { + const originalEval = window.eval; + window.eval = function(code) { + if (typeof code === 'string' && code.includes('sound.')) { + try { + forceInjectSound(); + } catch (error) { + if (!isKeyboardInterruptError(error)) { + console.warn('执行拦截时出错:', error); + } + } + } + return originalEval.call(this, code); + }; + + if (window.pyodide && window.pyodide.runPython) { + const originalRunPython = window.pyodide.runPython; + window.pyodide.runPython = function(code) { + if (typeof code === 'string' && code.includes('sound.')) { + try { + forceInjectSound(); + } catch (error) { + if (!isKeyboardInterruptError(error)) { + console.warn('执行拦截时出错:', error); + } + } + } + return originalRunPython.call(this, code); + }; + } +} +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => { + startAllSystems(); + interceptPythonExecution(); + }); +} else { + startAllSystems(); + interceptPythonExecution(); +} + +window.addEventListener('pyodideLoaded', () => { + startAllSystems(); + interceptPythonExecution(); +}); + +setTimeout(() => { + startAllSystems(); + interceptPythonExecution(); +}, 1000); + +window.addEventListener('load', () => { + startAllSystems(); + interceptPythonExecution(); +}); + +setInterval(forceInjectSound, 5000); \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/statusbar-filesystem.js b/mixly/boards/default_src/python_pyodide/others/statusbar-filesystem.js new file mode 100644 index 00000000..0c3e1ed8 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/statusbar-filesystem.js @@ -0,0 +1,496 @@ +import * as Blockly from 'blockly/core'; +import { layer } from 'layui'; +import * as path from 'path'; +import $ from 'jquery'; +import { + PageBase, + Msg, + HTMLTemplate, + DragV, + StatusBar, + Menu, + Debug, + StatusBarsManager, + Workspace +} from 'mixly'; +import FileSystemFileTree from './filesystem-file-tree'; +import FILE_SYSTEM_TEMPLATE from '../templates/html/statusbar-filesystem.html'; +import FILE_SYSTEM_OPEN_FS_TEMPLATE from '../templates/html/statusbar-filesystem-open-fs.html'; +import FILE_SYSTEM_EDITOR_EMPTY_TEMPLATE from '../templates/html/statusbar-filesystem-editor-empty.html'; + + + +export default class StatusBarFileSystem extends PageBase { + static { + HTMLTemplate.add( + 'html/statusbar/statusbar-filesystem.html', + new HTMLTemplate(FILE_SYSTEM_TEMPLATE) + ); + + HTMLTemplate.add( + 'html/statusbar/statusbar-filesystem-open-fs.html', + new HTMLTemplate(FILE_SYSTEM_OPEN_FS_TEMPLATE) + ); + + HTMLTemplate.add( + 'html/statusbar/statusbar-filesystem-editor-empty.html', + new HTMLTemplate(FILE_SYSTEM_EDITOR_EMPTY_TEMPLATE) + ); + + this.init = function () { + StatusBarsManager.typesRegistry.register(['file-system'], StatusBarFileSystem); + const mainWorkspace = Workspace.getMain(); + const statusBarsManager = mainWorkspace.getStatusBarsManager(); + statusBarsManager.add({ + type: 'file-system', + id: 'file-system', + name: Blockly.Msg.PYTHON_PYODIDE_FILE_SYSTEM, + title: Blockly.Msg.PYTHON_PYODIDE_FILE_SYSTEM + }); + statusBarsManager.changeTo('output'); + return statusBarsManager.get('file-system'); + } + } + + #$close_ = null; + #$fileTree_ = null; + #$editor_ = null; + #$openFS_ = null; + #$editorEmpty_ = null; + #editor_ = null; + #fileTree_ = null; + #drag_ = null; + #fileTreeShown_ = false; + #editorShown_ = false; + #changed_ = false; + #nativefs_ = null; + + constructor() { + super(); + const $content = $(HTMLTemplate.get('html/statusbar/statusbar-filesystem.html').render()); + this.setContent($content); + this.#fileTree_ = new FileSystemFileTree(); + this.#$fileTree_ = $content.children('.file-tree'); + this.#$openFS_ = $(HTMLTemplate.get('html/statusbar/statusbar-filesystem-open-fs.html').render({ + msg: { + loadFS: Blockly.Msg.PYTHON_PYODIDE_LOAD_FILE_SYSTEM + } + })); + this.#$fileTree_.append(this.#$openFS_); + this.#editor_ = new StatusBar(); + this.#$editor_ = $content.children('.editor'); + this.#$editorEmpty_ = $(HTMLTemplate.get('html/statusbar/statusbar-filesystem-editor-empty.html').render()); + this.#$editor_.append(this.#$editorEmpty_); + } + + #addEventsListener_() { + this.#drag_ = new DragV(this.getContent()[0], { + min: '150px', + startSize: '15%', + full: [false, false] + }); + + this.#drag_.bind('sizeChanged', () => { + this.resize(); + }); + + this.#$openFS_.children('button').click(() => { + this.selectFS().catch(Debug.error); + }); + + this.#fileTree_.bind('beforeSelectLeaf', (selected) => { + const filePath = selected[0].id; + const mode = this.#editor_.getFileMode(path.extname(filePath)); + if (!mode) { + layer.msg(Msg.Lang['statusbar.ampy.cannotEdit'], { time: 1000 }); + return false; + } + this.#editor_.setMode(mode); + return true; + }); + + this.#fileTree_.bind('afterSelectLeaf', async (selected) => { + const filePath = selected[0].id; + this.#fileTree_.showProgress(); + const fs = this.#fileTree_.getFS(); + try { + const result = await fs.readFile(filePath); + this.showEditor(); + this.#editor_.setValue(result); + this.#editor_.scrollToTop(); + this.#editor_.focus(); + this.setStatus(false); + } catch (error) { + Debug.error(error); + this.hideEditor(); + this.#fileTree_.deselectAll(); + } + this.#fileTree_.hideProgress(); + }); + + this.#fileTree_.bind('afterCreateNode', (folderPath) => { + this.#fileTree_.refreshFolder(folderPath); + }); + + this.#fileTree_.bind('afterDeleteNode', (folderPath) => { + this.#fileTree_.refreshFolder(folderPath); + }); + + this.#fileTree_.bind('afterRenameNode', (folderPath) => { + this.#fileTree_.refreshFolder(folderPath); + }); + + this.#fileTree_.bind('afterRefreshNode', () => { + const selectedNodeId = this.#fileTree_.getSelectedNodeId(); + if (!selectedNodeId) { + this.hideEditor(); + } + }); + + const fileTreeContextMenu = this.#fileTree_.getContextMenu(); + const fileTreeMenu = fileTreeContextMenu.getItem('menu'); + + fileTreeMenu.add({ + weight: 7, + id: 'copy_path', + data: { + isHtmlName: true, + name: Menu.getItem(Msg.Lang['fileTree.copyPath']), + callback: (_, { $trigger }) => { + let outPath = null; + let type = $trigger.attr('type'); + if (type === 'root') { + outPath = this.#fileTree_.getRootFolderTitle(); + } else { + outPath = $trigger.attr('title'); + } + navigator.clipboard.writeText(outPath).catch(Debug.error); + } + } + }); + + fileTreeMenu.add({ + weight: 14, + id: 'sep5', + preconditionFn: ($trigger) => { + const selectedNodeId = this.#fileTree_.getSelectedNodeId(); + let type = $trigger.attr('type'); + let id = $trigger.attr('id'); + if (type === 'file' && selectedNodeId !== id) { + return false; + } + return true; + }, + data: '---------' + }); + + fileTreeMenu.add({ + weight: 15, + id: 'refresh', + preconditionFn: ($trigger) => { + const selectedNodeId = this.#fileTree_.getSelectedNodeId(); + let type = $trigger.attr('type'); + let id = $trigger.attr('id'); + if (type === 'file' && selectedNodeId !== id) { + return false; + } + return true; + }, + data: { + isHtmlName: true, + name: Menu.getItem(Msg.Lang['statusbar.ampy.refresh']), + callback: (_, { $trigger }) => { + let type = $trigger.attr('type'); + if (type === 'root') { + this.#fileTree_.openRootFolder(); + this.#fileTree_.refreshFolder('/'); + } else if (type === 'folder') { + let id = $trigger.attr('id'); + this.#fileTree_.openNode(id); + this.#fileTree_.refreshFolder(id); + } else { + const nodes = this.#fileTree_.getSelectedNodes(); + this.#fileTree_.runEvent('afterSelectLeaf', nodes); + } + } + } + }); + + fileTreeMenu.add({ + weight: 16, + id: 'sep6', + preconditionFn: ($trigger) => { + let type = $trigger.attr('type'); + return ['root'].includes(type); + }, + data: '---------' + }); + + fileTreeMenu.add({ + weight: 17, + id: 'exit', + preconditionFn: ($trigger) => { + let type = $trigger.attr('type'); + return ['root'].includes(type); + }, + data: { + isHtmlName: true, + name: Menu.getItem(Msg.Lang['statusbar.ampy.exit']), + callback: () => { + this.closeFS(); + } + } + }); + + fileTreeMenu.remove('copy'); + fileTreeMenu.remove('cut'); + fileTreeMenu.remove('paste'); + fileTreeMenu.remove('sep2'); + + const editorContextMenu = this.#editor_.getContextMenu(); + const editorMenu = editorContextMenu.getItem('code'); + + editorMenu.empty(); + + editorMenu.add({ + weight: 0, + id: 'cut', + data: { + isHtmlName: true, + name: Menu.getItem(Msg.Lang['editor.contextMenu.cut'], 'Ctrl+X'), + callback: () => this.#editor_.cut() + } + }); + editorMenu.add({ + weight: 1, + id: 'copy', + data: { + isHtmlName: true, + name: Menu.getItem(Msg.Lang['editor.contextMenu.copy'], 'Ctrl+C'), + callback: () => this.#editor_.copy() + } + }); + editorMenu.add({ + weight: 2, + id: 'paste', + data: { + isHtmlName: true, + name: Menu.getItem(Msg.Lang['editor.contextMenu.paste'], 'Ctrl+V'), + callback: () => this.#editor_.paste() + } + }); + editorMenu.add({ + weight: 3, + id: 'sep1', + data: '---------' + }); + editorMenu.add({ + weight: 4, + id: 'togglecomment', + data: { + isHtmlName: true, + name: Menu.getItem(Msg.Lang['editor.contextMenu.togglecomment'], 'Ctrl+/'), + callback: () => this.#editor_.commentLine() + } + }); + + editorMenu.add({ + weight: 6, + id: 'sep2', + preconditionFn: () => { + return this.#changed_; + }, + data: '---------' + }); + + editorMenu.add({ + weight: 7, + id: 'save', + preconditionFn: () => { + return this.#changed_; + }, + data: { + isHtmlName: true, + name: Menu.getItem(Msg.Lang['file.save'], 'Ctrl+S'), + callback: async () => { + await this.put(); + } + } + }); + + const { commands } = this.#editor_.getEditor(); + commands.addCommand({ + name: "save", + bindKey: "Ctrl-S", + exec: async () => { + if (!this.#changed_) { + return; + } + await this.put(); + } + }); + } + + async put() { + this.#fileTree_.showProgress(); + const id = this.#fileTree_.getSelectedNodeId(); + const fs = this.#fileTree_.getFS(); + try { + await fs.writeFile(id, this.#editor_.getValue()); + this.setStatus(false); + } catch (error) { + Debug.error(error); + } finally { + this.#fileTree_.hideProgress(); + } + } + + showFileTree() { + if (this.#fileTreeShown_) { + return; + } + this.#$openFS_.detach(); + this.#$fileTree_.empty(); + this.#$fileTree_.append(this.#fileTree_.getContent()); + this.#fileTreeShown_ = true; + } + + hideFileTree() { + if (!this.#fileTreeShown_) { + return; + } + this.#fileTree_.getContent().detach(); + this.#$fileTree_.empty(); + this.#$fileTree_.append(this.#$openFS_); + this.#fileTreeShown_ = false; + } + + showEditor() { + if (this.#editorShown_) { + return; + } + this.#$editorEmpty_.detach(); + this.#$editor_.empty(); + this.#$editor_.append(this.#editor_.getContent()); + this.#editorShown_ = true; + } + + hideEditor() { + if (!this.#editorShown_) { + return; + } + this.#editor_.getContent().detach(); + this.#$editor_.empty(); + this.#$editor_.append(this.#$editorEmpty_); + this.#editorShown_ = false; + this.setStatus(false); + } + + getDrag() { + return this.#drag_; + } + + init() { + super.init(); + this.hideCloseBtn(); + this.#editor_.init(); + this.#addEventsListener_(); + const editor = this.#editor_.getEditor(); + editor.setReadOnly(false); + editor.renderer.setShowGutter(true); + editor.setOptions({ + enableBasicAutocompletion: true, + enableSnippets: true, + enableLiveAutocompletion: true, + newLineMode: 'unix' + }); + editor.on('change', () => { + this.setStatus(true); + }); + this.loadFS().catch(Debug.error); + } + + async loadFS() { + const fs = this.#fileTree_.getFS(); + const directoryHandle = await fs.loadFS(); + await this.openFS(directoryHandle); + } + + async selectFS() { + const fs = this.#fileTree_.getFS(); + const directoryHandle = await fs.showDirectoryPicker(); + await this.openFS(directoryHandle); + } + + async openFS(directoryHandle) { + if (!directoryHandle?.name) { + return; + } + const rootPath = '/' + directoryHandle.name; + this.#fileTree_.setFolderPath('/'); + this.#fileTree_.setRootFolderTitle(rootPath); + this.#fileTree_.setRootFolderName(directoryHandle.name); + this.#fileTree_.openRootFolder(); + this.showFileTree(); + this.#nativefs_ = await window.pyodide.mountNativeFS(rootPath, directoryHandle); + } + + closeFS() { + const rootPath = this.#fileTree_.getRootFolderTitle(); + const rootContents = Object.keys(window.pyodide.FS.root.contents); + if (rootContents.includes(path.basename(rootPath))) { + const lookup = window.pyodide.FS.lookupPath(rootPath, { + follow_mount: false + }); + if (window.pyodide.FS.isMountpoint(lookup.node)) { + window.pyodide.FS.unmount(rootPath); + } + } + const fs = this.#fileTree_.getFS(); + fs.setFSCache(null); + this.#fileTree_.deselectAll(); + this.hideFileTree(); + this.hideEditor(); + this.setStatus(false); + } + + onMounted() { + super.onMounted(); + this.#editor_.onMounted(); + this.#fileTree_.onMounted(); + // this.#fileTree_.refreshFolder('/'); + } + + onUnmounted() { + // this.hideEditor(); + // this.#fileTree_.deselectAll(); + super.onUnmounted(); + this.#editor_.onUnmounted(); + this.#fileTree_.onUnmounted(); + } + + resize() { + super.resize(); + this.#editor_.resize(); + this.#fileTree_.resize(); + } + + setStatus(isChanged) { + if (this.#changed_ === isChanged) { + return; + } + this.#changed_ = isChanged; + } + + getNativeFS() { + return this.#nativefs_; + } + + dispose() { + this.#editor_.dispose(); + this.#editor_ = null; + this.#fileTree_.dispose(); + this.#fileTree_ = null; + super.dispose(); + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/statusbar-game.js b/mixly/boards/default_src/python_pyodide/others/statusbar-game.js new file mode 100644 index 00000000..325fea0d --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/statusbar-game.js @@ -0,0 +1,227 @@ +import $ from 'jquery'; +import { Msg } from 'blockly/core'; +import { + PageBase, + HTMLTemplate, + StatusBarsManager, + Workspace +} from 'mixly'; +import '../language/loader'; +import STATUS_BAR_GAME_TEMPLATE from '../templates/html/statusbar-game.html'; + + +export default class StatusBarGame extends PageBase { + static { + HTMLTemplate.add( + 'html/statusbar/statusbar-game.html', + new HTMLTemplate(STATUS_BAR_GAME_TEMPLATE) + ); + + this.init = function () { + StatusBarsManager.typesRegistry.register(['game'], StatusBarGame); + const mainWorkspace = Workspace.getMain(); + const statusBarsManager = mainWorkspace.getStatusBarsManager(); + statusBarsManager.add({ + type: 'game', + id: 'game', + name: Msg.PYTHON_PYODIDE_GAME, + title: Msg.PYTHON_PYODIDE_GAME + }); + statusBarsManager.changeTo('output'); + return statusBarsManager.get('game'); + } + } + + #$startBtn_ = null; + #$pauseBtn_ = null; + #$randomBtn_ = null; + #$resetBtn_ = null; + #$generation_ = null; + #$grid_ = null; + #GRID_SIZE_ = 10; + #SPEED_ = 500; + #grid_ = []; + #isRunning_ = false; + #generation_ = 0; + #intervalId_ = null; + + constructor() { + super(); + const $content = $(HTMLTemplate.get('html/statusbar/statusbar-game.html').render({ + epoch: Msg.PYTHON_PYODIDE_GAME_EPOCH, + start: Msg.PYTHON_PYODIDE_GAME_START, + pause: Msg.PYTHON_PYODIDE_GAME_PAUSE, + random: Msg.PYTHON_PYODIDE_GAME_RANDOM, + reset: Msg.PYTHON_PYODIDE_GAME_RESET + })); + this.setContent($content); + this.#$startBtn_ = $content.find('.start-btn'); + this.#$pauseBtn_ = $content.find('.pause-btn'); + this.#$randomBtn_ = $content.find('.random-btn'); + this.#$resetBtn_ = $content.find('.reset-btn'); + this.#$generation_ = $content.find('.generation'); + this.#$grid_ = $content.find('.grid'); + this.#addEventListeners_(); + } + + #addEventListeners_() { + this.#$startBtn_.click(() => this.startGame()); + this.#$pauseBtn_.click(() => this.pauseGame()); + this.#$randomBtn_.click(() => this.randomInitialize()); + this.#$resetBtn_.click(() => this.resetGame()); + } + + // 初始化网格 + initializeGrid() { + this.#$grid_.empty(); + this.#grid_ = []; + + for (let i = 0; i < this.#GRID_SIZE_; i++) { + this.#grid_[i] = []; + for (let j = 0; j < this.#GRID_SIZE_; j++) { + this.#grid_[i][j] = 0; // 0表示死亡,1表示存活 + + const cell = document.createElement('div'); + cell.className = 'cell'; + cell.dataset.row = i; + cell.dataset.col = j; + + cell.addEventListener('click', () => this.toggleCell(i, j)); + + this.#$grid_.append(cell); + } + } + this.updateGridDisplay(); + } + + // 切换细胞状态 + toggleCell(row, col) { + if (!this.#isRunning_) { + this.#grid_[row][col] = this.#grid_[row][col] === 0 ? 1 : 0; + this.updateGridDisplay(); + } + } + + // 更新网格显示 + updateGridDisplay() { + const $cells = this.#$grid_.children('.cell'); + for (let i = 0; i < $cells.length; i++) { + const cell = $cells[i]; + const row = parseInt(cell.dataset.row); + const col = parseInt(cell.dataset.col); + if (this.#grid_[row][col] === 1) { + cell.classList.add('alive'); + } else { + cell.classList.remove('alive'); + } + } + } + + // 计算下一代 + nextGeneration() { + const newGrid = []; + + for (let i = 0; i < this.#GRID_SIZE_; i++) { + newGrid[i] = []; + for (let j = 0; j < this.#GRID_SIZE_; j++) { + const neighbors = this.countNeighbors(i, j); + + if (this.#grid_[i][j] === 1) { + // 存活细胞:周围有2-3个存活细胞则继续存活 + newGrid[i][j] = (neighbors === 2 || neighbors === 3) ? 1 : 0; + } else { + // 死亡细胞:周围有3个存活细胞则复活 + newGrid[i][j] = neighbors === 3 ? 1 : 0; + } + } + } + + this.#grid_ = newGrid; + this.#generation_++; + this.#$generation_.text(this.#generation_); + this.updateGridDisplay(); + } + + // 计算周围存活细胞数量 + countNeighbors(row, col) { + let count = 0; + for (let i = -1; i <= 1; i++) { + for (let j = -1; j <= 1; j++) { + if (i === 0 && j === 0) continue; // 跳过自身 + + const newRow = row + i; + const newCol = col + j; + + // 检查边界 + if (newRow >= 0 && newRow < this.#GRID_SIZE_ && newCol >= 0 && newCol < this.#GRID_SIZE_) { + count += this.#grid_[newRow][newCol]; + } + } + } + return count; + } + + // 开始游戏 + startGame() { + if (!this.#isRunning_) { + this.#isRunning_ = true; + this.#generation_ = 0; + this.#$generation_.text(this.#generation_); + this.#intervalId_ = setInterval(() => this.nextGeneration(), this.#SPEED_); + this.updateButtons(); + } + } + + // 暂停游戏 + pauseGame() { + if (this.#isRunning_) { + this.#isRunning_ = false; + clearInterval(this.#intervalId_); + this.updateButtons(); + } + } + + // 随机初始化网格 + randomInitialize() { + if (!this.#isRunning_) { + for (let i = 0; i < this.#GRID_SIZE_; i++) { + for (let j = 0; j < this.#GRID_SIZE_; j++) { + // 25%的概率生成存活细胞 + this.#grid_[i][j] = Math.random() < 0.25 ? 1 : 0; + } + } + this.updateGridDisplay(); + } + } + + // 重置游戏 + resetGame() { + this.#isRunning_ = false; + clearInterval(this.#intervalId_); + this.#generation_ = 0; + this.#$generation_.text(this.#generation_); + this.initializeGrid(); + this.updateButtons(); + } + + // 更新按钮状态 + updateButtons() { + this.#$startBtn_.attr('disabled', this.#isRunning_); + this.#$pauseBtn_.attr('disabled', !this.#isRunning_); + this.#$randomBtn_.attr('disabled', this.#isRunning_); + this.#$resetBtn_.attr('disabled', false); + } + + init() { + super.init(); + this.hideCloseBtn(); + this.initializeGrid(); + this.updateButtons(); + } + + onMounted() { } + + onUnmounted() { } + + resize() { } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/statusbar-image.js b/mixly/boards/default_src/python_pyodide/others/statusbar-image.js new file mode 100644 index 00000000..969d9cd3 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/statusbar-image.js @@ -0,0 +1,173 @@ +import $ from 'jquery'; +import { Msg } from 'blockly/core'; +import { + PageBase, + HTMLTemplate, + StatusBarsManager, + Workspace +} from 'mixly'; +import '../language/loader'; +import STATUS_BAR_IMAGE_TEMPLATE from '../templates/html/statusbar-image.html'; + + +export default class StatusBarImage extends PageBase { + static { + HTMLTemplate.add( + 'html/statusbar/statusbar-image.html', + new HTMLTemplate(STATUS_BAR_IMAGE_TEMPLATE) + ); + + this.init = function () { + StatusBarsManager.typesRegistry.register(['images'], StatusBarImage); + const mainWorkspace = Workspace.getMain(); + const statusBarsManager = mainWorkspace.getStatusBarsManager(); + statusBarsManager.add({ + type: 'images', + id: 'images', + name: Msg.PYTHON_PYODIDE_IMAGE, + title: Msg.PYTHON_PYODIDE_IMAGE + }); + statusBarsManager.changeTo('output'); + return statusBarsManager.get('images'); + } + } + + constructor() { + super(); + const $content = $(HTMLTemplate.get('html/statusbar/statusbar-image.html').render()); + this.setContent($content); + } + + init() { + super.init(); + this.hideCloseBtn(); + } + + clean() { + this.getContent().empty(); + } + + display(data) { + const $content = this.getContent(); + const autoFit = function (node) { + node.style.width = 'auto'; + node.style.height = 'auto'; + node.style.maxWidth = '100%'; + node.style.maxHeight = '100%'; + }; + this.clean(); + let root = data.content; + let canvas = null; + let iframe = null; + switch (data.display_type) { + case 'p5': + root.style.width = '100%'; + root.style.height = '100%'; + root.style.display = 'flex'; + root.style.justifyContent = 'center'; + root.style.alignItems = 'center'; + + // some canvas nodes can be added later so we observe... + new MutationObserver(function (mutationsList) { + mutationsList.forEach((mutation) => + mutation.addedNodes.forEach((node) => { + const elem = node; + if ( + elem.tagName != null && + ['canvas', 'video'].includes(elem.tagName.toLowerCase()) + ) + autoFit(elem); + }) + ); + }).observe(root, { childList: true }); + + root.querySelectorAll('canvas,video').forEach(autoFit); + $content.append(root); + break; + case 'matplotlib': + canvas = root.querySelector('canvas'); + if (canvas) root = canvas; + root.style.width = ''; + root.style.height = ''; + root.style.maxWidth = '100%'; + root.style.maxHeight = '100%'; + $content.append(root); + break; + case 'ocaml-canvas': + root.style.width = ''; + root.style.height = ''; + root.style.maxWidth = '100%'; + root.style.maxHeight = '100%'; + $content.append(root); + break; + case 'turtle': + // Turtle result + root.setAttribute('width', '100%'); + root.setAttribute('height', '100%'); + $content.append(root.outerHTML); + break; + case 'sympy': + $content.append(data.content); + if (typeof window.MathJax === 'undefined') { + // dynamically loading MathJax + console.log('Loading MathJax (Sympy expression needs it).'); + (function () { + let script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = + 'https://cdn.jsdelivr.net/npm/mathjax@3.0.5/es5/tex-mml-chtml.js'; + document.getElementsByTagName('head')[0].appendChild(script); + })(); + } else { + // otherwise, render it + window.MathJax.typeset(); + } + break; + case 'multiple': + /* typically dispached by display() */ + for (let mime of [ + 'image/svg+xml', + 'image/png', + 'text/html', + 'text/plain', + ]) { + if (mime in data.content) { + let content = data.content[mime]; + if (mime === 'image/png') { + content = + ''; + } + $content.append(content); + break; + } + } + break; + case 'tutor': + // hacky but iframe.document.body.style require to wait for + // iframe loading + $content.append($(data.content.replace('overflow-y%3A%20hidden%3B', ''))); + iframe = this.getContent()[0].getElementsByTagName('iframe')[0]; + if (iframe == null) return; + // trick to avoid taking height update into account + iframe.style.maxHeight = iframe.style.minHeight = '100%'; + + // force rendering when visible, + // otherwise, strange things happends + // since PythonTutor check for visibility at some point + new IntersectionObserver((entries, observer) => { + const entry = entries[0]; + if (entry && !entry.isIntersecting) return; + iframe.contentWindow?.postMessage({ type: 'redraw' }, '*'); + observer.disconnect(); + }).observe(iframe); + + break; + default: + console.error( + `Not supported node type '${data.display_type}' in eval.display result processing.` + ); + } + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/statusbar-tool.js b/mixly/boards/default_src/python_pyodide/others/statusbar-tool.js new file mode 100644 index 00000000..cfde24a2 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/statusbar-tool.js @@ -0,0 +1,51 @@ +import $ from 'jquery'; +import { Msg } from 'blockly/core'; +import { + PageBase, + HTMLTemplate, + StatusBarsManager, + Workspace +} from 'mixly'; +import '../language/loader'; +import STATUS_BAR_TOOL_TEMPLATE from '../templates/html/statusbar-tool.html'; + + +export default class StatusBarTool extends PageBase { + static { + HTMLTemplate.add( + 'html/statusbar/statusbar-tool.html', + new HTMLTemplate(STATUS_BAR_TOOL_TEMPLATE) + ); + + this.init = function () { + StatusBarsManager.typesRegistry.register(['tool'], StatusBarTool); + const mainWorkspace = Workspace.getMain(); + const statusBarsManager = mainWorkspace.getStatusBarsManager(); + statusBarsManager.add({ + type: 'tool', + id: 'tool', + name: Msg.PYTHON_PYODIDE_TOOL, + title: Msg.PYTHON_PYODIDE_TOOL + }); + statusBarsManager.changeTo('output'); + return statusBarsManager.get('tool'); + } + } + + constructor() { + super(); + const $content = $(HTMLTemplate.get('html/statusbar/statusbar-tool.html').render()); + this.setContent($content); + } + + init() { + super.init(); + this.hideCloseBtn(); + } + + onMounted() { } + + onUnmounted() { } + + resize() { } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/App.vue b/mixly/boards/default_src/python_pyodide/others/teachableMachine/App.vue new file mode 100644 index 00000000..2ae86a68 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/App.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel.vue b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel.vue new file mode 100644 index 00000000..c2d39104 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/CameraBox.vue b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/CameraBox.vue new file mode 100644 index 00000000..d7a3175c --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/CameraBox.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/ClassBox.vue b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/ClassBox.vue new file mode 100644 index 00000000..477b7ef5 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/ClassBox.vue @@ -0,0 +1,357 @@ + + + + + diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/ModelArea.vue b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/ModelArea.vue new file mode 100644 index 00000000..177b4256 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/ModelArea.vue @@ -0,0 +1,517 @@ + + + + + diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/TrainArea.vue b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/TrainArea.vue new file mode 100644 index 00000000..d43dbb69 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/components/teachableModel/TrainArea.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/composables/dark.ts b/mixly/boards/default_src/python_pyodide/others/teachableMachine/composables/dark.ts new file mode 100644 index 00000000..5467599b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/composables/dark.ts @@ -0,0 +1,4 @@ +import { useDark, useToggle } from '@vueuse/core' + +export const isDark = useDark() +export const toggleDark = useToggle(isDark) diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/composables/index.ts b/mixly/boards/default_src/python_pyodide/others/teachableMachine/composables/index.ts new file mode 100644 index 00000000..e8d15660 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/composables/index.ts @@ -0,0 +1 @@ +export * from './dark' diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/styles/element/dark.scss b/mixly/boards/default_src/python_pyodide/others/teachableMachine/styles/element/dark.scss new file mode 100644 index 00000000..ada5c8cd --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/styles/element/dark.scss @@ -0,0 +1,8 @@ +// only scss variables + +$--colors: ( + "primary": ("base": #589ef8, + ), +); + +@forward "element-plus/theme-chalk/src/dark/var.scss" with ($colors: $--colors); \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/styles/element/index.scss b/mixly/boards/default_src/python_pyodide/others/teachableMachine/styles/element/index.scss new file mode 100644 index 00000000..331fcb4b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/styles/element/index.scss @@ -0,0 +1,33 @@ +$--colors: ( + 'primary': ('base': green, + ), + 'success': ('base': #21ba45, + ), + 'warning': ('base': #f2711c, + ), + 'danger': ('base': #db2828, + ), + 'error': ('base': #db2828, + ), + 'info': ('base': #42b8dd, + ), +); + +// we can add this to custom namespace, default is 'el' +@forward 'element-plus/theme-chalk/src/mixins/config.scss' with ($namespace: 'ep' +); + +// You should use them in scss, because we calculate it by sass. +// comment next lines to use default color +@forward 'element-plus/theme-chalk/src/common/var.scss' with ( // do not use same name, it will override. + $colors: $--colors, + $button-padding-horizontal: ('default': 50px)); + +// if you want to import all +// @use "element-plus/theme-chalk/src/index.scss" as *; + +// You can comment it to hide debug info. +// @debug $--colors; + +// custom dark variables +@use './dark.scss'; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/teachableMachine/styles/index.scss b/mixly/boards/default_src/python_pyodide/others/teachableMachine/styles/index.scss new file mode 100644 index 00000000..3c5c5c95 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/teachableMachine/styles/index.scss @@ -0,0 +1,28 @@ +// import dark theme +@use 'element-plus/theme-chalk/src/dark/css-vars.scss' as *; + +// :root { +// --ep-color-primary: red; +// } + +code { + border-radius: 2px; + padding: 2px 4px; + background-color: var(--ep-color-primary-light-9); + color: var(--ep-color-primary); +} + +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: rgb(13, 148, 136); + opacity: 0.75; + position: fixed; + z-index: 1031; + top: 0; + left: 0; + width: 100%; + height: 2px; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/others/tensorflow.js b/mixly/boards/default_src/python_pyodide/others/tensorflow.js new file mode 100644 index 00000000..d6a3ef2d --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/others/tensorflow.js @@ -0,0 +1,58 @@ +import { Registry } from 'mixly'; +import * as tf from '@tensorflow/tfjs'; + + +const modelsValueRegistry = new Registry(); +const customFetch = function (path) { + let result = { + ok: false, + buffer: null, + json: function () { + const decoder = new TextDecoder('utf-8'); + const jsonText = decoder.decode(this.buffer); + return JSON.parse(jsonText); + }, + arrayBuffer: function () { + return this.buffer; + } + } + if (!modelsValueRegistry.hasKey(path)) { + return result; + } + result.ok = true; + result.buffer = modelsValueRegistry.getItem(path); + return result; +}; + +const tensorflow = {}; +tensorflow.modelsValue = {}; + +tensorflow.loadGraphModel = async function (path) { + const model = await tf.loadGraphModel(path, { + fromTFHub: false, + fetchFunc: (...args) => { + return customFetch(args[0]); + } + }); + return model; +}; + +tensorflow.loadLayersModel = async function (path) { + const model = await tf.loadLayersModel(path, { + fromTFHub: false, + fetchFunc: (...args) => { + return customFetch(args[0]); + } + }); + return model; +}; + +tensorflow.setModelsValue = function (path, value) { + if (modelsValueRegistry.hasKey(path)) { + modelsValueRegistry.unregister(path); + } + modelsValueRegistry.register(path, value); + tensorflow.modelsValue[path] = value; +}; + +window.tensorflow = tensorflow; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/package.json b/mixly/boards/default_src/python_pyodide/package.json new file mode 100644 index 00000000..5017930d --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/package.json @@ -0,0 +1,60 @@ +{ + "name": "@mixly/python-pyodide", + "version": "1.1.0", + "description": "适用于mixly的python pyodide模块", + "scripts": { + "serve": "webpack-dev-server --config=webpack.dev.js", + "build:dev": "webpack --config=webpack.dev.js", + "build:prod": "npm run build:examples & webpack --config=webpack.prod.js", + "build:examples": "node ../../../scripts/build-examples.js -t special", + "build:examples:ob": "node ../../../scripts/build-examples.js -t special --obfuscate", + "build:examples:": "node ../../../scripts/build-examples.js -t special", + "publish:board": "npm publish --registry https://registry.npmjs.org/" + }, + "devDependencies": { + "@vue/compiler-sfc": "^3.5.21", + "buffer": "^6.0.3", + "crypto-browserify": "^3.12.0", + "path-browserify": "^1.0.1", + "sass": "^1.93.0", + "sass-loader": "^16.0.5", + "stream-browserify": "^3.0.0", + "vm-browserify": "^1.1.2", + "vue-loader": "^17.0.0", + "vue-style-loader": "^4.1.3" + }, + "dependencies": { + "@basthon/kernel-loader": "^0.62.21", + "@element-plus/icons-vue": "^2.3.2", + "@tensorflow/tfjs": "^4.22.0", + "@tensorflow/tfjs-vis": "^1.5.1", + "@zenfs/core": "^1.4.0", + "@zenfs/dom": "^1.0.6", + "element-plus": "^2.11.3", + "file-saver": "^2.0.5", + "idb-keyval": "^6.2.1", + "jszip": "^3.10.1", + "pixi.js": "^3.0.8", + "vue": "^3.5.13" + }, + "main": "./export.js", + "author": "Mixly Team", + "keywords": [ + "mixly", + "mixly-plugin", + "python-pyodide" + ], + "homepage": "https://gitee.com/bnu_mixly/mixly3/tree/master/boards/default_src/python_pyodide", + "bugs": { + "url": "https://gitee.com/bnu_mixly/mixly3/issues" + }, + "repository": { + "type": "git", + "url": "https://gitee.com/bnu_mixly/mixly3.git", + "directory": "default_src/python_pyodide" + }, + "publishConfig": { + "access": "public" + }, + "license": "Apache 2.0" +} diff --git a/mixly/boards/default_src/python_pyodide/template.xml b/mixly/boards/default_src/python_pyodide/template.xml new file mode 100644 index 00000000..06e62cd6 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/template.xml @@ -0,0 +1,3922 @@ +<%= htmlWebpackPlugin.tags.headTags.join('\n') %> + + + + + + prompt + + + + + + + Hello + + + + + + + Hello + + + + + + + Hello + + + + + , + + + + + + + + Hello + + + + + Mixly + + + + + + + + + + 2 + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + + 0,1,2,3 + + + + + 0 + + + + + 5 + + + + + 1 + + + + + + + i + + + + + + + + + DIVIDE + + + 1 + + + + + 0 + + + + + + + + + Exception as e + + + + + + + e + + + + + + + + + testThread + + + + + + + + + + testThread + + + WHILE + + + TRUE + + + + + + + Hello Mixly from Thread! + + + + + + + 10 + + + + + + + + + + + + + + 18029 + + + + + + + + + + + + + + + + + 90 + + + + + + + x + + + + + + + 15 + + + + + + + 1 + + + + + 1 + + + + + + + 0 + + + + + 0 + + + + + + + a + + + + + 1 + + + + + + + 0.998 + + + + + + + 1 + + + + + 2 + + + + + + + 4.8 + + + + + 2 + + + + + + + 1 + + + + + 100 + + + + + + + 1010 + + + + + + 1000 + + + + + 1 + + + + + 100 + + + + + + + 50 + + + + + 1 + + + + + 100 + + + + + 1 + + + + + 1000 + + + + + + + 2 + + + + + + + 1 + + + + + + + 1 + + + + + + + + + + 0 + + + + + x + + + + + 2 + + + + + + + + + + + + x + + + + + 0,1,2,3 + + + + + + + 0,1,2,3 + + + + + 0,1,2,3 + + + + + + + x + + + + + + + Mixly + + + + + Mixly + + + + + Hello + + + + + Mixly + + + + + + + + 65 + + + + + + + a + + + + + + + x + + + + + + + Mixly + + + + + + + + + + + + + + + + + + + Mixly + + + + + 0 + + + + + + + Mixly + + + + + 0 + + + + + 2 + + + + + + + Mixly + + + + + + + Mixly + + + + + + + Hello,mixly + + + + + + + Hello,mixly + + + + + 50 + + + + + * + + + + + + + Hello,mixly + + + + + l + + + + + + + -- + + + + + mylist + + + + + + + Hello,mixly + + + + + mixly + + + + + mixpy + + + + + + + I love mixly! + + + + + + + + + + + + I love mixly + + + + + + + + Random No. is {} + + + + + int + + + 1 + + + + + 100 + + + + + + + + + input('1+2*3') + + + + + + + dir + + + + + + + + + mylist + + + 1,2,3,4,5 + + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 2 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 1 + + + + + 0 + + + + + 1 + + + + + + + mylist + + + + + + + mylist + + + + + 2 + + + + + + + mylist + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + + + mylist + + + + + + + mylist + + + + + + + + x + + + + + + + mylist + + + + + 0 + + + + + + + + mytup + + + 1,2,3,4,5 + + + + + + + + mytup + + + + + 0 + + + + + + + mytup + + + + + 0 + + + + + 2 + + + + + + + mytup + + + + + + + mytup + + + + + + + mytup + + + + + + + mytup + + + + + 0 + + + + + + + mytup + + + + + + + mytup1 + + + + + mytup2 + + + + + + + + x + + + + + + + + + + mydict + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + + + + mydict + + + + + + + mydict + + + + + + + mydict + + + + + + + x + + + + + + + mydict + + + + + + + {"name":"Mixly","color":"green"} + + + + + + + mydict + + + + + results + + + + + 0 + + + + + location + + + + + name + + + + + + + + s1 + + + 1,2,3,4,5 + + + + + + + s1 + + + + + + + s1 + + + + + + + s1 + + + + + s2 + + + + + + + s1 + + + + + s2 + + + + + + + s1 + + + + + 0 + + + + + + + s1 + + + + + Mixly + + + + + + + s1 + + + + + s2 + + + + + + + x + + + + + + + + + + + + + + readme.txt + + + + + f + + + + + filename.txt + + + + + f + + + + + + + + f + + + + + filename.txt + + + + + f + + + + + + + + + + Mixly + + + + + f + + + + + + + f + + + + + + + f + + + + + 0 + + + + + + + f + + + + + + + f + + + + + + + f + + + + + + + + + path + + + + + + + path + + + + + + + filename.txt + + + + + + + srcname.txt + + + + + dstname.txt + + + + + + + filename.txt + + + + + + + path + + + + + + + f + + + + + + + f + + + + + 0 + + + + + + + reponse + + + + + https://mixio.mixly.cn + + + + + + + reponse + + + + + https://mixio.mixly.cn + + + + + + + + + + + + + + + reponse + + + + + + + + + + + + + tina + + + + + 20 + + + + + + + tina + + + + + 90 + + + + + + + tina + + + + + 0 + + + + + + + tina + + + + + 20 + + + + + 20 + + + + + + + tina + + + + + 50 + + + + + + + tina + + + + + + + tina + + + + + + + tina + + + + + + + tina + + + + + + + tina + + + + + + + tina + + + + + + + + tina + + + + + 5 + + + + + + + tina + + + + + + + tina + + + + + 2 + + + + + 2 + + + + + 5 + + + + + + + tina + + + + + 5 + + + + + + + #ff0000 + + + #FF0000 + + + + + + + tina + + + + + #ff0000 + + + #FF0000 + + + + + + + tina + + + + + #ff0000 + + + #FF0000 + + + + + + + tina + + + + + #ff0000 + + + #FF0000 + + + + + #ff0000 + + + #FF0000 + + + + + + + tina + + + + + + + #FF0000 + + + + + + + tina + + + + + #FF0000 + + + + + + + tina + + + + + #FF0000 + + + + + + + tina + + + + + 50 + + + + + + + tina + + + + + 50 + + + + + 360 + + + + + + + tina + + + + + + + + + screen + + + + + turtle.eps + + + + + + + tina + + + + + 10 + + + + + + + tina + + + + + Mixly! + + + + + + + tina + + + + + Mixly! + + + + Arial + + + + 8 + + + + + + + NUM + + + + + Input a number: + + + + + 10 + + + + + 0 + + + + + 100 + + + + + + + Input your name + + + + + What's your name? + + + + + + + + df1 + + + + + data.csv + + + + + + + + + df + + + + + + + df + + + + + + + array + + + + None + + + + + + array + + + + None + + + + + + array + + + + + + + array + + + + + + + + array + + + + + + + df + + + + + value + + + + False + + + + + + df + + + + + + + df + + + + + 'a','b','c','d' + + + + + x + + + + + 1.5 + + + + + 5.5 + + + + + 0.5 + + + + + + + + + 1 + + + + + + + 1 + + + + + + + array1 + + + + + array2 + + + + + + + myMatrix + + + + + + + myMatrix + + + + + + + myMatrix + + + + + + + array + + + + + + + matrix1 + + + + + matrix2 + + + + + + + array1 + + + + + array2 + + + + + + + 0,1,2,3 + + + + + + + x + + + + + + + myArray + + + + + + + myArray + + + + + myDimensions + + + + + + + myArray + + + + + + + myArray + + + + + myFeatures + + + + + 0 + + + + + + + image + + + + + templates + + + + + + + myArray + + + + + 0 + + + + + + + myArray + + + + + 0 + + + + + + + myArray + + + + + + + mylist + + + + + + + mylist + + + + + 0,1,2,3 + + + + + + + + mydict + + + + + + + mydict + + + + + 'a','b','c','d' + + + + + + + mydict + + + + + 'ABCD' + + + + + 'a','b','c','d' + + + + + + + ser1 + + + + + + + ser1 + + + + + 0 + + + + + + + df1 + + + + + tag + + + + + + + df1 + + + + + tag + + + + + + + df1 + + + + + 1 + + + + + + + df1 + + + + + GT + + + column + + + df1 + + + + + tag + + + + + + + 1 + + + + + + + + + df1 + + + + + tag + + + + + min + + + df1 + + + column + + + df1 + + + + + tag + + + + + + + + + ser1 + + + + + + + ser1 + + + + + + + 1,2,3,4 + + + + + 5,6,7,8 + + + + + + + 1,2,3,4 + + + + + 5,6,7,8 + + + + + 20,20,20,20 + + + + + tag + + + + + + + 1,2,3,4 + + + + + 5,6,7,8 + + + + + tag + + + + + + + 1,2,3,4 + + + + + 5,6,7,8 + + + + + 0.5 + + + + + tag + + + + + + + 0.25,0.35,0.1,0.3 + + + + + 'a','b','c','d' + + + + + 0.2,0,0,0 + + + + + + + 11,21,31,41,51,61,71,81,91 + + + + + 0,20,40,60,80,100 + + + + + + + + + 2 + + + + + 1 + + + + + 1 + + + + + + + + + Title + + + + + + + axis + + + + + + + 1,2,3,4 + + + + + 1,2,3,4 + + + + + + + 1 + + + + + 5 + + + + + 5 + + + + + 8 + + + + + + + 1.png + + + + + + + img + + + + + 1.jpg + + + + + + + face + + + + + haarcascade_frontalface_default.xml + + + + + + + faceRects + + + + + img + + + + + face + + + + + 1.1 + + + + + 5 + + + + + + + faceRects + + + + + img + + + + + face + + + + + 1.1 + + + + + 5 + + + + + 100 + + + + + 100 + + + + + 200 + + + + + 200 + + + + + + + + + Mixly + + + + + img + + + + + + + 2.jpg + + + + + img + + + + + + + 0 + + + + + + + + img + + + + + 0 + + + + + 0 + + + + + 100 + + + + + 100 + + + + + 3 + + + + + + + img + + + + + Mixly + + + + + 0 + + + + + 200 + + + + + 4 + + + + + 3 + + + + + + + + + 100 + + + + + 20 + + + + + 2 + + + + + 2 + + + + + 0 + + + + + 2 + + + + + 2 + + + + + + + + + + 100 + + + + + 100 + + + + + 10 + + + + + 1 + + + + + 0.0 + + + + + 0.0 + + + + + + + + + + 100 + + + + + 2 + + + + + + + + 1.0 + + + + + -10.0,10.0 + + + + + TRUE + + + + + + + + + + + + iris + + + + + + + iris_x + + + + + iris_y + + + + + 0.3 + + + + + + + + + + model + + + + + TRUE + + + + + + + + + + model + + + + + 1.0 + + + + + TRUE + + + + + FALSE + + + + + 300 + + + + + + + + + + model + + + + + + + + + + + + + model + + + + + 100 + + + + + + + + + + + + + + + + pca + + + + + 2 + + + + + + + pca + + + + + x + + + + + + + model + + + + + 5 + + + + + + + + + + model + + + + + + + model + + + + + 8 + + + + + 300 + + + + + + + + + + + + + model + + + + + x + + + + + + + model + + + + + x_train + + + + + y_train + + + + + + + model + + + + + x_test + + + + + y_test + + + + + + + model + + + + + x_test + + + + + + + model + + + + + + + model + + + + + + + model + + + + + /test.pkl + + + + + + + + + + 1,2,3,4,5 + + + + + + + + + 1 + + + + + 1 + + + + + + + model + + + + + layer + + + + + + + model + + + + + + + model + + + + + xs + + + + + ys + + + + + 1 + + + + + 0 + + + + + + + history + + + + + + + model + + + + + inputTensor + + + + + + + outputTensor + + + + + + + model + + + + + my-model + + + + + + + my-model + + + + + + + 1.jpg + + + + + + + + + + + + 100 + + + + + + + + -10 + + + + + + + 10 + + + + + + + 100 + + + + + + + + NOTE_A4 + + + + + 1000 + + + + + + + NOTE_A4 + + + + + + NOTE_A4 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/templates/html/loader.html b/mixly/boards/default_src/python_pyodide/templates/html/loader.html new file mode 100644 index 00000000..34b32415 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/templates/html/loader.html @@ -0,0 +1,24 @@ + +
+
+

{{d.msg.loading}}

+
\ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/templates/html/statusbar-filesystem-editor-empty.html b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-filesystem-editor-empty.html new file mode 100644 index 00000000..b8001d62 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-filesystem-editor-empty.html @@ -0,0 +1,26 @@ + +
+
+
\ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/templates/html/statusbar-filesystem-open-fs.html b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-filesystem-open-fs.html new file mode 100644 index 00000000..8e79bf54 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-filesystem-open-fs.html @@ -0,0 +1,25 @@ + +
+ +
\ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/templates/html/statusbar-filesystem.html b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-filesystem.html new file mode 100644 index 00000000..d81d738f --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-filesystem.html @@ -0,0 +1,31 @@ + +
+
+
+
\ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/templates/html/statusbar-game.html b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-game.html new file mode 100644 index 00000000..da359cce --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-game.html @@ -0,0 +1,107 @@ + +
+
{{d.epoch}}: 0
+
+
+ + + + +
+
\ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/templates/html/statusbar-image.html b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-image.html new file mode 100644 index 00000000..351f3b4e --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-image.html @@ -0,0 +1,20 @@ + +
\ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/templates/html/statusbar-tool.html b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-tool.html new file mode 100644 index 00000000..4edf6951 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/templates/html/statusbar-tool.html @@ -0,0 +1,27 @@ + +
+ Teachable Machine +
\ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/templates/python/keyboard-interrupt.py b/mixly/boards/default_src/python_pyodide/templates/python/keyboard-interrupt.py new file mode 100644 index 00000000..4547bf53 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/templates/python/keyboard-interrupt.py @@ -0,0 +1,5 @@ +import signal +def signal_handler(signal, frame): + raise ValueError("程序中断") +signal.signal(signal.SIGINT, signal_handler) + diff --git a/mixly/boards/default_src/python_pyodide/webpack.common.js b/mixly/boards/default_src/python_pyodide/webpack.common.js new file mode 100644 index 00000000..2e8cf7dd --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/webpack.common.js @@ -0,0 +1,52 @@ +const path = require('path'); +const common = require('../../../webpack.common'); +const { merge } = require('webpack-merge'); +const { VueLoaderPlugin } = require('vue-loader'); + + +const webpackConfig = merge(common, { + resolve: { + alias: { + '@mixly/python': path.resolve(__dirname, '../python'), + '@mixly/python-mixpy': path.resolve(__dirname, '../python_mixpy'), + 'vue$': 'vue/dist/vue.esm-bundler.js', + '@': __dirname + }, + extensions: ['*', '.ts', '.js', '.vue', '.json'], + fallback: { + // for ocaml bundle + constants: require.resolve('constants-browserify'), + tty: require.resolve('tty-browserify'), + vm: require.resolve('vm-browserify'), + fs: false, + child_process: false, + // for sql bundle + crypto: require.resolve('crypto-browserify'), + path: require.resolve('path-browserify'), + buffer: require.resolve('buffer/'), + stream: require.resolve('stream-browserify'), + } + }, + module: { + rules: [ + { + resourceQuery: /asset-url/, + type: 'asset/resource', + }, + { + test: /\.scss$/, + use: ['vue-style-loader', 'css-loader', 'sass-loader'], + }, + ] + }, + plugins: [ + new VueLoaderPlugin() + ] +}); + +webpackConfig.module.rules.unshift({ + test: /\.vue$/, + use: ['vue-loader'] +}); + +module.exports = webpackConfig; \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/webpack.dev.js b/mixly/boards/default_src/python_pyodide/webpack.dev.js new file mode 100644 index 00000000..90d2b91a --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/webpack.dev.js @@ -0,0 +1,36 @@ +const path = require("path"); +const common = require("./webpack.common"); +const { merge } = require("webpack-merge"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const ESLintPlugin = require('eslint-webpack-plugin'); + +module.exports = merge(common, { + mode: "development", + devtool: 'source-map', + plugins: [ + new ESLintPlugin({ + context: process.cwd(), + }), + new HtmlWebpackPlugin({ + inject: false, + template: path.resolve(process.cwd(), 'template.xml'), + filename: 'index.xml', + minify: false + }) + ], + devServer: { + https: true, + port: 8080, + host: '0.0.0.0', + hot: false, + static: { + directory: path.join(process.cwd(), '../../../'), + watch: false + }, + devMiddleware: { + index: false, + publicPath: `/boards/default/${path.basename(process.cwd())}`, + writeToDisk: false + } + } +}); \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/webpack.prod.js b/mixly/boards/default_src/python_pyodide/webpack.prod.js new file mode 100644 index 00000000..0e9f3265 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/webpack.prod.js @@ -0,0 +1,27 @@ +const path = require("path"); +const common = require("./webpack.common"); +const { merge } = require("webpack-merge"); +const TerserPlugin = require("terser-webpack-plugin"); +var HtmlWebpackPlugin = require("html-webpack-plugin"); + +module.exports = merge(common, { + mode: "production", + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + extractComments: false, + }), + new HtmlWebpackPlugin({ + inject: false, + template: path.resolve(process.cwd(), 'template.xml'), + filename: 'index.xml', + minify: { + removeAttributeQuotes: true, + collapseWhitespace: true, + removeComments: true, + } + }) + ] + } +}); \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/sprite-project/setup.py b/mixly/boards/default_src/python_pyodide/whl/sprite-project/setup.py new file mode 100644 index 00000000..e2b66d7b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/sprite-project/setup.py @@ -0,0 +1,14 @@ +from setuptools import setup, find_packages + +setup( + name='sprite', + version='0.0.1', + packages=find_packages(), + install_requires=[], + author='Mixly Team', + author_email='', + description='适用于pyodide的sprite包', + classifiers=[ + 'Programming Language :: Python :: 3', + ] +) \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/sprite-project/sprite/__init__.py b/mixly/boards/default_src/python_pyodide/whl/sprite-project/sprite/__init__.py new file mode 100644 index 00000000..3de36844 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/sprite-project/sprite/__init__.py @@ -0,0 +1,120 @@ +from js import window + + +def createBackground(img): + return window.mixlySprite.createBackground(img) + + +class Sprite: + def __init__(self, img, x, y, name=''): + self.vname = window.mixlySprite.createASprite(img, x, y, name) + + @property + def this(self): + return window.mixlySprite.sprites.__getattribute__(self.vname) + + def show(self): + return self.this.show() + + def hide(self): + return self.this.hide() + + def enlarge(self): + return self.this.enlarge() + + def enlargeTo(self, s): + return self.this.enlargeTo(s) + + def expandTo(self, s, time): + return self.this.expandTo(s, time) + + def move(self, step): + return self.this.move(step) + + def moveTo(self, x, y): + return self.this.moveTo(x, y) + + async def slideTo(self, x, y, time): + return await self.this.slideTo(x, y, time) + + def addX(self, step): + return self.this.addX(step) + + def addY(self, step): + return self.this.addY(step) + + def getX(self): + return self.this.getX() + + def getY(self): + return self.this.getY() + + def rotate(self, degree): + return self.this.rotate(degree) + + def rotateTo(self, degree): + return self.this.rotateTo(degree) + + def circleTo(self, degree): + return self.this.circleTo(degree) + + def hit(self, sprite2): + return self.this.hit(sprite2.this) + + def outOfScreen(self): + return self.this.outOfScreen() + + def mouseAction(self, calc): + return self.this.mouseAction(calc) + + def isClicked(self): + return self.this.isDown + + def setScale(self, h, w): + return self.this.setScale(h, w) + + def filterGray(self): + return self.this.filterGray() + + def filterBrighter(self): + return self.this.filterBrighter() + + def filterOrigin(self): + return self.this.filterOrigin() + + +class Text: + def __init__(self, text, x, y, name=''): + self.vname = window.mixlySprite.createText(text, x, y, name) + + @property + def this(self): + return window.mixlySprite.texts.__getattribute__(self.vname) + + def changeText(self, text): + return self.this.changeText(text) + + def show(self): + return self.this.show() + + def hide(self): + return self.this.hide() + + +def clearAllSprites(): + return window.mixlySprite.clearAllSprites() + +def repeat(calc): + return window.mixlySprite.repeat(calc) + +def keyboardListener(calc): + return window.mixlySprite.keyboardListener(key, calc) + +def isKeyboardHit(keyvalue): + return window.mixlySprite.isKeyboardHit(keyvalue) + +def getTime(): + return window.mixlySprite.timer / 1000 + +def clearTimer(): + return window.mixlySprite.clearTimer() \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/__init__.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/__init__.py new file mode 100644 index 00000000..b0b9dfd8 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/__init__.py @@ -0,0 +1,44 @@ +from pyodide.ffi import to_js, create_proxy +import js +import json +import os +from . import layers + + +def __cache_model(file_path): + data = json.load(open(file_path, 'r')) + f = open(file_path, 'rb') + js.tensorflow.setModelsValue(file_path, to_js(f.read())) + f.close() + folder_path = os.path.dirname(file_path) + for item in data['weightsManifest']: + for current_path in item['paths']: + bin_file_path = '{}/{}'.format(folder_path, current_path) + f = open(bin_file_path, 'rb') + js.tensorflow.setModelsValue(bin_file_path, to_js(f.read())) + f.close() + + +async def load_graph_model(file_path): + __cache_model(file_path) + model = await js.tensorflow.loadGraphModel(file_path) + return model + + +async def load_layers_model(file_path): + __cache_model(file_path) + model = await js.tensorflow.loadLayersModel(file_path) + return model + +def tensor(data): + return js.tf.tensor(to_js(data)) + +def sequential(): + return js.tf.sequential() + +async def load_model(name): + model = await js.tf.loadLayersModel(f"indexeddb://{name}") + return model + +async def prepare_qmyixtxi(imgTensor): + return await js.prepare_qmyixtxi(imgTensor) \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/__init__.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/__init__.py new file mode 100644 index 00000000..2521bbb4 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/__init__.py @@ -0,0 +1,5 @@ +from .activation import * +from .core import * + +from pyodide.ffi import to_js, create_proxy +import js \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/activation.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/activation.py new file mode 100644 index 00000000..8e269fab --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/activation.py @@ -0,0 +1,37 @@ +import js + + +def elu(*args, **kwargs): + ''' + f(x) = alpha * (exp(x) - 1.) for x < 0, f(x) = x for x >= 0. + ''' + js.tensorflow.layers.elu(*args, **kwargs) + + +def leaky_relu(*args, **kwargs): + ''' + f(x) = alpha * x for x < 0. f(x) = x for x >= 0. + ''' + js.tensorflow.layers.leakyReLU(*args, **kwargs) + + +def prelu(*args, **kwargs): + ''' + f(x) = alpha * x for x < 0. f(x) = x for x >= 0. + ''' + js.tensorflow.layers.prelu(*args, **kwargs) + + +def relu(*args, **kwargs): + js.tensorflow.layers.relu(*args, **kwargs) + + +def softmax(*args, **kwargs): + js.tensorflow.layers.softmax(*args, **kwargs) + + +def thresholded_relu(*args, **kwargs): + ''' + f(x) = x for x > theta, f(x) = 0 otherwise. + ''' + js.tensorflow.layers.thresholdedReLU(*args, **kwargs) diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/base.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/base.py new file mode 100644 index 00000000..e69de29b diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/core.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/core.py new file mode 100644 index 00000000..0fe4d233 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/build/lib/tensorflow/layers/core.py @@ -0,0 +1,5 @@ +import js +from pyodide.ffi import to_js + +def dense(units, input_shape=None): + return js.tf.layers.dense(units=units, inputShape=to_js(input_shape)) \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/setup.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/setup.py new file mode 100644 index 00000000..b2045469 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/setup.py @@ -0,0 +1,14 @@ +from setuptools import setup, find_packages + +setup( + name='tensorflow', + version='0.0.1', + packages=find_packages(), + install_requires=[], + author='Mixly Team', + author_email='', + description='适用于pyodide的tensorflowjs包', + classifiers=[ + 'Programming Language :: Python :: 3', + ] +) \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/PKG-INFO b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/PKG-INFO new file mode 100644 index 00000000..351f37ba --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 2.4 +Name: tensorflow +Version: 0.0.1 +Summary: 适用于pyodide的tensorflowjs包 +Author: Mixly Team +Author-email: +Classifier: Programming Language :: Python :: 3 +Dynamic: author +Dynamic: classifier +Dynamic: summary diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/SOURCES.txt b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/SOURCES.txt new file mode 100644 index 00000000..0636b93b --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/SOURCES.txt @@ -0,0 +1,10 @@ +setup.py +tensorflow/__init__.py +tensorflow.egg-info/PKG-INFO +tensorflow.egg-info/SOURCES.txt +tensorflow.egg-info/dependency_links.txt +tensorflow.egg-info/top_level.txt +tensorflow/layers/__init__.py +tensorflow/layers/activation.py +tensorflow/layers/base.py +tensorflow/layers/core.py \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/dependency_links.txt b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/top_level.txt b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/top_level.txt new file mode 100644 index 00000000..0f571440 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow.egg-info/top_level.txt @@ -0,0 +1 @@ +tensorflow diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/__init__.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/__init__.py new file mode 100644 index 00000000..b0b9dfd8 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/__init__.py @@ -0,0 +1,44 @@ +from pyodide.ffi import to_js, create_proxy +import js +import json +import os +from . import layers + + +def __cache_model(file_path): + data = json.load(open(file_path, 'r')) + f = open(file_path, 'rb') + js.tensorflow.setModelsValue(file_path, to_js(f.read())) + f.close() + folder_path = os.path.dirname(file_path) + for item in data['weightsManifest']: + for current_path in item['paths']: + bin_file_path = '{}/{}'.format(folder_path, current_path) + f = open(bin_file_path, 'rb') + js.tensorflow.setModelsValue(bin_file_path, to_js(f.read())) + f.close() + + +async def load_graph_model(file_path): + __cache_model(file_path) + model = await js.tensorflow.loadGraphModel(file_path) + return model + + +async def load_layers_model(file_path): + __cache_model(file_path) + model = await js.tensorflow.loadLayersModel(file_path) + return model + +def tensor(data): + return js.tf.tensor(to_js(data)) + +def sequential(): + return js.tf.sequential() + +async def load_model(name): + model = await js.tf.loadLayersModel(f"indexeddb://{name}") + return model + +async def prepare_qmyixtxi(imgTensor): + return await js.prepare_qmyixtxi(imgTensor) \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/__init__.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/__init__.py new file mode 100644 index 00000000..2521bbb4 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/__init__.py @@ -0,0 +1,5 @@ +from .activation import * +from .core import * + +from pyodide.ffi import to_js, create_proxy +import js \ No newline at end of file diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/activation.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/activation.py new file mode 100644 index 00000000..8e269fab --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/activation.py @@ -0,0 +1,37 @@ +import js + + +def elu(*args, **kwargs): + ''' + f(x) = alpha * (exp(x) - 1.) for x < 0, f(x) = x for x >= 0. + ''' + js.tensorflow.layers.elu(*args, **kwargs) + + +def leaky_relu(*args, **kwargs): + ''' + f(x) = alpha * x for x < 0. f(x) = x for x >= 0. + ''' + js.tensorflow.layers.leakyReLU(*args, **kwargs) + + +def prelu(*args, **kwargs): + ''' + f(x) = alpha * x for x < 0. f(x) = x for x >= 0. + ''' + js.tensorflow.layers.prelu(*args, **kwargs) + + +def relu(*args, **kwargs): + js.tensorflow.layers.relu(*args, **kwargs) + + +def softmax(*args, **kwargs): + js.tensorflow.layers.softmax(*args, **kwargs) + + +def thresholded_relu(*args, **kwargs): + ''' + f(x) = x for x > theta, f(x) = 0 otherwise. + ''' + js.tensorflow.layers.thresholdedReLU(*args, **kwargs) diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/base.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/base.py new file mode 100644 index 00000000..e69de29b diff --git a/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/core.py b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/core.py new file mode 100644 index 00000000..0fe4d233 --- /dev/null +++ b/mixly/boards/default_src/python_pyodide/whl/tensorflow-project/tensorflow/layers/core.py @@ -0,0 +1,5 @@ +import js +from pyodide.ffi import to_js + +def dense(units, input_shape=None): + return js.tf.layers.dense(units=units, inputShape=to_js(input_shape)) \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/.eslintignore b/mixly/boards/default_src/python_skulpt/.eslintignore new file mode 100644 index 00000000..1e158c14 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/.eslintignore @@ -0,0 +1 @@ +others/skulpt \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/.npmignore b/mixly/boards/default_src/python_skulpt/.npmignore new file mode 100644 index 00000000..21ab2a3e --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/.npmignore @@ -0,0 +1,3 @@ +node_modules +build +origin \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/blocks/data.js b/mixly/boards/default_src/python_skulpt/blocks/data.js new file mode 100644 index 00000000..9bcbad0b --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/blocks/data.js @@ -0,0 +1,1127 @@ +import * as Blockly from 'blockly/core'; + +const DATA_HUE = 170//'#5ec73d'//195; + +export const series_create = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_series_create) + .appendField(new Blockly.FieldTextInput('ser1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_series_create_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +export const series_create_from_index = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_series_create) + .appendField(new Blockly.FieldTextInput('ser1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.appendValueInput('INDEX') + .setCheck([String, 'List']) + .appendField(Blockly.Msg.blockpy_series_set_index) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_series_create_index_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +export const dataframe_create = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_dataframe_create) + .appendField(new Blockly.FieldTextInput('df1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_dataframe_create_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +export const dataframe_create_from_one_index = { + init: function () { + this.setColour(DATA_HUE); + var column_raw = + [[Blockly.Msg.DATAFRAME_RAW, 'index'], [Blockly.Msg.DATAFRAME_COLUMN, 'columns']]; + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_dataframe_create) + .appendField(new Blockly.FieldTextInput('df1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(column_raw), 'COLUMN_RAW') + this.appendValueInput('INDEX') + .setCheck([String, 'List']) + .appendField(Blockly.Msg.blockpy_series_set_index) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_dataframe_create_index_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +export const dataframe_create_from_index = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_dataframe_create) + .appendField(new Blockly.FieldTextInput('df1'), 'VAR') + this.appendValueInput('SER') + .appendField(Blockly.Msg.blockpy_series_via) + this.appendValueInput('INDEX_COLUMN') + .setCheck([String, 'List']) + .appendField(Blockly.Msg.blockpy_dataframe_set_index_column) + this.appendValueInput('INDEX_RAW') + .setCheck([String, 'List']) + .appendField(Blockly.Msg.blockpy_dataframe_set_index_raw) + this.setPreviousStatement(true); + this.setNextStatement(true); + //this.setInputsInline(true); + this.setTooltip(Blockly.Msg.blockpy_dataframe_create_index_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + + + +export const series_create_from_text = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(new Blockly.FieldTextInput('ser1'), 'VAR') + + .appendField(' = [') + .appendField(new Blockly.FieldTextInput('1,2,3'), 'TEXT') + .appendField(']'); + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SERIES_CREATE_FROM_TEXT); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + + +export const series_index_value = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DATA_HUE); + var index_value = + [[Blockly.Msg.SERIES_INDEX, 'index'], [Blockly.Msg.HTML_VALUE, 'value']]; + this.appendValueInput('SERIES') + .setCheck('Series') + this.appendDummyInput("") + .appendField(Blockly.Msg.SERIES_INDEX_VALUE) + .appendField(new Blockly.FieldDropdown(index_value), 'INDEX_VALUE') + + this.setOutput(true, 'List'); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('INDEX_VALUE'); + var TOOLTIPS = { + 'index': Blockly.Msg.SERIES_INDEX_TOOLTIP, + 'value': Blockly.Msg.HTML_VALUE_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + + } +}; + +export const series_get_num = { + init: function () { + this.setColour(DATA_HUE); + //this.setOutput(true, Number); + this.setOutput(true); + this.appendValueInput('SER') + .setCheck('Series') + this.appendValueInput('AT') + .setCheck(Number) + .appendField(Blockly.Msg.LANG_LISTS_GET_INDEX1); + this.appendDummyInput("") + .appendField(Blockly.Msg.LANG_LISTS_GET_INDEX2); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.TUPLE_GET_INDEX_TOOLTIP); + } +}; + + +export const pl_plot_easy = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('SER') + .setCheck('Series') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_plot = { + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + + this.appendValueInput('SER') + .setCheck('Series') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new Blockly.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_show = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_SHOW); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_axes = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.mixpy_PL_AXES); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const pl_legend = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_LEGEND); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_title = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_TITLE); + this.appendValueInput('TITLE') + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const pl_label = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_SET_LABEL) + .appendField(new Blockly.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('LABEL') + .appendField(Blockly.Msg.blockpy_PYLAB_LABEL) + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // var thisBlock = this; + // this.setTooltip(function() { + // var mode = thisBlock.getFieldValue('DIR'); + // var TOOLTIPS = { + // 'x': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + // 'y': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + // }; + // return TOOLTIPS[mode]; + // }); + } +}; + + +export const array_create = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('FROM') + .setCheck(Number) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_SPLITBYDOU) + .appendField(Blockly.Msg.MIXPY_DATA_ARRAY_CREATE_FROM); + this.appendValueInput('TO') + .setCheck(Number) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXPY_DATA_ARRAY_CREATE_TO); + this.appendValueInput('STEP') + .setCheck(Number) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MIXLY_STEP); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + +export const pl_plot_bar = { + init: function () { + this.setColour(DATA_HUE); + var plot_bar = + [[Blockly.Msg.mixpy_PYLAB_PLOT_BAR_PLOT, 'plot'], [Blockly.Msg.mixpy_PYLAB_PLOT_BAR_BAR, 'bar']]; + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_DISPLAY_DRAW) + .appendField(new Blockly.FieldDropdown(plot_bar), 'DIR'); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'plot': Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP, + 'bar': Blockly.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const pl_plot_scatter = { + init: function () { + this.setColour(DATA_HUE); + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_SCATTER) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('S') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_NUMBER); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT'); + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(""); + } +}; + +export const pl_plot_xy = { + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'] + , [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_XY) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new Blockly.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR') + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const pl_bar = { + init: function () { + this.setColour(DATA_HUE); + var align = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.AILGN_EDGE, 'edge']]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_BAR) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('WIDTH') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_WIDTH); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_BAR_ALIGN) + .appendField(new Blockly.FieldDropdown(align), 'ALIGN') + this.appendDummyInput() + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldColour('#0000ff'), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const pl_pie = { + init: function () { + this.setColour(DATA_HUE); + var shadow = + [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'False'], [Blockly.Msg.mixpy_PL_PIE_SHADOW_Y, 'True']]; + var autopct = + [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'None'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z, '%.0f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_O, '%.1f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_T, '%.2f%%']]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PIE) + .appendField(Blockly.Msg.COLOUR_BLEND_RATIO); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.appendValueInput('EXPLODE') + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_EXPLODE); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT) + .appendField(new Blockly.FieldDropdown(autopct), 'autopct') + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_SHADOW) + .appendField(new Blockly.FieldDropdown(shadow), 'SHADOW') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + + +export const pl_hist = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_HIST) + .appendField(Blockly.Msg.MIXLY_SD_DATA); + this.appendValueInput('B') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const pl_ticks = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SETTING) + .appendField(new Blockly.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS) + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE) + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_TICKS_TOOLTIP); + } +}; + + +export const numpy_trig = { + /** + * Block for trigonometry operators. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = [ + ['sin', 'sin'], + ['cos', 'cos'], + ['tan', 'tan'], + ['arcsin', 'arcsin'], + ['arccos', 'arccos'], + ['arctan', 'arctan'], + [Blockly.Msg.LANG_MATH_TO_ROUND, 'round'], + [Blockly.Msg.LANG_MATH_TO_CEIL, 'ceil'], + [Blockly.Msg.LANG_MATH_TO_FLOOR, 'floor'] + ]; + this.setColour(DATA_HUE); + this.setOutput(true); + this.setInputsInline(true); + this.appendDummyInput() + .appendField(Blockly.Msg.mixpy_NUMPY_TRIG) + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); + this.setTooltip(Blockly.Msg.mixpy_NUMPY_TRIG_TOOLTIP); + + } +}; + +export const pl_subplot = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('VET') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT) + .appendField(Blockly.Msg.mixpy_SUBPLOT_VERTICLE); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT_HORIZEN); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + +export const pandas_readcsv = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput("FILENAME") + .appendField(Blockly.Msg.MIXPY_PANDAS_READ_CSV); + this.appendDummyInput() + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.mixpy_PANDAS_READCSV_HEADER_Y, '0'], [Blockly.Msg.mixpy_PANDAS_READCSV_HEADER_N, 'None']]), 'MODE'); + this.appendDummyInput() + .appendField(Blockly.Msg.mixpy_PANDAS_READCSV_TITLE); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.mixpy_PANDAS_READCSV_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +export const dataframe_get = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendValueInput('KEY') + .appendField(Blockly.Msg.mixpy_DATAFRAME_GET) + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_DATAFRAME_GET_INDEX) + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.DATAFRAME_COLUMN, 'column'], [Blockly.Msg.DATAFRAME_RAW, 'raw']]), 'MODE') + + this.setOutput(true); + this.setTooltip(Blockly.Msg.mixpy_DATAFRAME_GET_TOOLTIP); + } +}; + +export const pl_savefig = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PL_SAVEFIG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(Blockly.Msg.mixpy_PL_SAVEFIG_TOOLTIP); + } +}; + +export const pl_text = { + init: function () { + this.setColour(DATA_HUE); + var halign = + [[Blockly.Msg.TEXT_TRIM_LEFT, 'right'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.TEXT_TRIM_RIGHT, 'left']]; + var valign = + [[Blockly.Msg.mixpy_PL_TEXT_TOP, 'bottom'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.mixpy_PL_TEXT_BOTTOM, 'top']]; + this.appendValueInput('VET') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_SETTING) + .appendField(Blockly.Msg.mixpy_PL_TEXT_X); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_PL_TEXT_Y); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_PL_TEXT_TAG); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_TEXT_HOR) + .appendField(new Blockly.FieldDropdown(halign), 'HALIGN'); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_TEXT_VER) + .appendField(new Blockly.FieldDropdown(valign), 'VALIGN'); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PL_TEXT_TOOLTIP); + } +}; + +export const array_toarray = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_TOARRAY); + this.setOutput(true, 'List'); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOARRAY); + } +}; + + + + + + + +export const plot_plot_easy = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('SER') + .setCheck('Series') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_plot = {//将XX绘制为折线图,删去尚不支持的点型 + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = + [[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'] + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + + this.appendValueInput('SER') + .setCheck('Series') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new Blockly.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_show = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_SHOW); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_axes = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.mixpy_PL_AXES); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const plot_legend = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_LEGEND); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_title = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_TITLE); + this.appendValueInput('TITLE') + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const plot_label = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_PYLAB_SET_LABEL) + .appendField(new Blockly.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('LABEL') + .appendField(Blockly.Msg.blockpy_PYLAB_LABEL) + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // var thisBlock = this; + // this.setTooltip(function() { + // var mode = thisBlock.getFieldValue('DIR'); + // var TOOLTIPS = { + // 'x': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + // 'y': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + // }; + // return TOOLTIPS[mode]; + // }); + } +}; + +export const plot_plot_bar = { + init: function () { + this.setColour(DATA_HUE); + var plot_bar = + [[Blockly.Msg.mixpy_PYLAB_PLOT_BAR_PLOT, 'plot'], [Blockly.Msg.mixpy_PYLAB_PLOT_BAR_BAR, 'bar']]; + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_DISPLAY_DRAW) + .appendField(new Blockly.FieldDropdown(plot_bar), 'DIR'); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'plot': Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP, + 'bar': Blockly.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const plot_plot_scatter = {//散点图,删去尚不支持的点型;修改了颜色的选择方式 + init: function () { + this.setColour(DATA_HUE); + var dot_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'] + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_SCATTER) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('S') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_NUMBER); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT'); + // this.appendDummyInput("") + // .appendField(Blockly.Msg.HTML_COLOUR) + // .appendField(new Blockly.FieldDropdown(color_type), 'COLOR'); + this.appendDummyInput() + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldColour('#0000ff'), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(""); + } +}; + +export const plot_plot_xy = {//折线图,删去尚不支持的点型 + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'], + [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'], + [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'], + [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = + [[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'] + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_XY) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new Blockly.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new Blockly.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldDropdown(color_type), 'COLOR') + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const plot_bar = { + init: function () { + this.setColour(DATA_HUE); + var align = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.AILGN_EDGE, 'edge']]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_BAR) + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('WIDTH') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_WIDTH); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_BAR_ALIGN) + .appendField(new Blockly.FieldDropdown(align), 'ALIGN') + this.appendDummyInput() + .appendField(Blockly.Msg.HTML_COLOUR) + .appendField(new Blockly.FieldColour('#0000ff'), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +export const plot_pie = { + init: function () { + this.setColour(DATA_HUE); + var shadow = + [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'False'], [Blockly.Msg.mixpy_PL_PIE_SHADOW_Y, 'True']]; + var autopct = + [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'None'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z, '%.0f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_O, '%.1f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_T, '%.2f%%']]; + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_PIE) + .appendField(Blockly.Msg.COLOUR_BLEND_RATIO); + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.appendValueInput('EXPLODE') + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_EXPLODE); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT) + .appendField(new Blockly.FieldDropdown(autopct), 'autopct') + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PYLAB_PIE_SHADOW) + .appendField(new Blockly.FieldDropdown(shadow), 'SHADOW') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + + +export const plot_hist = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_HIST) + .appendField(Blockly.Msg.MIXLY_SD_DATA); + this.appendValueInput('B') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const plot_ticks = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SETTING) + .appendField(new Blockly.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('A') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS) + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE) + this.appendValueInput('B') + .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PYLAB_TICKS_TOOLTIP); + } +}; + +export const plot_subplot = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('VET') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT) + .appendField(Blockly.Msg.mixpy_SUBPLOT_VERTICLE); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT_HORIZEN); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_SUBPLOT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + +export const plot_savefig = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_SAVEFIG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(Blockly.Msg.mixpy_PL_SAVEFIG_TOOLTIP); + } +}; + +export const plot_text = { + init: function () { + this.setColour(DATA_HUE); + var halign = + [[Blockly.Msg.TEXT_TRIM_LEFT, 'right'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.TEXT_TRIM_RIGHT, 'left']]; + var valign = + [[Blockly.Msg.mixpy_PL_TEXT_TOP, 'bottom'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.mixpy_PL_TEXT_BOTTOM, 'top']]; + this.appendValueInput('VET') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_SETTING) + .appendField(Blockly.Msg.mixpy_PL_TEXT_X); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_PL_TEXT_Y); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(Blockly.Msg.mixpy_PL_TEXT_TAG); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_TEXT_HOR) + .appendField(new Blockly.FieldDropdown(halign), 'HALIGN'); + this.appendDummyInput("") + .appendField(Blockly.Msg.mixpy_PL_TEXT_VER) + .appendField(new Blockly.FieldDropdown(valign), 'VALIGN'); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.mixpy_PL_TEXT_TOOLTIP); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/blocks/inout.js b/mixly/boards/default_src/python_skulpt/blocks/inout.js new file mode 100644 index 00000000..7f0999ff --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/blocks/inout.js @@ -0,0 +1,202 @@ +import * as Blockly from 'blockly/core'; + +const INOUT_HUE = 20; + +export const inout_input = { + init: function () { + this.setColour(INOUT_HUE); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.blockpy_inout_raw_input) + .setCheck(String); + this.setOutput(true); + this.setTooltip(Blockly.Msg.INOUT_input_TOOLTIP); + } +} + +export const inout_print = { + init: function () { + this.setColour(INOUT_HUE); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.BLOCKPY_PRINT_TOOLTIP); + } +}; + +export const inout_print_inline = { + init: function () { + this.setColour(INOUT_HUE); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.MIXLY_SERIAL_PRINT); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP); + } +}; + +export const inout_print_end = { + init: function () { + this.setColour(INOUT_HUE); + this.appendValueInput("VAR") + .appendField(Blockly.Msg.MIXLY_SERIAL_PRINT); + this.appendValueInput("END") + .appendField(Blockly.Msg.MIXLY_ENDSWITH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_PYTHON_INOUT_PRINT_END_TOOLTIP); + } +}; + +export const inout_type_input = { + init: function () { + + var input_type = + [[Blockly.Msg.LANG_MATH_STRING, 'str'], [Blockly.Msg.LANG_MATH_INT, 'int'] + , [Blockly.Msg.LANG_MATH_FLOAT, 'float']]; + this.setColour(INOUT_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(new Blockly.FieldDropdown(input_type), 'DIR') + this.appendValueInput("VAR") + .appendField(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE) + .setCheck(String); + + this.setInputsInline(true); + this.setOutput(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'str': Blockly.Msg.MIXLY_MIXPY_INOUT_STR_INPUT_TOOLTIP, + 'int': Blockly.Msg.MIXLY_MIXPY_INOUT_INT_INPUT_TOOLTIP, + 'float': Blockly.Msg.MIXLY_MIXPY_INOUT_FLOAT_INPUT_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const inout_print_many = { + + init: function () { + this.setColour(INOUT_HUE); + + this.itemCount_ = 2; + this.updateShape_(); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setInputsInline(true); + this.setMutator(new Blockly.icons.MutatorIcon(['inout_print_item'], this)); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_TOOLTIP); + }, + + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('inout_print_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('inout_print_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i) + .connection.connect(connections[i]); + } + } + }, + + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_EMPTY); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN); + } + } + } + } +}; +export const inout_print_container = { + init: function () { + this.setColour(INOUT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN); + this.appendStatementInput('STACK'); + this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +export const inout_print_item = { + init: function () { + this.setColour(INOUT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/blocks/iot.js b/mixly/boards/default_src/python_skulpt/blocks/iot.js new file mode 100644 index 00000000..07f699a7 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/blocks/iot.js @@ -0,0 +1,270 @@ +import * as Blockly from 'blockly/core'; +import * as Mixly from 'mixly'; + +const IOT_HUE = '#526FC3'; +//'#2FAD7A'; + +export const iot_mixio_connect = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT); + this.appendValueInput('SERVER') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_EMQX_SERVER) + .setAlign(Blockly.inputs.Align.RIGHT) + this.appendValueInput('USERNAME') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_WIFI_USERNAME) + .setAlign(Blockly.inputs.Align.RIGHT) + this.appendValueInput('PASSWORD') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_IOT_PASSWORD) + .setAlign(Blockly.inputs.Align.RIGHT) + this.appendValueInput('PROJECT') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_EMQX_PROJECT) + .setAlign(Blockly.inputs.Align.RIGHT) + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const IOT_MIXIO_PUBLISH = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendValueInput('TOPIC') + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_NEW) + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC); + this.appendValueInput('MSG') + .appendField(Blockly.Msg.HTML_BODY); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_PUBLISH_TOOLTIP); + } +}; + +export const IOT_MIXIO_SUBSCRIBE = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendValueInput('TOPIC') + .appendField(Blockly.Msg.MIXLY_EMQX_SUBSCRIBE + Blockly.Msg.MIXLY_MICROBIT_MSG) + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC); + this.appendValueInput('METHOD') + .appendField(Blockly.Msg.MIXLY_EMQX_SET_METHOD); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_SUBSCRIBE_TOOLTIP); + } +}; + +export const IOT_MIXIO_UNSUBSCRIBE = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendValueInput('TOPIC') + .appendField(Blockly.Msg.MSG.stop + Blockly.Msg.MIXLY_EMQX_SUBSCRIBE) + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_SUBSCRIBE_TOOLTIP); + } +}; + +export const iot_mixio_disconnect = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_DISCONNECT_ONENET); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_DISCONNECT_TOOLTIP); + } +}; + +export const iot_mixio_connect_only = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_EMQX_CONNECT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_DISCONNECT_TOOLTIP); + } +}; + +export const iot_mixio_check = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField("MixIO") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_CHECK_ONENET); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_CHECK_TOOLTIP); + } +}; + +export const iot_mixio_format_topic = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT) + .appendField(Blockly.MQTT_Topic); + this.setInputsInline(true); + this.setOutput(true); + } +}; + +export const iot_mixio_format_msg = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT) + .appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_MSG); + this.setInputsInline(true); + this.setOutput(true); + } +}; + +export const IOT_FORMATTING = { + init: function () { + this.setColour(IOT_HUE); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_ESP32_IOT_MAP_FORMATING); + this.setOutput(true); + // this.setTooltip(); + } +}; + +export const IOT_FORMAT_STRING = { + init: function () { + this.setColour(IOT_HUE); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT + '(Json)'); + this.setOutput(true); + // this.setTooltip(); + } +}; + +export const IOT_EMQX_PING = { + init: function () { + this.setColour(IOT_HUE); + // this.appendValueInput('VAR') + // .setCheck("var") + this.appendDummyInput() + .appendField("MixIO") + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_EMQX_PING); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_PING_TOOLTIP); + } +}; + +export const IOT_MIXIO_NTP = { + init: function () { + this.setColour(IOT_HUE); + // this.appendValueInput('VAR') + // .setCheck("var") + this.appendDummyInput() + .appendField("MixIO") + .appendField(Blockly.Msg.MIXLY_GET_NTP) + this.appendValueInput('addr') + .appendField(Blockly.blynk_SERVER_ADD); + this.setInputsInline(true); + this.setOutput(true); + } +}; + +export const IOT_EMQX_INIT_AND_CONNECT_BY_SHARE_CODE = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT); + this.appendValueInput('SERVER') + .appendField(Blockly.Msg.MIXLY_EMQX_SERVER) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('KEY') + .appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + Blockly.Msg.MIXLY_MIXIO_SHARE_KEY) + .setAlign(Blockly.inputs.Align.RIGHT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const IOT_EMQX_INIT_AND_CONNECT_BY_MIXLY_CODE = { + init: function () { + this.setColour(IOT_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT); + this.appendValueInput('SERVER') + .appendField(Blockly.Msg.MIXLY_EMQX_SERVER) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput('KEY') + .appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + "Mixly Key") + .setAlign(Blockly.inputs.Align.RIGHT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const iot_mixly_key = { + init: function () { + this.VISITOR_ID = Mixly.Config.BOARD.visitorId.str32.substring(0, 8).toUpperCase(); + this.setColour(IOT_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput(this.visitorId), 'VISITOR_ID'); + this.setOutput(true, null); + }, + onchange: function () { + const nowVisitorId = this.getFieldValue('VISITOR_ID'); + if (this.VISITOR_ID !== nowVisitorId) + this.setFieldValue(this.VISITOR_ID, 'VISITOR_ID'); + } +}; + +export const iot_mixly_key_py = { + init: function () { + this.VISITOR_ID = Mixly.Config.BOARD.visitorId.str32.substring(0, 8).toUpperCase(); + this.setColour(IOT_HUE); + this.appendDummyInput("") + .appendField(this.newQuote_(true)) + .appendField(new Blockly.FieldTextInput(this.visitorId), 'VISITOR_ID') + .appendField(this.newQuote_(false)); + this.setOutput(true, null); + }, + onchange: function () { + const nowVisitorId = this.getFieldValue('VISITOR_ID'); + if (this.VISITOR_ID !== nowVisitorId) + this.setFieldValue(this.VISITOR_ID, 'VISITOR_ID'); + }, + newQuote_: function (open) { + if (open == this.RTL) { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg=='; + } else { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC'; + } + return new Blockly.FieldImage(file, 12, 12, '"'); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/blocks/system.js b/mixly/boards/default_src/python_skulpt/blocks/system.js new file mode 100644 index 00000000..eb4a7a00 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/blocks/system.js @@ -0,0 +1,126 @@ +import * as Blockly from 'blockly/core'; + +const SYSTEM_HUE = 120; + +export const base_delay = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput("DELAY_TIME", Number) + .appendField(Blockly.Msg.MIXLY_DELAY + '(' + Blockly.Msg.MIXLY_MILLIS + ')') + .setCheck(Number); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + } +}; + +export const controls_millis = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_time_time); + this.setOutput(true, Number); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_MILLIS); + } +}; + +export const time_localtime = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME) + this.appendDummyInput() + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_ALL, "all"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_YEAR, "0"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_MONTH, "1"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_DATE, "2"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_HOUR, "3"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_MINUTE, "4"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_SECOND, "5"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_INWEEK, "6"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_INYEAR, "7"], + [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_DST, "8"] + ]), "op"); + this.setOutput(true); + this.setInputsInline(true); + } +}; + +export const Panic_with_status_code = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput("STATUS_CODE", Number) + .appendField(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code) + .setCheck(Number); + this.setPreviousStatement(true, null); + // this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + } +}; + +export const reset = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_micro); + this.setPreviousStatement(true); + // this.setNextStatement(true); + } +}; + +export const controls_mstimer2 = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput('TIME') + .setCheck(Number) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField('MsTimer2') + .appendField(Blockly.Msg.MIXLY_MSTIMER2_EVERY); + this.appendDummyInput() + .appendField('ms'); + this.appendStatementInput('DO') + .appendField(Blockly.Msg.MIXLY_MSTIMER2_DO); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const controls_mstimer2_start = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField('MsTimer2') + .appendField(Blockly.Msg.MIXLY_MSTIMER2_START); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const controls_mstimer2_stop = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField('MsTimer2') + .appendField(Blockly.Msg.MIXLY_STOP); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const time_sleep = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput("DELAY_TIME", Number) + .appendField(Blockly.Msg.MIXLY_DELAY) + .setCheck(Number); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SECOND) + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/blocks/turtle.js b/mixly/boards/default_src/python_skulpt/blocks/turtle.js new file mode 100644 index 00000000..94c4cfee --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/blocks/turtle.js @@ -0,0 +1,889 @@ +import * as Blockly from 'blockly/core'; + +const TURTLE_HUE = 180; + +export const turtle_create = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + + .appendField(Blockly.Msg.blockpy_turtle_create) + .appendField(new Blockly.FieldTextInput('tina'), 'VAR') + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.blockpy_turtle_create_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +export const turtle_done = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_TURTLE_DONE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_exitonclick = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_PYTHON_TURTLE_EXITONCLICK); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_move = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var front_back = + [[Blockly.Msg.blockpy_forward, 'forward'], [Blockly.Msg.blockpy_backward, 'backward']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MOVE_BY) + .appendField(new Blockly.FieldDropdown(front_back), 'DIR') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MOVE_BY_num); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'forward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + 'backward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_rotate = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var front_back = + [[Blockly.Msg.blockpy_left, 'left'], [Blockly.Msg.blockpy_right, 'right']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_rotate) + .appendField(new Blockly.FieldDropdown(front_back), 'DIR') + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'left': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_LEFT, + 'right': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_RIGHT + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_setheading = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_setheading); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_setheading_degree); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_screen_delay = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_SCREEN_DELAY); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MILLIS); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SCREEN_DELAY); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_goto = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + + .appendField(Blockly.Msg.blockpy_turtle_goto); + this.appendValueInput('val') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_turtle_goto_y); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_goto_position); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_setxy = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var set_xy = + [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .appendField(new Blockly.FieldDropdown(set_xy), 'DIR') + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_SETXY); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_MIXPY_TURTLE_SETXY_TOOLTIP); + } +}; + +export const turtle_pos_shape = { + + init: function () { + this.setColour(TURTLE_HUE); + var pos_shape = + [[Blockly.Msg.TURTLE_POS, 'pos'], [Blockly.Msg.TURTLE_SHAPE, 'shape'], [Blockly.Msg.TURTLE_HEADING, 'heading'], [Blockly.Msg.MIXLY_MIXPY_TURTLE_WIDTH, 'width'], [Blockly.Msg.MIXLY_TURTEL_GET_SHAPESIZE, 'shapesize'], [Blockly.Msg.MIXLY_SPEED, 'speed']]; + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput("") + .appendField(Blockly.Msg.TURTLE_POS_SHAPE) + .appendField(new Blockly.FieldDropdown(pos_shape), 'DIR') + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'pos': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_POS, + 'shape': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SHAPE, + 'heading': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HEADING, + 'width': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_WIDTH, + 'speed': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_GET_SPEED, + 'shapesize': Blockly.Msg.MIXLY_TURTEL_GET_SHAPESIZE_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + this.setOutput(true); + this.setInputsInline(true); + + } +}; + + +export const turtle_clear = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var clear_reset = + [[Blockly.Msg.MIXLY_LCD_STAT_CLEAR, 'clear'], [Blockly.Msg.blockpy_turtle_reset, 'reset'] + , [Blockly.Msg.blockpy_turtle_home, 'home']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(clear_reset), 'DIR') + + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'clear': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CLEAR, + 'reset': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_RESET, + 'home': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HOME + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_penup = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var penup_down = + [[Blockly.Msg.blockpy_turtle_penup, 'penup'], [Blockly.Msg.blockpy_turtle_pendown, 'pendown']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(penup_down), 'DIR') + + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'penup': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_PENUP, + 'pendown': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_PENDOWN + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_fill = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var fill = + [[Blockly.Msg.blockpy_turtle_beginfill, 'begin'], [Blockly.Msg.blockpy_turtle_endfill, 'end']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(fill), 'DIR') + + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'begin': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BEGINFILL, + 'end': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_ENDFILL + }; + return TOOLTIPS[mode]; + }); + } +}; + + +export const turtle_size_speed = { + init: function () { + this.appendDummyInput("") + .appendField(new Blockly.FieldTextInput('tina'), 'TUR') + var size_speed = + [[Blockly.Msg.blockpy_turtle_size, 'pensize'], [Blockly.Msg.MIXLY_SPEED, 'speed']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_set) + .appendField(new Blockly.FieldDropdown(size_speed), 'DIR') + .appendField(Blockly.Msg.blockpy_turtle_set_num); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'pensize': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SIZE, + 'speed': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SPEED + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_size = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_turtle_set_size); + + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SIZE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +export const turtle_speed = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_turtle_set_speed); + + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SPEED); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_circle = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var circle_dot = + [[Blockly.Msg.blockpy_turtle_circle, 'circle'], [Blockly.Msg.blockpy_turtle_dot, 'dot']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_draw) + .appendField(new Blockly.FieldDropdown(circle_dot), 'DIR') + .appendField(Blockly.Msg.blockpy_turtle_radius); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'circle': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CIRCLE, + 'dot': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_DOT + }; + return TOOLTIPS[mode]; + }); + } +}; + +export const turtle_circle_advanced = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_DRAW_CIRCLE) + .appendField(Blockly.Msg.blockpy_turtle_radius); + this.appendValueInput('data') + .setCheck(Number) + .appendField(Blockly.Msg.blockpy_turtle_angle); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CIRCLE); + } +}; + +export const turtle_visible = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var visible = + [[Blockly.Msg.blockpy_turtle_hide, 'hideturtle'], [Blockly.Msg.blockpy_turtle_show, 'showturtle']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(visible), 'DIR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'hideturtle': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HIDE, + 'showturtle': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SHOW + }; + return TOOLTIPS[mode]; + }); + } +}; + + +export const turtle_bgcolor = { + init: function () { + + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_bgcolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_pencolor = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_pencolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_fillcolor = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_fillcolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_clone = { + + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput("") + .appendField(Blockly.Msg.TURTLE_CLONE); + this.setTooltip(Blockly.Msg.TURTLE_CLONE_TOOLTIP); + this.setOutput(true); + } +}; + +export const turtle_bgcolor_hex_new = { + init: function () { + + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_bgcolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_pencolor_hex_new = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_pencolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_fillcolor_hex_new = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_fillcolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_color = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_pencolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME'); + this.appendDummyInput() + .appendField(Blockly.Msg.blockpy_turtle_fillcolor) + .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME2'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_color_hex = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR1') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_pencolor); + this.appendValueInput('VAR2') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_fillcolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_bgcolor_hex = { + init: function () { + + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_bgcolor_hex); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_pencolor_hex = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_pencolor_hex); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_fillcolor_hex = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_fillcolor_hex); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_shape = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var shape = [ + [Blockly.Msg.blockpy_turtle_shape_arrow, 'arrow'], [Blockly.Msg.blockpy_turtle_shape_turtle, 'turtle'], + [Blockly.Msg.blockpy_turtle_shape_circle, 'circle'], [Blockly.Msg.blockpy_turtle_shape_square, 'square'], + [Blockly.Msg.blockpy_turtle_shape_triangle, 'triangle'], [Blockly.Msg.blockpy_turtle_shape_classic, 'classic'] + ]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.blockpy_turtle_shape) + .appendField(new Blockly.FieldDropdown(shape), 'DIR'); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.TURTLE_SHAPE_TOOLTIP); + } +}; + +export const turtle_shapesize = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE); + this.appendValueInput('WID') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE_WID); + this.appendValueInput('LEN') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE_LEN); + this.appendValueInput('OUTLINE') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE_OUTLINE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SHAPESIZE); + } +}; + +export const turtle_numinput = { + init: function () { + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_NUMINPUT) + this.setColour(TURTLE_HUE); + this.appendValueInput('TITLE') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_TITLE); + this.appendValueInput('PROMPT') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_PROMPT); + this.appendValueInput('DEFAULT') + .setCheck(Number) + .appendField(Blockly.Msg.DICTS_DEFAULT_VALUE); + this.appendValueInput('MIN') + .setCheck(Number) + .appendField(Blockly.Msg.MATH_ONLIST_OPERATOR_MIN); + this.appendValueInput('MAX') + .setCheck(Number) + .appendField(Blockly.Msg.MATH_ONLIST_OPERATOR_MAX); + this.setInputsInline(true); + this.setOutput(true, Number); + this.setTooltip(Blockly.Msg.TURTLE_NUMINPUT_TOOLTIP); + } +}; + +export const turtle_textinput = { + init: function () { + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT) + this.setColour(TURTLE_HUE); + this.appendValueInput('TITLE') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_TITLE); + this.appendValueInput('PROMPT') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_PROMPT); + this.setInputsInline(true); + this.setOutput(true, String); + this.setTooltip(Blockly.Msg.TURTLE_TEXTINPUT_TOOLTIP); + } +}; + +export const turtle_write = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_write); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.TURTLE_WRITE_TOOLTIP); + } +}; + +export const turtle_write_format = { + init: function () { + var move = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True']]; + var align = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_LEFT, 'left'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_RIGHT, 'right']]; + var fonttype = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_NORMAL, 'normal'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD, 'bold'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_ITALIC, 'italic'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD_ITALIC, 'bold","italic']]; + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_write); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE) + .appendField(new Blockly.FieldDropdown(move), 'MOVE'); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN) + .appendField(new Blockly.FieldDropdown(align), 'ALIGN'); + this.appendValueInput('FONTNAME') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NAME); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE) + .appendField(new Blockly.FieldDropdown(fonttype), 'FONTTYPE'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.TURTLE_WRITE_TOOLTIP); + } +}; + +export const turtle_write_format_skulpt = { + init: function () { + var move = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True']]; + var align = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_LEFT, 'left'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_RIGHT, 'right']]; + var fonttype = + [[Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_NORMAL, 'normal'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD, 'bold'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_ITALIC, 'italic']]; + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(Blockly.Msg.blockpy_turtle_write); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE) + .appendField(new Blockly.FieldDropdown(move), 'MOVE'); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN) + .appendField(new Blockly.FieldDropdown(align), 'ALIGN'); + this.appendValueInput('FONTNAME') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NAME); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE) + .appendField(new Blockly.FieldDropdown(fonttype), 'FONTTYPE'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.TURTLE_WRITE_TOOLTIP); + } +}; + + +export const turtle_color_seclet = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(new Blockly.FieldColour("ff0000"), "COLOR"); + this.setInputsInline(true); + this.setOutput(true, String); + } +}; + +export const turtle_getscreen = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput("") + + .appendField(Blockly.Msg.MIXLY_TURTEL_GETSCREEN) + .appendField(new Blockly.FieldTextInput('screen'), 'VAR') + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_TURTEL_GETSCREEN_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +export const turtle_onkey = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_TURTEL_EVENT_ONKEY); + this.appendValueInput('callback') + .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONKEY_TOOLTIP); + } +}; + +export const turtle_onclick = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_TURTEL_EVENT_ONCLICK); + this.appendValueInput('callback') + .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONCLICK_TOOLTIP); + } +}; + +export const turtle_ontimer = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_TURTEL_EVENT_ONTIMER); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_mSecond); + this.appendValueInput('callback') + .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONTIMER_TOOLTIP); + } +}; + +export const turtle_listen = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_TURTEL_SCREEN_LISTEN); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const turtle_screen_savefig = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendValueInput("FILE") + .setCheck(String) + .appendField(Blockly.Msg.mixpy_PL_SAVEFIG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(Blockly.Msg.mixpy_TURTLE_SAVEFIG_TOOLTIP); + } +}; + +export const turtle_stamp = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput() + .appendField(Blockly.Msg.TURTLE_STAMP); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/converters/data.js b/mixly/boards/default_src/python_skulpt/converters/data.js new file mode 100644 index 00000000..09ff79ab --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/converters/data.js @@ -0,0 +1,1512 @@ +'use strict'; + +pbc.assignD.get('Series')['check_assign'] = function (py2block, node, targets, value) { + if(value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var moduleName = py2block.Name_str(value.func.value); + var funcName = py2block.identifier(value.func.attr); + if (value._astname === "Call" && moduleName === "pandas" + && funcName === "Series" && value.args.length === 1) + return true; + return false; +} + +pbc.assignD.get('Series')['create_block'] = function (py2block, node, targets, value) { + var series = py2block.Name_str(node.targets[0]); + var argblock = py2block.convert(value.args[0]); + var param = value.keywords[0]; + if (value.keywords.length == 0){ + return block('series_create', node.lineno, { + 'VAR': series + }, { + 'SER': argblock + }); + } + else if(value.keywords.length == 1&¶m.arg.v =="index"){ + var listblock = py2block.convert(value.keywords[0].value); + return block('series_create_from_index', node.lineno, { + 'VAR': series + }, { + 'SER': argblock, + 'INDEX': listblock + }); + } +} + +pbc.moduleFunctionD.get('pylab')['show'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + return [block("pl_show", func.lineno, {}, {}, { + "inline": "true" + })]; +} + + +pbc.moduleFunctionD.get('pylab')['axes'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0||keywords.length!=1||keywords[0].arg.v!='aspect') { + throw new Error("Incorrect number of arguments"); + } + return [block("pl_axes", func.lineno, {}, {}, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('pylab')['hist'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 2) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("pl_hist", func.lineno, { + 'DIR':"plot" + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('pylab')['legend'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 0) { + throw new Error("Incorrect number of arguments"); + } + return [block("pl_legend", func.lineno, {}, {}, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('pylab')['title'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + return [block("pl_title", func.lineno, {}, { + 'TITLE': argblock + }, { + "inline": "true" + })]; +} + +function dataxylabel(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + return [block("pl_label", func.lineno, { + "DIR":mode + }, { + 'LABEL': argblock + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.moduleFunctionD.get('pylab')['xlabel'] = dataxylabel('x'); +pbc.moduleFunctionD.get('pylab')['ylabel'] = dataxylabel('y'); + +function dataxyticks(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("pl_ticks", func.lineno, { + "DIR":mode + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.moduleFunctionD.get('pylab')['xticks'] = dataxyticks('x'); +pbc.moduleFunctionD.get('pylab')['yticks'] = dataxyticks('y'); + +function dataNumpyTrig(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + return block("numpy_trig", func.lineno, { + "OP":mode + }, { + 'NUM': argblock, + }, { + "inline": "true" + }); + } + return converter; +} + +pbc.moduleFunctionD.get('numpy')['sin'] = dataNumpyTrig('sin'); +pbc.moduleFunctionD.get('numpy')['cos'] = dataNumpyTrig('cos'); +pbc.moduleFunctionD.get('numpy')['tan'] = dataNumpyTrig('tan'); +pbc.moduleFunctionD.get('numpy')['arcsin'] = dataNumpyTrig('arcsin'); +pbc.moduleFunctionD.get('numpy')['arctan'] = dataNumpyTrig('arctan'); +pbc.moduleFunctionD.get('numpy')['arccos'] = dataNumpyTrig('arccos'); +pbc.moduleFunctionD.get('numpy')['round'] = dataNumpyTrig('round'); +pbc.moduleFunctionD.get('numpy')['ceil'] = dataNumpyTrig('ceil'); +pbc.moduleFunctionD.get('numpy')['floor'] = dataNumpyTrig('floor'); + +pbc.assignD.get('DataFrame')['check_assign'] = function (py2block, node, targets, value) { + if(value.func._astname != "Attribute" || value.func.value._astname != "Name"){ + return false; + } + var moduleName = py2block.Name_str(value.func.value); + var funcName = py2block.identifier(value.func.attr); + if (value._astname === "Call" && moduleName === "pandas" + && funcName === "DataFrame" && value.args.length === 1) + return true; + return false; +} + +pbc.assignD.get('DataFrame')['create_block'] = function (py2block, node, targets, value) { + var series = py2block.Name_str(node.targets[0]); + var argblock = py2block.convert(value.args[0]); + var param = value.keywords[0]; + if (value.keywords.length == 0){ + return block('dataframe_create', node.lineno, { + 'VAR': series + }, { + 'SER': argblock + }); + } + else if(value.keywords.length == 1&&value.keywords[0].arg.v =="index"){ + var listblock = py2block.convert(value.keywords[0].value); + return block('dataframe_create_from_one_index', node.lineno, { + 'VAR': series, + 'COLUMN_RAW':"index" + }, { + 'SER': argblock, + 'INDEX': listblock + }); + } + else if(value.keywords.length == 1&&value.keywords[0].arg.v =="columns"){ + var listblock = py2block.convert(value.keywords[0].value); + return block('dataframe_create_from_one_index', node.lineno, { + 'VAR': series, + 'COLUMN_RAW':"columns" + }, { + 'SER': argblock, + 'INDEX': listblock + }); + } + else if(value.keywords.length == 2&&((value.keywords[0].arg.v =="columns"&&value.keywords[1].arg.v =="index")||(value.keywords[1].arg.v =="columns"&&value.keywords[0].arg.v =="index"))){ + var listblock0 = py2block.convert(value.keywords[0].value); + var listblock1 = py2block.convert(value.keywords[1].value); + if(value.keywords[0].arg.v =="columns"&&value.keywords[1].arg.v =="index"){ + return block('dataframe_create_from_index', node.lineno, { + 'VAR': series + }, { + 'SER': argblock, + 'INDEX_COLUMN': listblock0, + 'INDEX_RAW': listblock1 + }); + } + if(value.keywords[1].arg.v =="columns"&&value.keywords[0].arg.v =="index"){ + return block('dataframe_create_from_index', node.lineno, { + 'VAR': series + }, { + 'SER': argblock, + 'INDEX_COLUMN': listblock1, + 'INDEX_RAW': listblock0 + }); + } + } +} + +pbc.moduleFunctionD.get('pylab')['scatter'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 2) { + throw new Error("Incorrect number of arguments"); + } + + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + var key1block = py2block.convert(keywords[0].value); + var key2block = py2block.Str_value(keywords[1].value); + var key3block = py2block.Str_value(keywords[2].value); + var key4block = py2block.convert(keywords[3].value); + key2block = key2block.substring(3,key2block.length - 1); + key3block = key3block.substring(7,key3block.length - 1); + return [block("pl_plot_scatter", func.lineno, { + 'DOT':key3block, + 'COLOR':key2block + }, { + 'A': arg1block, + 'B': arg2block, + 'S': key1block, + 'TAG': key4block + }, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('pylab')['plot'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1&&args.length != 2&&args.length != 3) { + throw new Error("Incorrect number of arguments"); + } + + + if (args.length == 1){ + var argblock = py2block.convert(args[0]); + return [block("pl_plot_easy", func.lineno, { + }, { + 'SER': argblock + }, { + "inline": "true" + })]; + } + else if(args.length == 2){ + if(args[1]._astname == 'Str'){ + + var argblock = py2block.convert(args[0]); + var lineblock = args[1].s.v; + if (lineblock.length>4) { + throw new Error("Incorrect number of arguments"); + } + var dottype = ','; + var linetype = ''; + var colortype = 'b'; + for(var i=0;i': + dottype=operate; + break; + + case '4': + dottype=operate; + break; + + case 'h': + dottype=operate; + break; + + case 'D': + dottype=operate; + break; + + case 'v': + dottype=operate; + break; + + case '1': + dottype=operate; + break; + + case 's': + dottype=operate; + break; + + case 'd': + dottype=operate; + break; + + case 'H': + dottype=operate; + break; + } + + } + } + + return [block("pl_plot", func.lineno, { + 'DOT':dottype, + 'LINE':linetype, + 'COLOR':colortype + }, { + 'SER': argblock + }, { + "inline": "true" + })]; + } + else{ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("pl_plot_bar", func.lineno, { + 'DIR':"plot" + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; + } + } + else if(args.length == 3){ + + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + var lineblock = args[2].s.v; + if (lineblock.length>4) { + throw new Error("Incorrect number of arguments"); + } + var dottype = ','; + var linetype = ''; + var colortype = 'b'; + for(var i=0;i': + dottype=operate; + break; + + case '4': + dottype=operate; + break; + + case 'h': + dottype=operate; + break; + + case 'D': + dottype=operate; + break; + + case 'v': + dottype=operate; + break; + + case '1': + dottype=operate; + break; + + case 's': + dottype=operate; + break; + + case 'd': + dottype=operate; + break; + + case 'H': + dottype=operate; + break; + } + + } + } + var args0 = { + _astname: "Str", + n: { + 'v': "" + } + } + if(keywords.length==1&&keywords[0].arg.v=='label'){ + args0=py2block.convert(keywords[0].value) + } + return [block("pl_plot_xy", func.lineno, { + 'DOT':dottype, + 'LINE':linetype, + 'COLOR':colortype + }, { + 'A': arg1block, + 'B':arg2block, + 'TAG':args0 + }, { + "inline": "true" + })]; + } +} + +pbc.moduleFunctionD.get('pylab')['bar'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length >2) { + throw new Error("Incorrect number of arguments"); + } + + + if (args.length == 2){ + if(keywords.length==0){ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("pl_plot_bar", func.lineno, { + 'DIR':"bar" + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; + } + else{ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + + for(var i=0;i 3 || args.length < 1) { + throw new Error("Incorrect number of arguments"); + } + var arg1block, arg2block, arg3block; + if (args.length == 1) { + arg2block = py2block.convert(args[0]); + var args0 = { + _astname: "Num", + n: { + 'v': 0 + } + + }; + arg1block = py2block.convert(args0); + var args2 = { + _astname: "Num", + n: { + 'v': 1 + } + }; + arg3block = py2block.convert(args2); + }else if (args.length == 2) { + var args2 = { + _astname: "Num", + n: { + 'v': 1 + } + }; + arg1block = py2block.convert(args[0]); + arg2block = py2block.convert(args[1]); + arg3block = py2block.convert(args2); + }else { + arg1block = py2block.convert(args[0]); + arg2block = py2block.convert(args[1]); + arg3block = py2block.convert(args[2]); + } + return block("array_create", func.lineno, {}, { + 'FROM': arg1block, + 'TO': arg2block, + 'STEP': arg3block + }, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('pylab')['subplot'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 3 ) { + throw new Error("Incorrect number of arguments"); + } + var arg1block, arg2block, arg3block; + { + arg1block = py2block.convert(args[0]); + arg2block = py2block.convert(args[1]); + arg3block = py2block.convert(args[2]); + } + return [block("pl_subplot", func.lineno, {}, { + 'VET': arg1block, + 'HOR': arg2block, + 'NUM': arg3block + }, { + "inline": "true" + })]; +} + + +pbc.moduleFunctionD.get('pandas')['read_csv'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 1 ) { + throw new Error("Incorrect number of arguments"); + } + + var argblock = py2block.convert(args[0]); + if(keywords.length>0){ + if (keywords[0].value._astname=='Num'){ + var args0=keywords[0].value.n.v + } + else if (keywords[0].value._astname=='Name'){ + var args0=keywords[0].value.id.v + } +} + else{ + var args0=0 + } + return block("pandas_readcsv", func.lineno, { + 'MODE':args0 + }, { + 'FILENAME': argblock, + + }, { + "inline": "true" + }); +} + +pbc.moduleFunctionD.get('pylab')['savefig'] = function(py2block, func, args, keywords, starargs, kwargs, node){ + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var argblock = py2block.convert(args[0]); + return [block("pl_savefig", func.lineno, {}, { + "FILE" : argblock + }, { + "inline": "true" + })]; +} + +pbc.moduleFunctionD.get('pylab')['text'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length != 3 ) { + throw new Error("Incorrect number of arguments"); + } + var arg1block, arg2block, arg3block; + { + arg1block = py2block.convert(args[0]); + arg2block = py2block.convert(args[1]); + arg3block = py2block.convert(args[2]); + } + for(var i=0;i1) { + throw new Error("Incorrect number of arguments"); + } + + + + + var arg1block = py2block.convert(args[0]); + + + for(var i=0;i4) { + throw new Error("Incorrect number of arguments"); + } + var dottype = ','; + var linetype = ''; + var colortype = 'b'; + for(var i=0;i': + dottype=operate; + break; + + case '4': + dottype=operate; + break; + + case 'h': + dottype=operate; + break; + + case 'D': + dottype=operate; + break; + + case 'v': + dottype=operate; + break; + + case '1': + dottype=operate; + break; + + case 's': + dottype=operate; + break; + + case 'd': + dottype=operate; + break; + + case 'H': + dottype=operate; + break; + } + + } + } + + return [block("plot_plot", func.lineno, { + 'DOT':dottype, + 'LINE':linetype, + 'COLOR':colortype + }, { + 'SER': argblock + }, { + "inline": "true" + })]; + } + else{ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("plot_plot_bar", func.lineno, { + 'DIR':"plot" + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; + } + } + else if(args.length == 3){ + + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + var lineblock = args[2].s.v; + if (lineblock.length>4) { + throw new Error("Incorrect number of arguments"); + } + var dottype = ','; + var linetype = ''; + var colortype = 'b'; + for(var i=0;i': + dottype=operate; + break; + + case '4': + dottype=operate; + break; + + case 'h': + dottype=operate; + break; + + case 'D': + dottype=operate; + break; + + case 'v': + dottype=operate; + break; + + case '1': + dottype=operate; + break; + + case 's': + dottype=operate; + break; + + case 'd': + dottype=operate; + break; + + case 'H': + dottype=operate; + break; + } + + } + } + var args0 = { + _astname: "Str", + n: { + 'v': "" + } + } + if(keywords.length==1&&keywords[0].arg.v=='label'){ + args0=py2block.convert(keywords[0].value) + } + return [block("plot_plot_xy", func.lineno, { + 'DOT':dottype, + 'LINE':linetype, + 'COLOR':colortype + }, { + 'A': arg1block, + 'B':arg2block, + 'TAG':args0 + }, { + "inline": "true" + })]; + } +} + +pbc.moduleFunctionD.get('matplotlib.pyplot')['bar'] = function(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length >2) { + throw new Error("Incorrect number of arguments"); + } + + + if (args.length == 2){ + if(keywords.length==0){ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + return [block("plot_plot_bar", func.lineno, { + 'DIR':"bar" + }, { + 'A': arg1block, + 'B':arg2block + }, { + "inline": "true" + })]; + } + else{ + var arg1block = py2block.convert(args[0]); + var arg2block = py2block.convert(args[1]); + + for(var i=0;i1) { + throw new Error("Incorrect number of arguments"); + } + + + + + var arg1block = py2block.convert(args[0]); + + + for(var i=0;i5 || keywords.length>2) { + throw new Error("Incorrect number of arguments"); + } + if(args.length==5){ + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + var argblock3 = py2block.convert(args[2]); + var argblock4 = py2block.convert(args[3]); + var argblock5 = py2block.convert(args[4]); + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MAX':argblock5, + 'MIN':argblock4 + }, { + "inline": "true" + }); + + } + if(args.length==4){ + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + var argblock3 = py2block.convert(args[2]); + var argblock4 = py2block.convert(args[3]); + if(keywords.length==1){ + if(py2block.identifier(keywords[0].arg) === "maxval"){ + var maxblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MAX':maxblock, + 'MIN':argblock4 + }, { + "inline": "true" + }); + } + if(py2block.identifier(keywords[0].arg) === "minval"){ + var minblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MIN':minblock, + 'MAX':argblock4 + }, { + "inline": "true" + }); + + } + } + if(keywords.length==0){ + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MIN':argblock4, + + }, { + "inline": "true" + }); + } + } + if(args.length==3){ + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + var argblock3 = py2block.convert(args[2]); + if(keywords.length==1){ + if(py2block.identifier(keywords[0].arg) === "maxval"){ + var maxblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MAX':maxblock + }, { + "inline": "true" + }); + } + if(py2block.identifier(keywords[0].arg) === "minval"){ + var minblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MIN':minblock + }, { + "inline": "true" + }); + + } + } + if(keywords.length==2){ + if(py2block.identifier(keywords[0].arg) === "maxval"){var maxblock=py2block.convert(keywords[0].value)} + else if(py2block.identifier(keywords[1].arg) === "maxval"){var maxblock=py2block.convert(keywords[1].value)} + if(py2block.identifier(keywords[0].arg) === "minval"){var minblock=py2block.convert(keywords[0].value)} + else if(py2block.identifier(keywords[1].arg) === "minval"){var minblock=py2block.convert(keywords[1].value)} + + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'DEFAULT':argblock3, + 'MIN':minblock, + 'MAX':maxblock + }, { + "inline": "true" + });} + } + if(args.length==2){ + var argblock1 = py2block.convert(args[0]); + var argblock2 = py2block.convert(args[1]); + + if(keywords.length==1){ + if(py2block.identifier(keywords[0].arg) === "maxval"){ + var maxblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'MAX':maxblock + }, { + "inline": "true" + }); + } + if(py2block.identifier(keywords[0].arg) === "minval"){ + var minblock=py2block.convert(keywords[0].value) + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'MIN':minblock + }, { + "inline": "true" + }); + + } + } + if(keywords.length==2){ + if(py2block.identifier(keywords[0].arg) === "maxval"){var maxblock=py2block.convert(keywords[0].value)} + else if(py2block.identifier(keywords[1].arg) === "maxval"){var maxblock=py2block.convert(keywords[1].value)} + if(py2block.identifier(keywords[0].arg) === "minval"){var minblock=py2block.convert(keywords[0].value)} + else if(py2block.identifier(keywords[1].arg) === "minval"){var minblock=py2block.convert(keywords[1].value)} + + return block('turtle_numinput', func.lineno, {}, { + 'TITLE':argblock1, + 'PROMPT':argblock2, + 'MIN':minblock, + 'MAX':maxblock + }, { + "inline": "true" + });} + } +} + +pbc.objectFunctionD.get('write')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + var args0 = { + _astname: "Str", + s: { + 'v': 'Arial' + } + + }; + var args1 = { + _astname: "Num", + n: { + 'v': 8 + } + + }; + + if (args.length !== 1 && args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + if(args.length == 1){ + if (keywords.length == 0){ + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + + return [block('turtle_write', func.lineno, {}, { + 'TUR': turtleblock, + + 'VAR': argblock, + }, { + "inline": "true" + })]; + } + else if (keywords.length == 1){ + var tag = py2block.identifier(keywords[0].arg) + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (tag=='align') { + var formatblock = py2block.Str_value(keywords[0].value); + var fontnumblock = py2block.convert(args1); + var fontnameblock = py2block.convert(args0); + return [block('turtle_write_format', func.lineno, { + 'ALIGN':formatblock + }, { + + 'TUR': turtleblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + if (tag=='font') { + var fontnameblock = py2block.convert(keywords[0].value.elts[0]); + var fontnumblock = py2block.convert(keywords[0].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + if (keywords[0].value.elts.length == 4){ + if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')|| + (keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){ + keywords[0].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + } + } + + return [block('turtle_write_format', func.lineno, { + 'FONTTYPE':fonttypeblock + }, { + 'TUR': turtleblock, + 'VAR': argblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock + }, { + "inline": "true" + })]; + } + } + else if (keywords.length == 2){ + var tag1 = py2block.identifier(keywords[0].arg) + var tag2 = py2block.identifier(keywords[1].arg) + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (tag1=='align' && tag2=='font') { + var formatblock = py2block.Str_value(keywords[0].value); + var fontnameblock = py2block.convert(keywords[1].value.elts[0]); + var fontnumblock = py2block.convert(keywords[1].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]); + if (keywords[1].value.elts.length == 4){ + if((keywords[1].value.elts[2].s.v=='bold'&&keywords[1].value.elts[3].s.v=='italic')|| + (keywords[1].value.elts[3].s.v=='bold'&&keywords[1].value.elts[2].s.v=='italic')){ + keywords[1].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]); + } + } + } + if (tag2=='align' && tag1=='font') { + var formatblock = py2block.Str_value(keywords[1].value); + var fontnameblock = py2block.convert(keywords[0].value.elts[0]); + var fontnumblock = py2block.convert(keywords[0].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + if (keywords[0].value.elts.length == 4){ + if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')|| + (keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){ + keywords[0].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + } + } + } + return [block('turtle_write_format', func.lineno, { + 'FONTTYPE':fonttypeblock, + 'ALIGN':formatblock + }, { + 'TUR': turtleblock, + 'VAR': argblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock + }, { + "inline": "true" + })]; + + } + } + if(args.length == 2){ + var moveblock = py2block.Name_str(args[1]); + if (keywords.length == 0){ + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + var fontnameblock = py2block.convert(args0); + var fontnumblock = py2block.convert(args1); + return [block('turtle_write_format', func.lineno, { + 'MOVE':moveblock + }, { + 'TUR': turtleblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock, + 'VAR': argblock, + }, { + "inline": "true" + })]; + } + else if (keywords.length == 1){ + var tag = py2block.identifier(keywords[0].arg) + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (tag=='align') { + var formatblock = py2block.Str_value(keywords[0].value); + var fontnameblock = py2block.convert(args0); + var fontnumblock = py2block.convert(args1); + return [block('turtle_write_format', func.lineno, { + 'ALIGN':formatblock, + 'MOVE':moveblock + }, { + + 'TUR': turtleblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + if (tag=='font') { + var fontnameblock = py2block.convert(keywords[0].value.elts[0]); + var fontnumblock = py2block.convert(keywords[0].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + if (keywords[0].value.elts.length == 4){ + if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')|| + (keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){ + keywords[0].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + } + } + return [block('turtle_write_format', func.lineno, { + 'FONTTYPE':fonttypeblock, + 'MOVE':moveblock + }, { + 'TUR': turtleblock, + 'VAR': argblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock + }, { + "inline": "true" + })]; + } + } + else if (keywords.length == 2){ + var tag1 = py2block.identifier(keywords[0].arg) + var tag2 = py2block.identifier(keywords[1].arg) + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (tag1=='align' && tag2=='font') { + var formatblock = py2block.Str_value(keywords[0].value); + var fontnameblock = py2block.convert(keywords[1].value.elts[0]); + var fontnumblock = py2block.convert(keywords[1].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]); + if (keywords[1].value.elts.length == 4){ + if((keywords[1].value.elts[2].s.v=='bold'&&keywords[1].value.elts[3].s.v=='italic')|| + (keywords[1].value.elts[3].s.v=='bold'&&keywords[1].value.elts[2].s.v=='italic')){ + keywords[1].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]); + } + } + } + if (tag2=='align' && tag1=='font') { + var formatblock = py2block.Str_value(keywords[1].value); + var fontnameblock = py2block.convert(keywords[0].value.elts[0]); + var fontnumblock = py2block.convert(keywords[0].value.elts[1]); + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + if (keywords[0].value.elts.length == 4){ + if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')|| + (keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){ + keywords[0].value.elts[2].s.v = 'bold","italic' + var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]); + } + } + } + return [block('turtle_write_format', func.lineno, { + 'FONTTYPE':fonttypeblock, + 'ALIGN':formatblock, + 'MOVE':moveblock + }, { + 'TUR': turtleblock, + 'VAR': argblock, + 'FONTNAME':fontnameblock, + 'FONTNUM':fontnumblock + }, { + "inline": "true" + })]; + + } + } +} + +pbc.objectFunctionD.get('circle')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2 && args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + if(args.length == 2){ + var turtleblock = py2block.convert(func.value); + var varblock = py2block.convert(args[0]); + var datablock = py2block.convert(args[1]); + + return [block('turtle_circle_advanced', func.lineno, {}, { + 'TUR': turtleblock, + 'VAR': varblock, + 'data': datablock + }, { + "inline": "true" + })]; + } + if(args.length == 1){ + var turtleblock = py2block.convert(func.value); + var varblock = py2block.convert(args[0]); + + + return [block('turtle_circle', func.lineno, { + 'DIR': 'circle' + }, { + 'TUR': turtleblock, + 'VAR': varblock + }, { + "inline": "true" + })]; + } + } + + +pbc.objectFunctionD.get('dot')['turtleClass'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var varblock = py2block.convert(args[0]); + + return [block('turtle_circle', func.lineno, { + 'DIR': 'dot' + }, { + 'TUR': turtleblock, + 'VAR': varblock + }, { + "inline": "true" + })]; + } + + +pbc.objectFunctionD.get('clone')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return block('turtle_clone', func.lineno, {}, { + 'TUR': turtleblock + }, { + "inline": "true" + }); +} + +pbc.objectFunctionD.get('pos')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'pos' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + }); +} + +pbc.objectFunctionD.get('position')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'pos' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + }); +} + +pbc.objectFunctionD.get('heading')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return block('turtle_pos_shape', func.lineno, { + 'DIR': 'heading' + }, { + 'TUR': turtleblock + }, { + "inline": "true" + }); +} + +function turtleHideShow(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return [block('turtle_visible', func.lineno, { + 'DIR': mode + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.objectFunctionD.get('hideturtle')[turtleClass] = turtleHideShow('hideturtle'); +pbc.objectFunctionD.get('showturtle')[turtleClass] = turtleHideShow('showturtle'); + + +pbc.objectFunctionD.get('pencolor')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + + + + + if (args[0]._astname != "Str") { + return [block("turtle_pencolor_hex", func.lineno, {}, { + 'TUR': turtleblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + else{ + return [block('turtle_pencolor', func.lineno, { + "FIELDNAME":py2block.Str_value(args[0]) + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + } + +} + + +pbc.objectFunctionD.get('fillcolor')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (args[0]._astname == "Str" ) { + return [block('turtle_fillcolor', func.lineno, { + "FIELDNAME":py2block.Str_value(args[0]) + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + } else { + return [block("turtle_fillcolor_hex", func.lineno, {}, { + 'TUR': turtleblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + + +} + +pbc.objectFunctionD.get('color')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2 &&args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + if(args.length == 2){ + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + var argblock1 = py2block.convert(args[1]); + if (args[0]._astname == "Str" ) { + return [block('turtle_color', func.lineno, { + "FIELDNAME":py2block.Str_value(args[0]), + "FIELDNAME2":py2block.Str_value(args[1]) + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + } else { + return [block("turtle_color_hex", func.lineno, {}, { + 'TUR': turtleblock, + 'VAR1': argblock, + 'VAR2': argblock1 + }, { + "inline": "true" + })]; + } + } + if(args.length == 1){ + var turtleblock = py2block.convert(func.value); + var argblock = py2block.convert(args[0]); + if (args[0]._astname != "Str") { + return [block("turtle_pencolor_hex", func.lineno, {}, { + 'TUR': turtleblock, + 'VAR': argblock + }, { + "inline": "true" + })]; + } + else{ + return [block('turtle_pencolor', func.lineno, { + "FIELDNAME":py2block.Str_value(args[0]) + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; + + } + } + +} + + + + +function turtleBeginEndFill(mode){ + function converter(py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return [block("turtle_fill", func.lineno, { + 'DIR': mode + }, { + 'TUR': turtleblock, + }, { + "inline": "true" + })]; + } + return converter; +} + +pbc.objectFunctionD.get('begin_fill')[turtleClass] = turtleBeginEndFill('begin'); +pbc.objectFunctionD.get('end_fill')[turtleClass] = turtleBeginEndFill('end'); + + +pbc.objectFunctionD.get('onkey')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + pbc.pinType = "pins_callback"; + var callback = py2block.convert(args[0]); + pbc.pinType=null; + var tupblock = py2block.convert(args[1]); + return [block("turtle_onkey", func.lineno, {},{ + 'TUR': turtleblock, + "callback":callback, + "VAR":tupblock + },{ + "inline": "true" + })]; +}; + +pbc.objectFunctionD.get('onclick')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 1) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + pbc.pinType = "pins_callback"; + var callback = py2block.convert(args[0]); + + return [block("turtle_onclick", func.lineno, {},{ + 'TUR': turtleblock, + "callback":callback, + + },{ + "inline": "true" + })]; +}; + +pbc.objectFunctionD.get('ontimer')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 2) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + pbc.pinType = "pins_callback"; + var callback = py2block.convert(args[0]); + pbc.pinType=null; + var tupblock = py2block.convert(args[1]); + return [block("turtle_ontimer", func.lineno, {},{ + 'TUR': turtleblock, + "callback":callback, + "VAR":tupblock + },{ + "inline": "true" + })]; +}; + + +pbc.objectFunctionD.get('listen')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) { + if (args.length !== 0) { + throw new Error("Incorrect number of arguments"); + } + var turtleblock = py2block.convert(func.value); + return [block('turtle_listen', func.lineno, { + + }, { + 'TUR': turtleblock + }, { + "inline": "true" + })]; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/css/color_mixpy_python_skulpt.css b/mixly/boards/default_src/python_skulpt/css/color_mixpy_python_skulpt.css new file mode 100644 index 00000000..0ae3a75f --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/css/color_mixpy_python_skulpt.css @@ -0,0 +1,178 @@ +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/inout.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/inout2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ctrl.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ctrl2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/math.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/math2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/logic.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/logic2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/text.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/text2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/list3.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/list4.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/tuple.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/tuple2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/dict.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/dict2.png') no-repeat; + background-size: 100% auto; +} + + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/set.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/set2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/var.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/var2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/func.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/func2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio2.png') no-repeat; + background-size: 100% auto; +} + +#catMixIO.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio.png') no-repeat; + background-size: 100% auto; +} + +#catMixIO.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/turtle.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/turtle2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/data.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/data2.png') no-repeat; + background-size: 100% auto; +} + +/*div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{ + background:url('../../../../common/media/mark/machine_learning.png') no-repeat; + background-size: 100% auto; +} +div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{ + background:url('../../../../common/media/mark/machine_learning2.png') no-repeat; + background-size: 100% auto; +}*/ +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(15)>div:nth-child(2)>div>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/algorithm.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(15)>div:nth-child(2)>div>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/algorithm2.png') no-repeat; + background-size: 100% auto; +} + +#catFactory.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/factory3.png') no-repeat; + background-size: 100% auto; +} + +#catFactory.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/factory4.png') no-repeat; + background-size: 100% auto; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/export.js b/mixly/boards/default_src/python_skulpt/export.js new file mode 100644 index 00000000..c9d3a731 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/export.js @@ -0,0 +1,9 @@ +import * as MicropythonESP32Pins from './blocks/esp32_profile'; +import * as MicropythonESP32PinsBlocks from './blocks/pins'; +import * as MicropythonESP32PinsGenerators from './generators/pins'; + +export { + MicropythonESP32Pins, + MicropythonESP32PinsBlocks, + MicropythonESP32PinsGenerators +}; \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/generators/data.js b/mixly/boards/default_src/python_skulpt/generators/data.js new file mode 100644 index 00000000..95430acf --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/generators/data.js @@ -0,0 +1,430 @@ +import * as Blockly from 'blockly/core'; + +export const series_create = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.Series(' + varName1 + ')\n'; + return code; +} + +export const series_create_from_index = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'INDEX', generator.ORDER_ATOMIC) || '\'\''; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.Series(' + varName1 + ',' + 'index=' + varName2 + ')\n'; + return code; +} + +export const dataframe_create = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.DataFrame(' + varName1 + ')\n'; + return code; +} + +export const dataframe_create_from_index = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'INDEX_COLUMN', generator.ORDER_ATOMIC) || '\'\''; + var varName3 = generator.valueToCode(this, 'INDEX_RAW', generator.ORDER_ATOMIC) || '\'\''; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.DataFrame(' + varName1 + ',' + 'columns=' + varName2 + ',index=' + varName3 + ')\n'; + return code; +} + +export const dataframe_create_from_one_index = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var name = this.getFieldValue('COLUMN_RAW'); + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'INDEX', generator.ORDER_ATOMIC) || '\'\''; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.DataFrame(' + varName1 + ',' + name + '=' + varName2 + ')\n'; + return code; +} + +export const series_create_from_text = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var text = this.getFieldValue('TEXT'); + var code = varName + ' = ' + 'pandas.Series([' + text + '])\n'; + return code; +} + +export const series_index_value = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName = generator.valueToCode(this, 'SERIES', generator.ORDER_ASSIGNMENT) || '0'; + var name = this.getFieldValue('INDEX_VALUE'); + var code = varName + '.' + name; + return [code, generator.ORDER_ATOMIC]; +} + +export const series_get_num = function (_, generator) { + // Indexing into a list is the same as indexing into a string. + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var argument0 = generator.valueToCode(this, 'AT', + generator.ORDER_ADDITIVE) || '1'; + var code = varName + '[' + argument0 + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +export const pl_show = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var code = 'pylab.show()\n'; + return code; +} + +export const pl_axes = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var code = 'pylab.axes(aspect=1)\n'; + return code; +} + +export const pl_plot_easy = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'pylab.plot(' + varName + ")\n"; + return code; +} + +export const pl_plot = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var line = this.getFieldValue('LINE'); + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'pylab.plot(' + varName + ",'" + dot + line + color + "')\n"; + return code; +} + +export const pl_legend = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + generator.definitions_.import_matplotlib_font_manager = "import matplotlib.font_manager"; + var code = 'pylab.legend(' + 'prop=matplotlib.font_manager.FontProperties("' + "STSong" + '")' + ')\n'; + return code; +} + +export const pl_title = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var code = 'pylab.title(' + a + ', fontproperties = "' + "STSong" + '")\n'; + return code; +} + +export const pl_label = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'LABEL', generator.ORDER_ATOMIC); + var code = 'pylab.' + direction + 'label(' + a + ', fontproperties = "' + "STSong" + '")\n'; + return code; +} + +export const array_create = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + var from = generator.valueToCode(this, "FROM", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "TO", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "STEP", generator.ORDER_NONE) || "1"; + var code = "numpy.arange(" + from + ", " + end + ", " + step + ")"; + return [code, generator.ORDER_ATOMIC]; +} + +export const pl_plot_bar = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.' + direction + '(' + a + ',' + b + ")\n"; + return code; +} + +export const pl_plot_scatter = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var s = generator.valueToCode(this, 'S', generator.ORDER_ATOMIC) || '\'\''; + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.scatter(' + a + ',' + b + ",s=" + s + ",c='" + color + "',marker='" + dot + "',label=" + tag + ")\n"; + return code; +} + +export const pl_plot_xy = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var line = this.getFieldValue('LINE'); + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.plot(' + a + ',' + b + ",'" + dot + line + color + "'" + ',label=' + tag + ")\n"; + return code; +} + +export const pl_bar = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var width = generator.valueToCode(this, 'WIDTH', generator.ORDER_RELATIONAL) || '0'; + var color = this.getFieldValue('COLOR') + var align = this.getFieldValue('ALIGN'); + var code = 'pylab.bar(' + a + ',' + b + ',align="' + align + '",color="' + color + '",width=' + width + ',label=' + tag + ")\n"; + return code; +} + +export const pl_pie = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var explode = generator.valueToCode(this, 'EXPLODE', generator.ORDER_ATOMIC) || '\'\''; + var shadow = this.getFieldValue('SHADOW'); + var autopct = this.getFieldValue('autopct'); + if (autopct != 'None') { autopct = "'" + autopct + "'" } + var code = 'pylab.pie(' + a + ',explode=' + explode + ',labels=' + b + ',autopct=' + autopct + ',shadow=' + shadow + ")\n"; + return code; +} + +export const pl_hist = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.hist(' + a + ',' + b + ")\n"; + return code; +} + +export const pl_ticks = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.' + direction + 'ticks(' + a + ',' + b + ",fontproperties = '" + "STSong" + "')\n"; + return code; +} + +export const numpy_trig = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + var argument0 = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0'; + var operator = this.getFieldValue('OP'); + var code = ""; + code = "numpy." + operator + '(' + argument0 + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const pl_subplot = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + var from = generator.valueToCode(this, "VET", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "HOR", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "NUM", generator.ORDER_NONE) || "0"; + var code = "pylab.subplot(" + from + ", " + end + ", " + step + ")\n"; + return code +} + +export const pandas_readcsv = function (_, generator) { + // For each loop. + generator.definitions_.import_pandas = "import pandas"; + var fn = generator.valueToCode(this, 'FILENAME', generator.ORDER_ATOMIC); + var mode = this.getFieldValue('MODE'); + var code = 'pandas.read_csv(' + fn + ', header=' + mode + ')\n'; + return [code, generator.ORDER_ATOMIC]; +} + +export const dataframe_get = function (_, generator) { + var mode = this.getFieldValue('MODE'); + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT); + if (mode == "column") { + var code = varName + "[" + text + "]"; + } else if (mode == 'raw') { + var code = varName + ".loc[" + text + "]"; + } + return [code, generator.ORDER_ATOMIC]; +} + +export const pl_savefig = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = "pylab.savefig(" + file + ")\n"; + return code; +} + +export const pl_text = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + var from = generator.valueToCode(this, "VET", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "HOR", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "NUM", generator.ORDER_NONE) || "0"; + var halign = this.getFieldValue('HALIGN'); + var valign = this.getFieldValue('VALIGN'); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var code = "pylab.text(" + from + ", " + end + ", " + step + ", ha='" + halign + "', va='" + valign + "', fontsize=" + fontnum + ")\n"; + return code +} + +export const array_toarray = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'; + generator.definitions_['import_numpy'] = 'import numpy'; + var code = 'numpy.array(' + str + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const plot_show = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var code = 'matplotlib.pyplot.show()\n'; + return code; +} + +export const plot_axes = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var code = 'matplotlib.pyplot.axes(aspect=1)\n'; + return code; +} + +export const plot_plot_easy = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'matplotlib.pyplot.plot(' + varName + ")\n"; + return code; +} + +export const plot_plot = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var line = this.getFieldValue('LINE'); + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'matplotlib.pyplot.plot(' + varName + ",'" + dot + line + color + "')\n"; + return code; +} + +export const plot_legend = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + generator.definitions_.import_matplotlib_font_manager = "import matplotlib.font_manager"; + var code = 'matplotlib.pyplot.legend(' + 'prop=matplotlib.font_manager.FontProperties("' + "STSong" + '")' + ')\n'; + return code; +} + +export const plot_title = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var code = 'matplotlib.pyplot.title(' + a + ')\n'; + return code; +} + +export const plot_label = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'LABEL', generator.ORDER_ATOMIC); + var code = 'matplotlib.pyplot.' + direction + 'label(' + a + ')\n'; + return code; +} + +export const plot_plot_bar = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.' + direction + '(' + a + ',' + b + ")\n"; + return code; +} + +export const plot_plot_scatter = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var s = generator.valueToCode(this, 'S', generator.ORDER_ATOMIC) || '\'\''; + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.scatter(' + a + ',' + b + ",s=" + s + ",color='" + color + "',marker='" + dot + "',label=" + tag + ")\n"; + return code; +} + +export const plot_plot_xy = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var line = this.getFieldValue('LINE'); + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.plot(' + a + ',' + b + ",'" + dot + line + color + "'" + ',label=' + tag + ")\n"; + return code; +} + +export const plot_bar = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var width = generator.valueToCode(this, 'WIDTH', generator.ORDER_RELATIONAL) || '0'; + var color = this.getFieldValue('COLOR') + var align = this.getFieldValue('ALIGN'); + var code = 'matplotlib.pyplot.bar(' + a + ',' + b + ',align="' + align + '",color="' + color + '",width=' + width + ',label=' + tag + ")\n"; + return code; +} + +export const plot_pie = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var explode = generator.valueToCode(this, 'EXPLODE', generator.ORDER_ATOMIC) || '\'\''; + var shadow = this.getFieldValue('SHADOW'); + var autopct = this.getFieldValue('autopct'); + if (autopct != 'None') { autopct = "'" + autopct + "'" } + var code = 'matplotlib.pyplot.pie(' + a + ',explode=' + explode + ',labels=' + b + ',autopct=' + autopct + ',shadow=' + shadow + ")\n"; + return code; +} + +export const plot_hist = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.hist(' + a + ',' + b + ")\n"; + return code; +} + +export const plot_ticks = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.' + direction + 'ticks(' + a + ',' + b + ",fontproperties = '" + "STSong" + "')\n"; + return code; +} + +export const plot_subplot = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var from = generator.valueToCode(this, "VET", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "HOR", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "NUM", generator.ORDER_NONE) || "0"; + var code = "matplotlib.pyplot.subplot(" + from + ", " + end + ", " + step + ")\n"; + return code +} + +export const plot_savefig = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var code = "matplotlib.pyplot.savefig('1.png')\n"; + return code; +} + +export const plot_text = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var from = generator.valueToCode(this, "VET", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "HOR", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "NUM", generator.ORDER_NONE) || "0"; + var halign = this.getFieldValue('HALIGN'); + var valign = this.getFieldValue('VALIGN'); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var code = "matplotlib.pyplot.text(" + from + ", " + end + ", " + step + ", ha='" + halign + "', va='" + valign + "', fontsize=" + fontnum + ")\n"; + return code +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/generators/inout.js b/mixly/boards/default_src/python_skulpt/generators/inout.js new file mode 100644 index 00000000..56f11e7b --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/generators/inout.js @@ -0,0 +1,44 @@ +export const inout_input = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + return ['input(' + str + ')', generator.ORDER_ATOMIC]; +} + +export const inout_print = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var code = "print(" + str + ")\n"; + return code; +} + +export const inout_print_inline = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var code = "print(" + str + ',end ="")\n'; + return code; +} + +export const inout_print_end = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var end = generator.valueToCode(this, 'END', generator.ORDER_ATOMIC) || '""'; + var code = "print(" + str + ',end =' + end + ')\n'; + return code; +} + +export const inout_type_input = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var type = this.getFieldValue('DIR'); + if (type == 'str') { var code = 'input(' + str + ')' } + else if (type == 'int') { var code = 'int(input(' + str + '))' } + else if (type == 'float') { var code = 'float(input(' + str + '))' } + //var code=varname+"." + type + "(" + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const inout_print_many = function (_, generator) { + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + var code = 'print(' + code.join(', ') + ')\n'; + return code; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/generators/iot.js b/mixly/boards/default_src/python_skulpt/generators/iot.js new file mode 100644 index 00000000..4937f5c4 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/generators/iot.js @@ -0,0 +1,114 @@ +export const iot_mixio_connect = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC); + var username = generator.valueToCode(this, 'USERNAME', generator.ORDER_ATOMIC); + var password = generator.valueToCode(this, 'PASSWORD', generator.ORDER_ATOMIC); + var project = generator.valueToCode(this, 'PROJECT', generator.ORDER_ATOMIC); + var timestamp = Math.round(new Date()).toString(); + //var subscribe = generator.valueToCode(this, 'SUB', generator.ORDER_ASSIGNMENT) || '0'; + var a = "f'python-mqtt-" + username.replace("'", "").replace("'", "") + timestamp.replace("'", "").replace("'", "") + "'"; + var code = 'mqtt_client = mixiot.MixIO(' + server + ', 8084 ,' + username + ', ' + password + ', ' + project + ',' + a + ')\n'; + return code; +} + +export const IOT_MIXIO_PUBLISH = function (_, generator) { + var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC); + var msg = generator.valueToCode(this, 'MSG', generator.ORDER_ATOMIC); + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.publish(' + topic + ', ' + msg + ')\n'; + return code; +} + +export const IOT_MIXIO_SUBSCRIBE = function (_, generator) { + var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC); + var method = generator.valueToCode(this, 'METHOD', generator.ORDER_ATOMIC); + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.subscribe(' + topic + ',' + method + ')\n'; + return code; +} + +export const IOT_MIXIO_UNSUBSCRIBE = function (_, generator) { + var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC); + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.unsubscribe(' + topic + ')\n'; + return code; +} + +export const iot_mixio_disconnect = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.disconnect()\n'; + return code; +} + +export const iot_mixio_connect_only = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.connect()\n'; + return code; +} + +export const iot_mixio_check = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.check_msg()\n'; + return code; +} + +export const iot_mixio_format_topic = function (_, generator) { + var code = 'mqtt_client.decode("utf-8").split("/")[-1]'; + return [code, generator.ORDER_ATOMIC]; +} + +export const iot_mixio_format_msg = function (_, generator) { + var code = 'mqtt_client.decode("utf-8")'; + return [code, generator.ORDER_ATOMIC]; +} + +export const IOT_FORMATTING = function (_, generator) { + generator.definitions_['import_mixpy'] = "import mixpy"; + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = 'mixpy.format_content(' + v + ', mqtt_client.client_id)'; + return [code, generator.ORDER_ATOMIC]; +} + +export const IOT_FORMAT_STRING = function (_, generator) { + generator.definitions_['import_mixpy'] = "import mixpy"; + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = 'mixpy.format_str(' + v + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const IOT_EMQX_INIT_AND_CONNECT_BY_MIXLY_CODE = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC); + var share_code = generator.valueToCode(this, 'KEY', generator.ORDER_ATOMIC); + var timestamp = Math.round(new Date()).toString(); + var a = "f'python-mqtt-" + share_code.replace("'", "").replace("'", "") + timestamp.replace("'", "").replace("'", "") + "'"; + var code = 'mqtt_client = mixiot.MixIO_init_by_mixly_key(' + server + ', 8084 ,' + share_code + ',' + a + ')\n'; + return code; +} + +export const iot_mixly_key = function (_, generator) { + var code = this.getFieldValue('VISITOR_ID'); + return [code, generator.ORDER_ATOMIC]; +} + +export const IOT_EMQX_INIT_AND_CONNECT_BY_SHARE_CODE = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + generator.definitions_['import_time'] = 'import time'; + var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC); + var mixly_code = generator.valueToCode(this, 'KEY', generator.ORDER_ATOMIC); + var timestamp = Math.round(new Date()).toString(); + var a = "f'python-mqtt-" + mixly_code.replace("'", "").replace("'", "") + timestamp.replace("'", "").replace("'", "") + "'"; + var code = 'mqtt_client = mixiot.MixIO_init_by_share_key(' + server + ', 8084 ,' + mixly_code + ',' + a + ')\ntime.sleep(2)\n'; + return code; +} + +export const IOT_EMQX_PING = function (_, generator) { + generator.definitions_['import_mixiot'] = "import mixiot"; + var code = 'mqtt_client.pingSync()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const iot_mixly_key_py = function (_, generator) { + var code = this.getFieldValue('VISITOR_ID'); + return ["'" + code + "'", generator.ORDER_ATOMIC]; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/generators/system.js b/mixly/boards/default_src/python_skulpt/generators/system.js new file mode 100644 index 00000000..5e55a641 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/generators/system.js @@ -0,0 +1,22 @@ +export const controls_millis = function (_, generator) { + generator.definitions_.import_time = "import time"; + var code = 'time.time()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const controls_end_program = function () { + return 'exit()\n'; +} + +export const time_localtime = function (_, generator) { + generator.definitions_.import_time = "import time"; + var op = this.getFieldValue('op'); + var code = "time.localtime()[" + op + "]"; + switch (op) { + case "all": + var code1 = "time.localtime()"; + return [code1, generator.ORDER_ASSIGNMENT]; + default: + return [code, generator.ORDER_ASSIGNMENT]; + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/generators/turtle.js b/mixly/boards/default_src/python_skulpt/generators/turtle.js new file mode 100644 index 00000000..5f975731 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/generators/turtle.js @@ -0,0 +1,391 @@ +import * as Blockly from 'blockly/core'; + +export const turtle_create = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + //generator.definitions_['var_declare'+varName] = varName+'= '+ 'turtle.Turtle()\n'; + var code = varName + ' = ' + 'turtle.Turtle()\n'; + return code; + // return ''; +} + +export const turtle_done = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var code = 'turtle.done()\n'; + return code; +} + +export const turtle_exitonclick = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var code = 'turtle.exitonclick()\n'; + return code; +} + +export const turtle_move = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + direction + "(" + num + ')\n'; + return code; +} + +export const turtle_rotate = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + direction + "(" + num + ')\n'; + return code; +} + +export const turtle_setheading = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.setheading(' + argument + ')\n'; + return code; +} + +export const turtle_screen_delay = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.screen.delay(' + argument + ')\n'; + return code; +} + +export const turtle_goto = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var xnum = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var ynum = generator.valueToCode(this, 'val', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.goto(' + xnum + ',' + ynum + ')\n'; + return code; +} + +export const turtle_pos_shape = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var get = this.getFieldValue('DIR'); + var code = varName + '.' + get + '()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_clear = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var clear = this.getFieldValue('DIR'); + var code = varName + "." + clear + "(" + ')\n'; + return code; +} + +export const turtle_penup = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var penup = this.getFieldValue('DIR'); + var code = varName + "." + penup + "(" + ')\n'; + return code; +} + +export const turtle_fill = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var penup = this.getFieldValue('DIR'); + var code = varName + "." + penup + "_fill(" + ')\n'; + return code; +} + +export const turtle_size_speed = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = this.getFieldValue('TUR'); + var size = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + size + "(" + num + ')\n'; + return code; +} + +export const turtle_size = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.pensize(' + argument + ')\n'; + return code; +} + +export const turtle_speed = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.speed(' + argument + ')\n'; + return code; +} + +export const turtle_circle = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var circle = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + circle + "(" + num + ')\n'; + return code; +} + +export const turtle_setxy = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var xy = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + ".set" + xy + "(" + num + ')\n'; + return code; +} + +export const turtle_circle_advanced = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + ".circle (" + num + ',' + argument + ')\n'; + return code; +} + +export const turtle_visible = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var visible = this.getFieldValue('DIR'); + var code = varName + "." + visible + "(" + ')\n'; + return code; +} + +export const turtle_bgcolor = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var color = this.getFieldValue('FIELDNAME'); + var code = "turtle." + 'bgcolor' + '("' + color + '")\n'; + return code; +} + +export const turtle_pencolor = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = this.getFieldValue('FIELDNAME'); + var code = varName + "." + 'pencolor' + '("' + color + '")\n'; + return code; +} + +export const turtle_fillcolor = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = this.getFieldValue('FIELDNAME'); + var code = varName + "." + 'fillcolor' + '("' + color + '")\n'; + return code; +} + +export const turtle_clone = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.clone()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_bgcolor_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = "turtle." + 'bgcolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_pencolor_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'pencolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_fillcolor_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'fillcolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_bgcolor_hex_new = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = "turtle." + 'bgcolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_pencolor_hex_new = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'pencolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_fillcolor_hex_new = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'fillcolor' + '(' + color + ')\n'; + return code; +} + +export const turtle_color_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC); + var color2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC); + var code = varName + "." + 'color' + '(' + color1 + ',' + color2 + ')\n'; + return code; +} + +export const turtle_color = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color1 = this.getFieldValue('FIELDNAME'); + var color2 = this.getFieldValue('FIELDNAME2'); + var code = varName + "." + 'color' + '("' + color1 + '","' + color2 + '")\n'; + return code; +} + +export const turtle_shape = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + + var code = varName + ".shape('" + direction + "')\n"; + return code; +} + +export const turtle_shapesize = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument1 = generator.valueToCode(this, 'WID', generator.ORDER_ASSIGNMENT) || '0'; + var argument2 = generator.valueToCode(this, 'LEN', generator.ORDER_ASSIGNMENT) || '0'; + var argument3 = generator.valueToCode(this, 'OUTLINE', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + ".shapesize(" + argument1 + ',' + argument2 + ',' + argument3 + ')\n'; + return code; +} + +export const turtle_textinput = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var title = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var prompt = generator.valueToCode(this, 'PROMPT', generator.ORDER_ATOMIC); + var code = "turtle.textinput" + '(' + title + ',' + prompt + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_numinput = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var title = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var prompt = generator.valueToCode(this, 'PROMPT', generator.ORDER_ATOMIC); + var data = generator.valueToCode(this, 'DEFAULT', generator.ORDER_ATOMIC); + var min = generator.valueToCode(this, 'MIN', generator.ORDER_ATOMIC); + var max = generator.valueToCode(this, 'MAX', generator.ORDER_ATOMIC); + var code = "turtle.numinput" + '(' + title + ',' + prompt + "," + data + ',minval = ' + min + ',maxval = ' + max + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_write = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'write' + '(' + write + ')\n'; + return code; +} + +export const turtle_write_format = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var move = this.getFieldValue('MOVE'); + var align = this.getFieldValue('ALIGN'); + var fontname = generator.valueToCode(this, 'FONTNAME', generator.ORDER_ATOMIC); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var fonttype = this.getFieldValue('FONTTYPE'); + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'write' + '(' + write + ',' + move + ',align="' + align + '",font=(' + fontname + ',' + fontnum + ',"' + fonttype + '"))\n'; + return code; +} + +export const turtle_write_format_skulpt = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var move = this.getFieldValue('MOVE'); + var align = this.getFieldValue('ALIGN'); + var fontname = generator.valueToCode(this, 'FONTNAME', generator.ORDER_ATOMIC); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var fonttype = this.getFieldValue('FONTTYPE'); + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'write' + '(' + write + ',' + move + ',align="' + align + '",font=(' + fontname + ',' + fontnum + ',"' + fonttype + '"))\n'; + return code; +} + +export const turtle_color_seclet = function (_, generator) { + var colour = this.getFieldValue('COLOR'); + var code = '"' + colour + '"' + return [code, generator.ORDER_ATOMIC]; +} + +export const turtle_getscreen = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var turName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var code = varName + ' = ' + turName + '.getscreen()\n'; + return code; +} + +export const turtle_onkey = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None"; + var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None"; + var code = varName + ".onkey(" + callback + ", " + v + ")\n"; + return code; +} + +export const turtle_onclick = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None"; + var code = varName + ".onclick(" + callback + ")\n"; + return code; +} + +export const turtle_ontimer = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None"; + var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None"; + var code = varName + ".ontimer(" + callback + ", " + v + ")\n"; + return code; +} + +export const turtle_listen = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.listen()\n'; + return code; +} + +export const turtle_screen_savefig = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = varName + ".getcanvas().postscript(file=" + file + ")\n"; + return code; +} + +export const turtle_stamp = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.stamp()\n'; + return code; +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/index.js b/mixly/boards/default_src/python_skulpt/index.js new file mode 100644 index 00000000..9c1d8947 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/index.js @@ -0,0 +1,111 @@ +import * as Blockly from 'blockly/core'; +import { Profile } from 'mixly'; + +import Variables from '@mixly/python/others/variables'; +import Procedures from '@mixly/python/others/procedures'; +import { Python } from '@mixly/python/python_generator'; + +import * as PythonVariablesBlocks from '@mixly/python/blocks/variables'; +import * as PythonControlBlocks from '@mixly/python/blocks/control'; +import * as PythonMathBlocks from '@mixly/python/blocks/math'; +import * as PythonTextBlocks from '@mixly/python/blocks/text'; +import * as PythonListsBlocks from '@mixly/python/blocks/lists'; +import * as PythonDictsBlocks from '@mixly/python/blocks/dicts'; +import * as PythonLogicBlocks from '@mixly/python/blocks/logic'; +import * as PythonStorageBlocks from '@mixly/python/blocks/storage'; +import * as PythonProceduresBlocks from '@mixly/python/blocks/procedures'; +import * as PythonTupleBlocks from '@mixly/python/blocks/tuple'; +import * as PythonSetBlocks from '@mixly/python/blocks/set'; +import * as PythonHtmlBlocks from '@mixly/python/blocks/html'; +import * as PythonUtilityBlocks from '@mixly/python/blocks/utility'; + +import * as MixPyAlgorithmBlocks from '@mixly/python-mixpy/blocks/algorithm'; +import * as MixPyFactoryBlocks from '@mixly/python-mixpy/blocks/factory'; + +import * as DataBlocks from './blocks/data'; +import * as InoutBlocks from './blocks/inout'; +import * as IotBlocks from './blocks/iot'; +import * as SystemBlocks from './blocks/system'; +import * as TurtleBlocks from './blocks/turtle'; + +import * as PythonVariablesGenerators from '@mixly/python/generators/variables'; +import * as PythonControlGenerators from '@mixly/python/generators/control'; +import * as PythonMathGenerators from '@mixly/python/generators/math'; +import * as PythonTextGenerators from '@mixly/python/generators/text'; +import * as PythonListsGenerators from '@mixly/python/generators/lists'; +import * as PythonDictsGenerators from '@mixly/python/generators/dicts'; +import * as PythonLogicGenerators from '@mixly/python/generators/logic'; +import * as PythonStorageGenerators from '@mixly/python/generators/storage'; +import * as PythonProceduresGenerators from '@mixly/python/generators/procedures'; +import * as PythonTupleGenerators from '@mixly/python/generators/tuple'; +import * as PythonSetGenerators from '@mixly/python/generators/set'; +import * as PythonHtmlGenerators from '@mixly/python/generators/html'; +import * as PythonUtilityGenerators from '@mixly/python/generators/utility'; + +import * as MixPyAlgorithmGenerators from '@mixly/python-mixpy/generators/algorithm'; +import * as MixPyFactoryGenerators from '@mixly/python-mixpy/generators/factory'; + +import * as DataGenerators from './generators/data'; +import * as InoutGenerators from './generators/inout'; +import * as IotGenerators from './generators/iot'; +import * as SystemGenerators from './generators/system'; +import * as TurtleGenerators from './generators/turtle'; + +import './others/loader'; + +import './css/color_mixpy_python_skulpt.css'; + +Object.assign(Blockly.Variables, Variables); +Object.assign(Blockly.Procedures, Procedures); +Blockly.Python = Python; +Blockly.generator = Python; + +Profile.default = {}; + +Object.assign( + Blockly.Blocks, + PythonVariablesBlocks, + PythonControlBlocks, + PythonMathBlocks, + PythonTextBlocks, + PythonListsBlocks, + PythonDictsBlocks, + PythonLogicBlocks, + PythonStorageBlocks, + PythonProceduresBlocks, + PythonTupleBlocks, + PythonSetBlocks, + PythonHtmlBlocks, + PythonUtilityBlocks, + MixPyAlgorithmBlocks, + MixPyFactoryBlocks, + DataBlocks, + InoutBlocks, + IotBlocks, + SystemBlocks, + TurtleBlocks +); + +Object.assign( + Blockly.Python.forBlock, + PythonVariablesGenerators, + PythonControlGenerators, + PythonMathGenerators, + PythonTextGenerators, + PythonListsGenerators, + PythonDictsGenerators, + PythonLogicGenerators, + PythonStorageGenerators, + PythonProceduresGenerators, + PythonTupleGenerators, + PythonSetGenerators, + PythonHtmlGenerators, + PythonUtilityGenerators, + MixPyAlgorithmGenerators, + MixPyFactoryGenerators, + DataGenerators, + InoutGenerators, + IotGenerators, + SystemGenerators, + TurtleGenerators +); \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/jsconfig.json b/mixly/boards/default_src/python_skulpt/jsconfig.json new file mode 100644 index 00000000..e7d38a65 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/jsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "baseUrl": "./", + "paths": { + "@mixly/python": [ + "../python" + ], + "@mixly/python-mixpy": [ + "../python_mixpy" + ] + } + }, + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/config.json b/mixly/boards/default_src/python_skulpt/origin/config.json new file mode 100644 index 00000000..a85f1355 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/config.json @@ -0,0 +1,13 @@ +{ + "language": "Python", + "nav": { + "webrun": true, + "webcancel": true, + "save": { + "py": true + }, + "setting": { + "pythonToBlockly": true + } + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/01-1 海归画图初体验.mix b/mixly/boards/default_src/python_skulpt/origin/examples/01-1 海归画图初体验.mix new file mode 100644 index 00000000..3be74b31 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/01-1 海归画图初体验.mix @@ -0,0 +1 @@ +tinaforwardtina20lefttina90{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKdGluYS5mb3J3YXJkKDIwKQp0aW5hLmxlZnQoOTApCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/01-2 绘制四边形.mix b/mixly/boards/default_src/python_skulpt/origin/examples/01-2 绘制四边形.mix new file mode 100644 index 00000000..f3fa3928 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/01-2 绘制四边形.mix @@ -0,0 +1 @@ +tinaforwardtina100lefttina90forwardtina100lefttina90forwardtina100lefttina90forwardtina100{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKdGluYS5mb3J3YXJkKDEwMCkKdGluYS5sZWZ0KDkwKQp0aW5hLmZvcndhcmQoMTAwKQp0aW5hLmxlZnQoOTApCnRpbmEuZm9yd2FyZCgxMDApCnRpbmEubGVmdCg5MCkKdGluYS5mb3J3YXJkKDEwMCkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/01-2-2 绘制四边形.mix b/mixly/boards/default_src/python_skulpt/origin/examples/01-2-2 绘制四边形.mix new file mode 100644 index 00000000..9836f515 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/01-2-2 绘制四边形.mix @@ -0,0 +1 @@ +tina4lefttina90forwardtina100{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKZm9yIF9teV92YXJpYWJsZSBpbiByYW5nZSg0KToKICAgIHRpbmEubGVmdCg5MCkKICAgIHRpbmEuZm9yd2FyZCgxMDApCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/01-3 绘制多边形.mix b/mixly/boards/default_src/python_skulpt/origin/examples/01-3 绘制多边形.mix new file mode 100644 index 00000000..341e5500 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/01-3 绘制多边形.mix @@ -0,0 +1 @@ +tinan404nlefttina90DIVIDE3601nforwardtina50DIVIDE4001n{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKbiA9IDQwCmZvciBfbXlfdmFyaWFibGUgaW4gcmFuZ2Uobik6CiAgICB0aW5hLmxlZnQoKDM2MCAvIG4pKQogICAgdGluYS5mb3J3YXJkKCg0MDAgLyBuKSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/01-3-2 绘制多边形.mix b/mixly/boards/default_src/python_skulpt/origin/examples/01-3-2 绘制多边形.mix new file mode 100644 index 00000000..54e0052c --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/01-3-2 绘制多边形.mix @@ -0,0 +1 @@ +tinanint请输入边数:4nlefttina90DIVIDE3601nforwardtina50DIVIDE4001n{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKbiA9IGludChpbnB1dCgn6K+36L6T5YWl6L655pWw77yaJykpCmZvciBfbXlfdmFyaWFibGUgaW4gcmFuZ2Uobik6CiAgICB0aW5hLmxlZnQoKDM2MCAvIG4pKQogICAgdGluYS5mb3J3YXJkKCg0MDAgLyBuKSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/02-1 一笔画五角形.mix b/mixly/boards/default_src/python_skulpt/origin/examples/02-1 一笔画五角形.mix new file mode 100644 index 00000000..b013f41a --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/02-1 一笔画五角形.mix @@ -0,0 +1 @@ +tinatina#FF0000#ff0000tina55forwardtina100righttina144{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKdGluYS5wZW5jb2xvcigiI2ZmMDAwMCIpCnRpbmEucGVuc2l6ZSg1KQpmb3IgX215X3ZhcmlhYmxlIGluIHJhbmdlKDUpOgogICAgdGluYS5mb3J3YXJkKDEwMCkKICAgIHRpbmEucmlnaHQoMTQ0KQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/02-1-2 一笔画五角形.mix b/mixly/boards/default_src/python_skulpt/origin/examples/02-1-2 一笔画五角形.mix new file mode 100644 index 00000000..6034bcc0 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/02-1-2 一笔画五角形.mix @@ -0,0 +1 @@ +tinatina#FF0000#ff0000tina#FF0000#ff0000tina5begintina5forwardtina100righttina144endtina{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKdGluYS5wZW5jb2xvcigiI2ZmMDAwMCIpCnRpbmEuZmlsbGNvbG9yKCIjZmYwMDAwIikKdGluYS5wZW5zaXplKDUpCnRpbmEuYmVnaW5fZmlsbCgpCmZvciBfbXlfdmFyaWFibGUgaW4gcmFuZ2UoNSk6CiAgICB0aW5hLmZvcndhcmQoMTAwKQogICAgdGluYS5yaWdodCgxNDQpCnRpbmEuZW5kX2ZpbGwoKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/02-2 绘制红心.mix b/mixly/boards/default_src/python_skulpt/origin/examples/02-2 绘制红心.mix new file mode 100644 index 00000000..e22da94d --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/02-2 绘制红心.mix @@ -0,0 +1 @@ +tinahideturtletinatina#FF0000#ff0000tina5tina135tina50180forwardtina100tina45forwardtina100tina50180{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKdGluYS5oaWRldHVydGxlKCkKdGluYS5wZW5jb2xvcigiI2ZmMDAwMCIpCnRpbmEucGVuc2l6ZSg1KQp0aW5hLnNldGhlYWRpbmcoMTM1KQp0aW5hLmNpcmNsZSAoNTAsMTgwKQp0aW5hLmZvcndhcmQoMTAwKQp0aW5hLnNldGhlYWRpbmcoNDUpCnRpbmEuZm9yd2FyZCgxMDApCnRpbmEuY2lyY2xlICg1MCwxODApCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/02-2-2 绘制红心.mix b/mixly/boards/default_src/python_skulpt/origin/examples/02-2-2 绘制红心.mix new file mode 100644 index 00000000..9a9dbd25 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/02-2-2 绘制红心.mix @@ -0,0 +1 @@ +tinahideturtletinatina#FF0000#ff0000tina#FF0000#ff6666begintinatina5tina135tina50180forwardtina100tina45forwardtina100tina50180endtina{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKdGluYS5oaWRldHVydGxlKCkKdGluYS5wZW5jb2xvcigiI2ZmMDAwMCIpCnRpbmEuZmlsbGNvbG9yKCIjZmY2NjY2IikKdGluYS5iZWdpbl9maWxsKCkKdGluYS5wZW5zaXplKDUpCnRpbmEuc2V0aGVhZGluZygxMzUpCnRpbmEuY2lyY2xlICg1MCwxODApCnRpbmEuZm9yd2FyZCgxMDApCnRpbmEuc2V0aGVhZGluZyg0NSkKdGluYS5mb3J3YXJkKDEwMCkKdGluYS5jaXJjbGUgKDUwLDE4MCkKdGluYS5lbmRfZmlsbCgpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/03-1 绘制螺旋线.mix b/mixly/boards/default_src/python_skulpt/origin/examples/03-1 绘制螺旋线.mix new file mode 100644 index 00000000..ecd64517 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/03-1 绘制螺旋线.mix @@ -0,0 +1 @@ +tina0,1,2,351505iforwardtina20ilefttina90{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKZm9yIGkgaW4gcmFuZ2UoNSwgMTUwLCA1KToKICAgIHRpbmEuZm9yd2FyZChpKQogICAgdGluYS5sZWZ0KDkwKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/03-1-2 绘制螺旋线.mix b/mixly/boards/default_src/python_skulpt/origin/examples/03-1-2 绘制螺旋线.mix new file mode 100644 index 00000000..ed0f73b6 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/03-1-2 绘制螺旋线.mix @@ -0,0 +1 @@ +tinatina00,1,2,351505itina50i180{}aW1wb3J0IHR1cnRsZQoKCnRpbmEgPSB0dXJ0bGUuVHVydGxlKCkKdGluYS5zcGVlZCgwKQpmb3IgaSBpbiByYW5nZSg1LCAxNTAsIDUpOgogICAgdGluYS5jaXJjbGUgKGksMTgwKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/03-2 绘制螺旋线-字典.mix b/mixly/boards/default_src/python_skulpt/origin/examples/03-2 绘制螺旋线-字典.mix new file mode 100644 index 00000000..9b700a27 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/03-2 绘制螺旋线-字典.mix @@ -0,0 +1 @@ +color0123#ffcc33#ff0000#3333ff#000000tinatina0tina20,1,2,30501itina#FF0000colorkeyint03forwardtina20MULTIPLY1i5lefttina90{}aW1wb3J0IHR1cnRsZQppbXBvcnQgcmFuZG9tCgoKY29sb3I9IHswOiIjZmZjYzMzIiwgMToiI2ZmMDAwMCIsIDI6IiMzMzMzZmYiLCAzOiIjMDAwMDAwIn0KdGluYSA9IHR1cnRsZS5UdXJ0bGUoKQp0aW5hLnNwZWVkKDApCnRpbmEucGVuc2l6ZSgyKQpmb3IgaSBpbiByYW5nZSgwLCA1MCwgMSk6CiAgICB0aW5hLnBlbmNvbG9yKGNvbG9yW3JhbmRvbS5yYW5kaW50KDAsIDMpXSkKICAgIHRpbmEuZm9yd2FyZCgoaSAqIDUpKQogICAgdGluYS5sZWZ0KDkwKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/03-2 绘制螺旋线.mix b/mixly/boards/default_src/python_skulpt/origin/examples/03-2 绘制螺旋线.mix new file mode 100644 index 00000000..0aec31bc --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/03-2 绘制螺旋线.mix @@ -0,0 +1 @@ +color#ffcccc#ff0000#990000#330000tinatina0tina20,1,2,30501itina#FF0000color0QUYU1i4forwardtina20MULTIPLY1i5lefttina90{}aW1wb3J0IHR1cnRsZQoKCmNvbG9yID0gWyIjZmZjY2NjIiwgIiNmZjAwMDAiLCAiIzk5MDAwMCIsICIjMzMwMDAwIl0KdGluYSA9IHR1cnRsZS5UdXJ0bGUoKQp0aW5hLnNwZWVkKDApCnRpbmEucGVuc2l6ZSgyKQpmb3IgaSBpbiByYW5nZSgwLCA1MCwgMSk6CiAgICB0aW5hLnBlbmNvbG9yKGNvbG9yW2kgJSA0XSkKICAgIHRpbmEuZm9yd2FyZCgoaSAqIDUpKQogICAgdGluYS5sZWZ0KDkwKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/04-0 投票选举.mix b/mixly/boards/default_src/python_skulpt/origin/examples/04-0 投票选举.mix new file mode 100644 index 00000000..fc4577fd --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/04-0 投票选举.mix @@ -0,0 +1 @@ +候选人投票人次int输入投票人次:10投票人次投票str输入候选人姓名:mydict候选人key投票1ADD1mydict候选人key投票01Hello候选人{}X0U1XzgwXzk5X0U5XzgwXzg5X0U0X0JBX0JBPSB7fQpfRTZfOEFfOTVfRTdfQTVfQThfRTRfQkFfQkFfRTZfQUNfQTEgPSBpbnQoaW5wdXQoJ+i+k+WFpeaKleelqOS6uuasoe+8micpKQpmb3IgX215X3ZhcmlhYmxlIGluIHJhbmdlKF9FNl84QV85NV9FN19BNV9BOF9FNF9CQV9CQV9FNl9BQ19BMSk6CiAgICBfRTZfOEFfOTVfRTdfQTVfQTggPSBpbnB1dCgn6L6T5YWl5YCZ6YCJ5Lq65aeT5ZCN77yaJykKICAgIF9FNV84MF85OV9FOV84MF84OV9FNF9CQV9CQVtfRTZfOEFfOTVfRTdfQTVfQThdID0gX0U1XzgwXzk5X0U5XzgwXzg5X0U0X0JBX0JBLmdldChfRTZfOEFfOTVfRTdfQTVfQTgsMCkgKyAxCnByaW50KF9FNV84MF85OV9FOV84MF84OV9FNF9CQV9CQSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/04-1 投票选举.mix b/mixly/boards/default_src/python_skulpt/origin/examples/04-1 投票选举.mix new file mode 100644 index 00000000..54d34adc --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/04-1 投票选举.mix @@ -0,0 +1 @@ +候选人投票人次int输入投票人次:10投票人次投票str输入候选人姓名:not inx投票0,1,2,3候选人mydict候选人key投票1mydict候选人key投票1ADD1mydict候选人key投票1最高票0Hello得票情况:0,1,2,3候选人iHelloHelloiMixlyMixlystrmydict候选人keyiGTmydict候选人keyi最高票最高票mydict候选人keyi最高票者iHelloHello最高票者竞选成功!{}X0U1XzgwXzk5X0U5XzgwXzg5X0U0X0JBX0JBPSB7fQpfRTZfOEFfOTVfRTdfQTVfQThfRTRfQkFfQkFfRTZfQUNfQTEgPSBpbnQoaW5wdXQoJ+i+k+WFpeaKleelqOS6uuasoe+8micpKQpmb3IgX215X3ZhcmlhYmxlIGluIHJhbmdlKF9FNl84QV85NV9FN19BNV9BOF9FNF9CQV9CQV9FNl9BQ19BMSk6CiAgICBfRTZfOEFfOTVfRTdfQTVfQTggPSBpbnB1dCgn6L6T5YWl5YCZ6YCJ5Lq65aeT5ZCN77yaJykKICAgIGlmIF9FNl84QV85NV9FN19BNV9BOCBub3QgaW4gX0U1XzgwXzk5X0U5XzgwXzg5X0U0X0JBX0JBOgogICAgICAgIF9FNV84MF85OV9FOV84MF84OV9FNF9CQV9CQVtfRTZfOEFfOTVfRTdfQTVfQThdID0gMQogICAgZWxzZToKICAgICAgICBfRTVfODBfOTlfRTlfODBfODlfRTRfQkFfQkFbX0U2XzhBXzk1X0U3X0E1X0E4XSA9IF9FNV84MF85OV9FOV84MF84OV9FNF9CQV9CQVtfRTZfOEFfOTVfRTdfQTVfQThdICsgMQpfRTZfOUNfODBfRTlfQUJfOThfRTdfQTVfQTggPSAwCnByaW50KCflvpfnpajmg4XlhrXvvJonKQpmb3IgaSBpbiBfRTVfODBfOTlfRTlfODBfODlfRTRfQkFfQkE6CiAgICBwcmludCgoaSArICgn77yaJyArIHN0cihfRTVfODBfOTlfRTlfODBfODlfRTRfQkFfQkFbaV0pKSkpCiAgICBpZiBfRTVfODBfOTlfRTlfODBfODlfRTRfQkFfQkFbaV0gPiBfRTZfOUNfODBfRTlfQUJfOThfRTdfQTVfQTg6CiAgICAgICAgX0U2XzlDXzgwX0U5X0FCXzk4X0U3X0E1X0E4ID0gX0U1XzgwXzk5X0U5XzgwXzg5X0U0X0JBX0JBW2ldCiAgICAgICAgX0U2XzlDXzgwX0U5X0FCXzk4X0U3X0E1X0E4X0U4XzgwXzg1ID0gaQpwcmludCgoX0U2XzlDXzgwX0U5X0FCXzk4X0U3X0E1X0E4X0U4XzgwXzg1ICsgJ+ernumAieaIkOWKn++8gScpKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/05-1 凯撒加密(一位密码).mix b/mixly/boards/default_src/python_skulpt/origin/examples/05-1 凯撒加密(一位密码).mix new file mode 100644 index 00000000..4d22f03d --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/05-1 凯撒加密(一位密码).mix @@ -0,0 +1 @@ +密码本abcdef明文str输入一个字符:位移2Hello密码:MixlyMixly密码本0QUYU1ADD1Hello,mixly密码本l明文86{}X0U1X0FGXzg2X0U3X0EwXzgxX0U2XzlDX0FDID0gJ2FiY2RlZicKX0U2Xzk4XzhFX0U2Xzk2Xzg3ID0gaW5wdXQoJ+i+k+WFpeS4gOS4quWtl+espu+8micpCl9FNF9CRF84RF9FN19BN19CQiA9IDIKcHJpbnQoKCflr4bnoIHvvJonICsgX0U1X0FGXzg2X0U3X0EwXzgxX0U2XzlDX0FDWygoX0U1X0FGXzg2X0U3X0EwXzgxX0U2XzlDX0FDLmZpbmQoX0U2Xzk4XzhFX0U2Xzk2Xzg3KSArIDgpICUgNildKSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/05-2 凯撒加密(ASCII码补充解密验证).mix b/mixly/boards/default_src/python_skulpt/origin/examples/05-2 凯撒加密(ASCII码补充解密验证).mix new file mode 100644 index 00000000..d1f90cfe --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/05-2 凯撒加密(ASCII码补充解密验证).mix @@ -0,0 +1 @@ +sstr请输入明文:nint请输入位移值:jiami加密0,1,2,3siGTADD1alowerHello,mixlyi1nzappendmylistjiami065MINUS1ADD1alowerHello,mixlyi1n26appendmylistjiami065ADD1alowerHello,mixlyi1nHello加密结果:Mixlymylistjiamidecipher解密0,1,2,3jiamijLTMINUS1alowerHello,mixlyj1naappendmylistdecipher065ADD26MINUS1alowerHello,mixlyj1n26appendmylistdecipher065MINUS1alowerHello,mixlyj1nHello解密结果:Mixlymylistdecipher \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/05-2 凯撒加密(ASCII码).mix b/mixly/boards/default_src/python_skulpt/origin/examples/05-2 凯撒加密(ASCII码).mix new file mode 100644 index 00000000..d944d527 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/05-2 凯撒加密(ASCII码).mix @@ -0,0 +1 @@ +明文str请输入明文:位移int请输入位移值:加密0,1,2,3明文iGTADD1alowerHello,mixlyi1位移zappend加密065MINUS1ADD1ai1位移26append加密065ADD1ai1位移Hello加密结果:Mixly加密5piO5paHID0gaW5wdXQoJ+ivt+i+k+WFpeaYjuaWh++8micpCuS9jeenuyA9IGludChpbnB1dCgn6K+36L6T5YWl5L2N56e75YC877yaJykpCuWKoOWvhiA9IFtdCmZvciBpIGluIOaYjuaWhzoKICAgIGlmIG9yZChpLmxvd2VyKCkpICsg5L2N56e7ID4gb3JkKCd6Jyk6CiAgICAgICAg5Yqg5a+GLmFwcGVuZChjaHIoKChvcmQoaSkgKyDkvY3np7spIC0gMjYpKSkKICAgIGVsc2U6CiAgICAgICAg5Yqg5a+GLmFwcGVuZChjaHIoKG9yZChpKSArIOS9jeenuykpKQpwcmludCgoJ+WKoOWvhue7k+aenO+8micgKyAnJy5qb2luKOWKoOWvhikpKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/05-2 凯撒加密(多位密码).mix b/mixly/boards/default_src/python_skulpt/origin/examples/05-2 凯撒加密(多位密码).mix new file mode 100644 index 00000000..6d61ae02 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/05-2 凯撒加密(多位密码).mix @@ -0,0 +1 @@ +密码本abcdefghijklmnopqrstuvwxyz明文str输入多位字符串:位移2加密0,1,2,3明文i加密Hello加密MixlyMixly密码本0QUYU1ADD1Hello,mixly密码本li8ADD1位移2626Hello加密密码:Mixlystr加密{}X0U1X0FGXzg2X0U3X0EwXzgxX0U2XzlDX0FDID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwpfRTZfOThfOEVfRTZfOTZfODcgPSBpbnB1dCgn6L6T5YWl5aSa5L2N5a2X56ym5Liy77yaJykKX0U0X0JEXzhEX0U3X0E3X0JCID0gMgpfRTVfOEFfQTBfRTVfQUZfODYgPSAnJwpmb3IgaSBpbiBfRTZfOThfOEVfRTZfOTZfODc6CiAgICBfRTVfOEFfQTBfRTVfQUZfODYgPSBfRTVfOEFfQTBfRTVfQUZfODYgKyBfRTVfQUZfODZfRTdfQTBfODFfRTZfOUNfQUNbKChfRTVfQUZfODZfRTdfQTBfODFfRTZfOUNfQUMuZmluZChpKSArIChfRTRfQkRfOERfRTdfQTdfQkIgKyAyNikpICUgMjYpXQpwcmludCgoJ+WKoOWvhuWvhuegge+8micgKyBzdHIoX0U1XzhBX0EwX0U1X0FGXzg2KSkpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/06-1 人机出数字比大小.mix b/mixly/boards/default_src/python_skulpt/origin/examples/06-1 人机出数字比大小.mix new file mode 100644 index 00000000..6b8b4c7e --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/06-1 人机出数字比大小.mix @@ -0,0 +1 @@ +数字-人数字-人int请输入0-20之间的整数:Hello人:Mixlystr数字-人LTELTE0x数字-人20数字-机int020Hello机:Mixlystr数字-机0.2{}aW1wb3J0IHJhbmRvbQppbXBvcnQgdGltZQoKCl9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEgPSBOb25lCl9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEgPSBpbnQoaW5wdXQoJ+ivt+i+k+WFpTAtMjDkuYvpl7TnmoTmlbTmlbDvvJonKSkKcHJpbnQoKCfkurrvvJonICsgc3RyKF9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEpKSkKaWYgMCA8PSBfRTZfOTVfQjBfRTVfQURfOTdfX0U0X0JBX0JBIDw9IDIwOgogICAgX0U2Xzk1X0IwX0U1X0FEXzk3X19FNl85Q19CQSA9IHJhbmRvbS5yYW5kaW50KDAsIDIwKQogICAgcHJpbnQoKCfmnLrvvJonICsgc3RyKF9FNl85NV9CMF9FNV9BRF85N19fRTZfOUNfQkEpKSkKdGltZS5zbGVlcCgwLjIpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/06-1 猜数字游戏.mix b/mixly/boards/default_src/python_skulpt/origin/examples/06-1 猜数字游戏.mix new file mode 100644 index 00000000..689984de --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/06-1 猜数字游戏.mix @@ -0,0 +1 @@ +数字-机int1100数字-人WHILETRUENEQ数字-人数字-机数字-人int输入数字:GT数字-人数字-机猜大了!LT数字-人数字-机猜小了!猜对了!{}aW1wb3J0IHJhbmRvbQoKCl9FNl85NV9CMF9FNV9BRF85N19fRTZfOUNfQkEgPSByYW5kb20ucmFuZGludCgxLCAxMDApCl9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEgPSBOb25lCndoaWxlIF9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEgIT0gX0U2Xzk1X0IwX0U1X0FEXzk3X19FNl85Q19CQToKICAgIF9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEgPSBpbnQoaW5wdXQoJ+i+k+WFpeaVsOWtl++8micpKQogICAgaWYgX0U2Xzk1X0IwX0U1X0FEXzk3X19FNF9CQV9CQSA+IF9FNl85NV9CMF9FNV9BRF85N19fRTZfOUNfQkE6CiAgICAgICAgcHJpbnQoJ+eMnOWkp+S6hu+8gScpCiAgICBlbGlmIF9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEgPCBfRTZfOTVfQjBfRTVfQURfOTdfX0U2XzlDX0JBOgogICAgICAgIHByaW50KCfnjJzlsI/kuobvvIEnKQogICAgZWxzZToKICAgICAgICBwcmludCgn54yc5a+55LqG77yBJykK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/06-1-2 人机出数字比大小.mix b/mixly/boards/default_src/python_skulpt/origin/examples/06-1-2 人机出数字比大小.mix new file mode 100644 index 00000000..e3044533 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/06-1-2 人机出数字比大小.mix @@ -0,0 +1 @@ +数字-人WHILETRUE数字-人int请输入0-20之间的整数:Hello人:Mixlystr数字-人LTELTE0x数字-人20数字-机int020Hello机:Mixlystr数字-机GT数字-人数字-机人胜!LT数字-人数字-机机胜!平局!输入不符合要求!0.2{}aW1wb3J0IHJhbmRvbQppbXBvcnQgdGltZQoKCl9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEgPSBOb25lCndoaWxlIFRydWU6CiAgICBfRTZfOTVfQjBfRTVfQURfOTdfX0U0X0JBX0JBID0gaW50KGlucHV0KCfor7fovpPlhaUwLTIw5LmL6Ze055qE5pW05pWw77yaJykpCiAgICBwcmludCgoJ+S6uu+8micgKyBzdHIoX0U2Xzk1X0IwX0U1X0FEXzk3X19FNF9CQV9CQSkpKQogICAgaWYgMCA8PSBfRTZfOTVfQjBfRTVfQURfOTdfX0U0X0JBX0JBIDw9IDIwOgogICAgICAgIF9FNl85NV9CMF9FNV9BRF85N19fRTZfOUNfQkEgPSByYW5kb20ucmFuZGludCgwLCAyMCkKICAgICAgICBwcmludCgoJ+acuu+8micgKyBzdHIoX0U2Xzk1X0IwX0U1X0FEXzk3X19FNl85Q19CQSkpKQogICAgICAgIGlmIF9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEgPiBfRTZfOTVfQjBfRTVfQURfOTdfX0U2XzlDX0JBOgogICAgICAgICAgICBwcmludCgn5Lq66IOc77yBJykKICAgICAgICBlbGlmIF9FNl85NV9CMF9FNV9BRF85N19fRTRfQkFfQkEgPCBfRTZfOTVfQjBfRTVfQURfOTdfX0U2XzlDX0JBOgogICAgICAgICAgICBwcmludCgn5py66IOc77yBJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCgn5bmz5bGA77yBJykKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoJ+i+k+WFpeS4jeespuWQiOimgeaxgu+8gScpCiAgICB0aW1lLnNsZWVwKDAuMikK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/06-2-2 猜数字限定次数.mix b/mixly/boards/default_src/python_skulpt/origin/examples/06-2-2 猜数字限定次数.mix new file mode 100644 index 00000000..d01ce036 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/06-2-2 猜数字限定次数.mix @@ -0,0 +1 @@ +targetint1100count0nWHILETRUEANDNEQtargetnLTEcount5nint输入数字:countADD1count1GTntarget太大了!LTntarget太小了!猜对了!ANDNEQtargetnGTcount5Hello目标数字:Mixlystrtarget游戏结束!{}aW1wb3J0IHJhbmRvbQoKCnRhcmdldCA9IHJhbmRvbS5yYW5kaW50KDEsIDEwMCkKY291bnQgPSAwCm4gPSBOb25lCndoaWxlIHRhcmdldCAhPSBuIGFuZCBjb3VudCA8PSA1OgogICAgbiA9IGludChpbnB1dCgn6L6T5YWl5pWw5a2X77yaJykpCiAgICBjb3VudCA9IGNvdW50ICsgMQogICAgaWYgbiA+IHRhcmdldDoKICAgICAgICBwcmludCgn5aSq5aSn5LqG77yBJykKICAgIGVsaWYgbiA8IHRhcmdldDoKICAgICAgICBwcmludCgn5aSq5bCP5LqG77yBJykKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoJ+eMnOWvueS6hu+8gScpCmlmIHRhcmdldCAhPSBuIGFuZCBjb3VudCA+IDU6CiAgICBwcmludCgoJ+ebruagh+aVsOWtl++8micgKyBzdHIodGFyZ2V0KSkpCiAgICBwcmludCgn5ri45oiP57uT5p2f77yBJykK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/06-2-3 二分法.mix b/mixly/boards/default_src/python_skulpt/origin/examples/06-2-3 二分法.mix new file mode 100644 index 00000000..91b684a7 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/06-2-3 二分法.mix @@ -0,0 +1 @@ +WHILETRUE{}aW1wb3J0IHRpbWUKaW1wb3J0IHNwcml0ZQoKCmlmICdtb2RlJyBub3QgaW4gZ2xvYmFscygpIG9yIG1vZGUgPT0gMDoKICAgIHNwcml0ZS5jbGVhckFsbFNwcml0ZXMoKQogICAgcmluZz1bMCwwLDAsMCwwLDAsMCwwLDAsMF0KICAgIG1vZGU9MgogICAgbj01CiAgICBuYW1lPVsn5bCP546L5a2QJywn5rW35bqV5Lik5LiH6YeMJywn6I236Iqx6ZWH55qE5pep5biCJywn5a2U5a2Q55qE5pWF5LqLJywn5aSP5rSb55qE572RJywn6I2J5oi/5a2QJywn5pyI5LiL55yL54yr5aS06bmwJywn5Lya5ZSx5q2M55qE5ZKW5ZWh56OoJywn54i25LiO5a2QJywn5Z+O5Y2X5pen5LqLJ10KICAgIEJvb2tzID0gW10KICAgIGZvciBpIGluIHJhbmdlKDEsIDExLCAxKToKICAgICAgICBCb29rcy5hcHBlbmQoc3ByaXRlLlNwcml0ZSgnYm9va3MvYm9vaycrc3RyKGkpLCAoMTMwKmktNjUwKSBpZiBpPjUgZWxzZSAxMzAqaSwgMzIwIGlmIGk+NSBlbHNlIDEyMCkpCmVsc2U6CiAgICBtb2RlPTIKICAgIG49bGVuKHJpbmcpLTEKcmluZ1tuXT1uCmxpc3Q9cmluZwp0ZW1wPUJvb2tzCnRpbWUuc2xlZXAoMSkKd2hpbGUgbGVuKGxpc3QpPj0yOgogICAgbWlkID0gaW50KGxlbihsaXN0KS8yKQogICAgcWlhbiA9IGxpc3RbMDptaWRdCiAgICBob3UgPSBsaXN0W21pZDpdCiAgICBxaWFudGVtcCA9IHRlbXBbMDptaWRdCiAgICBob3V0ZW1wID0gdGVtcFttaWQ6XQogICAgcXVjaHUgPSBxaWFuCiAgICBsaXN0ID0gaG91CiAgICBxdWNodXRlbXAgPSBxaWFudGVtcAogICAgdGVtcCA9IGhvdXRlbXAKICAgIGZvciBpIGluIHFpYW50ZW1wOgogICAgICAgIGkuZmlsdGVyQnJpZ2h0ZXIoKQogICAgdGltZS5zbGVlcCgwLjUpCiAgICBmb3IgaSBpbiBxaWFudGVtcDoKICAgICAgICBpLmZpbHRlckdyYXkoKQogICAgdGltZS5zbGVlcCgwLjUpCiAgICBpZiAoKCdtb2RlJyBpbiBnbG9iYWxzKCkpYW5kKChtb2RlPT0xIGFuZCBmbGFnIT0wKW9yKG1vZGU9PTIgYW5kIGFueSh2YWx1ZSA+IDAgZm9yIHZhbHVlIGluIHFpYW4pKSkpOgogICAgICAgIGxpc3QgPSBxdWNodQogICAgICAgIHRlbXAgPSBxdWNodXRlbXAKICAgICAgICBmb3IgaSBpbiBxaWFudGVtcDoKICAgICAgICAgICAgaS5maWx0ZXJCcmlnaHRlcigpCiAgICAgICAgdGltZS5zbGVlcCgwLjUpCiAgICAgICAgZm9yIGkgaW4gcWlhbnRlbXA6CiAgICAgICAgICAgIGkuZmlsdGVyT3JpZ2luKCkKICAgICAgICBmb3IgaSBpbiBob3V0ZW1wOgogICAgICAgIAlpLmZpbHRlckJyaWdodGVyKCkKICAgICAgICB0aW1lLnNsZWVwKDAuNSkKICAgICAgICBmb3IgaSBpbiBob3V0ZW1wOgogICAgICAgICAgICBpLmZpbHRlckdyYXkoKQogICAgICAgIHRpbWUuc2xlZXAoMC41KQppZiAnbGlzdCcgaW4gZ2xvYmFscygpOgogICAgcmVzID0gbGlzdFswXQpCb29rc1tyZXNdLmZpbHRlckJyaWdodGVyKCkKcHJpbnQoJ+acqua2iOejgeeahOS5puexjeaYr+esrCcrc3RyKHJlcysxKSsn5pys44CKJytuYW1lW3JlcyUxMF0rJ+OAi+OAgicpCmlmIHJlcyE9bjoKICAgIHByaW50KCfnrZTmoYjplJnor6/vvIHor7fmo4Dmn6XnqIvluo/vvIEnKQptb2RlPTAK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/07-1 鸡兔同笼.mix b/mixly/boards/default_src/python_skulpt/origin/examples/07-1 鸡兔同笼.mix new file mode 100644 index 00000000..8b1dbb9a --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/07-1 鸡兔同笼.mix @@ -0,0 +1 @@ +int请输入头的总数:int请输入脚的总数:0,1,2,305ADD111EQADD1MULTIPLY121MULTIPLY1MINUS114Hello鸡:MixlyHellostrHello兔:MixlyHellostrMINUS11{}X0U1X0E0X0I0ID0gaW50KGlucHV0KCfor7fovpPlhaXlpLTnmoTmgLvmlbDvvJonKSkKX0U4Xzg0XzlBID0gaW50KGlucHV0KCfor7fovpPlhaXohJrnmoTmgLvmlbDvvJonKSkKZm9yIF9FOV9COF9BMSBpbiByYW5nZSgwLCBfRTVfQTRfQjQgKyAxLCAxKToKICAgIGlmIF9FOV9COF9BMSAqIDIgKyAoX0U1X0E0X0I0IC0gX0U5X0I4X0ExKSAqIDQgPT0gX0U4Xzg0XzlBOgogICAgICAgIHByaW50KCgn6bih77yaJyArIChzdHIoX0U5X0I4X0ExKSArICflj6onKSkpCiAgICAgICAgcHJpbnQoKCflhZTvvJonICsgKHN0cigoX0U1X0E0X0I0IC0gX0U5X0I4X0ExKSkgKyAn5Y+qJykpKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/07-2 韩信点兵.mix b/mixly/boards/default_src/python_skulpt/origin/examples/07-2 韩信点兵.mix new file mode 100644 index 00000000..7f351162 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/07-2 韩信点兵.mix @@ -0,0 +1 @@ +最小值int请输入人数最小值:最大值int请输入人数最大值:余数_3int请输入除以3的余数:余数_5int请输入除以5的余数:余数_7int请输入除以7的余数:计数00,1,2,30最小值5ADD1最大值11iANDEQQUYU1i3余数_3ANDEQQUYU1i5余数_5EQQUYU1i7余数_7计数iBREAKEQ计数0总数不存在!总数不存在!总数为:Mixlystr计数{}X0U2XzlDXzgwX0U1X0IwXzhGX0U1XzgwX0JDID0gaW50KGlucHV0KCfor7fovpPlhaXkurrmlbDmnIDlsI/lgLzvvJonKSkKX0U2XzlDXzgwX0U1X0E0X0E3X0U1XzgwX0JDID0gaW50KGlucHV0KCfor7fovpPlhaXkurrmlbDmnIDlpKflgLzvvJonKSkKX0U0X0JEXzk5X0U2Xzk1X0IwXzMgPSBpbnQoaW5wdXQoJ+ivt+i+k+WFpemZpOS7pTPnmoTkvZnmlbDvvJonKSkKX0U0X0JEXzk5X0U2Xzk1X0IwXzUgPSBpbnQoaW5wdXQoJ+ivt+i+k+WFpemZpOS7pTXnmoTkvZnmlbDvvJonKSkKX0U0X0JEXzk5X0U2Xzk1X0IwXzcgPSBpbnQoaW5wdXQoJ+ivt+i+k+WFpemZpOS7pTfnmoTkvZnmlbDvvJonKSkKX0U4X0FFX0ExX0U2Xzk1X0IwID0gMApmb3IgaSBpbiByYW5nZShfRTZfOUNfODBfRTVfQjBfOEZfRTVfODBfQkMsIF9FNl85Q184MF9FNV9BNF9BN19FNV84MF9CQyArIDEsIDEpOgogICAgaWYgaSAlIDMgPT0gX0U0X0JEXzk5X0U2Xzk1X0IwXzMgYW5kIChpICUgNSA9PSBfRTRfQkRfOTlfRTZfOTVfQjBfNSBhbmQgaSAlIDcgPT0gX0U0X0JEXzk5X0U2Xzk1X0IwXzcpOgogICAgICAgIF9FOF9BRV9BMV9FNl85NV9CMCA9IGkKICAgICAgICBicmVhawppZiBfRThfQUVfQTFfRTZfOTVfQjAgPT0gMDoKICAgIHByaW50KCfmgLvmlbDkuI3lrZjlnKjvvIEnKQplbHNlOgogICAgcHJpbnQoKCfmgLvmlbDkuLrvvJonICsgc3RyKF9FOF9BRV9BMV9FNl85NV9CMCkpKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/08-1 冒泡排序.mix b/mixly/boards/default_src/python_skulpt/origin/examples/08-1 冒泡排序.mix new file mode 100644 index 00000000..660e31d2 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/08-1 冒泡排序.mix @@ -0,0 +1 @@ +mylist冒泡排序nLENmylist0,1,2,305n1i0,1,2,305MINUS1MINUS1n1i11jGTmylist0jmylist0ADD1j1tmylist0jmylist0j0mylist0ADD1j1mylist0ADD1j10tmylistHello6,2,3,4,5{}aW1wb3J0IG1hdGgKCmRlZiBfRTVfODZfOTJfRTZfQjNfQTFfRTZfOEVfOTJfRTVfQkFfOEYobXlsaXN0KToKICAgIG4gPSBsZW4obXlsaXN0KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbiwgMSk6CiAgICAgICAgZm9yIGogaW4gcmFuZ2UoMCwgKG4gLSBpKSAtIDEsIDEpOgogICAgICAgICAgICBpZiBteWxpc3Rbal0gPiBteWxpc3RbKGogKyAxKV06CiAgICAgICAgICAgICAgICB0ID0gbXlsaXN0W2pdCiAgICAgICAgICAgICAgICBteWxpc3Rbal0gPSBteWxpc3RbKGogKyAxKV0KICAgICAgICAgICAgICAgIG15bGlzdFsoaiArIDEpXSA9IHQKICAgIHJldHVybiBteWxpc3QKCgoKcHJpbnQoKF9FNV84Nl85Ml9FNl9CM19BMV9FNl84RV85Ml9FNV9CQV84RihbNiwyLDMsNCw1XSkpLGVuZCA9IiIpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/08-2 选择排序.mix b/mixly/boards/default_src/python_skulpt/origin/examples/08-2 选择排序.mix new file mode 100644 index 00000000..e7cdc524 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/08-2 选择排序.mix @@ -0,0 +1 @@ +mylist冒泡排序nLENmylist0,1,2,305n1imini0,1,2,30ADD1i15n1jLTmylist0jmylist0minminjtmylist0imylist0i0mylist0minmylist0min0tmylistHello6,2,3,4,5{}aW1wb3J0IG1hdGgKCmRlZiBfRTVfODZfOTJfRTZfQjNfQTFfRTZfOEVfOTJfRTVfQkFfOEYobXlsaXN0KToKICAgIG4gPSBsZW4obXlsaXN0KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbiwgMSk6CiAgICAgICAgbWluMiA9IGkKICAgICAgICBmb3IgaiBpbiByYW5nZShpICsgMSwgbiwgMSk6CiAgICAgICAgICAgIGlmIG15bGlzdFtqXSA8IG15bGlzdFttaW4yXToKICAgICAgICAgICAgICAgIG1pbjIgPSBqCiAgICAgICAgdCA9IG15bGlzdFtpXQogICAgICAgIG15bGlzdFtpXSA9IG15bGlzdFttaW4yXQogICAgICAgIG15bGlzdFttaW4yXSA9IHQKICAgIHJldHVybiBteWxpc3QKCgoKcHJpbnQoKF9FNV84Nl85Ml9FNl9CM19BMV9FNl84RV85Ml9FNV9CQV84RihbNiwyLDMsNCw1XSkpLGVuZCA9IiIpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/08-3 插入排序.mix b/mixly/boards/default_src/python_skulpt/origin/examples/08-3 插入排序.mix new file mode 100644 index 00000000..ed636d82 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/08-3 插入排序.mix @@ -0,0 +1 @@ +mylist插入排序nLENmylist0,1,2,30n1ikeymylistijMINUS1i1WHILETRUEANDGTEj0GTmylistjjkeymylistj+1ADD1j10mylistjjjMINUS1j1mylistj+1ADD1j10keymylistHello5,629,12,1,66,85,21{}aW1wb3J0IG1hdGgKCmRlZiBfRTZfOEZfOTJfRTVfODVfQTVfRTZfOEVfOTJfRTVfQkFfOEYobXlsaXN0KToKICAgIG4gPSBsZW4obXlsaXN0KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbiwgMSk6CiAgICAgICAga2V5ID0gbXlsaXN0W2ldCiAgICAgICAgaiA9IGkgLSAxCiAgICAgICAgd2hpbGUgaiA+PSAwIGFuZCBteWxpc3Rbal0gPiBrZXk6CiAgICAgICAgICAgIG15bGlzdFsoaiArIDEpXSA9IG15bGlzdFtqXQogICAgICAgICAgICBqID0gaiAtIDEKICAgICAgICBteWxpc3RbKGogKyAxKV0gPSBrZXkKICAgIHJldHVybiBteWxpc3QKCgoKcHJpbnQoKF9FNl84Rl85Ml9FNV84NV9BNV9FNl84RV85Ml9FNV9CQV84RihbNSw2MjksMTIsMSw2Niw4NSwyMV0pKSxlbmQgPSIiKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/08-4 快速排序.mix b/mixly/boards/default_src/python_skulpt/origin/examples/08-4 快速排序.mix new file mode 100644 index 00000000..0bb1c0aa --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/08-4 快速排序.mix @@ -0,0 +1 @@ +myliststartend分片xmylist0endiMINUS1start10,1,2,30start5end1jLTEmylist0jxiADD1i1tempmylist0imylisti0mylistjmylistj0temptempmylisti+1mylisti+10mylisti+1endmylistrend0tempADD1i1mylist5,69,12,1,66,85,21mylist0MINUS1LENmylist1Hellomylist快速排序LTstartendqmyliststartendmyliststartMINUS1q1mylistADD1q1end{}aW1wb3J0IG1hdGgKCmRlZiBfRTVfODhfODZfRTdfODlfODcobXlsaXN0LCBzdGFydCwgZW5kKToKICAgIHggPSBteWxpc3RbZW5kXQogICAgaSA9IHN0YXJ0IC0gMQogICAgZm9yIGogaW4gcmFuZ2Uoc3RhcnQsIGVuZCwgMSk6CiAgICAgICAgaWYgbXlsaXN0W2pdIDw9IHg6CiAgICAgICAgICAgIGkgPSBpICsgMQogICAgICAgICAgICB0ZW1wID0gbXlsaXN0W2ldCiAgICAgICAgICAgIG15bGlzdFtpXSA9IG15bGlzdFtqXQogICAgICAgICAgICBteWxpc3Rbal0gPSB0ZW1wCiAgICB0ZW1wID0gbXlsaXN0W2krMV0KICAgIG15bGlzdFtpKzFdID0gbXlsaXN0W2VuZF0KICAgIG15bGlzdFtlbmRdID0gdGVtcAogICAgcmV0dXJuIGkgKyAxCgpkZWYgX0U1X0JGX0FCX0U5XzgwXzlGX0U2XzhFXzkyX0U1X0JBXzhGKG15bGlzdCwgc3RhcnQsIGVuZCk6CiAgICBpZiBzdGFydCA8IGVuZDoKICAgICAgICBxID0gX0U1Xzg4Xzg2X0U3Xzg5Xzg3KG15bGlzdCwgc3RhcnQsIGVuZCkKICAgICAgICBfRTVfQkZfQUJfRTlfODBfOUZfRTZfOEVfOTJfRTVfQkFfOEYobXlsaXN0LCBzdGFydCwgcSAtIDEpCiAgICAgICAgX0U1X0JGX0FCX0U5XzgwXzlGX0U2XzhFXzkyX0U1X0JBXzhGKG15bGlzdCwgcSArIDEsIGVuZCkKCgoKbXlsaXN0ID0gWzUsNjksMTIsMSw2Niw4NSwyMV0KX0U1X0JGX0FCX0U5XzgwXzlGX0U2XzhFXzkyX0U1X0JBXzhGKG15bGlzdCwgMCwgbGVuKG15bGlzdCkgLSAxKQpwcmludChteWxpc3QpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/09-1 2层汉诺塔算法.mix b/mixly/boards/default_src/python_skulpt/origin/examples/09-1 2层汉诺塔算法.mix new file mode 100644 index 00000000..df138b0b --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/09-1 2层汉诺塔算法.mix @@ -0,0 +1 @@ +2CABBCABCCBBC{}aW1wb3J0IHRpbWUKaW1wb3J0IHNwcml0ZQoKCnNwcml0ZS5jbGVhckFsbFNwcml0ZXMoKQpfSGFub2ljb2xvciA9IFsnYmx1ZScsICdyZWQnLCAneWVsbG93JywgJ2dyZWVuJywgJ3B1cnBsZScsICdibGFjayddCl9IYW5vaSA9IFtbXSwgW10sIFtdXQpBID0gMApCID0gMQpDID0gMgpfbiA9IDIKX0hhbm9pQ29sdW1uID0gWwogICAgc3ByaXRlLlNwcml0ZSgnSGFub2lDb2x1bW4nLCAyMDAsIDMyMCksCiAgICBzcHJpdGUuU3ByaXRlKCdIYW5vaUNvbHVtbicsIDQwMCwgMzIwKSwKICAgIHNwcml0ZS5TcHJpdGUoJ0hhbm9pQ29sdW1uJywgNjAwLCAzMjApCl0KX0hhbm9pQ29sdW1uTnVtYmVyID0gWwogICAgc3ByaXRlLlRleHQoJ0EnLCAxOTAsIDEyMCksCiAgICBzcHJpdGUuVGV4dCgnQicsIDM5MCwgMTIwKSwKICAgIHNwcml0ZS5UZXh0KCdDJywgNTkwLCAxMjApCl0KX0hhbm9pQmxvY2sgPSBbXQpmb3IgaSBpbiByYW5nZSgwLCBfbiwgMSk6CiAgICBfSGFub2lCbG9jay5hcHBlbmQoc3ByaXRlLlNwcml0ZShfSGFub2ljb2xvcltpXSwgMjAwLCA0MDAtKF9uLWktMSkqMjcpKQogICAgX0hhbm9pQmxvY2tbaV0uc2V0U2NhbGUoMjUsIDMwKmkrMzApCiAgICBfSGFub2lbMF0uaW5zZXJ0KDAsIF9IYW5vaUJsb2NrW2ldKQpfc3RlcHRleHQgPSBzcHJpdGUuVGV4dCgn5q2l5pWw77yaMCcsIDMwLCAzMCkKX3N0ZXBzID0geydzdGVwcycgOiAwfQp0aW1lLnNsZWVwKDEpCmlmIGxlbihfSGFub2lbQV0pPjAgOgogICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtBXS5wb3AoKQogICAgaWYgbGVuKF9IYW5vaVtCXSkgPiAwIDoKICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbQl0ucG9wKCkKICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICBleGl0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfSGFub2lbQl0uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhBKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEIqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQioyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtCXSkqMjcsIDAuMikKICAgIF9IYW5vaVtCXS5hcHBlbmQoX0hhbm9pQmxvY2tNb3ZlZCkKICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKZWxzZSA6CiAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgIGV4aXQoKQppZiBsZW4oX0hhbm9pW0FdKT4wIDoKICAgIF9IYW5vaUJsb2NrTW92ZWQgPSBfSGFub2lbQV0ucG9wKCkKICAgIGlmIGxlbihfSGFub2lbQ10pID4gMCA6CiAgICAgICAgX0hhbm9pQmxvY2tTdXBwcmVzc2VkID0gX0hhbm9pW0NdLnBvcCgpCiAgICAgICAgaWYgX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tNb3ZlZCkgPiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja1N1cHByZXNzZWQpOgogICAgICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX0hhbm9pW0NdLmFwcGVuZChfSGFub2lCbG9ja1N1cHByZXNzZWQpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQSoyMDArMjAwLCAxODAsIDAuMikKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhDKjIwMCsyMDAsIDE4MCwgMC41KQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEMqMjAwKzIwMCwgNDAwLWxlbihfSGFub2lbQ10pKjI3LCAwLjIpCiAgICBfSGFub2lbQ10uYXBwZW5kKF9IYW5vaUJsb2NrTW92ZWQpCiAgICBfc3RlcHNbJ3N0ZXBzJ10gKz0gMQogICAgX3N0ZXB0ZXh0LmNoYW5nZVRleHQoJ+atpeaVsO+8micrc3RyKF9zdGVwc1snc3RlcHMnXSkpCmVsc2UgOgogICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICBleGl0KCkKaWYgbGVuKF9IYW5vaVtCXSk+MCA6CiAgICBfSGFub2lCbG9ja01vdmVkID0gX0hhbm9pW0JdLnBvcCgpCiAgICBpZiBsZW4oX0hhbm9pW0NdKSA+IDAgOgogICAgICAgIF9IYW5vaUJsb2NrU3VwcHJlc3NlZCA9IF9IYW5vaVtDXS5wb3AoKQogICAgICAgIGlmIF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrTW92ZWQpID4gX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKToKICAgICAgICAgICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICAgICAgICAgIGV4aXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9IYW5vaVtDXS5hcHBlbmQoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEIqMjAwKzIwMCwgMTgwLCAwLjIpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQyoyMDArMjAwLCAxODAsIDAuNSkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhDKjIwMCsyMDAsIDQwMC1sZW4oX0hhbm9pW0NdKSoyNywgMC4yKQogICAgX0hhbm9pW0NdLmFwcGVuZChfSGFub2lCbG9ja01vdmVkKQogICAgX3N0ZXBzWydzdGVwcyddICs9IDEKICAgIF9zdGVwdGV4dC5jaGFuZ2VUZXh0KCfmraXmlbDvvJonK3N0cihfc3RlcHNbJ3N0ZXBzJ10pKQplbHNlIDoKICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgZXhpdCgpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/09-2 3层汉诺塔算法.mix b/mixly/boards/default_src/python_skulpt/origin/examples/09-2 3层汉诺塔算法.mix new file mode 100644 index 00000000..c789521a --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/09-2 3层汉诺塔算法.mix @@ -0,0 +1 @@ +3CABCCABBCCBBCABCCBBACBBCCABC{}aW1wb3J0IHRpbWUKaW1wb3J0IHNwcml0ZQoKCnNwcml0ZS5jbGVhckFsbFNwcml0ZXMoKQpfSGFub2ljb2xvciA9IFsnYmx1ZScsICdyZWQnLCAneWVsbG93JywgJ2dyZWVuJywgJ3B1cnBsZScsICdibGFjayddCl9IYW5vaSA9IFtbXSwgW10sIFtdXQpBID0gMApCID0gMQpDID0gMgpfbiA9IDMKX0hhbm9pQ29sdW1uID0gWwogICAgc3ByaXRlLlNwcml0ZSgnSGFub2lDb2x1bW4nLCAyMDAsIDMyMCksCiAgICBzcHJpdGUuU3ByaXRlKCdIYW5vaUNvbHVtbicsIDQwMCwgMzIwKSwKICAgIHNwcml0ZS5TcHJpdGUoJ0hhbm9pQ29sdW1uJywgNjAwLCAzMjApCl0KX0hhbm9pQ29sdW1uTnVtYmVyID0gWwogICAgc3ByaXRlLlRleHQoJ0EnLCAxOTAsIDEyMCksCiAgICBzcHJpdGUuVGV4dCgnQicsIDM5MCwgMTIwKSwKICAgIHNwcml0ZS5UZXh0KCdDJywgNTkwLCAxMjApCl0KX0hhbm9pQmxvY2sgPSBbXQpmb3IgaSBpbiByYW5nZSgwLCBfbiwgMSk6CiAgICBfSGFub2lCbG9jay5hcHBlbmQoc3ByaXRlLlNwcml0ZShfSGFub2ljb2xvcltpXSwgMjAwLCA0MDAtKF9uLWktMSkqMjcpKQogICAgX0hhbm9pQmxvY2tbaV0uc2V0U2NhbGUoMjUsIDMwKmkrMzApCiAgICBfSGFub2lbMF0uaW5zZXJ0KDAsIF9IYW5vaUJsb2NrW2ldKQpfc3RlcHRleHQgPSBzcHJpdGUuVGV4dCgn5q2l5pWw77yaMCcsIDMwLCAzMCkKX3N0ZXBzID0geydzdGVwcycgOiAwfQp0aW1lLnNsZWVwKDEpCmlmIGxlbihfSGFub2lbQV0pPjAgOgogICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtBXS5wb3AoKQogICAgaWYgbGVuKF9IYW5vaVtDXSkgPiAwIDoKICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbQ10ucG9wKCkKICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICBleGl0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfSGFub2lbQ10uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhBKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEMqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQyoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtDXSkqMjcsIDAuMikKICAgIF9IYW5vaVtDXS5hcHBlbmQoX0hhbm9pQmxvY2tNb3ZlZCkKICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKZWxzZSA6CiAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgIGV4aXQoKQppZiBsZW4oX0hhbm9pW0FdKT4wIDoKICAgIF9IYW5vaUJsb2NrTW92ZWQgPSBfSGFub2lbQV0ucG9wKCkKICAgIGlmIGxlbihfSGFub2lbQl0pID4gMCA6CiAgICAgICAgX0hhbm9pQmxvY2tTdXBwcmVzc2VkID0gX0hhbm9pW0JdLnBvcCgpCiAgICAgICAgaWYgX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tNb3ZlZCkgPiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja1N1cHByZXNzZWQpOgogICAgICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX0hhbm9pW0JdLmFwcGVuZChfSGFub2lCbG9ja1N1cHByZXNzZWQpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQSoyMDArMjAwLCAxODAsIDAuMikKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhCKjIwMCsyMDAsIDE4MCwgMC41KQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEIqMjAwKzIwMCwgNDAwLWxlbihfSGFub2lbQl0pKjI3LCAwLjIpCiAgICBfSGFub2lbQl0uYXBwZW5kKF9IYW5vaUJsb2NrTW92ZWQpCiAgICBfc3RlcHNbJ3N0ZXBzJ10gKz0gMQogICAgX3N0ZXB0ZXh0LmNoYW5nZVRleHQoJ+atpeaVsO+8micrc3RyKF9zdGVwc1snc3RlcHMnXSkpCmVsc2UgOgogICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICBleGl0KCkKaWYgbGVuKF9IYW5vaVtDXSk+MCA6CiAgICBfSGFub2lCbG9ja01vdmVkID0gX0hhbm9pW0NdLnBvcCgpCiAgICBpZiBsZW4oX0hhbm9pW0JdKSA+IDAgOgogICAgICAgIF9IYW5vaUJsb2NrU3VwcHJlc3NlZCA9IF9IYW5vaVtCXS5wb3AoKQogICAgICAgIGlmIF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrTW92ZWQpID4gX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKToKICAgICAgICAgICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICAgICAgICAgIGV4aXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9IYW5vaVtCXS5hcHBlbmQoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEMqMjAwKzIwMCwgMTgwLCAwLjIpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQioyMDArMjAwLCAxODAsIDAuNSkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhCKjIwMCsyMDAsIDQwMC1sZW4oX0hhbm9pW0JdKSoyNywgMC4yKQogICAgX0hhbm9pW0JdLmFwcGVuZChfSGFub2lCbG9ja01vdmVkKQogICAgX3N0ZXBzWydzdGVwcyddICs9IDEKICAgIF9zdGVwdGV4dC5jaGFuZ2VUZXh0KCfmraXmlbDvvJonK3N0cihfc3RlcHNbJ3N0ZXBzJ10pKQplbHNlIDoKICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgZXhpdCgpCmlmIGxlbihfSGFub2lbQV0pPjAgOgogICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtBXS5wb3AoKQogICAgaWYgbGVuKF9IYW5vaVtDXSkgPiAwIDoKICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbQ10ucG9wKCkKICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICBleGl0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfSGFub2lbQ10uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhBKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEMqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQyoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtDXSkqMjcsIDAuMikKICAgIF9IYW5vaVtDXS5hcHBlbmQoX0hhbm9pQmxvY2tNb3ZlZCkKICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKZWxzZSA6CiAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgIGV4aXQoKQppZiBsZW4oX0hhbm9pW0JdKT4wIDoKICAgIF9IYW5vaUJsb2NrTW92ZWQgPSBfSGFub2lbQl0ucG9wKCkKICAgIGlmIGxlbihfSGFub2lbQV0pID4gMCA6CiAgICAgICAgX0hhbm9pQmxvY2tTdXBwcmVzc2VkID0gX0hhbm9pW0FdLnBvcCgpCiAgICAgICAgaWYgX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tNb3ZlZCkgPiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja1N1cHByZXNzZWQpOgogICAgICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX0hhbm9pW0FdLmFwcGVuZChfSGFub2lCbG9ja1N1cHByZXNzZWQpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQioyMDArMjAwLCAxODAsIDAuMikKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhBKjIwMCsyMDAsIDE4MCwgMC41KQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEEqMjAwKzIwMCwgNDAwLWxlbihfSGFub2lbQV0pKjI3LCAwLjIpCiAgICBfSGFub2lbQV0uYXBwZW5kKF9IYW5vaUJsb2NrTW92ZWQpCiAgICBfc3RlcHNbJ3N0ZXBzJ10gKz0gMQogICAgX3N0ZXB0ZXh0LmNoYW5nZVRleHQoJ+atpeaVsO+8micrc3RyKF9zdGVwc1snc3RlcHMnXSkpCmVsc2UgOgogICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICBleGl0KCkKaWYgbGVuKF9IYW5vaVtCXSk+MCA6CiAgICBfSGFub2lCbG9ja01vdmVkID0gX0hhbm9pW0JdLnBvcCgpCiAgICBpZiBsZW4oX0hhbm9pW0NdKSA+IDAgOgogICAgICAgIF9IYW5vaUJsb2NrU3VwcHJlc3NlZCA9IF9IYW5vaVtDXS5wb3AoKQogICAgICAgIGlmIF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrTW92ZWQpID4gX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKToKICAgICAgICAgICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICAgICAgICAgIGV4aXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9IYW5vaVtDXS5hcHBlbmQoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEIqMjAwKzIwMCwgMTgwLCAwLjIpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQyoyMDArMjAwLCAxODAsIDAuNSkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhDKjIwMCsyMDAsIDQwMC1sZW4oX0hhbm9pW0NdKSoyNywgMC4yKQogICAgX0hhbm9pW0NdLmFwcGVuZChfSGFub2lCbG9ja01vdmVkKQogICAgX3N0ZXBzWydzdGVwcyddICs9IDEKICAgIF9zdGVwdGV4dC5jaGFuZ2VUZXh0KCfmraXmlbDvvJonK3N0cihfc3RlcHNbJ3N0ZXBzJ10pKQplbHNlIDoKICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgZXhpdCgpCmlmIGxlbihfSGFub2lbQV0pPjAgOgogICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtBXS5wb3AoKQogICAgaWYgbGVuKF9IYW5vaVtDXSkgPiAwIDoKICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbQ10ucG9wKCkKICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICBleGl0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfSGFub2lbQ10uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhBKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEMqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQyoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtDXSkqMjcsIDAuMikKICAgIF9IYW5vaVtDXS5hcHBlbmQoX0hhbm9pQmxvY2tNb3ZlZCkKICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKZWxzZSA6CiAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgIGV4aXQoKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/09-2 多层汉诺塔算法.mix b/mixly/boards/default_src/python_skulpt/origin/examples/09-2 多层汉诺塔算法.mix new file mode 100644 index 00000000..02bddb40 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/09-2 多层汉诺塔算法.mix @@ -0,0 +1 @@ +起始柱过渡柱目标柱层数移动汉诺塔EQ层数2起始柱过渡柱目标柱MINUS1层数1起始柱目标柱过渡柱C起始柱B目标柱MINUS1层数1过渡柱起始柱目标柱55ABC移动2层汉诺塔A起始柱C过渡柱A起始柱B目标柱C过渡柱B目标柱{}aW1wb3J0IHRpbWUKaW1wb3J0IHNwcml0ZQoKZGVmIF9FN19BN19CQl9FNV84QV9BOF9FNl9CMV84OV9FOF9BRl9CQV9FNV9BMV85NChfRTVfQjFfODJfRTZfOTVfQjAsIF9FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMSwgX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxLCBfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjEpOgogICAgaWYgX0U1X0IxXzgyX0U2Xzk1X0IwID09IDI6CiAgICAgICAgX0U3X0E3X0JCX0U1XzhBX0E4Ml9FNV9CMV84Ml9FNl9CMV84OV9FOF9BRl9CQV9FNV9BMV85NChfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjEsIF9FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMSwgX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxKQogICAgZWxzZToKICAgICAgICBfRTdfQTdfQkJfRTVfOEFfQThfRTZfQjFfODlfRThfQUZfQkFfRTVfQTFfOTQoX0U1X0IxXzgyX0U2Xzk1X0IwIC0gMSwgX0U4X0I1X0I3X0U1X0E3XzhCX0U2XzlGX0IxLCBfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjEsIF9FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMSkKICAgICAgICBpZiBsZW4oX0hhbm9pW19FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMV0pPjAgOgogICAgICAgICAgICBfSGFub2lCbG9ja01vdmVkID0gX0hhbm9pW19FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMV0ucG9wKCkKICAgICAgICAgICAgaWYgbGVuKF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdKSA+IDAgOgogICAgICAgICAgICAgICAgX0hhbm9pQmxvY2tTdXBwcmVzc2VkID0gX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0ucG9wKCkKICAgICAgICAgICAgICAgIGlmIF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrTW92ZWQpID4gX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKToKICAgICAgICAgICAgICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICAgICAgICAgICAgICBleGl0KCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgICAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKF9FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMSoyMDArMjAwLCAxODAsIDAuMikKICAgICAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKF9FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMSoyMDArMjAwLCAxODAsIDAuNSkKICAgICAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKF9FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMSoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdKSoyNywgMC4yKQogICAgICAgICAgICBfSGFub2lbX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxXS5hcHBlbmQoX0hhbm9pQmxvY2tNb3ZlZCkKICAgICAgICAgICAgX3N0ZXBzWydzdGVwcyddICs9IDEKICAgICAgICAgICAgX3N0ZXB0ZXh0LmNoYW5nZVRleHQoJ+atpeaVsO+8micrc3RyKF9zdGVwc1snc3RlcHMnXSkpCiAgICAgICAgZWxzZSA6CiAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICBleGl0KCkKICAgICAgICBfRTdfQTdfQkJfRTVfOEFfQThfRTZfQjFfODlfRThfQUZfQkFfRTVfQTFfOTQoX0U1X0IxXzgyX0U2Xzk1X0IwIC0gMSwgX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxLCBfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjEsIF9FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMSkKCmRlZiBfRTdfQTdfQkJfRTVfOEFfQTgyX0U1X0IxXzgyX0U2X0IxXzg5X0U4X0FGX0JBX0U1X0ExXzk0KF9FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMSwgX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxLCBfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjEpOgogICAgaWYgbGVuKF9IYW5vaVtfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjFdKT4wIDoKICAgICAgICBfSGFub2lCbG9ja01vdmVkID0gX0hhbm9pW19FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMV0ucG9wKCkKICAgICAgICBpZiBsZW4oX0hhbm9pW19FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMV0pID4gMCA6CiAgICAgICAgICAgIF9IYW5vaUJsb2NrU3VwcHJlc3NlZCA9IF9IYW5vaVtfRThfQkZfODdfRTZfQjhfQTFfRTZfOUZfQjFdLnBvcCgpCiAgICAgICAgICAgIGlmIF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrTW92ZWQpID4gX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKToKICAgICAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBfSGFub2lbX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxXS5hcHBlbmQoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKQogICAgICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjEqMjAwKzIwMCwgMTgwLCAwLjIpCiAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKF9FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMSoyMDArMjAwLCAxODAsIDAuNSkKICAgICAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxKjIwMCsyMDAsIDQwMC1sZW4oX0hhbm9pW19FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMV0pKjI3LCAwLjIpCiAgICAgICAgX0hhbm9pW19FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMV0uYXBwZW5kKF9IYW5vaUJsb2NrTW92ZWQpCiAgICAgICAgX3N0ZXBzWydzdGVwcyddICs9IDEKICAgICAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKICAgIGVsc2UgOgogICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgIGV4aXQoKQogICAgaWYgbGVuKF9IYW5vaVtfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjFdKT4wIDoKICAgICAgICBfSGFub2lCbG9ja01vdmVkID0gX0hhbm9pW19FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMV0ucG9wKCkKICAgICAgICBpZiBsZW4oX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0pID4gMCA6CiAgICAgICAgICAgIF9IYW5vaUJsb2NrU3VwcHJlc3NlZCA9IF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdLnBvcCgpCiAgICAgICAgICAgIGlmIF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrTW92ZWQpID4gX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKToKICAgICAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBfSGFub2lbX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxXS5hcHBlbmQoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKQogICAgICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjEqMjAwKzIwMCwgMTgwLCAwLjIpCiAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKF9FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMSoyMDArMjAwLCAxODAsIDAuNSkKICAgICAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxKjIwMCsyMDAsIDQwMC1sZW4oX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0pKjI3LCAwLjIpCiAgICAgICAgX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0uYXBwZW5kKF9IYW5vaUJsb2NrTW92ZWQpCiAgICAgICAgX3N0ZXBzWydzdGVwcyddICs9IDEKICAgICAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKICAgIGVsc2UgOgogICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgIGV4aXQoKQogICAgaWYgbGVuKF9IYW5vaVtfRThfQkZfODdfRTZfQjhfQTFfRTZfOUZfQjFdKT4wIDoKICAgICAgICBfSGFub2lCbG9ja01vdmVkID0gX0hhbm9pW19FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMV0ucG9wKCkKICAgICAgICBpZiBsZW4oX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0pID4gMCA6CiAgICAgICAgICAgIF9IYW5vaUJsb2NrU3VwcHJlc3NlZCA9IF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdLnBvcCgpCiAgICAgICAgICAgIGlmIF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrTW92ZWQpID4gX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKToKICAgICAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBfSGFub2lbX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxXS5hcHBlbmQoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKQogICAgICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhfRThfQkZfODdfRTZfQjhfQTFfRTZfOUZfQjEqMjAwKzIwMCwgMTgwLCAwLjIpCiAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKF9FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMSoyMDArMjAwLCAxODAsIDAuNSkKICAgICAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxKjIwMCsyMDAsIDQwMC1sZW4oX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0pKjI3LCAwLjIpCiAgICAgICAgX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0uYXBwZW5kKF9IYW5vaUJsb2NrTW92ZWQpCiAgICAgICAgX3N0ZXBzWydzdGVwcyddICs9IDEKICAgICAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKICAgIGVsc2UgOgogICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgIGV4aXQoKQoKCgpzcHJpdGUuY2xlYXJBbGxTcHJpdGVzKCkKX0hhbm9pY29sb3IgPSBbJ2JsdWUnLCAncmVkJywgJ3llbGxvdycsICdncmVlbicsICdwdXJwbGUnLCAnYmxhY2snXQpfSGFub2kgPSBbW10sIFtdLCBbXV0KQSA9IDAKQiA9IDEKQyA9IDIKX24gPSA1Cl9IYW5vaUNvbHVtbiA9IFsKICAgIHNwcml0ZS5TcHJpdGUoJ0hhbm9pQ29sdW1uJywgMjAwLCAzMjApLAogICAgc3ByaXRlLlNwcml0ZSgnSGFub2lDb2x1bW4nLCA0MDAsIDMyMCksCiAgICBzcHJpdGUuU3ByaXRlKCdIYW5vaUNvbHVtbicsIDYwMCwgMzIwKQpdCl9IYW5vaUNvbHVtbk51bWJlciA9IFsKICAgIHNwcml0ZS5UZXh0KCdBJywgMTkwLCAxMjApLAogICAgc3ByaXRlLlRleHQoJ0InLCAzOTAsIDEyMCksCiAgICBzcHJpdGUuVGV4dCgnQycsIDU5MCwgMTIwKQpdCl9IYW5vaUJsb2NrID0gW10KZm9yIGkgaW4gcmFuZ2UoMCwgX24sIDEpOgogICAgX0hhbm9pQmxvY2suYXBwZW5kKHNwcml0ZS5TcHJpdGUoX0hhbm9pY29sb3JbaV0sIDIwMCwgNDAwLShfbi1pLTEpKjI3KSkKICAgIF9IYW5vaUJsb2NrW2ldLnNldFNjYWxlKDI1LCAzMCppKzMwKQogICAgX0hhbm9pWzBdLmluc2VydCgwLCBfSGFub2lCbG9ja1tpXSkKX3N0ZXB0ZXh0ID0gc3ByaXRlLlRleHQoJ+atpeaVsO+8mjAnLCAzMCwgMzApCl9zdGVwcyA9IHsnc3RlcHMnIDogMH0KdGltZS5zbGVlcCgxKQpfRTdfQTdfQkJfRTVfOEFfQThfRTZfQjFfODlfRThfQUZfQkFfRTVfQTFfOTQoNSwgQSwgQiwgQykK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/10-1 回溯算法.mix b/mixly/boards/default_src/python_skulpt/origin/examples/10-1 回溯算法.mix new file mode 100644 index 00000000..cb2d6720 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/10-1 回溯算法.mix @@ -0,0 +1 @@ +UNTILTRUE{}aW1wb3J0IHNwcml0ZQppbXBvcnQgcmFuZG9tCmltcG9ydCB0aW1lCgoKZyA9IFtbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwxLDAsMCwwLDAsMCwwXSwgWzAsMCwwLDEsMCwwLDEsMCwwLDBdLCBbMCwxLDEsMCwxLDEsMCwwLDAsMF0sIFswLDAsMCwxLDAsMCwwLDEsMCwwXSwgWzAsMCwwLDEsMCwwLDEsMSwwLDBdLCBbMCwwLDEsMCwwLDEsMCwxLDAsMF0sIFswLDAsMCwwLDEsMSwxLDAsMCwwXV0KbWFyayA9IFtbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwwLDAsMCwwLDAsMCwwXSwgWzAsMCwwLDAsMCwwLDAsMCwwLDBdLCBbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwwLDAsMCwwLDAsMCwwXSwgWzAsMCwwLDAsMCwwLDAsMCwwLDBdLCBbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwwLDAsMCwwLDAsMCwwXV0KdmlzID0gWzAsMSwwLDAsMCwwLDAsMCwwXQpwb3NpdGlvbiA9IFtbMCwgMF0sIFsyMDAsIDIwMF0sIFsyNTAsIDYwXSwgWzMyMCwgMjAwXSwgWzI4MCwgMzgwXSwgWzQ3MCwgMjUwXSwgWzY3MCwgOTBdLCBbNjUwLCAzNDBdXQpzcHJpdGUuY2xlYXJBbGxTcHJpdGVzKCkKc3ByaXRlLmNyZWF0ZUJhY2tncm91bmQoJ21hcF94dWV4aWFvJykKCmhvdXNlID0gWyBzcHJpdGUuU3ByaXRlKCdtYXJrJywgMTUwLCAzODApLAogICAgc3ByaXRlLlNwcml0ZSgnU2Nob29sJywgMTE1LCAxOTUpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2UyNScsIDI2NCwgNjcpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2UzNicsIDMyMCwgMjAwKSwKICAgIHNwcml0ZS5TcHJpdGUoJ0hvdXNlNDcnLCAyOTAsIDM3MSksCiAgICBzcHJpdGUuU3ByaXRlKCdIb3VzZTI1JywgNDc5LCAyMzMpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2UzNicsIDY3NCwgOTYpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2U0NycsIDY0MiwgMzE4KQpdCmZvciBpIGluIGhvdXNlOgogICAgaS5oaWRlKCkKcGF0aCA9IFsxXQpjYXIgPSBzcHJpdGUuU3ByaXRlKCdjYXInLCBwb3NpdGlvblsxXVswXSwgcG9zaXRpb25bMV1bMV0pCmhvdXNlWzFdLnNob3coKQpjYXIubm93UG9zID0gMQpkZWYgZHJpdmUobik6CiAgICBpZiBnW2Nhci5ub3dQb3NdW25dPT0xOgogICAgICAgIGNhci5zbGlkZVRvKHBvc2l0aW9uW25dWzBdLCBwb3NpdGlvbltuXVsxXSwgMSkKICAgICAgICBjYXIubm93UG9zID0gbgogICAgZWxzZToKICAgICAgICBwcmludCgn56e75Yqo5aSx6LSl77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICBleGl0KCkKd2hpbGUgbm90IGxlbihwYXRoKSA9PSA3OgogICAgZiA9IHBhdGhbKGxlbihwYXRoKSAtIDEpXQogICAgZmxhZyA9IDAKICAgIGZvciBfbXlfdmFyaWFibGUgaW4gWzYsNSw0LDMsMiwxLDBdOgogICAgICAgIGlmIHZpc1tfbXlfdmFyaWFibGUrMV0gPT0gMCBhbmQgZ1tmXVtfbXlfdmFyaWFibGUrMV0gPT0gMToKICAgICAgICAgICAgaWYgbWFya1tmXVtfbXlfdmFyaWFibGUrMV0gPT0gMDoKICAgICAgICAgICAgICAgIGZsYWcgPSAxCiAgICAgICAgICAgICAgICBicmVhawogICAgaWYgZmxhZyA9PSAxOgogICAgICAgIG1hcmtbZl1bX215X3ZhcmlhYmxlKzFdID0gMQogICAgICAgIHZpc1tfbXlfdmFyaWFibGUrMV0gPSAxCiAgICAgICAgcGF0aC5hcHBlbmQoX215X3ZhcmlhYmxlKzEpCiAgICAgICAgZHJpdmUocGF0aFtsZW4ocGF0aCkgLSAxXSkKICAgICAgICBob3VzZVtfbXlfdmFyaWFibGUrMV0uc2hvdygpCiAgICBlbHNlOgogICAgICAgIGRlbCBwYXRoW2xlbihwYXRoKSAtIDFdCiAgICAgICAgaG91c2VbMF0uc2hvdygpCiAgICAgICAgdGltZS5zbGVlcCgwLjUpCiAgICAgICAgaG91c2VbMF0uaGlkZSgpCiAgICAgICAgaG91c2VbZl0uaGlkZSgpCiAgICAgICAgZHJpdmUocGF0aFtsZW4ocGF0aCkgLSAxXSkKICAgICAgICBmb3IgaSBpbiByYW5nZSg3KToKICAgICAgICAgICAgbWFya1tmXVtpKzFdID0gMAogICAgICAgICAgICB2aXNbZl0gPSAwCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/11-1 贪心算法.mix b/mixly/boards/default_src/python_skulpt/origin/examples/11-1 贪心算法.mix new file mode 100644 index 00000000..1fac8b71 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/11-1 贪心算法.mix @@ -0,0 +1 @@ +WHILETRUE{}aW1wb3J0IHRpbWUKaW1wb3J0IHNwcml0ZQoKCmcgPSBbWzEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwXSxbMTAwMDAsMTAwMDAsNTAwLDMwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMF0sWzEwMDAwLDUwMCwxMDAwMCwxMDAwMCwxMDAsMTAwMDAsMTAwMDAsMTAwMDAsMTAwMDAsMTAwMDAsMTAwMDBdLFsxMDAwMCwzMDAsMTAwMDAsMTAwMDAsNDAwLDMwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMF0sWzEwMDAwLDEwMDAwLDEwMCw0MDAsMTAwMDAsMTAwMDAsMjAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwXSxbMTAwMDAsMTAwMDAsMTAwMDAsMzAwLDEwMDAwLDEwMDAwLDEwMCwyMDAsMTAwMDAsMTAwMDAsMTAwMDBdLFsxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwyMDAsMTAwLDEwMDAwLDEwMDAwLDEwMCwxMDAwMCwxMDAwMF0sWzEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDIwMCwxMDAwMCwxMDAwMCwxMDAsMTAwMDAsMTAwMDBdLFsxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAsMTAwLDEwMDAwLDEwMDAwLDEwMDAwXV0Kbm93PTEKbGFzdD0xCnBhdGg9W10KcGF0aC5hcHBlbmQoMSkKbmFtZSA9IFsiIiwi5bCP5oCd5a62Iiwi6ZO26KGMIiwi6YKu5bGAIiwi6aSQ5Y6FIiwi5Lmm5bqXIiwi5Yy76ZmiIiwi6LaF5biCIiwi5bCP56eR5a62Il0KcG9zaXRpb24gPSBbWzAsIDBdLCBbNjAsIDMyMF0sIFs1MTAsIDM5MF0sIFsyNDAsIDIwMF0sIFs3NTAsIDMzMF0sIFs0MTAsIDkwXSwgWzU0MCwgMTkwXSwgWzU1MCwgMzBdLCBbNzIwLCAxMjBdXQpzcHJpdGUuY2xlYXJBbGxTcHJpdGVzKCkKc3ByaXRlLmNyZWF0ZUJhY2tncm91bmQoJ21hcF9zaV9rZScpCnN0dSA9IHNwcml0ZS5TcHJpdGUoJ2dpcmwnLCA2MCwgMzIwKQpzdHUuZW5sYXJnZVRvKDEwMCkKdGltZS5zbGVlcCgxKQoKd2hpbGUgbmFtZVtub3ddICE9ICflsI/np5HlrrYnOgogICAgdG1wPTEwMDAwCiAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZyksIDEpOgogICAgICAgIGlmIGdbbm93XVtpXTx0bXAgYW5kIGkhPWxhc3Q6CiAgICAgICAgICAgIG5leHQ9aQogICAgICAgICAgICB0bXA9Z1tub3ddW2ldCiAgICBzdHUuc2xpZGVUbyhwb3NpdGlvbltuZXh0XVswXSwgcG9zaXRpb25bbmV4dF1bMV0sIDEpCiAgICB0aW1lLnNsZWVwKDAuNSkKICAgIHBhdGguYXBwZW5kKG5leHQpCiAgICBsYXN0PW5vdwogICAgbm93PW5leHQKICAgIGlmIGxlbihwYXRoKT42OgogICAgICAgIHByaW50KCLot6/nur/plJnkubHvvIHnqIvluo/mnInor6/vvIEiKQogICAgICAgIGV4aXQoKQpyZXMgPSAiIgpmb3IgaSBpbiBwYXRoOgogICAgcmVzID0gcmVzICsgbmFtZVtpXSArICLihpIiCnByaW50KHJlc1s6LTFdKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/2-2-3凯撒加密(ASCII码补充解密验证).mix b/mixly/boards/default_src/python_skulpt/origin/examples/2-2-3凯撒加密(ASCII码补充解密验证).mix new file mode 100644 index 00000000..49b163bb --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/2-2-3凯撒加密(ASCII码补充解密验证).mix @@ -0,0 +1 @@ +sstr请输入明文:nint请输入位移值:jiami加密0,1,2,3siGTADD1alowerHello,mixlyi1nzappendmylistjiami065MINUS1ADD1alowerHello,mixlyi1n26appendmylistjiami065ADD1alowerHello,mixlyi1nHello加密结果:Mixlymylistjiamidecipher解密0,1,2,3jiamijLTMINUS1alowerHello,mixlyj1naappendmylistdecipher065ADD26MINUS1alowerHello,mixlyj1n26appendmylistdecipher065MINUS1alowerHello,mixlyj1nHello解密结果:Mixlymylistdecipher{}cyA9IGlucHV0KCfor7fovpPlhaXmmI7mlofvvJonKQpuID0gaW50KGlucHV0KCfor7fovpPlhaXkvY3np7vlgLzvvJonKSkKamlhbWkgPSBbXQojIOWKoOWvhgpmb3IgaSBpbiBzOgogICAgaWYgb3JkKGkubG93ZXIoKSkgKyBuID4gb3JkKCd6Jyk6CiAgICAgICAgamlhbWkuYXBwZW5kKGNocigoKG9yZChpLmxvd2VyKCkpICsgbikgLSAyNikpKQogICAgZWxzZToKICAgICAgICBqaWFtaS5hcHBlbmQoY2hyKChvcmQoaS5sb3dlcigpKSArIG4pKSkKcHJpbnQoKCfliqDlr4bnu5PmnpzvvJonICsgJycuam9pbihqaWFtaSkpKQpkZWNpcGhlciA9IFtdCiMg6Kej5a+GCmZvciBqIGluIGppYW1pOgogICAgaWYgb3JkKGoubG93ZXIoKSkgLSBuIDwgb3JkKCdhJyk6CiAgICAgICAgZGVjaXBoZXIuYXBwZW5kKGNocigoKG9yZChqLmxvd2VyKCkpIC0gbikgKyAyNikpKQogICAgZWxzZToKICAgICAgICBkZWNpcGhlci5hcHBlbmQoY2hyKChvcmQoai5sb3dlcigpKSAtIG4pKSkKcHJpbnQoKCfop6Plr4bnu5PmnpzvvJonICsgJycuam9pbihkZWNpcGhlcikpKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/map.json b/mixly/boards/default_src/python_skulpt/origin/examples/map.json new file mode 100644 index 00000000..ee7cb35c --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/map.json @@ -0,0 +1,266 @@ +{ + "01-1 海归画图初体验.mix": { + "__file__": true, + "__name__": "01-1 海归画图初体验.mix" + }, + "01-2 绘制四边形.mix": { + "__file__": true, + "__name__": "01-2 绘制四边形.mix" + }, + "01-2-2 绘制四边形.mix": { + "__file__": true, + "__name__": "01-2-2 绘制四边形.mix" + }, + "01-3 绘制多边形.mix": { + "__file__": true, + "__name__": "01-3 绘制多边形.mix" + }, + "01-3-2 绘制多边形.mix": { + "__file__": true, + "__name__": "01-3-2 绘制多边形.mix" + }, + "02-1 一笔画五角形.mix": { + "__file__": true, + "__name__": "02-1 一笔画五角形.mix" + }, + "02-1-2 一笔画五角形.mix": { + "__file__": true, + "__name__": "02-1-2 一笔画五角形.mix" + }, + "02-2 绘制红心.mix": { + "__file__": true, + "__name__": "02-2 绘制红心.mix" + }, + "02-2-2 绘制红心.mix": { + "__file__": true, + "__name__": "02-2-2 绘制红心.mix" + }, + "03-1 绘制螺旋线.mix": { + "__file__": true, + "__name__": "03-1 绘制螺旋线.mix" + }, + "03-1-2 绘制螺旋线.mix": { + "__file__": true, + "__name__": "03-1-2 绘制螺旋线.mix" + }, + "03-2 绘制螺旋线-字典.mix": { + "__file__": true, + "__name__": "03-2 绘制螺旋线-字典.mix" + }, + "03-2 绘制螺旋线.mix": { + "__file__": true, + "__name__": "03-2 绘制螺旋线.mix" + }, + "04-0 投票选举.mix": { + "__file__": true, + "__name__": "04-0 投票选举.mix" + }, + "04-1 投票选举.mix": { + "__file__": true, + "__name__": "04-1 投票选举.mix" + }, + "05-1 凯撒加密(一位密码).mix": { + "__file__": true, + "__name__": "05-1 凯撒加密(一位密码).mix" + }, + "05-2 凯撒加密(ASCII码补充解密验证).mix": { + "__file__": true, + "__name__": "05-2 凯撒加密(ASCII码补充解密验证).mix" + }, + "05-2 凯撒加密(ASCII码).mix": { + "__file__": true, + "__name__": "05-2 凯撒加密(ASCII码).mix" + }, + "05-2 凯撒加密(多位密码).mix": { + "__file__": true, + "__name__": "05-2 凯撒加密(多位密码).mix" + }, + "06-1 人机出数字比大小.mix": { + "__file__": true, + "__name__": "06-1 人机出数字比大小.mix" + }, + "06-1 猜数字游戏.mix": { + "__file__": true, + "__name__": "06-1 猜数字游戏.mix" + }, + "06-1-2 人机出数字比大小.mix": { + "__file__": true, + "__name__": "06-1-2 人机出数字比大小.mix" + }, + "06-2-2 猜数字限定次数.mix": { + "__file__": true, + "__name__": "06-2-2 猜数字限定次数.mix" + }, + "06-2-3 二分法.mix": { + "__file__": true, + "__name__": "06-2-3 二分法.mix" + }, + "07-1 鸡兔同笼.mix": { + "__file__": true, + "__name__": "07-1 鸡兔同笼.mix" + }, + "07-2 韩信点兵.mix": { + "__file__": true, + "__name__": "07-2 韩信点兵.mix" + }, + "08-1 冒泡排序.mix": { + "__file__": true, + "__name__": "08-1 冒泡排序.mix" + }, + "08-2 选择排序.mix": { + "__file__": true, + "__name__": "08-2 选择排序.mix" + }, + "08-3 插入排序.mix": { + "__file__": true, + "__name__": "08-3 插入排序.mix" + }, + "08-4 快速排序.mix": { + "__file__": true, + "__name__": "08-4 快速排序.mix" + }, + "09-1 2层汉诺塔算法.mix": { + "__file__": true, + "__name__": "09-1 2层汉诺塔算法.mix" + }, + "09-2 3层汉诺塔算法.mix": { + "__file__": true, + "__name__": "09-2 3层汉诺塔算法.mix" + }, + "09-2 多层汉诺塔算法.mix": { + "__file__": true, + "__name__": "09-2 多层汉诺塔算法.mix" + }, + "10-1 回溯算法.mix": { + "__file__": true, + "__name__": "10-1 回溯算法.mix" + }, + "11-1 贪心算法.mix": { + "__file__": true, + "__name__": "11-1 贪心算法.mix" + }, + "2-2-3凯撒加密(ASCII码补充解密验证).mix": { + "__file__": true, + "__name__": "2-2-3凯撒加密(ASCII码补充解密验证).mix" + }, + "北师大版教材示例代码": { + "五下第一单元": { + "P12鸡兔同笼.mix": { + "__file__": true, + "__name__": "P12鸡兔同笼.mix" + }, + "图1-14.mix": { + "__file__": true, + "__name__": "图1-14.mix" + }, + "图1-20.mix": { + "__file__": true, + "__name__": "图1-20.mix" + }, + "图1-4.mix": { + "__file__": true, + "__name__": "图1-4.mix" + }, + "图1-7.mix": { + "__file__": true, + "__name__": "图1-7.mix" + }, + "__file__": false, + "__name__": "五下第一单元" + }, + "五下第二单元": { + "图2-9.mix": { + "__file__": true, + "__name__": "图2-9.mix" + }, + "__file__": false, + "__name__": "五下第二单元" + }, + "五下第四单元": { + "图4-19&21&22.mix": { + "__file__": true, + "__name__": "图4-19&21&22.mix" + }, + "图4-3.mix": { + "__file__": true, + "__name__": "图4-3.mix" + }, + "__file__": false, + "__name__": "五下第四单元" + }, + "__file__": false, + "__name__": "北师大版教材示例代码" + }, + "大同出版社-五年级": { + "上册": { + "第12课判断闰年.mix": { + "__file__": true, + "__name__": "第12课判断闰年.mix" + }, + "第13课让计算机会数数1.mix": { + "__file__": true, + "__name__": "第13课让计算机会数数1.mix" + }, + "第13课让计算机会数数2.mix": { + "__file__": true, + "__name__": "第13课让计算机会数数2.mix" + }, + "第14课for循环.mix": { + "__file__": true, + "__name__": "第14课for循环.mix" + }, + "第14课趣味数玩具.mix": { + "__file__": true, + "__name__": "第14课趣味数玩具.mix" + }, + "第15课破译密码.mix": { + "__file__": true, + "__name__": "第15课破译密码.mix" + }, + "第8课动物园购票.mix": { + "__file__": true, + "__name__": "第8课动物园购票.mix" + }, + "第8课计算购书费.mix": { + "__file__": true, + "__name__": "第8课计算购书费.mix" + }, + "__file__": false, + "__name__": "上册" + }, + "下册": { + "第12课网页排名算法.mix": { + "__file__": true, + "__name__": "第12课网页排名算法.mix" + }, + "第1课比较交换找最大值.mix": { + "__file__": true, + "__name__": "第1课比较交换找最大值.mix" + }, + "第2课选择排序(未要求代码).mix": { + "__file__": true, + "__name__": "第2课选择排序(未要求代码).mix" + }, + "第4课冒泡排序.mix": { + "__file__": true, + "__name__": "第4课冒泡排序.mix" + }, + "第6课用算数求解鸡兔同笼.mix": { + "__file__": true, + "__name__": "第6课用算数求解鸡兔同笼.mix" + }, + "第6课遍历求解鸡兔同笼.mix": { + "__file__": true, + "__name__": "第6课遍历求解鸡兔同笼.mix" + }, + "第7课兔子增长算法.mix": { + "__file__": true, + "__name__": "第7课兔子增长算法.mix" + }, + "__file__": false, + "__name__": "下册" + }, + "__file__": false, + "__name__": "大同出版社-五年级" + } +} diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/5下P4算力v2.html b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/5下P4算力v2.html new file mode 100644 index 00000000..7525a325 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/5下P4算力v2.html @@ -0,0 +1,183 @@ + + + + + + 算力大比拼 + + + +

算力大比拼

+ +
准备开始...
+
-
+
时间: 0.000秒
+
计算次数: 0
+ +
+ + + +
+ + + + \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/P12鸡兔同笼.mix b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/P12鸡兔同笼.mix new file mode 100644 index 00000000..1f7b0002 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/P12鸡兔同笼.mix @@ -0,0 +1 @@ +x0y0WHILETRUELTEx35yMINUS351xEQADD1MULTIPLY21x1MULTIPLY41y94HelloxHelloyxADD1x1{}eCA9IDAKeSA9IDAKd2hpbGUgeCA8PSAzNToKICAgIHkgPSAzNSAtIHgKICAgIGlmIDIgKiB4ICsgNCAqIHkgPT0gOTQ6CiAgICAgICAgcHJpbnQoeCkKICAgICAgICBwcmludCh5KQogICAgeCA9IHggKyAxCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/P6加减乘除我来移.py b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/P6加减乘除我来移.py new file mode 100644 index 00000000..4db086e2 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/P6加减乘除我来移.py @@ -0,0 +1,51 @@ +import itertools +import time + +def calculate(numbers, operators): + # 计算四个数与三个运算符的组合是否能得到24 + formula = f"{numbers[0]} {operators[0]} {numbers[1]} {operators[1]} {numbers[2]} {operators[2]} {numbers[3]}" + result = eval(formula) + if result == 24: + return True, formula + else: + return False, result + +def solve(nums): + start_time = time.time() # 记录开始时间 + count = 0 # 记录枚举次数 + + + # 枚举三个运算符的所有排列组合(有重复) + for ops in itertools.product(["+", "-", "*", "/"], repeat=3): + count += 1 + success, result = calculate(nums, ops) + if success: + print(f"第{count}次枚举成功:{nums[0]} {ops[0]} {nums[1]} {ops[1]} {nums[2]} {ops[2]} {nums[3]} = 24") + print(f"共枚举{count}次,耗时{time.time()-start_time:.3f}秒。") + return + else: + print(f"第{count}次枚举失败:{nums[0]} {ops[0]} {nums[1]} {ops[1]} {nums[2]} {ops[2]} {nums[3]} = {result}") + + print("无解") + print(f"共枚举{count}次,耗时{time.time()-start_time:.3f}秒。") + +def get_numbers_from_user(): + numbers = [] + for i in range(4): + while True: + try: + num = int(input(f"请输入第{i+1}个数字:")) + numbers.append(num) + break + except ValueError: + print("输入错误,请重新输入整数。") + return numbers + +def main(): + print("欢迎使用24点计算器!") + numbers = get_numbers_from_user() + print("开始求解...") + solve(numbers) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-14.mix b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-14.mix new file mode 100644 index 00000000..52f1672d --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-14.mix @@ -0,0 +1 @@ +UNTILTRUE{}aW1wb3J0IHNwcml0ZQppbXBvcnQgcmFuZG9tCmltcG9ydCB0aW1lCgoKZyA9IFtbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwxLDAsMCwwLDAsMCwwXSwgWzAsMCwwLDEsMCwwLDEsMCwwLDBdLCBbMCwxLDEsMCwxLDEsMCwwLDAsMF0sIFswLDAsMCwxLDAsMCwwLDEsMCwwXSwgWzAsMCwwLDEsMCwwLDEsMSwwLDBdLCBbMCwwLDEsMCwwLDEsMCwxLDAsMF0sIFswLDAsMCwwLDEsMSwxLDAsMCwwXV0KbWFyayA9IFtbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwwLDAsMCwwLDAsMCwwXSwgWzAsMCwwLDAsMCwwLDAsMCwwLDBdLCBbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwwLDAsMCwwLDAsMCwwXSwgWzAsMCwwLDAsMCwwLDAsMCwwLDBdLCBbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwwLDAsMCwwLDAsMCwwXV0KdmlzID0gWzAsMSwwLDAsMCwwLDAsMCwwXQpwb3NpdGlvbiA9IFtbMCwgMF0sIFsyMDAsIDIwMF0sIFsyNTAsIDYwXSwgWzMyMCwgMjAwXSwgWzI4MCwgMzgwXSwgWzQ3MCwgMjUwXSwgWzY3MCwgOTBdLCBbNjUwLCAzNDBdXQpzcHJpdGUuY2xlYXJBbGxTcHJpdGVzKCkKc3ByaXRlLmNyZWF0ZUJhY2tncm91bmQoJ21hcF94dWV4aWFvJykKCmhvdXNlID0gWyBzcHJpdGUuU3ByaXRlKCdtYXJrJywgMTUwLCAzODApLAogICAgc3ByaXRlLlNwcml0ZSgnU2Nob29sJywgMTE1LCAxOTUpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2UyNScsIDI2NCwgNjcpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2UzNicsIDMyMCwgMjAwKSwKICAgIHNwcml0ZS5TcHJpdGUoJ0hvdXNlNDcnLCAyOTAsIDM3MSksCiAgICBzcHJpdGUuU3ByaXRlKCdIb3VzZTI1JywgNDc5LCAyMzMpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2UzNicsIDY3NCwgOTYpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2U0NycsIDY0MiwgMzE4KQpdCmZvciBpIGluIGhvdXNlOgogICAgaS5oaWRlKCkKcGF0aCA9IFsxXQpjYXIgPSBzcHJpdGUuU3ByaXRlKCdjYXInLCBwb3NpdGlvblsxXVswXSwgcG9zaXRpb25bMV1bMV0pCmhvdXNlWzFdLnNob3coKQpjYXIubm93UG9zID0gMQpkZWYgZHJpdmUobik6CiAgICBpZiBnW2Nhci5ub3dQb3NdW25dPT0xOgogICAgICAgIGNhci5zbGlkZVRvKHBvc2l0aW9uW25dWzBdLCBwb3NpdGlvbltuXVsxXSwgMSkKICAgICAgICBjYXIubm93UG9zID0gbgogICAgZWxzZToKICAgICAgICBwcmludCgn56e75Yqo5aSx6LSl77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICBleGl0KCkKd2hpbGUgbm90IGxlbihwYXRoKSA9PSA3OgogICAgZiA9IHBhdGhbKGxlbihwYXRoKSAtIDEpXQogICAgZmxhZyA9IDAKICAgIGZvciBfbXlfdmFyaWFibGUgaW4gWzYsNSw0LDMsMiwxLDBdOgogICAgICAgIGlmIHZpc1tfbXlfdmFyaWFibGUrMV0gPT0gMCBhbmQgZ1tmXVtfbXlfdmFyaWFibGUrMV0gPT0gMToKICAgICAgICAgICAgaWYgbWFya1tmXVtfbXlfdmFyaWFibGUrMV0gPT0gMDoKICAgICAgICAgICAgICAgIGZsYWcgPSAxCiAgICAgICAgICAgICAgICBicmVhawogICAgaWYgZmxhZyA9PSAxOgogICAgICAgIG1hcmtbZl1bX215X3ZhcmlhYmxlKzFdID0gMQogICAgICAgIHZpc1tfbXlfdmFyaWFibGUrMV0gPSAxCiAgICAgICAgcGF0aC5hcHBlbmQoX215X3ZhcmlhYmxlKzEpCiAgICAgICAgZHJpdmUocGF0aFtsZW4ocGF0aCkgLSAxXSkKICAgICAgICBob3VzZVtfbXlfdmFyaWFibGUrMV0uc2hvdygpCiAgICBlbHNlOgogICAgICAgIGRlbCBwYXRoW2xlbihwYXRoKSAtIDFdCiAgICAgICAgaG91c2VbMF0uc2hvdygpCiAgICAgICAgdGltZS5zbGVlcCgwLjUpCiAgICAgICAgaG91c2VbMF0uaGlkZSgpCiAgICAgICAgaG91c2VbZl0uaGlkZSgpCiAgICAgICAgZHJpdmUocGF0aFtsZW4ocGF0aCkgLSAxXSkKICAgICAgICBmb3IgaSBpbiByYW5nZSg3KToKICAgICAgICAgICAgbWFya1tmXVtpKzFdID0gMAogICAgICAgICAgICB2aXNbZl0gPSAwCm5hbWUgPSBbIiIsIuWtpuagoSIsIuWwj+aZuuWutiIsIuWwj+aso+WutiIsIuWwj+aAneWutiIsIuWwj+enkeWutiIsIui0nei0neWutiIsIuS5kOS5kOWutiJdCnJlcyA9ICIiCmZvciBpIGluIHBhdGg6CiAgICByZXMgPSByZXMgKyBuYW1lW2ldICsgIi0iCnByaW50KHJlc1s6LTFdKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-20.mix b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-20.mix new file mode 100644 index 00000000..69417610 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-20.mix @@ -0,0 +1 @@ +UNTILTRUE{}aW1wb3J0IHNwcml0ZQppbXBvcnQgcmFuZG9tCmltcG9ydCB0aW1lCgoKZyA9IFtbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwxLDAsMCwwLDAsMCwwXSwgWzAsMCwwLDEsMCwwLDEsMCwwLDBdLCBbMCwxLDEsMCwxLDAsMCwwLDAsMF0sIFswLDAsMCwxLDAsMCwwLDEsMCwwXSwgWzAsMCwwLDEsMCwwLDAsMSwwLDBdLCBbMCwwLDEsMCwwLDAsMCwxLDAsMF0sIFswLDAsMCwwLDEsMSwxLDAsMCwwXV0KbWFyayA9IFtbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwwLDAsMCwwLDAsMCwwXSwgWzAsMCwwLDAsMCwwLDAsMCwwLDBdLCBbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwwLDAsMCwwLDAsMCwwXSwgWzAsMCwwLDAsMCwwLDAsMCwwLDBdLCBbMCwwLDAsMCwwLDAsMCwwLDAsMF0sIFswLDAsMCwwLDAsMCwwLDAsMCwwXV0KdmlzID0gWzAsMSwwLDAsMCwwLDAsMCwwXQpwb3NpdGlvbiA9IFtbMCwgMF0sIFsyMDAsIDIwMF0sIFsyNTAsIDYwXSwgWzMyMCwgMjAwXSwgWzI4MCwgMzgwXSwgWzQ3MCwgMjUwXSwgWzY3MCwgOTBdLCBbNjUwLCAzNDBdXQpzcHJpdGUuY2xlYXJBbGxTcHJpdGVzKCkKc3ByaXRlLmNyZWF0ZUJhY2tncm91bmQoJ21hcF94dWV4aWFvJykKCmhvdXNlID0gWyBzcHJpdGUuU3ByaXRlKCdtYXJrJywgMTUwLCAzODApLAogICAgc3ByaXRlLlNwcml0ZSgnU2Nob29sJywgMTE1LCAxOTUpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2UyNScsIDI2NCwgNjcpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2UzNicsIDMyMCwgMjAwKSwKICAgIHNwcml0ZS5TcHJpdGUoJ0hvdXNlNDcnLCAyOTAsIDM3MSksCiAgICBzcHJpdGUuU3ByaXRlKCdIb3VzZTI1JywgNDc5LCAyMzMpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2UzNicsIDY3NCwgOTYpLAogICAgc3ByaXRlLlNwcml0ZSgnSG91c2U0NycsIDY0MiwgMzE4KQpdCmJhcnJpY2FkZSA9IHNwcml0ZS5TcHJpdGUoJ2JhcnJpY2FkZScsIDU3MCwgMTcwKQpiYXJyaWNhZGUuZW5sYXJnZVRvKDEwMCkKZm9yIGkgaW4gaG91c2U6CiAgICBpLmhpZGUoKQpwYXRoID0gWzFdCmNhciA9IHNwcml0ZS5TcHJpdGUoJ2NhcicsIHBvc2l0aW9uWzFdWzBdLCBwb3NpdGlvblsxXVsxXSkKaG91c2VbMV0uc2hvdygpCmNhci5ub3dQb3MgPSAxCmRlZiBkcml2ZShuKToKICAgIGlmIGdbY2FyLm5vd1Bvc11bbl09PTE6CiAgICAgICAgY2FyLnNsaWRlVG8ocG9zaXRpb25bbl1bMF0sIHBvc2l0aW9uW25dWzFdLCAxKQogICAgICAgIGNhci5ub3dQb3MgPSBuCiAgICBlbHNlOgogICAgICAgIHByaW50KCfnp7vliqjlpLHotKXvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgIGV4aXQoKQp3aGlsZSBub3QgbGVuKHBhdGgpID09IDc6CiAgICBmID0gcGF0aFsobGVuKHBhdGgpIC0gMSldCiAgICBmbGFnID0gMAogICAgZm9yIF9teV92YXJpYWJsZSBpbiBbNiw1LDQsMywyLDEsMF06CiAgICAgICAgaWYgdmlzW19teV92YXJpYWJsZSsxXSA9PSAwIGFuZCBnW2ZdW19teV92YXJpYWJsZSsxXSA9PSAxOgogICAgICAgICAgICBpZiBtYXJrW2ZdW19teV92YXJpYWJsZSsxXSA9PSAwOgogICAgICAgICAgICAgICAgZmxhZyA9IDEKICAgICAgICAgICAgICAgIGJyZWFrCiAgICBpZiBmbGFnID09IDE6CiAgICAgICAgbWFya1tmXVtfbXlfdmFyaWFibGUrMV0gPSAxCiAgICAgICAgdmlzW19teV92YXJpYWJsZSsxXSA9IDEKICAgICAgICBwYXRoLmFwcGVuZChfbXlfdmFyaWFibGUrMSkKICAgICAgICBkcml2ZShwYXRoW2xlbihwYXRoKSAtIDFdKQogICAgICAgIGhvdXNlW19teV92YXJpYWJsZSsxXS5zaG93KCkKICAgIGVsc2U6CiAgICAgICAgaWYgZiA9PSAxOgogICAgICAgICAgICBwcmludCgn5rKh5pyJ56ym5ZCI5p2h5Lu255qE6Lev57q/JykKICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGVsIHBhdGhbbGVuKHBhdGgpIC0gMV0KICAgICAgICAgICAgaG91c2VbMF0uc2hvdygpCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMC41KQogICAgICAgICAgICBob3VzZVswXS5oaWRlKCkKICAgICAgICAgICAgaG91c2VbZl0uaGlkZSgpCiAgICAgICAgICAgIGRyaXZlKHBhdGhbbGVuKHBhdGgpIC0gMV0pCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDcpOgogICAgICAgICAgICAgICAgbWFya1tmXVtpKzFdID0gMAogICAgICAgICAgICAgICAgdmlzW2ZdID0gMApuYW1lID0gWyIiLCLlrabmoKEiLCLlsI/mmbrlrrYiLCLlsI/mrKPlrrYiLCLlsI/mgJ3lrrYiLCLlsI/np5HlrrYiLCLotJ3otJ3lrrYiLCLkuZDkuZDlrrYiXQpyZXMgPSAiIgpmb3IgaSBpbiBwYXRoOgogICAgcmVzID0gcmVzICsgbmFtZVtpXSArICItIgpwcmludChyZXNbOi0xXSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-4.mix b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-4.mix new file mode 100644 index 00000000..2d76b92f --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-4.mix @@ -0,0 +1 @@ +x1500WHILETRUEGTEx0EQQUYU1x32EQQUYU1x54EQQUYU1x76HelloxxMINUS1x1{}eCA9IDE1MDAKd2hpbGUgeCA+PSAwOgogICAgaWYgeCAlIDMgPT0gMjoKICAgICAgICBpZiB4ICUgNSA9PSA0OgogICAgICAgICAgICBpZiB4ICUgNyA9PSA2OgogICAgICAgICAgICAgICAgcHJpbnQoeCkKICAgIHggPSB4IC0gMQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-7.mix b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-7.mix new file mode 100644 index 00000000..d14dbdf1 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第一单元/图1-7.mix @@ -0,0 +1 @@ +x1100WHILETRUEGTEx1000EQQUYU1x32EQQUYU1x54EQQUYU1x76HelloxxMINUS1x1{}eCA9IDExMDAKd2hpbGUgeCA+PSAxMDAwOgogICAgaWYgeCAlIDMgPT0gMjoKICAgICAgICBpZiB4ICUgNSA9PSA0OgogICAgICAgICAgICBpZiB4ICUgNyA9PSA2OgogICAgICAgICAgICAgICAgcHJpbnQoeCkKICAgIHggPSB4IC0gMQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第二单元/图2-9.mix b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第二单元/图2-9.mix new file mode 100644 index 00000000..630b2eda --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第二单元/图2-9.mix @@ -0,0 +1 @@ +WHILETRUE{}aW1wb3J0IHRpbWUKaW1wb3J0IHNwcml0ZQoKCmcgPSBbWzEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwXSxbMTAwMDAsMTAwMDAsNTAwLDMwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMF0sWzEwMDAwLDUwMCwxMDAwMCwxMDAwMCwxMDAsMTAwMDAsMTAwMDAsMTAwMDAsMTAwMDAsMTAwMDAsMTAwMDBdLFsxMDAwMCwzMDAsMTAwMDAsMTAwMDAsNDAwLDMwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMF0sWzEwMDAwLDEwMDAwLDEwMCw0MDAsMTAwMDAsMTAwMDAsMjAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwXSxbMTAwMDAsMTAwMDAsMTAwMDAsMzAwLDEwMDAwLDEwMDAwLDEwMCwyMDAsMTAwMDAsMTAwMDAsMTAwMDBdLFsxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwyMDAsMTAwLDEwMDAwLDEwMDAwLDEwMCwxMDAwMCwxMDAwMF0sWzEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDEwMDAwLDIwMCwxMDAwMCwxMDAwMCwxMDAsMTAwMDAsMTAwMDBdLFsxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAwMCwxMDAsMTAwLDEwMDAwLDEwMDAwLDEwMDAwXV0Kbm93PTEKbGFzdD0xCnBhdGg9W10KcGF0aC5hcHBlbmQoMSkKbmFtZSA9IFsiIiwi5bCP5oCd5a62Iiwi6ZO26KGMIiwi6YKu5bGAIiwi6aSQ5Y6FIiwi5Lmm5bqXIiwi5Yy76ZmiIiwi6LaF5biCIiwi5bCP56eR5a62Il0KcG9zaXRpb24gPSBbWzAsIDBdLCBbNjAsIDMyMF0sIFs1MTAsIDM5MF0sIFsyNDAsIDIwMF0sIFs3NTAsIDMzMF0sIFs0MTAsIDkwXSwgWzU0MCwgMTkwXSwgWzU1MCwgMzBdLCBbNzIwLCAxMjBdXQpzcHJpdGUuY2xlYXJBbGxTcHJpdGVzKCkKc3ByaXRlLmNyZWF0ZUJhY2tncm91bmQoJ21hcF9zaV9rZScpCnN0dSA9IHNwcml0ZS5TcHJpdGUoJ2dpcmwnLCA2MCwgMzIwKQpzdHUuZW5sYXJnZVRvKDEwMCkKdGltZS5zbGVlcCgxKQoKd2hpbGUgbmFtZVtub3ddICE9ICflsI/np5HlrrYnOgogICAgdG1wPTEwMDAwCiAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZyksIDEpOgogICAgICAgIGlmIGdbbm93XVtpXTx0bXAgYW5kIGkhPWxhc3Q6CiAgICAgICAgICAgIG5leHQ9aQogICAgICAgICAgICB0bXA9Z1tub3ddW2ldCiAgICBzdHUuc2xpZGVUbyhwb3NpdGlvbltuZXh0XVswXSwgcG9zaXRpb25bbmV4dF1bMV0sIDEpCiAgICB0aW1lLnNsZWVwKDAuNSkKICAgIHBhdGguYXBwZW5kKG5leHQpCiAgICBsYXN0PW5vdwogICAgbm93PW5leHQKICAgIGlmIGxlbihwYXRoKT42OgogICAgICAgIHByaW50KCLot6/nur/plJnkubHvvIHnqIvluo/mnInor6/vvIEiKQogICAgICAgIGV4aXQoKQpyZXMgPSAiIgpmb3IgaSBpbiBwYXRoOgogICAgcmVzID0gcmVzICsgbmFtZVtpXSArICLihpIiCnByaW50KHJlc1s6LTFdKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第四单元/图4-19&21&22.mix b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第四单元/图4-19&21&22.mix new file mode 100644 index 00000000..81295f8a --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第四单元/图4-19&21&22.mix @@ -0,0 +1 @@ +层数起始柱过渡柱目标柱移动汉诺塔EQ层数2起始柱过渡柱目标柱MINUS1层数1起始柱目标柱过渡柱A起始柱B目标柱MINUS1层数1过渡柱起始柱目标柱55ABC移动二层汉诺塔A起始柱B过渡柱A起始柱B目标柱A过渡柱B目标柱{}aW1wb3J0IHRpbWUKaW1wb3J0IHNwcml0ZQoKZGVmIF9FN19BN19CQl9FNV84QV9BOF9FNl9CMV84OV9FOF9BRl9CQV9FNV9BMV85NChfRTVfQjFfODJfRTZfOTVfQjAsIF9FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMSwgX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxLCBfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjEpOgogICAgaWYgX0U1X0IxXzgyX0U2Xzk1X0IwID09IDI6CiAgICAgICAgX0U3X0E3X0JCX0U1XzhBX0E4X0U0X0JBXzhDX0U1X0IxXzgyX0U2X0IxXzg5X0U4X0FGX0JBX0U1X0ExXzk0KF9FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMSwgX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxLCBfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjEpCiAgICBlbHNlOgogICAgICAgIF9FN19BN19CQl9FNV84QV9BOF9FNl9CMV84OV9FOF9BRl9CQV9FNV9BMV85NChfRTVfQjFfODJfRTZfOTVfQjAgLSAxLCBfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjEsIF9FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMSwgX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxKQogICAgICAgIGlmIGxlbihfSGFub2lbX0U4X0I1X0I3X0U1X0E3XzhCX0U2XzlGX0IxXSk+MCA6CiAgICAgICAgICAgIF9IYW5vaUJsb2NrTW92ZWQgPSBfSGFub2lbX0U4X0I1X0I3X0U1X0E3XzhCX0U2XzlGX0IxXS5wb3AoKQogICAgICAgICAgICBpZiBsZW4oX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0pID4gMCA6CiAgICAgICAgICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxXS5wb3AoKQogICAgICAgICAgICAgICAgaWYgX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tNb3ZlZCkgPiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja1N1cHByZXNzZWQpOgogICAgICAgICAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICAgICAgICAgIGV4aXQoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBfSGFub2lbX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxXS5hcHBlbmQoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKQogICAgICAgICAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oX0U4X0I1X0I3X0U1X0E3XzhCX0U2XzlGX0IxKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgICAgICAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxKjIwMCsyMDAsIDE4MCwgMC41KQogICAgICAgICAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxKjIwMCsyMDAsIDQwMC1sZW4oX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0pKjI3LCAwLjIpCiAgICAgICAgICAgIF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdLmFwcGVuZChfSGFub2lCbG9ja01vdmVkKQogICAgICAgICAgICBfc3RlcHNbJ3N0ZXBzJ10gKz0gMQogICAgICAgICAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKICAgICAgICBlbHNlIDoKICAgICAgICAgICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICAgICAgICAgIGV4aXQoKQogICAgICAgIF9FN19BN19CQl9FNV84QV9BOF9FNl9CMV84OV9FOF9BRl9CQV9FNV9BMV85NChfRTVfQjFfODJfRTZfOTVfQjAgLSAxLCBfRThfQkZfODdfRTZfQjhfQTFfRTZfOUZfQjEsIF9FOF9CNV9CN19FNV9BN184Ql9FNl85Rl9CMSwgX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxKQoKZGVmIF9FN19BN19CQl9FNV84QV9BOF9FNF9CQV84Q19FNV9CMV84Ml9FNl9CMV84OV9FOF9BRl9CQV9FNV9BMV85NChfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjEsIF9FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMSwgX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxKToKICAgIGlmIGxlbihfSGFub2lbX0U4X0I1X0I3X0U1X0E3XzhCX0U2XzlGX0IxXSk+MCA6CiAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjFdLnBvcCgpCiAgICAgICAgaWYgbGVuKF9IYW5vaVtfRThfQkZfODdfRTZfQjhfQTFfRTZfOUZfQjFdKSA+IDAgOgogICAgICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxXS5wb3AoKQogICAgICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICAgICAgICAgIGV4aXQoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgX0hhbm9pW19FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMV0uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgICAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oX0U4X0I1X0I3X0U1X0E3XzhCX0U2XzlGX0IxKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhfRThfQkZfODdfRTZfQjhfQTFfRTZfOUZfQjEqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKF9FOF9CRl84N19FNl9COF9BMV9FNl85Rl9CMSoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtfRThfQkZfODdfRTZfQjhfQTFfRTZfOUZfQjFdKSoyNywgMC4yKQogICAgICAgIF9IYW5vaVtfRThfQkZfODdfRTZfQjhfQTFfRTZfOUZfQjFdLmFwcGVuZChfSGFub2lCbG9ja01vdmVkKQogICAgICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICAgICAgX3N0ZXB0ZXh0LmNoYW5nZVRleHQoJ+atpeaVsO+8micrc3RyKF9zdGVwc1snc3RlcHMnXSkpCiAgICBlbHNlIDoKICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICBleGl0KCkKICAgIGlmIGxlbihfSGFub2lbX0U4X0I1X0I3X0U1X0E3XzhCX0U2XzlGX0IxXSk+MCA6CiAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtfRThfQjVfQjdfRTVfQTdfOEJfRTZfOUZfQjFdLnBvcCgpCiAgICAgICAgaWYgbGVuKF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdKSA+IDAgOgogICAgICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxXS5wb3AoKQogICAgICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICAgICAgICAgIGV4aXQoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgICAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oX0U4X0I1X0I3X0U1X0E3XzhCX0U2XzlGX0IxKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjEqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKF9FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMSoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdKSoyNywgMC4yKQogICAgICAgIF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdLmFwcGVuZChfSGFub2lCbG9ja01vdmVkKQogICAgICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICAgICAgX3N0ZXB0ZXh0LmNoYW5nZVRleHQoJ+atpeaVsO+8micrc3RyKF9zdGVwc1snc3RlcHMnXSkpCiAgICBlbHNlIDoKICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICBleGl0KCkKICAgIGlmIGxlbihfSGFub2lbX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxXSk+MCA6CiAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtfRThfQkZfODdfRTZfQjhfQTFfRTZfOUZfQjFdLnBvcCgpCiAgICAgICAgaWYgbGVuKF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdKSA+IDAgOgogICAgICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbX0U3XzlCX0FFX0U2X0EwXzg3X0U2XzlGX0IxXS5wb3AoKQogICAgICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICAgICAgICAgIGV4aXQoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgX0hhbm9pW19FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMV0uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgICAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oX0U4X0JGXzg3X0U2X0I4X0ExX0U2XzlGX0IxKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjEqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICAgICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKF9FN185Ql9BRV9FNl9BMF84N19FNl85Rl9CMSoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdKSoyNywgMC4yKQogICAgICAgIF9IYW5vaVtfRTdfOUJfQUVfRTZfQTBfODdfRTZfOUZfQjFdLmFwcGVuZChfSGFub2lCbG9ja01vdmVkKQogICAgICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICAgICAgX3N0ZXB0ZXh0LmNoYW5nZVRleHQoJ+atpeaVsO+8micrc3RyKF9zdGVwc1snc3RlcHMnXSkpCiAgICBlbHNlIDoKICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICBleGl0KCkKCgoKc3ByaXRlLmNsZWFyQWxsU3ByaXRlcygpCl9IYW5vaWNvbG9yID0gWydibHVlJywgJ3JlZCcsICd5ZWxsb3cnLCAnZ3JlZW4nLCAncHVycGxlJywgJ2JsYWNrJ10KX0hhbm9pID0gW1tdLCBbXSwgW11dCkEgPSAwCkIgPSAxCkMgPSAyCl9uID0gNQpfSGFub2lDb2x1bW4gPSBbCiAgICBzcHJpdGUuU3ByaXRlKCdIYW5vaUNvbHVtbicsIDIwMCwgMzIwKSwKICAgIHNwcml0ZS5TcHJpdGUoJ0hhbm9pQ29sdW1uJywgNDAwLCAzMjApLAogICAgc3ByaXRlLlNwcml0ZSgnSGFub2lDb2x1bW4nLCA2MDAsIDMyMCkKXQpfSGFub2lDb2x1bW5OdW1iZXIgPSBbCiAgICBzcHJpdGUuVGV4dCgnQScsIDE5MCwgMTIwKSwKICAgIHNwcml0ZS5UZXh0KCdCJywgMzkwLCAxMjApLAogICAgc3ByaXRlLlRleHQoJ0MnLCA1OTAsIDEyMCkKXQpfSGFub2lCbG9jayA9IFtdCmZvciBpIGluIHJhbmdlKDAsIF9uLCAxKToKICAgIF9IYW5vaUJsb2NrLmFwcGVuZChzcHJpdGUuU3ByaXRlKF9IYW5vaWNvbG9yW2ldLCAyMDAsIDQwMC0oX24taS0xKSoyNykpCiAgICBfSGFub2lCbG9ja1tpXS5zZXRTY2FsZSgyNSwgMzAqaSszMCkKICAgIF9IYW5vaVswXS5pbnNlcnQoMCwgX0hhbm9pQmxvY2tbaV0pCl9zdGVwdGV4dCA9IHNwcml0ZS5UZXh0KCfmraXmlbDvvJowJywgMzAsIDMwKQpfc3RlcHMgPSB7J3N0ZXBzJyA6IDB9CnRpbWUuc2xlZXAoMSkKX0U3X0E3X0JCX0U1XzhBX0E4X0U2X0IxXzg5X0U4X0FGX0JBX0U1X0ExXzk0KDUsIEEsIEIsIEMpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第四单元/图4-3.mix b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第四单元/图4-3.mix new file mode 100644 index 00000000..25041992 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/北师大版教材示例代码/五下第四单元/图4-3.mix @@ -0,0 +1 @@ +3ACABCBACBABCAC{}aW1wb3J0IHRpbWUKaW1wb3J0IHNwcml0ZQoKCnNwcml0ZS5jbGVhckFsbFNwcml0ZXMoKQpfSGFub2ljb2xvciA9IFsnYmx1ZScsICdyZWQnLCAneWVsbG93JywgJ2dyZWVuJywgJ3B1cnBsZScsICdibGFjayddCl9IYW5vaSA9IFtbXSwgW10sIFtdXQpBID0gMApCID0gMQpDID0gMgpfbiA9IDMKX0hhbm9pQ29sdW1uID0gWwogICAgc3ByaXRlLlNwcml0ZSgnSGFub2lDb2x1bW4nLCAyMDAsIDMyMCksCiAgICBzcHJpdGUuU3ByaXRlKCdIYW5vaUNvbHVtbicsIDQwMCwgMzIwKSwKICAgIHNwcml0ZS5TcHJpdGUoJ0hhbm9pQ29sdW1uJywgNjAwLCAzMjApCl0KX0hhbm9pQ29sdW1uTnVtYmVyID0gWwogICAgc3ByaXRlLlRleHQoJ0EnLCAxOTAsIDEyMCksCiAgICBzcHJpdGUuVGV4dCgnQicsIDM5MCwgMTIwKSwKICAgIHNwcml0ZS5UZXh0KCdDJywgNTkwLCAxMjApCl0KX0hhbm9pQmxvY2sgPSBbXQpmb3IgaSBpbiByYW5nZSgwLCBfbiwgMSk6CiAgICBfSGFub2lCbG9jay5hcHBlbmQoc3ByaXRlLlNwcml0ZShfSGFub2ljb2xvcltpXSwgMjAwLCA0MDAtKF9uLWktMSkqMjcpKQogICAgX0hhbm9pQmxvY2tbaV0uc2V0U2NhbGUoMjUsIDMwKmkrMzApCiAgICBfSGFub2lbMF0uaW5zZXJ0KDAsIF9IYW5vaUJsb2NrW2ldKQpfc3RlcHRleHQgPSBzcHJpdGUuVGV4dCgn5q2l5pWw77yaMCcsIDMwLCAzMCkKX3N0ZXBzID0geydzdGVwcycgOiAwfQp0aW1lLnNsZWVwKDEpCmlmIGxlbihfSGFub2lbQV0pPjAgOgogICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtBXS5wb3AoKQogICAgaWYgbGVuKF9IYW5vaVtDXSkgPiAwIDoKICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbQ10ucG9wKCkKICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICBleGl0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfSGFub2lbQ10uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhBKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEMqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQyoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtDXSkqMjcsIDAuMikKICAgIF9IYW5vaVtDXS5hcHBlbmQoX0hhbm9pQmxvY2tNb3ZlZCkKICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKZWxzZSA6CiAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgIGV4aXQoKQppZiBsZW4oX0hhbm9pW0FdKT4wIDoKICAgIF9IYW5vaUJsb2NrTW92ZWQgPSBfSGFub2lbQV0ucG9wKCkKICAgIGlmIGxlbihfSGFub2lbQl0pID4gMCA6CiAgICAgICAgX0hhbm9pQmxvY2tTdXBwcmVzc2VkID0gX0hhbm9pW0JdLnBvcCgpCiAgICAgICAgaWYgX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tNb3ZlZCkgPiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja1N1cHByZXNzZWQpOgogICAgICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX0hhbm9pW0JdLmFwcGVuZChfSGFub2lCbG9ja1N1cHByZXNzZWQpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQSoyMDArMjAwLCAxODAsIDAuMikKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhCKjIwMCsyMDAsIDE4MCwgMC41KQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEIqMjAwKzIwMCwgNDAwLWxlbihfSGFub2lbQl0pKjI3LCAwLjIpCiAgICBfSGFub2lbQl0uYXBwZW5kKF9IYW5vaUJsb2NrTW92ZWQpCiAgICBfc3RlcHNbJ3N0ZXBzJ10gKz0gMQogICAgX3N0ZXB0ZXh0LmNoYW5nZVRleHQoJ+atpeaVsO+8micrc3RyKF9zdGVwc1snc3RlcHMnXSkpCmVsc2UgOgogICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICBleGl0KCkKaWYgbGVuKF9IYW5vaVtDXSk+MCA6CiAgICBfSGFub2lCbG9ja01vdmVkID0gX0hhbm9pW0NdLnBvcCgpCiAgICBpZiBsZW4oX0hhbm9pW0JdKSA+IDAgOgogICAgICAgIF9IYW5vaUJsb2NrU3VwcHJlc3NlZCA9IF9IYW5vaVtCXS5wb3AoKQogICAgICAgIGlmIF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrTW92ZWQpID4gX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKToKICAgICAgICAgICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICAgICAgICAgIGV4aXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9IYW5vaVtCXS5hcHBlbmQoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEMqMjAwKzIwMCwgMTgwLCAwLjIpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQioyMDArMjAwLCAxODAsIDAuNSkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhCKjIwMCsyMDAsIDQwMC1sZW4oX0hhbm9pW0JdKSoyNywgMC4yKQogICAgX0hhbm9pW0JdLmFwcGVuZChfSGFub2lCbG9ja01vdmVkKQogICAgX3N0ZXBzWydzdGVwcyddICs9IDEKICAgIF9zdGVwdGV4dC5jaGFuZ2VUZXh0KCfmraXmlbDvvJonK3N0cihfc3RlcHNbJ3N0ZXBzJ10pKQplbHNlIDoKICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgZXhpdCgpCmlmIGxlbihfSGFub2lbQV0pPjAgOgogICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtBXS5wb3AoKQogICAgaWYgbGVuKF9IYW5vaVtDXSkgPiAwIDoKICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbQ10ucG9wKCkKICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICBleGl0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfSGFub2lbQ10uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhBKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEMqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQyoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtDXSkqMjcsIDAuMikKICAgIF9IYW5vaVtDXS5hcHBlbmQoX0hhbm9pQmxvY2tNb3ZlZCkKICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKZWxzZSA6CiAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgIGV4aXQoKQppZiBsZW4oX0hhbm9pW0JdKT4wIDoKICAgIF9IYW5vaUJsb2NrTW92ZWQgPSBfSGFub2lbQl0ucG9wKCkKICAgIGlmIGxlbihfSGFub2lbQV0pID4gMCA6CiAgICAgICAgX0hhbm9pQmxvY2tTdXBwcmVzc2VkID0gX0hhbm9pW0FdLnBvcCgpCiAgICAgICAgaWYgX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tNb3ZlZCkgPiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja1N1cHByZXNzZWQpOgogICAgICAgICAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX0hhbm9pW0FdLmFwcGVuZChfSGFub2lCbG9ja1N1cHByZXNzZWQpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQioyMDArMjAwLCAxODAsIDAuMikKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhBKjIwMCsyMDAsIDE4MCwgMC41KQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEEqMjAwKzIwMCwgNDAwLWxlbihfSGFub2lbQV0pKjI3LCAwLjIpCiAgICBfSGFub2lbQV0uYXBwZW5kKF9IYW5vaUJsb2NrTW92ZWQpCiAgICBfc3RlcHNbJ3N0ZXBzJ10gKz0gMQogICAgX3N0ZXB0ZXh0LmNoYW5nZVRleHQoJ+atpeaVsO+8micrc3RyKF9zdGVwc1snc3RlcHMnXSkpCmVsc2UgOgogICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICBleGl0KCkKaWYgbGVuKF9IYW5vaVtCXSk+MCA6CiAgICBfSGFub2lCbG9ja01vdmVkID0gX0hhbm9pW0JdLnBvcCgpCiAgICBpZiBsZW4oX0hhbm9pW0NdKSA+IDAgOgogICAgICAgIF9IYW5vaUJsb2NrU3VwcHJlc3NlZCA9IF9IYW5vaVtDXS5wb3AoKQogICAgICAgIGlmIF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrTW92ZWQpID4gX0hhbm9pQmxvY2suaW5kZXgoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKToKICAgICAgICAgICAgcHJpbnQoJ+mdnuazleenu+WKqO+8geeoi+W6j+acieivr++8gScpCiAgICAgICAgICAgIGV4aXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9IYW5vaVtDXS5hcHBlbmQoX0hhbm9pQmxvY2tTdXBwcmVzc2VkKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEIqMjAwKzIwMCwgMTgwLCAwLjIpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQyoyMDArMjAwLCAxODAsIDAuNSkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhDKjIwMCsyMDAsIDQwMC1sZW4oX0hhbm9pW0NdKSoyNywgMC4yKQogICAgX0hhbm9pW0NdLmFwcGVuZChfSGFub2lCbG9ja01vdmVkKQogICAgX3N0ZXBzWydzdGVwcyddICs9IDEKICAgIF9zdGVwdGV4dC5jaGFuZ2VUZXh0KCfmraXmlbDvvJonK3N0cihfc3RlcHNbJ3N0ZXBzJ10pKQplbHNlIDoKICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgZXhpdCgpCmlmIGxlbihfSGFub2lbQV0pPjAgOgogICAgX0hhbm9pQmxvY2tNb3ZlZCA9IF9IYW5vaVtBXS5wb3AoKQogICAgaWYgbGVuKF9IYW5vaVtDXSkgPiAwIDoKICAgICAgICBfSGFub2lCbG9ja1N1cHByZXNzZWQgPSBfSGFub2lbQ10ucG9wKCkKICAgICAgICBpZiBfSGFub2lCbG9jay5pbmRleChfSGFub2lCbG9ja01vdmVkKSA+IF9IYW5vaUJsb2NrLmluZGV4KF9IYW5vaUJsb2NrU3VwcHJlc3NlZCk6CiAgICAgICAgICAgIHByaW50KCfpnZ7ms5Xnp7vliqjvvIHnqIvluo/mnInor6/vvIEnKQogICAgICAgICAgICBleGl0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfSGFub2lbQ10uYXBwZW5kKF9IYW5vaUJsb2NrU3VwcHJlc3NlZCkKICAgIF9IYW5vaUJsb2NrTW92ZWQuc2xpZGVUbyhBKjIwMCsyMDAsIDE4MCwgMC4yKQogICAgX0hhbm9pQmxvY2tNb3ZlZC5zbGlkZVRvKEMqMjAwKzIwMCwgMTgwLCAwLjUpCiAgICBfSGFub2lCbG9ja01vdmVkLnNsaWRlVG8oQyoyMDArMjAwLCA0MDAtbGVuKF9IYW5vaVtDXSkqMjcsIDAuMikKICAgIF9IYW5vaVtDXS5hcHBlbmQoX0hhbm9pQmxvY2tNb3ZlZCkKICAgIF9zdGVwc1snc3RlcHMnXSArPSAxCiAgICBfc3RlcHRleHQuY2hhbmdlVGV4dCgn5q2l5pWw77yaJytzdHIoX3N0ZXBzWydzdGVwcyddKSkKZWxzZSA6CiAgICBwcmludCgn6Z2e5rOV56e75Yqo77yB56iL5bqP5pyJ6K+v77yBJykKICAgIGV4aXQoKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第12课判断闰年.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第12课判断闰年.mix new file mode 100644 index 00000000..6344357e --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第12课判断闰年.mix @@ -0,0 +1 @@ +yearint请输入一个年份:ANDEQQUYU1year40NEQQUYU1year1000year是闰年EQQUYU1year4000year是闰年year是平年{}eWVhciA9IGludChpbnB1dCgn6K+36L6T5YWl5LiA5Liq5bm05Lu977yaJykpCmlmIHllYXIgJSA0ID09IDAgYW5kIHllYXIgJSAxMDAgIT0gMDoKICAgIHByaW50KHllYXIsICfmmK/pl7DlubQnKQplbGlmIHllYXIgJSA0MDAgPT0gMDoKICAgIHByaW50KHllYXIsICfmmK/pl7DlubQnKQplbHNlOgogICAgcHJpbnQoeWVhciwgJ+aYr+W5s+W5tCcpCg== \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数1.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数1.mix new file mode 100644 index 00000000..127e553b --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数1.mix @@ -0,0 +1 @@ +start_timei1WHILETRUELTEi1000HelloiiADD1i1end_time输出1~1000所花时间为MINUS1end_time1start_time{}aW1wb3J0IHRpbWUKCgpzdGFydF90aW1lID0gdGltZS50aW1lKCkKaSA9IDEKd2hpbGUgaSA8PSAxMDAwOgogICAgcHJpbnQoaSkKICAgIGkgPSBpICsgMQplbmRfdGltZSA9IHRpbWUudGltZSgpCnByaW50KCfovpPlh7oxfjEwMDDmiYDoirHml7bpl7TkuLonLCBlbmRfdGltZSAtIHN0YXJ0X3RpbWUsICfnp5InKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数2.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数2.mix new file mode 100644 index 00000000..4e01533e --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第13课让计算机会数数2.mix @@ -0,0 +1 @@ +start_timei1sum0WHILETRUELTEi1000000sumADD1sum1iiADD1i11+2+……+1000000=sumend_time累加1~1000000所花时间为MINUS1end_time1start_time{}aW1wb3J0IHRpbWUKCgpzdGFydF90aW1lID0gdGltZS50aW1lKCkKaSA9IDEKc3VtMiA9IDAKd2hpbGUgaSA8PSAxMDAwMDAwOgogICAgc3VtMiA9IHN1bTIgKyBpCiAgICBpID0gaSArIDEKcHJpbnQoJzErMivigKbigKYrMTAwMDAwMD0nLCBzdW0yKQplbmRfdGltZSA9IHRpbWUudGltZSgpCnByaW50KCfntK/liqAxfjEwMDAwMDDmiYDoirHml7bpl7TkuLonLCBlbmRfdGltZSAtIHN0YXJ0X3RpbWUsICfnp5InKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第14课for循环.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第14课for循环.mix new file mode 100644 index 00000000..928e1e83 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第14课for循环.mix @@ -0,0 +1 @@ +'welcome','to','our','world'strHellostr{}Zm9yIHN0cjIgaW4gWyd3ZWxjb21lJywndG8nLCdvdXInLCd3b3JsZCddOgogICAgcHJpbnQoc3RyMixlbmQgPSIiKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第14课趣味数玩具.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第14课趣味数玩具.mix new file mode 100644 index 00000000..f1d210d5 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第14课趣味数玩具.mix @@ -0,0 +1 @@ +n101WHILETRUELTEn200ANDEQQUYU1n53EQQUYU1n72符合条件的玩具数量:nnADD1n3{}biA9IDEwMQp3aGlsZSBuIDw9IDIwMDoKICAgIGlmIG4gJSA1ID09IDMgYW5kIG4gJSA3ID09IDI6CiAgICAgICAgcHJpbnQoJ+espuWQiOadoeS7tueahOeOqeWFt+aVsOmHj++8micsIG4pCiAgICBuID0gbiArIDMK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第15课破译密码.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第15课破译密码.mix new file mode 100644 index 00000000..a484d4bb --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第15课破译密码.mix @@ -0,0 +1 @@ +tint请输入密码每一位符号种类数:nPOWER1t8nsecDIVIDE1n5800000secminDIVIDE1sec60hourDIVIDE1min60dayDIVIDE1hour24yearDIVIDE1day365共需要year年破解此密码{}dCA9IGludChpbnB1dCgn6K+36L6T5YWl5a+G56CB5q+P5LiA5L2N56ym5Y+356eN57G75pWw77yaJykpCm4gPSB0ICoqIDgKcHJpbnQoJ+WFsScsIG4sICfnp40nKQpzZWMgPSBuIC8gNTgwMDAwMApwcmludCgn5YWxJywgc2VjLCAn56eSJykKbWluMiA9IHNlYyAvIDYwCmhvdXIgPSBtaW4yIC8gNjAKZGF5ID0gaG91ciAvIDI0CnllYXIgPSBkYXkgLyAzNjUKcHJpbnQoJ+WFsemcgOimgScsIHllYXIsICflubTnoLTop6PmraTlr4bnoIEnKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第8课动物园购票.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第8课动物园购票.mix new file mode 100644 index 00000000..2fdd942b --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第8课动物园购票.mix @@ -0,0 +1 @@ +heightfloat请输入您的身高(米):LTheight1.2您的身高为:height米,免票您的身高为:height米,可以购买半价票{}aGVpZ2h0ID0gZmxvYXQoaW5wdXQoJ+ivt+i+k+WFpeaCqOeahOi6q+mrmO+8iOexs++8ie+8micpKQppZiBoZWlnaHQgPCAxLjI6CiAgICBwcmludCgn5oKo55qE6Lqr6auY5Li677yaJywgaGVpZ2h0LCAn57Gz77yM5YWN56WoJykKZWxzZToKICAgIHByaW50KCfmgqjnmoTouqvpq5jkuLrvvJonLCBoZWlnaHQsICfnsbPvvIzlj6/ku6XotK3kubDljYrku7fnpagnKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第8课计算购书费.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第8课计算购书费.mix new file mode 100644 index 00000000..13ccd426 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/上册/第8课计算购书费.mix @@ -0,0 +1 @@ +aint输入科普书的册数:hMULTIPLY1a8bint输入故事书的册数:jMULTIPLY1b9sADD1h9j购书费用是:s{}YSA9IGludChpbnB1dCgn6L6T5YWl56eR5pmu5Lmm55qE5YaM5pWw77yaJykpCmggPSBhICogOApiID0gaW50KGlucHV0KCfovpPlhaXmlYXkuovkuabnmoTlhozmlbDvvJonKSkKaiA9IGIgKiA5CnMgPSBoICsgagpwcmludCgn6LSt5Lmm6LS555So5piv77yaJywgcykK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第12课网页排名算法.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第12课网页排名算法.mix new file mode 100644 index 00000000..9dfca5d2 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第12课网页排名算法.mix @@ -0,0 +1 @@ +page'C','D''A','C','D''B''A','B','C'links0,0,0,0wangy0WHILETRUELTwangyLENmylistlinkslinkedmylistpage0wangyin'A'A0,1,2,3linkedmylistlinks00ADD1mylistlinks01in'B'B0,1,2,3linkedmylistlinks10ADD1mylistlinks11in'C'C0,1,2,3linkedmylistlinks20ADD1mylistlinks21in'D'D0,1,2,3linkedmylistlinks30ADD1mylistlinks31wangyADD1wangy1Hellolinksmost1INDEXmylistlinks0MAXmylistlinksmost265ADD1most11AHellomost2{}aW1wb3J0IG1hdGgKCgpwYWdlID0gW1snQycsJ0QnXSwgWydBJywnQycsJ0QnXSwgWydCJ10sIFsnQScsJ0InLCdDJ11dCmxpbmtzID0gWzAsMCwwLDBdCndhbmd5ID0gMAp3aGlsZSB3YW5neSA8IGxlbihsaW5rcyk6CiAgICBsaW5rZWQgPSBwYWdlW3dhbmd5XQogICAgaWYgJ0EnIGluIGxpbmtlZDoKICAgICAgICBsaW5rc1swXSA9IGxpbmtzWzBdICsgMQogICAgaWYgJ0InIGluIGxpbmtlZDoKICAgICAgICBsaW5rc1sxXSA9IGxpbmtzWzFdICsgMQogICAgaWYgJ0MnIGluIGxpbmtlZDoKICAgICAgICBsaW5rc1syXSA9IGxpbmtzWzJdICsgMQogICAgaWYgJ0QnIGluIGxpbmtlZDoKICAgICAgICBsaW5rc1szXSA9IGxpbmtzWzNdICsgMQogICAgd2FuZ3kgPSB3YW5neSArIDEKcHJpbnQobGlua3MpCm1vc3QxID0gbGlua3MuaW5kZXgobWF4KGxpbmtzKSkKbW9zdDIgPSBjaHIoKG1vc3QxICsgb3JkKCdBJykpKQpwcmludChtb3N0MikK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第1课比较交换找最大值.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第1课比较交换找最大值.mix new file mode 100644 index 00000000..3b4328d8 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第1课比较交换找最大值.mix @@ -0,0 +1 @@ +num17,19,15,20,19ccLENnumanum0i1WHILETRUELTiccGTnum0iaanum0iiADD1i1最大数为a{}aW1wb3J0IG1hdGgKCgpudW0gPSBbMTcsMTksMTUsMjAsMTldCmNjID0gbGVuKG51bSkKYSA9IG51bVswXQppID0gMQp3aGlsZSBpIDwgY2M6CiAgICBpZiBudW1baV0gPiBhOgogICAgICAgIGEgPSBudW1baV0KICAgIGkgPSBpICsgMQpwcmludCgn5pyA5aSn5pWw5Li6JywgYSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第2课选择排序(未要求代码).mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第2课选择排序(未要求代码).mix new file mode 100644 index 00000000..a46bb53d --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第2课选择排序(未要求代码).mix @@ -0,0 +1 @@ +data64,25,12,22,11,90,88,77,55,33nLENmylistdatai0WHILETRUELTiMINUS1n1maxijADD1i1WHILETRUELTjnGTmylistdata0jmylistdata0maxmaxjjADD1j1NEQmaxiamylistdata0maxmylistdata0max0mylistdata0imylistdata0i0aiADD1i1排序后的数:data{}aW1wb3J0IG1hdGgKCgpkYXRhID0gWzY0LDI1LDEyLDIyLDExLDkwLDg4LDc3LDU1LDMzXQpuID0gbGVuKGRhdGEpCmkgPSAwCndoaWxlIGkgPCBuIC0gMToKICAgIG1heDIgPSBpCiAgICBqID0gaSArIDEKICAgIHdoaWxlIGogPCBuOgogICAgICAgIGlmIGRhdGFbal0gPiBkYXRhW21heDJdOgogICAgICAgICAgICBtYXgyID0gagogICAgICAgIGogPSBqICsgMQogICAgaWYgbWF4MiAhPSBpOgogICAgICAgIGEgPSBkYXRhW21heDJdCiAgICAgICAgZGF0YVttYXgyXSA9IGRhdGFbaV0KICAgICAgICBkYXRhW2ldID0gYQogICAgaSA9IGkgKyAxCnByaW50KCfmjpLluo/lkI7nmoTmlbDvvJonLCBkYXRhKQo= \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第4课冒泡排序.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第4课冒泡排序.mix new file mode 100644 index 00000000..dbc1dfa6 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第4课冒泡排序.mix @@ -0,0 +1 @@ +data470,411,589,364,516排序前数据:datanLENmylistdatai0WHILETRUELTiMINUS1n1j0WHILETRUELTjMINUS1MINUS1n1i1GTmylistdata0jmylistdata0ADD1j1amylistdata0jmylistdata0j0mylistdata0ADD1j1mylistdata0ADD1j10ajADD1j1ADD1i1轮遍历:dataiADD1i1排序后数据:data{}aW1wb3J0IG1hdGgKCgpkYXRhID0gWzQ3MCw0MTEsNTg5LDM2NCw1MTZdCnByaW50KCfmjpLluo/liY3mlbDmja7vvJonLCBkYXRhKQpuID0gbGVuKGRhdGEpCmkgPSAwCndoaWxlIGkgPCBuIC0gMToKICAgIGogPSAwCiAgICB3aGlsZSBqIDwgKG4gLSBpKSAtIDE6CiAgICAgICAgaWYgZGF0YVtqXSA+IGRhdGFbKGogKyAxKV06CiAgICAgICAgICAgIGEgPSBkYXRhW2pdCiAgICAgICAgICAgIGRhdGFbal0gPSBkYXRhWyhqICsgMSldCiAgICAgICAgICAgIGRhdGFbKGogKyAxKV0gPSBhCiAgICAgICAgaiA9IGogKyAxCiAgICAgICAgcHJpbnQoJ+esrCcsIGkgKyAxLCAn6L2u6YGN5Y6G77yaJywgZGF0YSkKICAgIGkgPSBpICsgMQpwcmludCgn5o6S5bqP5ZCO5pWw5o2u77yaJywgZGF0YSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第6课用算数求解鸡兔同笼.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第6课用算数求解鸡兔同笼.mix new file mode 100644 index 00000000..de4e3e6b --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第6课用算数求解鸡兔同笼.mix @@ -0,0 +1 @@ +aint一共有多少个头:bint一共有多少只脚:cDIVIDE1MINUS1MULTIPLY1a41b2鸡有:intxc兔有:intxMINUS1a4c{}YSA9IGludChpbnB1dCgn5LiA5YWx5pyJ5aSa5bCR5Liq5aS077yaJykpCmIgPSBpbnQoaW5wdXQoJ+S4gOWFseacieWkmuWwkeWPquiEmu+8micpKQpjID0gKGEgKiA0IC0gYikgLyAyCnByaW50KCfpuKHmnInvvJonLCBpbnQoYyksICflj6onKQpwcmludCgn5YWU5pyJ77yaJywgaW50KChhIC0gYykpLCAn5Y+qJykK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第6课遍历求解鸡兔同笼.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第6课遍历求解鸡兔同笼.mix new file mode 100644 index 00000000..b42142d9 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第6课遍历求解鸡兔同笼.mix @@ -0,0 +1 @@ +a35b0WHILETRUEcADD1MULTIPLY1a21MULTIPLY1b4EQc94鸡的数量:a兔的数量:bBREAKaMINUS1a1bADD1b1{}YSA9IDM1CmIgPSAwCndoaWxlIFRydWU6CiAgICBjID0gYSAqIDIgKyBiICogNAogICAgaWYgYyA9PSA5NDoKICAgICAgICBwcmludCgn6bih55qE5pWw6YeP77yaJywgYSkKICAgICAgICBwcmludCgn5YWU55qE5pWw6YeP77yaJywgYikKICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICBhID0gYSAtIDEKICAgICAgICBiID0gYiArIDEK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第7课兔子增长算法.mix b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第7课兔子增长算法.mix new file mode 100644 index 00000000..fad3bb93 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/origin/examples/大同出版社-五年级/下册/第7课兔子增长算法.mix @@ -0,0 +1 @@ +F0,1,1n3WHILETRUELTEn12appendF0F0n0ADD1F0MINUS1n11F0MINUS1n2nADD1n1第12个月的兔子数量是:F12{}RiA9IFswLDEsMV0KbiA9IDMKd2hpbGUgbiA8PSAxMjoKICAgIEYuYXBwZW5kKDApCiAgICBGW25dID0gRlsobiAtIDEpXSArIEZbKG4gLSAyKV0KICAgIG4gPSBuICsgMQpwcmludCgn56ysMTLkuKrmnIjnmoTlhZTlrZDmlbDph4/mmK/vvJonLCBGWzEyXSkK \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/origin/media/webpy.png b/mixly/boards/default_src/python_skulpt/origin/media/webpy.png new file mode 100644 index 00000000..ce0e40cd Binary files /dev/null and b/mixly/boards/default_src/python_skulpt/origin/media/webpy.png differ diff --git a/mixly/boards/default_src/python_skulpt/origin/media/webpy0.png b/mixly/boards/default_src/python_skulpt/origin/media/webpy0.png new file mode 100644 index 00000000..14da1b69 Binary files /dev/null and b/mixly/boards/default_src/python_skulpt/origin/media/webpy0.png differ diff --git a/mixly/boards/default_src/python_skulpt/others/loader.js b/mixly/boards/default_src/python_skulpt/others/loader.js new file mode 100644 index 00000000..fb200605 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/loader.js @@ -0,0 +1,3 @@ +import NavExt from './nav-ext'; + +NavExt.init(); \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/others/mixpy-project.js b/mixly/boards/default_src/python_skulpt/others/mixpy-project.js new file mode 100644 index 00000000..c5bf144b --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/mixpy-project.js @@ -0,0 +1,97 @@ +export default class MixpyProject { + constructor() { + this.initProject(); + } + + initProject() { + this.fileD = {}; + this.MAINF = 'main.py'; + this.fileD[this.MAINF] = ["", true, 1]; + this.selectFile = this.MAINF; + } + + add(file, filecontent, filetype) { + if (this.exist(file)) { + console.log("Warning:file already in project"); + return; + } + this.fileD[file] = [filecontent, false, filetype]; + } + + delete(file) { + delete this.fileD[file]; + this.selectFile = undefined; + } + + getProject() { + return Object.keys(this.fileD); + } + + getUploadFileList() { + var fileNameList = Object.keys(this.fileD); + var ret = []; + for (var i in fileNameList) { + if (this.fileD[fileNameList[i]][2] === 2) + ret.push(fileNameList[i]); + } + return ret; + } + + getNewFileList() { + var fileNameList = Object.keys(this.fileD); + var ret = []; + for (var i in fileNameList) { + if (this.fileD[fileNameList[i]][2] === 1) + ret.push(fileNameList[i]); + } + return ret; + } + + isSelect(f) { + return this.fileD[f][1]; + } + + select(f) { + // if (this.selectFile !== undefined) { + // this.modify(this.selectFile, mixlyjs.getCodeContent()); + // this.fileD[this.selectFile][1] = false; + // } + this.fileD[f][1] = true; + // this.selectFile = f; + // var suffix = mixlyjs.getFileSuffix(f); + // var textFileSuffix = ["py", "txt", "csv", "xml"]; + // if (textFileSuffix.indexOf(suffix) !== -1) { + // tabClick('arduino'); + // mixlyjs.renderIno(this.fileD[f][0]); + // } else { + // var base64str = 'data:image/' + suffix + ';base64,' + this.fileD[f][0]; + // $('#mixpy_show_image').attr('src', base64str); + // mixlyjs.renderIno(this.fileD[f][0]); + // tabClick('image'); + // var $imageA = $('#mixpy_link_image'); + // $imageA.attr('href', base64str); + // $imageA.attr('download', f); + // } + } + + getFileNum() { + var files = Object.keys(this.fileD); + return files.length; + } + + getFileContent(f) { + return this.fileD[f][0]; + } + + getFileType(f) { + return this.fileD[f][2]; + } + + modify(f, content) { + this.fileD[f][0] = content; + } + + exist(f) { + return f in this.fileD; + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/others/nav-ext.js b/mixly/boards/default_src/python_skulpt/others/nav-ext.js new file mode 100644 index 00000000..52aabb33 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/nav-ext.js @@ -0,0 +1,42 @@ +import { app, Nav, Debug } from 'mixly'; +import * as Blockly from 'blockly/core'; +import PythonShell from './python-shell'; + +const NavExt = {}; + +NavExt.init = function () { + PythonShell.init(); + const nav = app.getNav(); + + nav.register({ + icon: 'icon-play-circled', + title: '', + id: 'python-run-btn', + displayText: Blockly.Msg.MSG['run'], + preconditionFn: () => { + return true; + }, + callback: () => { + PythonShell.run().catch(Debug.error); + }, + scopeType: Nav.Scope.LEFT, + weight: 4 + }); + + nav.register({ + icon: 'icon-cancel', + title: '', + id: 'python-stop-btn', + displayText: Blockly.Msg.MSG['stop'], + preconditionFn: () => { + return true; + }, + callback: () => { + PythonShell.stop().catch(Debug.error); + }, + scopeType: Nav.Scope.LEFT, + weight: 5 + }); +} + +export default NavExt; \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/others/py-engine.js b/mixly/boards/default_src/python_skulpt/others/py-engine.js new file mode 100644 index 00000000..0066fee1 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/py-engine.js @@ -0,0 +1,816 @@ +/* eslint-disable new-cap */ +import Sk from './skulpt/skulpt'; +import { Events, Debug } from 'mixly'; +import MIXPY_TEMPLATE from '../templates/python/mixpy.py'; +import NUMPY_URL from '../others/skulpt/libs/numpy/__init__.js?url'; +import PYGAL_URL from '../others/skulpt/libs/pygal/__init__.js?url'; +import MATPLOTLIB_URL from '../others/skulpt/libs/matplotlib/__init__.js?url'; +import PYPLOT_URL from '../others/skulpt/libs/pyplot/__init__.js?url'; +import PGZHELPER_URL from '../others/skulpt/libs/pgzhelper/pgzhelper.js?url'; +import SPRITE_URL from '../others/skulpt/libs/sprite/basic.js?url'; + + +// 外部引入的第三方库 +const externalLibs = { + './numpy/__init__.js': NUMPY_URL, + './pygal/__init__.js': PYGAL_URL, + './matplotlib/__init__.js': MATPLOTLIB_URL, + './matplotlib/pyplot/__init__.js': PYPLOT_URL, + './pgzhelper/__init__.js': PGZHELPER_URL, + './sprite/__init__.js': SPRITE_URL +}; + +var GLOBAL_VALUE; + +function prettyPrintError(error) { + if (typeof error === "string") { + return error; + } + // A weird skulpt thing? + if (error.tp$str !== undefined) { + return error.tp$str().v; + } + return "" + error.name + ": " + error.message; +} + +export default class PyEngine { + #events_ = new Events(['input', 'output', 'display', 'finished', 'error']); + + constructor(programStatus, mixpyProject) { + this.programStatus = programStatus; + this.mixpyProject = mixpyProject; + /** + * Definable function to be run when execution has fully ended, + * whether it succeeds or fails. + * + */ + this.onExecutionEnd = null; + } + + getEvents() { + return this.#events_; + } + + /** + * Helper function that will attempt to call the defined onExecutionEnd, + * but will do nothing if there is no function defined. + */ + executionEnd_() { + if (this.onExecutionEnd !== null) { + this.onExecutionEnd(); + } + } + + /** + * Initializes the Python Execution engine and the Printer (console). + */ + loadEngine(container) { + Sk.__future__ = Sk.python3; + // No connected services + Sk.connectedServices = {}; + // No time limit + //Sk.execLimit = null; + // Ensure version 3, so we get proper print handling + // Sk.python3 = true; + //输出海龟画图图片 + //如果需要输出pygame_zero场景,需要重新设置 + Sk.TurtleGraphics = { + target: container, + width: 500, + height: 500 + }; + + //数据分析显示图片 + Sk.MatPlotLibGraphics = { + target: container, + width: 500, + height: 500 + }; + // TODO + //Sk.console = printer.getConfiguration(); + // Definitely use a prompt + Sk.inputfunTakesPrompt = true; + + // Keeps track of the tracing while the program is executing; destroyed afterwards. + this.executionBuffer = {}; + + Sk.domOutput = (html) => { + const dom = this.#events_.on('display', html)[0]; + return dom; + }; + + Sk.configure({ + //设置文本输出 + output: (lineText) => { + this.#events_.run('output', { + content: lineText + }); + }, + // Function to handle loading in new files + read: this.readFile.bind(this), + inputfun: this.skInput.bind(this), + inputfunTakesPrompt: true, + execLimit: Number.POSITIVE_INFINITY, + fileread: this.fileread.bind(this), + filewrite: this.filewrite.bind(this), + __future__: Sk.python3, //python3已成默认值,要使用python2需要单独设置 + }); + + Sk.builtins.value = new Sk.builtin.func(function () { + return Sk.ffi.remapToPy(GLOBAL_VALUE === undefined ? 5 : GLOBAL_VALUE); + }); + Sk.builtins.set_value = new Sk.builtin.func(function (v) { + GLOBAL_VALUE = v.v; + }); + + Sk.builtinFiles.files['./mixpy.py'] = MIXPY_TEMPLATE; + } + + /** + * Used to access Skulpt built-ins. This is pretty generic, taken + * almost directly from the Skulpt docs. + * + * @param {String} filename - The python filename (e.g., "os" or "pprint") that will be loaded. + * @returns {String} The JavaScript source code of the file (weird, right?) + * @throws Will throw an error if the file isn't found. + */ + readFile(file) { + // console.log("Attempting file: " + Sk.ffi.remapToJs(file)); + // 加载模块 + // if (PyGameZero.matchModelName(file)) { + // return PyGameZero.load(file); + // } + if (externalLibs[file] !== undefined) { + return Sk.misceval.promiseToSuspension(fetch(externalLibs[file]).then((resp) => resp.text())); + } + if (Sk.builtinFiles === undefined || Sk.builtinFiles.files[file] === undefined) { + throw "File not found: '" + file + "'"; + } + return Sk.builtinFiles.files[file]; + } + + fileread(filename, mode) { + if (this.mixpyProject.exist(filename)) { + return this.mixpyProject.getFileContent(filename); + } + if (mode.indexOf('w') !== -1) { + this.mixpyProject.add(filename, '', 1); + return ''; + } + return null; + } + + filewrite(fileItem, str) { + var filename = fileItem.name; + this.mixpyProject.modify(filename, str); + this.mixpyProject.select(filename); + } + + skInput(prompt) { + return new Promise((resolve, reject) => { + this.#events_.run('input', { + content: { + prompt + }, + resolve, reject + }); + }); + } + + /** + * Resets the state of the execution engine, including reinitailizing + * the execution buffer (trace, step, etc.), reseting the printer, and + * hiding the trace button. + * + */ + reset() { + Sk.execLimit = Number.POSITIVE_INFINITY; + Sk.TurtleGraphics.reset && Sk.TurtleGraphics.reset(); + } + + kill() { + // 新增了sprite相关内容 + window.SPRITE.kill(); + //点击取消按钮发送数据 + Sk.execLimit = 0; + this.executionEnd_(); + } + + /** + * "Steps" the execution of the code, meant to be used as a callback to the Skulpt + * environment. + * + * @param {Object} variables - Hash that maps the names of variables (Strings) to their Skulpt representation. + * @param {Number} lineNumber - The corresponding line number in the source code that is being executed. + * @param {Number} columnNumber - The corresponding column number in the source code that is being executed. Think of it as the "X" position to the lineNumber's "Y" position. + * @param {String} filename - The name of the python file being executed (e.g., "__main__.py"). + * @param {String} astType - Unused? TODO: What is this? + * @param {String} ast - String-encoded JSON representation of the AST node associated with this element. + */ + step(variables, lineNumber, + columnNumber, filename) { + if (filename == '.py') { + var currentStep = this.executionBuffer.step; + var globals = this.parseGlobals(variables); + this.executionBuffer.trace.push( + { + 'step': currentStep, + 'filename': filename, + //'block': highlightMap[lineNumber-1], + 'line': lineNumber, + 'column': columnNumber, + 'properties': globals.properties, + 'modules': globals.modules + } + ); + this.executionBuffer.step = currentStep + 1; + this.executionBuffer.last_step = currentStep + 1; + this.executionBuffer.line_number = lineNumber; + } + } + + /** + * Runs the AbstractInterpreter to get some static information about the code, + * in particular the variables' types. This is needed for type checking. + * + * @returns {Object} Maps variable names (as Strings) to types as constructed by the AbstractIntepreter. + */ + analyzeVariables() { + // Get the code + var code = this.main.model.programs['__main__'](); + if (code.trim() == "") { + return {}; + } + + // var analyzer = new AbstractInterpreter(code); + // report = analyzer.report; + // return analyzer.variableTypes; + } + + /** + * Runs the AbstractInterpreter to get some static information about the code, + * including potential semantic errors. It then parses that information to give + * feedback. + * + * @returns {Boolean} Whether the code was successfully analyzed. + */ + analyze() { + this.main.model.execution.status("analyzing"); + + // var feedback = this.main.components.feedback; + + // Get the code + var code = this.main.model.programs['__main__'](); + if (code.trim() == "") { + this.main.components.feedback.emptyProgram("You haven't written any code yet!"); + //this.main.model.feedback.status("semantic"); + return false; + } + + return true; + } + + /** + * Runs the given python code, resetting the console and Trace Table. + */ + run(code) { + // Reset everything + this.reset(); + if (code.indexOf('import sprite') !== -1 + || code.indexOf('from sprite import') !== -1) { + window.SPRITE.runit(Sk.TurtleGraphics.target); + } + this.programStatus['running'] = true; + Sk.misceval.asyncToPromise(() => Sk.importMainWithBody("", false, code, true)) + .then(() => { + window.SPRITE.running = false; + this.programStatus['running'] = false; + this.#events_.run('finished'); + }) + .catch((error) => { + Debug.error(error); + window.SPRITE.running = false; + this.programStatus['running'] = false; + this.#events_.run('error', error); + var original = prettyPrintError(error); + this.#events_.run('finished'); + //hack for kill program with time limiterror + if (original.indexOf("TimeLimitError") !== -1) { + return; + } + this.executionEnd_(); + }); + } + + setupEnvironment(student_code, traceTable, output, ast, final_values) { + var model = this.main.model; + this._backup_execution = Sk.afterSingleExecution; + Sk.afterSingleExecution = undefined; + Sk.builtins.get_output = new Sk.builtin.func(function () { + Sk.builtin.pyCheckArgs("get_output", arguments, 0, 0); + return Sk.ffi.remapToPy(model.execution.output()); + }); + Sk.builtins.reset_output = new Sk.builtin.func(function () { + Sk.builtin.pyCheckArgs("reset_output", arguments, 0, 0); + model.execution.output.removeAll(); + }); + Sk.builtins.log = new Sk.builtin.func(function (data) { + Sk.builtin.pyCheckArgs("log", arguments, 1, 1); + console.log(data); + }); + //Sk.builtins.trace = Sk.ffi.remapToPy(traceTable); + Sk.builtins._trace = traceTable; + Sk.builtins._final_values = final_values; + Sk.builtins.code = Sk.ffi.remapToPy(student_code); + Sk.builtins.set_success = this.instructor_module.set_success; + Sk.builtins.set_feedback = this.instructor_module.set_feedback; + Sk.builtins.set_finished = this.instructor_module.set_finished; + Sk.builtins.count_components = this.instructor_module.count_components; + Sk.builtins.no_nonlist_nums = this.instructor_module.no_nonlist_nums; + Sk.builtins.only_printing_properties = this.instructor_module.only_printing_properties; + Sk.builtins.calls_function = this.instructor_module.calls_function; + Sk.builtins.get_property = this.instructor_module.get_property; + Sk.builtins.get_value_by_name = this.instructor_module.get_value_by_name; + Sk.builtins.get_value_by_type = this.instructor_module.get_value_by_type; + Sk.builtins.parse_json = this.instructor_module.parse_json; + Sk.skip_drawing = true; + model.settings.mute_printer(true); + } + + disposeEnvironment() { + Sk.afterSingleExecution = this._backup_execution; + Sk.builtins.get_output = undefined; + Sk.builtins.reset_output = undefined; + Sk.builtins.log = undefined; + Sk.builtins._trace = undefined; + Sk.builtins.trace = undefined; + Sk.builtins.code = undefined; + Sk.builtins.set_success = undefined; + Sk.builtins.set_feedback = undefined; + Sk.builtins.set_finished = undefined; + Sk.builtins.count_components = undefined; + Sk.builtins.calls_function = undefined; + Sk.builtins.get_property = undefined; + Sk.builtins.get_value_by_name = undefined; + Sk.builtins.get_value_by_type = undefined; + Sk.builtins.no_nonlist_nums = undefined; + Sk.builtins.only_printing_properties = undefined; + Sk.builtins.parse_json = undefined; + Sk.skip_drawing = false; + GLOBAL_VALUE = undefined; + this.main.model.settings.mute_printer(false); + } + + parseGlobals(variables) { + var result = Array(); + var modules = Array(); + for (var property in variables) { + var value = variables[property]; + if (property !== "__name__" && property !== "__doc__") { + property = property.replace('_$rw$', '') + .replace('_$rn$', ''); + var parsed = this.parseValue(property, value); + if (parsed !== null) { + result.push(parsed); + } else if (value.constructor == Sk.builtin.module) { + modules.push(value.$d.__name__.v); + } + } + } + return { "properties": result, "modules": modules }; + } + + parseValue(property, value) { + if (value == undefined) { + return { + 'name': property, + 'type': 'Unknown', + "value": 'Undefined' + }; + } + switch (value.constructor) { + case Sk.builtin.func: + return { + 'name': property, + 'type': "Function", + "value": (value.func_code.co_varnames !== undefined ? + " Arguments: " + value.func_code.co_varnames.join(", ") : + ' No arguments') + }; + case Sk.builtin.module: return null; + case Sk.builtin.str: + return { + 'name': property, + 'type': "String", + "value": value.$r().v + }; + case Sk.builtin.none: + return { + 'name': property, + 'type': "None", + "value": "None" + }; + case Sk.builtin.bool: + return { + 'name': property, + 'type': "Boolean", + "value": value.$r().v + }; + case Sk.builtin.nmber: + return { + 'name': property, + 'type': "int" == value.skType ? "Integer" : "Float", + "value": value.$r().v + }; + case Sk.builtin.int_: + return { + 'name': property, + 'type': "Integer", + "value": value.$r().v + }; + case Sk.builtin.float_: + return { + 'name': property, + 'type': "Float", + "value": value.$r().v + }; + case Sk.builtin.tuple: + return { + 'name': property, + 'type': "Tuple", + "value": value.$r().v + }; + case Sk.builtin.list: + if (value.v.length <= 20) { + return { + 'name': property, + 'type': "List", + "value": value.$r().v, + 'exact_value': value + }; + } + return { + 'name': property, + 'type': "List", + "value": "[... " + value.v.length + " elements ...]", + "exact_value": value + }; + + case Sk.builtin.dict: + return { + 'name': property, + 'type': "Dictionary", + "value": value.$r().v + }; + case Number: + return { + 'name': property, + 'type': value % 1 === 0 ? "Integer" : "Float", + "value": value + }; + case String: + return { + 'name': property, + 'type': "String", + "value": value + }; + case Boolean: + return { + 'name': property, + 'type': "Boolean", + "value": (value ? "True" : "False") + }; + default: + return { + 'name': property, + 'type': value.tp$name == undefined ? value : value.tp$name, + "value": value.$r == undefined ? value : value.$r().v + }; + } + } +} + +/** + * Skulpt Module for holding the Instructor API. + * + * This module is a little hackish. We need to sit down and reevaluate the best way to + * organize it and whether this particular structure is ideal. I suspect it should be + * it's own proper JS file. + * + * @param {String} name - The name of the module (should always be 'instructor') + * + */ +// var instructor_module = function (name) { +// // Main module object that gets returned at the end. +// var mod = {}; + +// /** +// * Skulpt Exception that represents a Feedback object, to be rendered to the user +// * when the feedback system finds a problem. +// * +// * @param {Array} args - A list of optional arguments to pass to the Exception. +// * Usually this will include a message for the user. +// */ +// Sk.builtin.Feedback = function (args) { +// var o; +// if (!(this instanceof Sk.builtin.Feedback)) { +// o = Object.create(Sk.builtin.Feedback.prototype); +// o.constructor.apply(o, arguments); +// return o; +// } +// Sk.builtin.Exception.apply(this, arguments); +// }; +// Sk.abstr.setUpInheritance("Feedback", Sk.builtin.Feedback, Sk.builtin.Exception); + +// /** +// * Skulpt Exception that represents a Success object, to be thrown when the user +// * completes their program successfully. +// * +// ** @param {Array} args - A list of optional arguments to pass to the Exception. +// * Usually this will be empty. +// */ +// Sk.builtin.Success = function (args) { +// var o; +// if (!(this instanceof Sk.builtin.Success)) { +// o = Object.create(Sk.builtin.Success.prototype); +// o.constructor.apply(o, arguments); +// return o; +// } +// Sk.builtin.Exception.apply(this, arguments); +// }; +// Sk.abstr.setUpInheritance("Success", Sk.builtin.Success, Sk.builtin.Exception); + +// /** +// * Skulpt Exception that represents a Finished object, to be thrown when the user +// * completes their program successfully, but isn't in a problem with a "solution". +// * This is useful for open-ended canvases where we still want to capture the students' +// * code in Canvas. +// * +// ** @param {Array} args - A list of optional arguments to pass to the Exception. +// * Usually this will be empty. +// */ +// Sk.builtin.Finished = function (args) { +// var o; +// if (!(this instanceof Sk.builtin.Finished)) { +// o = Object.create(Sk.builtin.Finished.prototype); +// o.constructor.apply(o, arguments); +// return o; +// } +// Sk.builtin.Exception.apply(this, arguments); +// }; +// Sk.abstr.setUpInheritance("Finished", Sk.builtin.Finished, Sk.builtin.Exception); + +// /** +// * A Skulpt function that throws a Feedback exception, allowing us to give feedback +// * to the user through the Feedback panel. This function call is done for aesthetic +// * reasons, so that we are calling a function instead of raising an error. Still, +// * exceptions allow us to break out of the control flow immediately, like a +// * return, so they are a good mechanism to use under the hood. +// * +// * @param {String} message - The message to display to the user. +// */ +// mod.set_feedback = new Sk.builtin.func(function (message) { +// Sk.builtin.pyCheckArgs("set_feedback", arguments, 1, 1); +// Sk.builtin.pyCheckType("message", "string", Sk.builtin.checkString(message)); +// throw new Sk.builtin.Feedback(message.v); +// }); + +// /** +// * A Skulpt function that throws a Success exception. This will terminate the +// * feedback analysis, but reports that the students' code was successful. +// * This function call is done for aesthetic reasons, so that we are calling a +// * function instead of raising an error. Still, exceptions allow us to break +// * out of the control flow immediately, like a return would, so they are a +// * good mechanism to use under the hood. +// */ +// mod.set_success = new Sk.builtin.func(function () { +// Sk.builtin.pyCheckArgs("set_success", arguments, 0, 0); +// throw new Sk.builtin.Success(); +// }); + +// /** +// * A Skulpt function that throws a Finished exception. This will terminate the +// * feedback analysis, but reports that the students' code was successful. +// * This function call is done for aesthetic reasons, so that we are calling a +// * function instead of raising an error. Still, exceptions allow us to break +// * out of the control flow immediately, like a return would, so they are a +// * good mechanism to use under the hood. +// */ +// mod.set_finished = new Sk.builtin.func(function () { +// Sk.builtin.pyCheckArgs("set_finished", arguments, 0, 0); +// throw new Sk.builtin.Finished(); +// }); + +// // Memoization of previous parses - some mild redundancy to save time +// // TODO: There's no evidence this is good, and could be a memory hog on big +// // programs. Someone should investigate this. The assumption is that multiple +// // helper functions might be using parses. But shouldn't we trim old parses? +// // Perhaps a timed cache would work better. +// var parses = {}; + +// /** +// * Given source code as a string, return a flat list of all of the AST elements +// * in the parsed source code. +// * +// * TODO: There's redundancy here, since the source code was previously parsed +// * to run the file and to execute it. We should probably be able to do this just +// * once and shave off time. +// * +// * @param {String} source - Python source code. +// * @returns {Array.} +// */ +// function getParseList(source) { +// if (!(source in parses)) { +// var parse = Sk.parse("__main__", source); +// parses[source] = Sk.astFromParse(parse.cst, "__main__", parse.flags); +// } +// var ast = parses[source]; +// return (new NodeVisitor()).recursive_walk(ast); +// } + +// /** +// * Given source code as a string, return a list of all of the AST elements +// * that are Num (aka numeric literals) but that are not inside List elements. +// * +// * @param {String} source - Python source code. +// * @returns {Array.number} The list of JavaScript numeric literals that were found. +// */ +// function getNonListNums(source) { +// if (!(source in parses)) { +// var parse = Sk.parse("__main__", source); +// parses[source] = Sk.astFromParse(parse.cst, "__main__", parse.flags); +// } +// var ast = parses[source]; +// var visitor = new NodeVisitor(); +// var insideList = false; +// var nums = []; +// visitor.visit_List = function (node) { +// insideList = true; +// this.generic_visit(node); +// insideList = false; +// } +// visitor.visit_Num = function (node) { +// if (!insideList) { +// nums.push(node.n); +// } +// this.generic_visit(node); +// } +// visitor.visit(ast); +// return nums; +// } + +// /** +// * Given source code as a string, return a list of all of the AST elements +// * that are being printed (using the print function) but are not variables. +// * +// * @param {String} source - Python source code. +// * @returns {Array.} The list of AST elements that were found. +// */ +// function getPrintedNonProperties(source) { +// if (!(source in parses)) { +// var parse = Sk.parse("__main__", source); +// parses[source] = Sk.astFromParse(parse.cst, "__main__", parse.flags); +// } +// var ast = parses[source]; +// var visitor = new NodeVisitor(); +// var nonVariables = []; +// visitor.visit_Call = function (node) { +// var func = node.func; +// var args = node.args; +// if (func._astname == 'Name' && func.id.v == 'print') { +// for (var i = 0; i < args.length; i += 1) { +// if (args[i]._astname != "Name") { +// nonVariables.push(args[i]); +// } +// } +// } +// this.generic_visit(node); +// } +// visitor.visit(ast); +// return nonVariables; +// } + +// /** +// * Skulpt function to iterate through the final state of +// * all the variables in the program, and check to see if they have +// * a given value. +// */ +// mod.get_value_by_name = new Sk.builtin.func(function (name) { +// Sk.builtin.pyCheckArgs("get_value_by_name", arguments, 1, 1); +// Sk.builtin.pyCheckType("name", "string", Sk.builtin.checkString(name)); +// name = name.v; +// var final_values = Sk.builtins._final_values; +// if (name in final_values) { +// return final_values[name]; +// } +// return Sk.builtin.none.none$; + +// }); +// mod.get_value_by_type = new Sk.builtin.func(function (type) { +// Sk.builtin.pyCheckArgs("get_value_by_type", arguments, 1, 1); + +// var final_values = Sk.builtins._final_values; +// var result = []; +// for (var property in final_values) { +// if (final_values[property].tp$name == type.tp$name) { +// result.push(final_values[property]); +// } +// } +// return Sk.builtin.list(result); +// }); + +// mod.parse_json = new Sk.builtin.func(function (blob) { +// Sk.builtin.pyCheckArgs("parse_json", arguments, 1, 1); +// Sk.builtin.pyCheckType("blob", "string", Sk.builtin.checkString(blob)); +// blob = blob.v; +// return Sk.ffi.remapToPy(JSON.parse(blob)); +// }); +// mod.get_property = new Sk.builtin.func(function (name) { +// Sk.builtin.pyCheckArgs("get_property", arguments, 1, 1); +// Sk.builtin.pyCheckType("name", "string", Sk.builtin.checkString(name)); +// name = name.v; +// var trace = Sk.builtins._trace; +// if (trace.length <= 0) { +// return Sk.builtin.none.none$; +// } +// var properties = trace[trace.length - 1]["properties"]; +// for (var i = 0, len = properties.length; i < len; i += 1) { +// if (properties[i]['name'] == name) { +// return Sk.ffi.remapToPy(properties[i]) +// } +// } +// return Sk.builtin.none.none$; +// }); + +// mod.calls_function = new Sk.builtin.func(function (source, name) { +// Sk.builtin.pyCheckArgs("calls_function", arguments, 2, 2); +// Sk.builtin.pyCheckType("source", "string", Sk.builtin.checkString(source)); +// Sk.builtin.pyCheckType("name", "string", Sk.builtin.checkString(name)); + +// source = source.v; +// name = name.v; + +// var ast_list = getParseList(source); + +// var count = 0; +// for (var i = 0, len = ast_list.length; i < len; i = i + 1) { +// if (ast_list[i]._astname == 'Call') { +// if (ast_list[i].func._astname == 'Attribute') { +// count += Sk.ffi.remapToJs(ast_list[i].func.attr) == name | 0; +// } else if (ast_list[i].func._astname == 'Name') { +// count += Sk.ffi.remapToJs(ast_list[i].func.id) == name | 0; +// } +// } +// } + +// return Sk.ffi.remapToPy(count > 0); +// }); + +// mod.count_components = new Sk.builtin.func(function (source, component) { +// Sk.builtin.pyCheckArgs("count_components", arguments, 2, 2); +// Sk.builtin.pyCheckType("source", "string", Sk.builtin.checkString(source)); +// Sk.builtin.pyCheckType("component", "string", Sk.builtin.checkString(component)); + +// source = source.v; +// component = component.v; + +// var ast_list = getParseList(source); + +// var count = 0; +// for (var i = 0, len = ast_list.length; i < len; i = i + 1) { +// if (ast_list[i]._astname == component) { +// count = count + 1; +// } +// } + +// return Sk.ffi.remapToPy(count); +// }); + +// mod.no_nonlist_nums = new Sk.builtin.func(function (source) { +// Sk.builtin.pyCheckArgs("no_nonlist_nums", arguments, 1, 1); +// Sk.builtin.pyCheckType("source", "string", Sk.builtin.checkString(source)); + +// source = source.v; + +// var num_list = getNonListNums(source); + +// var count = 0; +// for (var i = 0, len = num_list.length; i < len; i = i + 1) { +// if (num_list[i].v != 0 && num_list[i].v != 1) { +// return Sk.ffi.remapToPy(true); +// } +// } +// return Sk.ffi.remapToPy(false); +// }); +// mod.only_printing_properties = new Sk.builtin.func(function (source) { +// Sk.builtin.pyCheckArgs("only_printing_properties", arguments, 1, 1); +// Sk.builtin.pyCheckType("source", "string", Sk.builtin.checkString(source)); + +// source = source.v; + +// var non_var_list = getPrintedNonProperties(source); +// return Sk.ffi.remapToPy(non_var_list.length == 0); +// }); + +// return mod; +// } diff --git a/mixly/boards/default_src/python_skulpt/others/python-shell.js b/mixly/boards/default_src/python_skulpt/others/python-shell.js new file mode 100644 index 00000000..45e57913 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/python-shell.js @@ -0,0 +1,194 @@ +import MixpyProject from './mixpy-project'; +import PyEngine from './py-engine'; +import { Workspace, Msg } from 'mixly'; +import StatusBarImage from './statusbar-image'; + +class PythonShell { + static { + this.pythonShell = null; + + this.init = async function () { + StatusBarImage.init(); + this.pythonShell = new PythonShell(); + } + + this.run = function () { + const mainWorkspace = Workspace.getMain(); + const editor = mainWorkspace.getEditorsManager().getActive(); + const code = editor.getCode(); + return this.pythonShell.run(code); + } + + this.stop = function () { + return this.pythonShell.stop(); + } + } + + #statusBarTerminal_ = null; + #statusBarImage_ = null; + #statusBarsManager_ = null; + #cursor_ = { + row: 0, + column: 0 + }; + #prompt_ = ''; + #inputResolve_ = null; + #inputReject_ = null; + #waittingForInput_ = false; + #running_ = false; + #pyEngine_ = null; + #onCursorChangeEvent_ = () => this.#onCursorChange_(); + #commands_ = [ + { + name: 'REPL-Enter', + bindKey: 'Enter', + exec: (editor) => { + const session = editor.getSession(); + const cursor = session.selection.getCursor(); + if (cursor.row === this.#cursor_.row) { + const newPos = this.#statusBarTerminal_.getEndPos(); + let str = this.#statusBarTerminal_.getValueRange(this.#cursor_, newPos); + str = str.replace(this.#prompt_, ''); + this.#inputResolve_?.(str); + this.#inputResolve_ = null; + this.#inputReject_ = null; + this.#statusBarTerminal_.addValue('\n'); + this.#exitInput_(); + return true; + } + return false; + } + }, { + name: 'REPL-ChangeEditor', + bindKey: 'Delete|Ctrl-X|Backspace', + exec: (editor) => { + const session = editor.getSession(); + const cursor = session.selection.getCursor(); + if (cursor.row < this.#cursor_.row || cursor.column <= this.#cursor_.column) { + return true; + } + return false; + } + } + ]; + constructor() { + const mainWorkspace = Workspace.getMain(); + this.#statusBarsManager_ = mainWorkspace.getStatusBarsManager(); + this.#statusBarTerminal_ = this.#statusBarsManager_.getStatusBarById('output'); + this.#statusBarImage_ = this.#statusBarsManager_.getStatusBarById('images'); + this.#pyEngine_ = new PyEngine({}, new MixpyProject()); + this.#pyEngine_.loadEngine(this.#statusBarImage_.getContent().children()[0]); + this.#addEventsListener_(); + } + + #addEventsListener_() { + const events = this.#pyEngine_.getEvents(); + events.bind('finished', () => { + this.#running_ = false; + this.#statusBarTerminal_.addValue(`\n==${Msg.Lang['shell.finish']}==`); + }); + + events.bind('output', (data) => { + this.#statusBarTerminal_.addValue(data.content); + }); + + events.bind('error', (data) => { + this.#running_ = false; + this.#statusBarTerminal_.addValue(`\n${data.toString()}\n`); + }); + + events.bind('input', (data) => { + const prompt = String(data?.content?.prompt); + this.#statusBarTerminal_.addValue(`>>> ${prompt}`); + this.#prompt_ = prompt; + this.#inputResolve_ = data.resolve; + this.#inputReject_ = data.reject; + this.#enterInput_(); + }); + + events.bind('display', (data) => { + this.#statusBarsManager_.changeTo('images'); + this.#statusBarImage_.display(data); + }); + } + + #onCursorChange_() { + const editor = this.#statusBarTerminal_.getEditor(); + const session = editor.getSession(); + const cursor = session.selection.getCursor(); + editor.setReadOnly( + cursor.row < this.#cursor_.row || cursor.column < this.#cursor_.column + ); + } + + #enterInput_() { + if (!this.#running_) { + return; + } + this.#waittingForInput_ = true; + this.#cursor_ = this.#statusBarTerminal_.getEndPos(); + const editor = this.#statusBarTerminal_.getEditor(); + editor.setReadOnly(false); + editor.focus(); + const session = editor.getSession(); + session.selection.on('changeCursor', this.#onCursorChangeEvent_); + editor.commands.addCommands(this.#commands_); + } + + #exitInput_() { + this.#waittingForInput_ = false; + const editor = this.#statusBarTerminal_.getEditor(); + const session = editor.getSession(); + session.selection.off('changeCursor', this.#onCursorChangeEvent_); + editor.commands.removeCommands(this.#commands_); + this.#prompt_ = ''; + this.#inputResolve_?.(''); + // this.#inputReject_?.({}); + this.cursor_ = { row: 0, column: 0 }; + editor.setReadOnly(true); + } + + addPrompt(prompt, resolve, reject) { + this.#statusBarTerminal_.addValue(prompt); + this.#prompt_ = prompt; + this.#inputResolve_ = resolve; + this.#inputReject_ = reject; + this.#enterInput_(); + } + + async run(code) { + await this.stop(); + this.#statusBarsManager_.changeTo('output'); + this.#statusBarsManager_.show(); + this.#statusBarTerminal_.setValue(`${Msg.Lang['shell.running']}...\n`); + this.#running_ = true; + if (code.indexOf('import turtle') !== -1 + || code.indexOf('from turtle import') !== -1 + || code.indexOf('import matplotlib') !== -1 + || code.indexOf('from matplotlib import') !== -1 + || code.indexOf('import pgzrun') !== -1 + || code.indexOf('from pgzrun import') !== -1 + || code.indexOf('import sprite') !== -1 + || code.indexOf('from sprite import') !== -1) { + this.#statusBarsManager_.changeTo('images'); + } + this.#pyEngine_.run(code); + } + + async stop() { + if (this.#waittingForInput_) { + this.#exitInput_(); + } + if (this.#running_) { + this.#pyEngine_.kill(); + await this.sleep(500); + this.#running_ = false; + } + } + + sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } +} + +export default PythonShell; \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/others/skulpt/debugger.js b/mixly/boards/default_src/python_skulpt/others/skulpt/debugger.js new file mode 100644 index 00000000..825f833b --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/skulpt/debugger.js @@ -0,0 +1,311 @@ +/** + * Debugger support for skulpt module + */ +import './skulpt.min.js'; + +function hasOwnProperty(obj, prop) { + var proto = obj.constructor.prototype; + return (prop in obj) && + (!(prop in proto) || proto[prop] !== obj[prop]); +} + +class Breakpoint { + constructor(filename, lineno, colno) { + this.filename = filename; + this.lineno = lineno; + this.colno = colno; + this.enabled = true; + this.ignore_count = 0; + } +} + +export default class Debugger { + constructor(filename, output_callback) { + this.dbg_breakpoints = {}; + this.tmp_breakpoints = {}; + this.suspension_stack = []; + this.current_suspension = -1; + this.eval_callback = null; + this.suspension = null; + this.output_callback = output_callback; + this.step_mode = false; + this.filename = filename; + } + + print(txt) { + if (this.output_callback != null) { + this.output_callback.print(txt); + } + } + + get_source_line(lineno) { + if (this.output_callback != null) { + return this.output_callback.get_source_line(lineno); + } + + return ""; + } + + move_up_the_stack() { + this.current_suspension = Math.min(this.current_suspension + 1, this.suspension_stack.length - 1); + } + + move_down_the_stack() { + this.current_suspension = Math.max(this.current_suspension - 1, 0); + } + + enable_step_mode() { + this.step_mode = true; + } + + disable_step_mode() { + this.step_mode = false; + } + + get_suspension_stack() { + return this.suspension_stack; + } + + get_active_suspension() { + if (this.suspension_stack.length === 0) { + return null; + } + + return this.suspension_stack[this.current_suspension]; + } + + generate_breakpoint_key(filename, lineno) { + var key = filename + "-" + lineno; + return key; + } + + check_breakpoints(filename, lineno, colno) { + // If Step mode is enabled then ignore breakpoints since we will just break + // at every line. + if (this.step_mode === true) { + return true; + } + + var key = this.generate_breakpoint_key(filename, lineno, colno); + if (hasOwnProperty(this.dbg_breakpoints, key) && + this.dbg_breakpoints[key].enabled === true) { + var bp = null; + if (hasOwnProperty(this.tmp_breakpoints, key)) { + delete this.dbg_breakpoints[key]; + delete this.tmp_breakpoints[key]; + return true; + } + + this.dbg_breakpoints[key].ignore_count -= 1; + this.dbg_breakpoints[key].ignore_count = Math.max(0, this.dbg_breakpoints[key].ignore_count); + + bp = this.dbg_breakpoints[key]; + if (bp.ignore_count === 0) { + return true; + } + return false; + } + return false; + } + + get_breakpoints_list() { + return this.dbg_breakpoints; + } + + disable_breakpoint(filename, lineno, colno) { + var key = this.generate_breakpoint_key(filename, lineno, colno); + + if (hasOwnProperty(this.dbg_breakpoints, key)) { + this.dbg_breakpoints[key].enabled = false; + } + } + + enable_breakpoint(filename, lineno, colno) { + var key = this.generate_breakpoint_key(filename, lineno, colno); + + if (hasOwnProperty(this.dbg_breakpoints, key)) { + this.dbg_breakpoints[key].enabled = true; + } + } + + clear_breakpoint(filename, lineno, colno) { + var key = this.generate_breakpoint_key(filename, lineno, colno); + if (hasOwnProperty(this.dbg_breakpoints, key)) { + delete this.dbg_breakpoints[key]; + return null; + } + return "Invalid breakpoint specified: " + filename + " line: " + lineno; + } + + clear_all_breakpoints() { + this.dbg_breakpoints = {}; + this.tmp_breakpoints = {}; + } + + set_ignore_count(filename, lineno, colno, count) { + var key = this.generate_breakpoint_key(filename, lineno, colno); + if (hasOwnProperty(this.dbg_breakpoints, key)) { + var bp = this.dbg_breakpoints[key]; + bp.ignore_count = count; + } + } + + set_condition(filename, lineno, colno, lhs, cond, rhs) { + var key = this.generate_breakpoint_key(filename, lineno, colno); + var bp; + if (hasOwnProperty(this.dbg_breakpoints, key)) { + // Set a new condition + bp = this.dbg_breakpoints[key]; + } else { + bp = new Breakpoint(filename, lineno, colno); + } + + bp.condition = new window.Sk.Condition(lhs, cond, rhs); + this.dbg_breakpoints[key] = bp; + } + + print_suspension_info(suspension) { + var filename = suspension.filename; + var lineno = suspension.lineno; + var colno = suspension.colno; + this.print("Hit Breakpoint at <" + filename + "> at line: " + lineno + " column: " + colno + "\n"); + this.print("----------------------------------------------------------------------------------\n"); + this.print(" ==> " + this.get_source_line(lineno - 1) + "\n"); + this.print("----------------------------------------------------------------------------------\n"); + } + + set_suspension(suspension) { + var parent = null; + if (!hasOwnProperty(suspension, "filename") && suspension.child instanceof window.Sk.misceval.Suspension) { + suspension = suspension.child; + } + + // Pop the last suspension of the stack if there is more than 0 + if (this.suspension_stack.length > 0) { + this.suspension_stack.pop(); + this.current_suspension -= 1; + } + + // Unroll the stack to get each suspension. + while (suspension instanceof window.Sk.misceval.Suspension) { + parent = suspension; + this.suspension_stack.push(parent); + this.current_suspension += 1; + suspension = suspension.child; + } + + suspension = parent; + + this.print_suspension_info(suspension); + } + + add_breakpoint(filename, lineno, colno, temporary) { + var key = this.generate_breakpoint_key(filename, lineno, colno); + this.dbg_breakpoints[key] = new Breakpoint(filename, lineno, colno); + if (temporary) { + this.tmp_breakpoints[key] = true; + } + } + + suspension_handler(susp) { + return new Promise(function (resolve, reject) { + try { + resolve(susp.resume()); + } catch (e) { + reject(e); + } + }); + } + + resume() { + // Reset the suspension stack to the topmost + this.current_suspension = this.suspension_stack.length - 1; + + if (this.suspension_stack.length === 0) { + this.print("No running program"); + } else { + var promise = this.suspension_handler(this.get_active_suspension()); + promise.then(this.success.bind(this), this.error.bind(this)); + } + } + + pop_suspension_stack() { + this.suspension_stack.pop(); + this.current_suspension -= 1; + } + + success(r) { + if (r instanceof window.Sk.misceval.Suspension) { + this.set_suspension(r); + } else { + if (this.suspension_stack.length > 0) { + // Current suspension needs to be popped of the stack + this.pop_suspension_stack(); + + if (this.suspension_stack.length === 0) { + this.print("Program execution complete"); + return; + } + + var parent_suspension = this.get_active_suspension(); + // The child has completed the execution. So override the child's resume + // so we can continue the execution. + parent_suspension.child.resume = function () { + return r; + }; + this.resume(); + } else { + this.print("Program execution complete"); + } + } + } + + error(e) { + this.print("Traceback (most recent call last):"); + for (var idx = 0; idx < e.traceback.length; ++idx) { + this.print(" File \"" + e.traceback[idx].filename + "\", line " + e.traceback[idx].lineno + ", in "); + var code = this.get_source_line(e.traceback[idx].lineno - 1); + code = code.trim(); + code = " " + code; + this.print(code); + } + + var err_ty = e.constructor.tp$name; + for (idx = 0; idx < e.args.v.length; ++idx) { + this.print(err_ty + ": " + e.args.v[idx].v); + } + } + + asyncToPromise(suspendablefn, suspHandlers, debugger_obj) { + return new Promise(function (resolve, reject) { + try { + var r = suspendablefn(); + + (function handleResponse(r) { + try { + while (r instanceof window.Sk.misceval.Suspension) { + debugger_obj.set_suspension(r); + return; + } + + resolve(r); + } catch (e) { + reject(e); + } + })(r); + + } catch (e) { + reject(e); + } + }); + } + + execute(suspendablefn) { + var r = suspendablefn(); + + if (r instanceof window.Sk.misceval.Suspension) { + this.suspensions.concat(r); + this.eval_callback(r); + } + } +} \ No newline at end of file diff --git a/mixly/boards/default_src/python_skulpt/others/skulpt/libs/matplotlib/__init__.js b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/matplotlib/__init__.js new file mode 100644 index 00000000..fe7981ad --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/matplotlib/__init__.js @@ -0,0 +1,6 @@ +var $builtinmodule = function(name) +{ + var matplotlib = {}; + + return matplotlib; +}; diff --git a/mixly/boards/default_src/python_skulpt/others/skulpt/libs/numpy/__init__.js b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/numpy/__init__.js new file mode 100644 index 00000000..c7d79af0 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/numpy/__init__.js @@ -0,0 +1,3516 @@ +/** + * ES6 - Math polyfill, when .dot is implemented, we do not need to rely on mathjs anymore + * borrowed from: https://github.com/MaxArt2501/es6-math + * 部分函数已经重写已适配skulpt 1.3版本 + */ + (function(factory) { + if (typeof define === "function" && define.amd) { + // AMD. Register as an anonymous module. + define([], factory); + } else factory(); +})(function() { + "use strict"; + // x | 0 is the simplest way to implement ToUint32(x) + var M = Math, + N = Number, + prop, def = Object.defineProperty, + mathXtra = { + // Hyperbolic functions + sinh: function sinh(x) { + // If -0, must return -0. + if (x === 0) return x; + var exp = M.exp(x); + return exp/2 - .5/exp; + }, + cosh: function cosh(x) { + var exp = M.exp(x); + return exp/2 + .5/exp; + }, + tanh: function tanh(x) { + // If -0, must return -0. + if (x === 0) return x; + // Mathematically speaking, the formulae are equivalent. + // But computationally, it's better to make exp tend to 0 + // rather than +Infinity + if (x < 0) { + var exp = M.exp(2 * x); + return (exp - 1) / (exp + 1); + } else { + var exp = M.exp(-2 * x); + return (1 - exp) / (1 + exp); + } + }, + asinh: function asinh(x) { + return x === -Infinity ? -Infinity : M.log(x + M.sqrt(x * x + 1)); + }, + acosh: function acosh(x) { + return x >= 1 ? M.log(x + M.sqrt(x * x - 1)) : NaN; + }, + atanh: function atanh(x) { + return x >= -1 && x <= 1 ? M.log((1 + x) / (1 - x)) / 2 : NaN; + }, + + // Exponentials and logarithms + expm1: function expm1(x) { + // If -0, must return -0. But Math.exp(-0) - 1 yields +0. + return x === 0 ? x : M.exp(x) - 1; + }, + log10: function log10(x) { + return M.log(x) / M.LN10; + }, + log2: function log2(x) { + return M.log(x) / M.LN2; + }, + log1p: function log1p(x) { + // If -0, must return -0. But Math.log(1 + -0) yields +0. + return x === 0 ? x : M.log(1 + x); + }, + + // Various + sign: function sign(x) { + // If -0, must return -0. + return isNaN(x) ? NaN : x < 0 ? -1 : x > 0 ? 1 : +x; + }, + cbrt: function cbrt(x) { + // If -0, must return -0. + return x === 0 ? x : x < 0 ? -M.pow(-x, 1/3) : M.pow(x, 1/3); + }, + hypot: function hypot(value1, value2) { // Must have a length of 2 + for (var i = 0, s = 0, args = arguments; i < args.length; i++) + s += args[i] * args[i]; + return M.sqrt(s); + }, + + // Rounding and 32-bit operations + trunc: function trunc(x) { + return x === 0 ? x : x < 0 ? M.ceil(x) : M.floor(x); + }, + fround: typeof Float32Array === "function" + ? (function(arr) { + return function fround(x) { return arr[0] = x, arr[0]; }; + })(new Float32Array(1)) + : function fround(x) { return x; }, + + clz32: function clz32(x) { + if (x === -Infinity) return 32; + if (x < 0 || (x |= 0) < 0) return 0; + if (!x) return 32; + var i = 31; + while (x >>= 1) i--; + return i; + }, + imul: function imul(x, y) { + return (x | 0) * (y | 0) | 0; + } + }, + numXtra = { + isNaN: function isNaN(x) { + // NaN is the only Javascript object such that x !== x + // The control on the type is for eventual host objects + return typeof x === "number" && x !== x; + }, + isFinite: function isFinite(x) { + return typeof x === "number" && x === x && x !== Infinity && x !== -Infinity; + }, + isInteger: function isInteger(x) { + return typeof x === "number" && x !== Infinity && x !== -Infinity && M.floor(x) === x; + }, + isSafeInteger: function isSafeInteger(x) { + return typeof x === "number" && x > -9007199254740992 && x < 9007199254740992 && M.floor(x) === x; + }, + parseFloat: parseFloat, + parseInt: parseInt + }, + numConsts = { + EPSILON: 2.2204460492503130808472633361816e-16, + MAX_SAFE_INTEGER: 9007199254740991, + MIN_SAFE_INTEGER: -9007199254740991 + }; + + for (prop in mathXtra) + if (typeof M[prop] !== "function") + M[prop] = mathXtra[prop]; + + for (prop in numXtra) + if (typeof N[prop] !== "function") + N[prop] = numXtra[prop]; + + try { + prop = {}; + def(prop, 0, {}); + for (prop in numConsts) + if (!(prop in N)) + def(N, prop, {value: numConsts[prop]}); + } catch (e) { + for (prop in numConsts) + if (!(prop in N)) + N[prop] = numConsts[prop]; + } +}); +var $builtinmodule = function (name) { + /** + Made by Michael Ebert for https://github.com/skulpt/skulpt + ndarray implementation inspired by https://github.com/geometryzen/davinci-dev (not compatible with skulpt) + Some methods are based on the original numpy implementation. + See http://waywaaard.github.io/skulpt/ for more information. + **/ + /* eslint-disable */ + + /******************************************/ + /* DEFINES */ + /******************************************/ + + // base class name, used for all checks and other defines + var CLASS_NDARRAY = "numpy.ndarray"; + + // numpy specific defines and constants + var NPY_MAX_INT = Number.MAX_SAFE_INTEGER; + var NPY_MAX_INTP = NPY_MAX_INT; + var NPY_MAXDIMS = 32; + var NPY_MAXARGS = 32; + + var NPY_FAIL = 0; + var NPY_SUCCEED = 1; + + var NPY_TYPES = { + NPY_BOOL: 0, + NPY_BYTE: 1, + NPY_UBYTE: 2, + NPY_SHORT: 3, + NPY_USHORT: 4, + NPY_INT: 5, + NPY_UINT: 6, + NPY_LONG: 7, + NPY_ULONG: 8, + NPY_LONGLONG: 9, + NPY_ULONGLONG: 10, + NPY_FLOAT: 11, + NPY_DOUBLE: 12, + NPY_LONGDOUBLE: 13, + NPY_CFLOAT: 14, + NPY_CDOUBLE: 15, + NPY_CLONGDOUBLE: 16, + NPY_OBJECT: 17, + NPY_STRING: 18, + NPY_UNICODE: 19, + NPY_VOID: 20, + /* + * New 1.6 types appended, may be integrated + * into the above in 2.0. + */ + NPY_DATETIME: 21, + NPY_TIMEDELTA: 22, + NPY_HALF: 23, + + NPY_NTYPES: 24, + NPY_NOTYPE: 25, + NPY_CHAR: 26, /* special flag */ + NPY_USERDEF: 256, /* leave room for characters */ + + /* The number of types not including the new 1.6 types */ + NPY_NTYPES_ABI_COMPATIBLE: 21 + }; + + /* basetype array priority */ + var NPY_PRIORITY = 0.0; + + /* default subtype priority */ + var NPY_SUBTYPE_PRIORITY = 1.0; + + /* default scalar priority */ + var NPY_SCALAR_PRIORITY = -1000000.0; + + // number of floating point types + var NPY_NUM_FLOATTYPE = 3; + + // array falgs + var NPY_ARRAY_C_CONTIGUOUS = 0x0001; + var NPY_ARRAY_F_CONTIGUOUS = 0x0002; + var NPY_ARRAY_OWNDATA = 0x0004; + var NPY_ARRAY_ALIGNED = 0x0100; + var NPY_ARRAY_NOTSWAPPED = 0x0200; + var NPY_ARRAY_WRITEABLE = 0x0400; + var NPY_ARRAY_BEHAVED = (NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE); + var NPY_ARRAY_CARRAY = NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_BEHAVED; + var NPY_ARRAY_DEFAULT = NPY_ARRAY_CARRAY; + var NPY_ARRAY_UPDATEIFCOPY = 0x1000; + + var numpy = function () { + this.math = Math; // set math object + }; + + numpy.prototype.arange = function (start, stop, step) { + if (step === undefined) + step = 1.0; + + start *= 1.0; + stop *= 1.0; + step *= 1.0; + + var res = []; + for (var i = start; i < stop; i += step) { + res.push(i); + } + + return res; + }; + + // check if obj is an ndarray (does not check for subclasses) + function PyArray_Check(obj) { + return obj && (Sk.abstr.typeName(obj) === CLASS_NDARRAY); + } + + /* get the dataptr from its current coordinates for simple iterator */ + // coordinates is a array, iter is special ndarray create iter object + function get_ptr_simple(iter, coordinates) { + var i; + var ret; + + ret = PyArray_DATA(iter.ao); + + for (i = 0; i < PyArray_NDIM(iter.ao); ++i) { + ret += coordinates[i] * iter.strides[i]; + } + + return ret; + } + + // common init code for ndarray iterators + // it.dataptr is just the index to the current element (as we do not have C pointers in Javascript) + function array_iter_base_init(it, ao) { + var nd, i; + + nd = PyArray_NDIM(ao); + it.ao = ao; + it.size = PyArray_SIZE(ao); + it.nd_m1 = nd - 1; + it.factors = it.factors || []; + it.dims_m1 = it.dims_m1 || []; + it.strides = it.strides || []; + it.backstrides = it.backstrides || []; + it.bounds = it.bounds || []; + it.limits = it.limits || []; + it.limits_sizes = it.limits_sizes || []; + it.factors[nd -1] = 1; + + for (i = 0; i < nd; i++) { + it.dims_m1[i] = PyArray_DIMS(ao)[i] - 1; + it.strides[i] = PyArray_STRIDES(ao)[i]; + it.backstrides[i] = it.strides[i] * it.dims_m1[i]; + if (i > 0) { + it.factors[nd-i-1] = it.factors[nd-i] * PyArray_DIMS(ao)[nd-i]; + } + it.bounds[i] = it.bounds[i] || []; + it.bounds[i][0] = 0; + it.bounds[i][1] = PyArray_DIMS(ao)[i] - 1; + it.limits[i] = it.limits[i] || []; + it.limits[i][0] = 0; + it.limits[i][1] = PyArray_DIMS(ao)[i] - 1; + it.limits_sizes[i] = it.limits[i][1] - it.limits[i][0] + 1; + } + + // assign translate a method + it.translate = get_ptr_simple; + + PyArray_ITER_RESET(it); + + return it; + } + + /*NUMPY_API + * Get Iterator. + */ + function PyArray_IterNew(obj) { + var it; // PayArrayIterObject + var ao; // PyArrayObject + + if (!PyArray_Check(obj)) { + throw new Error('bad internal call'); + } + + ao = obj; + it = Sk.abstr.iter(ao); // create new iter + + if (it == null) { + return null; + } + + array_iter_base_init(it, ao); + + return it; + } + + /*NUMPY_API + * Get Iterator that iterates over all but one axis (don't use this with + * PyArray_ITER_GOTO1D). The axis will be over-written if negative + * with the axis having the smallest stride. + */ + function PyArray_IterAllButAxis(obj, inaxis) { + var arr; + var it; + var axis; + + if (!PyArray_Check(obj)) { + throw new Sk.builtin.ValueError('Numpy IterAllButAxis requires an ndarray.'); + } + + arr = obj; + it = PyArray_IterNew(arr); + + if (PyArray_NDIM(arr) == 0) { + return it; + } + + if (inaxis < 0) { + var i; + var minaxis = 0; + var minstride = 0; + i = 0; + while (minstride == 0 && i < PyArray_NDIM(arr)) { + minstride = PyArray_STRIDE(arr ,i); + i += 1; + } + + for (i = 1; i < PyArray_NDIM(arr); i++) { + if (PyArray_STRIDE(arr, i) > 0 && PyArray_STRIDE(arr, i) < minstride) { + minaxis = 1; + minstride = PyArray_STRIDE(arr, i); + } + } + inaxis = minaxis; + } + + axis = inaxis; + + it.contiguous = 0; + + if (it.size != 0) { + it.size /= PyArray_DIM(arr, axis); + } + + it.dims_m1[axis] = 0; + it.backstrides[axis] = 0; + + return it; + } + + // it.dataptr is just the index to the current element (as we do not have C pointers in Javascript) + function _PyArray_ITER_NEXT1(it) { + it.dataptr += it.strides[0]; + it.coordinates[0] += 1; + } + + // it.dataptr is just the index to the current element (as we do not have C pointers in Javascript) + function _PyArray_ITER_NEXT2(it) { + if (it.coordinates[1] < it.dims_m1[1]) { + it.coordinates[1] += 1; + it.dataptr += it.strides[1]; + } else { + it.coordinates[1] = 0; + it.coordinates[0] += 1; + it.dataptr += it.strides[0] - it.backstrides[1]; + } + } + + // it.dataptr is just the index to the current element (as we do not have C pointers in Javascript) + function PyArray_ITER_NEXT(it) { + it.index += 1; + if (it.nd_m1 == 0) { + _PyArray_ITER_NEXT1(it) + } else if (it.nd_m1 == 1) { + _PyArray_ITER_NEXT2(it); + } else { + var __npy_i; + for (__npy_i = it.nd_m1; __npy_i >= 0; __npy_i--) { + if (it.coordinates[__npy_i] < it.dims_m1[__npy_i]) { + it.coordinates[__npy_i] += 1; + // _PyAIT(it)->dataptr += _PyAIT(it)->strides[__npy_i]; + it.dataptr += it.strides[__npy_i]; + } else { + it.coordinates[__npy_i] = 0; + it.dataptr += it.backstrides[__npy_i]; + } + } + } + } + + // https://github.com/numpy/numpy/blob/3d2b8ca9bcbdbc9e835cb3f8d56c2d93a67b00aa/numpy/core/include/numpy/ndarraytypes.h#L1077 + // it.dataptr is just the index to the current element (as we do not have C pointers in Javascript) + function PyArray_ITER_RESET(it) { + it.index = 0; + it.dataptr = 0; // back to the first element + it.coordinates = [0, it.nd_m1 + 1]; + } + + // easy and functional impl. for our own use cases + // may not support all cases of the real API + function PyArray_DESCR(arr) { + return Sk.ffi.remapToPy(arr.v.dtype); + } + + function PyArray_MultiIterNew() { + throw new Sk.builtin.NotImplementedError("MultiIter is not supported"); + } + + /* Does nothing with descr (cannot be NULL) */ + /*NUMPY_API + Get scalar-equivalent to a region of memory described by a descriptor. + */ + function PyArray_Scalar(data, descr, base) { + // we do not reproduce the real function, we just want to return + // the first and only element of the internal buffer (we do not have C like memory) + + // maybe we can add later on a real impl. + var tmp = data[0]; + var ret = descr(tmp); + return ret; + } + + function PyArray_ToScalar(data, arr) { + return PyArray_Scalar(data, PyArray_DESCR(arr), arr); + } + + /* + * This function checks to see if arr is a 0-dimensional array and, if so, returns the appropriate array scalar. It should be used whenever 0-dimensional arrays could be returned to Python. + */ + function PyArray_Return(mp) { + if (mp == null) { + return null; + } + + if (!PyArray_Check(mp)) { + return mp; + } + + if (PyArray_NDIM(mp) == 0) { + var ret = PyArray_ToScalar(PyArray_DATA(mp), mp); + return ret; // return the only element + } else { + return mp; + } + } + + function PyArray_UNPACK_ITERABLE(itObj) { + if (Sk.builtin.checkIterable(itObj)) { + var it = Sk.abstr.iter(itObj); + var ret = []; + for (it = Sk.abstr.iter(seq), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext()) { + ret.push(i); + } + // now iterate over all objects and unpack them + } + } + + function PyArray_UNPACK_SEQUENCE(seqObj) { + if (Sk.builtin.checkSequence(seqObj)) { + var length = Sk.builtin.len(seqObj); + length = Sk.ffi.remapToJs(length); + var i; + var ret = []; + var item; + + for (i = 0; i < length; i++) { + item = seqObj.mp$subscript(i); + ret.push(item); + } + + return ret; + } else { + throw new Error('Internal API-CAll error occured in PyArray_UNPACK_SEQUENCE'); + } + } + + function PyArray_UNPACK_SHAPE(arr, shape) { + var js_shape; + + if (Sk.builtin.checkNone(shape)) { + throw new Sk.builtin.ValueError('total size of new array must be unchanged'); + } else if (Sk.builtin.checkInt(shape)) { + js_shape = [Sk.ffi.remapToJs(shape)]; + } else if (Sk.builtin.checkSequence(shape) && Sk.builtin.isinstance(shape, Sk.builtin.dict) == Sk.builtin.bool.false$) { + js_shape = PyArray_UNPACK_SEQUENCE(shape); + } else { + throw new Sk.builtin.TypeError('expected sequence object with len >= 0 or a single integer'); + } + + // now check each array item individually + var i; + var foundUnknownDimension = 0; + var unknownDimensionIndex = -1; + for (i = 0; i < js_shape.length; i++) { + if (!Sk.builtin.checkInt(js_shape[i])) { + throw new Sk.builtin.TypeError('an integer is required'); + } else { + js_shape[i] = Sk.ffi.remapToJs(js_shape[i]); + + if (js_shape[i] === -1) { + foundUnknownDimension += 1; + unknownDimensionIndex = i; + } + } + } + + // check if there is one unknown dimension + if (foundUnknownDimension > 1) { + throw new Sk.builtin.ValueError('can only specify one unknown dimension'); + } + + // shape infering with one unknown dimension + if (foundUnknownDimension == 1) { + var knownDim; + var n_size; + // easy solution for first index auto shape infering + if (unknownDimensionIndex === 0) { + if (js_shape.length === 1) { + n_size = 1; // arr_size / 1 is 1 dim with all elements + } else { + n_size = prod(js_shape.slice(1)); + } + } else { + // slice array without the -1 dim + var prod_shape = js_shape.slice(); + prod_shape.splice(unknownDimensionIndex, 1); // remove unknown dim + n_size = prod(prod_shape); + } + knownDim = PyArray_SIZE(arr) / n_size; + js_shape[unknownDimensionIndex] = knownDim; + } + + if (prod(js_shape) !== PyArray_SIZE(arr)) { + throw new Sk.builtin.ValueError('total size of new array must be unchanged'); + } + + return js_shape; + } + + function PyArray_SIZE(arr) { + if (PyArray_Check(arr)) { + return prod(arr.v.shape); + } else { + throw new Error('Internal API-Call Error occured in PyArray_DATA.', arr); + } + } + + function PyArray_DATA(arr) { + if (PyArray_Check(arr)) { + return arr.v.buffer; + } else { + throw new Error('Internal API-Call Error occured in PyArray_DATA.', arr); + } + } + + function PyArray_STRIDES(arr) { + if (PyArray_Check(arr)) { + return arr.v.strides; + } else { + throw new Error('Internal API-Call Error occured in PyArray_STRIDES.', arr); + } + } + + function PyArray_STRIDE(arr, n) { + if (PyArray_Check(arr)) { + var strides = arr.v.strides; + return strides[n]; + } else { + throw new Error('Internal API-Call Error occured in PyArray_STRIDE.', arr); + } + } + + /* + * The number of dimensions in the array. + * Returns a javascript value + */ + function PyArray_NDIM(arr) { + if (PyArray_Check(arr)) { + return arr.v.shape.length; + } else { + throw new Error('Internal API-Call Error occured in PyArray_NDIM.', arr); + } + } + + /* + * Returns a pointer to the dimensions/shape of the array. The number of elements matches the number of dimensions of the array. + * This returns javascript values! + */ + function PyArray_DIMS(arr) { + if (PyArray_Check(arr)) { + return arr.v.shape; + } else { + throw new Error('Internal API-Call Error occured in PyArray_DIMS.', arr); + } + } + + /* + * Return the shape in the nth dimension. + */ + function PyArray_DIM(arr, n) { + if (PyArray_Check(arr)) { + return arr.v.shape[n]; + } else { + throw new Error('Internal API-Call Error occured in PyArray_DIM.', arr); + } + } + + function PyArray_NewShape(arr, shape, order) { + if (PyArray_Check(arr)) { + var py_shape = new Sk.builtin.tuple(shape.map( + function (x) { + return new Sk.builtin.int_(x); + })); + + var py_order = Sk.ffi.remapToPy(order); + return Sk.misceval.callsim(arr.reshape, arr, py_shape, py_order); + } else { + throw new Error('Internal API-Call Error occured in PyArray_NewShape.', arr); + } + } + + function PyArray_FLAGS(arr) { + if (PyArray_Check(arr)) { + return arr.v.flags; + } else { + throw new Error('Internal API-Call Error occured in PyArray_NewShape.', arr); + } + } + + function PyArray_Transpose(ap, permute) { + // ap = array object + // permute = PyArrayDims [] + var axes = []; + var axis; + var permutation = []; + var reverse_permutation = []; + var ret = null; + var flags; + + if (permute == null) { + n = PyArray_NDIM(ap); + for (i = 0; i < n; i++) { + permutation[i] = n - 1 - i; + } + } else { + n = permute.length; + axes = permute; + if (n != PyArray_NDIM(ap)) { + throw new Sk.builtin.ValueError("axes don't match array"); + } + + for (i = 0; i < n; i++) { + reverse_permutation[i] = -1; + } + + for (i = 0; i < n; i++) { + axis = axes[i]; + if (axis < 0) { + axis = PyArray_NDIM(ap) + axis; + } + + if (axis < 0 || axis >= PyArray_NDIM(ap)) { + throw new Sk.builtin.ValueError('invalid axis for this array'); + } + + if (reverse_permutation[axis] != -1) { + throw new Sk.builtin.ValueError('repeated axis in transpose'); + } + + reverse_permutation[axis] = i; + permutation[i] = axis; + } + } + + flags = PyArray_FLAGS(ap); + + + // can we speed those things up? + // we add the data later on, first we create a new array with given dtype and strides, flags etc + ret = PyArray_NewFromDescr(Sk.builtin.type(ap), PyArray_DESCR(ap), n, PyArray_DIMS(ap), null, null, flags, ap); + //var newBuffer = Sk.misceval.callsim(ret.tolist, ret); + //ret.v.buffer = remapToJs_shallow(newBuffer, true); + // fix the dimensions and strides of the return array + for (i = 0; i < n; i++) { + PyArray_DIMS(ret)[i] = PyArray_DIMS(ap)[permutation[i]]; + PyArray_STRIDES(ret)[i] = PyArray_STRIDES(ap)[permutation[i]]; + } + + var list = tolist(PyArray_DATA(ap), PyArray_DIMS(ret), PyArray_STRIDES(ret), 0, PyArray_DESCR(ret)); + //var newBuffer = tobufferrecursive(PyArray_DATA(ap), PyArray_DIMS(ret), PyArray_STRIDES(ret), 0, PyArray_DESCR(ret)); + //ret.v.buffer = newBuffer; + // can we skip this call and just use the internal tolist? + var newArray = Sk.misceval.callsim(mod.array, list); + // PyArray_UpdateFlags(ret, NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_F_CONTIGUOUS |NPY_ARRAY_ALIGNED); + return newArray; + //return ret; + } + + // OBJECT_dot is the method used for python types + // https://github.com/numpy/numpy/blob/f43d691fd0b9b4f416b50fba34876691af2d0bd4/numpy/core/src/multiarray/arraytypes.c.src#L3497 + function OBJECT_dot(ip1, is1, ip2, is2, op, n, ignore) { + /* + * ALIGNMENT NOTE: np.dot, np.inner etc. enforce that the array is + * BEHAVED before getting to this point, so unaligned pointers aren't + * handled here. + */ + var i; // npy_intp + var tmp1; // PyObject + var tmp2; // PyObject + var tmp = null; // PyObject + var tmp3; // PyObject ** + + var ip1_i = 0; + var ip2_i = 0; + + for (i = 0; i < n; i++, ip1_i += is1, ip2_i += is2) { + if (ip1[ip1_i] == null || ip2[ip2_i] == null) { + tmp1 = Sk.builtin.bool.false$; + } + else { + tmp1 = Sk.abstr.numberBinOp(ip1[ip1_i], ip2[ip2_i], 'Mult'); + if (!tmp1) { + return; + } + } + if (i == 0) { + tmp = tmp1; + } + else { + tmp2 = Sk.abstr.numberBinOp(tmp, tmp1, 'Add'); + if (!tmp2) { + return; + } + tmp = tmp2; + } + } + + tmp3 = op; + tmp2 = tmp3; + //op[0] = tmp; + + return tmp; + } + + // vdot function for python basic numeric types + // https://github.com/numpy/numpy/blob/467d4e16d77a2e7c131aac53c639e82b754578c7/numpy/core/src/multiarray/vdot.c + /* + * ip1: vector 1 + * ip2: vector 2 + * is1: stride of vector 1 + * is2: stride of vector 2 + * op: new nd_array data buffer for the result + * n: number of elements in ap1 first dim + * ignore: not used anymore, however still existing for old api calls + * + */ + function OBJECT_vdot(ip1, is1, ip2, is2, op, n, ignore){ + function tryConjugate(pyObj) { + var f = pyObj.tp$getattr("conjugate"); + if (f) { + return Sk.misceval.callsim(pyObj['conjugate'], pyObj); + } else { + return pyObj; // conjugate for non complex types is just the real part + } + } + + var i; // npy_intp + var tmp0; // PyObject + var tmp1; // PyObject + var tmp2; // PyObject + var tmp = null; // PyObject + var tmp3; // PyObject ** + + var ip1_i = 0; + var ip2_i = 0; + + for (i = 0; i < n; i++, ip1_i += is1, ip2_i += is2) { + if (ip1[ip1_i] == null || ip2[ip2_i] == null) { + tmp1 = Sk.builtin.bool.false$; + } else { + // try to call the conjugate function / each numeric type can call this + tmp0 = Sk.misceval.callsim(ip1[ip1_i]['conjugate'], ip1[ip1_i]); + + if (tmp0 == null) { + return; + } + + tmp1 = Sk.abstr.numberBinOp(tmp0, ip2[ip2_i], 'Mult'); + if (tmp1 == null) { + return; + } + } + + if (i === 0) { + tmp = tmp1; + } else { + tmp2 = Sk.abstr.numberBinOp(tmp, tmp1, 'Add'); + //tmp2 = tmp + tmp1; // PyNumber_Add + + if (tmp2 == null) { + return; + } + tmp = tmp2; + } + } + + tmp3 = op; + tmp2 = tmp3; + op[0] = tmp; + } + + /** + * Basic dummy impl. The real numpy implementation is about 600 LoC and relies + * on the complete data type impl. + * We just do a basic checking + * obj: any object or nested sequence + * maxdims: maximum number of dimensions to check for dtype (recursive call) + */ + function PyArray_DTypeFromObject(obj, maxdims) { + // gets first element or null from a nested sequence + function seqUnpacker(obj, mDims) { + if (Sk.builtin.checkSequence(obj)) { + var length = Sk.builtin.len(obj); + if (Sk.builtin.asnum$(length) > 0) { + // ToDo check if element is also of type sequence + var element = obj.mp$subscript(0); + + // if we have a nested sequence, we decrement the maxdims and call recursive + if (mDims > 0 && Sk.builtin.checkSequence(element)) { + return seqUnpacker(element, mDims -1); + } else { + return element; + } + } + } else { + return obj; + } + } + + var dtype = null; + if (obj === null) { + throw new Error('Internal API-Call Error occured in PyArray_ObjectType'); + } + + if (maxdims == null) { + maxdims = NPY_MAXDIMS; + } + + var element; + // simple type + if (Sk.builtin.checkNumber(obj)) { + element = obj; + } else if (Sk.builtin.checkSequence(obj)) { + // sequence + element = seqUnpacker(obj, maxdims); + if (PyArray_Check(element)) { + return PyArray_DESCR(obj); + } + } else if (PyArray_Check(obj)) { + // array + var descr = PyArray_DESCR(obj); + if (descr != null) { + return descr; + } + var length = Sk.builtin.len(obj); + if (Sk.builtin.asnum$(length) > 0) { + element = PyArray_DATA(obj)[0]; + } + } + + // ToDo: investigate if this throw may happen + try { + dtype = Sk.builtin.type(element); + } catch (e) { + // pass + } + + return dtype; + } + + var NPY_NOTYPE = null; + var NPY_DEFAULT_TYPE = 2; + + // our basic internal hierarchy for types + // we can only promote from lower to higher numbers + // ToDo: use numpy enum for types + var Internal_TypeTable = { + 'complex': 3, + 'complex_': 3, + 'complex64': 3, + 'float': 2, + 'float_': 2, + 'float64': 2, + 'int': 1, + 'int_': 1, + 'int64': 1, + 'bool': 0, + 'bool_': 0, + }; + + function Internal_DType_To_Num(dtype) { + var name = Sk.ffi.remapToJs(dtype.tp$getattr(Sk.ffi.remapToPy("__name__")));//Sk.abstr.typeName(dtype); + var num = Internal_TypeTable[name]; + + if (num == null) { + return -1; + } + + return num; + } + + // ToDo: check if we can change this to match the real impl. + function PyArray_TYPE(arr) { + // return ((PyArrayObject_fields *)arr)->descr->type_num; + var descr = PyArray_DESCR(arr); + var typenum = Internal_DType_To_Num(descr); + return typenum; + } + + /** + * Not the real impl. as we do not really implement numpys data types and + * the 1000s LoC for that. We just use the basic python types. + * + * This function returns the 'constructor' for the given type number + */ + function PyArray_DescrFromType(typenum) { + switch(typenum) { + case 3: + return Sk.builtin.complex; + case 2: + return Sk.builtin.float_; + case 1: + return Sk.builtin.int_; + case 0: + return Sk.builtin.bool; + default: + return NPY_NOTYPE; + } + } + + /* + * This function is useful for determining a common type that two or more arrays can be converted to. + * It only works for non-flexible array types as no itemsize information is passed. The mintype argument + * represents the minimum type acceptable, and op represents the object that will be converted to an array. + * The return value is the enumerated typenumber that represents the data-type that op should have. + */ + function PyArray_ObjectType(op, minimum_type) { + // http://docs.scipy.org/doc/numpy/reference/c-api.array.html#c.PyArray_ResultType + // this is only and approximate implementation and is not even close to + // the real numpy internals, however totally sufficient for our needs + + var dtype; + + dtype = PyArray_DTypeFromObject(op, NPY_MAXDIMS); + + // maybe empty ndarray object? + if (dtype != null) { + var num = Internal_DType_To_Num(dtype); + if (num >= minimum_type) { + return num; + } else if(num < minimum_type) { + // can we convert one type into the other? + if (num >= 0 && minimum_type <= 3) { + return minimum_type; + } else { + return NPY_NOTYPE; // NPY_NOTYPE + } + } + } else { + return NPY_DEFAULT_TYPE; + } + } + + /* + * A synonym for PyArray_DIMS, named to be consistent with the ‘shape’ usage within Python. + */ + function PyArrray_Shape(arr) { + return PyArray_DIMS(arr); + } + + /* + * Cast/Promote object to given dtype with some intelligent type handling + */ + function PyArray_Cast_Obj(obj, dtype) { + if (dtype instanceof Sk.builtin.none && Sk.builtin.checkNone(obj)) { + return obj; + } else { + return Sk.misceval.callsim(dtype, obj); + } + } + + // ToDo: how can we make a exact check? + // or do we need to refactor PyArray_Check for subclasses? + function PyArray_CheckExact(obj) { + return PyArray_Check(obj); + } + + function PyArray_CheckAnyScalarExact(obj) { + + } + + function PyArray_GetPriority(obj, default_) { + var ret; + var priority = NPY_PRIORITY; + + if (PyArray_CheckExact(obj)) { + return priority; + } else if (PyArray_CheckAnyScalarExact(obj)) { + return NPY_SCALAR_PRIORITY; + } + + ret = Sk.builtin.getattr(obj, new Sk.builtin.str('__array_priority__'), Sk.builtin.none.none$); + if (Sk.builtin.checkNone(ret)) { + return default_; + } + + ret = Sk.builtin.float(ret); + priority = Sk.ffi.remapToJs(ret); + + return priority; + } + + // https://github.com/numpy/numpy/blob/5d6a9f0030e8d1a63e43783c2b5b54cde93bc5d0/numpy/core/src/multiarray/ctors.c#L903 + function PyArray_NewFromDescr_int(subtype, descr, nd, dims, strides, data, flags, obj, zeroed) { + var fa; + var i; + var sd; + var size; + + if (descr.subarray) { + throw new Error('subarrays not supported'); + } + + if (nd > NPY_MAXDIMS) { + throw new Sk.builtin.ValueError('number of dimensions must be within [0, ' + NPY_MAXDIMS + ']'); + } + + /* check dimensions */ + size = 1; + sd = 1; // we do not have any element sizes: sd = (size_t) descr->elsize; + if (sd == 0) { + // ToDo: https://github.com/numpy/numpy/blob/5d6a9f0030e8d1a63e43783c2b5b54cde93bc5d0/numpy/core/src/multiarray/ctors.c#L940 + throw new Sk.builtin.TypeError('Empty data-type'); + } + + for (i = 0; i < nd; i++) { + var dim = dims[i]; + + if (dim == null) { + continue; + } + + if (dim < 0) { + throw new Sk.builtin.ValueError('negative dimensions are not allowed'); + } + + // calculate size of array + // https://github.com/numpy/numpy/blob/5d6a9f0030e8d1a63e43783c2b5b54cde93bc5d0/numpy/core/src/multiarray/ctors.c#L982 + size = dim * size; + if (size == Number.MAX_VALUE) { + throw new Sk.builtin.ValueError('array is too big.'); + } + } + + fa = {}; // fa = (PyArrayObject_fields *) subtype->tp_alloc(subtype, 0); + + fa.nd = nd; + fa.dimensions = null; + fa.data = null; + + if (data == null) { + fa.flags = NPY_ARRAY_DEFAULT; + if (flags) { + if (flags) { + fa.flags |= NPY_ARRAY_F_CONTIGUOUS; + if (nd > 1) { + fa.flags &= ~NPY_ARRAY_C_CONTIGUOUS; + } + flags = NPY_ARRAY_F_CONTIGUOUS; + } + } + } else { + fa.flags = (flags & ~NPY_ARRAY_UPDATEIFCOPY); + } + + fa.descr = descr; + fa.base = null; + fa.weakreflist = null; + + if (nd > 0) { + fa.dimensions = []; + fa.strides = []; + // fill dimensions + dims.map(function(d) { + fa.dimensions.push(d); + }); + + if (strides == null) { + // fill them in + sd = _array_fill_strides(fa.strides, dims, nd, sd, flags, fa.flags); + } else { + strides.map(function(s) { + fa.strides.push(s); + }); + sd *= size; + } + } else { + fa.dimensions = null; + fa.strides = null; + fa.flags |= NPY_ARRAY_F_CONTIGUOUS; + } + + if (data == null) { + // Allocate something even for zero-space arrays, e.g. shape=(0,) + if (sd == 0) { + sd = 1; + } + + if (zeroed) { + // ToDo: check if we need todo something here! + data = []; + } else { + data = []; + } + + fa.flags |= NPY_ARRAY_OWNDATA; + } else { + fa.flags &= ~NPY_ARRAY_OWNDATA; + } + + // map data? + fa.data = data; + + // ToDo: https://github.com/numpy/numpy/blob/5d6a9f0030e8d1a63e43783c2b5b54cde93bc5d0/numpy/core/src/multiarray/ctors.c#L1090 + // we do not support finalize methods (skulpt does do it either!) + + // fa is now just plain JS for representing an ndarray + // we now use skulpt code to make a real python/skulpt ndarray version out of it + var pyShape = new Sk.builtin.tuple((fa.dimensions || []).map(function(d) { + return new Sk.builtin.int_(d); + })); + + // we need to make a deep copy of each item + var pyBuffer = new Sk.builtin.list(fa.data); + + var dtype = fa.descr; + + return Sk.misceval.callsim(mod[CLASS_NDARRAY], pyShape, dtype, pyBuffer); + } + + function _array_fill_strides(strides, dims, nd, itemsize, infalg, objflags) { + var i; + var not_cf_contig = 0; + var nod = 0; // A dim 1= 1 was found + + // Check if new array is both F- and C-contigous + for (i = 0; i < nd; i++) { + if (dims[i] != 1) { + if (nod) { + not_cf_contig = 1; + break; + } + nod = 1; + } + } + + // Only make fortran strides if not contigous as well + // actually we do not really care, do we? + // ToDo: maybe add this later (see ctors.c) + for (i = nd - 1; i >= 0; i--) { + strides[i] = itemsize; + if (dims[i]) { + itemsize *= dims[i]; + } + else { + not_cf_contig = 0; + } + if (dims[i] == 1) { + /* For testing purpose only */ + strides[i] = NPY_MAX_INTP; + } + } + + /* + if (not_cf_contig) { + *objflags = ((*objflags)|NPY_ARRAY_C_CONTIGUOUS) & + ~NPY_ARRAY_F_CONTIGUOUS; + } + else { + *objflags |= (NPY_ARRAY_C_CONTIGUOUS|NPY_ARRAY_F_CONTIGUOUS); + } + */ + + return itemsize; + } + + function PyArray_NewFromDescr(subtype, descr, nd, dims, strides, data, flags, obj) { + return PyArray_NewFromDescr_int(subtype, descr, nd, dims, strides, data, flags, obj, 0); + } + + /*NUMPY_API + * Generic new array creation routine. + */ + function PyArray_New(subtype, nd, dims, type_num, strides, data, itemsize, flags, obj) { + var descr; + var _new; + + descr = PyArray_DescrFromType(type_num); + if (descr == null) { + return null; + } + + // we do not do any itemsize check as we do not need to allocate memory like in C + _new = PyArray_NewFromDescr(subtype, descr, nd, dims, strides, data, flags, obj); + + return _new; + } + + function new_array_for_sum(ap1, ap2, out, nd, dimensions, typenum) { + var ret; + var subtype; + var prior1; + var prior2; + + // Sk.builtin.type == Py_TYPE macro + if (Sk.builtin.type(ap2) != Sk.builtin.type(ap1)) { + prior = PyArray_GetPriority(ap2, 0.0); + prior = PyArray_GetPriority(ap1, 0.0); + subtype = (prior2 > prior1 ? Sk.builtin.type(ap2) : Sk.builtin.type(ap1)); + } else { + prior1 = prior2 = 0.0; + subtype = Sk.builtin.type(ap1); + } + + if (out != null) { + throw new Error('new_array_for_sum does not support "out" parameter'); + } + + ret = PyArray_New(subtype, nd, dimensions, typenum, null, null, 0, 0, (prior2 > prior1 ? ap2 : ap1)); + + return ret; + } + + // PyObject* PyArray_FromAny(PyObject* op, PyArray_Descr* dtype, int min_depth, int max_depth, int requirements, PyObject* context) + /* + * - op: is any value or sequence that will be converted to an array (Python Object) + * - dtype: is callable constructor for the type (ie Sk.builtin.int_) (Python Object) + * - min_depth: we may enfore a minimum of dimensions (Python Int) + * - max_depth: maximum of dimensions (Python Int) + * - requirements: same flags to set, we do not support those (int) + * - context: ??? + */ + function PyArray_FromAny(op, dtype, min_depth, max_depth, requirements, context) { + if (op == null) { + throw new Error('Internal PyArray_FromAny API-Call error. "op" must not be null.'); + } + + if (dtype == null || Sk.builtin.checkNone(dtype)) { + dtype = PyArray_DTypeFromObject(op, NPY_MAXDIMS); + if (dtype == null) { + dtype = PyArray_DescrFromType(NPY_DEFAULT_TYPE); + } + } + + var elements = []; + var state = {}; + state.level = 0; + state.shape = []; + + if (PyArray_Check(op)) { + elements = PyArray_DATA(op); + state = {}; + state.level = 0; + state.shape = PyArray_DIMS(op);; + } else { + // now get items from op and create a new buffer object. + unpack(op, elements, state); + } + + // apply dtype castings + for (i = 0; i < elements.length; i++) { + elements[i] = PyArray_Cast_Obj(elements[i], dtype); + } + + // check for min_depth + var ndmin = Sk.builtin.asnum$(min_depth); + if (ndmin >= 0 && ndmin > state.shape.length) { + var _ndmin_array = []; + for (i = 0; i < ndmin - state.shape.length; i++) { + _ndmin_array.push(1); + } + state.shape = _ndmin_array.concat(state.shape); + } + + // call array method or create internal ndarray constructor + var _shape = new Sk.builtin.tuple(state.shape.map(function (x) { + return new Sk.builtin.int_(x); + })); + + var _buffer = new Sk.builtin.list(elements); + + switch (dtype){ + case Sk.builtin.int_: + dtype="int"; + break; + case Sk.builtin.float_: + dtype="float"; + break; + } + + // create new ndarray instance + return Sk.misceval.callsim(mod[CLASS_NDARRAY], _shape, dtype, + _buffer); + } + + function convert_shape_to_string(n, vals, ending) { + var i; + var ret; + var tmp; + + for (i = 0; i < n && vals[i] < 0; i++); + + if (i === n) { + return Sk.abstr.numberBinOp(new Sk.builtin.str('()%s'), new Sk.builtin.str(ending), 'Mod'); + } else { + ret = Sk.abstr.numberBinOp(new Sk.builtin.str('(%i'), vals[i++], 'Mod'); + } + + for (; i < n; ++i) { + if (vals[i] < 0) { + tmp = new Sk.builtin.str(",newaxis"); + } else { + tmp = Sk.abstr.numberBinOp(new Sk.builtin.str(',%i'), vals[i], 'Mod'); + } + + ret = Sk.abstr.numberBinOp(ret, tmp, 'Add'); + } + + if (i == 1) { + tmp = Sk.abstr.numberBinOp(new Sk.builtin.str(',)%s'), new Sk.builtin.str(ending), 'Mod'); + } else { + tmp = Sk.abstr.numberBinOp(new Sk.builtin.str(')%s'), new Sk.builtin.str(ending), 'Mod'); + } + ret = Sk.abstr.numberBinOp(ret, tmp, 'Add'); + return ret; + + } + + function dot_alignment_error(a, i, b, j) { + var errmsg = null; + var format = null; + var fmt_args = null; + var i_obj = null; + var j_obj = null; + var shape1 = null; + var shape2 = null; + var shape1_i = null; + var shape2_j = null; + + format = new Sk.builtin.str("shapes %s and %s not aligned: %d (dim %d) != %d (dim %d)"); + shape1 = convert_shape_to_string(PyArray_NDIM(a), PyArray_DIMS(a), ""); + shape2 = convert_shape_to_string(PyArray_NDIM(b), PyArray_DIMS(b), ""); + + i_obj = new Sk.builtin.int_(i); + j_obj = new Sk.builtin.int_(j); + + shape1_i = new Sk.builtin.int_(PyArray_DIM(a, i)); + shape2_j = new Sk.builtin.int_(PyArray_DIM(b, j)); + + if (!format || !shape1 || !shape2 || !i_obj || !j_obj || + !shape1_i || !shape2_j) { + return; + } + + fmt_args = new Sk.builtin.tuple([shape1, shape2, shape1_i, i_obj, shape2_j, j_obj]); + + errmsg = Sk.abstr.numberBinOp(format, fmt_args, 'Mod'); + if (errmsg != null) { + throw new Sk.builtin.ValueError(errmsg); + } else { + throw new Sk.builtin.ValueError('shapes are not aligned'); + } + } + + // utility functions to create a real copy of the underlying data + function PyArray_CopyBuffer(arr) { + var res = []; + var buffer = PyArray_DATA(arr); + var it = PyArray_IterNew(arr); + + while (it.index < it.size) { + res.push(Sk.misceval.callsim(PyArray_DESCR(arr), buffer[it.dataptr])); + PyArray_ITER_NEXT(it); + } + + return res; + } + + /*NUMPY_API + * Numeric.matrixproduct(a,v) + * just like inner product but does the swapaxes stuff on the fly + */ + // from multiarraymodule.c Line: 940 + function MatrixProdcut(op1, op2) { + return this.MatrixProduct2(op1, op2, null); + } + + /*NUMPY_API + * Numeric.matrixproduct2(a,v,out) + * just like inner product but does the swapaxes stuff on the fly + * array_dot: https://github.com/numpy/numpy/blob/d033b6e19fc95a1f1fd6592de8318178368011b1/numpy/core/src/multiarray/methods.c#L2037 + * + * MatrixProduct2: https://github.com/numpy/numpy/blob/f43d691fd0b9b4f416b50fba34876691af2d0bd4/numpy/core/src/multiarray/multiarraymodule.c#L950 + */ + function MatrixProdcut2(op1, op2, out) { + var ap1; // PyArrayObject + var ap2; // PyArrayObject + var ret = null; // PyArrayObject + var i; // npy_intp (int pointer) + var j; // npy_intp (int pointer) + var l; // npy_intp (int pointer) + var typenum; // int + var nd; // int + var axis; // int + var matchDim; // int + var is1; // npy_intp + var is2; // npy_intp + var os; // npy_intp + var op; // char *op + var dimensions = new Array(); // npy_intp dimensions[NPY_MAXDIMS]; + var dot; // PyArrray_DotFunc *dot + var typec = null; // PyArray_Descr *typec = NULL; + + // make new pyarray object types from ops + typenum = PyArray_ObjectType(op1, 0); + typenum = PyArray_ObjectType(op2, typenum); + + // get type descriptor for the type, for us it is the javascript constructor + // of the type, that we store as a dtype + typec = PyArray_DescrFromType(typenum); + + // we currently do not support this specific check for common data type + if (typec === null) { + throw new Sk.builtin.ValueError('Cannot find a common data type.'); + } + + ap1 = PyArray_FromAny(op1, typec, 0, 0, 'NPY_ARRAY_ALINGED', null); + ap2 = PyArray_FromAny(op2, typec, 0, 0, 'NPY_ARRAY_ALINGED', null); + + // check dimensions + + // handle 0 dim cases + if (PyArray_NDIM(ap1) == 0 || PyArray_NDIM(ap2) == 0) { + ret = PyArray_NDIM(ap1) == 0 ? ap1 : ap2; + ret = ret.nb$multiply.call(ap1, ap2); + + return ret; + } + + l = PyArray_DIMS(ap1)[PyArray_NDIM(ap1) - 1]; + if (PyArray_NDIM(ap2) > 1) { + matchDim = PyArray_NDIM(ap2) - 2; + } else { + matchDim = 0; + } + + if (PyArray_DIMS(ap2)[matchDim] != l) { + dot_alignment_error(ap1, PyArray_NDIM(ap1) - 1, ap2, matchDim); + } + + nd = PyArray_NDIM(ap1) + PyArray_NDIM(ap2) - 2; + if (nd > NPY_MAXDIMS) { + throw new Sk.builtin.ValueError('dot: too many dimensions in result'); + } + + j = 0; + for (i = 0; i < PyArray_NDIM(ap1) - 1; i++) { + dimensions[j++] = PyArray_DIMS(ap1)[i]; + } + for (i = 0; i < PyArray_NDIM(ap2) - 2; i++) { + dimensions[j++] = PyArray_DIMS(ap2)[i]; + } + if(PyArray_NDIM(ap2) > 1) { + dimensions[j++] = PyArray_DIMS(ap2)[PyArray_NDIM(ap2)-1]; + } + + is1 = PyArray_STRIDES(ap1)[PyArray_NDIM(ap1)-1]; + is2 = PyArray_STRIDES(ap2)[matchDim]; + /* Choose which subtype to return */ + ret = new_array_for_sum(ap1, ap2, out, nd, dimensions, typenum); + + // Hint: the switch case function replaces the following lines + //dot = PyArray_DESCR(ret)->f->dotfunc; + //if (dot == NULL) { + // PyErr_SetString(PyExc_ValueError, + // "dot not available for this type"); + // goto fail; + //} + switch (typenum) { + case 0: + case 1: + case 2: + case 3: + dot = OBJECT_dot; + break; + default: + throw new Sk.builtin.ValueError('dot not available for this type'); + } + + op = PyArray_DATA(ret); + // os = PyArray_DESCR(ret).elsize; // we do not have element sizes in JavaScript + os = 1; // we just deal with normal indicis + + axis = PyArray_NDIM(ap1) - 1; + it1 = PyArray_IterAllButAxis(ap1, axis); + + if (it1 == null) { + return null; + } + + it2 = PyArray_IterAllButAxis(ap2, matchDim); + + if (it2 == null) { + return null; + } + + // it.dataptr is just the index to the current element (as we do not have C pointers in Javascript) + var op_i = 0; // own helper for assinging the result with out passing a pointer to dot method + var it1DeRefDataPtr; // reference to an array or subarray + var it2DeRefDataPtr; // reference to an array or subarray based on it.dataptr derefenced + while (it1.index < it1.size) { + it1DeRefDataPtr = PyArray_DATA(it1.ao).slice(it1.dataptr); + while (it2.index < it2.size) { + it2DeRefDataPtr = PyArray_DATA(it2.ao).slice(it2.dataptr); + op[op_i] = dot(it1DeRefDataPtr, is1, it2DeRefDataPtr, is2, null, l, ret); + op_i += os; + PyArray_ITER_NEXT(it2); + } + PyArray_ITER_NEXT(it1); + PyArray_ITER_RESET(it2); + } + + return ret; + } + + function PyTypeNum_ISFLEXIBLE(type) { + // ToDo: uncomment this, when we've added all types from ndarraytypes.h + return false; //(((type) >= NPY_STRING) && ((type) <= NPY_VOID)); + } + + function PyTypeNum_ISEXTENDED(type) { + return PyTypeNum_ISFLEXIBLE; /* || PyTypeNum_ISUSERDEF(type) */ + } + + function replaceAt(str, index, character) { + return str.substr(0, index) + character + str.substr(index+character.length); + } + + function dump_data(strPtr, nPtr, max_n, data, nd, dimensions, strides, self) { + var descr = PyArray_DESCR(self); + var op = null; + var sp = null; + var ostring; + var i; + var N; + var ret = 0; + + if (nd === 0) { + op = data[0]; + sp =new Sk.builtin.str(op); + N = sp.v.length; + nPtr.n += N; + strPtr.str += sp.v; + } else { + strPtr.str += "["; + nPtr.n += 1; + for (i = 0; i < dimensions[0]; i++) { + var newData = data.slice(strides[0] * i); + var newDimensions = dimensions.slice(1); + var newStrides = strides.slice(1); + dump_data(strPtr, nPtr, max_n, newData, nd - 1, newDimensions, newStrides, self); + + if (i < dimensions[0] - 1) { + strPtr.str += ','; + strPtr.str += ' '; // replaceAt(str, nPtr.n + 1, ' '); + nPtr.n += 2; + } + } + + strPtr.str += ']'; //replaceAt(str, nPtr.n, ']'); + nPtr.n += 1; + } + + return ret; + } + + function array_repr_builtin(self, repr) { + // self is ndarrray + // repr is int + var ret; + var string; + var n = 0; + var max_n = 0; // stupid mem alloc stuff -.- + var format; + var fmt_args; + var nPtr = {n: n}; + var strPtr = {str: ""}; + dump_data(strPtr, nPtr, max_n, PyArray_DATA(self), PyArray_NDIM(self), PyArray_DIMS(self), PyArray_STRIDES(self), self); + string = new Sk.builtin.str(strPtr.str); + if (repr) { + if (PyTypeNum_ISEXTENDED(self)) { + format = new Sk.builtin.str("array(%s, '%s')"); // required some changes "array(%s, '%c%d')" (we do not have access to elsize) + fmt_args = new Sk.builtin.tuple([string, PyArray_DESCR(self)]); + ret = Sk.abstr.numberBinOp(format, fmt_args, 'Mod'); + } else { + format = new Sk.builtin.str("array(%s, '%s')"); // required some changes "array(%s, '%c%d')" (we do not have access to elsize) + fmt_args = new Sk.builtin.tuple([string, PyArray_DESCR(self)]); + ret = Sk.abstr.numberBinOp(format, fmt_args, 'Mod'); + } + } else { + return string; + } + + return ret; + } + + var PyArray_StrFunction = null; // default there is no string function, if not set + var np = new numpy(); + + var mod = {}; + + // doc string for numpy module + mod.__doc__ = new Sk.builtin.str('\nNumPy\n=====\n\nProvides\n 1. An array object of arbitrary homogeneous items\n 2. Fast mathematical operations over arrays\n 3. Linear Algebra, Fourier Transforms, Random Number Generation\n\nHow to use the documentation\n----------------------------\nDocumentation is available in two forms: docstrings provided\nwith the code, and a loose standing reference guide, available from\n`the NumPy homepage `_.\n\nWe recommend exploring the docstrings using\n`IPython `_, an advanced Python shell with\nTAB-completion and introspection capabilities. See below for further\ninstructions.\n\nThe docstring examples assume that `numpy` has been imported as `np`::\n\n >>> import numpy as np\n\nCode snippets are indicated by three greater-than signs::\n\n >>> x = 42\n >>> x = x + 1\n\nUse the built-in ``help`` function to view a function\'s docstring::\n\n >>> help(np.sort)\n ... # doctest: +SKIP\n\nFor some objects, ``np.info(obj)`` may provide additional help. This is\nparticularly true if you see the line "Help on ufunc object:" at the top\nof the help() page. Ufuncs are implemented in C, not Python, for speed.\nThe native Python help() does not know how to view their help, but our\nnp.info() function does.\n\nTo search for documents containing a keyword, do::\n\n >>> np.lookfor(\'keyword\')\n ... # doctest: +SKIP\n\nGeneral-purpose documents like a glossary and help on the basic concepts\nof numpy are available under the ``doc`` sub-module::\n\n >>> from numpy import doc\n >>> help(doc)\n ... # doctest: +SKIP\n\nAvailable subpackages\n---------------------\ndoc\n Topical documentation on broadcasting, indexing, etc.\nlib\n Basic functions used by several sub-packages.\nrandom\n Core Random Tools\nlinalg\n Core Linear Algebra Tools\nfft\n Core FFT routines\npolynomial\n Polynomial tools\ntesting\n Numpy testing tools\nf2py\n Fortran to Python Interface Generator.\ndistutils\n Enhancements to distutils with support for\n Fortran compilers support and more.\n\nUtilities\n---------\ntest\n Run numpy unittests\nshow_config\n Show numpy build configuration\ndual\n Overwrite certain functions with high-performance Scipy tools\nmatlib\n Make everything matrices.\n__version__\n Numpy version string\n\nViewing documentation using IPython\n-----------------------------------\nStart IPython with the NumPy profile (``ipython -p numpy``), which will\nimport `numpy` under the alias `np`. Then, use the ``cpaste`` command to\npaste examples into the shell. To see which functions are available in\n`numpy`, type ``np.`` (where ```` refers to the TAB key), or use\n``np.*cos*?`` (where ```` refers to the ENTER key) to narrow\ndown the list. To view the docstring for a function, use\n``np.cos?`` (to view the docstring) and ``np.cos??`` (to view\nthe source code).\n\nCopies vs. in-place operation\n-----------------------------\nMost of the functions in `numpy` return a copy of the array argument\n(e.g., `np.sort`). In-place versions of these functions are often\navailable as array methods, i.e. ``x = np.array([1,2,3]); x.sort()``.\nExceptions to this rule are documented.\n\n'); + + /** + Class for numpy.ndarray + **/ + + function remapToJs_shallow(obj, shallow) { + var _shallow = shallow || true; + if (obj instanceof Sk.builtin.list) { + if (!_shallow) { + var ret = []; + for (var i = 0; i < obj.v.length; ++i) { + ret.push(Sk.ffi.remapToJs(obj.v[i])); + } + return ret; + } else { + return obj.v; + } + } else if (obj instanceof Sk.builtin.float_) { + return Sk.builtin.asnum$nofloat(obj); + } else { + return Sk.ffi.remapToJs(obj); + } + } + + /** + Unpacks in any form fo nested Lists, + We need to support sequences and ndarrays here! + **/ + function unpack(py_obj, buffer, state) { + if (PyArray_Check(py_obj)) { + // unpack array, easiest but slow version is to convert the array to a list + py_obj = Sk.misceval.callsim(py_obj.tolist, py_obj); + } + + if (py_obj instanceof Sk.builtin.list || py_obj instanceof Sk.builtin.tuple) { + var py_items = remapToJs_shallow(py_obj); + state.level += 1; + + if (state.level > state.shape.length) { + state.shape.push(py_items.length); + } + var i; + var len = py_items.length; + for (i = 0; i < len; i++) { + unpack(py_items[i], buffer, state); + } + state.level -= 1; + } else { + buffer.push(py_obj); + } + } + + /** + Computes the strides for columns and rows + **/ + function computeStrides(shape) { + var strides = shape.slice(0); + strides.reverse(); + var prod = 1; + var temp; + for (var i = 0, len = strides.length; i < len; i++) { + temp = strides[i]; + strides[i] = prod; + prod *= temp; + } + + return strides.reverse(); + } + + /** + Computes the offset for the ndarray for given index and strides + [1, ..., n] + **/ + function computeOffset(strides, index) { + var offset = 0; + for (var k = 0, len = strides.length; k < len; k++) { + offset += strides[k] * index[k]; + } + return offset; + } + + /** + Calculates the size of the ndarray, dummy + **/ + function prod(numbers) { + var size = 1; + var i; + for (i = 0; i < numbers.length; i++) { + size *= numbers[i]; + } + return size; + } + + function tobufferrecursive(buffer, shape, strides, startdim, dtype) { + var i, n, stride; + var arr, item; + + /* Base case */ + if (startdim >= shape.length) { + return buffer[0]; + } + + n = shape[startdim]; + stride = strides[startdim]; + + arr = []; + + for (i = 0; i < n; i++) { + item = tobufferrecursive(buffer, shape, strides, startdim + 1, dtype); + arr = arr.concat(item); + + buffer = buffer.slice(stride); + } + + return arr + } + + /* + http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html?highlight=tolist#numpy.ndarray.tolist + */ + function tolistrecursive(buffer, shape, strides, startdim, dtype) { + var i, n, stride; + var arr, item; + + /* Base case */ + if (startdim >= shape.length) { + return buffer[0]; + } + + n = shape[startdim]; + stride = strides[startdim]; + + arr = []; + + for (i = 0; i < n; i++) { + item = tolistrecursive(buffer, shape, strides, startdim + 1, dtype); + arr.push(item); + + buffer = buffer.slice(stride); + } + + return new Sk.builtin.list(arr); + } + + /** + internal tolist interface + **/ + function tolist(buffer, shape, strides, dtype) { + var buffer_copy = buffer.slice(0); + return tolistrecursive(buffer_copy, shape, strides, 0, dtype); + } + + /** + An array object represents a multidimensional, homogeneous array of fixed-size items. + An associated data-type object describes the format of each element in the array + (its byte-order, how many bytes it occupies in memory, whether it is an integer, a + floating point number, or something else, etc.) + Arrays should be constructed using array, zeros or empty (refer to the See Also + section below). The parameters given here refer to a low-level method (ndarray(...)) for + instantiating an array. + For more information, refer to the numpy module and examine the the methods and + attributes of an array. + **/ + var ndarray_f = function ($gbl, $loc) { + $loc.__init__ = new Sk.builtin.func(function (self, shape, dtype, buffer, + offset, strides, order) { + var ndarrayJs = {}; // js object holding the actual array + ndarrayJs.shape = Sk.ffi.remapToJs(shape); + + ndarrayJs.strides = computeStrides(ndarrayJs.shape); + ndarrayJs.dtype = dtype ; + ndarrayJs.flags = 0x0; // set flags to zero + // allow any nested data structure + if (buffer && buffer instanceof Sk.builtin.list) { + ndarrayJs.buffer = buffer.v; // ToDo: change this to any sequence and iterate over objects? + } + + self.v = ndarrayJs; // value holding the actual js object and array + self.tp$name = CLASS_NDARRAY; // set class name + }); + + $loc._internalGenericGetAttr = Sk.generic.setAttr; + + $loc.__getattr__ = new Sk.builtin.func(function (self, name) { + console.log("enter get") + if (name != null && (Sk.builtin.checkString(name) || typeof name === "string")) { + var _name = name; + + // get javascript string + if (Sk.builtin.checkString(name)) { + _name = Sk.ffi.remapToJs(name); + } + + switch (_name) { + case 'ndim': + return new Sk.builtin.int_(PyArray_NDIM(self)); + case 'dtype': + return self.v.dtype; + case 'shape': + return new Sk.builtin.tuple(PyArray_DIMS(self).map( + function (x) { + return new Sk.builtin.int_(x); + })); + case 'strides': + return new Sk.builtin.tuple(PyArray_STRIDES(self).map( + function (x) { + return new Sk.builtin.int_(x); + })); + case 'size': + return new Sk.builtin.int_(PyArray_SIZE(self)); + case 'data': + return new Sk.builtin.list(PyArray_DATA(self)); + case 'T': + if (PyArray_NDIM(self) < 2) { + return self + } else { + return Sk.misceval.callsim(self.transpose, self); + } + } + } + + var r, f, ret; + // if we have not returned yet, try the genericgetattr + if (self.tp$getattr !== undefined) { + f = self.tp$getattr("__getattribute__"); + } + + if (f !== undefined) { + ret = Sk.misceval.callsimOrSuspend(f, new Sk.builtin.str(_name)); + } + + if (r === undefined) { + throw new Sk.builtin.AttributeError("'" + Sk.abstr.typeName(self) + "' object has no attribute '" + _name + "'"); + } + return r; + }); + + // ndmin cannot be set, etc... + $loc.__setattr__ = new Sk.builtin.func(function (self, name, value) { + console.log("enter set") + if (name != null && (Sk.builtin.checkString(name) || typeof name === "string")) { + var _name = name; + + // get javascript string + if (Sk.builtin.checkString(name)) { + _name = Sk.ffi.remapToJs(name); + } + + switch (_name) { + case 'shape': + // trigger reshape; + var js_shape = PyArray_UNPACK_SHAPE(self, value); + self.v.strides = computeStrides(js_shape); + self.v.shape = js_shape; + return; + } + } + + // builtin: --> all is readonly (I am not happy with this) + throw new Sk.builtin.AttributeError("'ndarray' object attribute '" + name + "' is readonly"); + }); + + /* + Return the array as a (possibly nested) list. + Return a copy of the array data as a (nested) Python list. Data items are + converted to the nearest compatible Python type. + */ + $loc.tolist = new Sk.builtin.func(function (self) { + var ndarrayJs = Sk.ffi.remapToJs(self); + var list = tolist(ndarrayJs.buffer, ndarrayJs.shape, ndarrayJs.strides, ndarrayJs.dtype); + + return list; + }); + + $loc.reshape = new Sk.builtin.func(function (self, shape, order) { + Sk.builtin.pyCheckArgs("reshape", arguments, 2, 3); + // if the first dim is -1, then the size in infered from the size + // and the other dimensions + var js_shape = PyArray_UNPACK_SHAPE(self, shape); + + // create python object for shape + var py_shape = Sk.ffi.remapToPy(js_shape); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], py_shape, PyArray_DESCR(self), + new Sk.builtin.list(PyArray_DATA(self))); + }); + + $loc.copy = new Sk.builtin.func(function (self, order) { + Sk.builtin.pyCheckArgs("copy", arguments, 1, 2); + var ndarrayJs = Sk.ffi.remapToJs(self); + var buffer = PyArray_DATA(self).map(function (x) { + return x; + }); + var shape = new Sk.builtin.tuple(PyArray_DIMS(self).map(function (x) { + return new Sk.builtin.int_(x); + })); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], shape, PyArray_DESCR(self), + new Sk.builtin.list(buffer)); + }); + + /** + Fill the array with a scalar value. + Parameters: value: scalar + All elements of a will be assigned this value + **/ + $loc.fill = new Sk.builtin.func(function (self, value) { + Sk.builtin.pyCheckArgs("fill", arguments, 2, 2); + var ndarrayJs = Sk.ffi.remapToJs(self); + var buffer = ndarrayJs.buffer.map(function (x) { + return x; + }); + var i; + for (i = 0; i < ndarrayJs.buffer.length; i++) { + if (ndarrayJs.dtype) { + ndarrayJs.buffer[i] = Sk.misceval.callsim(ndarrayJs.dtype, + value); + } + } + }); + + $loc.__getslice__ = new Sk.builtin.func( function (self, start, stop) { + console.log("enter getslice") + Sk.builtin.pyCheckArgs( "[]", arguments, 2, 3 ); + var ndarrayJs = Sk.ffi.remapToJs( self ); + var _index; // current index + var _buffer; // buffer as python type + var buffer_internal; // buffer als js array + var _stride; // stride + var _shape; // shape as js + var i; + var _start; + var _stop; + + if ( !Sk.builtin.checkInt( start ) && !( Sk.builtin.checkInt( stop ) || Sk.builtin.checkNone( stop ) || stop === undefined) ) { + // support for slices e.g. [1,4] or [0,] + + _start = Sk.ffi.remapToJs(start); + if(stop === undefined || Sk.builtin.checkNone( stop )) { + _stop = ndarrayJs.buffer.length; + } else { + _stop = Sk.ffi.remapToJs(start); + } + + if(_start < 0 || _stop < 0) { + throw new Sk.builtin.IndexError('Use of negative indices is not supported.'); + } + + buffer_internal = []; + _index = 0; + for ( i = _start; i < _stop; i += 1 ) { + buffer_internal[ _index++ ] = ndarrayJs.buffer[ i ]; + } + _buffer = new Sk.builtin.list( buffer_internal ); + _shape = new Sk.builtin.tuple( [ buffer_internal.length ].map( + function (x) { + return new Sk.builtin.int_( x ); + } ) ); + return Sk.misceval.callsim(mod[ CLASS_NDARRAY ], _shape, undefined, + _buffer ); + } else { + throw new Sk.builtin.ValueError( 'Index "' + _index + + '" must be int' ); + } + } ); + + $loc.__setslice__ = new Sk.builtin.func( function (self, start, stop, value) { + console.log("enter setslice") + Sk.builtin.pyCheckArgs( "[]", arguments, 3, 2 ); + var ndarrayJs = Sk.ffi.remapToJs( self ); + var _index; // current index + var _buffer; // buffer as python type + var buffer_internal; // buffer als js array + var _stride; // stride + var _shape; // shape as js + var i; + var _start; + var _stop; + + if ( !Sk.builtin.checkInt( start ) && !( Sk.builtin.checkInt( stop ) || Sk.builtin.checkNone( stop ) || stop === undefined) ) { + // support for slices e.g. [1,4] or [0,] + + _start = Sk.ffi.remapToJs(start); + if(stop === undefined || Sk.builtin.checkNone( stop )) { + _stop = ndarrayJs.buffer.length; + } else { + _stop = Sk.ffi.remapToJs(start); + } + + if(_start < 0 || _stop < 0) { + throw new Sk.builtin.IndexError('Use of negative indices is not supported.'); + } + + for ( i = _start; i < _stop; i += 1 ) { + ndarrayJs.buffer[computeOffset(ndarrayJs.strides, i)] = value; + } + } else { + throw new Sk.builtin.ValueError( 'Index "' + index + + '" must be int' ); + } + } ); + + $loc.__getitem__ = new Sk.builtin.func(function (self, index) { + console.log("enter getitem") + Sk.builtin.pyCheckArgs("[]", arguments, 2, 2); + var ndarrayJs = Sk.ffi.remapToJs(self); + var _index; // current index + var _buffer; // buffer as python type + var buffer_internal; // buffer als js array + var _stride; // stride + var _shape; // shape as js + var i; + // single index e.g. [3] + if (Sk.builtin.checkInt(index)) { + var offset = Sk.ffi.remapToJs(index); + + if (ndarrayJs.shape.length > 1) { + _stride = ndarrayJs.strides[0]; + buffer_internal = []; + _index = 0; + + for (i = offset * _stride, ubound = (offset + 1) * _stride; i < + ubound; i++) { + buffer_internal[_index++] = ndarrayJs.buffer[i]; + } + + _buffer = new Sk.builtin.list(buffer_internal); + _shape = new Sk.builtin.tuple(Array.prototype.slice.call( + ndarrayJs.shape, + 1) + .map(function (x) { + return new Sk.builtin.int_(x); + })); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], _shape, + undefined, + _buffer); + } else { + if (offset >= 0 && offset < ndarrayJs.buffer.length) { + return ndarrayJs.buffer[offset]; + } else { + throw new Sk.builtin.IndexError("array index out of range"); + } + } + } else if (index instanceof Sk.builtin.tuple) { + // index like [1,3] + var keyJs = Sk.ffi.remapToJs(index); + if (keyJs.length != PyArray_NDIM(self)) { + throw new Sk.builtin.ValueError('Tuple must contain values for all dimensions'); + } + // ToDo: implement buffer returning for smaller bits + return ndarrayJs.buffer[computeOffset(ndarrayJs.strides, keyJs)]; + } else if (index instanceof Sk.builtin.slice) { + // support for slices e.g. [1:4:-1] + var length = Sk.builtin.len(self); + buffer_internal = []; + length = Sk.ffi.remapToJs(length); + index.sssiter$(length, function (i, wrt) { + if (i >= 0 && i < length) { + buffer_internal.push(PyArray_DATA(self)[i]); + } + }); + _buffer = new Sk.builtin.list(buffer_internal); + _shape = new Sk.builtin.tuple([buffer_internal.length].map( + function ( + x) { + return new Sk.builtin.int_(x); + })); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], _shape, undefined, + _buffer); + } else { + throw new Sk.builtin.ValueError('Index "' + index + + '" must be int, slice or tuple'); + } + }); + + $loc.__setitem__ = new Sk.builtin.func(function (self, index, value) { + console.log("enter setitem") + var ndarrayJs = Sk.ffi.remapToJs(self); + Sk.builtin.pyCheckArgs("[]", arguments, 3, 3); + if (Sk.builtin.checkInt(index)) { + var _offset = Sk.ffi.remapToJs(index); + if (ndarrayJs.shape.length > 1) { + var _value = Sk.ffi.remapToJs(value); + var _stride = ndarrayJs.strides[0]; + var _index = 0; + + var _ubound = (_offset + 1) * _stride; + var i; + for (i = _offset * _stride; i < _ubound; i++) { + ndarrayJs.buffer[i] = _value[_index++]; + } + } else { + if (_offset >= 0 && _offset < ndarrayJs.buffer.length) { + ndarrayJs.buffer[_offset] = value; + } else { + throw new Sk.builtin.IndexError("array index out of range"); + } + } + } else if (index instanceof Sk.builtin.tuple) { + _key = Sk.ffi.remapToJs(index); + ndarrayJs.buffer[computeOffset(ndarrayJs.strides, _key)] = value; + } else { + throw new Sk.builtin.TypeError( + 'argument "index" must be int or tuple'); + } + }); + + $loc.__len__ = new Sk.builtin.func(function (self) { + console.log("enter len") + var ndarrayJs = Sk.ffi.remapToJs(self); + return new Sk.builtin.int_(ndarrayJs.shape[0]); + }); + + $loc.__iter__ = new Sk.builtin.func(function (self) { + console.log("enter iter") + var ndarrayJs = Sk.ffi.remapToJs(self); + var ret = { + tp$iter: function () { + return ret; + }, + $obj: ndarrayJs, + $index: 0, + tp$iternext: function () { + // ToDo: should we rise here the IterationStop Exception? + if (ret.$index >= ret.$obj.buffer.length) return undefined; + return ret.$obj.buffer[ret.$index++]; + } + }; + return ret; + }); + + function _formatArray(a, format_function, rank, max_line_len, next_line_prefix, separator, edge_items, summary_insert) { + // port the functions and output the items in a nice way + // https://github.com/numpy/numpy/blob/v1.9.1/numpy/core/arrayprint.py#L465 + } + + $loc.__str__ = new Sk.builtin.func(function (self) { + console.log("enter str") + if (PyArray_StrFunction == null) { + return Sk.misceval.callsim(self.__repr__, self); + } else { + return PyArray_StrFunction.call(null, self); + } + }); + + $loc.__repr__ = new Sk.builtin.func(function (self) { + console.log("enter repr") + return array_repr_builtin(self, 1); + }); + + /** + Creates left hand side operations for given binary operator + **/ + function makeNumericBinaryOpLhs(operation) { + return function (self, other) { + var lhs; + var rhs; + var buffer; // external + var _buffer; // internal use + var shape; // new shape of returned ndarray + var i; + + if (PyArray_Check(other)) { + lhs = PyArray_DATA(self); + rhs = PyArray_DATA(other); + _buffer = []; + for (i = 0, len = lhs.length; i < len; i++) { + //_buffer[i] = operation(lhs[i], rhs[i]); + _buffer[i] = Sk.abstr.binary_op_(lhs[i], rhs[i], operation); + } + } else { + lhs = PyArray_DATA(self); + _buffer = []; + for (i = 0, len = lhs.length; i < len; i++) { + _buffer[i] = Sk.abstr.numberBinOp(lhs[i], other, operation); + } + } + + // create return ndarray + shape = new Sk.builtin.tuple(PyArray_DIMS(self).map(function (x) { + return new Sk.builtin.int_(x); + })); + buffer = new Sk.builtin.list(_buffer); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], shape, PyArray_DESCR(self), + buffer); + }; + } + + function makeNumericBinaryOpInplace(operation) { + return function (self, other) { + var lhs; + var rhs; + var i; + + if (PyArray_Check(other)) { + lhs = PyArray_DATA(self); + rhs = PyArray_DATA(other); + for (i = 0, len = lhs.length; i < len; i++) { + lhs[i] = Sk.abstr.binary_op_(lhs[i], rhs[i], operation); + } + } else { + lhs = PyArray_DATA(self); + for (i = 0, len = lhs.length; i < len; i++) { + lhs[i] = Sk.abstr.numberBinOp(lhs[i], other, operation); + } + } + + return self; + }; + } + + + function makeNumericBinaryOpRhs(operation) { + return function (self, other) { + var rhsBuffer = PyArray_DATA(self); + var _buffer = []; + for (var i = 0, len = rhsBuffer.length; i < len; i++) { + _buffer[i] = Sk.abstr.numberBinOp(other, rhsBuffer[i], operation); + } + var shape = new Sk.builtin.tuple(PyArray_DIMS(self).map(function (x) { + return new Sk.builtin.int_(x); + })); + buffer = new Sk.builtin.list(_buffer); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], shape, PyArray_DESCR(self), buffer); + }; + } + + /* + Applies given operation on each element of the ndarray. + */ + function makeUnaryOp(operation) { + return function (self) { + var _buffer =PyArray_DATA(self).map(function (value) { + return Sk.abstr.numberUnaryOp(value, operation); + }); + var shape = new Sk.builtin.tuple(PyArray_DIMS(self).map(function (x) { + return new Sk.builtin.int_(x); + })); + buffer = new Sk.builtin.list(_buffer); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], shape, PyArray_DESCR(self), buffer); + }; + } + + $loc.__add__ = new Sk.builtin.func(makeNumericBinaryOpLhs("Add")); + $loc.__radd__ = new Sk.builtin.func(makeNumericBinaryOpRhs("Add")); + $loc.__iadd__ = new Sk.builtin.func(makeNumericBinaryOpInplace("Add")); + + $loc.__sub__ = new Sk.builtin.func(makeNumericBinaryOpLhs("Sub")); + $loc.__rsub__ = new Sk.builtin.func(makeNumericBinaryOpRhs("Sub")); + $loc.__isub__ = new Sk.builtin.func(makeNumericBinaryOpInplace("Sub")); + + $loc.__mul__ = new Sk.builtin.func(makeNumericBinaryOpLhs("Mult")); + $loc.__rmul__ = new Sk.builtin.func(makeNumericBinaryOpRhs("Mult")); + $loc.__imul__ = new Sk.builtin.func(makeNumericBinaryOpInplace("Mult")); + + $loc.__div__ = new Sk.builtin.func(makeNumericBinaryOpLhs("Div")); + $loc.__rdiv__ = new Sk.builtin.func(makeNumericBinaryOpRhs("Div")); + $loc.__idiv__ = new Sk.builtin.func(makeNumericBinaryOpInplace("Div")); + + $loc.__floordiv__ = new Sk.builtin.func(makeNumericBinaryOpLhs("FloorDiv")); + $loc.__rfloordiv__ = new Sk.builtin.func(makeNumericBinaryOpRhs("FloorDiv")); + $loc.__ifloordiv__ = new Sk.builtin.func(makeNumericBinaryOpInplace("FloorDiv")); + + $loc.__mod__ = new Sk.builtin.func(makeNumericBinaryOpLhs("Mod")); + $loc.__rmod__ = new Sk.builtin.func(makeNumericBinaryOpRhs("Mod")); + $loc.__imod__ = new Sk.builtin.func(makeNumericBinaryOpInplace("Mod")); + + $loc.__xor__ = new Sk.builtin.func(makeNumericBinaryOpLhs("BitXor")); + $loc.__rxor__ = new Sk.builtin.func(makeNumericBinaryOpRhs("BitXor")); + $loc.__ixor__ = new Sk.builtin.func(makeNumericBinaryOpInplace("BitXor")); + + $loc.__lshift__ = new Sk.builtin.func(makeNumericBinaryOpLhs("LShift")); + $loc.__rlshift__ = new Sk.builtin.func(makeNumericBinaryOpRhs("LShift")); + $loc.__ilshift__ = new Sk.builtin.func(makeNumericBinaryOpInplace("LShift")); + + $loc.__rshift__ = new Sk.builtin.func(makeNumericBinaryOpLhs("RShift")); + $loc.__rrshift__ = new Sk.builtin.func(makeNumericBinaryOpRhs("RShift")); + $loc.__irshift__ = new Sk.builtin.func(makeNumericBinaryOpInplace("RShift")); + + $loc.__pos__ = new Sk.builtin.func(makeUnaryOp("UAdd")); + $loc.__neg__ = new Sk.builtin.func(makeUnaryOp("USub")); + + // logical compare functions + $loc.__eq__ = new Sk.builtin.func(function (self, other) { + return Sk.misceval.callsim(mod.equal, self, other); + }); + + $loc.__ne__ = new Sk.builtin.func(function (self, other) { + return Sk.misceval.callsim(mod.not_equal, self, other); + }); + + $loc.__lt__ = new Sk.builtin.func(function (self, other) { + return Sk.misceval.callsim(mod.less, self, other); + }); + + $loc.__le__ = new Sk.builtin.func(function (self, other) { + return Sk.misceval.callsim(mod.less_equal, self, other); + }); + + $loc.__gt__ = new Sk.builtin.func(function (self, other) { + return Sk.misceval.callsim(mod.greater, self, other); + }); + + $loc.__ge__ = new Sk.builtin.func(function (self, other) { + return Sk.misceval.callsim(mod.greater_equal, self, other); + }); + + /** + Simple pow implementation that faciliates the pow builtin + **/ + $loc.__pow__ = new Sk.builtin.func(function (self, other) { + Sk.builtin.pyCheckArgs("__pow__", arguments, 2, 2); + var _buffer = PyArray_DATA(self).map(function (value) { + return Sk.builtin.pow(value, other); + }); + var shape = new Sk.builtin.tuple(PyArray_DIMS(self).map(function (x) { + return new Sk.builtin.int_(x); + })); + buffer = new Sk.builtin.list(_buffer); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], shape, PyArray_DESCR(self), buffer); + }); + + $loc.dot = new Sk.builtin.func(function (self, other) { + var ret; + ret = Sk.misceval.callsim(mod.dot, self, other); + + return ret; + }); + + $loc.__abs__ = new Sk.builtin.func(function (self) { + Sk.builtin.pyCheckArgs("__abs__", arguments, 1, 1); + var _buffer = PyArray_DATA(self).map(function (value) { + return Sk.builtin.abs(value); + }); + + var shape = new Sk.builtin.tuple(PyArray_DIMS(self).map(function (x) { + return new Sk.builtin.int_(x); + })); + + buffer = new Sk.builtin.list(_buffer); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], shape, PyArray_DESCR(self), buffer); + }); + + // reference: https://github.com/numpy/numpy/blob/41afcc3681d250f231aea9d9f428a9e197a47f6e/numpy/core/src/multiarray/shape.c#L692 + $loc.transpose = new Sk.builtin.func(function (self, args) { + // http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.transpose.html + // https://github.com/numpy/numpy/blob/d033b6e19fc95a1f1fd6592de8318178368011b1/numpy/core/src/multiarray/methods.c#L1896 + var shape = Sk.builtin.none.none$; + var n = arguments.length - 1; + var permute = []; + var ret; + + // get args + args = Array.prototype.slice.call(arguments, 1); + + if (n > 1) { + shape = args; + } else if (n === 1) { + shape = args[0]; + } + + if (Sk.builtin.checkNone(shape)) { + ret = PyArray_Transpose(self, null); + } else { + permute = Sk.ffi.remapToJs(shape); + ret = PyArray_Transpose(self, permute); + } + + return ret; + }); + + $loc.any = new Sk.builtin.func(function (self, axis, out) { + return Sk.misceval.callsim(mod.any, self, axis, out); + }); + + $loc.all = new Sk.builtin.func(function (self, axis, out) { + return Sk.misceval.callsim(mod.all, self, axis, out); + }); + + $loc.mean = new Sk.builtin.func(function (self, axis, dtype, out, keepdims) { + return Sk.misceval.callsim(mod.mean, self, axis, dtype, out, keepdims); + }); + + $loc.sum = new Sk.builtin.func(function (self, axis, dtype, out, keepdims) { + return Sk.misceval.callsim(mod.sum, self, axis, dtype, out, keepdims); + }); + + $loc.prod = new Sk.builtin.func(function (self, axis, dtype, out, keepdims) { + return Sk.misceval.callsim(mod.prod, self, axis, dtype, out, keepdims); + }); + + // end of ndarray_f + }; + + mod[CLASS_NDARRAY] = Sk.misceval.buildClass(mod, ndarray_f, + CLASS_NDARRAY, []); + + /** + Trigonometric functions, all element wise + **/ + mod.pi = Sk.builtin.float_(np.math ? np.math.PI : Math.PI); + mod.e = Sk.builtin.float_(np.math ? np.math.E : Math.E); + /** + Trigonometric sine, element-wise. + **/ + + function callTrigonometricFunc(x, op) { + var res; + var num; + + // ToDo: check if we can use ArrayFromAny here! + if (x instanceof Sk.builtin.list || x instanceof Sk.builtin.tuple) { + x = Sk.misceval.callsim(mod.array, x); + } + + if (PyArray_Check(x)) { + var _buffer = PyArray_DATA(x).map(function (value) { + num = Sk.builtin.asnum$(value); + res = op.call(null, num); + return new Sk.builtin.float_(res); + }); + + var shape = new Sk.builtin.tuple(PyArray_DIMS(x).map(function (d) { + return new Sk.builtin.int_(d); + })); + + buffer = new Sk.builtin.list(_buffer); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], shape, PyArray_DESCR(x), buffer); + } else if (Sk.builtin.checkNumber(x)) { + num = Sk.builtin.asnum$(x); + res = op.call(null, num); + return new Sk.builtin.float_(res); + } + + throw new Sk.builtin.TypeError('Unsupported argument type for "x"'); + } + + // Sine, element-wise. + var sin_f = function (x, out) { + Sk.builtin.pyCheckArgs("sin", arguments, 1, 2); + return callTrigonometricFunc(x, np.math ? np.math.sin : Math.sin); + }; + sin_f.co_varnames = ['x', 'out']; + sin_f.$defaults = [0, new Sk.builtin.list([])]; + mod.sin = new Sk.builtin.func(sin_f); + + // Hyperbolic sine, element-wise. + var sinh_f = function (x, out) { + Sk.builtin.pyCheckArgs("sinh", arguments, 1, 2); + if (!np.math) throw new Sk.builtin.OperationError("sinh requires math polyfill"); + return callTrigonometricFunc(x, np.math.sinh); + }; + sinh_f.co_varnames = ['x', 'out']; + sinh_f.$defaults = [0, new Sk.builtin.list([])]; + mod.sinh = new Sk.builtin.func(sinh_f); + + // Inverse sine, element-wise. + var arcsin_f = function (x, out) { + Sk.builtin.pyCheckArgs("arcsin", arguments, 1, 2); + return callTrigonometricFunc(x, np.math ? np.math.asin : Math.asin); + }; + arcsin_f.co_varnames = ['x', 'out']; + arcsin_f.$defaults = [0, new Sk.builtin.list([])]; + mod.arcsin = new Sk.builtin.func(arcsin_f); + + // Cosine, element-wise. + var cos_f = function (x, out) { + Sk.builtin.pyCheckArgs("cos", arguments, 1, 2); + return callTrigonometricFunc(x, np.math ? np.math.cos : Math.cos); + }; + cos_f.co_varnames = ['x', 'out']; + cos_f.$defaults = [0, new Sk.builtin.list([])]; + mod.cos = new Sk.builtin.func(cos_f); + + // Hyperbolic cosine, element-wise. + var cosh_f = function (x, out) { + Sk.builtin.pyCheckArgs("cosh", arguments, 1, 2); + if (!np.math) throw new Sk.builtin.OperationError("cosh requires math polyfill"); + return callTrigonometricFunc(x, np.math.cosh); + }; + cosh_f.co_varnames = ['x', 'out']; + cosh_f.$defaults = [0, new Sk.builtin.list([])]; + mod.cosh = new Sk.builtin.func(cosh_f); + + // Inverse cosine, element-wise. + var arccos_f = function (x, out) { + Sk.builtin.pyCheckArgs("arccos", arguments, 1, 2); + return callTrigonometricFunc(x, np.math ? np.math.acos : Math.acos); + }; + arccos_f.co_varnames = ['x', 'out']; + arccos_f.$defaults = [0, new Sk.builtin.list([])]; + mod.arccos = new Sk.builtin.func(arccos_f); + + // Inverse tangens, element-wise. + var arctan_f = function (x, out) { + Sk.builtin.pyCheckArgs("arctan", arguments, 1, 2); + return callTrigonometricFunc(x, np.math ? np.math.atan : Math.atan); + }; + arctan_f.co_varnames = ['x', 'out']; + arctan_f.$defaults = [0, new Sk.builtin.list([])]; + mod.arctan = new Sk.builtin.func(arctan_f); + + // Tangens, element-wise. + var tan_f = function (x, out) { + Sk.builtin.pyCheckArgs("tan", arguments, 1, 2); + return callTrigonometricFunc(x, np.math ? np.math.tan : Math.tan); + }; + tan_f.co_varnames = ['x', 'out']; + tan_f.$defaults = [0, new Sk.builtin.list([])]; + mod.tan = new Sk.builtin.func(tan_f); + + // Hyperbolic cosine, element-wise. + var tanh_f = function (x, out) { + Sk.builtin.pyCheckArgs("tanh", arguments, 1, 2); + if (!np.math) throw new Sk.builtin.OperationError("tanh requires math polyfill"); + return callTrigonometricFunc(x, np.math.tanh); + }; + tanh_f.co_varnames = ['x', 'out']; + tanh_f.$defaults = [0, new Sk.builtin.list([])]; + mod.tanh = new Sk.builtin.func(tanh_f); + + //新函数:numpy.round() + var round_f=function (x,decimals,out){ + Sk.builtin.pyCheckArgs("round", arguments, 1, 3); + if (!np.math) throw new Sk.builtin.OperationError("round requires math polyfill"); + console.log(callTrigonometricFunc(x, np.math ? np.math.round : Math.round)) + return Sk.misceval.callsim(mod.array, callTrigonometricFunc(x, np.math ? np.math.round : Math.round),Sk.builtin.int_) ; + } + round_f.co_varnames = ['x', 'decimals','out']; + round_f.$defaults = [0, 0 ,new Sk.builtin.list([])]; + mod.round = new Sk.builtin.func(round_f); + + //新函数:numpy.ceil() + var ceil_f=function (x,out){ + Sk.builtin.pyCheckArgs("ceil", arguments, 1, 2); + if (!np.math) throw new Sk.builtin.OperationError("ceil requires math polyfill"); + return Sk.misceval.callsim(mod.array, callTrigonometricFunc(x, np.math ? np.math.ceil : Math.ceil),Sk.builtin.int_) ; + } + ceil_f.co_varnames = ['x', 'out']; + ceil_f.$defaults = [0, new Sk.builtin.list([])]; + mod.ceil = new Sk.builtin.func(ceil_f); + + //新函数:numpy.floor() + var floor_f=function (x,out){ + Sk.builtin.pyCheckArgs("floor", arguments, 1, 2); + if (!np.math) throw new Sk.builtin.OperationError("floor requires math polyfill"); + return Sk.misceval.callsim(mod.array, callTrigonometricFunc(x, np.math ? np.math.floor : Math.floor),Sk.builtin.int_) ; + } + floor_f.co_varnames = ['x', 'out']; + floor_f.$defaults = [0, new Sk.builtin.list([])]; + mod.floor = new Sk.builtin.func(floor_f); + + // Exponential + var exp_f = function (x, out) { + Sk.builtin.pyCheckArgs("exp", arguments, 1, 2); + + /* for complex type support we should use here a different approach*/ + //Sk.builtin.assk$(Math.E, Sk.builtin.nmber.float$); + return callTrigonometricFunc(x, np.math ? np.math.exp : Math.exp); + }; + exp_f.co_varnames = ['x', 'out']; + exp_f.$defaults = [0, new Sk.builtin.list([])]; + mod.exp = new Sk.builtin.func(exp_f); + + // Square Root + var sqrt_f = function (x, out) { + Sk.builtin.pyCheckArgs("sqrt", arguments, 1, 2); + return callTrigonometricFunc(x, np.math ? np.math.sqrt : Math.sqrt); + }; + sqrt_f.co_varnames = ['x', 'out']; + sqrt_f.$defaults = [0, new Sk.builtin.list([])]; + mod.sqrt = new Sk.builtin.func(sqrt_f); + + + /* Simple reimplementation of the linspace function + * http://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html + */ + var linspace_f = function (start, stop, num, endpoint, retstep) { + Sk.builtin.pyCheckArgs("linspace", arguments, 3, 5); + Sk.builtin.pyCheckType("start", "number", Sk.builtin.checkNumber( + start)); + Sk.builtin.pyCheckType("stop", "number", Sk.builtin.checkNumber( + stop)); + if (num === undefined) { + num = 50; + } + var num_num = Sk.builtin.asnum$(num); + var endpoint_bool; + + if (endpoint === undefined) { + endpoint_bool = true; + } else if (endpoint.constructor === Sk.builtin.bool) { + endpoint_bool = endpoint.v; + } + + var retstep_bool; + if (retstep === undefined) { + retstep_bool = false; + } else if (retstep.constructor === Sk.builtin.bool) { + retstep_bool = retstep.v; + } + + var samples; + var step; + + start_num = Sk.builtin.asnum$(start) * 1.0; + stop_num = Sk.builtin.asnum$(stop) * 1.0; + + if (num_num <= 0) { + samples = []; + } else { + + var samples_array; + if (endpoint_bool) { + if (num_num == 1) { + samples = [start_num]; + } else { + step = (stop_num - start_num) / (num_num - 1); + samples_array = np.arange(0, num_num); + samples = samples_array.map(function (v) { + return v * step + start_num; + }); + samples[samples.length - 1] = stop_num; + } + } else { + step = (stop_num - start_num) / num_num; + samples_array = np.arange(0, num_num); + samples = samples_array.map(function (v) { + return v * step + start_num; + }); + } + } + + //return as ndarray! dtype:float + var dtype = Sk.builtin.float_; + for (i = 0; i < samples.length; i++) { + samples[i] = Sk.misceval.callsim(dtype, samples[i]); + } + + var buffer = Sk.builtin.list(samples); + var shape = new Sk.builtin.tuple([samples.length]); + var ndarray = Sk.misceval.callsim(mod[CLASS_NDARRAY], shape, dtype, + buffer); + + if (retstep_bool === true) + return new Sk.builtin.tuple([ndarray, step]); + else + return ndarray; + }; + + // this should allow for named parameters + linspace_f.co_varnames = ['start', 'stop', 'num', 'endpoint', + 'retstep' + ]; + linspace_f.$defaults = [0, 0, 50, true, false]; + mod.linspace = + new Sk.builtin.func(linspace_f); + + /* Simple reimplementation of the arange function + * http://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html#numpy.arange + */ + var arange_f = function (start, stop, step, dtype) { + Sk.builtin.pyCheckArgs("arange", arguments, 1, 4); + Sk.builtin.pyCheckType("start", "number", Sk.builtin.checkNumber( + start)); + var start_num; + var stop_num; + var step_num; + var dtype=dtype || Sk.builtin.none.none$; + + if (stop === undefined && step === undefined) { + start_num = Sk.builtin.asnum$(0); + stop_num = Sk.builtin.asnum$(start); + step_num = Sk.builtin.asnum$(1); + } else if (step === undefined) { + start_num = Sk.builtin.asnum$(start); + stop_num = Sk.builtin.asnum$(stop); + step_num = Sk.builtin.asnum$(1); + } else { + start_num = Sk.builtin.asnum$(start); + stop_num = Sk.builtin.asnum$(stop); + step_num = Sk.builtin.asnum$(step); + } + + // set to float + if (!dtype || dtype == Sk.builtin.none.none$) { + if (Sk.builtin.checkInt(start)){ + dtype = "int"; + }else{ + dtype = "float"; + } + } + + // return ndarray + var arange_buffer = np.arange(start_num, stop_num, step_num); + // apply dtype casting function, if it has been provided + // if (dtype && Sk.builtin.checkClass(dtype)) { + // for (i = 0; i < arange_buffer.length; i++) { + // arange_buffer[i] = Sk.misceval.callsim(dtype, arange_buffer[i]); + // } + // } + // set to float + if (dtype == Sk.builtin.none.none$) { + if (Sk.builtin.checkInt(start)) { + dtype = "int"; + for (i = 0; i < arange_buffer.length; i++) { + arange_buffer[i] = Math.floor(arange_buffer[i]); + } + } else { + dtype = "float"; + for (i = 0; i < arange_buffer.length; i++) { + arange_buffer[i] = new Sk.builtin.float_(arange_buffer[i]); + } + } + }else{ + if(dtype == "int"){ + for (i = 0; i < arange_buffer.length; i++) { + arange_buffer[i] = Math.floor(arange_buffer[i]); + } + }else if(dtype == "float"){ + for (i = 0; i < arange_buffer.length; i++) { + arange_buffer[i] = new Sk.builtin.float_(arange_buffer[i]); + } + } + } + buffer =new Sk.builtin.list(arange_buffer); + var shape = new Sk.builtin.tuple([arange_buffer.length]); + return Sk.misceval.callsim(mod[CLASS_NDARRAY], shape, dtype, + buffer); + }; + + arange_f.co_varnames = ['start', 'stop', 'step', 'dtype']; + arange_f + .$defaults = [0, 1, 1, Sk.builtin.none.none$]; + mod.arange = new Sk.builtin + .func(arange_f); + + /* implementation for numpy.array + ------------------------------------------------------------------------------------------------ + http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html#numpy.array + object : array_like + An array, any object exposing the array interface, an object whose __array__ method returns an array, or any (nested) sequence. + dtype : data-type, optional + The desired data-type for the array. If not given, then the type will be determined as the minimum type required to hold the objects in the sequence. This argument can only be used to ‘upcast’ the array. For downcasting, use the .astype(t) method. + copy : bool, optional + If true (default), then the object is copied. Otherwise, a copy will only be made if __array__ returns a copy, if obj is a nested sequence, or if a copy is needed to satisfy any of the other requirements (dtype, order, etc.). + order : {‘C’, ‘F’, ‘A’}, optional + Specify the order of the array. If order is ‘C’ (default), then the array will be in C-contiguous order (last-index varies the fastest). If order is ‘F’, then the returned array will be in Fortran-contiguous order (first-index varies the fastest). If order is ‘A’, then the returned array may be in any order (either C-, Fortran-contiguous, or even discontiguous). + subok : bool, optional + If True, then sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (default). + ndmin : int, optional + Specifies the minimum number of dimensions that the resulting array should have. Ones will be pre-pended to the shape as needed to meet this requirement. + Returns : + out : ndarray + An array object satisfying the specified requirements + */ + // https://github.com/geometryzen/davinci-dev/blob/master/src/stdlib/numpy.js + // https://github.com/geometryzen/davinci-dev/blob/master/src/ffh.js + // http://docs.scipy.org/doc/numpy/reference/arrays.html + var array_f = function (object, dtype, copy, order, subok, ndmin) { + Sk.builtin.pyCheckArgs("array", arguments, 1, 6); + + // ToDo: use PyArray_FromAny here and then do some checkings for the type + // and maybe casting and support ndmin param + // see http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html#numpy.array + + if (object === undefined) + throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(object) + + "' object is undefined"); + + // check for ndmin param + if (ndmin != null && Sk.builtin.checkInt(ndmin) === false) { + throw new Sk.builtin.TypeError('Parameter "ndmin" must be of type "int"'); + } + + var py_ndarray = PyArray_FromAny(object, dtype, ndmin); + + return py_ndarray; + }; + + array_f.co_varnames = ['object', 'dtype', 'copy', 'order', + 'subok', 'ndmin' + ]; + array_f.$defaults = [null, Sk.builtin.none.none$, true, new Sk.builtin.str( + 'C'), false, new Sk.builtin.int_(0)]; + mod.array = new Sk.builtin.func(array_f); + + var asanyarray_f = function (a, dtype, order) { + //array(a, dtype, copy=False, order=order, subok=True) + return Sk.misceval.callsim(mod.array, dtype, Sk.builtin.bool.false$, order); + }; + + mod.asanyarray = new Sk.builtin.func(asanyarray_f); + asanyarray_f.co_varnames = ['a', 'dtype', 'order']; + asanyarray_f.$defaults = [null, Sk.builtin.none.none$, Sk.builtin.none.none$]; + + /** + Return a new array of given shape and type, filled with zeros. + **/ + var zeros_f = function (shape, dtype, order) { + Sk.builtin.pyCheckArgs("zeros", arguments, 1, 3); + if(!Sk.builtin.checkSequence(shape) && !Sk.builtin.checkInt(shape)) { + throw new Sk.builtin.TypeError('argument "shape" must int or sequence of ints'); + } + + if (dtype instanceof Sk.builtin.list) { + throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(dtype) + + "' is not supported for dtype."); + } + + var _zero = new Sk.builtin.float_(0.0); + + return Sk.misceval.callsim(mod.full, shape, _zero, dtype, order); + }; + zeros_f.co_varnames = ['shape', 'dtype', 'order']; + zeros_f.$defaults = [ + new Sk.builtin.tuple([]), Sk.builtin.none.none$, new Sk.builtin.str('C') + ]; + mod.zeros = new Sk.builtin.func(zeros_f); + + /** + Return a new array of given shape and type, filled with `fill_value`. + **/ + var full_f = function (shape, fill_value, dtype, order) { + Sk.builtin.pyCheckArgs("full", arguments, 2, 4); + + if(!Sk.builtin.checkSequence(shape) && !Sk.builtin.checkInt(shape)) { + throw new Sk.builtin.TypeError('argument "shape" must int or sequence of ints'); + } + + if (dtype instanceof Sk.builtin.list) { + throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(dtype) + + "' is currently not supported for dtype."); + } + + var _shape = Sk.ffi.remapToJs(shape); + var _tup; + if(Sk.builtin.checkInt(shape)) { + _tup = []; + _tup.push(_shape); + _shape = _tup; + } + // generate an array of the dimensions for the generic array method + + var _size = prod(_shape); + var _buffer = []; + var _fill_value = fill_value; + var i; + + for (i = 0; i < _size; i++) { + _buffer[i] = _fill_value; + } + + // if no dtype given and type of fill_value is numeric, assume float + if (!dtype && Sk.builtin.checkNumber(fill_value)) { + dtype = Sk.builtin.float_; + } + + // apply dtype casting function, if it has been provided + if (Sk.builtin.checkClass(dtype)) { + for (i = 0; i < _buffer.length; i++) { + if (_buffer[i] !== Sk.builtin.none.none$) { + _buffer[i] = Sk.misceval.callsim(dtype, _buffer[i]); + } + } + } + return Sk.misceval.callsim(mod[CLASS_NDARRAY], new Sk.builtin.list(_shape), dtype, new Sk.builtin + .list( + _buffer)); + }; + full_f.co_varnames = ['shape', 'fill_value', 'dtype', 'order']; + full_f.$defaults = [ + new Sk.builtin.tuple([]), Sk.builtin.none.none$, Sk.builtin.none.none$, new Sk + .builtin + .str('C') + ]; + mod.full = new Sk.builtin.func(full_f); + + var abs_f = function (x) { + Sk.builtin.pyCheckArgs("abs", arguments, 1, 1); + var ret; + if (PyArray_Check(x) == true) { + // call abs on each element of the array and return new array + // we need to call __abs__ on the ndarray + ret = Sk.misceval.callsim(x.__abs__, x); + } else { + // return abs for element by calling abs + ret = Sk.builtin.abs(x); + } + + return ret; + }; + + mod.abs = new Sk.builtin.func(abs_f); + mod.absolute = mod.abs; + + var mean_f = function (x, axis, dtype, out, keepdims) { + Sk.builtin.pyCheckArgs("mean", arguments, 1, 5); + var ret; + var sum = new Sk.builtin.float_(0.0); // initialised sum var + var mean; + var i = 0; + var _buffer; + var length; + + if (axis != null && !Sk.builtin.checkNone(axis)) { + throw new Sk.builtin.NotImplementedError("the 'axis' parameter is currently not supported"); + } + + if (out != null && !Sk.builtin.checkNone(out)) { + throw new Sk.builtin.NotImplementedError("the 'out' parameter is currently not supported"); + } + + if (keepdims != null && keepdims != Sk.builtin.bool.false$) { + throw new Sk.builtin.NotImplementedError("the 'keepdims' parameter is currently not supported"); + } + + // ToDo: check here for array like + // call PyArrayFromAny + + if (PyArray_Check(x) == true) { + _buffer = PyArray_DATA(x); + length = new Sk.builtin.int_(PyArray_SIZE(x)); + + for (i = 0; i < length.v; i++) { + sum = Sk.abstr.numberBinOp(sum, _buffer[i], 'Add'); + } + + mean = Sk.abstr.numberBinOp(sum, length, 'Div'); + } else { + // return abs for element by calling abs + mean = x + } + + // apply dtype casting + if (dtype != null && !Sk.builtin.checkNone(dtype)) { + mean = Sk.misceval.callsim(dtype, mean); + } + + // call PyArray_Return + return mean; + }; + mean_f.co_varnames = ['a', 'axis', 'dtype', 'out', 'keepdims']; + mean_f.$defaults = [null, Sk.builtin.none.none$, Sk.builtin.none.none$, Sk.builtin.none.none$, Sk.builtin.bool.false$]; + mod.mean = new Sk.builtin.func(mean_f); + + var sum_f = function (x, axis, dtype, out, keepdims) { + Sk.builtin.pyCheckArgs("sum", arguments, 1, 5); + var ret; + var sum = new Sk.builtin.float_(0.0); // initialised sum var + var i = 0; + var _buffer; + var length; + + if (axis != null && !Sk.builtin.checkNone(axis)) { + throw new Sk.builtin.NotImplementedError("the 'axis' parameter is currently not supported"); + } + + if (out != null && !Sk.builtin.checkNone(out)) { + throw new Sk.builtin.NotImplementedError("the 'out' parameter is currently not supported"); + } + + if (keepdims != null && keepdims != Sk.builtin.bool.false$) { + throw new Sk.builtin.NotImplementedError("the 'keepdims' parameter is currently not supported"); + } + + // ToDo: check here for array like + // call PyArrayFromAny + + if (PyArray_Check(x) == true) { + _buffer = PyArray_DATA(x); + length = new Sk.builtin.int_(PyArray_SIZE(x)); + + for (i = 0; i < length.v; i++) { + sum = Sk.abstr.numberBinOp(sum, _buffer[i], 'Add'); + } + } else { + // return abs for element by calling abs + sum = x + } + + // apply dtype casting + if (dtype != null && !Sk.builtin.checkNone(dtype)) { + sum = Sk.misceval.callsim(dtype, sum); + } + + // call PyArray_Return + return sum; + }; + sum_f.co_varnames = ['a', 'axis', 'dtype', 'out', 'keepdims']; + sum_f.$defaults = [null, Sk.builtin.none.none$, Sk.builtin.none.none$, Sk.builtin.none.none$, Sk.builtin.bool.false$]; + mod.sum = new Sk.builtin.func(sum_f); + + var prod_f = function (x, axis, dtype, out, keepdims) { + Sk.builtin.pyCheckArgs("prod", arguments, 1, 5); + var ret; + var prod = new Sk.builtin.float_(1.0); // initialised sum var + var i = 0; + var _buffer; + var length; + + if (axis != null && !Sk.builtin.checkNone(axis)) { + throw new Sk.builtin.NotImplementedError("the 'axis' parameter is currently not supported"); + } + + if (out != null && !Sk.builtin.checkNone(out)) { + throw new Sk.builtin.NotImplementedError("the 'out' parameter is currently not supported"); + } + + if (keepdims != null && keepdims != Sk.builtin.bool.false$) { + throw new Sk.builtin.NotImplementedError("the 'keepdims' parameter is currently not supported"); + } + + // ToDo: check here for array like + // call PyArrayFromAny + + if (PyArray_Check(x) == true) { + _buffer = PyArray_DATA(x); + length = new Sk.builtin.int_(PyArray_SIZE(x)); + + for (i = 0; i < length.v; i++) { + prod = Sk.abstr.numberBinOp(prod, _buffer[i], 'Mult'); + } + } else { + // return abs for element by calling abs + prod = x + } + + // apply dtype casting + if (dtype != null && !Sk.builtin.checkNone(dtype)) { + prod = Sk.misceval.callsim(dtype, prod); + } + + // call PyArray_Return + return prod; + }; + prod_f.co_varnames = ['a', 'axis', 'dtype', 'out', 'keepdims']; + prod_f.$defaults = [null, Sk.builtin.none.none$, Sk.builtin.none.none$, Sk.builtin.none.none$, Sk.builtin.bool.false$]; + mod.prod = new Sk.builtin.func(prod_f); + + + /** + Return a new array of given shape and type, filled with ones. + **/ + var ones_f = function (shape, dtype, order) { + Sk.builtin.pyCheckArgs("ones", arguments, 1, 3); + + if(!Sk.builtin.checkSequence(shape) && !Sk.builtin.checkInt(shape)) { + throw new Sk.builtin.TypeError('argument "shape" must int or sequence of ints'); + } + + if (dtype instanceof Sk.builtin.list) { + throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(dtype) + + "' is not supported for dtype."); + } + + var _one = new Sk.builtin.float_(1.0); + return Sk.misceval.callsim(mod.full, shape, _one, dtype, order); + }; + ones_f.co_varnames = ['shape', 'dtype', 'order']; + ones_f.$defaults = [ + new Sk.builtin.tuple([]), Sk.builtin.none.none$, new Sk.builtin.str('C') + ]; + mod.ones = new Sk.builtin.func(ones_f); + + /** + Return a new array of given shape and type, filled with None. + **/ + var empty_f = function (shape, dtype, order) { + Sk.builtin.pyCheckArgs("empty", arguments, 1, 3); + + if (!Sk.builtin.checkSequence(shape) && !Sk.builtin.checkInt(shape)) { + throw new Sk.builtin.TypeError('argument "shape" must int or sequence of ints'); + } + + if (dtype instanceof Sk.builtin.list) { + throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(dtype) + + "' is not supported for dtype."); + } + + var _empty = Sk.builtin.none.none$; + return Sk.misceval.callsim(mod.full, shape, _empty, dtype, order); + }; + empty_f.co_varnames = ['shape', 'dtype', 'order']; + empty_f.$defaults = [ + new Sk.builtin.tuple([]), Sk.builtin.none.none$, new Sk.builtin.str('C') + ]; + mod.empty = new Sk.builtin.func(empty_f); + + /** + Dot product + **/ + var dot_f = function (a, b, o) { + Sk.builtin.pyCheckArgs("dot", arguments, 2, 3); + var o; + var ret; + + if (Sk.builtin.checkNone(o)) { + o = null; + } + + if (o != null && !PyArray_Check(o)) { + throw new Sk.builtin.TypeError("'out' must be an array"); + } + + ret = MatrixProdcut2(a, b, o); + + return PyArray_Return(ret); + }; + dot_f.co_varnames = ['a', 'b', 'out']; + dot_f.$defaults = [Sk.builtin.none.none$, + Sk.builtin.none.none$, Sk.builtin.none.none$ + ]; + mod.dot = new Sk.builtin.func(dot_f); + + // https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2252 + var vdot_f = function(a, b) { + // a and b must be array like + // if a or b have more than 1 dim => flatten them + var typenum; // int + var ip1; + var ip2; + var op; + var op1 = a; + var op2 = b; + var newdimptr = -1; + var newdims = [-1, 1]; + var ap1 = null; + var ap2 = null; + var ret = null; + var type; + var vdot; + + typenum = PyArray_ObjectType(op1, 0); + typenum = PyArray_ObjectType(op2, typenum); + + type = PyArray_DescrFromType(typenum); + + ap1 = PyArray_FromAny(op1, type, 0, 0, 0, null); + if (ap1 == null) { + return null; + } + + // flatten the array + op1 = PyArray_NewShape(ap1, newdims, 'NPY_CORDER'); + if (op1 == null) { + return; + } + ap1 = op1; + + ap2 = PyArray_FromAny(op2, type, 0, 0, 0, null); + if (ap2 == null) { + return null; + } + + // flatten the array + op2 = PyArray_NewShape(ap2, newdims, 'NPY_CORDER'); + if (op2 == null) { + return; + } + ap2 = op2; + + if (PyArray_DIM(ap2, 0) != PyArray_DIM(ap1, 0)) { + throw new Sk.builtin.ValueError('vectors have different lengths'); + } + + var shape = new Sk.builtin.tuple([0].map( + function (x) { + return new Sk.builtin.int_(x); + })); + // create new empty array for given dimensions + ret = Sk.misceval.callsim(mod.zeros, shape, type); + + n = PyArray_DIM(ap1, 0); + stride1 = PyArray_STRIDE(ap1, 0); + stride2 = PyArray_STRIDE(ap2, 0); + ip1 = PyArray_DATA(ap1); + ip2 = PyArray_DATA(ap2); + op = PyArray_DATA(ret); + + switch(typenum) { + case 0: + case 1: + case 2: + case 3: + vdot = OBJECT_vdot; + break; + default: + throw new Sk.builtin.ValueError('function not available for this data type'); + } + + // call vdot function with vectors + vdot.call(null, ip1, stride1, ip2, stride2, op, n, null); + + // return resulting ndarray + return PyArray_Return(ret); + } + mod.vdot = new Sk.builtin.func(vdot_f); + + var any_f = function(a, axis, out, keepdims) { + Sk.builtin.pyCheckArgs("any", arguments, 1, 4, false); + var arr = PyArray_FromAny(a); + var data = PyArray_DATA(arr); + var i; + var b; + + if (axis != undefined && !Sk.builtin.checkNone(axis)) { + throw new ValueError('"axis" parameter not supported'); + } + + if (out != undefined && !Sk.builtin.checkNone(out)) { + throw new ValueError('"out" parameter not supported'); + } + + // iterate over all items and compare + for (i = 0; i < data.length; i++) { + b = Sk.builtin.bool(data[i]); + if (b == Sk.builtin.bool.true$) { + return Sk.builtin.bool.true$; + } + } + + return Sk.builtin.bool.false$;; + }; + any_f.co_varnames = ['a', 'axis', 'out', 'keepdims']; + any_f.$defaults = [Sk.builtin.none.none$, + Sk.builtin.none.none$, Sk.builtin.bool.false$ + ]; + mod.any = new Sk.builtin.func(any_f); + + var all_f = function(a, axis, out, keepdims) { + Sk.builtin.pyCheckArgs("all", arguments, 1, 4, false); + var arr = PyArray_FromAny(a); + var data = PyArray_DATA(arr); + var i; + var b; + + if (axis != undefined && !Sk.builtin.checkNone(axis)) { + throw new ValueError('"axis" parameter not supported'); + } + + if (out != undefined && !Sk.builtin.checkNone(out)) { + throw new ValueError('"out" parameter not supported'); + } + + // iterate over all items and compare + for (i = 0; i < data.length; i++) { + b = Sk.builtin.bool(data[i]); + if (b == Sk.builtin.bool.false$) { + return Sk.builtin.bool.false$; + } + } + + return Sk.builtin.bool.true$;; + }; + all_f.co_varnames = ['a', 'axis', 'out', 'keepdims']; + all_f.$defaults = [Sk.builtin.none.none$, + Sk.builtin.none.none$, Sk.builtin.bool.false$ + ]; + mod.all = new Sk.builtin.func(all_f); + + function compareLogical(binOp, x1, x2, out) { + var a1 = PyArray_FromAny(x1); + var a2 = PyArray_FromAny(x2); + var data1 = PyArray_DATA(a1); + var data2 = PyArray_DATA(a2); + var buf = []; + var ret; + var shape; + + // hack due to the absence of iter and array broadcasting here + if (!PyArray_Check(x1) && !Sk.builtin.checkSequence(x1) && !PyArray_Check(x2) && !Sk.builtin.checkSequence(x2)) { + return Sk.builtin.bool(Sk.misceval.richCompareBool(x1, x2, binOp)) + } + + // check shape + if (PyArray_SIZE(a1) !== PyArray_SIZE(a2)) { + // try to make arrays bigger + if (PyArray_SIZE(a1) === 1) { + // fill a1 to match a2 + var val = data1[0]; + var i; + for (i = 1; i < PyArray_SIZE(a2); i++) { + data1.push(val); + } + shape = PyArray_DIMS(a2); + } else if (PyArray_SIZE(a2) === 1) { + // fill a1 to match a2 + var val = data2[0]; + var i; + for (i = 1; i < PyArray_SIZE(a1); i++) { + data2.push(val); + } + shape = PyArray_DIMS(a1); + } else { + throw new Sk.builtin.ValueError("operands could not be broadcast together with shapes"); + } + } else { + // same shape prod size + // return shape of first elem + shape = PyArray_DIMS(a1); + } + + if (out != undefined && !Sk.builtin.checkNone(out)) { + throw new ValueError('"out" parameter not supported'); + } + + // iterate over all items and compare + for (i = 0; i < data1.length; i++) { + // TODO! + // should use iterators! + // but for iterators we would need to have shape broadcasting! + buf.push(Sk.builtin.bool(Sk.misceval.richCompareBool(data1[i], data2[i], binOp))); + } + + // ToDo: pass in correct shape or set it afterwards + ret = PyArray_FromAny(new Sk.builtin.list(buf)); + ret = PyArray_NewShape(ret, shape, null); // reshape to match the broadcasting behavior + + return PyArray_Return(ret); + } + + /** + * Basic impl. of the comparison function due to the lack of real shape broadcasting + */ + var less_f = function(x1, x2, out) { + Sk.builtin.pyCheckArgs("less", arguments, 2, 3, false); + return compareLogical('Lt', x1, x2, out); + }; + less_f.co_varnames = ['a', 'axis', 'out', 'keepdims']; + less_f.$defaults = [Sk.builtin.none.none$, + Sk.builtin.none.none$, Sk.builtin.bool.false$ + ]; + mod.less = new Sk.builtin.func(less_f); + + var less_equal_f = function(x1, x2, out) { + Sk.builtin.pyCheckArgs("less_equal", arguments, 2, 3, false); + return compareLogical('LtE', x1, x2, out); + }; + less_equal_f.co_varnames = ['a', 'axis', 'out', 'keepdims']; + less_equal_f.$defaults = [Sk.builtin.none.none$, + Sk.builtin.none.none$, Sk.builtin.bool.false$ + ]; + mod.less_equal = new Sk.builtin.func(less_equal_f); + + var greater_f = function(x1, x2, out) { + Sk.builtin.pyCheckArgs("greater", arguments, 2, 3, false); + return compareLogical('Gt', x1, x2, out); + }; + greater_f.co_varnames = ['a', 'axis', 'out', 'keepdims']; + greater_f.$defaults = [Sk.builtin.none.none$, + Sk.builtin.none.none$, Sk.builtin.bool.false$ + ]; + mod.greater = new Sk.builtin.func(greater_f); + + var greater_equal_f = function(x1, x2, out) { + Sk.builtin.pyCheckArgs("greater_equal", arguments, 2, 3, false); + return compareLogical('GtE', x1, x2, out); + }; + greater_equal_f.co_varnames = ['a', 'axis', 'out', 'keepdims']; + greater_equal_f.$defaults = [Sk.builtin.none.none$, + Sk.builtin.none.none$, Sk.builtin.bool.false$ + ]; + mod.greater_equal = new Sk.builtin.func(greater_equal_f); + + var equal_f = function(x1, x2, out) { + Sk.builtin.pyCheckArgs("equal", arguments, 2, 3, false); + return compareLogical('Eq', x1, x2, out); + }; + equal_f.co_varnames = ['a', 'axis', 'out', 'keepdims']; + equal_f.$defaults = [Sk.builtin.none.none$, + Sk.builtin.none.none$, Sk.builtin.bool.false$ + ]; + mod.equal = new Sk.builtin.func(equal_f); + + var not_equal_f = function(x1, x2, out) { + Sk.builtin.pyCheckArgs("not_equal", arguments, 2, 3, false); + return compareLogical('NotEq', x1, x2, out); + }; + not_equal_f.co_varnames = ['a', 'axis', 'out', 'keepdims']; + not_equal_f.$defaults = [Sk.builtin.none.none$, + Sk.builtin.none.none$, Sk.builtin.bool.false$ + ]; + mod.not_equal = new Sk.builtin.func(not_equal_f); + + mod.identity = new Sk.builtin.func(function (n, dtype) { + Sk.builtin.pyCheckArgs("identity", arguments, 1, 2, false); + //if (dtype == null) { + // dtype = Sk.builtin.none.none$; + //} + + n = new Sk.builtin.int_(n); // convert to int or truncate + + var a; + var b; + // [1]+n*[0] + //var al = Sk.abstr.numberBinOp(new Sk.builtin.list([1]), Sk.abstr.numberBinOp(n, new Sk.builtin.list([0]), 'Mult'), 'Add'); + + // we cannot use flat iter, just generate n*n array and fill with zeros, + //a = Sk.misceval.callsim(mod.array, al, dtype); + b = Sk.misceval.callsim(mod.zeros, new Sk.builtin.tuple([n, n]), dtype); + // b.flat = a; + // just iterate over n*n array and increment i and j, usefo + var i; + var j; + var length = Sk.ffi.remapToJs(n); + var value = PyArray_DESCR(b)(1); + for (i = 0, j = 0; i < length; i++, j++) { + PyArray_DATA(b)[computeOffset(PyArray_STRIDES(b), [i, j])] = value; + } + + return b; + }); + + mod.eye = new Sk.builtin.func(function (N, M, k, dtype) { + throw new Sk.builtin.NotImplementedError( + "eye is not yet implemented"); + }); + + /* not implemented methods */ + mod.ones_like = new Sk.builtin.func(function () { + throw new Sk.builtin.NotImplementedError( + "ones_like is not yet implemented"); + }); + mod.empty_like = new Sk.builtin.func(function () { + throw new Sk.builtin.NotImplementedError( + "empty_like is not yet implemented"); + }); + mod.ones_like = new Sk.builtin.func(function () { + throw new Sk.builtin.NotImplementedError( + "ones_like is not yet implemented"); + }); + mod.arctan2 = new Sk.builtin.func(function () { + throw new Sk.builtin.NotImplementedError( + "arctan2 is not yet implemented"); + }); + mod.asarray = new Sk.builtin.func(array_f); + return mod; +}; diff --git a/mixly/boards/default_src/python_skulpt/others/skulpt/libs/pgzhelper/pgzhelper.js b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/pgzhelper/pgzhelper.js new file mode 100644 index 00000000..c065683d --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/pgzhelper/pgzhelper.js @@ -0,0 +1,5 @@ +var $builtinmodule = function (name) { + let pgzhelper= {__name__: new Sk.builtin.str("pgzhelper")}; + + return pgzhelper; +} diff --git a/mixly/boards/default_src/python_skulpt/others/skulpt/libs/pygal/__init__.js b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/pygal/__init__.js new file mode 100644 index 00000000..80f93644 --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/pygal/__init__.js @@ -0,0 +1,393 @@ +var $builtinmodule = function(name) { + function fill(arr, val) { + if (Array.prototype.fill) { + return Array.prototype.fill.bind(arr)(val, arguments[2], arguments[3]); + } + + // Steps 1-2. + if (arr == null) { + throw new TypeError('arr is null or not defined'); + } + + var O = Object(arr); + + // Steps 3-5. + var len = O.length >>> 0; + + // Steps 6-7. + var start = arguments[2]; + var relativeStart = start >> 0; + + // Step 8. + var k = relativeStart < 0 ? + Math.max(len + relativeStart, 0) : + Math.min(relativeStart, len); + + // Steps 9-10. + var end = arguments[3]; + var relativeEnd = end === undefined ? + len : end >> 0; + + // Step 11. + var final = relativeEnd < 0 ? + Math.max(len + relativeEnd, 0) : + Math.min(relativeEnd, len); + + // Step 12. + while (k < final) { + O[k] = value; + k++; + } + + // Step 13. + return O; + } + + + var mod = {}; + + var COLORS = [ + [255, 89, 149], [182, 227, 84], [254, 237, 108], [140, 237, 255], + [158, 111, 254], [137, 156, 161], [248, 248, 242], [191, 70, 70], + [81, 96, 131], [249, 38, 114], [130, 180, 20], [253, 151, 31], + [86, 194, 214], [128, 131, 132], [140, 84, 254], [70, 84, 87] + ]; + + var KWARGS = ['title', 'width', 'height', 'range', 'include_x_axis', 'x_title', 'y_title', 'title_font_size', 'fill', 'stroke', 'x_labels']; + + function Chart(options) { + this._options = options; + this._data = []; + } + + function rgba(rgb, a) { + return 'rgba(' + rgb.join(',') + ',' + a + ')'; + } + + Chart.prototype.add = function(label, values) { + this._data.unshift({ + name: label, + color: rgba(COLORS[this._data.length%COLORS.length], 0.75), + data: values, + marker : { + symbol: 'circle' + }, + stack : 1 + }); + + return ''; + } + + Chart.prototype.render = function(renderer) { + var options = this._options; + var $elem = Sk.domOutput('
'); + var title_style = { + color: '#FFFFFF' + }; + if (options.title_font_size) { + title_style['font-size'] = options.title_font_size + 'px'; + } + var xPlotLines = []; + var yPlotLines = []; + + if (options.range) { + yPlotLines.push({ + value: options.range.min, + width: 1, + color: '#FFFFFF' + }); + } + + var defaultWidth = Sk.availableWidth || 400; + var defaultHeight = Math.min(defaultWidth, Sk.availableHeight || 300); + + var chart = { + chart: { + width : options.width || defaultWidth, + height: options.height || defaultHeight, + backgroundColor: '#000' + }, + credits: { + enabled: false + }, + title: { + text: options.title, + style : title_style + }, + xAxis: { + title: { + text: options.x_title || null, + style : title_style, + margin: 20 + }, + categories: options.x_labels, + labels : { + enabled: options.x_labels ? true : false + }, + tickLength: 0 + }, + yAxis: { + startOnTick: false, + title: { + text: options.y_title || null, + style : title_style, + margin: 20 + }, + plotLines: yPlotLines, + min : options.include_x_axis + ? 0 + : options.range + ? options.range.min + : null, + max : options.range ? options.range.max : null, + gridLineDashStyle : 'ShortDash', + gridLineColor: '#DDD', + tickLength: 0 + }, + legend: { + itemStyle : { + color : '#FFFFFF' + }, + layout: 'vertical', + align: 'left', + verticalAlign: 'top', + y: 50, + borderWidth: 0 + }, + labels : { + style : { + color: '#FFFFFF' + } + }, + series: this._data + }; + + for(var i = 0; i < chart.series.length; i++) { + chart.series[i].legendIndex = chart.series.length - i; + chart.series[i].index = chart.series.length - i; + } + + if (renderer) { + chart = renderer(options, chart); + } + + $elem.highcharts(chart); + + return ''; + } + + function some(val) { + return val && val !== Sk.builtin.none.none$; + } + + function kwfunc(impl, kwargs) { + if (kwargs && kwargs.length) { + impl.co_varnames = ['__self__'].concat(kwargs); + impl.$defaults = fill(new Array(kwargs.length), Sk.builtin.none.none$); + } + return new Sk.builtin.func(impl); + } + + function createChartType(type, renderer) { + mod[type] = Sk.misceval.buildClass(mod, function($gbl, $loc) { + $loc.__init__ = kwfunc( + function(self, title, width, height, range, include_x_axis, x_title, y_title, title_font_size, fill, stroke, x_labels) { + var options = {}; + if (some(title)) options.title = title.v; + if (some(width)) options.width = width.v; + if (some(height)) options.height = height.v; + if (some(range)) options.range = { + min: range.v[0].v, + max: range.v[1].v + }; + if (some(include_x_axis)) options.include_x_axis = include_x_axis.v; + if (some(x_title)) options.x_title = x_title.v; + if (some(y_title)) options.y_title = y_title.v; + if (some(title_font_size)) options.title_font_size = title_font_size.v; + if (some(fill)) options.fill = fill.v; + if (some(stroke)) options.stroke = stroke.v; + if (some(x_labels)) options.x_labels = x_labels.v; + + self.instance = new Chart(options); + }, KWARGS + ); + + $loc.add = new Sk.builtin.func(function(self, label, values) { + values = (values instanceof Sk.builtin.list) + ? Sk.ffi.remapToJs(values) + : [values.v]; + + return self.instance.add(label.v, values); + }); + + $loc.render = new Sk.builtin.func(function(self) { + var i, key, val; + + for (i = 0; i < KWARGS.length; i++) { + key = KWARGS[i]; + val = self.tp$getattr(key); + + if (typeof val !== "undefined") { + self.instance._options[key] = Sk.ffi.remapToJs(val); + } + } + + return self.instance.render(renderer); + }); + }, type, []); + } + + createChartType('Line', function(options, chart) { + chart.chart.type = options.fill ? 'area' : 'line'; + return chart; + }); + createChartType('StackedLine', function(options, chart) { + chart.chart.type = options.fill ? 'area' : 'line'; + chart.plotOptions = { + area : { + stacking : 'percent' + }, + series : { + stacking : 'percent' + } + }; + return chart; + }); + createChartType('Bar', function(options, chart) { + chart.chart.type = 'column'; + return chart; + }); + createChartType('StackedBar', function(options, chart) { + chart.chart.type = 'column'; + chart.plotOptions = { + column : { + stacking: 'percent' + } + }; + return chart; + }); + createChartType('HorizontalBar', function(options, chart) { + chart.chart.type = 'bar'; + return chart; + }); + createChartType('StackedHorizontalBar', function(options, chart) { + chart.chart.type = 'bar'; + chart.plotOptions = { + bar : { + stacking: 'percent' + } + }; + return chart; + }); + createChartType('XY', function(options, chart) { + if (options.stroke === false) { + chart.chart.type = 'scatter' + } + else { + chart.chart.type = options.fill ? 'area' : 'line'; + } + chart.xAxis.labels.enabled = true; + + return chart; + }); + createChartType('Radar', function(options, chart) { + chart.chart.polar = true; + chart.chart.type = 'line'; + chart.xAxis = { + categories: options.x_labels, + tickmarkPlacement: 'on', + lineWidth: 0 + } + chart.yAxis = { + gridLineInterpolation: 'polygon', + lineWidth: 0, + min: 0, + gridLineDashStyle : 'ShortDash', + gridLineColor: '#DDD' + } + for(var i = 0; i < chart.series.length; i++) { + chart.series[i].pointPlacement = 'on'; + } + + return chart; + }); + createChartType('Pie', function(options, chart) { + chart.chart.type = 'pie'; + var slices = []; + var breakdown = []; + var useBreakdown = false; + for(var i = 0; i < chart.series.length; i++) { + var slice = chart.series[i]; + if (slice.data.length === 1) { + slices.unshift({ + name : slice.name, + color : slice.color, + borderColor : slice.color, + legendIndex : slice.legendIndex, + y : slice.data[0] + }); + breakdown.unshift({ + name : slice.name, + color : slice.color, + borderColor : slice.color, + y : slice.data[0] + }); + } + else { + useBreakdown = true; + var sum = 0; + var maxDecimal = 0; + for(var j = 0; j < slice.data.length; j++) { + var parts = slice.data[j].toString().split('.'); + maxDecimal = Math.max(maxDecimal, parts[1] ? parts[1].length : 0); + sum += slice.data[j]; + breakdown.unshift({ + name: slice.name, + color: 'rgba(0,0,0,0)', + borderColor : slice.color, + y: slice.data[j] + }); + } + slices.unshift({ + name : slice.name, + color : slice.color, + borderColor : slice.color, + legendIndex : slice.legendIndex, + y : parseFloat(sum.toFixed(maxDecimal)) + }); + } + } + chart.tooltip = { + formatter: function() { + return this.key + ': ' + this.y; + } + }; + chart.plotOptions = { + pie: { + allowPointSelect: !useBreakdown, + cursor: useBreakdown ? null : 'pointer', + shadow: false, + center: ['50%', '50%'], + dataLabels: { + enabled: false + } + } + }; + chart.series = [{ + name: ' ', + data: slices, + showInLegend: true + }]; + if (useBreakdown) { + chart.series.push({ + name: ' ', + data: breakdown, + innerSize: '90%', + showInLegend: false + }); + } + return chart; + }); + + return mod; +} diff --git a/mixly/boards/default_src/python_skulpt/others/skulpt/libs/pyplot/__init__.js b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/pyplot/__init__.js new file mode 100644 index 00000000..ed51bd2f --- /dev/null +++ b/mixly/boards/default_src/python_skulpt/others/skulpt/libs/pyplot/__init__.js @@ -0,0 +1,1589 @@ +Sk.jsplotlib = Sk.jsplotlib || {}; + +// Skulpt translation +let $builtinmodule = function (name) { + let mod = {__name__: "matplotlib.pyplot"}; + + const STRING_COLOR = new Sk.builtin.str("color"); + const STRING_COLORS = new Sk.builtin.str("colors"); + const STRING_DATA = new Sk.builtin.str("data"); + const STRING_LABEL = new Sk.builtin.str("label"); + const STRING_ALPHA = new Sk.builtin.str("alpha"); + const STRING_DASH_CAPSTYLE = new Sk.builtin.str("dash_capstyle"); + const STRING_DASH_JOINSTYLE = new Sk.builtin.str("dash_joinstyle"); + const STRING_FILLSTYLE = new Sk.builtin.str("fillstyle"); + const STRING_LINEWIDTH = new Sk.builtin.str("linewidth"); + const STRING_MARKER = new Sk.builtin.str("marker"); + const STRING_LINESTYLE = new Sk.builtin.str("linestyle"); + const STRING_LINESTYLES = new Sk.builtin.str("linestyles"); + const STRING_BINS = new Sk.builtin.str("bins"); + const STRING_ALIGN = new Sk.builtin.str("align"); + const STRING_DOT_LIMIT = new Sk.builtin.str("dot_limit"); + const STRING_S = new Sk.builtin.str("s"); + const STRING_C = new Sk.builtin.str("c"); + const STRING_LINEWIDTHS = new Sk.builtin.str("linewidths"); + const STRING_EDGECOLORS = new Sk.builtin.str("edgecolors"); + const STRING_WIDTH = new Sk.builtin.str("width"); + const STRING_TICK_LABEL = new Sk.builtin.str("tick_label"); + const STRING_ROTATION = new Sk.builtin.str("rotation"); + + const DEFAULT_PLOT_PADDING = .5; + + + /*if (Sk.MatPlotLibGraphics === undefined) { + throw new Sk.builtin.NameError("Can not resolve drawing area. Sk.MatPlotLibGraphics is undefined!"); + }*/ + function getConsole() { + return Sk.MatPlotLibGraphics.target; + } + // 重写获取画布宽度方法 + function getWidth() { + return Sk.MatPlotLibGraphics.width; + } + + // 重写获取画布长度方法 + function getHeight() { + return Sk.MatPlotLibGraphics.height; + } + // Unique ID generator for charts + let chartCounter = 0; + + function makePlot(type, data, style, label) { + return { + type: type, + data: data, + style: style, + label: label + }; + } + + function makeChart() { + let margin = {top: 20, right: 30, bottom: 50, left: 40}; + let chartIdNumber = chartCounter++; + return { + plots: [], + labels: { + title: "", + "x-axis": "", + "y-axis": "" + }, + extents: { + xMin: null, + xMax: null, + yMin: null, + yMax: null + }, + ticks: { + x: {}, + y: {}, + xRotate: "horizontal", + yRotate: "horizontal", + xEstimate: new Set(), + yEstimate: new Set() + }, + margin: margin, + width: getWidth() - margin.left - margin.right, + height: getWidth() - margin.top - margin.bottom, + idNumber: chartIdNumber, + id: "chart" + chartIdNumber, + colorCycle: 0 + }; + } + + function updateExtent(chart, attr, array, padding) { + if (padding === undefined) { + padding = 0; + } + if (chart.extents[attr + "Min"] === null) { + chart.extents[attr + "Min"] = d3.min(array)-padding; + } else { + chart.extents[attr + "Min"] = Math.min(d3.min(array)-padding, chart.extents[attr + "Min"]); + } + if (chart.extents[attr + "Max"] === null) { + chart.extents[attr + "Max"] = d3.max(array)+padding; + } else { + chart.extents[attr + "Max"] = Math.max(d3.max(array)+padding, chart.extents[attr + "Max"]); + } + } + + let chart = null; + function getChart() { + if (!chart) { + chart = makeChart(); + } + return chart; + } + + function resetChart() { + chart = makeChart(); + } + + function parseFormat(styleString, chart, kwargs, defaultLinestyle, defaultMarker) { + // TODO: Handle ls, lw, and other abbreviated keyword parameters + let format = { + alpha: getKeywordParameter(kwargs, STRING_ALPHA, null), + dash_capstyle: getKeywordParameter(kwargs, STRING_DASH_CAPSTYLE, "butt"), + dash_joinstyle: getKeywordParameter(kwargs, STRING_DASH_JOINSTYLE, "miter"), + fillstyle: getKeywordParameter(kwargs, STRING_FILLSTYLE, "full"), + linewidth: getKeywordParameter(kwargs, STRING_LINEWIDTH, 1), + }; + if (styleString) { + let ftmTuple = Sk.jsplotlib._process_plot_format(styleString); + format["linestyle"] = getKeywordParameter(kwargs, STRING_LINESTYLE, ftmTuple.linestyle); + format["marker"] = getKeywordParameter(kwargs, STRING_MARKER, Sk.jsplotlib.parse_marker(ftmTuple.marker)); + format["color"] = getKeywordParameter(kwargs, STRING_COLOR, Sk.jsplotlib.color_to_hex(ftmTuple.color)); + } else { + let cycle = Sk.jsplotlib.rc["axes.color_cycle"]; + format["linestyle"] = getKeywordParameter(kwargs, STRING_LINESTYLE, defaultLinestyle); + format["marker"] = getKeywordParameter(kwargs, STRING_MARKER, defaultMarker); + format["color"] = getKeywordParameter(kwargs, STRING_COLOR, Sk.jsplotlib.color_to_hex(cycle[chart.colorCycle % cycle.length])); + chart.colorCycle += 1; + } + return format; + } + + function getIndices(values) { + return values.map((value, index) => index); + } + + function chompPlotArgs(args, data) { + if (data !== null) { + if (args.length >= 2) { + throw new Sk.builtin.ValueError("Must provide at least 2 arguments when plotting with 'data' keyword"); + } + let xAttr = args[0]; + let yAttr = args[1]; + let xs = [], ys = []; + const values = Sk.misceval.arrayFromIterable(data); + for (let i = 0; i < values.length; i++) { + if (values[i].sq$contains(xAttr)) { + xs.push(values[i].mp$subscript(xAttr)); + ys.push(values[i].mp$subscript(yAttr)); + } else { + throw new Sk.builtin.ValueError(`Item at index ${i} is missing expected attribute.`); + } + } + return [xs, ys, args[2]]; + } else { + // x, y, style + if (args.length >= 3) { + if (Sk.builtin.checkString(args[2])) { + return [[args[0], args[1], args[2]].map(Sk.ffi.remapToJs)].concat(chompPlotArgs(args.slice(3), data)); + } + } + if (args.length >= 2) { + let ys = Sk.ffi.remapToJs(args[0]); + if (Sk.builtin.checkString(args[1])) { + // y, style + let xs = getIndices(ys); + let style = Sk.ffi.remapToJs(args[1]); + return [[xs, ys, style]].concat(chompPlotArgs(args.slice(2), data)); + } else { + // x, y + let xs = ys; + ys = Sk.ffi.remapToJs(args[1]); + return [[xs, ys, ""]].concat(chompPlotArgs(args.slice(2), data)); + } + } + if (args.length >= 1) { + // y + let ys = Sk.ffi.remapToJs(args[0]); + let xs = getIndices(ys); + return [[xs, ys, ""]].concat(chompPlotArgs(args.slice(1), data)); + } + return []; + } + } + + function getKeywordParameter(kwargs, key, otherwise) { + if (kwargs.sq$contains(key)) { + return Sk.ffi.remapToJs(kwargs.mp$subscript(key)); + } else { + return otherwise; + } + } + + function updateTickEstimates(chart, xValues, yValues) { + xValues.forEach(value => chart.ticks.xEstimate.add(value)); + yValues.forEach(value => chart.ticks.yEstimate.add(value)); + } + + // Main plotting function + let plot_f = function (kwa) { + // Parse arguments + Sk.builtin.pyCheckArgs("plot", arguments, 1, Infinity, true, false); + let args = Array.prototype.slice.call(arguments, 1); + let kwargs = new Sk.builtins.dict(kwa); // Get argument as object + let data = getKeywordParameter(kwargs, STRING_DATA, null); + let label = getKeywordParameter(kwargs, STRING_LABEL, null); + let chart = getChart(); + let plotData = chompPlotArgs(args, data); + for (let i=0; i {return {x: value[0], y: value[1]};}); + let style = parseFormat(plotDatum[2], chart, kwargs, "-", ""); + let plot = makePlot("line", zippedData, style, label); + chart.plots.push(plot); + updateExtent(chart, "x", plotDatum[0], DEFAULT_PLOT_PADDING); + updateExtent(chart, "y", plotDatum[1], DEFAULT_PLOT_PADDING); + updateTickEstimates(chart, plotDatum[0], plotDatum[1]); + } + }; + plot_f.co_kwargs = true; + mod.plot = new Sk.builtin.func(plot_f); + + + let hist_f = function (kwa) { + // Parse arguments + Sk.builtin.pyCheckArgs("hist", arguments, 1, Infinity, true, false); + let args = Array.prototype.slice.call(arguments, 1); + let kwargs = new Sk.builtins.dict(kwa); // Get argument as object + + // Parse different args combinations + let plotData = Sk.ffi.remapToJs(args[0]); + if (plotData.length > 0) { + if (!Array.isArray(plotData[0])) { + plotData = [plotData]; + } + } + + let label = getKeywordParameter(kwargs, STRING_LABEL, null); + let chart = getChart(); + for (let i=0; i Math.max(Math.min(value, max), min)); + estimatedBins = plot.bins; + } + chart.plots.push(plot); + updateExtent(chart, "x", plotDatum, DEFAULT_PLOT_PADDING); + updateTickEstimates(chart, estimatedBins, d3.range(plotDatum.length)); + } + // Ensure that the axis line is always the middle! + updateExtent(chart, "y", [0]); + }; + hist_f.co_kwargs = true; + mod.hist = new Sk.builtin.func(hist_f); + + let scatter_f = function (kwa) { + // Parse arguments + Sk.builtin.pyCheckArgs("scatter", arguments, 1, Infinity, true, false); + let args = Array.prototype.slice.call(arguments, 1); + let kwargs = new Sk.builtins.dict(kwa); // Get argument as object + + let data = getKeywordParameter(kwargs, STRING_DATA, null); + let label = getKeywordParameter(kwargs, STRING_LABEL, null); + + let plotData = chompPlotArgs(args, data); + + // Special dot_limit parameter to prevent crashing from too many dots in browser + let dotLimit = getKeywordParameter(kwargs, STRING_DOT_LIMIT, 256); + if (plotData[0] && plotData[0].length > dotLimit) { + let xSampled = [], ySampled = []; + let LENGTH = plotData[0].length, RATE = LENGTH / dotLimit; + for (let i = 0; i < dotLimit; i += 1) { + let index = Math.floor((i + Math.random()) * RATE); + xSampled.push(plotData[0][index]); + ySampled.push(plotData[1][index]); + } + plotData[0] = xSampled; + plotData[1] = ySampled; + } + + + let chart = getChart(); + for (let i=0; i {return {x: value[0], y: value[1]};}); + let plot = makePlot("scatter", zippedData, style, label); + plot.sizes = getKeywordParameter(kwargs, STRING_S, null); + plot.colors = getKeywordParameter(kwargs, STRING_C, null); + plot.linewidths = getKeywordParameter(kwargs, STRING_LINEWIDTHS, 1.5); + plot.edgecolors = getKeywordParameter(kwargs, STRING_EDGECOLORS, "face"); + chart.plots.push(plot); + updateExtent(chart, "x", plotDatum[0], DEFAULT_PLOT_PADDING); + updateExtent(chart, "y", plotDatum[1], DEFAULT_PLOT_PADDING); + updateTickEstimates(chart, plotDatum[0], plotDatum[1]); + } + }; + scatter_f.co_kwargs = true; + mod.scatter = new Sk.builtin.func(scatter_f); + + let bar_f = function (kwa) { + // Parse arguments + Sk.builtin.pyCheckArgs("bar", arguments, 1, Infinity, true, false); + let args = Array.prototype.slice.call(arguments, 1); + let kwargs = new Sk.builtins.dict(kwa); // Get argument as object + + let data = getKeywordParameter(kwargs, STRING_DATA, null); + let label = getKeywordParameter(kwargs, STRING_LABEL, null); + let tickLabels = getKeywordParameter(kwargs, STRING_TICK_LABEL, []); + + let plotData = chompPlotArgs(args, data); + + let chart = getChart(); + for (let i=0; i {return {x: value[0], y: value[1]};}); + let style = parseFormat(null, chart, kwargs, "", ""); + let plot = makePlot("bar", zippedData, style, label); + plot.width = getKeywordParameter(kwargs, STRING_WIDTH, 0.8); + plot.align = getKeywordParameter(kwargs, STRING_ALIGN, "center"); + for (let x=0; x a.length)) || 1; + args = args.map(a => Array.isArray(a) ? a : Array(length).fill(a)); + return d3.zip(args[0], args[1], args[2]); + } + + let hlines_f = function (kwa) { + // Parse arguments + Sk.builtin.pyCheckArgs("hlines", arguments, 1, Infinity, true, false); + let args = Array.prototype.slice.call(arguments, 1); + let kwargs = new Sk.builtins.dict(kwa); // Get argument as object + + let data = getKeywordParameter(kwargs, STRING_DATA, null); + let label = getKeywordParameter(kwargs, STRING_LABEL, null); + let colors = getKeywordParameter(kwargs, STRING_COLORS, null); + let linestyles = getKeywordParameter(kwargs, STRING_LINESTYLES, null); + + let plotData = getLinesData(args); + + let chart = getChart(); + let style = parseFormat(null, chart, kwargs, "", ""); + for (let i=0; i