i deleted it woops. i want to write a paragraph about my mindfulness -game here.
-diff --git a/carddeck1/fonts/.DS_Store b/carddeck1/fonts/.DS_Store
new file mode 100644
index 0000000..eb8cc83
Binary files /dev/null and b/carddeck1/fonts/.DS_Store differ
diff --git a/carddeck1/fonts/Consolation013.woff b/carddeck1/fonts/Consolation013.woff
new file mode 100644
index 0000000..2a97e75
Binary files /dev/null and b/carddeck1/fonts/Consolation013.woff differ
diff --git a/carddeck1/fonts/Consolation014.otf b/carddeck1/fonts/Consolation014.otf
new file mode 100644
index 0000000..78c3a40
Binary files /dev/null and b/carddeck1/fonts/Consolation014.otf differ
diff --git a/carddeck1/fonts/Consolation014.woff b/carddeck1/fonts/Consolation014.woff
new file mode 100644
index 0000000..93db23c
Binary files /dev/null and b/carddeck1/fonts/Consolation014.woff differ
diff --git a/carddeck1/fonts/immajer-Simlish.woff b/carddeck1/fonts/immajer-Simlish.woff
new file mode 100644
index 0000000..a76b077
Binary files /dev/null and b/carddeck1/fonts/immajer-Simlish.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Black.woff b/carddeck1/fonts/worksans/WorkSans-Black.woff
new file mode 100644
index 0000000..bed6bf1
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Black.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Black.woff2 b/carddeck1/fonts/worksans/WorkSans-Black.woff2
new file mode 100644
index 0000000..3b24dc0
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Black.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-BlackItalic.woff b/carddeck1/fonts/worksans/WorkSans-BlackItalic.woff
new file mode 100644
index 0000000..cb758bf
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-BlackItalic.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-BlackItalic.woff2 b/carddeck1/fonts/worksans/WorkSans-BlackItalic.woff2
new file mode 100644
index 0000000..23ff634
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-BlackItalic.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Bold.woff b/carddeck1/fonts/worksans/WorkSans-Bold.woff
new file mode 100644
index 0000000..f829987
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Bold.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Bold.woff2 b/carddeck1/fonts/worksans/WorkSans-Bold.woff2
new file mode 100644
index 0000000..c896146
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Bold.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-BoldItalic.woff b/carddeck1/fonts/worksans/WorkSans-BoldItalic.woff
new file mode 100644
index 0000000..0d69d0f
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-BoldItalic.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-BoldItalic.woff2 b/carddeck1/fonts/worksans/WorkSans-BoldItalic.woff2
new file mode 100644
index 0000000..bb8dfd0
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-BoldItalic.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ExtraBold.woff b/carddeck1/fonts/worksans/WorkSans-ExtraBold.woff
new file mode 100644
index 0000000..4741d26
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ExtraBold.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ExtraBold.woff2 b/carddeck1/fonts/worksans/WorkSans-ExtraBold.woff2
new file mode 100644
index 0000000..9aa1eca
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ExtraBold.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ExtraBoldItalic.woff b/carddeck1/fonts/worksans/WorkSans-ExtraBoldItalic.woff
new file mode 100644
index 0000000..accdcb0
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ExtraBoldItalic.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ExtraBoldItalic.woff2 b/carddeck1/fonts/worksans/WorkSans-ExtraBoldItalic.woff2
new file mode 100644
index 0000000..7ce82c8
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ExtraBoldItalic.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ExtraLight.woff b/carddeck1/fonts/worksans/WorkSans-ExtraLight.woff
new file mode 100644
index 0000000..6cca578
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ExtraLight.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ExtraLight.woff2 b/carddeck1/fonts/worksans/WorkSans-ExtraLight.woff2
new file mode 100644
index 0000000..ccd3f6b
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ExtraLight.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ExtraLightItalic.woff b/carddeck1/fonts/worksans/WorkSans-ExtraLightItalic.woff
new file mode 100644
index 0000000..767271a
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ExtraLightItalic.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ExtraLightItalic.woff2 b/carddeck1/fonts/worksans/WorkSans-ExtraLightItalic.woff2
new file mode 100644
index 0000000..09f535e
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ExtraLightItalic.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Italic.woff b/carddeck1/fonts/worksans/WorkSans-Italic.woff
new file mode 100644
index 0000000..ff7fa7e
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Italic.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Italic.woff2 b/carddeck1/fonts/worksans/WorkSans-Italic.woff2
new file mode 100644
index 0000000..e80bfe6
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Italic.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Light.woff b/carddeck1/fonts/worksans/WorkSans-Light.woff
new file mode 100644
index 0000000..3fe4e73
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Light.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Light.woff2 b/carddeck1/fonts/worksans/WorkSans-Light.woff2
new file mode 100644
index 0000000..e5095d5
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Light.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-LightItalic.woff b/carddeck1/fonts/worksans/WorkSans-LightItalic.woff
new file mode 100644
index 0000000..5f21a50
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-LightItalic.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-LightItalic.woff2 b/carddeck1/fonts/worksans/WorkSans-LightItalic.woff2
new file mode 100644
index 0000000..5745d42
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-LightItalic.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Medium.woff b/carddeck1/fonts/worksans/WorkSans-Medium.woff
new file mode 100644
index 0000000..067288f
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Medium.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Medium.woff2 b/carddeck1/fonts/worksans/WorkSans-Medium.woff2
new file mode 100644
index 0000000..8701f97
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Medium.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-MediumItalic.woff b/carddeck1/fonts/worksans/WorkSans-MediumItalic.woff
new file mode 100644
index 0000000..62e9ac0
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-MediumItalic.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-MediumItalic.woff2 b/carddeck1/fonts/worksans/WorkSans-MediumItalic.woff2
new file mode 100644
index 0000000..2a906a3
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-MediumItalic.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Regular.woff b/carddeck1/fonts/worksans/WorkSans-Regular.woff
new file mode 100644
index 0000000..9b54dc6
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Regular.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Regular.woff2 b/carddeck1/fonts/worksans/WorkSans-Regular.woff2
new file mode 100644
index 0000000..39db44d
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Regular.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-SemiBold.woff b/carddeck1/fonts/worksans/WorkSans-SemiBold.woff
new file mode 100644
index 0000000..9ebf80f
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-SemiBold.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-SemiBold.woff2 b/carddeck1/fonts/worksans/WorkSans-SemiBold.woff2
new file mode 100644
index 0000000..6c3f6de
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-SemiBold.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-SemiBoldItalic.woff b/carddeck1/fonts/worksans/WorkSans-SemiBoldItalic.woff
new file mode 100644
index 0000000..7aed043
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-SemiBoldItalic.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-SemiBoldItalic.woff2 b/carddeck1/fonts/worksans/WorkSans-SemiBoldItalic.woff2
new file mode 100644
index 0000000..137a84b
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-SemiBoldItalic.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Thin.woff b/carddeck1/fonts/worksans/WorkSans-Thin.woff
new file mode 100644
index 0000000..14df699
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Thin.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-Thin.woff2 b/carddeck1/fonts/worksans/WorkSans-Thin.woff2
new file mode 100644
index 0000000..ede8218
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-Thin.woff2 differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ThinItalic.woff b/carddeck1/fonts/worksans/WorkSans-ThinItalic.woff
new file mode 100644
index 0000000..5767711
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ThinItalic.woff differ
diff --git a/carddeck1/fonts/worksans/WorkSans-ThinItalic.woff2 b/carddeck1/fonts/worksans/WorkSans-ThinItalic.woff2
new file mode 100644
index 0000000..20f3c77
Binary files /dev/null and b/carddeck1/fonts/worksans/WorkSans-ThinItalic.woff2 differ
diff --git a/carddeck1/fonts/worksans/stylesheet.css b/carddeck1/fonts/worksans/stylesheet.css
new file mode 100644
index 0000000..4c40ee7
--- /dev/null
+++ b/carddeck1/fonts/worksans/stylesheet.css
@@ -0,0 +1,161 @@
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-Black.woff2') format('woff2'),
+ url('WorkSans-Black.woff') format('woff');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-ExtraBoldItalic.woff2') format('woff2'),
+ url('WorkSans-ExtraBoldItalic.woff') format('woff');
+ font-weight: bold;
+ font-style: italic;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-Bold.woff2') format('woff2'),
+ url('WorkSans-Bold.woff') format('woff');
+ font-weight: bold;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-ExtraBold.woff2') format('woff2'),
+ url('WorkSans-ExtraBold.woff') format('woff');
+ font-weight: bold;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-BlackItalic.woff2') format('woff2'),
+ url('WorkSans-BlackItalic.woff') format('woff');
+ font-weight: 900;
+ font-style: italic;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-BoldItalic.woff2') format('woff2'),
+ url('WorkSans-BoldItalic.woff') format('woff');
+ font-weight: bold;
+ font-style: italic;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-Italic.woff2') format('woff2'),
+ url('WorkSans-Italic.woff') format('woff');
+ font-weight: normal;
+ font-style: italic;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-ExtraLightItalic.woff2') format('woff2'),
+ url('WorkSans-ExtraLightItalic.woff') format('woff');
+ font-weight: 200;
+ font-style: italic;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-Light.woff2') format('woff2'),
+ url('WorkSans-Light.woff') format('woff');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-MediumItalic.woff2') format('woff2'),
+ url('WorkSans-MediumItalic.woff') format('woff');
+ font-weight: 500;
+ font-style: italic;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-LightItalic.woff2') format('woff2'),
+ url('WorkSans-LightItalic.woff') format('woff');
+ font-weight: 300;
+ font-style: italic;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-Medium.woff2') format('woff2'),
+ url('WorkSans-Medium.woff') format('woff');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-ExtraLight.woff2') format('woff2'),
+ url('WorkSans-ExtraLight.woff') format('woff');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-SemiBoldItalic.woff2') format('woff2'),
+ url('WorkSans-SemiBoldItalic.woff') format('woff');
+ font-weight: 600;
+ font-style: italic;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-Thin.woff2') format('woff2'),
+ url('WorkSans-Thin.woff') format('woff');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-ThinItalic.woff2') format('woff2'),
+ url('WorkSans-ThinItalic.woff') format('woff');
+ font-weight: 100;
+ font-style: italic;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-Regular.woff2') format('woff2'),
+ url('WorkSans-Regular.woff') format('woff');
+ font-weight: normal;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: 'Work Sans';
+ src: url('WorkSans-SemiBold.woff2') format('woff2'),
+ url('WorkSans-SemiBold.woff') format('woff');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/carddeck1/stylesheet.css b/carddeck1/stylesheet.css
index b48b0ff..ed78fbc 100644
--- a/carddeck1/stylesheet.css
+++ b/carddeck1/stylesheet.css
@@ -1,3 +1,13 @@
+@font-face {
+ font-family: Consolation;
+ src: url(./font/Consolation014.woff) format('woff');
+ font-weight:normal;
+}
+body {
+ font-family: Consolation;
+ text-transform: uppercase;
+ letter-spacing: 1.5;
+}
.card
{
width: 7.5cm;
@@ -16,7 +26,7 @@
top: 10mm;
border-radius: 10px;
z-index: -1;
- /* display: none; */
+ display: none;
}
.card > h2{
top: 5mm;
@@ -26,7 +36,7 @@
padding-top: 3mm;
font-size: 13px;
font-family:monospace;
- /* display: none; */
+ display: none;
}
.card > p.text {
width: 50mm;
@@ -36,8 +46,7 @@
left: 10mm;
text-align: center;
margin: 0;
- font-family: monospace;
- /* display: none; */
+ display: none;
}
.card > p.textnoimage {
width: 60mm;
@@ -48,6 +57,5 @@
right: 5mm;
text-align: center;
font-size: 6.5;
- font-family: monospace;
- /* display: none; */
+ display: none;
}
diff --git a/ogcardeck/cards.html b/ogcardeck/cards.html
index 73e5c7e..5ed3330 100644
--- a/ogcardeck/cards.html
+++ b/ogcardeck/cards.html
@@ -12,133 +12,131 @@
'o ccafè the coffee 'o ccafè 42.the coffee e ddoie zetelle the spinsters e ddoie zetelle 66.the spinsters 'a sposa the bride 'a sposa 63.the bride 'a mamma the mother 'a mamma 52.the mother 'a chiesa the church 'a chiesa 84.the church sott'e ncoppa the upside down sott'e ncoppa 69.the upside down 'o ccafè the bird l'aucelluzz 35.the bird 'o ccafè the breasts 'e zzizze 28.the breasts 'o ccafè the crying 'o chianto 65.the crying 'o ccafè the set table 'a tavula mbandita 82.the set table 'o ccafè the coffee se lamenta 60.the lament 'o ccafè purgatory's souls ll'aneme o priatorio 85.purgatory's souls 'o ccafè the talking dead 'o muorto che pparla 48.the talking dead 'o ccafè the warm soup 'a zuppa cotta 68.the warm soup 'o ccafè the devils 'e riavule 77.the devils 'o ccafè the storm 'o maletiempo 83.the storm 'o ccafè christmas natale 25.christmas 'o ccafè blood 'o sangue 18.blood 'o ccafè laughter 'a resata 19.laughter 'o ccafè the gossiping woman 'a donna o' barcone 43.the gossiping woman 'o ccafè the good wine 'o vino 45.the good wine
XPUB & PNF present:
+ + + + + - +i deleted it woops. i want to write a paragraph about my mindfulness -game here.
-Photo by Guillermo Ferla on Unsplash
+Photo by Ashwini Chaudhary(Monty) on Unsplash
`}
+code.__getattribute__=function(self,attr){return self[attr]}
+$B.set_func_names(code,"builtins")
+function compile(){var $=$B.args('compile',6,{source:null,filename:null,mode:null,flags:null,dont_inherit:null,optimize:null,_feature_version:null},['source','filename','mode','flags','dont_inherit','optimize','_feature_version'],arguments,{flags:0,dont_inherit:false,optimize:-1,_feature_version:0},null,null)
+var module_name='$exec_'+$B.UUID()
+$.__class__=code
+$.co_flags=$.flags
+$.co_name=""
+$.co_filename=$.filename
+var interactive=$.mode=="single" &&($.flags & 0x200)
+$B.file_cache[$.filename]=$.source
+if(_b_.isinstance($.source,_b_.bytes)){var encoding='utf-8',lfpos=$.source.source.indexOf(10),first_line,second_line
+if(lfpos==-1){first_line=$.source}else{first_line=_b_.bytes.$factory($.source.source.slice(0,lfpos))}
+first_line=_b_.bytes.decode(first_line,'latin-1')
+var encoding_re=/^[\t\f]*#.*?coding[:=][\t]*([-_.a-zA-Z0-9]+)/
+var mo=first_line.match(encoding_re)
+if(mo){encoding=mo[1]}else if(lfpos >-1){
+var rest=$.source.source.slice(lfpos+1)
+lfpos=rest.indexOf(10)
+if(lfpos >-1){second_line=_b_.bytes.$factory(rest.slice(0,lfpos))}else{second_line=_b_.bytes.$factory(rest)}
+second_line=_b_.bytes.decode(second_line,'latin-1')
+var mo=second_line.match(encoding_re)
+if(mo){encoding=mo[1]}}
+$.source=_b_.bytes.decode($.source,encoding)}
+if(!_b_.isinstance($.filename,[_b_.bytes,_b_.str])){
+$B.imported._warnings.warn(_b_.DeprecationWarning.$factory(
+`path should be string, bytes, or os.PathLike, `+
+`not ${$B.class_name($.filename)}`))}
+if(interactive && ! $.source.endsWith("\n")){
+var lines=$.source.split("\n")
+if($B.last(lines).startsWith(" ")){throw _b_.SyntaxError.$factory("unexpected EOF while parsing")}}
+if($B.parser_to_ast){var _ast=new $B.Parser($.source,$.filename).parse(
+'file')
+var symtable=$B._PySymtable_Build(_ast,$.filename)
+if($.flags==$B.PyCF_ONLY_AST){return _ast}}else{var root=$B.parser.$create_root_node(
+{src:$.source,filename:$.filename},module_name,module_name)
+root.mode=$.mode
+root.parent_block=$B.builtins_scope
+$B.parser.dispatch_tokens(root,$.source)
+if($.flags==$B.PyCF_ONLY_AST){$B.create_python_ast_classes()
+var _ast=root.ast(),klass=_ast.constructor.$name
+var res=$B.python_ast_classes[klass].$factory(_ast)
+return res}}
+return $}
+var __debug__=$B.debug > 0
+function delattr(obj,attr){
+check_no_kw('delattr',obj,attr)
+check_nb_args('delattr',2,arguments)
+if(typeof attr !='string'){throw _b_.TypeError.$factory("attribute name must be string, not '"+
+$B.class_name(attr)+"'")}
+return $B.$getattr(obj,'__delattr__')(attr)}
+$B.$delete=function(name,is_global){
+function del(obj){if(obj.__class__===$B.generator){
+obj.js_gen.return()}}
+var found=false,frame=$B.last($B.frames_stack)
+if(! is_global){if(frame[1][name]!==undefined){found=true
+del(frame[1][name])
+delete frame[1][name]}}else{if(frame[2]!=frame[0]&& frame[3][name]!==undefined){found=true
+del(frame[3][name])
+delete frame[3][name]}}
+if(!found){throw $B.name_error(name)}}
+function dir(obj){if(obj===undefined){
+var frame=$B.last($B.frames_stack)
+locals_obj=frame[1],res=_b_.list.$factory(),pos=0
+for(var attr in locals_obj){if(attr.charAt(0)=='$' && attr.charAt(1)!='$'){
+continue}
+res[pos++]=attr}
+_b_.list.sort(res)
+return res}
+check_nb_args('dir',1,arguments)
+check_no_kw('dir',obj)
+var klass=obj.__class__ ||$B.get_class(obj)
+if(obj.$is_class){
+var dir_func=$B.$getattr(obj.__class__,"__dir__")
+return $B.$call(dir_func)(obj)}
+try{var res=$B.$call($B.$getattr(obj,'__dir__'))()
+res=_b_.list.$factory(res)
+return res}catch(err){}
+var res=[],pos=0
+for(var attr in obj){if(attr.charAt(0)!=='$' && attr !=='__class__' &&
+obj[attr]!==undefined){res[pos++]=attr}}
+res.sort()
+return res}
+function divmod(x,y){check_no_kw('divmod',x,y)
+check_nb_args('divmod',2,arguments)
+var klass=x.__class__ ||$B.get_class(x)
+var dm=$B.$getattr(klass,"__divmod__",_b_.None)
+if(dm !==_b_.None){return dm(x,y)}
+return _b_.tuple.$factory([$B.$getattr(klass,'__floordiv__')(x,y),$B.$getattr(klass,'__mod__')(x,y)])}
+var enumerate=$B.make_class("enumerate",function(){var $ns=$B.args("enumerate",2,{iterable:null,start:null},['iterable','start'],arguments,{start:0},null,null),_iter=iter($ns["iterable"]),start=$ns["start"]
+return{
+__class__:enumerate,__name__:'enumerate iterator',counter:start-1,iter:_iter,start:start}}
+)
+enumerate.__iter__=function(self){self.counter=self.start-1
+return self}
+enumerate.__next__=function(self){self.counter++
+return $B.fast_tuple([self.counter,next(self.iter)])}
+$B.set_func_names(enumerate,"builtins")
+function make_proxy(dict,lineno){
+const handler={get:function(target,prop){console.log('get proxy attr',prop,target)
+if(prop=='__class__'){return _b_.dict}else if(prop=='$lineno'){return lineno}
+if(target.$string_dict.hasOwnProperty(prop)){return target.$string_dict[prop][0]}
+return undefined},set:function(target,prop,value){_b_.dict.$setitem(target,prop,value)}}
+return new Proxy(dict,handler)}
+function $$eval(src,_globals,_locals){var $=$B.args("eval",4,{src:null,globals:null,locals:null,mode:null},["src","globals","locals","mode"],arguments,{globals:_b_.None,locals:_b_.None,mode:"eval"},null,null),src=$.src,_globals=$.globals,_locals=$.locals,mode=$.mode
+if($.src.mode && $.src.mode=="single" &&
+["",""].indexOf($.src.filename)>-1){
+_b_.print(">",$.src.source.trim())}
+if(src.__class__===code){mode=src.mode
+src=src.source}else if((! src.valueOf)||typeof src.valueOf()!=='string'){throw _b_.TypeError.$factory(`${mode}() arg 1 must be a string,`+
+" bytes or code object")}else{
+src=src.valueOf()}
+var frame=$B.last($B.frames_stack)
+var lineno=frame[1].$lineno
+$B.exec_scope=$B.exec_scope ||{}
+if(src.endsWith('\\\n')){var exc=_b_.SyntaxError.$factory('')
+var lines=src.split('\n'),line=lines[lines.length-2]
+exc.args=['unexpected EOF while parsing',['',lines.length-1,1,line]]
+throw exc}
+var local_name='locals_exec',global_name='globals_exec',exec_locals={},exec_globals={},__name__=''
+var handler={get:function(obj,prop){if(prop=='$lineno'){return lineno}else if(prop=='__file__'){return ''}
+return obj[prop]},set:function(obj,prop,value){if(['__file__','$lineno'].indexOf(prop)==-1){obj[prop]=value}}}
+if(_globals===_b_.None){
+exec_locals=new Proxy(frame[1],handler)
+exec_globals=new Proxy(frame[3],handler)}else{if(_globals.__class__ !==_b_.dict){throw _b_.TypeError.$factory(`${mode}() globals must be `+
+"a dict, not "+$B.class_name(_globals))}
+exec_globals={}
+if(_globals.$jsobj){
+exec_globals=new Proxy(_globals.$jsobj,handler)}else{
+if(_globals.$jsobj){exec_globals=_globals.$jsobj}else{exec_globals=_globals.$jsobj={}}
+for(var key in _globals.$string_dict){_globals.$jsobj[key]=_globals.$string_dict[key][0]
+if(key=='__name__'){__name__=_globals.$jsobj[key]}}}
+if(exec_globals.__builtins__===undefined){exec_globals.__builtins__=_b_.__builtins__}
+if(_locals===_b_.None){exec_locals=exec_globals}else{if(global_name==local_name){
+global_name+='_globals'}
+if(_locals.$jsobj){for(var key in _locals.$jsobj){exec_globals[key]=_locals.$jsobj[key]}}else{if(_locals.$jsobj){exec_locals=_locals.$jsobj}else{exec_locals=_locals.$jsobj={$dict:_locals}}
+for(var key in _locals.$string_dict){_locals.$jsobj[key]=_locals.$string_dict[key][0]}
+exec_locals.$getitem=$B.$call($B.$getattr(_locals.__class__,'__getitem__'))
+var missing=$B.$getattr(_locals.__class__,'__missing__',null)
+if(missing){exec_locals.$missing=$B.$call(missing)}}}}
+var save_frames_stack=$B.frames_stack.slice()
+var top_frame=[__name__,exec_locals,__name__,exec_globals]
+top_frame.is_exec_top=true
+exec_locals.$f_trace=$B.enter_frame(top_frame)
+exec_locals.$lineno=1
+var filename=''
+try{if($B.parser_to_ast){var _ast=new $B.Parser(src,filename).parse(mode=='eval' ? 'eval' :'file')
+var symtable=$B._PySymtable_Build(_ast,filename)
+var js_obj=$B.js_from_root(_ast,symtable,filename,{local_name,exec_locals,global_name,exec_globals})
+js=js_obj.js}else{var root=$B.parser.$create_root_node(src,'',frame[0],frame[2],1)
+root.mode=mode
+root.filename=filename
+$B.parser.dispatch_tokens(root)
+var _ast=root.ast(),symtable=$B._PySymtable_Build(_ast,filename),js_obj=$B.js_from_root(_ast,symtable,filename,{local_name,exec_locals,global_name,exec_globals}),js=js_obj.js}}catch(err){if(err.args){var lineno=err.args[1][1]
+exec_locals.$lineno=lineno}else{console.log('JS Error',err.message)}
+$B.frames_stack=save_frames_stack
+throw err}
+if(mode=='eval'){js='return '+js}
+try{var exec_func=new Function('$B','_b_','locals',local_name,global_name,js)}catch(err){console.log('error\n',js)
+throw err}
+try{var res=exec_func($B,_b_,exec_locals,exec_locals,exec_globals)}catch(err){if(err.$stack){err.$stack=save_frames_stack.concat(err.$stack)}else{err.$stack=save_frames_stack.concat($B.frames_stack)}
+$B.frames_stack=save_frames_stack
+throw err}
+if(_globals !==_b_.None){for(var key in exec_globals){if(! key.startsWith('$')){_b_.dict.$setitem(_globals,key,exec_globals[key])}}
+if(_locals !==_b_.None){for(var key in exec_locals){if(! key.startsWith('$')){_b_.dict.$setitem(_locals,key,exec_locals[key])}}}}
+$B.frames_stack=save_frames_stack
+return res}
+$$eval.$is_func=true
+function exec(src,globals,locals){var missing={}
+var $=$B.args("exec",3,{src:null,globals:null,locals:null},["src","globals","locals"],arguments,{globals:_b_.None,locals:_b_.None},null,null),src=$.src,globals=$.globals,locals=$.locals
+return $$eval(src,globals,locals,"exec")||_b_.None}
+exec.$is_func=true
+function exit(){throw _b_.SystemExit}
+exit.__repr__=exit.__str__=function(){return "Use exit() or Ctrl-Z plus Return to exit"}
+var filter=$B.make_class("filter",function(func,iterable){check_no_kw('filter',func,iterable)
+check_nb_args('filter',2,arguments)
+iterable=iter(iterable)
+if(func===_b_.None){func=$B.$bool}
+return{
+__class__:filter,func:func,iterable:iterable}}
+)
+filter.__iter__=function(self){return self}
+filter.__next__=function(self){while(true){var _item=next(self.iterable)
+if(self.func(_item)){return _item}}}
+$B.set_func_names(filter,"builtins")
+function format(value,format_spec){var $=$B.args("format",2,{value:null,format_spec:null},["value","format_spec"],arguments,{format_spec:''},null,null)
+var klass=value.__class__ ||$B.get_class(value)
+try{var method=$B.$getattr(klass,'__format__')}catch(err){if(err.__class__===_b_.AttributeError){throw _b_.NotImplementedError("__format__ is not implemented "+
+"for object '"+_b_.str.$factory(value)+"'")}
+throw err}
+return $B.$call(method)(value,$.format_spec)}
+function attr_error(attr,obj){var cname=$B.get_class(obj)
+var msg="bad operand type for unary #: '"+cname+"'"
+switch(attr){case '__neg__':
+throw _b_.TypeError.$factory(msg.replace('#','-'))
+case '__pos__':
+throw _b_.TypeError.$factory(msg.replace('#','+'))
+case '__invert__':
+throw _b_.TypeError.$factory(msg.replace('#','~'))
+case '__call__':
+throw _b_.TypeError.$factory("'"+cname+"'"+
+' object is not callable')
+default:
+throw $B.attr_error(attr,obj)}}
+function getattr(){var missing={}
+var $=$B.args("getattr",3,{obj:null,attr:null,_default:null},["obj","attr","_default"],arguments,{_default:missing},null,null)
+return $B.$getattr($.obj,$.attr,$._default===missing ? undefined :$._default)}
+function in_mro(klass,attr){if(klass===undefined){return false}
+if(klass.hasOwnProperty(attr)){return klass[attr]}
+var mro=klass.__mro__
+for(var i=0,len=mro.length;i < len;i++){if(mro[i].hasOwnProperty(attr)){return mro[i][attr]}}
+return false}
+$B.$getattr=function(obj,attr,_default){
+var res
+if(obj.$method_cache &&
+obj.$method_cache[attr]&&
+obj.__class__ &&
+obj.__class__[attr]==obj.$method_cache[attr][1]){
+return obj.$method_cache[attr][0]}
+var rawname=attr
+if(obj===undefined){console.log("get attr",attr,"of undefined")}
+var is_class=obj.$is_class ||obj.$factory
+var klass=obj.__class__
+var $test=false
+if($test){console.log("$getattr",attr,'\nobj',obj,'\nklass',klass)}
+if(klass !==undefined &&(! klass.$native)&& klass.__bases__ &&
+klass.__getattribute__===undefined &&
+(klass.__bases__.length==0 ||
+(klass.__bases__.length==1 &&
+klass.__bases__[0]===_b_.object))){if($test){console.log("class without parent",klass)
+console.log('\nobj[attr]',obj[attr])}
+if(obj[attr]!==undefined){return obj[attr]}else if(obj.__dict__ &&
+obj.__dict__.$string_dict.hasOwnProperty(attr)&&
+!(klass.hasOwnProperty(attr)&&
+klass[attr].__get__)){return obj.__dict__.$string_dict[attr][0]}else if(klass.hasOwnProperty(attr)){if(typeof klass[attr]!="function" &&
+attr !="__dict__" &&
+klass[attr].__get__===undefined){var kl=klass[attr].__class__
+if(! in_mro(kl,"__get__")){return klass[attr]}}}}
+if($test){console.log("attr",attr,"of",obj,"class",klass,"isclass",is_class)}
+if(klass===undefined){
+if(typeof obj=='string'){klass=_b_.str}
+else if(typeof obj=='number'){klass=obj % 1==0 ? _b_.int :_b_.float}else if(obj instanceof Number){klass=_b_.float}else{klass=$B.get_class(obj)
+if(klass===undefined){
+if($test){console.log("no class",attr,obj.hasOwnProperty(attr),obj[attr])}
+res=obj[attr]
+if(res !==undefined){if(typeof res=="function"){var f=function(){
+return res.apply(obj,arguments)}
+f.$infos={__name__:attr,__qualname__:attr}
+return f}else{return $B.$JS2Py(res)}}
+if(_default !==undefined){return _default}
+throw $B.attr_error(rawname,obj)}}}
+switch(attr){case '__call__':
+if(typeof obj=='function'){res=function(){return obj.apply(null,arguments)}
+res.__class__=method_wrapper
+res.$infos={__name__:"__call__"}
+return res}
+break
+case '__class__':
+return klass
+case '__dict__':
+if(is_class){var proxy={}
+for(var key in obj){if(! key.startsWith("$")){proxy[key]=obj[key]}}
+proxy.__dict__=$B.getset_descriptor.$factory(obj,"__dict__")
+return $B.mappingproxy.$factory(proxy)}else if(! klass.$native){if(obj[attr]!==undefined){return obj[attr]}else if(obj.$infos){if(obj.$infos.hasOwnProperty("__dict__")){return obj.$infos.__dict__}else if(obj.$infos.hasOwnProperty("__func__")){return obj.$infos.__func__.$infos.__dict__}}
+return $B.obj_dict(obj,function(attr){return['__class__'].indexOf(attr)>-1}
+)}
+case '__doc__':
+for(var i=0;i < builtin_names.length;i++){if(obj===_b_[builtin_names[i]]){_get_builtins_doc()
+return $B.builtins_doc[builtin_names[i]]}}
+break
+case '__mro__':
+if(obj.$is_class){
+return _b_.tuple.$factory([obj].concat(obj.__mro__))}else if(obj.__dict__ &&
+obj.__dict__.$string_dict.__mro__ !==undefined){return obj.__dict__.$string_dict.__mro__}
+throw $B.attr_error(attr,obj)
+case '__subclasses__':
+if(klass.$factory ||klass.$is_class){var subclasses=obj.$subclasses ||[]
+return function(){return subclasses}}
+break}
+if(typeof obj=='function'){var value=obj[attr]
+if(value !==undefined){if(attr=='__module__'){return value}}}
+if((! is_class)&& klass.$native){if(obj.$method_cache && obj.$method_cache[attr]){return obj.$method_cache[attr]}
+if($test){console.log("native class",klass,klass[attr])}
+if(attr=="__doc__" && klass[attr]===undefined && klass.$infos){_get_builtins_doc()
+klass[attr]=$B.builtins_doc[klass.$infos.__name__]}
+if(klass[attr]===undefined){var object_attr=_b_.object[attr]
+if($test){console.log("object attr",object_attr)}
+if(object_attr !==undefined){klass[attr]=object_attr}else{if($test){console.log("obj[attr]",obj[attr])}
+var attrs=obj.__dict__
+if(attrs &&
+(object_attr=attrs.$string_dict[attr])!==undefined){return object_attr[0]}
+if(_default===undefined){throw $B.attr_error(attr,obj)}
+return _default}}
+if(klass.$descriptors && klass.$descriptors[attr]!==undefined){return klass[attr](obj)}
+if(typeof klass[attr]=='function'){var func=klass[attr]
+if(attr=='__new__'){func.$type="staticmethod"}
+if(func.$type=="staticmethod"){return func}
+var self=klass[attr].__class__==$B.method ? klass :obj,method=klass[attr].bind(null,self)
+method.__class__=$B.method
+method.$infos={__func__:func,__name__:attr,__self__:self,__qualname__:klass.$infos.__name__+"."+attr}
+if(typeof obj=="object"){
+obj.__class__=klass
+obj.$method_cache=obj.$method_cache ||{}
+obj.$method_cache[attr]=method}
+return method}else if(klass[attr]!==undefined){return klass[attr]}
+attr_error(rawname,klass)}
+var mro,attr_func
+if(is_class){attr_func=_b_.type.__getattribute__ }else{attr_func=klass.__getattribute__
+if(attr_func===undefined){var mro=klass.__mro__
+if(mro===undefined){console.log(obj,attr,"no mro, klass",klass)}
+for(var i=0,len=mro.length;i < len;i++){attr_func=mro[i]['__getattribute__']
+if(attr_func !==undefined){break}}}}
+if(typeof attr_func !=='function'){console.log(attr+' is not a function '+attr_func,klass)}
+var odga=_b_.object.__getattribute__
+if($test){console.log("attr_func is odga ?",attr_func,attr_func===odga,'\nobj[attr]',obj[attr])}
+if(attr_func===odga){res=obj[attr]
+if(Array.isArray(obj)&& Array.prototype[attr]!==undefined){
+res=undefined}else if(res===null){return null}else if(false && res===undefined && obj[attr]!==undefined){if(_default===undefined){throw $B.attr_error(attr,obj)}
+return _default}else if(res !==undefined){if($test){console.log(obj,attr,obj[attr],res.__set__ ||res.$is_class)}
+if(res.$is_property){return property.__get__(res)}
+if(res.__set__===undefined ||res.$is_class){if($test){console.log("return",res,res+'',res.__set__,res.$is_class)}
+return res}}}
+if($test){console.log('no result with object.__getattribute__')}
+try{res=attr_func(obj,attr)
+if($test){console.log("result of attr_func",res)}}catch(err){var getattr
+if(klass===$B.module){
+getattr=obj.__getattr__
+if(getattr){try{return getattr(attr)}catch(err){if(_default !==undefined){return _default}
+throw err}}}else{var getattr=in_mro(klass,'__getattr__')
+if(getattr){if(attr=='strange'){console.log('essaie getattr',obj,klass,attr)}
+try{if(klass===$B.module){res=getattr(attr)}else{res=getattr(obj,attr)}
+return res}catch(err){if(_default !==undefined){return _default}
+throw err}}}
+if(_default !==undefined){return _default}
+throw err}
+if(res !==undefined){return res}
+if(_default !==undefined){return _default}
+var cname=klass.$infos.__name__
+if(is_class){cname=obj.$infos.__name__}
+attr_error(rawname,is_class ? obj :klass)}
+function globals(){
+check_nb_args('globals',0,arguments)
+var res=$B.obj_dict($B.last($B.frames_stack)[3])
+res.$jsobj.__BRYTHON__=$B.JSObj.$factory($B)
+res.$is_namespace=true
+return res}
+function hasattr(obj,attr){check_no_kw('hasattr',obj,attr)
+check_nb_args('hasattr',2,arguments)
+try{$B.$getattr(obj,attr)
+return true}catch(err){return false}}
+var hash_cache={}
+function hash(obj){check_no_kw('hash',obj)
+check_nb_args('hash',1,arguments)
+if(obj.__hashvalue__ !==undefined){return obj.__hashvalue__}
+if(isinstance(obj,_b_.bool)){return _b_.int.$factory(obj)}
+if(obj.$is_class ||
+obj.__class__===_b_.type ||
+obj.__class__===$B.Function){return obj.__hashvalue__=$B.$py_next_hash--}
+if(typeof obj=="string"){var cached=hash_cache[obj]
+if(cached !==undefined){return cached}
+else{return hash_cache[obj]=_b_.str.__hash__(obj)}}
+var klass=obj.__class__ ||$B.get_class(obj)
+if(klass===undefined){throw _b_.TypeError.$factory("unhashable type: '"+
+_b_.str.$factory($B.JSObj.$factory(obj))+"'")}
+var hash_method=$B.$getattr(klass,'__hash__',_b_.None)
+if(hash_method===_b_.None){throw _b_.TypeError.$factory("unhashable type: '"+
+$B.class_name(obj)+"'")}
+if(hash_method.$infos.__func__===_b_.object.__hash__){if($B.$getattr(obj,'__eq__').$infos.__func__ !==_b_.object.__eq__){throw _b_.TypeError.$factory("unhashable type: '"+
+$B.class_name(obj)+"'",'hash')}else{return obj.__hashvalue__=_b_.object.__hash__(obj)}}else{return $B.$call(hash_method)(obj)}}
+function _get_builtins_doc(){if($B.builtins_doc===undefined){
+var url=$B.brython_path
+if(url.charAt(url.length-1)=='/'){url=url.substr(0,url.length-1)}
+url+='/builtins_docstrings.js'
+var f=_b_.open(url)
+eval(f.$content)
+$B.builtins_doc=docs}}
+function help(obj){if(obj===undefined){obj='help'}
+if(typeof obj=='string' && _b_[obj]!==undefined){_get_builtins_doc()
+var _doc=$B.builtins_doc[obj]
+if(_doc !==undefined && _doc !=''){_b_.print(_doc)
+return}}
+for(var i=0;i < builtin_names.length;i++){if(obj===_b_[builtin_names[i]]){_get_builtins_doc()
+_b_.print(_doc=$B.builtins_doc[builtin_names[i]])}}
+if(typeof obj=='string'){$B.$import("pydoc");
+var pydoc=$B.imported["pydoc"]
+$B.$getattr($B.$getattr(pydoc,"help"),"__call__")(obj)
+return}
+try{return $B.$getattr(obj,'__doc__')}
+catch(err){return ''}}
+help.__repr__=help.__str__=function(){return "Type help() for interactive help, or help(object) "+
+"for help about object."}
+function hex(obj){check_no_kw('hex',obj)
+check_nb_args('hex',1,arguments)
+return bin_hex_oct(16,obj)}
+function id(obj){check_no_kw('id',obj)
+check_nb_args('id',1,arguments)
+if(isinstance(obj,[_b_.str,_b_.int,_b_.float])&&
+!isinstance(obj,$B.long_int)){return $B.$getattr(_b_.str.$factory(obj),'__hash__')()}else if(obj.$id !==undefined){return obj.$id}
+else{return obj.$id=$B.UUID()}}
+function __import__(mod_name,globals,locals,fromlist,level){
+var $=$B.args('__import__',5,{name:null,globals:null,locals:null,fromlist:null,level:null},['name','globals','locals','fromlist','level'],arguments,{globals:None,locals:None,fromlist:_b_.tuple.$factory(),level:0},null,null)
+return $B.$__import__($.name,$.globals,$.locals,$.fromlist)}
+function input(msg){var res=prompt(msg ||'')||''
+if($B.imported["sys"]&& $B.imported["sys"].ps1){
+var ps1=$B.imported["sys"].ps1,ps2=$B.imported["sys"].ps2
+if(msg==ps1 ||msg==ps2){console.log(msg,res)}}
+return res}
+function isinstance(obj,cls){check_no_kw('isinstance',obj,cls)
+check_nb_args('isinstance',2,arguments)
+if(obj===null){return cls===None}
+if(obj===undefined){return false}
+if(Array.isArray(cls)){for(var kls of cls){if(isinstance(obj,kls)){return true}}
+return false}
+if(cls.__class__===$B.GenericAlias){
+throw _b_.TypeError.$factory(
+'isinstance() arg 2 cannot be a parameterized generic')}
+if((!cls.__class__)||
+!(cls.$factory !==undefined ||cls.$is_class !==undefined)){throw _b_.TypeError.$factory("isinstance() arg 2 must be a type "+
+"or tuple of types")}
+if(cls===_b_.int &&(obj===True ||obj===False)){return True}
+if(cls===_b_.bool){switch(typeof obj){case "string":
+return false
+case "number":
+return false
+case "boolean":
+return true}}
+var klass=obj.__class__
+if(klass==undefined){if(typeof obj=='string'){if(cls==_b_.str){return true}
+else if($B.builtin_classes.indexOf(cls)>-1){return false}}else if(obj.contructor===Number && Number.isFinite(obj)){if(cls==_b_.float){return true}}else if(typeof obj=='number' && Number.isFinite(obj)){if(Number.isFinite(obj)&& cls==_b_.int){return true}}
+klass=$B.get_class(obj)}
+if(klass===undefined){return false}
+function check(kl,cls){if(kl===cls){return true}
+else if(cls===_b_.str && kl===$B.StringSubclass){return true}
+else if(cls===_b_.int && kl===$B.IntSubclass){return true}}
+if(check(klass,cls)){return true}
+var mro=klass.__mro__
+for(var i=0;i < mro.length;i++){if(check(mro[i],cls)){return true}}
+var instancecheck=$B.$getattr(cls.__class__ ||$B.get_class(cls),'__instancecheck__',_b_.None)
+if(instancecheck !==_b_.None){return instancecheck(cls,obj)}
+return false}
+function issubclass(klass,classinfo){check_no_kw('issubclass',klass,classinfo)
+check_nb_args('issubclass',2,arguments)
+if(!klass.__class__ ||
+!(klass.$factory !==undefined ||klass.$is_class !==undefined)){throw _b_.TypeError.$factory("issubclass() arg 1 must be a class")}
+if(isinstance(classinfo,_b_.tuple)){for(var i=0;i < classinfo.length;i++){if(issubclass(klass,classinfo[i])){return true}}
+return false}
+if(classinfo.__class__===$B.GenericAlias){throw _b_.TypeError.$factory(
+'issubclass() arg 2 cannot be a parameterized generic')}
+if(classinfo.$factory ||classinfo.$is_class){if(klass===classinfo ||
+klass.__mro__.indexOf(classinfo)>-1){return true}}
+var sch=$B.$getattr(classinfo.__class__ ||$B.get_class(classinfo),'__subclasscheck__',_b_.None)
+if(sch==_b_.None){return false}
+return sch(classinfo,klass)}
+var iterator_class=$B.make_class("iterator",function(getitem,len){return{
+__class__:iterator_class,getitem:getitem,len:len,counter:-1}}
+)
+iterator_class.__next__=function(self){self.counter++
+if(self.len !==null && self.counter==self.len){throw _b_.StopIteration.$factory('')}
+try{return self.getitem(self.counter)}
+catch(err){throw _b_.StopIteration.$factory('')}}
+$B.set_func_names(iterator_class,"builtins")
+callable_iterator=$B.make_class("callable_iterator",function(func,sentinel){return{
+__class__:callable_iterator,func:func,sentinel:sentinel}}
+)
+callable_iterator.__iter__=function(self){return self}
+callable_iterator.__next__=function(self){var res=self.func()
+if($B.rich_comp("__eq__",res,self.sentinel)){throw _b_.StopIteration.$factory()}
+return res}
+$B.set_func_names(callable_iterator,"builtins")
+$B.$iter=function(obj,sentinel){
+if(sentinel===undefined){var klass=obj.__class__ ||$B.get_class(obj)
+try{var _iter=$B.$call($B.$getattr(klass,'__iter__'))}catch(err){if(err.__class__===_b_.AttributeError){try{var gi_method=$B.$call($B.$getattr(klass,'__getitem__')),gi=function(i){return gi_method(obj,i)},ln=len(obj)
+return iterator_class.$factory(gi,len)}catch(err){throw _b_.TypeError.$factory("'"+$B.class_name(obj)+
+"' object is not iterable")}}
+throw err}
+var res=$B.$call(_iter)(obj)
+try{$B.$getattr(res,'__next__')}
+catch(err){if(isinstance(err,_b_.AttributeError)){throw _b_.TypeError.$factory(
+"iter() returned non-iterator of type '"+
+$B.class_name(res)+"'")}}
+return res}else{return callable_iterator.$factory(obj,sentinel)}}
+function iter(){
+var $=$B.args('iter',1,{obj:null},['obj'],arguments,{},'args','kw'),sentinel
+if($.args.length > 0){var sentinel=$.args[0]}
+return $B.$iter($.obj,sentinel)}
+function len(obj){check_no_kw('len',obj)
+check_nb_args('len',1,arguments)
+var klass=obj.__class__ ||$B.get_class(obj)
+try{var method=$B.$getattr(klass,'__len__')}catch(err){throw _b_.TypeError.$factory("object of type '"+
+$B.class_name(obj)+"' has no len()")}
+return $B.$call(method)(obj)}
+function locals(){
+check_nb_args('locals',0,arguments)
+var res=$B.obj_dict($B.clone($B.last($B.frames_stack)[1]))
+res.$is_namespace=true
+delete res.$jsobj.__annotations__
+return res}
+var map=$B.make_class("map",function(){var $=$B.args('map',2,{func:null,it1:null},['func','it1'],arguments,{},'args',null),func=$B.$call($.func)
+var iter_args=[$B.$iter($.it1)]
+$.args.forEach(function(item){iter_args.push($B.$iter(item))})
+var obj={__class__:map,args:iter_args,func:func}
+return obj}
+)
+map.__iter__=function(self){return self}
+map.__next__=function(self){var args=[]
+for(var i=0;i < self.args.length;i++){args.push(next(self.args[i]))}
+return self.func.apply(null,args)}
+$B.set_func_names(map,"builtins")
+function $extreme(args,op){
+var $op_name='min'
+if(op==='__gt__'){$op_name="max"}
+var $=$B.args($op_name,0,{},[],args,{},'args','kw')
+var has_default=false,func=false
+for(var attr in $.kw.$string_dict){switch(attr){case 'key':
+func=$.kw.$string_dict[attr][0]
+break
+case 'default':
+var default_value=$.kw.$string_dict[attr][0]
+has_default=true
+break
+default:
+throw _b_.TypeError.$factory("'"+attr+
+"' is an invalid keyword argument for this function")}}
+if((! func)||func===_b_.None){func=x=> x}
+if($.args.length==0){throw _b_.TypeError.$factory($op_name+
+" expected 1 arguments, got 0")}else if($.args.length==1){
+var $iter=iter($.args[0]),res=null,x_value,extr_value
+while(true){try{var x=next($iter)
+if(res===null){extr_value=func(x)
+res=x}else{x_value=func(x)
+if($B.rich_comp(op,x_value,extr_value)){res=x
+extr_value=x_value}}}catch(err){if(err.__class__==_b_.StopIteration){if(res===null){if(has_default){return default_value}else{throw _b_.ValueError.$factory($op_name+
+"() arg is an empty sequence")}}else{return res}}
+throw err}}}else{if(has_default){throw _b_.TypeError.$factory("Cannot specify a default for "+
+$op_name+"() with multiple positional arguments")}
+if($B.last(args).$nat){var _args=[$.args].concat($B.last(args))}else{var _args=[$.args]}
+return $extreme.call(null,_args,op)}}
+function max(){return $extreme(arguments,'__gt__')}
+var memoryview=$B.make_class('memoryview',function(obj){check_no_kw('memoryview',obj)
+check_nb_args('memoryview',1,arguments)
+if(obj.__class__===memoryview){return obj}
+if($B.get_class(obj).$buffer_protocol){return{
+__class__:memoryview,obj:obj,
+format:'B',itemsize:1,ndim:1,shape:_b_.tuple.$factory([_b_.len(obj)]),strides:_b_.tuple.$factory([1]),suboffsets:_b_.tuple.$factory([]),c_contiguous:true,f_contiguous:true,contiguous:true}}else{throw _b_.TypeError.$factory("memoryview: a bytes-like object "+
+"is required, not '"+$B.class_name(obj)+"'")}}
+)
+memoryview.$match_sequence_pattern=true,
+memoryview.__eq__=function(self,other){if(other.__class__ !==memoryview){return false}
+return $B.$getattr(self.obj,'__eq__')(other.obj)}
+memoryview.__getitem__=function(self,key){if(isinstance(key,_b_.int)){var start=key*self.itemsize
+if(self.format=="I"){var res=self.obj.source[start],coef=256
+for(var i=1;i < 4;i++){res+=self.obj.source[start+i]*coef
+coef*=256}
+return res}else if("B".indexOf(self.format)>-1){if(key > self.obj.source.length-1){throw _b_.KeyError.$factory(key)}
+return self.obj.source[key]}else{
+return self.obj.source[key]}}
+var res=self.obj.__class__.__getitem__(self.obj,key)
+if(key.__class__===_b_.slice){return memoryview.$factory(res)}}
+memoryview.__len__=function(self){return len(self.obj)/self.itemsize}
+memoryview.__setitem__=function(self,key,value){try{$B.$setitem(self.obj,key,value)}catch(err){throw _b_.TypeError.$factory("cannot modify read-only memory")}}
+memoryview.cast=function(self,format){switch(format){case "B":
+return memoryview.$factory(self.obj)
+case "I":
+var res=memoryview.$factory(self.obj),objlen=len(self.obj)
+res.itemsize=4
+res.format="I"
+if(objlen % 4 !=0){throw _b_.TypeError.$factory("memoryview: length is not "+
+"a multiple of itemsize")}
+return res}}
+memoryview.hex=function(self){var res='',bytes=_b_.bytes.$factory(self)
+bytes.source.forEach(function(item){res+=item.toString(16)})
+return res}
+memoryview.tobytes=function(self){return _b_.bytes.$factory(self.obj)}
+memoryview.tolist=function(self){if(self.itemsize==1){return _b_.list.$factory(_b_.bytes.$factory(self.obj))}else if(self.itemsize==4){if(self.format=="I"){var res=[]
+for(var i=0;i < self.obj.source.length;i+=4){var item=self.obj.source[i],coef=256
+for(var j=1;j < 4;j++){item+=coef*self.obj.source[i+j]
+coef*=256}
+res.push(item)}
+return res}}}
+$B.set_func_names(memoryview,"builtins")
+function min(){return $extreme(arguments,'__lt__')}
+function next(obj){check_no_kw('next',obj)
+var missing={},$=$B.args("next",2,{obj:null,def:null},['obj','def'],arguments,{def:missing},null,null)
+var klass=obj.__class__ ||$B.get_class(obj),ga=$B.$call($B.$getattr(klass,"__next__"))
+if(ga !==undefined){try{return $B.$call(ga)(obj)}catch(err){if(err.__class__===_b_.StopIteration &&
+$.def !==missing){return $.def}
+throw err}}
+throw _b_.TypeError.$factory("'"+$B.class_name(obj)+
+"' object is not an iterator")}
+var NotImplementedType=$B.make_class("NotImplementedType",function(){return NotImplemented}
+)
+NotImplementedType.__repr__=NotImplementedType.__str__=function(self){return "NotImplemented"}
+$B.set_func_names(NotImplementedType,"builtins")
+var NotImplemented={__class__:NotImplementedType}
+function $not(obj){return !$B.$bool(obj)}
+function oct(obj){check_no_kw('oct',obj)
+check_nb_args('oct',1,arguments)
+return bin_hex_oct(8,obj)}
+function ord(c){check_no_kw('ord',c)
+check_nb_args('ord',1,arguments)
+if(typeof c.valueOf()=='string'){if(c.length==1){return c.charCodeAt(0)}
+if((0xD800 <=c[0]&& c[0]<=0xDBFF)||
+(0xDC00 <=c[1]&& c[1]<=0xDFFF)){throw _b_.TypeError.$factory('ord() expected a character, but '+
+'string of length '+c.length+' found')}
+var code=0x10000
+code+=(c.charCodeAt(0)& 0x03FF)<< 10
+code+=(c.charCodeAt(1)& 0x03FF)
+return code}
+switch($B.get_class(c)){case _b_.str:
+if(c.length==1){return c.charCodeAt(0)}
+throw _b_.TypeError.$factory('ord() expected a character, but '+
+'string of length '+c.length+' found')
+case _b_.bytes:
+case _b_.bytearray:
+if(c.source.length==1){return c.source[0]}
+throw _b_.TypeError.$factory('ord() expected a character, but '+
+'string of length '+c.source.length+' found')
+default:
+throw _b_.TypeError.$factory('ord() expected a character, but '+
+$B.class_name(c)+' was found')}}
+function pow(){var $=$B.args('pow',3,{x:null,y:null,mod:null},['x','y','mod'],arguments,{mod:None},null,null),x=$.x,y=$.y,z=$.mod
+var klass=x.__class__ ||$B.get_class(x)
+if(z===_b_.None){return $B.rich_op('__pow__',x,y)}else{if(x !=_b_.int.$factory(x)||y !=_b_.int.$factory(y)){throw _b_.TypeError.$factory("pow() 3rd argument not allowed "+
+"unless all arguments are integers")}
+return $B.$call($B.$getattr(klass,'__pow__'))(x,y,z)}}
+function $print(){var $ns=$B.args('print',0,{},[],arguments,{},'args','kw')
+var ks=$ns['kw'].$string_dict
+var end=(ks['end']===undefined ||ks['end']===None)? '\n' :ks['end'][0],sep=(ks['sep']===undefined ||ks['sep']===None)? ' ' :ks['sep'][0],file=ks['file']===undefined ? $B.stdout :ks['file'][0],args=$ns['args'],writer=$B.$getattr(file,'write')
+var items=[]
+for(var i=0,len=args.length;i < len;i++){var arg=_b_.str.$factory(args[i])
+writer(arg)
+if(i < len-1){writer(sep)}}
+writer(end)
+var flush=$B.$getattr(file,'flush',None)
+if(flush !==None){$B.$call(flush)()}
+return None}
+$print.__name__='print'
+$print.is_func=true
+var property=$B.make_class("property",function(fget,fset,fdel,doc){var res={__class__:property}
+property.__init__(res,fget,fset,fdel,doc)
+return res}
+)
+property.__init__=function(self,fget,fset,fdel,doc){var $=$B.args('__init__',5,{self:null,fget:null,fset:null,fdel:null,doc:null},['self','fget','fset','fdel','doc'],arguments,{fget:_b_.None,fset:_b_.None,fdel:_b_.None,doc:_b_.None},null,null),self=$.self,fget=$.fget,fset=$.fset,fdel=$.fdel,doc=$.doc
+self.__doc__=doc ||""
+self.$type=fget.$type
+self.fget=fget
+self.fset=fset
+self.fdel=fdel
+self.$is_property=true
+if(fget && fget.$attrs){for(var key in fget.$attrs){self[key]=fget.$attrs[key]}}
+self.__delete__=fdel;
+self.getter=function(fget){return property.$factory(fget,self.fset,self.fdel,self.__doc__)}
+self.setter=function(fset){return property.$factory(self.fget,fset,self.fdel,self.__doc__)}
+self.deleter=function(fdel){return property.$factory(self.fget,self.fset,fdel,self.__doc__)}}
+property.__get__=function(self,obj){if(self.fget===undefined){throw _b_.AttributeError.$factory("unreadable attribute")}
+return $B.$call(self.fget)(obj)}
+property.__repr__=function(self){$B.builtins_repr_check(property,arguments)
+return _b_.repr(self.fget(self))}
+property.__set__=function(self,obj,value){if(self.fset===undefined){throw _b_.AttributeError.$factory("can't set attribute")}
+$B.$getattr(self.fset,'__call__')(obj,value)}
+$B.set_func_names(property,"builtins")
+function quit(){throw _b_.SystemExit}
+quit.__repr__=quit.__str__=function(){return "Use quit() or Ctrl-Z plus Return to exit"}
+function repr(obj){check_no_kw('repr',obj)
+check_nb_args('repr',1,arguments)
+var klass=obj.__class__ ||$B.get_class(obj)
+return $B.$call($B.$getattr(klass,"__repr__"))(obj)}
+var reversed=$B.make_class("reversed",function(seq){
+check_no_kw('reversed',seq)
+check_nb_args('reversed',1,arguments)
+var klass=seq.__class__ ||$B.get_class(seq),rev_method=$B.$getattr(klass,'__reversed__',null)
+if(rev_method !==null){return $B.$call(rev_method)(seq)}
+try{var method=$B.$getattr(klass,'__getitem__')}catch(err){throw _b_.TypeError.$factory("argument to reversed() must be a sequence")}
+var res={__class__:reversed,$counter :_b_.len(seq),getter:function(i){return $B.$call(method)(seq,i)}}
+return res}
+)
+reversed.__iter__=function(self){return self}
+reversed.__next__=function(self){self.$counter--
+if(self.$counter < 0){throw _b_.StopIteration.$factory('')}
+return self.getter(self.$counter)}
+$B.set_func_names(reversed,"builtins")
+function round(){var $=$B.args('round',2,{number:null,ndigits:null},['number','ndigits'],arguments,{ndigits:None},null,null),arg=$.number,n=$.ndigits===None ? 0 :$.ndigits
+if(!isinstance(arg,[_b_.int,_b_.float])){var klass=arg.__class__ ||$B.get_class(arg)
+try{return $B.$call($B.$getattr(klass,"__round__")).apply(null,arguments)}catch(err){if(err.__class__===_b_.AttributeError){throw _b_.TypeError.$factory("type "+$B.class_name(arg)+
+" doesn't define __round__ method")}else{throw err}}}
+if(isinstance(arg,_b_.float)&&
+(arg.value===Infinity ||arg.value===-Infinity)){throw _b_.OverflowError.$factory("cannot convert float infinity to integer")}
+if(!isinstance(n,_b_.int)){throw _b_.TypeError.$factory(
+"'"+$B.class_name(n)+"' object cannot be interpreted as an integer")}
+var mult=Math.pow(10,n),x=arg*mult,floor=Math.floor(x),diff=Math.abs(x-floor),res
+if(diff==0.5){if(floor % 2){floor+=1}
+res=_b_.int.__truediv__(floor,mult)}else{res=_b_.int.__truediv__(Math.round(x),mult)}
+if($.ndigits===None){
+return res.valueOf()}else if(arg instanceof Number){return new Number(res)}else{return res.valueOf()}}
+function setattr(){var $=$B.args('setattr',3,{obj:null,attr:null,value:null},['obj','attr','value'],arguments,{},null,null),obj=$.obj,attr=$.attr,value=$.value
+if(!(typeof attr=='string')){throw _b_.TypeError.$factory("setattr(): attribute name must be string")}
+return $B.$setattr(obj,attr,value)}
+$B.$setattr=function(obj,attr,value){if(obj===undefined){console.log('obj undef',attr,value)}
+var $test=false
+if(attr=='__dict__'){
+if(! isinstance(value,_b_.dict)){throw _b_.TypeError.$factory("__dict__ must be set to a dictionary, "+
+"not a '"+$B.class_name(value)+"'")}
+if(obj.$infos){obj.$infos.__dict__=value
+return None}
+obj.__dict__=value
+return None}else if(attr=="__class__"){
+function error(msg){throw _b_.TypeError.$factory(msg)}
+if(value.__class__){if(value.__module__=="builtins"){error("__class__ assignement only "+
+"supported for heap types or ModuleType subclasses")}else if(Array.isArray(value.__bases__)){for(var i=0;i < value.__bases__.length;i++){if(value.__bases__[i]!==_b_.object &&
+value.__bases__[i].__module__=="builtins"){error("__class__ assignment: '"+$B.class_name(obj)+
+"' object layout differs from '"+
+$B.class_name(value)+"'")}}}}
+obj.__class__=value
+return None}else if(attr=="__doc__" && obj.__class__===_b_.property){obj[attr]=value}
+if($test){console.log("set attr",attr,"to",obj)}
+if(obj.$factory ||obj.$is_class){var metaclass=obj.__class__
+if($test){console.log("obj is class",metaclass,metaclass[attr])}
+if(metaclass && metaclass[attr]&& metaclass[attr].__get__ &&
+metaclass[attr].__set__){metaclass[attr].__set__(obj,value)
+return None}
+if(attr=="__module__"){obj.$infos.__module__=value
+return _b_.None}
+if(obj.$infos && obj.$infos.__module__=="builtins"){throw _b_.TypeError.$factory(
+"can't set attributes of built-in/extension type '"+
+obj.$infos.__name__+"'")}
+obj[attr]=value
+if(attr=="__init__" ||attr=="__new__"){
+obj.$factory=$B.$instance_creator(obj)}else if(attr=="__bases__"){
+obj.__mro__=_b_.type.mro(obj)}
+if($test){console.log("after setattr",obj)}
+return None}
+var res=obj[attr],klass=obj.__class__ ||$B.get_class(obj)
+if($test){console.log('set attr',attr,'of obj',obj,'class',klass,"obj[attr]",obj[attr])}
+if(res===undefined && klass){res=klass[attr]
+if(res===undefined){var mro=klass.__mro__,_len=mro.length
+for(var i=0;i < _len;i++){res=mro[i][attr]
+if(res !==undefined){break}}}}
+if($test){console.log('set attr',attr,'klass',klass,'found in class',res)}
+if(res !==undefined && res !==null){
+if(res.__get__ && res.__set__===undefined){throw _b_.AttributeError.$factory("can't set attribute '"+attr+
+"'")}
+if(res.__set__ !==undefined){res.__set__(res,obj,value);return None}
+var rcls=res.__class__,__set1__
+if(rcls !==undefined){var __set1__=rcls.__set__
+if(__set1__===undefined){var mro=rcls.__mro__
+for(var i=0,_len=mro.length;i < _len;i++){__set1__=mro[i].__set__
+if(__set1__){break}}}}
+if(__set1__ !==undefined){var __set__=$B.$getattr(res,'__set__',null)
+if(__set__ &&(typeof __set__=='function')){__set__.apply(res,[obj,value])
+return None}}else if(klass && klass.$descriptors !==undefined &&
+klass[attr]!==undefined){var setter=klass[attr].setter
+if(typeof setter=='function'){setter(obj,value)
+return None}else{throw _b_.AttributeError.$factory('readonly attribute')}}}
+var _setattr=false
+if(klass !==undefined){_setattr=klass.__setattr__
+if(_setattr===undefined){var mro=klass.__mro__
+for(var i=0,_len=mro.length-1;i < _len;i++){_setattr=mro[i].__setattr__
+if(_setattr){break}}}}
+var special_attrs=["__module__"]
+if(klass && klass.__slots__ && special_attrs.indexOf(attr)==-1 &&
+! _setattr){var _slots=true
+for(var kl of klass.__mro__){if(kl===_b_.object ||kl===_b_.type){break}
+if(! kl.__slots__){
+_slots=false
+break}}
+if(_slots){function mangled_slots(klass){if(klass.__slots__){if(Array.isArray(klass.__slots__)){return klass.__slots__.map(function(item){if(item.startsWith("__")&& ! item.endsWith("_")){return "_"+klass.$infos.__name__+item}else{return item}})}else{return klass.__slots__}}
+return[]}
+var has_slot=false
+if(mangled_slots(klass).indexOf(attr)>-1){has_slot=true}else{for(var i=0;i < klass.__mro__.length;i++){var kl=klass.__mro__[i]
+if(mangled_slots(kl).indexOf(attr)>-1){has_slot=true
+break}}}
+if(! has_slot){throw $B.attr_error(attr,klass)}}}
+if($test){console.log("attr",attr,"use _setattr",_setattr)}
+if(!_setattr){if(obj.__dict__===undefined){obj[attr]=value}else{_b_.dict.$setitem(obj.__dict__,attr,value)}
+if($test){console.log("no setattr, obj",obj)}}else{_setattr(obj,attr,value)}
+return None}
+function sorted(){var $=$B.args('sorted',1,{iterable:null},['iterable'],arguments,{},null,'kw')
+var _list=_b_.list.$factory(iter($.iterable)),args=[_list]
+for(var i=1;i < arguments.length;i++){args.push(arguments[i])}
+_b_.list.sort.apply(null,args)
+return _list}
+var staticmethod=$B.make_class("staticmethod",function(func){var f={$infos:func.$infos,__get__:function(){return func}}
+f.__get__.__class__=$B.method_wrapper
+f.__get__.$infos=func.$infos
+return f}
+)
+$B.set_func_names(staticmethod,"builtins")
+function sum(iterable,start){var $=$B.args('sum',2,{iterable:null,start:null},['iterable','start'],arguments,{start:0},null,null),iterable=$.iterable,start=$.start
+if(_b_.isinstance(start,[_b_.str,_b_.bytes])){throw _b_.TypeError.$factory("sum() can't sum bytes"+
+" [use b''.join(seq) instead]")}
+var res=start,iterable=iter(iterable)
+while(1){try{var _item=next(iterable)
+res=$B.add(res,_item)}catch(err){if(err.__class__===_b_.StopIteration){break}else{throw err}}}
+return res}
+$B.missing_super2=function(obj){obj.$missing=true
+return obj}
+var $$super=$B.make_class("super",function(_type,object_or_type){var no_object_or_type=object_or_type===undefined
+if(_type===undefined && object_or_type===undefined){var frame=$B.last($B.frames_stack),pyframe=$B.imported["_sys"].Getframe()
+if(pyframe.f_code && pyframe.f_code.co_varnames){_type=frame[1].__class__
+if(_type===undefined){throw _b_.RuntimeError.$factory("super(): no arguments")}
+object_or_type=frame[1][pyframe.f_code.co_varnames[0]]}else{throw _b_.RuntimeError.$factory("super(): no arguments")}}
+if(! no_object_or_type && Array.isArray(object_or_type)){object_or_type=object_or_type[0]}
+return{
+__class__:$$super,__thisclass__:_type,__self_class__:object_or_type}}
+)
+$$super.__get__=function(self,instance,klass){
+return $$super.$factory(self.__thisclass__,instance)}
+$$super.__getattribute__=function(self,attr){var mro=self.__thisclass__.__mro__,res
+if(self.__thisclass__.$is_js_class){if(attr=="__init__"){
+return function(){mro[0].$js_func.call(self.__self_class__,...arguments)}}}
+var sc=self.__self_class__
+if(sc !==undefined){if(!sc.$is_class){sc=sc.__class__ ||$B.get_class(sc)}
+var sc_mro=[sc].concat(sc.__mro__)
+for(var i=0;i < sc_mro.length;i++){if(sc_mro[i]===self.__thisclass__){mro=sc_mro.slice(i+1)
+break}}}
+var $test=false
+var f
+for(var i=0,len=mro.length;i < len;i++){if(mro[i][attr]!==undefined){f=mro[i][attr]
+break}}
+if(f===undefined){if($$super[attr]!==undefined){return(function(x){return function(){var args=[x]
+for(var i=0,len=arguments.length;i < len;i++){args.push(arguments[i])}
+return $$super[attr].apply(null,args)}})(self)}
+if($test){console.log("no attr",attr,self,"mro",mro)}
+throw $B.attr_error(attr,self)}
+if($test){console.log("super",attr,self,"mro",mro,"found in mro[0]",mro[0],f,f+'')}
+if(f.$type=="staticmethod" ||attr=="__new__"){return f}else if(typeof f !="function"){return f}else{if(f.__class__===$B.method){
+f=f.$infos.__func__}
+var callable=$B.$call(f)
+var method=function(){var res=callable(self.__self_class__,...arguments)
+if($test){console.log("calling super",self.__self_class__,attr,f,"res",res)}
+return res}
+method.__class__=$B.method
+var module
+if(f.$infos !==undefined){module=f.$infos.__module__}else if(f.__class__===property){module=f.fget.$infos.__module}else if(f.$is_class){module=f.__module__}
+method.$infos={__self__:self.__self_class__,__func__:f,__name__:attr,__module__:module,__qualname__:self.__thisclass__.$infos.__name__+"."+attr}
+return method}
+throw $B.attr_error(attr,self)}
+$$super.__init__=function(cls){if(cls===undefined){throw _b_.TypeError.$factory("descriptor '__init__' of 'super' "+
+"object needs an argument")}
+if(cls.__class__ !==$$super){throw _b_.TypeError.$factory("descriptor '__init__' requires a"+
+" 'super' object but received a '"+$B.class_name(cls)+"'")}}
+$$super.__repr__=function(self){$B.builtins_repr_check($$super,arguments)
+var res=""
+if(self.__self_class__ !==undefined){res+=', <'+self.__self_class__.__class__.$infos.__name__+' object>'}else{res+=', NULL'}
+return res+'>'}
+$B.set_func_names($$super,"builtins")
+function vars(){var def={},$=$B.args('vars',1,{obj:null},['obj'],arguments,{obj:def},null,null)
+if($.obj===def){return _b_.locals()}else{try{return $B.$getattr($.obj,'__dict__')}
+catch(err){if(err.__class__===_b_.AttributeError){throw _b_.TypeError.$factory("vars() argument must have __dict__ attribute")}
+throw err}}}
+var $Reader=$B.make_class("Reader")
+$Reader.__enter__=function(self){return self}
+$Reader.__exit__=function(self){return false}
+$Reader.__iter__=function(self){
+return iter($Reader.readlines(self))}
+$Reader.__len__=function(self){return self.lines.length}
+$Reader.close=function(self){self.closed=true}
+$Reader.flush=function(self){return None}
+$Reader.read=function(){var $=$B.args("read",2,{self:null,size:null},["self","size"],arguments,{size:-1},null,null),self=$.self,size=$B.$GetInt($.size)
+if(self.closed===true){throw _b_.ValueError.$factory('I/O operation on closed file')}
+if(size < 0){size=self.$length-self.$counter}
+if(self.$binary){res=_b_.bytes.$factory(self.$content.source.slice(self.$counter,self.$counter+size))}else{res=self.$content.substr(self.$counter,size)}
+self.$counter+=size
+return res}
+$Reader.readable=function(self){return true}
+function make_lines(self){
+if(self.$lines===undefined){if(! self.$binary){self.$lines=self.$content.split("\n")
+if($B.last(self.$lines)==''){self.$lines.pop()}
+self.$lines=self.$lines.map(x=> x+'\n')}else{var lines=[],pos=0,source=self.$content.source
+while(pos < self.$length){var ix=source.indexOf(10,pos)
+if(ix==-1){lines.push({__class__:_b_.bytes,source:source.slice(pos)})
+break}else{lines.push({__class__:_b_.bytes,source:source.slice(pos,ix+1)})
+pos=ix+1}}
+self.$lines=lines}}}
+$Reader.readline=function(self,size){var $=$B.args("readline",2,{self:null,size:null},["self","size"],arguments,{size:-1},null,null),self=$.self,size=$B.$GetInt($.size)
+self.$lc=self.$lc===undefined ?-1 :self.$lc
+if(self.closed===true){throw _b_.ValueError.$factory('I/O operation on closed file')}
+if(self.$binary){var ix=self.$content.source.indexOf(10,self.$counter)
+if(ix==-1){var rest=self.$content.source.slice(self.$counter)
+self.$counter=self.$content.source.length
+return _b_.bytes.$factory(rest)}else{var res={__class__:_b_.bytes,source :self.$content.source.slice(self.$counter,ix+1)}
+self.$counter=ix+1
+return res}}else{if(self.$counter==self.$content.length){return ''}
+var ix=self.$content.indexOf("\n",self.$counter)
+if(ix==-1){var rest=self.$content.substr(self.$counter)
+self.$counter=self.$content.length
+return rest}else{var res=self.$content.substring(self.$counter,ix+1)
+self.$counter=ix+1
+self.$lc+=1
+return res}}}
+$Reader.readlines=function(){var $=$B.args("readlines",2,{self:null,hint:null},["self","hint"],arguments,{hint:-1},null,null),self=$.self,hint=$B.$GetInt($.hint)
+var nb_read=0
+if(self.closed===true){throw _b_.ValueError.$factory('I/O operation on closed file')}
+self.$lc=self.$lc===undefined ?-1 :self.$lc
+make_lines(self)
+if(hint < 0){var lines=self.$lines.slice(self.$lc+1)}else{var lines=[]
+while(self.$lc < self.$lines.length &&
+nb_read < hint){self.$lc++
+lines.push(self.$lines[self.$lc])}}
+return lines}
+$Reader.seek=function(self,offset,whence){if(self.closed===True){throw _b_.ValueError.$factory('I/O operation on closed file')}
+if(whence===undefined){whence=0}
+if(whence===0){self.$counter=offset}else if(whence===1){self.$counter+=offset}else if(whence===2){self.$counter=self.$length+offset}
+return None}
+$Reader.seekable=function(self){return true}
+$Reader.tell=function(self){return self.$counter}
+$Reader.writable=function(self){return false}
+$B.set_func_names($Reader,"builtins")
+var $BufferedReader=$B.make_class('_io.BufferedReader',function(content){return{
+__class__:$BufferedReader,$binary:true,$content:content,$read_func:$B.$getattr(content,'read')}}
+)
+$BufferedReader.__mro__=[$Reader,_b_.object]
+$BufferedReader.read=function(self,size){if(self.$read_func===undefined){return $Reader.read(self,size===undefined ?-1 :size)}
+return self.$read_func(size ||-1)}
+var $TextIOWrapper=$B.make_class('_io.TextIOWrapper',function(){var $=$B.args("TextIOWrapper",6,{buffer:null,encoding:null,errors:null,newline:null,line_buffering:null,write_through:null},["buffer","encoding","errors","newline","line_buffering","write_through"],arguments,{encoding:"utf-8",errors:_b_.None,newline:_b_.None,line_buffering:_b_.False,write_through:_b_.False},null,null)
+return{
+__class__:$TextIOWrapper,$content:_b_.bytes.decode($.buffer.$content,$.encoding),encoding:$.encoding,errors:$.errors,newline:$.newline}}
+)
+$TextIOWrapper.__mro__=[$Reader,_b_.object]
+$B.set_func_names($TextIOWrapper,"builtins")
+$B.Reader=$Reader
+$B.TextIOWrapper=$TextIOWrapper
+$B.BufferedReader=$BufferedReader
+function $url_open(){
+var $=$B.args('open',3,{file:null,mode:null,encoding:null},['file','mode','encoding'],arguments,{mode:'r',encoding:'utf-8'},'args','kw'),file=$.file,mode=$.mode,encoding=$.encoding,result={}
+if(encoding=='locale'){
+encoding='utf-8'}
+if(mode.search('w')>-1){throw _b_.IOError.$factory("Browsers cannot write on disk")}else if(['r','rb'].indexOf(mode)==-1){throw _b_.ValueError.$factory("Invalid mode '"+mode+"'")}
+if(isinstance(file,_b_.str)){
+var is_binary=mode.search('b')>-1
+if($B.file_cache.hasOwnProperty($.file)){result.content=$B.file_cache[$.file]
+if(is_binary){result.content=_b_.str.encode(result.content,'utf-8')}}else if($B.files && $B.files.hasOwnProperty($.file)){
+var $res=atob($B.files[$.file].content)
+var source=[]
+for(const char of $res){source.push(char.charCodeAt(0))}
+result.content=_b_.bytes.$factory(source)
+if(!is_binary){
+try{result.content=_b_.bytes.decode(result.content,encoding)}catch(error){result.error=error}}}else if($B.protocol !="file"){
+var req=new XMLHttpRequest()
+req.overrideMimeType('text/plain;charset=x-user-defined')
+req.onreadystatechange=function(){if(this.readyState !=4){return}
+var status=this.status
+if(status==404){result.error=_b_.FileNotFoundError.$factory(file)}else if(status !=200){result.error=_b_.IOError.$factory('Could not open file '+
+file+' : status '+status)}else{var bytes=[]
+for(var i=0,len=this.response.length;i < len;i++){var cp=this.response.codePointAt(i)
+if(cp > 0xf700){cp-=0xf700}
+bytes.push(cp)}
+result.content=_b_.bytes.$factory(bytes)
+if(! is_binary){
+try{result.content=_b_.bytes.decode(result.content,encoding)}catch(error){result.error=error}}}}
+var fake_qs=$B.$options.cache ? '' :
+'?foo='+(new Date().getTime())
+req.open('GET',encodeURI(file+fake_qs),false)
+req.send()}else{throw _b_.FileNotFoundError.$factory(
+"cannot use 'open()' with protocol 'file'")}
+if(result.error !==undefined){throw result.error}
+var res={$binary:is_binary,$content:result.content,$counter:0,$encoding:encoding,$length:is_binary ? result.content.source.length :
+result.content.length,closed:False,mode,name:file}
+res.__class__=is_binary ? $BufferedReader :$TextIOWrapper
+return res}else{throw _b_.TypeError.$factory("invalid argument for open(): "+
+_b_.str.$factory(file))}}
+var zip=$B.make_class("zip",function(){var res={__class__:zip,items:[]}
+if(arguments.length==0){return res}
+var $ns=$B.args('zip',0,{},[],arguments,{},'args','kw')
+var _args=$ns['args'],strict=$ns.kw.$string_dict.strict &&
+$ns.kw.$string_dict.strict[0]
+var args=[],nexts=[],only_lists=true,min_len
+for(var i=0;i < _args.length;i++){if(only_lists && Array.isArray(_args[i])){if(strict){if(i==0){var len=_args[i].length}else if(_args[i]!=len){throw _b_.ValueError.$factory(`zip() argument ${i} `+
+`is ${_args[i] > len ? 'longer' : 'shorter'} `+
+`than argument ${i - 1}`)}}
+if(min_len===undefined ||_args[i].length < min_len){min_len=_args[i].length}}else{only_lists=false}
+var _next=$B.$call($B.$getattr(iter(_args[i]),"__next__"))
+args.push(_next)}
+var rank=0,items=[]
+if(only_lists){$B.nb_zip_list=$B.nb_zip_list===undefined ?
+1 :$B.nb_zip_list+1
+for(var i=0;i < min_len;i++){var line=[]
+for(var j=0;j < _args.length;j++){line.push(_args[j][i])}
+items.push($B.fast_tuple(line))}
+res.items=items
+return zip_iterator.$factory(items)}
+function*iterator(args){while(true){var line=[],flag=true
+for(var i=0;i < args.length;i++){try{line.push(args[i]())}catch(err){if(err.__class__==_b_.StopIteration){if(strict){if(i > 0){throw _b_.ValueError.$factory(
+`zip() argument ${i + 1} is shorter `+
+`than argument ${i}`)}else{for(var j=1;j < args.length;j++){var exhausted=true
+try{args[j]()
+exhausted=false}catch(err){}
+if(! exhausted){throw _b_.ValueError.$factory(
+`zip() argument ${j + 1} is longer `+
+`than argument ${i + 1}`)}}}}
+flag=false
+break}else{throw err}}}
+if(! flag){return}
+yield $B.fast_tuple(line)}}
+return $B.generator.$factory(iterator,'zip')(args)}
+)
+var zip_iterator=$B.make_iterator_class('zip')
+zip.__iter__=function(self){return zip_iterator.$factory(self.items)}
+$B.set_func_names(zip,"builtins")
+function no_set_attr(klass,attr){if(klass[attr]!==undefined){throw _b_.AttributeError.$factory("'"+klass.$infos.__name__+
+"' object attribute '"+attr+"' is read-only")}else{throw $B.attr_error(attr,klass)}}
+var True=true
+var False=false
+var ellipsis=$B.make_class("ellipsis",function(){return Ellipsis}
+)
+ellipsis.__repr__=function(self){return 'Ellipsis'}
+var Ellipsis={__class__:ellipsis}
+for(var $key in $B.$comps){
+switch($B.$comps[$key]){case 'ge':
+case 'gt':
+case 'le':
+case 'lt':
+ellipsis['__'+$B.$comps[$key]+'__']=(function(k){return function(other){throw _b_.TypeError.$factory("unorderable types: ellipsis() "+
+k+" "+$B.class_name(other))}})($key)}}
+for(var $func in Ellipsis){if(typeof Ellipsis[$func]=='function'){Ellipsis[$func].__str__=(function(f){return function(){return ""}})($func)}}
+$B.set_func_names(ellipsis)
+var FunctionCode=$B.make_class("function code")
+var FunctionGlobals=$B.make_class("function globals")
+$B.Function={__class__:_b_.type,__code__:{__class__:FunctionCode,__name__:'function code'},__globals__:{__class__:FunctionGlobals,__name__:'function globals'},__mro__:[_b_.object],$infos:{__name__:'function',__module__:"builtins"},$is_class:true}
+$B.Function.__delattr__=function(self,attr){if(attr=="__dict__"){throw _b_.TypeError.$factory("can't deleted function __dict__")}}
+$B.Function.__dir__=function(self){var infos=self.$infos ||{},attrs=self.$attrs ||{}
+return Object.keys(infos).concat(Object.keys(attrs))}
+$B.Function.__eq__=function(self,other){return self===other}
+$B.Function.__get__=function(self,obj){if(obj===_b_.None){return self}
+var method=function(){return self(obj,...arguments)}
+method.__class__=$B.method
+if(self.$infos===undefined){console.log("no $infos",self)
+console.log($B.last($B.frames_stack))}
+method.$infos={__name__:self.$infos.__name__,__qualname__:$B.class_name(obj)+"."+self.$infos.__name__,__self__:obj,__func__:self}
+return method}
+$B.Function.__getattribute__=function(self,attr){
+if(self.$infos && self.$infos[attr]!==undefined){if(attr=='__code__'){var res={__class__:code}
+for(var attr in self.$infos.__code__){res[attr]=self.$infos.__code__[attr]}
+res.name=self.$infos.__name__
+res.filename=self.$infos.__code__.co_filename
+res.co_code=self+""
+return res}else if(attr=='__annotations__'){
+return $B.obj_dict(self.$infos[attr])}else if(self.$infos.hasOwnProperty(attr)){return self.$infos[attr]}}else if(self.$infos && self.$infos.__dict__ &&
+self.$infos.__dict__.$string_dict[attr]!==undefined){return self.$infos.__dict__.$string_dict[attr][0]}else if(attr=="__closure__"){var free_vars=self.$infos.__code__.co_freevars
+if(free_vars.length==0){return None}
+var cells=[]
+for(var i=0;i < free_vars.length;i++){try{cells.push($B.cell.$factory($B.$check_def_free(free_vars[i])))}catch(err){
+cells.push($B.cell.$factory(None))}}
+return _b_.tuple.$factory(cells)}else if(attr=="__globals__"){return $B.obj_dict($B.imported[self.$infos.__module__])}else if(self.$attrs && self.$attrs[attr]!==undefined){return self.$attrs[attr]}else{return _b_.object.__getattribute__(self,attr)}}
+$B.Function.__repr__=function(self){if(self.$infos===undefined){return ''}else{return ''}}
+$B.Function.__mro__=[_b_.object]
+$B.Function.__setattr__=function(self,attr,value){if(attr=="__closure__"){throw _b_.AttributeError.$factory("readonly attribute")}else if(attr=="__defaults__"){
+if(value===_b_.None){value=[]}else if(! isinstance(value,_b_.tuple)){throw _b_.TypeError.$factory(
+"__defaults__ must be set to a tuple object")}
+var set_func=self.$set_defaults
+if(set_func===undefined){throw _b_.AttributeError.$factory("cannot set attribute "+attr+
+" of "+_b_.str.$factory(self))}
+if(self.$infos && self.$infos.__code__){
+var argcount=self.$infos.__code__.co_argcount,varnames=self.$infos.__code__.co_varnames,params=varnames.slice(0,argcount),$defaults={}
+for(var i=value.length-1;i >=0;i--){var pos=params.length-value.length+i
+if(pos < 0){break}
+$defaults[params[pos]]=value[i]}}else{throw _b_.AttributeError.$factory("cannot set attribute "+attr+
+" of "+_b_.str.$factory(self))}
+var klass=self.$infos.$class
+var new_func=set_func($defaults)
+new_func.$set_defaults=set_func
+if(klass){klass[self.$infos.__name__]=new_func
+new_func.$infos.$class=klass
+new_func.$infos.__defaults__=value}else{
+self.$infos.$defaults=value
+self.$infos.__defaults__=value}
+return _b_.None}
+if(self.$infos[attr]!==undefined){self.$infos[attr]=value}
+else{self.$attrs=self.$attrs ||{};self.$attrs[attr]=value}}
+$B.Function.$factory=function(){}
+$B.set_func_names($B.Function,"builtins")
+_b_.__BRYTHON__=__BRYTHON__
+$B.builtin_funcs=["__build_class__","abs","aiter","all","anext","any","ascii","bin","breakpoint","callable","chr","compile","delattr","dir","divmod","eval","exec","exit","format","getattr","globals","hasattr","hash","help","hex","id","input","isinstance","issubclass","iter","len","locals","max","min","next","oct","open","ord","pow","print","quit","repr","round","setattr","sorted","sum","vars"
+]
+var builtin_function=$B.builtin_function=$B.make_class(
+"builtin_function_or_method",function(f){f.__class__=builtin_function
+return f})
+builtin_function.__getattribute__=$B.Function.__getattribute__
+builtin_function.__reduce_ex__=builtin_function.__reduce__=function(self){return self.$infos.__name__}
+builtin_function.__repr__=builtin_function.__str__=function(self){return ''}
+$B.set_func_names(builtin_function,"builtins")
+var method_wrapper=$B.make_class("method_wrapper")
+method_wrapper.__repr__=method_wrapper.__str__=function(self){return ""}
+$B.set_func_names(method_wrapper,"builtins")
+var wrapper_descriptor=$B.wrapper_descriptor=
+$B.make_class("wrapper_descriptor")
+wrapper_descriptor.__getattribute__=$B.Function.__getattribute__
+wrapper_descriptor.__repr__=wrapper_descriptor.__str__=function(self){return ""}
+$B.set_func_names(wrapper_descriptor,"builtins")
+$B.builtin_classes=["bool","bytearray","bytes","classmethod","complex","dict","enumerate","filter","float","frozenset","int","list","map","memoryview","object","property","range","reversed","set","slice","staticmethod","str","super","tuple","type","zip"
+]
+var other_builtins=['Ellipsis','False','None','True','__debug__','__import__','copyright','credits','license','NotImplemented'
+]
+var builtin_names=$B.builtin_funcs.
+concat($B.builtin_classes).
+concat(other_builtins)
+for(var i=0;i < builtin_names.length;i++){var name=builtin_names[i],orig_name=name,name1=name
+if(name=='open'){name1='$url_open'}
+if(name=='super'){name1='$$super'}
+if(name=='eval'){name1='$$eval'}
+if(name=='print'){name1='$print'}
+try{_b_[name]=eval(name1)
+if($B.builtin_funcs.indexOf(orig_name)>-1){_b_[name].__class__=builtin_function
+_b_[name].$infos={__module__:'builtins',__name__:orig_name,__qualname__:orig_name}}}
+catch(err){}}
+_b_['open']=$url_open
+_b_['print']=$print
+_b_['super']=$$super
+_b_.object.__init__.__class__=wrapper_descriptor
+_b_.object.__new__.__class__=builtin_function})(__BRYTHON__)
+;
+;(function($B){var _b_=$B.builtins
+$B.del_exc=function(){var frame=$B.last($B.frames_stack)
+frame[1].$current_exception=undefined}
+$B.set_exc=function(exc){var frame=$B.last($B.frames_stack)
+if(frame===undefined){console.log("no frame",exc,exc.__class__,exc.args,exc.$stack)}
+frame[1].$current_exception=$B.exception(exc)}
+$B.get_exc=function(){var frame=$B.last($B.frames_stack)
+return frame[1].$current_exception}
+$B.$raise=function(arg,cause){
+var active_exc=$B.get_exc()
+if(arg===undefined){if(active_exc !==undefined){throw active_exc}
+throw _b_.RuntimeError.$factory("No active exception to reraise")}else if(_b_.isinstance(arg,BaseException)){if(arg.__class__===_b_.StopIteration &&
+$B.last($B.frames_stack)[1].$is_generator){
+arg=_b_.RuntimeError.$factory("generator raised StopIteration")}
+arg.__context__=active_exc===undefined ? _b_.None :active_exc
+arg.__cause__=cause ||_b_.None
+arg.__suppress_context__=cause !==undefined
+throw arg}else if(arg.$is_class && _b_.issubclass(arg,BaseException)){if(arg===_b_.StopIteration){if($B.last($B.frames_stack)[1].$is_generator){
+throw _b_.RuntimeError.$factory("generator raised StopIteration")}}
+var exc=$B.$call(arg)()
+exc.__context__=active_exc===undefined ? _b_.None :active_exc
+exc.__cause__=cause ||_b_.None
+exc.__suppress_context__=cause !==undefined
+throw exc}else{throw _b_.TypeError.$factory("exceptions must derive from BaseException")}}
+$B.print_stack=function(stack){stack=stack ||$B.frames_stack
+var trace=[]
+stack.forEach(function(frame){var line_info=frame[1].$line_info
+if(line_info !==undefined){var info=line_info.split(",")
+if(info[1].startsWith("$exec")){info[1]=""}
+trace.push(info[1]+" line "+info[0])
+var src=$B.file_cache[frame[3].__file__]
+if(src){var lines=src.split("\n"),line=lines[parseInt(info[0])-1]
+trace.push(" "+line.trim())}}})
+console.log("print stack ok",trace)
+return trace.join("\n")}
+var traceback=$B.traceback=$B.make_class("traceback",function(exc,stack){var frame=$B.last($B.frames_stack)
+if(stack===undefined){stack=exc.$stack}
+return{
+__class__ :traceback,$stack:stack,exc:exc}}
+)
+traceback.__getattribute__=function(self,attr){switch(attr){case "tb_frame":
+return frame.$factory(self.$stack)
+case "tb_lineno":
+return self.$stack[0][1].$lineno
+case "tb_lasti":
+throw _b_.NotImplementedError.$factory(attr)
+case "tb_next":
+if(self.$stack.length <=1){return _b_.None}else{return traceback.$factory(self.exc,self.$stack.slice(1))}
+default:
+return _b_.object.__getattribute__(self,attr)}}
+$B.set_func_names(traceback,"builtins")
+var frame=$B.make_class("frame",function(stack,pos){var fs=stack
+var res={__class__:frame,f_builtins :{},
+$stack:stack.slice()}
+if(pos===undefined){pos=0}
+res.$pos=pos
+if(fs.length){var _frame=fs[pos],locals_id=_frame[0],filename
+try{res.f_locals=$B.obj_dict(_frame[1])}catch(err){console.log("err "+err)
+throw err}
+res.f_globals=$B.obj_dict(_frame[3])
+if(_frame[3].__file__ !==undefined){filename=_frame[3].__file__}
+if(locals_id.startsWith("$exec")){filename=""}
+res.f_lineno=_frame[1].$lineno ||-1
+var co_name=locals_id.startsWith("$exec")? "" :
+locals_id
+if(locals_id==_frame[2]){co_name=""}else if(locals_id.startsWith("lc"+$B.lambda_magic)){co_name=""}else{if(_frame[1].$name){co_name=_frame[1].$name}else if(_frame[1].$comprehension){co_name='<'+_frame[1].$comprehension+'>'}else if(_frame[1].$list_comp){co_name=''}else if(_frame.length > 4){if(_frame[4].$infos){co_name=_frame[4].$infos.__name__}else{co_name=_frame[4].name}
+if(_frame[4].$infos===undefined){
+if(_frame[4].name.startsWith("__ge")){co_name=""}else if(_frame[4].name.startsWith("set_comp"+
+$B.lambda_magic)){co_name=""}else if(_frame[4].name.startsWith("lambda"+
+$B.lambda_magic)){co_name=""}}else if(filename===undefined && _frame[4].$infos.__code__){filename=_frame[4].$infos.__code__.co_filename
+if(filename===undefined){filename=_frame[4].$infos.__module__}
+res.f_lineno=_frame[4].$infos.__code__.co_firstlineno}}}
+if(_frame.length > 4 && _frame[4].$infos !==undefined){res.f_code=_frame[4].$infos.__code__}else{res.f_code={co_name:co_name,co_filename:filename}
+if(_frame[1].$comp_code){$B.update_obj(res.f_code,_frame[1].$comp_code)}}
+res.f_code.__class__=$B.code
+res.f_code.co_code=_b_.None
+if(filename===undefined){res.f_code.co_filename=""}}
+return res}
+)
+frame.__delattr__=function(self,attr){if(attr=="f_trace"){$B.last(self.$stack)[1].$f_trace=_b_.None}}
+frame.__getattr__=function(self,attr){
+if(attr=="f_back"){if(self.$pos > 0){return frame.$factory(self.$stack.slice(0,self.$stack.length-1),self.$pos-1)}else{return _b_.None}}else if(attr=="clear"){return function(){}}else if(attr=="f_trace"){var locals=$B.last(self.$stack)[1]
+if(locals.$f_trace===undefined){return _b_.None}
+return locals.$f_trace}}
+frame.__setattr__=function(self,attr,value){if(attr=="f_trace"){
+$B.last(self.$stack)[1].$f_trace=value}}
+frame.__str__=frame.__repr__=function(self){return ''}
+$B.set_func_names(frame,"builtins")
+$B._frame=frame
+var BaseException=_b_.BaseException={__class__:_b_.type,__bases__ :[_b_.object],__mro__:[_b_.object],args:[],$infos:{__name__:"BaseException",__module__:"builtins"},$is_class:true}
+BaseException.__init__=function(self){var args=arguments[1]===undefined ?[]:[arguments[1]]
+self.args=_b_.tuple.$factory(args)}
+BaseException.__repr__=function(self){var res=self.__class__.$infos.__name__+'('
+if(self.args[0]!==undefined){res+=_b_.repr(self.args[0])}
+if(self.args.length > 1){res+=', '+_b_.repr($B.fast_tuple(self.args.slice(1)))}
+return res+')'}
+BaseException.__str__=function(self){if(self.args.length > 0 && self.args[0]!==_b_.None){return _b_.str.$factory(self.args[0])}
+return ''}
+BaseException.__new__=function(cls){var err=_b_.BaseException.$factory()
+err.__class__=cls
+err.__dict__=$B.empty_dict()
+return err}
+BaseException.__getattr__=function(self,attr){if(attr=="__traceback__"){
+if(self.$traceback !==undefined){return self.$traceback}
+return traceback.$factory(self)}else if(attr=='__context__'){var frame=$B.last($B.frames_stack),ctx=frame[1].$current_exception
+return ctx ||_b_.None}else{throw $B.attr_error(attr,self)}}
+BaseException.with_traceback=function(self,tb){self.$traceback=tb
+return self}
+$B.deep_copy=function(stack){var res=[]
+for(const s of stack){var item=[s[0],{},s[2],{}]
+if(s[4]!==undefined){item.push(s[4])}
+for(const i of[1,3]){for(var key in s[i]){item[i][key]=s[i][key]}}
+res.push(item)}
+return res}
+$B.save_stack=function(){return $B.deep_copy($B.frames_stack)}
+$B.restore_stack=function(stack,locals){$B.frames_stack=stack
+$B.frames_stack[$B.frames_stack.length-1][1]=locals}
+$B.freeze=function(err){
+function get_line_info(frame){return `${frame[1].$lineno},${frame[2]}`}
+if(err.$stack===undefined){err.$line_infos=[]
+for(var frame of $B.frames_stack){err.$line_infos.push(get_line_info(frame))}
+err.$stack=$B.frames_stack.slice()
+if($B.frames_stack.length){err.$line_info=get_line_info($B.last($B.frames_stack))}}}
+var show_stack=$B.show_stack=function(stack){stack=stack ||$B.frames_stack
+for(const frame of stack){console.log(frame[0],frame[1].$line_info)}}
+var be_factory=`
+function (){
+ var err = Error()
+ err.args = $B.fast_tuple(Array.prototype.slice.call(arguments))
+ err.__class__ = _b_.BaseException
+ err.$py_error = true
+ $B.freeze(err)
+ // placeholder
+ err.__cause__ = _b_.None // XXX fix me
+ err.__context__ = _b_.None // XXX fix me
+ err.__suppress_context__ = false // XXX fix me
+ return err}`
+eval('BaseException.$factory = '+be_factory)
+BaseException.$factory.$infos={__name__:"BaseException",__qualname__:"BaseException"}
+$B.set_func_names(BaseException)
+_b_.BaseException=BaseException
+$B.exception=function(js_exc,in_ctx_manager){
+if(! js_exc.__class__){var exc=Error()
+exc.__name__="Internal Javascript error: "+
+(js_exc.__name__ ||js_exc.name)
+exc.__class__=_b_.Exception
+exc.$js_exc=js_exc
+if($B.is_recursion_error(js_exc)){return _b_.RecursionError.$factory("too much recursion")}else if(js_exc.name=="ReferenceError"){exc.__name__="NameError"
+exc.__class__=_b_.NameError}else if(js_exc.name=="InternalError"){exc.__name__="RuntimeError"
+exc.__class__=_b_.RuntimeError}
+exc.__cause__=_b_.None
+exc.__context__=_b_.None
+exc.__suppress_context__=false
+var $message=": "+
+(js_exc.message ||"<"+js_exc+">")
+exc.args=_b_.tuple.$factory([$message])
+exc.$py_error=true
+console.log('js error',exc.args)
+console.log(js_exc.stack)
+console.log('frames_stack',$B.frames_stack.slice())
+for(var frame of $B.frames_stack){var src=undefined
+var file=frame[1].__file__ ||frame[3].__file__
+if(file && $B.file_cache[file]){src=$B.file_cache[file]}
+console.log('line',frame[1].$lineno,'file',file,'in',frame[0])
+if(src !==undefined){var lines=src.split('\n'),line=lines[frame[1].$lineno-1]
+console.log(' '+line)}}
+$B.freeze(exc)}else{var exc=js_exc
+$B.freeze(exc)
+if(in_ctx_manager){
+var current_locals=$B.last($B.frames_stack)[0]
+for(var i=0,len=exc.$stack.length;i < len;i++){if(exc.$stack[i][0]==current_locals){exc.$stack=exc.$stack.slice(i)
+exc.$traceback=traceback.$factory(exc)
+break}}}}
+return exc}
+$B.is_exc=function(exc,exc_list){
+if(exc.__class__===undefined){exc=$B.exception(exc)}
+var this_exc_class=exc.$is_class ? exc :exc.__class__
+for(var i=0;i < exc_list.length;i++){var exc_class=exc_list[i]
+if(this_exc_class===undefined){console.log("exc class undefined",exc)}
+if(_b_.issubclass(this_exc_class,exc_class)){return true}}
+return false}
+$B.is_recursion_error=function(js_exc){
+var msg=js_exc+"",parts=msg.split(":"),err_type=parts[0].trim(),err_msg=parts[1].trim()
+return(err_type=='InternalError' && err_msg=='too much recursion')||
+(err_type=='Error' && err_msg=='Out of stack space')||
+(err_type=='RangeError' && err_msg=='Maximum call stack size exceeded')}
+var $make_exc=$B.$make_exc=function(names,parent){
+if(parent===undefined){console.log('pas de parent',names)}
+var _str=[],pos=0
+for(var i=0;i < names.length;i++){var name=names[i],code=""
+if(Array.isArray(name)){
+var code=name[1],name=name[0]}
+$B.builtins_scope[name]=true
+var $exc=(be_factory).replace(/BaseException/g,name)
+$exc=$exc.replace("// placeholder",code)
+_str[pos++]="_b_."+name+' = {__class__:_b_.type, '+
+'__bases__: [_b_.'+parent.$infos.__name__+'], '+
+'__mro__: [_b_.'+parent.$infos.__name__+
+"].concat(parent.__mro__), $is_class: true,"+
+"$infos: {__name__:'"+name+"'}}"
+_str[pos++]="_b_."+name+".$factory = "+$exc
+_str[pos++]="_b_."+name+'.$factory.$infos = {__name__: "'+
+name+'", __qualname__: "'+name+'"}'
+_str[pos++]="$B.set_func_names(_b_."+name+", 'builtins')"}
+try{eval(_str.join(";"))}catch(err){console.log("--err"+err)
+throw err}}
+$make_exc(["SystemExit","KeyboardInterrupt","GeneratorExit","Exception"],BaseException)
+$make_exc([["StopIteration","err.value = arguments[0]"],["StopAsyncIteration","err.value = arguments[0]"],"ArithmeticError","AssertionError","BufferError","EOFError",["ImportError","err.name = arguments[0]"],"LookupError","MemoryError","OSError","ReferenceError","RuntimeError",["SyntaxError","err.msg = arguments[0]"],"SystemError","TypeError","ValueError","Warning"],_b_.Exception)
+$make_exc(["FloatingPointError","OverflowError","ZeroDivisionError"],_b_.ArithmeticError)
+$make_exc([["ModuleNotFoundError","err.name = arguments[0]"]],_b_.ImportError)
+$make_exc(["IndexError","KeyError"],_b_.LookupError)
+$make_exc(["BlockingIOError","ChildProcessError","ConnectionError","FileExistsError","FileNotFoundError","InterruptedError","IsADirectoryError","NotADirectoryError","PermissionError","ProcessLookupError","TimeoutError"],_b_.OSError)
+$make_exc(["BrokenPipeError","ConnectionAbortedError","ConnectionRefusedError","ConnectionResetError"],_b_.ConnectionError)
+$make_exc(["NotImplementedError","RecursionError"],_b_.RuntimeError)
+$make_exc([["IndentationError","err.msg = arguments[0]"]],_b_.SyntaxError)
+$make_exc(["TabError"],_b_.IndentationError)
+$make_exc(["UnicodeError"],_b_.ValueError)
+$make_exc(["UnicodeDecodeError","UnicodeEncodeError","UnicodeTranslateError"],_b_.UnicodeError)
+$make_exc(["DeprecationWarning","PendingDeprecationWarning","RuntimeWarning","SyntaxWarning","UserWarning","FutureWarning","ImportWarning","UnicodeWarning","BytesWarning","ResourceWarning","EncodingWarning"],_b_.Warning)
+$make_exc(["EnvironmentError","IOError","VMSError","WindowsError"],_b_.OSError)
+var js='\nvar $ = $B.args("AttributeError", 1, {"msg": null, "name":null, "obj":null}, '+
+'["msg", "name", "obj"], arguments, '+
+'{msg: _b_.None, name: _b_.None, obj: _b_.None}, "*", null);\n'+
+'err.args = $B.fast_tuple($.msg === _b_.None ? [] : [$.msg])\n;'+
+'err.name = $.name\nerr.obj = $.obj\n'
+$make_exc([["AttributeError",js]],_b_.Exception)
+_b_.AttributeError.__str__=function(self){var msg=self.args[0]
+var suggestion=offer_suggestions_for_attribute_error(self)
+if(suggestion){msg+=`. Did you mean: '${suggestion}'?`}
+return msg}
+$B.set_func_names(_b_.AttributeError,'builtins')
+$B.attr_error=function(name,obj){if(obj.$is_class){var msg=`type object '${obj.$infos.__name__}'`}else{var msg=`'${$B.class_name(obj)}' object`}
+msg+=` has no attribute '${name}'`
+return _b_.AttributeError.$factory({$nat:"kw",kw:{name,obj,msg}})}
+var js='\nvar $ = $B.args("NameError", 1, {"name":null}, '+
+'["name"], arguments, '+
+'{name: _b_.None}, "*", null);\n'+
+'err.args = $B.fast_tuple($.name === _b_.None ? [] : [$.name])\n;'+
+'err.name = $.name\n'
+$make_exc([["NameError",js]],_b_.Exception)
+_b_.NameError.__str__=function(self){var msg=`name '${self.name}' is not defined`,suggestion=offer_suggestions_for_name_error(self)
+if(suggestion){msg+=`. Did you mean: '${suggestion}'?`}
+return msg}
+$B.set_func_names(_b_.NameError,'builtins')
+$make_exc(["UnboundLocalError"],_b_.NameError)
+_b_.UnboundLocalError.__str__=function(self){return self.args[0]}
+$B.set_func_names(_b_.UnboundLocalError,'builtins')
+$B.name_error=function(name,obj){return _b_.NameError.$factory({$nat:"kw",kw:{name}})}
+$B.$TypeError=function(msg){throw _b_.TypeError.$factory(msg)}
+var MAX_CANDIDATE_ITEMS=750,MAX_STRING_SIZE=40,MOVE_COST=2,CASE_COST=1,SIZE_MAX=65535
+function LEAST_FIVE_BITS(n){return((n)& 31)}
+function levenshtein_distance(a,b,max_cost){
+if(a==b){return 0}
+if(a.length < b.length){[a,b]=[b,a]}
+while(a.length && a[0]==b[0]){a=a.substr(1)
+b=b.substr(1)}
+while(a.length && a[a.length-1]==b[b.length-1]){a=a.substr(0,a.length-1)
+b=b.substr(0,b.length-1)}
+if(b.length==0){return a.length*MOVE_COST}
+if((b.length-a.length)*MOVE_COST > max_cost){return max_cost+1}
+var buffer=[]
+for(var i=0;i < a.length;i++){
+buffer[i]=(i+1)*MOVE_COST}
+var result=0
+for(var b_index=0;b_index < b.length;b_index++){var code=b[b_index]
+var distance=result=b_index*MOVE_COST;
+var minimum=SIZE_MAX;
+for(var index=0;index < a.length;index++){
+var substitute=distance+substitution_cost(code,a[index])
+distance=buffer[index]
+var insert_delete=Math.min(result,distance)+MOVE_COST
+result=Math.min(insert_delete,substitute)
+buffer[index]=result
+if(result < minimum){minimum=result}}
+if(minimum > max_cost){
+return max_cost+1}}
+return result}
+function substitution_cost(a,b){if(LEAST_FIVE_BITS(a)!=LEAST_FIVE_BITS(b)){
+return MOVE_COST}
+if(a==b){return 0}
+if(a.toLowerCase()==b.toLowerCase()){return CASE_COST}
+return MOVE_COST}
+function calculate_suggestions(dir,name){if(dir.length >=MAX_CANDIDATE_ITEMS){return null}
+var suggestion_distance=2**52,suggestion=null
+for(var item of dir){
+var max_distance=(name.length+item.length+3)*MOVE_COST/6
+max_distance=Math.min(max_distance,suggestion_distance-1)
+var current_distance=
+levenshtein_distance(name,item,max_distance)
+if(current_distance > max_distance){continue}
+if(!suggestion ||current_distance < suggestion_distance){suggestion=item
+suggestion_distance=current_distance}}
+return suggestion}
+function offer_suggestions_for_attribute_error(exc){var name=exc.name,obj=exc.obj
+var dir=_b_.dir(obj),suggestions=calculate_suggestions(dir,name)
+return suggestions}
+function offer_suggestions_for_name_error(exc){var name=exc.name,frame=$B.last(exc.$stack)
+var locals=Object.keys(frame[1]).filter(x=> !(x.startsWith('$')))
+var suggestion=calculate_suggestions(locals,name)
+if(suggestion){return suggestion}
+if(frame[2]!=frame[0]){var globals=Object.keys(frame[3]).filter(x=> !(x.startsWith('$')))
+var suggestion=calculate_suggestions(globals,name)
+if(suggestion){return suggestion}}}
+function trace_from_stack(stack){var trace=''
+for(var frame of stack){var lineno=frame[1].$lineno,filename=frame[3].__file__,src=$B.file_cache[filename]
+trace+=` File ${frame[3].__file__}, line ${lineno}, in `
+if(frame[0]==frame[2]){trace+=''}else{trace+=frame[0]}
+trace+='\n'
+if(src){var lines=src.split('\n'),line=lines[lineno-1]
+if(line){trace+=' '+line.trim()+'\n'}}}
+return trace}
+$B.show_error=function(err){if($B.debug > 1){console.log("handle error",err.__class__,err.args)
+console.log('stack',err.$stack)
+console.log(err.stack)}
+var trace=''
+if(err.$stack && err.$stack.length > 0){trace='Traceback (most recent call last):\n'}
+if(err.__class__===_b_.SyntaxError ||
+err.__class__===_b_.IndentationError){trace+=trace_from_stack(err.$stack)
+var filename=err.filename,line=err.text,indent=line.length-line.trimLeft().length
+trace+=` File ${filename}, line ${err.args[1][1]}\n`+
+` ${line.trim()}\n`
+if(err.__class__ !==_b_.IndentationError &&
+filename !==''){
+var start=err.offset-indent,marks=' '+' '.repeat(start),nb_marks=1
+if(err.end_lineno){if(err.end_lineno > err.lineno){nb_marks=line.length-start-indent}else{nb_marks=err.end_offset-start-indent}}
+marks+='^'.repeat(nb_marks)+'\n'
+trace+=marks}
+trace+=`${err.__class__.$infos.__name__}: ${err.args[0]}`}else if(err.__class__ !==undefined){var name=$B.class_name(err)
+trace+=trace_from_stack(err.$stack)
+trace+=name+': '+_b_.str.$factory(err)}else{console.log(err)
+trace=err+""}
+try{$B.$getattr($B.stderr,'write')(trace)
+var flush=$B.$getattr($B.stderr,'flush',_b_.None)
+if(flush !==_b_.None){flush()}}catch(print_exc_err){console.debug(trace)}}
+$B.handle_error=function(err){
+if(err.$handled){return}
+err.$handled=true
+$B.show_error(err)
+throw err}})(__BRYTHON__)
+;
+
+;(function($B){var _b_=$B.builtins,None=_b_.None,range={__class__:_b_.type,__mro__:[_b_.object],$infos:{__module__:"builtins",__name__:"range"},$is_class:true,$native:true,$match_sequence_pattern:true,
+$descriptors:{start:true,step:true,stop:true}}
+range.__contains__=function(self,other){if(range.__len__(self)==0){return false}
+try{other=$B.int_or_bool(other)}
+catch(err){
+try{range.index(self,other);return true}
+catch(err){return false}}
+var sub=$B.sub(other,self.start),fl=$B.floordiv(sub,self.step),res=$B.mul(self.step,fl)
+if($B.eq(res,sub)){if($B.gt(self.stop,self.start)){return $B.ge(other,self.start)&& $B.gt(self.stop,other)}else{return $B.ge(self.start,other)&& $B.gt(other,self.stop)}}else{return false}}
+range.__delattr__=function(self,attr,value){throw _b_.AttributeError.$factory("readonly attribute")}
+range.__eq__=function(self,other){if(_b_.isinstance(other,range)){var len=range.__len__(self)
+if(! $B.eq(len,range.__len__(other))){return false}
+if(len==0){return true}
+if(! $B.eq(self.start,other.start)){return false}
+if(len==1){return true}
+return $B.eq(self.step,other.step)}
+return false}
+function compute_item(r,i){var len=range.__len__(r)
+if(len==0){return r.start}
+else if(i > len){return r.stop}
+return $B.add(r.start,$B.mul(r.step,i))}
+range.__getitem__=function(self,rank){if(_b_.isinstance(rank,_b_.slice)){var norm=_b_.slice.$conv_for_seq(rank,range.__len__(self)),substep=$B.mul(self.step,norm.step),substart=compute_item(self,norm.start),substop=compute_item(self,norm.stop)
+return range.$factory(substart,substop,substep)}
+if(typeof rank !="number"){rank=$B.$GetInt(rank)}
+if($B.gt(0,rank)){rank=$B.add(rank,range.__len__(self))}
+var res=$B.add(self.start,$B.mul(rank,self.step))
+if(($B.gt(self.step,0)&&
+($B.ge(res,self.stop)||$B.gt(self.start,res)))||
+($B.gt(0,self.step)&&
+($B.ge(self.stop,res)||$B.gt(res,self.start)))){throw _b_.IndexError.$factory("range object index out of range")}
+return res}
+range.__hash__=function(self){var len=range.__len__(self)
+if(len==0){return _b_.hash(_b_.tuple.$factory([0,None,None]))}
+if(len==1){return _b_.hash(_b_.tuple.$factory([1,self.start,None]))}
+return _b_.hash(_b_.tuple.$factory([len,self.start,self.step]))}
+var RangeIterator={__class__:_b_.type,__mro__:[_b_.object],__iter__:function(self){return self},__next__:function(self){return _b_.next(self.obj)},$infos:{__name__:"range_iterator",__module__:"builtins"},$is_class:true}
+RangeIterator.$factory=function(obj){return{__class__:RangeIterator,obj:obj}}
+$B.set_func_names(RangeIterator,"builtins")
+range.__iter__=function(self){var res={__class__ :range,start:self.start,stop:self.stop,step:self.step}
+if(self.$safe){res.$counter=self.start-self.step}else{res.$counter=$B.sub(self.start,self.step)}
+return RangeIterator.$factory(res)}
+range.__len__=function(self){var len
+if($B.gt(self.step,0)){if($B.ge(self.start,self.stop)){return 0}
+var n=$B.sub(self.stop,$B.add(1,self.start)),q=$B.floordiv(n,self.step)
+len=$B.add(1,q)}else{if($B.ge(self.stop,self.start)){return 0}
+var n=$B.sub(self.start,$B.add(1,self.stop)),q=$B.floordiv(n,$B.mul(-1,self.step))
+len=$B.add(1,q)}
+if($B.maxsize===undefined){$B.maxsize=$B.long_int.__pow__($B.long_int.$factory(2),63)
+$B.maxsize=$B.long_int.__sub__($B.maxsize,1)}
+return len}
+range.__next__=function(self){if(self.$safe){self.$counter+=self.step
+if((self.step > 0 && self.$counter >=self.stop)
+||(self.step < 0 && self.$counter <=self.stop)){throw _b_.StopIteration.$factory("")}}else{self.$counter=$B.add(self.$counter,self.step)
+if(($B.gt(self.step,0)&& $B.ge(self.$counter,self.stop))
+||($B.gt(0,self.step)&& $B.ge(self.stop,self.$counter))){throw _b_.StopIteration.$factory("")}}
+return self.$counter}
+range.__reversed__=function(self){var n=$B.sub(range.__len__(self),1)
+return range.$factory($B.add(self.start,$B.mul(n,self.step)),$B.sub(self.start,self.step),$B.mul(-1,self.step))}
+range.__repr__=function(self){$B.builtins_repr_check(range,arguments)
+var res="range("+_b_.str.$factory(self.start)+", "+
+_b_.str.$factory(self.stop)
+if(self.step !=1){res+=", "+_b_.str.$factory(self.step)}
+return res+")"}
+range.__setattr__=function(self,attr,value){throw _b_.AttributeError.$factory("readonly attribute")}
+range.start=function(self){return self.start}
+range.step=function(self){return self.step},range.stop=function(self){return self.stop}
+range.count=function(self,ob){if(_b_.isinstance(ob,[_b_.int,_b_.float,_b_.bool])){return _b_.int.$factory(range.__contains__(self,ob))}else{var comp=function(other){return $B.rich_comp("__eq__",ob,other)},it=range.__iter__(self),_next=RangeIterator.__next__,nb=0
+while(true){try{if(comp(_next(it))){nb++}}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){return nb}
+throw err}}}}
+range.index=function(self,other){var $=$B.args("index",2,{self:null,other:null},["self","other"],arguments,{},null,null),self=$.self,other=$.other
+try{other=$B.int_or_bool(other)}catch(err){var comp=function(x){return $B.rich_comp("__eq__",other,x)},it=range.__iter__(self),_next=RangeIterator.__next__,nb=0
+while(true){try{if(comp(_next(it))){return nb}
+nb++}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){throw _b_.ValueError.$factory(_b_.str.$factory(other)+
+" not in range")}
+throw err}}}
+var sub=$B.sub(other,self.start),fl=$B.floordiv(sub,self.step),res=$B.mul(self.step,fl)
+if($B.eq(res,sub)){if(($B.gt(self.stop,self.start)&& $B.ge(other,self.start)
+&& $B.gt(self.stop,other))||
+($B.ge(self.start,self.stop)&& $B.ge(self.start,other)
+&& $B.gt(other,self.stop))){return fl}else{throw _b_.ValueError.$factory(_b_.str.$factory(other)+
+' not in range')}}else{throw _b_.ValueError.$factory(_b_.str.$factory(other)+
+" not in range")}}
+range.$factory=function(){var $=$B.args("range",3,{start:null,stop:null,step:null},["start","stop","step"],arguments,{start:null,stop:null,step:null},null,null),start=$.start,stop=$.stop,step=$.step,safe
+if(stop===null && step===null){if(start==null){throw _b_.TypeError.$factory("range expected 1 arguments, got 0")}
+stop=$B.PyNumber_Index(start)
+safe=typeof stop==="number"
+return{__class__:range,start:0,stop:stop,step:1,$is_range:true,$safe:safe}}
+if(step===null){step=1}
+start=$B.PyNumber_Index(start)
+stop=$B.PyNumber_Index(stop)
+step=$B.PyNumber_Index(step)
+if(step==0){throw _b_.ValueError.$factory("range arg 3 must not be zero")}
+safe=(typeof start=="number" && typeof stop=="number" &&
+typeof step=="number")
+return{__class__:range,start:start,stop:stop,step:step,$is_range:true,$safe:safe}}
+$B.set_func_names(range,"builtins")
+var slice={__class__:_b_.type,__mro__:[_b_.object],$infos:{__module__:"builtins",__name__:"slice"},$is_class:true,$native:true,$descriptors:{start:true,step:true,stop:true}}
+slice.__eq__=function(self,other){var conv1=conv_slice(self),conv2=conv_slice(other)
+return conv1[0]==conv2[0]&&
+conv1[1]==conv2[1]&&
+conv1[2]==conv2[2]}
+slice.__repr__=function(self){$B.builtins_repr_check(slice,arguments)
+return "slice("+_b_.str.$factory(self.start)+", "+
+_b_.str.$factory(self.stop)+", "+_b_.str.$factory(self.step)+")"}
+slice.__setattr__=function(self,attr,value){throw _b_.AttributeError.$factory("readonly attribute")}
+function conv_slice(self){var attrs=["start","stop","step"],res=[]
+for(var i=0;i < attrs.length;i++){var val=self[attrs[i]]
+if(val===_b_.None){res.push(val)}else{try{res.push($B.PyNumber_Index(val))}catch(err){throw _b_.TypeError.$factory("slice indices must be "+
+"integers or None or have an __index__ method")}}}
+return res}
+slice.$conv_for_seq=function(self,len){
+var step=self.step===None ? 1 :$B.PyNumber_Index(self.step),step_is_neg=$B.gt(0,step),len_1=$B.sub(len,1)
+if(step==0){throw _b_.ValueError.$factory('slice step cannot be zero')}
+var start
+if(self.start===None){start=step_is_neg ? len_1 :0}else{start=$B.PyNumber_Index(self.start)
+if($B.gt(0,start)){start=$B.add(start,len)
+if($B.gt(0,start)){start=0}}
+if($B.ge(start,len)){start=step < 0 ? len_1 :len}}
+if(self.stop===None){stop=step_is_neg ?-1 :len}else{stop=$B.PyNumber_Index(self.stop)
+if($B.gt(0,stop)){stop=$B.add(stop,len)}
+if($B.ge(stop,len)){stop=step_is_neg ? len_1 :len}}
+return{start:start,stop:stop,step:step}}
+slice.start=function(self){return self.start}
+slice.step=function(self){return self.step}
+slice.stop=function(self){return self.stop}
+slice.indices=function(self,length){
+var $=$B.args("indices",2,{self:null,length:null},["self","length"],arguments,{},null,null)
+var len=$B.$GetInt($.length)
+if(len < 0){_b_.ValueError.$factory("length should not be negative")}
+var _step=(self.step==_b_.None)? 1 :self.step
+if(_step < 0){var _start=self.start,_stop=self.stop
+_start=(_start==_b_.None)? len-1 :
+(_start < 0)? _b_.max(-1,_start+len):_b_.min(len-1,self.start)
+_stop=(self.stop==_b_.None)?-1 :
+(_stop < 0)? _b_.max(-1,_stop+len):_b_.min(len-1,self.stop)}else{var _start=(self.start==_b_.None)? 0 :_b_.min(len,self.start)
+var _stop=(self.stop==_b_.None)? len :_b_.min(len,self.stop)
+if(_start < 0){_start=_b_.max(0,_start+len)}
+if(_stop < 0){_stop=_b_.max(0,_stop+len)}}
+return _b_.tuple.$factory([_start,_stop,_step])}
+slice.$factory=function(){var $=$B.args("slice",3,{start:null,stop:null,step:null},["start","stop","step"],arguments,{stop:null,step:null},null,null),start,stop,step
+if($.stop===null && $.step===null){start=_b_.None
+stop=$.start
+step=_b_.None}else{start=$.start
+stop=$.stop
+step=$.step===null ? _b_.None :$.step}
+var res={__class__ :slice,start:start,stop:stop,step:step}
+conv_slice(res)
+return res}
+$B.set_func_names(slice,"builtins")
+_b_.range=range
+_b_.slice=slice})(__BRYTHON__)
+;
+;(function($B){var _b_=$B.builtins
+var from_unicode={},to_unicode={}
+$B.to_bytes=function(obj){var res
+if(_b_.isinstance(obj,[bytes,bytearray])){res=obj.source}else{var ga=$B.$getattr(obj,"tobytes",null)
+if(ga !==null){res=$B.$call(ga)().source}
+else{throw _b_.TypeError.$factory("object doesn't support the buffer protocol")}}
+return res}
+function _strip(self,cars,lr){if(cars===undefined){cars=[]
+var ws='\r\n \t'
+for(var i=0,len=ws.length;i < len;i++){cars.push(ws.charCodeAt(i))}}else if(_b_.isinstance(cars,bytes)){cars=cars.source}else{throw _b_.TypeError.$factory("Type str doesn't support the buffer API")}
+if(lr=='l'){for(var i=0,len=self.source.length;i < len;i++){if(cars.indexOf(self.source[i])==-1){break}}
+return bytes.$factory(self.source.slice(i))}
+for(var i=self.source.length-1;i >=0;i--){if(cars.indexOf(self.source[i])==-1){break}}
+return bytes.$factory(self.source.slice(0,i+1))}
+function invalid(other){return ! _b_.isinstance(other,[bytes,bytearray])}
+var bytearray={__class__:_b_.type,__mro__:[_b_.object],$buffer_protocol:true,$infos:{__module__:"builtins",__name__:"bytearray"},$is_class:true}
+var mutable_methods=["__delitem__","clear","copy","count","index","pop","remove","reverse","sort"]
+mutable_methods.forEach(function(method){bytearray[method]=(function(m){return function(self){var args=[self.source],pos=1
+for(var i=1,len=arguments.length;i < len;i++){args[pos++]=arguments[i]}
+return _b_.list[m].apply(null,args)}})(method)})
+bytearray.__hash__=_b_.None
+var bytearray_iterator=$B.make_iterator_class('bytearray_iterator')
+bytearray.__iter__=function(self){return bytearray_iterator.$factory(self.source)}
+bytearray.__mro__=[_b_.object]
+bytearray.__repr__=bytearray.__str__=function(self){return 'bytearray('+bytes.__repr__(self)+")"}
+bytearray.__setitem__=function(self,arg,value){if(_b_.isinstance(arg,_b_.int)){if(! _b_.isinstance(value,_b_.int)){throw _b_.TypeError.$factory('an integer is required')}else if(value > 255){throw _b_.ValueError.$factory("byte must be in range(0, 256)")}
+var pos=arg
+if(arg < 0){pos=self.source.length+pos}
+if(pos >=0 && pos < self.source.length){self.source[pos]=value}
+else{throw _b_.IndexError.$factory('list index out of range')}}else if(_b_.isinstance(arg,_b_.slice)){var start=arg.start===_b_.None ? 0 :arg.start
+var stop=arg.stop===_b_.None ? self.source.length :arg.stop
+if(start < 0){start=self.source.length+start}
+if(stop < 0){stop=self.source.length+stop}
+self.source.splice(start,stop-start)
+try{var $temp=_b_.list.$factory(value)
+for(var i=$temp.length-1;i >=0;i--){if(! _b_.isinstance($temp[i],_b_.int)){throw _b_.TypeError.$factory('an integer is required')}else if($temp[i]> 255){throw _b_.ValueError.$factory("byte must be in range(0, 256)")}
+self.source.splice(start,0,$temp[i])}}catch(err){throw _b_.TypeError.$factory("can only assign an iterable")}}else{throw _b_.TypeError.$factory('list indices must be integer, not '+
+$B.class_name(arg))}}
+bytearray.append=function(self,b){if(arguments.length !=2){throw _b_.TypeError.$factory(
+"append takes exactly one argument ("+(arguments.length-1)+
+" given)")}
+if(! _b_.isinstance(b,_b_.int)){throw _b_.TypeError.$factory("an integer is required")}
+if(b > 255){throw _b_.ValueError.$factory("byte must be in range(0, 256)")}
+self.source[self.source.length]=b}
+bytearray.extend=function(self,b){if(self.in_iteration){
+throw _b_.BufferError.$factory("Existing exports of data: object "+
+"cannot be re-sized")}
+if(b.__class__===bytearray ||b.__class__===bytes){b.source.forEach(function(item){self.source.push(item)})
+return _b_.None}
+var it=_b_.iter(b)
+while(true){try{bytearray.__add__(self,_b_.next(it))}catch(err){if(err===_b_.StopIteration){break}
+throw err}}
+return _b_.None}
+bytearray.insert=function(self,pos,b){if(arguments.length !=3){throw _b_.TypeError.$factory(
+"insert takes exactly 2 arguments ("+(arguments.length-1)+
+" given)")}
+if(! _b_.isinstance(b,_b_.int)){throw _b_.TypeError.$factory("an integer is required")}
+if(b > 255){throw _b_.ValueError.$factory("byte must be in range(0, 256)")}
+_b_.list.insert(self.source,pos,b)}
+bytearray.$factory=function(){var args=[bytearray]
+for(var i=0,len=arguments.length;i < len;i++){args.push(arguments[i])}
+return bytearray.__new__.apply(null,args)}
+var bytes={__class__ :_b_.type,__mro__:[_b_.object],$buffer_protocol:true,$infos:{__module__:"builtins",__name__:"bytes"},$is_class:true}
+bytes.__add__=function(self,other){if(_b_.isinstance(other,bytes)){return self.__class__.$factory(self.source.concat(other.source))}else if(_b_.isinstance(other,bytearray)){return self.__class__.$factory(bytes.__add__(self,bytes.$factory(other)))}else if(_b_.isinstance(other,_b_.memoryview)){return self.__class__.$factory(bytes.__add__(self,_b_.memoryview.tobytes(other)))}
+throw _b_.TypeError.$factory("can't concat bytes to "+
+_b_.str.$factory(other))}
+bytes.__contains__=function(self,other){if(typeof other=="number"){return self.source.indexOf(other)>-1}
+if(self.source.length < other.source.length){return false}
+var len=other.source.length
+for(var i=0;i < self.source.length-other.source.length+1;i++){var flag=true
+for(var j=0;j < len;j++){if(other.source[i+j]!=self.source[j]){flag=false
+break}}
+if(flag){return true}}
+return false}
+var bytes_iterator=$B.make_iterator_class("bytes_iterator")
+bytes.__iter__=function(self){return bytes_iterator.$factory(self.source)}
+bytes.__eq__=function(self,other){if(invalid(other)){return false}
+return $B.$getattr(self.source,'__eq__')(other.source)}
+bytes.__ge__=function(self,other){if(invalid(other)){return _b_.NotImplemented}
+return _b_.list.__ge__(self.source,other.source)}
+bytes.__getitem__=function(self,arg){var i
+if(_b_.isinstance(arg,_b_.int)){var pos=arg
+if(arg < 0){pos=self.source.length+pos}
+if(pos >=0 && pos < self.source.length){return self.source[pos]}
+throw _b_.IndexError.$factory("index out of range")}else if(_b_.isinstance(arg,_b_.slice)){var s=_b_.slice.$conv_for_seq(arg,self.source.length),start=s.start,stop=s.stop,step=s.step
+var res=[],i=null,pos=0
+if(step > 0){stop=Math.min(stop,self.source.length)
+if(stop <=start){return bytes.$factory([])}
+for(var i=start;i < stop;i+=step){res[pos++]=self.source[i]}}else{if(stop >=start){return bytes.$factory([])}
+stop=Math.max(0,stop)
+for(var i=start;i >=stop;i+=step){res[pos++]=self.source[i]}}
+return bytes.$factory(res)}else if(_b_.isinstance(arg,_b_.bool)){return self.source.__getitem__(_b_.int.$factory(arg))}}
+bytes.__gt__=function(self,other){if(invalid(other)){return _b_.NotImplemented}
+return _b_.list.__gt__(self.source,other.source)}
+bytes.__hash__=function(self){if(self===undefined){return bytes.__hashvalue__ ||$B.$py_next_hash--}
+var hash=1
+for(var i=0,len=self.source.length;i < len;i++){hash=(101*hash+self.source[i])& 0xFFFFFFFF}
+return hash}
+bytes.__init__=function(){return _b_.None}
+bytes.__le__=function(self,other){if(invalid(other)){return _b_.NotImplemented}
+return _b_.list.__le__(self.source,other.source)}
+bytes.__len__=function(self){return self.source.length}
+bytes.__lt__=function(self,other){if(invalid(other)){return _b_.NotImplemented}
+return _b_.list.__lt__(self.source,other.source)}
+bytes.__mod__=function(self,args){
+var s=decode(self,"ascii","strict"),res=_b_.str.__mod__(s,args)
+return _b_.str.encode(res,"ascii")}
+bytes.__mul__=function(){var $=$B.args('__mul__',2,{self:null,other:null},['self','other'],arguments,{},null,null),other=$B.PyNumber_Index($.other)
+var t=[],source=$.self.source,slen=source.length
+for(var i=0;i < other;i++){for(var j=0;j < slen;j++){t.push(source[j])}}
+var res=bytes.$factory()
+res.source=t
+return res}
+bytes.__ne__=function(self,other){return ! bytes.__eq__(self,other)}
+bytes.__new__=function(cls,source,encoding,errors){var $=$B.args("__new__",4,{cls:null,source:null,encoding:null,errors:null},["cls","source","encoding","errors"],arguments,{source:[],encoding:"utf-8",errors:"strict"},null,null)
+return bytes.$new($.cls,$.source,$.encoding,$.errors)}
+bytes.$new=function(cls,source,encoding,errors){
+var self={__class__:cls},int_list=[],pos=0
+if(source===undefined){}else if(typeof source=="number" ||_b_.isinstance(source,_b_.int)){var i=source
+while(i--){int_list[pos++]=0}}else{if(typeof source=="string" ||_b_.isinstance(source,_b_.str)){if(encoding===undefined){throw _b_.TypeError.$factory("string argument without an encoding")}
+int_list=encode(source,encoding ||"utf-8",errors ||"strict")}else{
+int_list=_b_.list.$factory(source)
+for(var i=0;i < int_list.length;i++){try{var item=_b_.int.$factory(int_list[i])}catch(err){throw _b_.TypeError.$factory("'"+
+$B.class_name(int_list[i])+"' object "+
+"cannot be interpreted as an integer")}
+if(item < 0 ||item > 255){throw _b_.ValueError.$factory("bytes must be in range"+
+"(0, 256)")}}}}
+self.source=int_list
+self.encoding=encoding
+self.errors=errors
+return self}
+bytes.__repr__=bytes.__str__=function(self){var t=$B.special_string_repr,
+res=""
+for(var i=0,len=self.source.length;i < len;i++){var s=self.source[i]
+if(t[s]!==undefined){res+=t[s]}else if(s < 32 ||s >=128){var hx=s.toString(16)
+hx=(hx.length==1 ? '0' :'')+hx
+res+='\\x'+hx}else if(s=="\\".charCodeAt(0)){res+="\\\\"}else{res+=String.fromCharCode(s)}}
+if(res.indexOf("'")>-1 && res.indexOf('"')==-1){return 'b"'+res+'"'}else{return "b'"+res.replace(new RegExp("'","g"),"\\'")+"'"}}
+bytes.__reduce_ex__=function(self){return bytes.__repr__(self)}
+bytes.capitalize=function(self){var src=self.source,len=src.length,buffer=src.slice()
+if(buffer[0]> 96 && buffer[0]< 123){buffer[0]-=32}
+for(var i=1;i < len;++i){if(buffer[i]> 64 && buffer[i]< 91){buffer[i]+=32}}
+return bytes.$factory(buffer)}
+bytes.center=function(){var $=$B.args('center',3,{self:null,width:null,fillbyte:null},['self','width','fillbyte'],arguments,{fillbyte:bytes.$factory([32])},null,null)
+var diff=$.width-$.self.source.length
+if(diff <=0){return bytes.$factory($.self.source)}
+var ljust=bytes.ljust($.self,$.self.source.length+Math.floor(diff/2),$.fillbyte)
+return bytes.rjust(ljust,$.width,$.fillbyte)}
+bytes.count=function(){var $=$B.args('count',4,{self:null,sub:null,start:null,end:null},['self','sub','start','end'],arguments,{start:0,end:-1},null,null)
+var n=0,index=-1,len=0
+if(typeof $.sub=="number"){if($.sub < 0 ||$.sub > 255)
+throw _b_.ValueError.$factory("byte must be in range(0, 256)")
+len=1}else if(!$.sub.__class__){throw _b_.TypeError.$factory("first argument must be a bytes-like "+
+"object, not '"+$B.class_name($.sub)+"'")}else if(!$.sub.__class__.$buffer_protocol){throw _b_.TypeError.$factory("first argument must be a bytes-like "+
+"object, not '"+$B.class_name($.sub)+"'")}else{len=$.sub.source.length}
+do{index=bytes.find($.self,$.sub,Math.max(index+len,$.start),$.end)
+if(index !=-1){n++}}while(index !=-1)
+return n}
+bytes.decode=function(self,encoding,errors){var $=$B.args("decode",3,{self:null,encoding:null,errors:null},["self","encoding","errors"],arguments,{encoding:"utf-8",errors:"strict"},null,null)
+switch($.errors){case 'strict':
+case 'ignore':
+case 'replace':
+case 'surrogateescape':
+case 'surrogatepass':
+case 'xmlcharrefreplace':
+case 'backslashreplace':
+return decode($.self,$.encoding,$.errors)
+default:}}
+bytes.endswith=function(){var $=$B.args('endswith',4,{self:null,suffix:null,start:null,end:null},['self','suffix','start','end'],arguments,{start:-1,end:-1},null,null)
+if(_b_.isinstance($.suffix,bytes)){var start=$.start==-1 ?
+$.self.source.length-$.suffix.source.length :
+Math.min($.self.source.length-$.suffix.source.length,$.start)
+var end=$.end==-1 ?
+($.start==-1 ? $.self.source.length :start+$.suffix.source.length):
+Math.min($.self.source.length-1,$.end)
+var res=true
+for(var i=$.suffix.source.length-1,len=$.suffix.source.length;
+i >=0 && res;--i){res=$.self.source[end-len+i]==$.suffix.source[i]}
+return res}else if(_b_.isinstance($.suffix,_b_.tuple)){for(var i=0;i < $.suffix.length;++i){if(_b_.isinstance($.suffix[i],bytes)){if(bytes.endswith($.self,$.suffix[i],$.start,$.end)){return true}}else{throw _b_.TypeError.$factory("endswith first arg must be "+
+"bytes or a tuple of bytes, not "+
+$B.class_name($.suffix))}}
+return false}else{throw _b_.TypeError.$factory("endswith first arg must be bytes "+
+"or a tuple of bytes, not "+$B.class_name($.suffix))}}
+bytes.expandtabs=function(){var $=$B.args('expandtabs',2,{self:null,tabsize:null},['self','tabsize'],arguments,{tabsize:8},null,null)
+var tab_spaces=[]
+for(let i=0;i < $.tabsize;++i){tab_spaces.push(32)}
+var buffer=$.self.source.slice()
+for(let i=0;i < buffer.length;++i){if(buffer[i]===9){buffer.splice.apply(buffer,[i,1].concat(tab_spaces))}}
+return _b_.bytes.$factory(buffer)}
+bytes.find=function(self,sub){if(arguments.length !=2){var $=$B.args('find',4,{self:null,sub:null,start:null,end:null},['self','sub','start','end'],arguments,{start:0,end:-1},null,null),sub=$.sub,start=$.start,end=$.end}else{var start=0,end=-1}
+if(typeof sub=="number"){if(sub < 0 ||sub > 255){throw _b_.ValueError.$factory("byte must be in range(0, 256)")}
+return self.source.slice(0,end==-1 ? undefined :end).indexOf(sub,start)}else if(! sub.__class__){throw _b_.TypeError.$factory("first argument must be a bytes-like "+
+"object, not '"+$B.class_name(sub)+"'")}else if(! sub.__class__.$buffer_protocol){throw _b_.TypeError.$factory("first argument must be a bytes-like "+
+"object, not '"+$B.class_name(sub)+"'")}
+end=end==-1 ? self.source.length :Math.min(self.source.length,end)
+var len=sub.source.length
+for(var i=start;i <=end-len;i++){var chunk=self.source.slice(i,i+len),found=true
+for(var j=0;j < len;j++){if(chunk[j]!=sub.source[j]){found=false
+break}}
+if(found){return i}}
+return-1}
+bytes.fromhex=function(){var $=$B.args('fromhex',2,{cls:null,string:null},['cls','string'],arguments,{},null,null),string=$.string.replace(/\s/g,''),source=[]
+for(var i=0;i < string.length;i+=2){if(i+2 > string.length){throw _b_.ValueError.$factory("non-hexadecimal number found "+
+"in fromhex() arg")}
+source.push(_b_.int.$factory(string.substr(i,2),16))}
+return $.cls.$factory(source)}
+bytes.hex=function(){
+var $=$B.args('hex',3,{self:null,sep:null,bytes_per_sep:null},['self','sep','bytes_per_sep'],arguments,{sep:"",bytes_per_sep:1},null,null),self=$.self,sep=$.sep,bytes_per_sep=$.bytes_per_sep,res="",digits="0123456789abcdef",bps=bytes_per_sep,jstart=bps,len=self.source.length;
+if(bytes_per_sep < 0){bps=-bytes_per_sep;
+jstart=bps}else if(bytes_per_sep==0){sep=''}else{jstart=len % bps
+if(jstart==0){jstart=bps}}
+for(var i=0,j=jstart;i < len;i++){var c=self.source[i]
+if(j==0){res+=sep
+j=bps}
+j--
+res+=digits[c >> 4]
+res+=digits[c & 0x0f]}
+return res}
+bytes.index=function(){var $=$B.args('rfind',4,{self:null,sub:null,start:null,end:null},['self','sub','start','end'],arguments,{start:0,end:-1},null,null)
+var index=bytes.find($.self,$.sub,$.start,$.end)
+if(index==-1){throw _b_.ValueError.$factory("subsection not found")}
+return index}
+bytes.isalnum=function(self){var src=self.source,len=src.length,res=len > 0
+for(var i=0;i < len && res;++i){res=(src[i]> 96 && src[i]< 123)||
+(src[i]> 64 && src[i]< 91)||
+(src[i]> 47 && src[i]< 58)}
+return res}
+bytes.isalpha=function(self){var src=self.source,len=src.length,res=len > 0
+for(var i=0;i < len && res;++i){res=(src[i]> 96 && src[i]< 123)||(src[i]> 64 && src[i]< 91)}
+return res}
+bytes.isdigit=function(self){var src=self.source,len=src.length,res=len > 0
+for(let i=0;i < len && res;++i){res=src[i]> 47 && src[i]< 58}
+return res}
+bytes.islower=function(self){var src=self.source,len=src.length,res=false
+for(let i=0;i < len;++i){
+res=res ||(src[i]> 96 && src[i]< 123)
+if(src[i]> 64 && src[i]< 91){return false}}
+return res}
+bytes.isspace=function(self){var src=self.source,len=src.length
+for(let i=0;i < len;++i){switch(src[i]){case 9:
+case 10:
+case 11:
+case 12:
+case 13:
+case 32:
+break
+default:
+return false}}
+return true}
+bytes.isupper=function(self){var src=self.source,len=src.length,res=false
+for(let i=0;i < len;++i){
+res=res ||(src[i]> 64 && src[i]< 91)
+if(src[i]> 96 && src[i]< 123){return false}}
+return res}
+bytes.istitle=function(self){var src=self.source,len=src.length,current_char_is_letter=false,prev_char_was_letter=false,is_uppercase=false,is_lowercase=false
+for(var i=0;i < len;++i){is_lowercase=src[i]> 96 && src[i]< 123
+is_uppercase=src[i]> 64 && src[i]< 91
+current_char_is_letter=is_lowercase ||is_uppercase
+if(current_char_is_letter &&
+(prev_char_was_letter && is_uppercase)||
+(! prev_char_was_letter && is_lowercase)){return false}
+prev_char_was_letter=current_char_is_letter}
+return true}
+bytes.join=function(){var $ns=$B.args('join',2,{self:null,iterable:null},['self','iterable'],arguments,{}),self=$ns['self'],iterable=$ns['iterable']
+var next_func=$B.$getattr(_b_.iter(iterable),'__next__'),res=self.__class__.$factory(),empty=true
+while(true){try{var item=next_func()
+if(empty){empty=false}
+else{res=bytes.__add__(res,self)}
+res=bytes.__add__(res,item)}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
+throw err}}
+return res}
+var _lower=function(char_code){if(char_code >=65 && char_code <=90){return char_code+32}else{return char_code}}
+bytes.lower=function(self){var _res=[],pos=0
+for(var i=0,len=self.source.length;i < len;i++){if(self.source[i]){_res[pos++]=_lower(self.source[i])}}
+return bytes.$factory(_res)}
+bytes.ljust=function(){var $=$B.args('ljust',3,{self:null,width:null,fillbyte:null},['self','width','fillbyte'],arguments,{fillbyte:bytes.$factory([32])},null,null)
+if(!$.fillbyte.__class__){throw _b_.TypeError.$factory("argument 2 must be a byte string of length 1, "+
+"not '"+$B.class_name($.fillbyte)+"'")}else if(!$.fillbyte.__class__.$buffer_protocol){throw _b_.TypeError.$factory("argument 2 must be a byte string of length 1, "+
+"not '"+$B.class_name($.fillbyte)+"'")}
+var padding=[],count=$.width-$.self.source.length
+for(var i=0;i < count;++i){padding.push($.fillbyte.source[0])}
+return bytes.$factory($.self.source.concat(padding))}
+bytes.lstrip=function(self,cars){return _strip(self,cars,'l')}
+bytes.maketrans=function(from,to){var _t=[],to=$B.to_bytes(to)
+for(var i=0;i < 256;i++){_t[i]=i}
+for(var i=0,len=from.source.length;i < len;i++){var _ndx=from.source[i]
+_t[_ndx]=to[i]}
+return bytes.$factory(_t)}
+bytes.partition=function(){var $=$B.args('partition',2,{self:null,sep:null},['self','sep'],arguments,{},null,null)
+if(! $.sep.__class__){throw _b_.TypeError.$factory("a bytes-like object is required, "+
+"not '"+$B.class_name($.sep)+"'")}else if(! $.sep.__class__.$buffer_protocol){throw _b_.TypeError.$factory("a bytes-like object is required, "+
+"not '"+$B.class_name($.sep)+"'")}
+var len=$.sep.source.length,src=$.self.source,i=bytes.find($.self,$.sep)
+return _b_.tuple.$factory([bytes.$factory(src.slice(0,i)),bytes.$factory(src.slice(i,i+len)),bytes.$factory(src.slice(i+len))
+])}
+bytes.removeprefix=function(){var $=$B.args("removeprefix",2,{self:null,prefix:null},["self","prefix"],arguments,{},null,null)
+if(!_b_.isinstance($.prefix,[bytes,bytearray])){throw _b_.ValueError.$factory("prefix should be bytes, not "+
+`'${$B.class_name($.prefix)}'`)}
+if(bytes.startswith($.self,$.prefix)){return bytes.__getitem__($.self,_b_.slice.$factory($.prefix.source.length,_b_.None))}
+return bytes.__getitem__($.self,_b_.slice.$factory(0,_b_.None))}
+bytes.removesuffix=function(){var $=$B.args("removesuffix",2,{self:null,prefix:null},["self","suffix"],arguments,{},null,null)
+if(!_b_.isinstance($.suffix,[bytes,bytearray])){throw _b_.ValueError.$factory("suffix should be bytes, not "+
+`'${$B.class_name($.suffix)}'`)}
+if(bytes.endswith($.self,$.suffix)){return bytes.__getitem__($.self,_b_.slice.$factory(0,$.suffix.source.length+1))}
+return bytes.__getitem__($.self,_b_.slice.$factory(0,_b_.None))}
+bytes.replace=function(){var $=$B.args('replace',4,{self:null,old:null,new:null,count:null},['self','old','new','count'],arguments,{count:-1},null,null),res=[]
+var self=$.self,src=self.source,len=src.length,old=$.old,$new=$.new
+var count=$.count >=0 ? $.count :src.length
+if(! $.old.__class__){throw _b_.TypeError.$factory("first argument must be a bytes-like "+
+"object, not '"+$B.class_name($.old)+"'")}else if(! $.old.__class__.$buffer_protocol){throw _b_.TypeError.$factory("first argument must be a bytes-like "+
+"object, not '"+$B.class_name($.sep)+"'")}
+if(! $.new.__class__){throw _b_.TypeError.$factory("second argument must be a bytes-like "+
+"object, not '"+$B.class_name($.old)+"'")}else if(! $.new.__class__.$buffer_protocol){throw _b_.TypeError.$factory("second argument must be a bytes-like "+
+"object, not '"+$B.class_name($.sep)+"'")}
+for(var i=0;i < len;i++){if(bytes.startswith(self,old,i)&& count){for(var j=0;j < $new.source.length;j++){res.push($new.source[j])}
+i+=(old.source.length-1)
+count--}else{res.push(src[i])}}
+return bytes.$factory(res)}
+bytes.rfind=function(self,subbytes){if(arguments.length==2 && subbytes.__class__===bytes){var sub=subbytes,start=0,end=-1}else{var $=$B.args('rfind',4,{self:null,sub:null,start:null,end:null},['self','sub','start','end'],arguments,{start:0,end:-1},null,null),self=$.self,sub=$.sub,start=$.start,end=$.end}
+if(typeof sub=="number"){if(sub < 0 ||sub > 255){throw _b_.ValueError.$factory("byte must be in range(0, 256)")}
+return $.self.source.slice(start,$.end==-1 ? undefined :$.end).
+lastIndexOf(sub)+start}else if(! sub.__class__){throw _b_.TypeError.$factory("first argument must be a bytes-like "+
+"object, not '"+$B.class_name($.sub)+"'")}else if(! sub.__class__.$buffer_protocol){throw _b_.TypeError.$factory("first argument must be a bytes-like "+
+"object, not '"+$B.class_name(sub)+"'")}
+end=end==-1 ? self.source.length :Math.min(self.source.length,end)
+var len=sub.source.length
+for(var i=end-len;i >=start;--i){var chunk=self.source.slice(i,i+len),found=true
+for(var j=0;j < len;j++){if(chunk[j]!=sub.source[j]){found=false
+break}}
+if(found){return i}}
+return-1}
+bytes.rindex=function(){var $=$B.args('rfind',4,{self:null,sub:null,start:null,end:null},['self','sub','start','end'],arguments,{start:0,end:-1},null,null)
+var index=bytes.rfind($.self,$.sub,$.start,$.end)
+if(index==-1){throw _b_.ValueError.$factory("subsection not found")}
+return index}
+bytes.rjust=function(){var $=$B.args('rjust',3,{self:null,width:null,fillbyte:null},['self','width','fillbyte'],arguments,{fillbyte:bytes.$factory([32])},null,null)
+if(!$.fillbyte.__class__){throw _b_.TypeError.$factory("argument 2 must be a byte string of length 1, "+
+"not '"+$B.class_name($.fillbyte)+"'")}else if(!$.fillbyte.__class__.$buffer_protocol){throw _b_.TypeError.$factory("argument 2 must be a byte string of length 1, "+
+"not '"+$B.class_name($.fillbyte)+"'")}
+var padding=[],count=$.width-$.self.source.length
+for(var i=0;i < count;++i){padding.push($.fillbyte.source[0])}
+return bytes.$factory(padding.concat($.self.source))}
+bytes.rpartition=function(){var $=$B.args('rpartition',2,{self:null,sep:null},['self','sep'],arguments,{},null,null)
+if(!$.sep.__class__){throw _b_.TypeError.$factory("a bytes-like object is required, "+
+"not '"+$B.class_name($.sep)+"'")}else if(!$.sep.__class__.$buffer_protocol){throw _b_.TypeError.$factory("a bytes-like object is required, "+
+"not '"+$B.class_name($.sep)+"'")}
+var len=$.sep.source.length,src=$.self.source,i=bytes.rfind($.self,$.sep)
+return _b_.tuple.$factory([bytes.$factory(src.slice(0,i)),bytes.$factory(src.slice(i,i+len)),bytes.$factory(src.slice(i+len))
+])}
+bytes.rstrip=function(self,cars){return _strip(self,cars,'r')}
+bytes.split=function(){var $=$B.args('split',2,{self:null,sep:null},['self','sep'],arguments,{sep:bytes.$factory([32])},null,null),res=[],start=0,stop=0
+if(! $.sep.__class__ ){throw _b_.TypeError.$factory("a bytes-like object is required, "+
+"not '"+$B.class_name($.sep)+"'")}else if(! $.sep.__class__.$buffer_protocol){throw _b_.TypeError.$factory("a bytes-like object is required, "+
+"not '"+$B.class_name($.sep)+"'")}
+var seps=$.sep.source,len=seps.length,src=$.self.source,blen=src.length
+while(stop < blen){var match=true
+for(var i=0;i < len && match;i++){if(src[stop+i]!=seps[i]){match=false}}
+if(match){res.push(bytes.$factory(src.slice(start,stop)))
+start=stop+len
+stop=start}else{stop++}}
+if(match ||(stop > start)){res.push(bytes.$factory(src.slice(start,stop)))}
+return res}
+bytes.splitlines=function(self){var $=$B.args('splitlines',2,{self:null,keepends:null},['self','keepends'],arguments,{keepends:false},null,null)
+if(!_b_.isinstance($.keepends,[_b_.bool,_b_.int])){throw _b_.TypeError('integer argument expected, got '+
+$B.get_class($.keepends).__name)}
+var keepends=_b_.int.$factory($.keepends),res=[],source=$.self.source,start=0,pos=0
+if(! source.length){return res}
+while(pos < source.length){if(pos < source.length-1 && source[pos]==0x0d &&
+source[pos+1]==0x0a){res.push(bytes.$factory(source.slice(start,keepends ? pos+2 :pos)))
+start=pos=pos+2}else if(source[pos]==0x0d ||source[pos]==0x0a){res.push(bytes.$factory(source.slice(start,keepends ? pos+1 :pos)))
+start=pos=pos+1}else{pos++}}
+if(start < source.length){res.push(bytes.$factory(source.slice(start)))}
+return res}
+bytes.startswith=function(){var $=$B.args('startswith',3,{self:null,prefix:null,start:null},['self','prefix','start'],arguments,{start:0},null,null),start=$.start
+if(_b_.isinstance($.prefix,bytes)){var res=true
+for(var i=0;i < $.prefix.source.length && res;i++){res=$.self.source[start+i]==$.prefix.source[i]}
+return res}else if(_b_.isinstance($.prefix,_b_.tuple)){var items=[]
+for(var i=0;i < $.prefix.length;i++){if(_b_.isinstance($.prefix[i],bytes)){items=items.concat($.prefix[i].source)}else{throw _b_.TypeError.$factory("startswith first arg must be "+
+"bytes or a tuple of bytes, not "+
+$B.class_name($.prefix))}}
+var prefix=bytes.$factory(items)
+return bytes.startswith($.self,prefix,start)}else{throw _b_.TypeError.$factory("startswith first arg must be bytes "+
+"or a tuple of bytes, not "+$B.class_name($.prefix))}}
+bytes.strip=function(self,cars){var res=bytes.lstrip(self,cars)
+return bytes.rstrip(res,cars)}
+bytes.swapcase=function(self){var src=self.source,len=src.length,buffer=src.slice()
+for(var i=0;i < len;++i){if(buffer[i]> 96 && buffer[i]< 123){buffer[i]-=32}else if(buffer[i]> 64 && buffer[i]< 91){buffer[i]+=32}}
+return bytes.$factory(buffer)}
+bytes.title=function(self){var src=self.source,len=src.length
+buffer=src.slice(),current_char_is_letter=false,prev_char_was_letter=false,is_uppercase=false,is_lowercase=false
+for(var i=0;i < len;++i){is_lowercase=buffer[i]> 96 && buffer[i]< 123
+is_uppercase=buffer[i]> 64 && buffer[i]< 91
+current_char_is_letter=is_lowercase ||is_uppercase
+if(current_char_is_letter){if(prev_char_was_letter && is_uppercase){buffer[i]+=32}else if(! prev_char_was_letter && is_lowercase){buffer[i]-=32}}
+prev_char_was_letter=current_char_is_letter}
+return bytes.$factory(buffer)}
+bytes.translate=function(self,table,_delete){if(_delete===undefined){_delete=[]}else if(_b_.isinstance(_delete,bytes)){_delete=_delete.source}else{throw _b_.TypeError.$factory("Type "+
+$B.get_class(_delete).__name+" doesn't support the buffer API")}
+var res=[],pos=0
+if(_b_.isinstance(table,bytes)&& table.source.length==256){for(var i=0,len=self.source.length;i < len;i++){if(_delete.indexOf(self.source[i])>-1){continue}
+res[pos++]=table.source[self.source[i]]}}
+return bytes.$factory(res)}
+var _upper=function(char_code){if(char_code >=97 && char_code <=122){return char_code-32}else{return char_code}}
+bytes.upper=function(self){var _res=[],pos=0
+for(var i=0,len=self.source.length;i < len;i++){if(self.source[i]){_res[pos++]=_upper(self.source[i])}}
+return bytes.$factory(_res)}
+bytes.zfill=function(self,width){var buffer=self.source.slice(),prefix_offset=(buffer[0]==43 ||buffer[0]==45)? 1 :0
+var count=width-self.source.length
+var padding=[]
+for(var i=0;i < count;++i){padding.push(48)}
+buffer.splice.apply(buffer,[prefix_offset,0].concat(padding))
+return bytes.$factory(buffer)}
+function $UnicodeEncodeError(encoding,code_point,position){throw _b_.UnicodeEncodeError.$factory("'"+encoding+
+"' codec can't encode character "+_b_.hex(code_point)+
+" in position "+position)}
+function $UnicodeDecodeError(encoding,position){throw _b_.UnicodeDecodeError.$factory("'"+encoding+
+"' codec can't decode bytes in position "+position)}
+function _hex(_int){return _int.toString(16)}
+function _int(hex){return parseInt(hex,16)}
+function normalise(encoding){var enc=encoding.toLowerCase()
+if(enc.substr(0,7)=="windows"){enc="cp"+enc.substr(7)}
+if(enc.startsWith("cp-")||enc.startsWith("iso-")){enc=enc.replace("-","")}
+enc=enc.replace(/-/g,"_")
+return enc}
+function load_decoder(enc){
+if(to_unicode[enc]===undefined){var mod=_b_.__import__("encodings."+enc)
+if(mod[enc].getregentry){to_unicode[enc]=$B.$getattr(mod[enc].getregentry(),"decode")}}}
+function load_encoder(enc){
+if(from_unicode[enc]===undefined){var mod=_b_.__import__("encodings."+enc)
+if(mod[enc].getregentry){from_unicode[enc]=$B.$getattr(mod[enc].getregentry(),"encode")}}}
+var decode=$B.decode=function(obj,encoding,errors){var s="",b=obj.source,enc=normalise(encoding)
+switch(enc){case "utf_8":
+case "utf-8":
+case "utf8":
+case "U8":
+case "UTF":
+var pos=0,s="",err_info
+while(pos < b.length){var byte=b[pos]
+err_info=null
+if(!(byte & 0x80)){
+s+=String.fromCodePoint(byte)
+pos++}else if((byte >> 5)==6){
+if(b[pos+1]===undefined){err_info=[byte,pos,"end"]}else if((b[pos+1]& 0xc0)!=0x80){err_info=[byte,pos,"continuation"]}
+if(err_info !==null){if(errors=="ignore"){pos++}else{throw _b_.UnicodeDecodeError.$factory(
+"'utf-8' codec can't decode byte 0x"+
+err_info[0].toString(16)+" in position "+
+err_info[1]+
+(err_info[2]=="end" ? ": unexpected end of data" :
+": invalid continuation byte"))}}else{var cp=byte & 0x1f
+cp <<=6
+cp+=b[pos+1]& 0x3f
+s+=String.fromCodePoint(cp)
+pos+=2}}else if((byte >> 4)==14){
+if(b[pos+1]===undefined){err_info=[byte,pos,"end",pos+1]}else if((b[pos+1]& 0xc0)!=0x80){err_info=[byte,pos,"continuation",pos+2]}else if(b[pos+2]===undefined){err_info=[byte,pos+'-'+(pos+1),"end",pos+2]}else if((b[pos+2]& 0xc0)!=0x80){err_info=[byte,pos,"continuation",pos+3]}
+if(err_info !==null){if(errors=="ignore"){pos=err_info[3]}else if(errors=="surrogateescape"){for(var i=pos;i < err_info[3];i++){s+=String.fromCodePoint(0xdc80+b[i]-0x80)}
+pos=err_info[3]}else{throw _b_.UnicodeDecodeError.$factory(
+"'utf-8' codec can't decode byte 0x"+
+err_info[0].toString(16)+" in position "+
+err_info[1]+
+(err_info[2]=="end" ? ": unexpected end of data" :
+": invalid continuation byte"))}}else{var cp=byte & 0xf
+cp=cp << 12
+cp+=(b[pos+1]& 0x3f)<< 6
+cp+=b[pos+2]& 0x3f
+s+=String.fromCodePoint(cp)
+pos+=3}}else if((byte >> 3)==30){
+if(b[pos+1]===undefined){err_info=[byte,pos,"end",pos+1]}else if((b[pos+1]& 0xc0)!=0x80){err_info=[byte,pos,"continuation",pos+2]}else if(b[pos+2]===undefined){err_info=[byte,pos+'-'+(pos+1),"end",pos+2]}else if((b[pos+2]& 0xc0)!=0x80){err_info=[byte,pos,"continuation",pos+3]}else if(b[pos+3]===undefined){err_info=[byte,pos+'-'+(pos+1)+'-'+(pos+2),"end",pos+3]}else if((b[pos+2]& 0xc0)!=0x80){err_info=[byte,pos,"continuation",pos+3]}
+if(err_info !==null){if(errors=="ignore"){pos=err_info[3]}else if(errors=="surrogateescape"){for(var i=pos;i < err_info[3];i++){s+=String.fromCodePoint(0xdc80+b[i]-0x80)}
+pos=err_info[3]}else{throw _b_.UnicodeDecodeError.$factory(
+"'utf-8' codec can't decode byte 0x"+
+err_info[0].toString(16)+" in position "+
+err_info[1]+
+(err_info[2]=="end" ? ": unexpected end of data" :
+": invalid continuation byte"))}}else{var cp=byte & 0xf
+cp=cp << 18
+cp+=(b[pos+1]& 0x3f)<< 12
+cp+=(b[pos+2]& 0x3f)<< 6
+cp+=(b[pos+3]& 0x3f)
+s+=String.fromCodePoint(cp)
+pos+=4}}else{if(errors=="ignore"){pos++}else if(errors=="surrogateescape"){s+=String.fromCodePoint(0xdc80+b[pos]-0x80)
+pos++}else{throw _b_.UnicodeDecodeError.$factory(
+"'utf-8' codec can't decode byte 0x"+
+byte.toString(16)+" in position "+pos+
+": invalid start byte")}}}
+return s
+case "latin_1":
+case "windows1252":
+case "iso-8859-1":
+case "iso8859-1":
+case "8859":
+case "cp819":
+case "latin":
+case "latin1":
+case "L1":
+b.forEach(function(item){s+=String.fromCharCode(item)})
+break
+case "unicode_escape":
+if(obj.__class__===bytes ||obj.__class__===bytearray){obj=decode(obj,"latin-1","strict")}
+return obj.replace(/\\n/g,"\n").
+replace(/\\a/g,"\u0007").
+replace(/\\b/g,"\b").
+replace(/\\f/g,"\f").
+replace(/\\t/g,"\t").
+replace(/\\'/g,"'").
+replace(/\\"/g,'"')
+case "raw_unicode_escape":
+if(obj.__class__===bytes ||obj.__class__===bytearray){obj=decode(obj,"latin-1","strict")}
+return obj.replace(/\\u([a-fA-F0-9]{4})/g,function(mo){var cp=parseInt(mo.substr(2),16)
+return String.fromCharCode(cp)})
+case "ascii":
+for(var i=0,len=b.length;i < len;i++){var cp=b[i]
+if(cp <=127){s+=String.fromCharCode(cp)}else{if(errors=="ignore"){}else{var msg="'ascii' codec can't decode byte 0x"+
+cp.toString(16)+" in position "+i+
+": ordinal not in range(128)"
+throw _b_.UnicodeDecodeError.$factory(msg)}}}
+break
+default:
+try{load_decoder(enc)}catch(err){console.log(b,encoding,"error load_decoder",err)
+throw _b_.LookupError.$factory("unknown encoding: "+enc)}
+return to_unicode[enc](obj)[0]}
+return s}
+var encode=$B.encode=function(){var $=$B.args("encode",3,{s:null,encoding:null,errors:null},["s","encoding","errors"],arguments,{encoding:"utf-8",errors:"strict"},null,null),s=$.s,encoding=$.encoding,errors=$.errors
+var t=[],pos=0,enc=normalise(encoding)
+switch(enc){case "utf-8":
+case "utf_8":
+case "utf8":
+var res=[]
+for(var i=0,len=s.length;i < len;i++){var cp=s.charCodeAt(i)
+if(cp < 0x7f){res.push(cp)}else if(cp < 0x7ff){res.push(0xc0+(cp >> 6),0x80+(cp & 0x3f))}else if(cp < 0xffff){res.push(0xe0+(cp >> 12),0x80+((cp & 0xfff)>> 6),0x80+(cp & 0x3f))}else{console.log("4 bytes")}}
+return res
+case "latin":
+case "latin1":
+case "latin-1":
+case "latin_1":
+case "L1":
+case "iso8859_1":
+case "iso_8859_1":
+case "8859":
+case "cp819":
+case "windows1252":
+for(var i=0,len=s.length;i < len;i++){var cp=s.charCodeAt(i)
+if(cp <=255){t[pos++]=cp}
+else if(errors !="ignore"){$UnicodeEncodeError(encoding,i)}}
+break
+case "ascii":
+for(var i=0,len=s.length;i < len;i++){var cp=s.charCodeAt(i)
+if(cp <=127){t[pos++]=cp}
+else if(errors !="ignore"){$UnicodeEncodeError(encoding,i)}}
+break
+case "raw_unicode_escape":
+for(var i=0,len=s.length;i < len;i++){var cp=s.charCodeAt(i)
+if(cp < 256){t[pos++]=cp}else{var us=cp.toString(16)
+if(us.length % 2){us="0"+us}
+us="\\u"+us
+for(var j=0;j < us.length;j++){t[pos++]=us.charCodeAt(j)}}}
+break
+default:
+try{load_encoder(enc)}catch(err){throw _b_.LookupError.$factory("unknown encoding: "+encoding)}
+t=from_unicode[enc](s)[0].source}
+return t}
+bytes.$factory=function(source,encoding,errors){var $=$B.args("bytes",3,{source:null,encoding:null,errors:null},["source","encoding","errors"],arguments,{source:[],encoding:"utf-8",errors:"strict"},null,null)
+return bytes.$new(bytes,$.source,$.encoding,$.errors)}
+bytes.__class__=_b_.type
+bytes.$is_class=true
+for(var attr in bytes){if(bytearray[attr]===undefined && typeof bytes[attr]=="function"){bytearray[attr]=(function(_attr){return function(){return bytes[_attr].apply(null,arguments)}})(attr)}}
+$B.set_func_names(bytes,"builtins")
+bytes.fromhex=_b_.classmethod.$factory(bytes.fromhex)
+$B.set_func_names(bytearray,"builtins")
+bytearray.fromhex=_b_.classmethod.$factory(bytearray.fromhex)
+_b_.bytes=bytes
+_b_.bytearray=bytearray})(__BRYTHON__)
+;
+;(function($B){var _b_=$B.builtins,object=_b_.object,$N=_b_.None
+function create_type(obj){return $B.get_class(obj).$factory()}
+function clone(obj){var res=create_type(obj)
+res.$items=obj.$items.slice()
+for(key in obj.$hashes){res.$hashes[key]=obj.$hashes[key]}
+return res}
+var set={__class__:_b_.type,$infos:{__module__:"builtins",__name__:"set"},$is_class:true,$native:true}
+set.__and__=function(self,other,accept_iter){try{$test(accept_iter,other)}catch(err){return _b_.NotImplemented}
+var res=create_type(self)
+for(var i=0,len=self.$items.length;i < len;i++){if(_b_.getattr(other,"__contains__")(self.$items[i])){set.add(res,self.$items[i])}}
+return res}
+set.__class_getitem__=function(cls,item){
+if(! Array.isArray(item)){item=[item]}
+return $B.GenericAlias.$factory(cls,item)}
+set.__contains__=function(self,item){if(typeof item=="number" ||item instanceof Number){if(isNaN(item)){
+for(var i=self.$items.length-1;i >=0;i--){if(isNaN(self.$items[i])){return true}}
+return false}else if(item instanceof Number){return self.$numbers.indexOf(item.valueOf())>-1}else{return self.$items.indexOf(item)>-1}}else if(typeof item=="string"){return self.$items.indexOf(item)>-1}
+var hash=_b_.hash(item),
+item_class=item.__class__ ||$B.get_class(item)
+if(self.$hashes[hash]){
+for(var i=0,len=self.$hashes[hash].length;i < len;i++){if(self.$hashes[hash][i]===item){return true}}
+for(var i=0,len=self.$hashes[hash].length;i < len;i++){if($B.rich_comp("__eq__",self.$hashes[hash][i],item)){return true}}}
+return false}
+set.__eq__=function(self,other){
+if(other===undefined){return self===set}
+if(_b_.isinstance(other,[_b_.set,_b_.frozenset])){if(other.$items.length==self.$items.length){for(var i=0,len=self.$items.length;i < len;i++){if(set.__contains__(self,other.$items[i])===false){return false}}
+return true}
+return false}
+return _b_.NotImplemented}
+set.__format__=function(self,format_string){return set.__str__(self)}
+set.__ge__=function(self,other){if(_b_.isinstance(other,[set,frozenset])){return set.__le__(other,self)}
+return _b_.NotImplemented}
+set.__gt__=function(self,other){if(_b_.isinstance(other,[set,frozenset])){return set.__lt__(other,self)}
+return _b_.NotImplemented}
+set.__hash__=_b_.None
+set.__init__=function(self,iterable,second){if(second===undefined){if(Array.isArray(iterable)){for(var i=0,len=iterable.length;i < len;i++){$add(self,iterable[i])}
+return $N}}
+var $=$B.args("__init__",2,{self:null,iterable:null},["self","iterable"],arguments,{iterable:[]},null,null),self=$.self,iterable=$.iterable
+if(_b_.isinstance(iterable,[set,frozenset])){self.$items=iterable.$items.slice()
+self.$hashes={}
+for(var key in iterable.$hashes){self.$hashes[key]=iterable.$hashes[key]}
+return $N}
+var it=$B.$iter(iterable)
+while(1){try{var item=_b_.next(it)
+$add(self,item)}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
+throw err}}
+return $N}
+var set_iterator=$B.make_iterator_class("set iterator")
+set.__iter__=function(self){
+self.$items.sort(function(x,y){var hx=_b_.hash(x),hy=_b_.hash(y)
+return hx==hy ? 0 :
+hx < hy ?-1 :1})
+return set_iterator.$factory(self.$items)}
+set.__le__=function(self,other){
+if(_b_.isinstance(other,[set,frozenset])){var cfunc=_b_.getattr(other,"__contains__")
+for(var i=0,len=self.$items.length;i < len;i++){if(! cfunc(self.$items[i])){return false}}
+return true}else{return _b_.NotImplemented}}
+set.__len__=function(self){return self.$items.length}
+set.__lt__=function(self,other){if(_b_.isinstance(other,[set,frozenset])){return set.__le__(self,other)&&
+set.__len__(self)< _b_.getattr(other,"__len__")()}else{return _b_.NotImplemented}}
+set.__mro__=[_b_.object]
+set.__new__=function(cls){if(cls===undefined){throw _b_.TypeError.$factory("set.__new__(): not enough arguments")}
+return{
+__class__:cls,$items:[],$numbers:[],
+$hashes:{}}}
+set.__or__=function(self,other,accept_iter){
+var res=clone(self),func=_b_.getattr($B.$iter(other),"__next__")
+while(1){try{set.add(res,func())}
+catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
+throw err}}
+res.__class__=self.__class__
+return res}
+set.__rand__=function(self,other){
+return set.__and__(self,other)}
+set.__reduce__=function(self){return _b_.tuple.$factory([self.__class__,_b_.tuple.$factory([self.$items]),$N])}
+set.__reduce_ex__=function(self,protocol){return set.__reduce__(self)}
+set.__repr__=function(self){$B.builtins_repr_check(set,arguments)
+return set_repr(self)}
+function set_repr(self){
+klass_name=$B.class_name(self)
+if(self.$items.length===0){return klass_name+"()"}
+var head=klass_name+"({",tail="})"
+if(head=="set({"){head="{";tail="}"}
+var res=[]
+if($B.repr.enter(self)){return klass_name+"(...)"}
+try{self.$items.sort(function(x,y){var hx=_b_.hash(x),hy=_b_.hash(y)
+return hx > hy ? 1 :
+hx==hy ? 0 :
+-1}
+)}catch(err){
+console.log('erreur',err.message)}
+for(var i=0,len=self.$items.length;i < len;i++){var r=_b_.repr(self.$items[i])
+if(r===self ||r===self.$items[i]){res.push("{...}")}
+else{res.push(r)}}
+res=res.join(", ")
+$B.repr.leave(self)
+return head+res+tail}
+set.__rsub__=function(self,other){
+return set.__sub__(other,self)}
+set.__rxor__=function(self,other){
+return set.__xor__(self,other)}
+set.__sub__=function(self,other,accept_iter){
+try{$test(accept_iter,other,"-")}
+catch(err){return _b_.NotImplemented}
+var res=create_type(self),cfunc=_b_.getattr(other,"__contains__"),items=[]
+for(var i=0,len=self.$items.length;i < len;i++){if(! cfunc(self.$items[i])){items.push(self.$items[i])}}
+set.__init__.call(null,res,items)
+return res}
+set.__xor__=function(self,other,accept_iter){
+try{$test(accept_iter,other,"^")}
+catch(err){return _b_.NotImplemented}
+var res=create_type(self),cfunc=_b_.getattr(other,"__contains__")
+for(var i=0,len=self.$items.length;i < len;i++){if(! cfunc(self.$items[i])){set.add(res,self.$items[i])}}
+for(var i=0,len=other.$items.length;i < len;i++){if(! set.__contains__(self,other.$items[i])){set.add(res,other.$items[i])}}
+return res}
+function $test(accept_iter,other,op){if(accept_iter===undefined &&
+! _b_.isinstance(other,[set,frozenset])){throw _b_.TypeError.$factory("unsupported operand type(s) for "+op+
+": 'set' and '"+$B.class_name(other)+"'")}}
+$B.make_rmethods(set)
+function $add(self,item){var $simple=false
+if(typeof item==="string" ||typeof item==="number" ||
+item instanceof Number){$simple=true}
+if($simple){var ix=self.$items.indexOf(item)
+if(ix==-1){if(item instanceof Number &&
+self.$numbers.indexOf(item.valueOf())>-1){}else if(typeof item=="number" &&
+self.$numbers.indexOf(item)>-1){}else{self.$items.push(item)
+var value=item.valueOf()
+if(typeof value=="number"){self.$numbers.push(value)}}}else{
+if(item !==self.$items[ix]){self.$items.push(item)}}}else{
+var hashvalue=_b_.hash(item)
+var items=self.$hashes[hashvalue]
+if(items===undefined){self.$hashes[hashvalue]=[item]
+self.$items.push(item)}else{var items=self.$hashes[hashvalue],cfunc=function(other){return $B.rich_comp("__eq__",item,other)}
+for(var i=0,len=items.length;i < len;i++){if(cfunc(items[i])){
+return $N}}
+self.$hashes[hashvalue].push(item)
+self.$items.push(item)}}
+return $N}
+set.add=function(){var $=$B.args("add",2,{self:null,item:null},["self","item"],arguments,{},null,null),self=$.self,item=$.item
+return $add(self,item)}
+set.clear=function(){var $=$B.args("clear",1,{self:null},["self"],arguments,{},null,null)
+$.self.$items=[]
+$.self.$numbers=[]
+$.self.$hashes={}
+return $N}
+set.copy=function(){var $=$B.args("copy",1,{self:null},["self"],arguments,{},null,null)
+if(_b_.isinstance($.self,frozenset)){return $.self}
+var res=set.$factory()
+$.self.$items.forEach(function(item){res.$items.push(item)})
+$.self.$numbers.forEach(function(item){res.$numbers.push(item)})
+for(key in self.$hashes){res.$hashes[key]=self.$hashes[key]}
+return res}
+set.difference_update=function(self){var $=$B.args("difference_update",1,{self:null},["self"],arguments,{},"args",null)
+for(var i=0;i < $.args.length;i++){var s=set.$factory($.args[i]),_next=_b_.getattr($B.$iter(s),"__next__"),item
+while(true){try{item=_next()
+var _type=typeof item
+if(_type=="string" ||_type=="number"){var _index=self.$items.indexOf(item)
+if(_index >-1){self.$items.splice(_index,1)}}else{for(var j=0;j < self.$items.length;j++){if($B.rich_comp("__eq__",self.$items[j],item)){self.$items.splice(j,1)
+var hash=_b_.hash(item)
+if(self.$hashes[hash]){for(var k=0;k < self.$hashes[hash].length;k++){if($B.rich_comp("__eq__",self.$hashes[hash][k],item)){self.$hashes[hash].splice(k,1)
+break}}}}}}}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
+throw err}}}
+return $N}
+set.discard=function(){var $=$B.args("discard",2,{self:null,item:null},["self","item"],arguments,{},null,null)
+try{set.remove($.self,$.item)}
+catch(err){if(!_b_.isinstance(err,[_b_.KeyError,_b_.LookupError])){throw err}}
+return $N}
+set.intersection_update=function(){
+var $=$B.args("intersection_update",1,{self:null},["self"],arguments,{},"args",null),self=$.self
+for(var i=0;i < $.args.length;i++){var remove=[],s=set.$factory($.args[i])
+for(var j=0;j < self.$items.length;j++){var _item=self.$items[j],_type=typeof _item
+if(_type=="string" ||_type=="number"){if(s.$items.indexOf(_item)==-1){remove.push(j)}}else{var found=false,hash=_b_.hash(_item)
+if(s.$hashes[hash]){var hashes=s.$hashes[hash]
+for(var k=0;! found && k < hashes.length;k++){if($B.rich_comp("__eq__",hashes[k],_item)){found=true}}
+if(! found){remove.push(j)
+hashes=self.$hashes[hash]
+for(var k=0;! found && k < hashes.length;k++){if($B.rich_comp("__eq__",hashes[k],_item)){self.$hashes.splice(k,1)}}}}}}
+remove.sort(function(x,y){return x-y}).reverse()
+for(var j=0;j < remove.length;j++){self.$items.splice(remove[j],1)}}
+return $N}
+set.isdisjoint=function(){var $=$B.args("is_disjoint",2,{self:null,other:null},["self","other"],arguments,{},null,null)
+for(var i=0,len=$.self.$items.length;i < len;i++){if(_b_.getattr($.other,"__contains__")($.self.$items[i])){return false}}
+return true}
+set.pop=function(self){if(self.$items.length===0){throw _b_.KeyError.$factory('pop from an empty set')}
+var item=self.$items.pop()
+if(typeof item !="string" && typeof item !="number"){
+var hash=_b_.hash(item),items=self.$hashes[hash]
+for(var k=0;k < items.length;k++){if($B.rich_comp("__eq__",items[k],item)){self.$hashes[hash].splice(k,1)
+break}}}
+return item}
+set.remove=function(self,item){
+var $=$B.args("remove",2,{self:null,item:null},["self","item"],arguments,{},null,null),self=$.self,item=$.item
+if(! _b_.isinstance(item,set)){_b_.hash(item)}
+if(typeof item=="string" ||typeof item=="number"){var _i=self.$items.indexOf(item)
+if(_i==-1){throw _b_.KeyError.$factory(item)}
+self.$items.splice(_i,1)
+if(typeof item=="number"){self.$numbers.splice(self.$numbers.indexOf(item),1)}
+return $N}
+var hash=_b_.hash(item)
+if(self.$hashes[hash]){
+for(var i=0,len=self.$items.length;i < len;i++){if($B.rich_comp("__eq__",self.$items[i],item)){self.$items.splice(i,1)
+if(item instanceof Number){self.$numbers.splice(self.$numbers.indexOf(item.valueOf()),1)}
+break}}
+for(var i=0,len=self.$hashes[hash].length;i < len;i++){if($B.rich_comp("__eq__",self.$hashes[hash][i],item)){self.$hashes[hash].splice(i,1)
+break}}
+return $N}
+throw _b_.KeyError.$factory(item)}
+set.symmetric_difference_update=function(self,s){
+var $=$B.args("symmetric_difference_update",2,{self:null,s:null},["self","s"],arguments,{},null,null),self=$.self,s=$.s
+var _next=_b_.getattr($B.$iter(s),"__next__"),item,remove=[],add=[]
+while(true){try{item=_next()
+var _type=typeof item
+if(_type=="string" ||_type=="number"){var _index=self.$items.indexOf(item)
+if(_index >-1){remove.push(_index)}else{add.push(item)}}else{var found=false
+for(var j=0;! found && j < self.$items.length;j++){if($B.rich_comp("__eq__",self.$items[j],item)){remove.push(j)
+found=true}}
+if(! found){add.push(item)}}}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
+throw err}}
+remove.sort(function(x,y){return x-y}).reverse()
+for(var i=0;i < remove.length;i++){if(remove[i]!=remove[i-1]){self.$items.splice(remove[i],1)}}
+for(var i=0;i < add.length;i++){set.add(self,add[i])}
+return $N}
+set.update=function(self){
+var $=$B.args("update",1,{self:null},["self"],arguments,{},"args",null)
+for(var i=0;i < $.args.length;i++){var other=set.$factory($.args[i])
+for(var j=0,_len=other.$items.length;j < _len;j++){$add(self,other.$items[j])}}
+return $N}
+set.difference=function(){var $=$B.args("difference",1,{self:null},["self"],arguments,{},"args",null)
+if($.args.length==0){return set.copy($.self)}
+var res=clone($.self)
+for(var i=0;i < $.args.length;i++){res=set.__sub__(res,set.$factory($.args[i]),true)}
+return res}
+var fc=set.difference+""
+eval("set.intersection = "+
+fc.replace(/difference/g,"intersection").replace("__sub__","__and__"))
+eval("set.symmetric_difference = "+
+fc.replace(/difference/g,"symmetric_difference").replace("__sub__","__xor__"))
+eval("set.union = "+
+fc.replace(/difference/g,"union").replace("__sub__","__or__"))
+set.issubset=function(){var $=$B.args("issubset",2,{self:null,other:null},["self","other"],arguments,{},"args",null),func=_b_.getattr($.other,"__contains__")
+for(var i=0,len=$.self.$items.length;i < len;i++){if(! func($.self.$items[i])){return false}}
+return true}
+set.issuperset=function(){var $=$B.args("issuperset",2,{self:null,other:null},["self","other"],arguments,{},"args",null)
+var func=_b_.getattr($.self,"__contains__"),it=$B.$iter($.other)
+while(true){try{var item=_b_.next(it)
+if(! func(item)){return false}}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){return true}
+throw err}}
+return true}
+function $accept_only_set(f,op){return function(self,other,accept_iter){$test(accept_iter,other,op)
+f(self,other)
+return self}}
+set.__iand__=$accept_only_set(set.intersection_update,"&=")
+set.__isub__=$accept_only_set(set.difference_update,"-=")
+set.__ixor__=$accept_only_set(set.symmetric_difference_update,"^=")
+set.__ior__=$accept_only_set(set.update,"|=")
+set.$factory=function(){
+var res={__class__:set,$simple:true,$items:[],$numbers:[],$hashes:{}}
+var args=[res].concat(Array.prototype.slice.call(arguments))
+set.__init__.apply(null,args)
+return res}
+$B.set_func_names(set,"builtins")
+set.__class_getitem__=_b_.classmethod.$factory(set.__class_getitem__)
+var frozenset={__class__:_b_.type,__mro__:[object],$infos:{__module__:"builtins",__name__:"frozenset"},$is_class:true,$native:true}
+for(var attr in set){switch(attr){case "add":
+case "clear":
+case "discard":
+case "pop":
+case "remove":
+case "update":
+break
+default:
+if(frozenset[attr]==undefined){if(typeof set[attr]=="function"){frozenset[attr]=(function(x){return function(){return set[x].apply(null,arguments)}})(attr)}else{frozenset[attr]=set[attr]}}}}
+frozenset.__hash__=function(self){if(self===undefined){return frozenset.__hashvalue__ ||$B.$py_next_hash--}
+if(self.__hashvalue__ !==undefined){return self.__hashvalue__}
+var _hash=1927868237
+_hash*=self.$items.length
+for(var i=0,len=self.$items.length;i < len;i++){var _h=_b_.hash(self.$items[i])
+_hash ^=((_h ^ 89869747)^(_h << 16))*3644798167}
+_hash=_hash*69069+907133923
+if(_hash==-1){_hash=590923713}
+return self.__hashvalue__=_hash}
+frozenset.__new__=function(cls){if(cls===undefined){throw _b_.TypeError.$factory(
+"frozenset.__new__(): not enough arguments")}
+return{
+__class__:cls,$simple:true,$items:[],$numbers:[],$hashes:{}}}
+frozenset.__repr__=function(self){$B.builtins_repr_check(frozenset,arguments)
+return set_repr(self)}
+var singleton_id=Math.floor(Math.random()*Math.pow(2,40))
+function empty_frozenset(){var res=frozenset.__new__(frozenset)
+res.$id=singleton_id
+return res}
+frozenset.$factory=function(){var $=$B.args("frozenset",1,{iterable:null},["iterable"],arguments,{iterable:null},null,null)
+if($.iterable===null){return empty_frozenset()}
+else if($.iterable.__class__==frozenset){return $.iterable}
+var res=set.$factory($.iterable)
+if(res.$items.length==0){return empty_frozenset()}
+res.__class__=frozenset
+return res}
+$B.set_func_names(frozenset,"builtins")
+_b_.set=set
+_b_.frozenset=frozenset})(__BRYTHON__)
+;
+;(function($B){var _b_=$B.builtins
+var object=_b_.object
+var _window=self;
+function to_simple(value){switch(typeof value){case 'string':
+case 'number':
+return value
+case 'boolean':
+return value ? "true" :"false"
+case 'object':
+if(value===_b_.None){return 'null'}else if(value instanceof Number){return value.valueOf()}else if(value instanceof String){return value.valueOf()}
+default:
+console.log("erreur",value)
+throw _b_.TypeError.$factory("keys must be str, int, "+
+"float, bool or None, not "+$B.class_name(value))}}
+$B.pyobj2structuredclone=function(obj,strict){
+strict=strict===undefined ? true :strict
+if(typeof obj=="boolean" ||typeof obj=="number" ||
+typeof obj=="string" ||obj instanceof String){return obj}else if(obj instanceof Number){return obj.valueOf()}else if(obj===_b_.None){return null }else if(Array.isArray(obj)||obj.__class__===_b_.list ||
+obj.__class__===_b_.tuple){var res=[]
+for(var i=0,len=obj.length;i < len;i++){res.push($B.pyobj2structuredclone(obj[i]))}
+return res}else if(_b_.isinstance(obj,_b_.dict)){if(strict){if(Object.keys(obj.$numeric_dict).length > 0 ||
+Object.keys(obj.$object_dict).length > 0){throw _b_.TypeError.$factory("a dictionary with non-string "+
+"keys does not support structured clone")}}
+var items=$B.dict_to_list(obj),res={}
+for(var i=0,len=items.length;i < len;i++){res[to_simple(items[i][0])]=$B.pyobj2structuredclone(items[i][1])}
+return res}else{return obj}}
+$B.structuredclone2pyobj=function(obj){if(obj===null){return _b_.None}else if(obj===undefined){return $B.Undefined}else if(typeof obj=="boolean" ||typeof obj=="number" ||
+typeof obj=="string"){return obj}else if(obj instanceof Number ||obj instanceof String){return obj.valueOf()}else if(Array.isArray(obj)||obj.__class__===_b_.list ||
+obj.__class__===_b_.tuple){var res=_b_.list.$factory()
+for(var i=0,len=obj.length;i < len;i++){res.push($B.structuredclone2pyobj(obj[i]))}
+return res}else if(typeof obj=="object"){var res=$B.empty_dict()
+for(var key in obj){_b_.dict.$setitem(res,key,$B.structuredclone2pyobj(obj[key]))}
+return res}else{console.log(obj,Array.isArray(obj),obj.__class__,_b_.list,obj.__class__===_b_.list)
+throw _b_.TypeError.$factory(_b_.str.$factory(obj)+
+" does not support the structured clone algorithm")}}
+var JSConstructor={__class__:_b_.type,__mro__:[object],$infos:{__module__:"",__name__:'JSConstructor'},$is_class:true}
+JSConstructor.__call__=function(self){
+return function(){var args=[null]
+for(var i=0,len=arguments.length;i < len;i++){args.push(pyobj2jsobj(arguments[i]))}
+var factory=self.func.bind.apply(self.func,args)
+var res=new factory()
+return $B.$JS2Py(res)}}
+JSConstructor.__getattribute__=function(self,attr){
+if(attr=="__call__"){return function(){var args=[null]
+for(var i=0,len=arguments.length;i < len;i++){args.push(pyobj2jsobj(arguments[i]))}
+var factory=self.func.bind.apply(self.func,args)
+var res=new factory()
+return $B.$JS2Py(res)}}
+return JSObject.__getattribute__(self,attr)}
+JSConstructor.$factory=function(obj){return{
+__class__:JSConstructor,js:obj,func:obj.js_func}}
+var jsobj2pyobj=$B.jsobj2pyobj=function(jsobj){switch(jsobj){case true:
+case false:
+return jsobj}
+if(jsobj===undefined){return $B.Undefined}else if(jsobj===null){return _b_.None}
+if(Array.isArray(jsobj)){return _b_.list.$factory(jsobj.map(jsobj2pyobj))}else if(typeof jsobj==='number'){if(jsobj.toString().indexOf('.')==-1){return _b_.int.$factory(jsobj)}
+return _b_.float.$factory(jsobj)}else if(typeof jsobj=="string"){return $B.String(jsobj)}else if(typeof jsobj=="function"){
+return function(){var args=[]
+for(var i=0,len=arguments.length;i < len;i++){args.push(pyobj2jsobj(arguments[i]))}
+return jsobj2pyobj(jsobj.apply(null,args))}}
+if(jsobj.$nat==='kw'){return jsobj}
+if($B.$isNode(jsobj)){return $B.DOMNode.$factory(jsobj)}
+return $B.JSObj.$factory(jsobj)}
+var pyobj2jsobj=$B.pyobj2jsobj=function(pyobj){
+if(pyobj===true ||pyobj===false){return pyobj}
+if(pyobj===_b_.None){return null}
+if(pyobj===$B.Undefined){return undefined}
+var klass=$B.get_class(pyobj)
+if(klass===undefined){
+return pyobj;}
+if(klass===JSConstructor){
+if(pyobj.js_func !==undefined){return pyobj.js_func}
+return pyobj.js}else if(klass===$B.DOMNode ||
+klass.__mro__.indexOf($B.DOMNode)>-1){
+return pyobj}else if([_b_.list,_b_.tuple].indexOf(klass)>-1){
+var res=[]
+pyobj.forEach(function(item){res.push(pyobj2jsobj(item))})
+return res}else if(klass===_b_.dict ||_b_.issubclass(klass,_b_.dict)){
+var jsobj={}
+var items=_b_.list.$factory(_b_.dict.items(pyobj))
+items.forEach(function(item){if(typeof item[1]=='function'){
+item[1].bind(jsobj)}
+jsobj[item[0]]=pyobj2jsobj(item[1])})
+return jsobj}else if(klass===_b_.float ||klass===_b_.str){
+return pyobj.valueOf()}else if(klass===$B.Function ||klass===$B.method){
+if(pyobj.prototype &&
+pyobj.prototype.constructor===pyobj &&
+! pyobj.$is_func){
+return pyobj}
+return function(){try{var args=[]
+for(var i=0;i < arguments.length;i++){if(arguments[i]===undefined){args.push(_b_.None)}
+else{args.push(jsobj2pyobj(arguments[i]))}}
+if(pyobj.prototype.constructor===pyobj && ! pyobj.$is_func){var res=new pyobj(...args)}else{var res=pyobj.apply(this,args)}
+return pyobj2jsobj(res)}catch(err){if($B.debug > 1){console.log($B.class_name(err)+':',err.args.length > 0 ? err.args[0]:'' )}
+throw err}}}else{
+return pyobj}}
+$B.JSConstructor=JSConstructor
+function pyargs2jsargs(pyargs){var args=[]
+for(var i=0,len=pyargs.length;i < len;i++){var arg=pyargs[i]
+if(arg !==undefined && arg !==null &&
+arg.$nat !==undefined){
+throw _b_.TypeError.$factory(
+"A Javascript function can't take "+
+"keyword arguments")}else{args.push($B.pyobj2jsobj(arg))}}
+return args}
+$B.JSObj=$B.make_class("JSObject",function(jsobj){if(Array.isArray(jsobj)){}else if(typeof jsobj=="function"){jsobj.$is_js_func=true
+jsobj.__new__=function(){return new jsobj.$js_func(...arguments)}}else if(typeof jsobj=="number" && ! Number.isInteger(jsobj)){return new Number(jsobj)}
+return jsobj}
+)
+$B.JSObj.__sub__=function(self,other){
+if(typeof self=="bigint" && typeof other=="bigint"){return self-other}
+throw _b_.TypeError.$factory("unsupported operand type(s) for - : '"+
+$B.class_name(self)+"' and '"+$B.class_name(other)+"'")}
+var ops={'+':'__add__','*':'__mul__','**':'__pow__','%' :'__mod__'}
+for(var op in ops){eval('$B.JSObj.'+ops[op]+' = '+
+($B.JSObj.__sub__+'').replace(/-/g,op))}
+$B.JSObj.__eq__=function(self,other){switch(typeof self){case "object":
+if(self.__eq__ !==undefined){return self.__eq__(other)}
+if(Object.keys(self).length !==Object.keys(other).length){return false}
+if(self===other){return true}
+for(var key in self){if(! $B.JSObj.__eq__(self[key],other[key])){return false}}
+default:
+return self===other}}
+$B.JSObj.__ne__=function(self,other){return ! $B.JSObj.__eq__(self,other)}
+$B.JSObj.__getattribute__=function(self,attr){var test=false
+if(test){console.log("__ga__",self,attr)}
+if(attr=="new" && typeof self=="function"){
+if(self.$js_func){return function(){var args=pyargs2jsargs(arguments)
+return $B.JSObj.$factory(new self.$js_func(...args))}}else{return function(){var args=pyargs2jsargs(arguments)
+return $B.JSObj.$factory(new self(...args))}}}
+var js_attr=self[attr]
+if(js_attr==undefined && typeof self=="function" && self.$js_func){js_attr=self.$js_func[attr]}
+if(js_attr===undefined){if(typeof self.getNamedItem=='function'){var res=self.getNamedItem(attr)
+if(res !==undefined){return $B.JSObj.$factory(res)}}
+var klass=$B.get_class(self)
+if(klass && klass[attr]){var class_attr=klass[attr]
+if(typeof class_attr=="function"){return function(){var args=[self]
+for(var i=0,len=arguments.length;i < len;i++){args.push(arguments[i])}
+return $B.JSObj.$factory(class_attr.apply(null,args))}}else{return class_attr}}
+if(attr=="bind" && typeof self.addEventListener=="function"){return function(event,callback){return self.addEventListener(event,callback)}}
+throw $B.attr_error(attr,self)}
+if(typeof js_attr==='function'){var res=function(){var args=pyargs2jsargs(arguments),target=self.$js_func ||self
+try{var result=js_attr.apply(target,args)}catch(err){console.log("error",err)
+console.log("attribute",attr,"of self",self,js_attr,args,arguments)
+throw err}
+if(result===undefined){return $B.Undefined}else if(result===null){return _b_.None}
+return $B.JSObj.$factory(result)}
+res.prototype=js_attr.prototype
+res.$js_func=js_attr
+res.__mro__=[_b_.object]
+res.$infos={__name__:js_attr.name,__qualname__:js_attr.name}
+if($B.frames_stack.length > 0){res.$infos.__module__=$B.last($B.frames_stack)[3].__name__}
+return $B.JSObj.$factory(res)}else{return $B.JSObj.$factory(js_attr)}}
+$B.JSObj.__setattr__=function(self,attr,value){self[attr]=$B.pyobj2structuredclone(value)
+return _b_.None}
+$B.JSObj.__getitem__=function(self,key){if(typeof key=="string"){return $B.JSObj.__getattribute__(self,key)}else if(typeof key=="number"){if(self[key]!==undefined){return $B.JSObj.$factory(self[key])}
+if(typeof self.length=='number'){if((typeof key=="number" ||typeof key=="boolean")&&
+typeof self.item=='function'){var rank=_b_.int.$factory(key)
+if(rank < 0){rank+=self.length}
+var res=self.item(rank)
+if(res===null){throw _b_.IndexError.$factory(rank)}
+return $B.JSObj.$factory(res)}}}else if(key.__class__===_b_.slice &&
+typeof self.item=='function'){var _slice=_b_.slice.$conv_for_seq(key,self.length)
+var res=[]
+for(var i=_slice.start;i < _slice.stop;i+=_slice.step){res.push(self.item(i))}
+return res}
+throw _b_.KeyError.$factory(rank)}
+$B.JSObj.__setitem__=$B.JSObj.__setattr__
+var JSObj_iterator=$B.make_iterator_class('JS object iterator')
+$B.JSObj.__iter__=function(self){var items=[]
+if(_window.Symbol && self[Symbol.iterator]!==undefined){
+var items=[]
+if(self.next !==undefined){while(true){var nxt=self.next()
+if(nxt.done){break}
+items.push($B.JSObj.$factory(nxt.value))}}else if(self.length !==undefined && self.item !==undefined){for(var i=0;i < self.length;i++){items.push($B.JSObj.$factory(self.item(i)))}}
+return JSObj_iterator.$factory(items)}else if(self.length !==undefined && self.item !==undefined){
+for(var i=0;i < self.length;i++){items.push($B.JSObj.$factory(self.js.item(i)))}
+return JSObj_iterator.$factory(items)}
+return JSObj_iterator.$factory(Object.keys(self))}
+$B.JSObj.__len__=function(self){if(typeof self.length=='number'){return self.length}
+throw $B.attr_error('__len__',self)}
+$B.JSObj.__repr__=$B.JSObj.__str__=function(self){return ''}
+$B.JSObj.bind=function(self,evt,func){
+var js_func=function(ev){return func(jsobj2pyobj(ev))}
+self.addEventListener(evt,js_func)
+return _b_.None}
+$B.JSObj.to_dict=function(self){
+return $B.structuredclone2pyobj(self)}
+$B.set_func_names($B.JSObj,"builtins")
+$B.JSMeta=$B.make_class("JSMeta")
+$B.JSMeta.__call__=function(cls){
+var extra_args=[],klass=arguments[0]
+for(var i=1,len=arguments.length;i < len;i++){extra_args.push(arguments[i])}
+var new_func=_b_.type.__getattribute__(klass,"__new__")
+var instance=new_func.apply(null,arguments)
+if(instance instanceof cls.__mro__[0].$js_func){
+var init_func=_b_.type.__getattribute__(klass,"__init__")
+if(init_func !==_b_.object.__init__){
+var args=[instance].concat(extra_args)
+init_func.apply(null,args)}}
+return instance}
+$B.JSMeta.__mro__=[_b_.type,_b_.object]
+$B.JSMeta.__getattribute__=function(cls,attr){if(cls[attr]!==undefined){return cls[attr]}else if($B.JSMeta[attr]!==undefined){return $B.JSMeta[attr]}else{
+return _b_.type.__getattribute__(cls,attr)}}
+$B.JSMeta.__init_subclass__=function(){}
+$B.JSMeta.__new__=function(metaclass,class_name,bases,cl_dict){
+eval("var "+class_name+` = function(){
+ if(cl_dict.$string_dict.__init__){
+ var args = [this]
+ for(var i = 0, len = arguments.length; i < len; i++){
+ args.push(arguments[i])
+ }
+ cl_dict.$string_dict.__init__[0].apply(this, args)
+ }else{
+ return new bases[0].$js_func(...arguments)
+ }
+ }`)
+var new_js_class=eval(class_name)
+new_js_class.prototype=Object.create(bases[0].$js_func.prototype)
+new_js_class.prototype.constructor=new_js_class
+new_js_class.__mro__=[bases[0],_b_.type]
+new_js_class.$is_js_class=true
+return new_js_class}
+$B.set_func_names($B.JSMeta,"builtins")})(__BRYTHON__)
+;
+;(function($B){$B.stdlib={}
+var pylist=['VFS_import','__future__','_codecs','_codecs_jp','_collections','_collections_abc','_compat_pickle','_compression','_contextvars','_csv','_dummy_thread','_frozen_importlib','_functools','_imp','_io','_markupbase','_multibytecodec','_operator','_py_abc','_pydecimal','_queue','_random','_signal','_socket','_sre','_struct','_sysconfigdata','_sysconfigdata_0_brython_','_testcapi','_thread','_threading_local','_weakref','_weakrefset','abc','antigravity','argparse','ast','atexit','base64','bdb','binascii','bisect','browser.aio','browser.ajax','browser.highlight','browser.idbcache','browser.indexed_db','browser.local_storage','browser.markdown','browser.object_storage','browser.session_storage','browser.svg','browser.template','browser.timer','browser.ui','browser.webcomponent','browser.websocket','browser.worker','calendar','cmath','cmd','code','codecs','codeop','colorsys','configparser','contextlib','contextvars','copy','copyreg','csv','dataclasses','datetime','decimal','difflib','doctest','enum','errno','external_import','faulthandler','fnmatch','formatter','fractions','functools','gc','genericpath','getopt','getpass','gettext','glob','gzip','heapq','hmac','imp','inspect','interpreter','io','ipaddress','itertools','keyword','linecache','locale','mimetypes','nntplib','ntpath','numbers','opcode','operator','optparse','os','pathlib','pdb','pickle','pkgutil','platform','posixpath','pprint','profile','pwd','py_compile','pydoc','queue','quopri','re','re1','reprlib','select','selectors','shlex','shutil','signal','site','site-packages.__future__','site-packages.docs','site-packages.header','site-packages.test','site-packages.test_sp','socket','sre_compile','sre_constants','sre_parse','stat','statistics','string','stringprep','struct','subprocess','symtable','sys','sysconfig','tabnanny','tarfile','tb','tempfile','test.namespace_pkgs.module_and_namespace_package.a_test','textwrap','this','threading','time','timeit','token','tokenize','traceback','turtle','types','typing','uu','uuid','warnings','weakref','webbrowser','zipfile','zipimport','zlib']
+for(var i=0;i < pylist.length;i++){$B.stdlib[pylist[i]]=['py']}
+var js=['_aio','_ajax','_ast','_base64','_binascii','_io_classes','_json','_jsre','_locale','_multiprocessing','_posixsubprocess','_profile','_sre','_sre_utils','_string','_strptime','_svg','_symtable','_webcomponent','_webworker','_zlib_utils','aes','array','bry_re','builtins','dis','encoding_cp932','hashlib','hmac-md5','hmac-ripemd160','hmac-sha1','hmac-sha224','hmac-sha256','hmac-sha3','hmac-sha384','hmac-sha512','html_parser','long_int','marshal','math','md5','modulefinder','pbkdf2','posix','python_re','rabbit','rabbit-legacy','random','rc4','ripemd160','sha1','sha224','sha256','sha3','sha384','sha512','tripledes','unicodedata']
+for(var i=0;i < js.length;i++){$B.stdlib[js[i]]=['js']}
+var pkglist=['browser','browser.widgets','collections','concurrent','concurrent.futures','email','email.mime','encodings','html','http','importlib','json','logging','multiprocessing','multiprocessing.dummy','pydoc_data','site-packages.foobar','site-packages.pkg_resources','site-packages.pkg_resources._vendor','site-packages.pkg_resources._vendor.packaging','site-packages.pkg_resources.extern','site-packages.simpleaio','site-packages.simpy','site-packages.simpy.resources','site-packages.ui','test','test.encoded_modules','test.leakers','test.namespace_pkgs.not_a_namespace_pkg.foo','test.support','test.test_email','test.test_importlib','test.test_importlib.builtin','test.test_importlib.extension','test.test_importlib.frozen','test.test_importlib.import_','test.test_importlib.source','test.test_json','test.tracedmodules','unittest','unittest.test','unittest.test.testmock','urllib']
+for(var i=0;i < pkglist.length;i++){$B.stdlib[pkglist[i]]=['py',true]}})(__BRYTHON__)
+;
+
+;(function($B){var _b_=$B.builtins,_window=self
+var Module=$B.module=$B.make_class("module",function(name,doc,$package){var obj=Object.create(null)
+obj.__class__=Module
+obj.__name__=name
+obj.__doc__=doc ||_b_.None
+obj. __package__=$package ||_b_.None
+return obj}
+)
+Module.__new__=function(cls,name,doc,$package){return{
+__class__:cls,__name__:name,__doc__:doc ||_b_.None,__package__:$package ||_b_.None}}
+Module.__repr__=Module.__str__=function(self){var res=""}
+Module.__setattr__=function(self,attr,value){if(self.__name__=="__builtins__"){
+$B.builtins[attr]=value}else{self[attr]=value}}
+$B.set_func_names(Module,"builtins")
+function $download_module(mod,url,$package){var xhr=new XMLHttpRequest(),fake_qs="?v="+(new Date().getTime()),res=null,mod_name=mod.__name__
+if(mod_name=='exec'){console.log('download exec ???',$B.frames_stack.slice())}
+var timer=_window.setTimeout(function(){xhr.abort()},5000)
+if($B.$options.cache){xhr.open("GET",url,false)}else{xhr.open("GET",url+fake_qs,false)}
+xhr.send()
+if($B.$CORS){if(xhr.status==200 ||xhr.status==0){res=xhr.responseText}else{res=_b_.ModuleNotFoundError.$factory("No module named '"+
+mod_name+"'")}}else{if(xhr.readyState==4){if(xhr.status==200){res=xhr.responseText
+mod.$last_modified=
+xhr.getResponseHeader("Last-Modified")}else{
+console.info("Error "+xhr.status+
+" means that Python module "+mod_name+
+" was not found at url "+url)
+res=_b_.ModuleNotFoundError.$factory("No module named '"+
+mod_name+"'")}}}
+_window.clearTimeout(timer)
+if(res==null){throw _b_.ModuleNotFoundError.$factory("No module named '"+
+mod_name+"' (res is null)")}
+if(res.constructor===Error){throw res}
+return res}
+$B.$download_module=$download_module
+function import_js(mod,path){try{var module_contents=$download_module(mod,path,undefined)}catch(err){return null}
+run_js(module_contents,path,mod)
+return true}
+function run_js(module_contents,path,_module){
+var module_id="$locals_"+_module.__name__.replace(/\./g,'_')
+try{var $module=new Function(module_id,module_contents+";\nreturn $module")(_module)
+if($B.$options.store){_module.$js=module_contents}}catch(err){console.log(err)
+console.log(path,_module)
+throw err}
+try{$module}
+catch(err){console.log("no $module")
+throw _b_.ImportError.$factory("name '$module' not defined in module")}
+$module.__name__=_module.__name__
+for(var attr in $module){if(typeof $module[attr]=="function"){$module[attr].$infos={__module__:_module.__name__,__name__:attr,__qualname__:attr}
+$module[attr].$in_js_module=true}}
+if(_module !==undefined){
+for(var attr in $module){_module[attr]=$module[attr]}
+$module=_module
+$module.__class__=Module }else{
+$module.__class__=Module
+$module.__name__=_module.__name__
+$module.__repr__=$module.__str__=function(){if($B.builtin_module_names.indexOf(_module.name)>-1){return ""}
+return ""}
+if(_module.name !="builtins"){
+$module.__file__=path}}
+$B.imported[_module.__name__]=$module
+return true}
+function show_ns(){var kk=Object.keys(_window)
+for(var i=0,len=kk.length;i < len;i++){console.log(kk[i])
+if(kk[i].charAt(0)=="$"){console.log(eval(kk[i]))}}
+console.log("---")}
+function run_py(module_contents,path,module,compiled){
+$B.file_cache[path]=module_contents
+$B.url2name[path]=module.__name__
+var root,js,mod_name=module.__name__
+if(! compiled){var $Node=$B.$Node,$NodeJSCtx=$B.$NodeJSCtx
+var src={src:module_contents,has_annotations:false,filename:path}
+try{root=$B.py2js(src,module,module.__name__,$B.builtins_scope)}catch(err){if($B.debug > 1){console.log('error in imported module',module)
+console.log('stack',$B.frames_stack.slice())}
+err.$stack=$B.frames_stack.slice()
+throw err}}
+try{js=compiled ? module_contents :root.to_js()
+if($B.$options.debug==10){console.log("code for module "+module.__name__)
+console.log($B.format_indent(js,0))}
+var src=js
+js="var $module = (function(){\n"+js
+var prefix='locals_'
+js+='return '+prefix
+js+=module.__name__.replace(/\./g,"_")+"})(__BRYTHON__)\n"+
+"return $module"
+var module_id=prefix+module.__name__.replace(/\./g,'_')
+var $module=(new Function(module_id,js))(module)}catch(err){if($B.debug > 1){console.log(err+" for module "+module.__name__)
+console.log("module",module)
+console.log(root)
+if($B.debug > 1){console.log($B.format_indent(js,0))}
+for(var attr in err){console.log(attr,err[attr])}
+console.log("message: "+err.$message)
+console.log("filename: "+err.fileName)
+console.log("linenum: "+err.lineNumber)
+console.log(err.stack)}
+throw err}finally{$B.clear_ns(module.__name__)}
+try{
+var mod=eval("$module")
+for(var attr in mod){module[attr]=mod[attr]}
+module.__initializing__=false
+$B.imported[module.__name__]=module
+return{
+content:src,name:mod_name,imports:Object.keys(root.imports).join(",")}}catch(err){console.log(""+err+" "+" for module "+module.__name__)
+for(var attr in err){console.log(attr+" "+err[attr])}
+if($B.debug > 0){console.log("line info "+__BRYTHON__.line_info)}
+throw err}}
+$B.run_py=run_py
+$B.run_js=run_js
+var ModuleSpec=$B.make_class("ModuleSpec",function(fields){fields.__class__=ModuleSpec
+return fields}
+)
+ModuleSpec.__str__=ModuleSpec.__repr__=function(self){var res=`ModuleSpec(name='${self.name}', `+
+`loader=${_b_.str.$factory(self.loader)}, `+
+`origin='${self.origin}'`
+if(self.submodule_search_locations !==_b_.None){res+=`, submodule_search_locations=`+
+`${_b_.str.$factory(self.submodule_search_locations)}`}
+return res+')'}
+$B.set_func_names(ModuleSpec,"builtins")
+function parent_package(mod_name){
+var parts=mod_name.split(".")
+parts.pop()
+return parts.join(".")}
+var VFSFinder=$B.make_class("VFSFinder",function(){return{
+__class__:VFSFinder}}
+)
+VFSFinder.find_spec=function(cls,fullname,path){var stored,is_package,timestamp
+if(!$B.use_VFS){return _b_.None}
+stored=$B.VFS[fullname]
+if(stored===undefined){return _b_.None}
+is_package=stored[3]||false
+timestamp=stored.timestamp
+if(stored){var is_builtin=$B.builtin_module_names.indexOf(fullname)>-1
+return ModuleSpec.$factory({name :fullname,loader:VFSLoader.$factory(),
+origin :is_builtin? "built-in" :"brython_stdlib",
+submodule_search_locations:is_package?[]:_b_.None,loader_state:{stored:stored,timestamp:timestamp},
+cached:_b_.None,parent:is_package? fullname :parent_package(fullname),has_location:_b_.False})}}
+$B.set_func_names(VFSFinder,"")
+for(var method in VFSFinder){if(typeof VFSFinder[method]=="function"){VFSFinder[method]=_b_.classmethod.$factory(
+VFSFinder[method])}}
+VFSLoader=$B.make_class("VFSLoader",function(){return{
+__class__:VFSLoader}}
+)
+VFSLoader.create_module=function(self,spec){
+return _b_.None}
+VFSLoader.exec_module=function(self,modobj){
+var stored=modobj.__spec__.loader_state.stored,timestamp=modobj.__spec__.loader_state.timestamp
+delete modobj.__spec__["loader_state"]
+var ext=stored[0],module_contents=stored[1],imports=stored[2]
+modobj.$is_package=stored[3]||false
+var path="VFS."+modobj.__name__
+path+=modobj.$is_package ? "/__init__.py" :ext
+modobj.__file__=path
+$B.file_cache[modobj.__file__]=$B.VFS[modobj.__name__][1]
+$B.url2name[modobj.__file__]=modobj.__name__
+if(ext=='.js'){run_js(module_contents,modobj.__path__,modobj)}else if($B.precompiled.hasOwnProperty(modobj.__name__)){if($B.debug > 1){console.info("load",modobj.__name__,"from precompiled")}
+var parts=modobj.__name__.split(".")
+for(var i=0;i < parts.length;i++){var parent=parts.slice(0,i+1).join(".")
+if($B.imported.hasOwnProperty(parent)&&
+$B.imported[parent].__initialized__){continue}
+var mod_js=$B.precompiled[parent],is_package=modobj.$is_package
+if(mod_js===undefined){
+continue}
+if(Array.isArray(mod_js)){mod_js=mod_js[0]}
+var mod=$B.imported[parent]=Module.$factory(parent,undefined,is_package)
+mod.__initialized__=true
+if(is_package){mod.__path__=""
+mod.__package__=parent
+mod.$is_package=true}else{var elts=parent.split(".")
+elts.pop()
+mod.__package__=elts.join(".")}
+mod.__file__=path
+try{var parent_id=parent.replace(/\./g,"_"),prefix='locals_'
+mod_js+="return "+prefix+parent_id
+var $module=new Function(prefix+parent_id,mod_js)(
+mod)}catch(err){if($B.debug > 1){console.log('error in module',mod)
+console.log(err)
+for(var k in err){console.log(k,err[k])}
+console.log(Object.keys($B.imported))
+if($B.debug > 1){console.log(modobj,"mod_js",mod_js)}}
+throw err}
+for(var attr in $module){mod[attr]=$module[attr]}
+$module.__file__=path
+if(i > 0){
+$B.builtins.setattr(
+$B.imported[parts.slice(0,i).join(".")],parts[i],$module)}}
+return $module}else{var mod_name=modobj.__name__
+if($B.debug > 1){console.log("run Python code from VFS",mod_name)}
+var record=run_py(module_contents,modobj.__file__,modobj)
+record.imports=imports.join(',')
+record.is_package=modobj.$is_package
+record.timestamp=$B.timestamp
+record.source_ts=timestamp
+$B.precompiled[mod_name]=record.is_package ?[record.content]:
+record.content
+var elts=mod_name.split(".")
+if(elts.length > 1){elts.pop()}
+if($B.$options.indexedDB && $B.indexedDB &&
+$B.idb_name){
+var idb_cx=indexedDB.open($B.idb_name)
+idb_cx.onsuccess=function(evt){var db=evt.target.result,tx=db.transaction("modules","readwrite"),store=tx.objectStore("modules"),cursor=store.openCursor(),request=store.put(record)
+request.onsuccess=function(){if($B.debug > 1){console.info(modobj.__name__,"stored in db")}}
+request.onerror=function(){console.info("could not store "+modobj.__name__)}}}}}
+$B.set_func_names(VFSLoader,"builtins")
+var finder_cpython={__class__:_b_.type,__mro__:[_b_.object],$infos:{__module__:"builtins",__name__:"CPythonFinder"},create_module :function(cls,spec){
+return _b_.None},exec_module :function(cls,modobj){console.log("exec PYthon module",modobj)
+var loader_state=modobj.__spec__.loader_state
+var content=loader_state.content
+delete modobj.__spec__["loader_state"]
+modobj.$is_package=loader_state.is_package
+modobj.__file__=loader_state.__file__
+$B.file_cache[modobj.__file__]=content
+$B.url2file[modobj.__file__]=modobj.__name__
+var mod_name=modobj.__name__
+if($B.debug > 1){console.log("run Python code from CPython",mod_name)}
+run_py(content,modobj.__path__,modobj)},find_module:function(cls,name,path){return{
+__class__:Loader,load_module:function(name,path){var spec=cls.find_spec(cls,name,path)
+var mod=Module.$factory(name)
+$B.imported[name]=mod
+mod.__spec__=spec
+cls.exec_module(cls,mod)}}},find_spec :function(cls,fullname,path){console.log("finder cpython",fullname)
+var xhr=new XMLHttpRequest(),url="/cpython_import?module="+fullname,result
+xhr.open("GET",url,false)
+xhr.onreadystatechange=function(){if(this.readyState==4 && this.status==200){var data=JSON.parse(this.responseText)
+result=ModuleSpec.$factory({name :fullname,loader:cls,
+origin :"CPython",
+submodule_search_locations:data.is_package?[]:_b_.None,loader_state:{content:data.content},
+cached:_b_.None,parent:data.is_package? fullname :parent_package(fullname),has_location:_b_.False})}}
+xhr.send()
+return result}}
+$B.set_func_names(finder_cpython,"")
+for(var method in finder_cpython){if(typeof finder_cpython[method]=="function"){finder_cpython[method]=_b_.classmethod.$factory(
+finder_cpython[method])}}
+finder_cpython.$factory=function(){return{__class__:finder_cpython}}
+var StdlibStaticFinder=$B.make_class("StdlibStaticFinder",function(){return{
+__class__:StdlibStaticFinder}}
+)
+StdlibStaticFinder.find_spec=function(self,fullname,path){
+if($B.stdlib && $B.$options.static_stdlib_import){var address=$B.stdlib[fullname]
+if(address===undefined){var elts=fullname.split(".")
+if(elts.length > 1){elts.pop()
+var $package=$B.stdlib[elts.join(".")]
+if($package && $package[1]){address=["py"]}}}
+if(address !==undefined){var ext=address[0],is_pkg=address[1]!==undefined,path=$B.brython_path+
+((ext=="py")? "Lib/" :"libs/")+
+fullname.replace(/\./g,"/"),metadata={ext:ext,is_package:is_pkg,path:path+(is_pkg? "/__init__.py" :
+((ext=="py")? ".py" :".js")),address:address},_module=Module.$factory(fullname)
+metadata.code=$download_module(_module,metadata.path)
+var res=ModuleSpec.$factory({name :fullname,loader:PathLoader.$factory(),
+origin :metadata.path,submodule_search_locations:is_pkg?[path]:_b_.None,loader_state:metadata,
+cached:_b_.None,parent:is_pkg ? fullname :parent_package(fullname),has_location:_b_.True})
+return res}}
+return _b_.None}
+$B.set_func_names(StdlibStaticFinder,"")
+for(var method in StdlibStaticFinder){if(typeof StdlibStaticFinder[method]=="function"){StdlibStaticFinder[method]=_b_.classmethod.$factory(
+StdlibStaticFinder[method])}}
+StdlibStaticFinder.$factory=function(){return{__class__:StdlibStaticFinder}}
+var PathFinder=$B.make_class("PathFinder",function(){return{
+__class__:PathFinder}}
+)
+PathFinder.find_spec=function(cls,fullname,path){if($B.VFS && $B.VFS[fullname]){
+return _b_.None}
+if($B.is_none(path)){
+path=$B.path}
+for(var i=0,li=path.length;i < li;++i){var path_entry=path[i]
+if(path_entry[path_entry.length-1]!="/"){path_entry+="/"}
+var finder=$B.path_importer_cache[path_entry]
+if(finder===undefined){
+for(var j=0,lj=$B.path_hooks.length;j < lj;++j){var hook=$B.path_hooks[j]
+try{finder=$B.$call(hook)(path_entry)
+$B.path_importer_cache[path_entry]=finder
+break}catch(e){if(e.__class__ !==_b_.ImportError){throw e}}}}
+if($B.is_none(finder)){continue}
+var find_spec=$B.$getattr(finder,"find_spec"),spec=$B.$call(find_spec)(fullname)
+if(!$B.is_none(spec)){return spec}}
+return _b_.None}
+$B.set_func_names(PathFinder,"")
+for(var method in PathFinder){if(typeof PathFinder[method]=="function"){PathFinder[method]=_b_.classmethod.$factory(
+PathFinder[method])}}
+var PathEntryFinder=$B.make_class("PathEntryFinder",function(path_entry,hint){return{
+__class__:PathEntryFinder,path_entry:path_entry,hint:hint}}
+)
+PathEntryFinder.find_spec=function(self,fullname){
+var loader_data={},notfound=true,hint=self.hint,base_path=self.path_entry+fullname.match(/[^.]+$/g)[0],modpaths=[],py_ext=$B.$options.python_extension
+var tryall=hint===undefined
+if(tryall ||hint=='py'){
+modpaths=modpaths.concat([[base_path+py_ext,"py",false],[base_path+"/__init__"+py_ext,"py",true]])}
+for(var j=0;notfound && j < modpaths.length;++j){try{var file_info=modpaths[j],module={__name__:fullname,$is_package:false}
+loader_data.code=$download_module(module,file_info[0],undefined)
+notfound=false
+loader_data.ext=file_info[1]
+loader_data.is_package=file_info[2]
+if(hint===undefined){self.hint=file_info[1]
+$B.path_importer_cache[self.path_entry]=self}
+if(loader_data.is_package){
+$B.path_importer_cache[base_path+'/']=
+$B.$call(url_hook)(base_path+'/',self.hint)}
+loader_data.path=file_info[0]}catch(err){if(err.__class__ !==_b_.ModuleNotFoundError){throw err}}}
+if(!notfound){return ModuleSpec.$factory({name :fullname,loader:PathLoader.$factory(),origin :loader_data.path,
+submodule_search_locations:loader_data.is_package?
+[base_path]:_b_.None,loader_state:loader_data,
+cached:_b_.None,parent:loader_data.is_package? fullname :
+parent_package(fullname),has_location:_b_.True})}
+return _b_.None}
+$B.set_func_names(PathEntryFinder,"builtins")
+var PathLoader=$B.make_class("PathLoader",function(){return{
+__class__:PathLoader}}
+)
+PathLoader.create_module=function(self,spec){
+return _b_.None}
+PathLoader.exec_module=function(self,module){
+var metadata=module.__spec__.loader_state
+module.$is_package=metadata.is_package
+if(metadata.ext=="py"){run_py(metadata.code,metadata.path,module)}else{run_js(metadata.code,metadata.path,module)}}
+var url_hook=$B.url_hook=function(path_entry){
+path_entry=path_entry.endsWith("/")? path_entry :path_entry+"/"
+return PathEntryFinder.$factory(path_entry)}
+function import_engine(mod_name,_path,from_stdlib){
+var meta_path=$B.meta_path.slice(),_sys_modules=$B.imported,_loader,spec
+if(from_stdlib){
+var path_ix=meta_path.indexOf($B.finders["path"])
+if(path_ix >-1){meta_path.splice(path_ix,1)}}
+for(var i=0,len=meta_path.length;i < len;i++){var _finder=meta_path[i],find_spec=$B.$getattr(_finder,"find_spec",_b_.None)
+if(find_spec==_b_.None){
+var find_module=$B.$getattr(_finder,"find_module",_b_.None)
+if(find_module !==_b_.None){_loader=find_module(mod_name,_path)
+if(_loader !==_b_.None){
+var load_module=$B.$getattr(_loader,"load_module"),module=$B.$call(load_module)(mod_name)
+_sys_modules[mod_name]=module
+return module}}}else{spec=find_spec(mod_name,_path)
+if(!$B.is_none(spec)){module=$B.imported[spec.name]
+if(module !==undefined){
+return _sys_modules[spec.name]=module}
+_loader=$B.$getattr(spec,"loader",_b_.None)
+break}}}
+if(_loader===undefined){
+message=mod_name
+if($B.protocol=="file"){message+=" (warning: cannot import local files with protocol 'file')"}
+var exc=_b_.ModuleNotFoundError.$factory(message)
+exc.name=mod_name
+throw exc}
+if($B.is_none(module)){if(spec===_b_.None){throw _b_.ModuleNotFoundError.$factory(mod_name)}
+var _spec_name=$B.$getattr(spec,"name")
+if(!$B.is_none(_loader)){var create_module=$B.$getattr(_loader,"create_module",_b_.None)
+if(!$B.is_none(create_module)){module=$B.$call(create_module)(spec)}}
+if(module===undefined){throw _b_.ImportError.$factory(mod_name)}
+if($B.is_none(module)){
+module=$B.module.$factory(mod_name)
+var mod_desc=$B.$getattr(spec,"origin")
+if($B.$getattr(spec,"has_location")){mod_desc="from '"+mod_desc+"'"}else{mod_desc="("+mod_desc+")"}}}
+module.__name__=_spec_name
+module.__loader__=_loader
+module.__package__=$B.$getattr(spec,"parent","")
+module.__spec__=spec
+var locs=$B.$getattr(spec,"submodule_search_locations")
+if(module.$is_package=!$B.is_none(locs)){module.__path__=locs}
+if($B.$getattr(spec,"has_location")){module.__file__=$B.$getattr(spec,"origin")}
+var cached=$B.$getattr(spec,"cached")
+if(! $B.is_none(cached)){module.__cached__=cached}
+if($B.is_none(_loader)){if(!$B.is_none(locs)){_sys_modules[_spec_name]=module}else{throw _b_.ImportError.$factory(mod_name)}}else{var exec_module=$B.$getattr(_loader,"exec_module",_b_.None)
+if($B.is_none(exec_module)){
+module=$B.$getattr(_loader,"load_module")(_spec_name)}else{_sys_modules[_spec_name]=module
+try{exec_module(module)}catch(e){delete _sys_modules[_spec_name]
+throw e}}}
+return _sys_modules[_spec_name]}
+$B.path_importer_cache={}
+function import_error(mod_name){var exc=_b_.ImportError.$factory(mod_name)
+exc.name=mod_name
+throw exc}
+$B.$__import__=function(mod_name,globals,locals,fromlist,level){var $test=false
+if($test){console.log("__import__",mod_name)}
+var from_stdlib=false
+if(globals.$jsobj && globals.$jsobj.__file__){var file=globals.$jsobj.__file__
+if((file.startsWith($B.brython_path+"Lib/")&&
+! file.startsWith($B.brython_path+"Lib/site-packages/"))||
+file.startsWith($B.brython_path+"libs/")||
+file.startsWith("VFS.")){from_stdlib=true}}
+var modobj=$B.imported[mod_name],parsed_name=mod_name.split('.'),has_from=fromlist.length > 0
+if(modobj==_b_.None){
+import_error(mod_name)}
+if(modobj===undefined){
+if($B.is_none(fromlist)){fromlist=[]}
+for(var i=0,modsep="",_mod_name="",len=parsed_name.length-1,__path__=_b_.None;i <=len;++i){var _parent_name=_mod_name;
+_mod_name+=modsep+parsed_name[i]
+modsep="."
+var modobj=$B.imported[_mod_name]
+if($test){console.log("iter",i,_mod_name,"\nmodobj",modobj,"\n__path__",__path__,Array.isArray(__path__))
+alert()}
+if(modobj==_b_.None){
+import_error(_mod_name)}else if(modobj===undefined){try{import_engine(_mod_name,__path__,from_stdlib)}catch(err){delete $B.imported[_mod_name]
+throw err}
+if($B.is_none($B.imported[_mod_name])){import_error(_mod_name)}else{
+if(_parent_name){_b_.setattr($B.imported[_parent_name],parsed_name[i],$B.imported[_mod_name])}}}else if($B.imported[_parent_name]&&
+$B.imported[_parent_name][parsed_name[i]]===undefined){
+_b_.setattr($B.imported[_parent_name],parsed_name[i],$B.imported[_mod_name])}
+if(i < len){try{__path__=$B.$getattr($B.imported[_mod_name],"__path__")}catch(e){
+if(i==len-1 &&
+$B.imported[_mod_name][parsed_name[len]]&&
+$B.imported[_mod_name][parsed_name[len]].__class__===
+$B.module){return $B.imported[_mod_name][parsed_name[len]]}
+if(has_from){
+import_error(mod_name)}else{
+var exc=_b_.ModuleNotFoundError.$factory()
+exc.msg="No module named '"+mod_name+"'; '"+
+_mod_name+"' is not a package"
+exc.args=$B.fast_tuple([exc.msg])
+exc.name=mod_name
+exc.path=_b_.None
+throw exc}}}}}else{if($B.imported[parsed_name[0]]&&
+parsed_name.length==2){try{if($B.imported[parsed_name[0]][parsed_name[1]]===undefined){$B.$setattr($B.imported[parsed_name[0]],parsed_name[1],modobj)}}catch(err){console.log("error",parsed_name,modobj)
+throw err}}}
+if(fromlist.length > 0){
+return $B.imported[mod_name]}else{
+return $B.imported[parsed_name[0]]}}
+$B.$import=function(mod_name,fromlist,aliases,locals){
+var level=0,frame=$B.last($B.frames_stack),current_module=frame[2],parts=current_module.split('.')
+while(mod_name.length > 0 && mod_name.startsWith('.')){level++
+mod_name=mod_name.substr(1)
+if(parts.length==0){throw _b_.ImportError.$factory("Parent module '' not loaded, "+
+"cannot perform relative import")}
+current_module=parts.join('.')
+parts.pop()}
+if(level > 0){mod_name=current_module+
+(mod_name.length > 0 ? '.'+mod_name :'')}
+var parts=mod_name.split(".")
+if(mod_name[mod_name.length-1]=="."){parts.pop()}
+var norm_parts=[],prefix=true
+for(var i=0,len=parts.length;i < len;i++){var p=parts[i]
+if(prefix && p==""){
+elt=norm_parts.pop()
+if(elt===undefined){throw _b_.ImportError.$factory("Parent module '' not loaded, "+
+"cannot perform relative import")}}else{prefix=false;
+norm_parts.push(p)}}
+var mod_name=norm_parts.join(".")
+fromlist=fromlist===undefined ?[]:fromlist
+aliases=aliases===undefined ?{}:aliases
+locals=locals===undefined ?{}:locals
+if($B.$options.debug==10){console.log("$import "+mod_name)
+console.log("use VFS ? "+$B.use_VFS)
+console.log("use static stdlib paths ? "+$B.static_stdlib_import)}
+var current_frame=$B.frames_stack[$B.frames_stack.length-1],_globals=current_frame[3],__import__=_globals["__import__"],globals=$B.obj_dict(_globals)
+if(__import__===undefined){
+__import__=$B.$__import__}
+var importer=typeof __import__=="function" ?
+__import__ :
+$B.$getattr(__import__,"__call__"),modobj=importer(mod_name,globals,undefined,fromlist,0)
+if(! fromlist ||fromlist.length==0){
+var alias=aliases[mod_name]
+if(alias){locals[alias]=$B.imported[mod_name]}else{locals[norm_parts[0]]=modobj}}else{var __all__=fromlist,thunk={}
+if(fromlist && fromlist[0]=="*"){__all__=$B.$getattr(modobj,"__all__",thunk);
+if(__all__ !==thunk){
+aliases={}}}
+if(__all__===thunk){
+for(var attr in modobj){if(attr[0]!=="_"){locals[attr]=modobj[attr]}}}else{
+for(var i=0,l=__all__.length;i < l;++i){var name=__all__[i]
+var alias=aliases[name]||name
+try{
+locals[alias]=$B.$getattr(modobj,name)}catch($err1){if(! $B.is_exc($err1,[_b_.AttributeError])){throw $err1}
+try{$B.$getattr(__import__,'__call__')(mod_name+'.'+name,globals,undefined,[],0)
+locals[alias]=$B.$getattr(modobj,name)}catch($err3){
+if(mod_name==="__future__"){
+var frame=$B.last($B.frames_stack),line_info=frame[3].$line_info ||
+frame[1].$lineinfo+','+frame[2],line_elts=line_info.split(','),line_num=parseInt(line_elts[0])
+var exc=_b_.SyntaxError.$factory(
+"future feature "+name+" is not defined")
+throw exc}
+if($err3.$py_error){throw $err3}
+if($B.debug > 1){console.log($err3)
+console.log($B.last($B.frames_stack))}
+throw _b_.ImportError.$factory(
+"cannot import name '"+name+"'")}}}}
+return locals}}
+$B.$import_from=function(module,names,aliases,level,locals){
+var current_module_name=$B.last($B.frames_stack)[2],parts=current_module_name.split('.'),relative=level > 0
+if(relative){
+var current_module=$B.imported[parts.join('.')]
+if(current_module===undefined){throw _b_.ImportError.$factory(
+'attempted relative import with no known parent package')}
+if(! current_module.$is_package){if(parts.length==1){throw _b_.ImportError.$factory(
+'attempted relative import with no known parent package')}else{parts.pop()
+current_module=$B.imported[parts.join('.')]}}else{parts.pop()}
+level--
+while(level > 0){var current_module=$B.imported[parts.join('.')]
+if(! current_module.$is_package){throw _b_.ImportError.$factory(
+'attempted relative import with no known parent package')}
+level--
+parts.pop()}
+if(module){
+var submodule=current_module.__name__+'.'+module
+$B.$import(submodule,[],{},{})
+current_module=$B.imported[submodule]}
+for(var name of names){var alias=aliases[name]||name
+if(current_module[name]!==undefined){
+locals[alias]=current_module[name]}else{
+var sub_module=current_module.__name__+'.'+name
+$B.$import(sub_module,[],{},{})
+locals[alias]=$B.imported[sub_module]}}}else{
+$B.$import(module,names,aliases,locals)}}
+$B.import_all=function(locals,module){
+for(var attr in module){if('_$'.indexOf(attr.charAt(0))==-1){locals[attr]=module[attr]}}}
+$B.$path_hooks=[url_hook]
+$B.$meta_path=[VFSFinder,StdlibStaticFinder,PathFinder]
+$B.finders={VFS:VFSFinder,stdlib_static:StdlibStaticFinder,path:PathFinder,CPython:finder_cpython}
+function optimize_import_for_path(path,filetype){if(path.slice(-1)!="/"){path=path+"/" }
+var value=(filetype=='none')? _b_.None :
+url_hook(path,filetype)
+$B.path_importer_cache[path]=value}
+var Loader={__class__:$B.$type,__mro__:[_b_.object],__name__ :"Loader"}
+var _importlib_module={__class__ :Module,__name__ :"_importlib",Loader:Loader,VFSFinder:VFSFinder,StdlibStatic:StdlibStaticFinder,ImporterPath:PathFinder,UrlPathFinder:url_hook,optimize_import_for_path :optimize_import_for_path}
+_importlib_module.__repr__=_importlib_module.__str__=function(){return ""}
+$B.imported["_importlib"]=_importlib_module})(__BRYTHON__)
+;
+
+var $B=__BRYTHON__
+$B.unicode={"Cc":[[0,32],[127,33]],"Zs":[32,160,5760,[8192,11],8239,8287,12288],"Po":[[33,3],[37,3],[42,3,2],47,58,59,63,64,92,161,167,182,183,191,894,903,[1370,6],1417,[1472,3,3],1523,1524,1545,1546,1548,1549,1563,1566,1567,[1642,4],1748,[1792,14],[2039,3],[2096,15],2142,2404,2405,2416,2557,2678,2800,3191,3204,3572,3663,3674,3675,[3844,15],3860,3973,[4048,5],4057,4058,[4170,6],4347,[4960,9],5742,[5867,3],5941,5942,[6100,3],[6104,3],[6144,6],[6151,4],6468,6469,6686,6687,[6816,7],[6824,6],[7002,7],[7164,4],[7227,5],7294,7295,[7360,8],7379,8214,8215,[8224,8],[8240,9],[8251,4],[8257,3],[8263,11],8275,[8277,10],[11513,4],11518,11519,11632,11776,11777,[11782,3],11787,[11790,9],11800,11801,11803,11806,11807,[11818,5],[11824,10],[11836,4],11841,[11843,13],11858,[12289,3],12349,12539,42238,42239,[42509,3],42611,42622,[42738,6],[43124,4],43214,43215,[43256,3],43260,43310,43311,43359,[43457,13],43486,43487,[43612,4],43742,43743,43760,43761,44011,[65040,7],65049,65072,65093,65094,[65097,4],[65104,3],[65108,4],[65119,3],65128,65130,65131,[65281,3],[65285,3],[65290,3,2],65295,65306,65307,65311,65312,65340,65377,65380,65381,[65792,3],66463,66512,66927,67671,67871,67903,[68176,9],68223,[68336,7],[68409,7],[68505,4],[69461,5],[69703,7],69819,69820,[69822,4],[69952,4],70004,70005,[70085,4],70093,70107,[70109,3],[70200,6],70313,[70731,5],70746,70747,70749,70854,[71105,23],[71233,3],[71264,13],[71484,3],71739,[72004,3],72162,[72255,8],[72346,3],[72350,5],[72769,5],72816,72817,73463,73464,73727,[74864,5],92782,92783,92917,[92983,5],92996,[93847,4],94178,113823,[121479,5],125278,125279],"Sc":[36,[162,4],1423,1547,2046,2047,2546,2547,2555,2801,3065,3647,6107,[8352,32],43064,65020,65129,65284,65504,65505,65509,65510,[73693,4],123647,126128],"Ps":[40,91,123,3898,3900,5787,8218,8222,8261,8317,8333,8968,8970,9001,[10088,7,2],10181,[10214,5,2],[10627,11,2],10712,10714,10748,[11810,4,2],11842,[12296,5,2],[12308,4,2],12317,64831,65047,[65077,8,2],65095,[65113,3,2],65288,65339,65371,65375,65378],"Pe":[41,93,125,3899,3901,5788,8262,8318,8334,8969,8971,9002,[10089,7,2],10182,[10215,5,2],[10628,11,2],10713,10715,10749,[11811,4,2],[12297,5,2],[12309,4,2],12318,12319,64830,65048,[65078,8,2],65096,[65114,3,2],65289,65341,[65373,3,3]],"Sm":[43,[60,3],124,126,172,177,215,247,1014,[1542,3],8260,8274,[8314,3],[8330,3],8472,[8512,5],8523,[8592,5],8602,8603,[8608,3,3],8622,8654,8655,8658,8660,[8692,268],8992,8993,9084,[9115,25],[9180,6],9655,9665,[9720,8],9839,[10176,5],[10183,31],[10224,16],[10496,131],[10649,63],[10716,32],[10750,258],[11056,21],[11079,6],64297,65122,[65124,3],65291,[65308,3],65372,65374,65506,[65513,4],120513,120539,120571,120597,120629,120655,120687,120713,120745,120771,126704,126705],"Pd":[45,1418,1470,5120,6150,[8208,6],11799,11802,11834,11835,11840,12316,12336,12448,65073,65074,65112,65123,65293,69293],"Nd":[[48,10],[1632,10],[1776,10],[1984,10],[2406,10],[2534,10],[2662,10],[2790,10],[2918,10],[3046,10],[3174,10],[3302,10],[3430,10],[3558,10],[3664,10],[3792,10],[3872,10],[4160,10],[4240,10],[6112,10],[6160,10],[6470,10],[6608,10],[6784,10],[6800,10],[6992,10],[7088,10],[7232,10],[7248,10],[42528,10],[43216,10],[43264,10],[43472,10],[43504,10],[43600,10],[44016,10],[65296,10],[66720,10],[68912,10],[69734,10],[69872,10],[69942,10],[70096,10],[70384,10],[70736,10],[70864,10],[71248,10],[71360,10],[71472,10],[71904,10],[72016,10],[72784,10],[73040,10],[73120,10],[92768,10],[93008,10],[120782,50],[123200,10],[123632,10],[125264,10],[130032,10]],"Lu":[[65,26],[192,23],[216,7],[256,28,2],[313,8,2],[330,24,2],[377,3,2],385,[386,3,2],391,[393,3],[398,4],403,404,[406,3],412,413,415,[416,4,2],423,425,428,430,431,[433,3],437,439,440,444,[452,4,3],[463,7,2],[478,9,2],497,500,[502,3],[506,29,2],570,571,573,574,577,[579,4],[584,4,2],880,882,886,895,902,[904,3],908,910,911,[913,17],[931,9],975,[978,3],[984,12,2],1012,1015,1017,1018,[1021,51],[1120,17,2],[1162,28,2],[1217,7,2],[1232,48,2],[1329,38],[4256,38],4295,4301,[5024,86],[7312,43],[7357,3],[7680,75,2],[7838,49,2],[7944,8],[7960,6],[7976,8],[7992,8],[8008,6],[8025,4,2],[8040,8],[8120,4],[8136,4],[8152,4],[8168,5],[8184,4],8450,8455,[8459,3],[8464,3],8469,[8473,5],[8484,4,2],[8491,3],[8496,4],8510,8511,8517,8579,[11264,47],11360,[11362,3],[11367,4,2],[11374,3],11378,11381,[11390,3],[11394,49,2],11499,11501,11506,[42560,23,2],[42624,14,2],[42786,7,2],[42802,31,2],[42873,3,2],[42878,5,2],42891,42893,42896,42898,[42902,11,2],[42923,4],[42928,5],[42934,5,2],42946,[42948,4],42953,42997,[65313,26],[66560,40],[66736,36],[68736,51],[71840,32],[93760,32],[119808,26],[119860,26],[119912,26],119964,119966,[119967,3,3],119974,[119977,4],[119982,8],[120016,26],120068,120069,[120071,4],[120077,8],[120086,7],120120,120121,[120123,4],[120128,5],120134,[120138,7],[120172,26],[120224,26],[120276,26],[120328,26],[120380,26],[120432,26],[120488,25],[120546,25],[120604,25],[120662,25],[120720,25],120778,[125184,34]],"Sk":[94,96,168,175,180,184,[706,4],[722,14],[741,7],749,[751,17],885,900,901,8125,[8127,3],[8141,3],[8157,3],[8173,3],8189,8190,12443,12444,[42752,23],42784,42785,42889,42890,43867,43882,43883,[64434,16],65342,65344,65507,[127995,5]],"Pc":[95,8255,8256,8276,65075,65076,[65101,3],65343],"Ll":[[97,26],181,[223,24],[248,8],[257,28,2],[312,9,2],[329,24,2],[378,3,2],383,384,387,389,392,396,397,402,405,[409,3],414,[417,3,2],424,426,427,429,432,436,438,441,442,[445,3],[454,3,3],[462,8,2],[477,10,2],496,499,501,[505,30,2],[564,6],572,575,576,578,[583,5,2],[592,68],[661,27],881,[883,3,4],892,893,912,[940,35],976,977,[981,3],[985,12,2],[1008,4],[1013,3,3],1020,[1072,48],[1121,17,2],[1163,27,2],[1218,7,2],[1231,49,2],[1376,41],[4304,43],[4349,3],[5112,6],[7296,9],[7424,44],[7531,13],[7545,34],[7681,75,2],[7830,8],[7839,49,2],[7936,8],[7952,6],[7968,8],[7984,8],[8000,6],[8016,8],[8032,8],[8048,14],[8064,8],[8080,8],[8096,8],[8112,5],8118,8119,8126,[8130,3],8134,8135,[8144,4],8150,8151,[8160,8],[8178,3],8182,8183,8458,8462,8463,8467,[8495,3,5],8508,8509,[8518,4],8526,8580,[11312,47],11361,11365,[11366,4,2],11377,11379,11380,[11382,6],[11393,50,2],11492,11500,11502,11507,[11520,38],11559,11565,[42561,23,2],[42625,14,2],[42787,7,2],42800,[42801,33,2],[42866,7],42874,42876,[42879,5,2],42892,42894,42897,[42899,3],[42903,10,2],42927,[42933,6,2],42947,42952,42954,42998,43002,[43824,43],[43872,9],[43888,80],[64256,7],[64275,5],[65345,26],[66600,40],[66776,36],[68800,51],[71872,32],[93792,32],[119834,26],[119886,7],[119894,18],[119938,26],[119990,4],119995,[119997,7],[120005,11],[120042,26],[120094,26],[120146,26],[120198,26],[120250,26],[120302,26],[120354,26],[120406,26],[120458,28],[120514,25],[120540,6],[120572,25],[120598,6],[120630,25],[120656,6],[120688,25],[120714,6],[120746,25],[120772,6],120779,[125218,34]],"So":[166,169,174,176,1154,1421,1422,1550,1551,1758,1769,1789,1790,2038,2554,2928,[3059,6],3066,3199,3407,3449,[3841,3],3859,[3861,3],[3866,6],[3892,3,2],[4030,8],[4039,6],4046,4047,[4053,4],4254,4255,[5008,10],5741,6464,[6622,34],[7009,10],[7028,9],8448,8449,[8451,4],8456,8457,8468,8470,8471,[8478,6],[8485,3,2],8494,8506,8507,8522,8524,8525,8527,8586,8587,[8597,5],[8604,4],8609,8610,8612,8613,[8615,7],[8623,31],8656,[8657,3,2],[8662,30],[8960,8],[8972,20],[8994,7],[9003,81],[9085,30],[9140,40],[9186,69],[9280,11],[9372,78],[9472,183],[9656,9],[9666,54],[9728,111],[9840,248],[10132,44],[10240,256],[11008,48],11077,11078,[11085,39],[11126,32],[11159,105],[11493,6],11856,11857,[11904,26],[11931,89],[12032,214],[12272,12],12292,12306,12307,12320,12342,12343,12350,12351,12688,12689,[12694,10],[12736,36],[12800,31],[12842,30],12880,[12896,32],[12938,39],[12992,320],[19904,64],[42128,55],[43048,4],43062,43063,43065,[43639,3],65021,65508,65512,65517,65518,65532,65533,[65847,9],[65913,17],[65932,3],[65936,13],65952,[66000,45],67703,67704,68296,71487,[73685,8],[73697,17],[92988,4],92997,113820,[118784,246],[119040,39],[119081,60],[119146,3],119171,119172,[119180,30],[119214,59],[119296,66],119365,[119552,87],[120832,512],[121399,4],[121453,8],[121462,14],121477,121478,123215,126124,126254,[126976,44],[127024,100],[127136,15],[127153,15],[127169,15],[127185,37],[127245,161],[127462,29],[127504,44],[127552,9],127568,127569,[127584,6],[127744,251],[128000,728],[128736,13],[128752,13],[128768,116],[128896,89],[128992,12],[129024,12],[129040,56],[129104,10],[129120,40],[129168,30],129200,129201,[129280,121],[129402,82],[129485,135],[129632,14],[129648,5],[129656,3],[129664,7],[129680,25],[129712,7],[129728,3],[129744,7],[129792,147],[129940,55]],"Lo":[170,186,443,[448,4],660,[1488,27],[1519,4],[1568,32],[1601,10],1646,1647,[1649,99],1749,1774,1775,[1786,3],1791,1808,[1810,30],[1869,89],1969,[1994,33],[2048,22],[2112,25],[2144,11],[2208,21],[2230,18],[2308,54],2365,2384,[2392,10],[2418,15],[2437,8],2447,2448,[2451,22],[2474,7],2482,[2486,4],2493,2510,2524,2525,[2527,3],2544,2545,2556,[2565,6],2575,2576,[2579,22],[2602,7],2610,2611,2613,2614,2616,2617,[2649,4],2654,[2674,3],[2693,9],[2703,3],[2707,22],[2730,7],2738,2739,[2741,5],2749,2768,2784,2785,2809,[2821,8],2831,2832,[2835,22],[2858,7],2866,2867,[2869,5],2877,2908,2909,[2911,3],2929,2947,[2949,6],[2958,3],[2962,4],2969,[2970,3,2],2975,2979,2980,[2984,3],[2990,12],3024,[3077,8],[3086,3],[3090,23],[3114,16],3133,[3160,3],3168,3169,3200,[3205,8],[3214,3],[3218,23],[3242,10],[3253,5],3261,3294,3296,3297,3313,3314,[3332,9],[3342,3],[3346,41],3389,3406,[3412,3],[3423,3],[3450,6],[3461,18],[3482,24],[3507,9],3517,[3520,7],[3585,48],3634,3635,[3648,6],3713,[3714,3,2],[3719,4],[3724,24],3749,[3751,10],3762,3763,3773,[3776,5],[3804,4],3840,[3904,8],[3913,36],[3976,5],[4096,43],4159,[4176,6],[4186,4],4193,4197,4198,[4206,3],[4213,13],4238,[4352,329],[4682,4],[4688,7],4696,[4698,4],[4704,41],[4746,4],[4752,33],[4786,4],[4792,7],4800,[4802,4],[4808,15],[4824,57],[4882,4],[4888,67],[4992,16],[5121,620],[5743,17],[5761,26],[5792,75],[5873,8],[5888,13],[5902,4],[5920,18],[5952,18],[5984,13],[5998,3],[6016,52],6108,[6176,35],[6212,53],[6272,5],[6279,34],6314,[6320,70],[6400,31],[6480,30],[6512,5],[6528,44],[6576,26],[6656,23],[6688,53],[6917,47],[6981,7],[7043,30],7086,7087,[7098,44],[7168,36],[7245,3],[7258,30],[7401,4],[7406,6],7413,7414,7418,[8501,4],[11568,56],[11648,23],[11680,7],[11688,7],[11696,7],[11704,7],[11712,7],[11720,7],[11728,7],[11736,7],12294,12348,[12353,86],12447,[12449,90],12543,[12549,43],[12593,94],[12704,32],[12784,16],13312,19903,19968,40956,[40960,21],[40982,1143],[42192,40],[42240,268],[42512,16],42538,42539,42606,[42656,70],42895,42999,[43003,7],[43011,3],[43015,4],[43020,23],[43072,52],[43138,50],[43250,6],43259,43261,43262,[43274,28],[43312,23],[43360,29],[43396,47],[43488,5],[43495,9],[43514,5],[43520,41],[43584,3],[43588,8],[43616,16],[43633,6],43642,[43646,50],43697,43701,43702,[43705,5],43712,43714,43739,43740,[43744,11],43762,[43777,6],[43785,6],[43793,6],[43808,7],[43816,7],[43968,35],44032,55203,[55216,23],[55243,49],[63744,366],[64112,106],64285,[64287,10],[64298,13],[64312,5],64318,64320,64321,64323,64324,[64326,108],[64467,363],[64848,64],[64914,54],[65008,12],[65136,5],[65142,135],[65382,10],[65393,45],[65440,31],[65474,6],[65482,6],[65490,6],[65498,3],[65536,12],[65549,26],[65576,19],65596,65597,[65599,15],[65616,14],[65664,123],[66176,29],[66208,49],[66304,32],[66349,20],[66370,8],[66384,38],[66432,30],[66464,36],[66504,8],[66640,78],[66816,40],[66864,52],[67072,311],[67392,22],[67424,8],[67584,6],67592,[67594,44],67639,67640,67644,[67647,23],[67680,23],[67712,31],[67808,19],67828,67829,[67840,22],[67872,26],[67968,56],68030,68031,68096,[68112,4],[68117,3],[68121,29],[68192,29],[68224,29],[68288,8],[68297,28],[68352,54],[68416,22],[68448,19],[68480,18],[68608,73],[68864,36],[69248,42],69296,69297,[69376,29],69415,[69424,22],[69552,21],[69600,23],[69635,53],[69763,45],[69840,25],[69891,36],69956,69959,[69968,35],70006,[70019,48],[70081,4],70106,70108,[70144,18],[70163,25],[70272,7],70280,[70282,4],[70287,15],[70303,10],[70320,47],[70405,8],70415,70416,[70419,22],[70442,7],70450,70451,[70453,5],70461,70480,[70493,5],[70656,53],[70727,4],[70751,3],[70784,48],70852,70853,70855,[71040,47],[71128,4],[71168,48],71236,[71296,43],71352,[71424,27],[71680,44],[71935,8],71945,[71948,8],71957,71958,[71960,24],71999,72001,[72096,8],[72106,39],72161,72163,72192,[72203,40],72250,72272,[72284,46],72349,[72384,57],[72704,9],[72714,37],72768,[72818,30],[72960,7],72968,72969,[72971,38],73030,[73056,6],73063,73064,[73066,32],73112,[73440,19],73648,[73728,922],[74880,196],[77824,1071],[82944,583],[92160,569],[92736,31],[92880,30],[92928,48],[93027,21],[93053,19],[93952,75],94032,94208,100343,[100352,1238],101632,101640,[110592,287],[110928,3],[110948,4],[110960,396],[113664,107],[113776,13],[113792,9],[113808,10],[123136,45],123214,[123584,44],[124928,197],[126464,4],[126469,27],126497,126498,126500,126503,[126505,10],[126516,4],126521,126523,126530,[126535,4,2],126542,126543,126545,126546,126548,[126551,6,2],126562,126564,[126567,4],[126572,7],[126580,4],[126585,4],126590,[126592,10],[126603,17],[126625,3],[126629,5],[126635,17],131072,173789,173824,177972,177984,178205,178208,183969,183984,191456,[194560,542],196608,201546],"Pi":[171,8216,8219,8220,8223,8249,11778,11780,11785,11788,11804,11808],"Cf":[173,[1536,6],1564,1757,1807,2274,6158,[8203,5],[8234,5],[8288,5],[8294,10],65279,[65529,3],69821,69837,[78896,9],[113824,4],[119155,8],917505,[917536,96]],"No":[178,179,185,[188,3],[2548,6],[2930,6],[3056,3],[3192,7],[3416,7],[3440,9],[3882,10],[4969,20],[6128,10],6618,8304,[8308,6],[8320,10],[8528,16],8585,[9312,60],[9450,22],[10102,30],11517,[12690,4],[12832,10],[12872,8],[12881,15],[12928,10],[12977,15],[43056,6],[65799,45],[65909,4],65930,65931,[66273,27],[66336,4],[67672,8],[67705,7],[67751,9],[67835,5],[67862,6],68028,68029,[68032,16],[68050,46],[68160,9],68221,68222,[68253,3],[68331,5],[68440,8],[68472,8],[68521,7],[68858,6],[69216,31],[69405,10],[69457,4],[69573,7],[69714,20],[70113,20],71482,71483,[71914,9],[72794,19],[73664,21],[93019,7],[93824,23],[119520,20],[119648,25],[125127,9],[126065,59],[126125,3],[126129,4],[126209,45],[126255,15],[127232,13]],"Pf":[187,8217,8221,8250,11779,11781,11786,11789,11805,11809],"Lt":[[453,3,3],498,[8072,8],[8088,8],[8104,8],8124,8140,8188],"Lm":[[688,18],[710,12],[736,5],748,750,884,890,1369,1600,1765,1766,2036,2037,2042,2074,2084,2088,2417,3654,3782,4348,6103,6211,6823,[7288,6],[7468,63],7544,[7579,37],8305,8319,[8336,13],11388,11389,11631,11823,12293,[12337,5],12347,12445,12446,[12540,3],40981,[42232,6],42508,42623,42652,42653,[42775,9],42864,42888,43000,43001,43471,43494,43632,43741,43763,43764,[43868,4],43881,65392,65438,65439,[92992,4],[94099,13],94176,94177,94179,[123191,7],125259],"Mn":[[768,112],[1155,5],[1425,45],1471,1473,1474,1476,1477,1479,[1552,11],[1611,21],1648,[1750,7],[1759,6],1767,1768,[1770,4],1809,[1840,27],[1958,11],[2027,9],2045,[2070,4],[2075,9],[2085,3],[2089,5],[2137,3],[2259,15],[2275,32],2362,2364,[2369,8],2381,[2385,7],2402,2403,2433,2492,[2497,4],2509,2530,2531,2558,2561,2562,2620,2625,2626,2631,2632,[2635,3],2641,2672,2673,2677,2689,2690,2748,[2753,5],2759,2760,2765,2786,2787,[2810,6],2817,2876,2879,[2881,4],2893,2901,2902,2914,2915,2946,3008,3021,3072,3076,[3134,3],[3142,3],[3146,4],3157,3158,3170,3171,3201,3260,3263,3270,3276,3277,3298,3299,3328,3329,3387,3388,[3393,4],3405,3426,3427,3457,3530,[3538,3],3542,3633,[3636,7],[3655,8],3761,[3764,9],[3784,6],3864,3865,[3893,3,2],[3953,14],[3968,5],3974,3975,[3981,11],[3993,36],4038,[4141,4],[4146,6],4153,4154,4157,4158,4184,4185,[4190,3],[4209,4],4226,4229,4230,4237,4253,[4957,3],[5906,3],[5938,3],5970,5971,6002,6003,6068,6069,[6071,7],6086,[6089,11],6109,[6155,3],6277,6278,6313,[6432,3],6439,6440,6450,[6457,3],6679,6680,6683,6742,[6744,7],6752,6754,[6757,8],[6771,10],6783,[6832,14],6847,6848,[6912,4],6964,[6966,5],6972,6978,[7019,9],7040,7041,[7074,4],7080,7081,[7083,3],7142,7144,7145,7149,[7151,3],[7212,8],7222,7223,[7376,3],[7380,13],[7394,7],7405,7412,7416,7417,[7616,58],[7675,5],[8400,13],8417,[8421,12],[11503,3],11647,[11744,32],[12330,4],12441,12442,42607,[42612,10],42654,42655,42736,42737,43010,43014,43019,43045,43046,43052,43204,43205,[43232,18],43263,[43302,8],[43335,11],[43392,3],43443,[43446,4],43452,43453,43493,[43561,6],43569,43570,43573,43574,43587,43596,43644,43696,[43698,3],43703,43704,43710,43711,43713,43756,43757,43766,44005,44008,44013,64286,[65024,16],[65056,16],66045,66272,[66422,5],[68097,3],68101,68102,[68108,4],[68152,3],68159,68325,68326,[68900,4],69291,69292,[69446,11],69633,[69688,15],[69759,3],[69811,4],69817,69818,[69888,3],[69927,5],[69933,8],70003,70016,70017,[70070,9],[70089,4],70095,[70191,3],70196,70198,70199,70206,70367,[70371,8],70400,70401,70459,70460,70464,[70502,7],[70512,5],[70712,8],[70722,3],70726,70750,[70835,6],70842,70847,70848,70850,70851,[71090,4],71100,71101,71103,71104,71132,71133,[71219,8],71229,71231,71232,71339,71341,[71344,6],71351,[71453,3],[71458,4],[71463,5],[71727,9],71737,71738,71995,71996,71998,72003,[72148,4],72154,72155,72160,[72193,10],[72243,6],[72251,4],72263,[72273,6],[72281,3],[72330,13],72344,72345,[72752,7],[72760,6],72767,[72850,22],[72874,7],72882,72883,72885,72886,[73009,6],73018,73020,73021,[73023,7],73031,73104,73105,73109,73111,73459,73460,[92912,5],[92976,7],94031,[94095,4],94180,113821,113822,[119143,3],[119163,8],[119173,7],[119210,4],[119362,3],[121344,55],[121403,50],121461,121476,[121499,5],[121505,15],[122880,7],[122888,17],[122907,7],122915,122916,[122918,5],[123184,7],[123628,4],[125136,7],[125252,7],[917760,240]],"Me":[1160,1161,6846,[8413,4],[8418,3],[42608,3]],"Mc":[2307,2363,[2366,3],[2377,4],2382,2383,2434,2435,[2494,3],2503,2504,2507,2508,2519,2563,[2622,3],2691,[2750,3],2761,2763,2764,2818,2819,2878,2880,2887,2888,2891,2892,2903,3006,3007,3009,3010,[3014,3],[3018,3],3031,[3073,3],[3137,4],3202,3203,3262,[3264,5],3271,3272,3274,3275,3285,3286,3330,3331,[3390,3],[3398,3],[3402,3],3415,3458,3459,[3535,3],[3544,8],3570,3571,3902,3903,3967,4139,4140,4145,4152,4155,4156,4182,4183,[4194,3],[4199,7],4227,4228,[4231,6],4239,[4250,3],6070,[6078,8],6087,6088,[6435,4],[6441,3],6448,6449,[6451,6],6681,6682,6741,6743,6753,6755,6756,[6765,6],6916,6965,6971,[6973,5],6979,6980,7042,7073,7078,7079,7082,7143,[7146,3],7150,7154,7155,[7204,8],7220,7221,7393,7415,12334,12335,43043,43044,43047,43136,43137,[43188,16],43346,43347,43395,43444,43445,43450,43451,[43454,3],43567,43568,43571,43572,43597,43643,43645,43755,43758,43759,43765,44003,44004,44006,44007,44009,44010,44012,69632,69634,69762,[69808,3],69815,69816,69932,69957,69958,70018,[70067,3],70079,70080,70094,[70188,3],70194,70195,70197,[70368,3],70402,70403,70462,70463,[70465,4],70471,70472,[70475,3],70487,70498,70499,[70709,3],70720,70721,70725,[70832,3],70841,[70843,4],70849,[71087,3],[71096,4],71102,[71216,3],71227,71228,71230,71340,71342,71343,71350,71456,71457,71462,[71724,3],71736,[71984,6],71991,71992,71997,72000,72002,[72145,3],[72156,4],72164,72249,72279,72280,72343,72751,72766,72873,72881,72884,[73098,5],73107,73108,73110,73461,73462,[94033,55],94192,94193,119141,119142,[119149,6]],"Nl":[[5870,3],[8544,35],[8581,4],12295,[12321,9],[12344,3],[42726,10],[65856,53],66369,66378,[66513,5],[74752,111]],"Zl":[8232],"Zp":[8233],"Cs":[55296,56191,56192,56319,56320,57343],"Co":[57344,63743,983040,1048573,1048576,1114109],"digits":[[48,10],178,179,185,[1632,10],[1776,10],[1984,10],[2406,10],[2534,10],[2662,10],[2790,10],[2918,10],[3046,10],[3174,10],[3302,10],[3430,10],[3558,10],[3664,10],[3792,10],[3872,10],[4160,10],[4240,10],[4969,9],[6112,10],[6160,10],[6470,10],[6608,11],[6784,10],[6800,10],[6992,10],[7088,10],[7232,10],[7248,10],8304,[8308,6],[8320,10],[9312,9],[9332,9],[9352,9],9450,[9461,9],9471,[10102,9],[10112,9],[10122,9],[42528,10],[43216,10],[43264,10],[43472,10],[43504,10],[43600,10],[44016,10],[65296,10],[66720,10],[68160,4],[68912,10],[69216,9],[69714,9],[69734,10],[69872,10],[69942,10],[70096,10],[70384,10],[70736,10],[70864,10],[71248,10],[71360,10],[71472,10],[71904,10],[72016,10],[72784,10],[73040,10],[73120,10],[92768,10],[93008,10],[120782,50],[123200,10],[123632,10],[125264,10],[127232,11],[130032,10]],"numeric":[[48,10],178,179,185,[188,3],[1632,10],[1776,10],[1984,10],[2406,10],[2534,10],[2548,6],[2662,10],[2790,10],[2918,10],[2930,6],[3046,13],[3174,10],[3192,7],[3302,10],[3416,7],[3430,19],[3558,10],[3664,10],[3792,10],[3872,20],[4160,10],[4240,10],[4969,20],[5870,3],[6112,10],[6128,10],[6160,10],[6470,10],[6608,11],[6784,10],[6800,10],[6992,10],[7088,10],[7232,10],[7248,10],8304,[8308,6],[8320,10],[8528,51],[8581,5],[9312,60],[9450,22],[10102,30],11517,12295,[12321,9],[12344,3],[12690,4],[12832,10],[12872,8],[12881,15],[12928,10],[12977,15],13317,13443,14378,15181,19968,19971,19975,19977,20061,20108,20116,20118,20159,20160,20191,20200,20237,20336,20740,20806,[20841,3,2],21313,[21315,3],21324,[21441,4],22235,22769,22777,24186,24318,24319,[24332,3],24336,25342,25420,26578,28422,29590,30334,32902,33836,36014,36019,36144,38433,38470,38476,38520,38646,[42528,10],[42726,10],[43056,6],[43216,10],[43264,10],[43472,10],[43504,10],[43600,10],[44016,10],63851,63859,63864,63922,63953,63955,63997,[65296,10],[65799,45],[65856,57],65930,65931,[66273,27],[66336,4],66369,66378,[66513,5],[66720,10],[67672,8],[67705,7],[67751,9],[67835,5],[67862,6],68028,68029,[68032,16],[68050,46],[68160,9],68221,68222,[68253,3],[68331,5],[68440,8],[68472,8],[68521,7],[68858,6],[68912,10],[69216,31],[69405,10],[69457,4],[69573,7],[69714,30],[69872,10],[69942,10],[70096,10],[70113,20],[70384,10],[70736,10],[70864,10],[71248,10],[71360,10],[71472,12],[71904,19],[72016,10],[72784,29],[73040,10],[73120,10],[73664,21],[74752,111],[92768,10],[93008,10],[93019,7],[93824,23],[119520,20],[119648,25],[120782,50],[123200,10],[123632,10],[125127,9],[125264,10],[126065,59],[126125,3],[126129,4],[126209,45],[126255,15],[127232,13],[130032,10],131073,131172,131298,131361,133418,133507,133516,133532,133866,133885,133913,140176,141720,146203,156269,194704],"Cn":[[888,2],[896,4],[907,1],[909,1],[930,1],[1328,1],[1367,2],[1419,2],[1424,1],[1480,8],[1515,4],[1525,11],[1565,1],[1806,1],[1867,2],[1970,14],[2043,2],[2094,2],[2111,1],[2140,2],[2143,1],[2155,53],[2229,1],[2248,11],[2436,1],[2445,2],[2449,2],[2473,1],[2481,1],[2483,3],[2490,2],[2501,2],[2505,2],[2511,8],[2520,4],[2526,1],[2532,2],[2559,2],[2564,1],[2571,4],[2577,2],[2601,1],[2609,1],[2612,1],[2615,1],[2618,2],[2621,1],[2627,4],[2633,2],[2638,3],[2642,7],[2653,1],[2655,7],[2679,10],[2692,1],[2702,1],[2706,1],[2729,1],[2737,1],[2740,1],[2746,2],[2758,1],[2762,1],[2766,2],[2769,15],[2788,2],[2802,7],[2816,1],[2820,1],[2829,2],[2833,2],[2857,1],[2865,1],[2868,1],[2874,2],[2885,2],[2889,2],[2894,7],[2904,4],[2910,1],[2916,2],[2936,10],[2948,1],[2955,3],[2961,1],[2966,3],[2971,1],[2973,1],[2976,3],[2981,3],[2987,3],[3002,4],[3011,3],[3017,1],[3022,2],[3025,6],[3032,14],[3067,5],[3085,1],[3089,1],[3113,1],[3130,3],[3141,1],[3145,1],[3150,7],[3159,1],[3163,5],[3172,2],[3184,7],[3213,1],[3217,1],[3241,1],[3252,1],[3258,2],[3269,1],[3273,1],[3278,7],[3287,7],[3295,1],[3300,2],[3312,1],[3315,13],[3341,1],[3345,1],[3397,1],[3401,1],[3408,4],[3428,2],[3456,1],[3460,1],[3479,3],[3506,1],[3516,1],[3518,2],[3527,3],[3531,4],[3541,1],[3543,1],[3552,6],[3568,2],[3573,12],[3643,4],[3676,37],[3715,1],[3717,1],[3723,1],[3748,1],[3750,1],[3774,2],[3781,1],[3783,1],[3790,2],[3802,2],[3808,32],[3912,1],[3949,4],[3992,1],[4029,1],[4045,1],[4059,37],[4294,1],[4296,5],[4302,2],[4681,1],[4686,2],[4695,1],[4697,1],[4702,2],[4745,1],[4750,2],[4785,1],[4790,2],[4799,1],[4801,1],[4806,2],[4823,1],[4881,1],[4886,2],[4955,2],[4989,3],[5018,6],[5110,2],[5118,2],[5789,3],[5881,7],[5901,1],[5909,11],[5943,9],[5972,12],[5997,1],[6001,1],[6004,12],[6110,2],[6122,6],[6138,6],[6159,1],[6170,6],[6265,7],[6315,5],[6390,10],[6431,1],[6444,4],[6460,4],[6465,3],[6510,2],[6517,11],[6572,4],[6602,6],[6619,3],[6684,2],[6751,1],[6781,2],[6794,6],[6810,6],[6830,2],[6849,63],[6988,4],[7037,3],[7156,8],[7224,3],[7242,3],[7305,7],[7355,2],[7368,8],[7419,5],[7674,1],[7958,2],[7966,2],[8006,2],[8014,2],[8024,1],[8026,1],[8028,1],[8030,1],[8062,2],[8117,1],[8133,1],[8148,2],[8156,1],[8176,2],[8181,1],[8191,1],[8293,1],[8306,2],[8335,1],[8349,3],[8384,16],[8433,15],[8588,4],[9255,25],[9291,21],[11124,2],[11158,1],[11311,1],[11359,1],[11508,5],[11558,1],[11560,5],[11566,2],[11624,7],[11633,14],[11671,9],[11687,1],[11695,1],[11703,1],[11711,1],[11719,1],[11727,1],[11735,1],[11743,1],[11859,45],[11930,1],[12020,12],[12246,26],[12284,4],[12352,1],[12439,2],[12544,5],[12592,1],[12687,1],[12772,12],[12831,1],[40957,3],[42125,3],[42183,9],[42540,20],[42744,8],[42944,2],[42955,42],[43053,3],[43066,6],[43128,8],[43206,8],[43226,6],[43348,11],[43389,3],[43470,1],[43482,4],[43519,1],[43575,9],[43598,2],[43610,2],[43715,24],[43767,10],[43783,2],[43791,2],[43799,9],[43815,1],[43823,1],[43884,4],[44014,2],[44026,6],[55204,12],[55239,4],[55292,4],[64110,2],[64218,38],[64263,12],[64280,5],[64311,1],[64317,1],[64319,1],[64322,1],[64325,1],[64450,17],[64832,16],[64912,2],[64968,40],[65022,2],[65050,6],[65107,1],[65127,1],[65132,4],[65141,1],[65277,2],[65280,1],[65471,3],[65480,2],[65488,2],[65496,2],[65501,3],[65511,1],[65519,10],[65534,2],[65548,1],[65575,1],[65595,1],[65598,1],[65614,2],[65630,34],[65787,5],[65795,4],[65844,3],[65935,1],[65949,3],[65953,47],[66046,130],[66205,3],[66257,15],[66300,4],[66340,9],[66379,5],[66427,5],[66462,1],[66500,4],[66518,42],[66718,2],[66730,6],[66772,4],[66812,4],[66856,8],[66916,11],[66928,144],[67383,9],[67414,10],[67432,152],[67590,2],[67593,1],[67638,1],[67641,3],[67645,2],[67670,1],[67743,8],[67760,48],[67827,1],[67830,5],[67868,3],[67898,5],[67904,64],[68024,4],[68048,2],[68100,1],[68103,5],[68116,1],[68120,1],[68150,2],[68155,4],[68169,7],[68185,7],[68256,32],[68327,4],[68343,9],[68406,3],[68438,2],[68467,5],[68498,7],[68509,12],[68528,80],[68681,55],[68787,13],[68851,7],[68904,8],[68922,294],[69247,1],[69290,1],[69294,2],[69298,78],[69416,8],[69466,86],[69580,20],[69623,9],[69710,4],[69744,15],[69826,11],[69838,2],[69865,7],[69882,6],[69941,1],[69960,8],[70007,9],[70112,1],[70133,11],[70162,1],[70207,65],[70279,1],[70281,1],[70286,1],[70302,1],[70314,6],[70379,5],[70394,6],[70404,1],[70413,2],[70417,2],[70441,1],[70449,1],[70452,1],[70458,1],[70469,2],[70473,2],[70478,2],[70481,6],[70488,5],[70500,2],[70509,3],[70517,139],[70748,1],[70754,30],[70856,8],[70874,166],[71094,2],[71134,34],[71237,11],[71258,6],[71277,19],[71353,7],[71370,54],[71451,2],[71468,4],[71488,192],[71740,100],[71923,12],[71943,2],[71946,2],[71956,1],[71959,1],[71990,1],[71993,2],[72007,9],[72026,70],[72104,2],[72152,2],[72165,27],[72264,8],[72355,29],[72441,263],[72713,1],[72759,1],[72774,10],[72813,3],[72848,2],[72872,1],[72887,73],[72967,1],[72970,1],[73015,3],[73019,1],[73022,1],[73032,8],[73050,6],[73062,1],[73065,1],[73103,1],[73106,1],[73113,7],[73130,310],[73465,183],[73649,15],[73714,13],[74650,102],[74863,1],[74869,11],[75076,2748],[78895,1],[78905,4039],[83527,8633],[92729,7],[92767,1],[92778,4],[92784,96],[92910,2],[92918,10],[92998,10],[93018,1],[93026,1],[93048,5],[93072,688],[93851,101],[94027,4],[94088,7],[94112,64],[94181,11],[94194,14],[100344,8],[101590,42],[101641,8951],[110879,49],[110931,17],[110952,8],[111356,2308],[113771,5],[113789,3],[113801,7],[113818,2],[113828,4956],[119030,10],[119079,2],[119273,23],[119366,154],[119540,12],[119639,9],[119673,135],[119893,1],[119965,1],[119968,2],[119971,2],[119975,2],[119981,1],[119994,1],[119996,1],[120004,1],[120070,1],[120075,2],[120085,1],[120093,1],[120122,1],[120127,1],[120133,1],[120135,3],[120145,1],[120486,2],[120780,2],[121484,15],[121504,1],[121520,1360],[122887,1],[122905,2],[122914,1],[122917,1],[122923,213],[123181,3],[123198,2],[123210,4],[123216,368],[123642,5],[123648,1280],[125125,2],[125143,41],[125260,4],[125274,4],[125280,785],[126133,76],[126270,194],[126468,1],[126496,1],[126499,1],[126501,2],[126504,1],[126515,1],[126520,1],[126522,1],[126524,6],[126531,4],[126536,1],[126538,1],[126540,1],[126544,1],[126547,1],[126549,2],[126552,1],[126554,1],[126556,1],[126558,1],[126560,1],[126563,1],[126565,2],[126571,1],[126579,1],[126584,1],[126589,1],[126591,1],[126602,1],[126620,5],[126628,1],[126634,1],[126652,52],[126706,270],[127020,4],[127124,12],[127151,2],[127168,1],[127184,1],[127222,10],[127406,56],[127491,13],[127548,4],[127561,7],[127570,14],[127590,154],[128728,8],[128749,3],[128765,3],[128884,12],[128985,7],[129004,20],[129036,4],[129096,8],[129114,6],[129160,8],[129198,2],[129202,78],[129401,1],[129484,1],[129620,12],[129646,2],[129653,3],[129659,5],[129671,9],[129705,7],[129719,9],[129731,13],[129751,41],[129939,1],[129995,37],[130042,1030],[173790,34],[177973,11],[178206,2],[183970,14],[191457,3103],[195102,1506],[201547,715958],[917506,30],[917632,128],[918000,65040],[1048574,2]]}
+$B.unicode_casefold={223:[115,115],304:[105,775],329:[700,110],496:[106,780],912:[953,776,769],944:[965,776,769],1415:[1381,1410],7830:[104,817],7831:[116,776],7832:[119,778],7833:[121,778],7834:[97,702],7838:[223],8016:[965,787],8018:[965,787,768],8020:[965,787,769],8022:[965,787,834],8064:[7936,953],8065:[7937,953],8066:[7938,953],8067:[7939,953],8068:[7940,953],8069:[7941,953],8070:[7942,953],8071:[7943,953],8072:[8064],8073:[8065],8074:[8066],8075:[8067],8076:[8068],8077:[8069],8078:[8070],8079:[8071],8080:[7968,953],8081:[7969,953],8082:[7970,953],8083:[7971,953],8084:[7972,953],8085:[7973,953],8086:[7974,953],8087:[7975,953],8088:[8080],8089:[8081],8090:[8082],8091:[8083],8092:[8084],8093:[8085],8094:[8086],8095:[8087],8096:[8032,953],8097:[8033,953],8098:[8034,953],8099:[8035,953],8100:[8036,953],8101:[8037,953],8102:[8038,953],8103:[8039,953],8104:[8096],8105:[8097],8106:[8098],8107:[8099],8108:[8100],8109:[8101],8110:[8102],8111:[8103],8114:[8048,953],8115:[945,953],8116:[940,953],8118:[945,834],8119:[945,834,953],8124:[8115],8130:[8052,953],8131:[951,953],8132:[942,953],8134:[951,834],8135:[951,834,953],8140:[8131],8146:[953,776,768],8147:[953,776,769],8150:[953,834],8151:[953,776,834],8162:[965,776,768],8163:[965,776,769],8164:[961,787],8166:[965,834],8167:[965,776,834],8178:[8060,953],8179:[969,953],8180:[974,953],8182:[969,834],8183:[969,834,953],8188:[8179],64256:[102,102],64257:[102,105],64258:[102,108],64259:[102,102,105],64260:[102,102,108],64261:[115,116],64262:[115,116],64275:[1396,1398],64276:[1396,1381],64277:[1396,1387],64278:[1406,1398],64279:[1396,1389]}
+$B.unicode_bidi_whitespace=[9,10,11,12,13,28,29,30,31,32,133,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8287,12288]
+$B.unicode_identifiers={"XID_Start":[95,[65,26],[97,26],170,181,186,[192,23],[216,31],[248,458],[710,12],[736,5],748,750,[880,5],[886,2],[891,3],895,902,[904,3],908,[910,20],[931,83],[1015,139],[1162,166],[1329,38],1369,[1376,41],[1488,27],[1519,4],[1568,43],[1646,2],[1649,99],1749,[1765,2],[1774,2],[1786,3],1791,1808,[1810,30],[1869,89],1969,[1994,33],[2036,2],2042,[2048,22],2074,2084,2088,[2112,25],[2144,11],[2208,21],[2230,18],[2308,54],2365,2384,[2392,10],2417,[2418,15],[2437,8],[2447,2],[2451,22],[2474,7],2482,[2486,4],2493,2510,[2524,2],[2527,3],[2544,2],2556,[2565,6],[2575,2],[2579,22],[2602,7],[2610,2],[2613,2],[2616,2],[2649,4],2654,[2674,3],[2693,9],[2703,3],[2707,22],[2730,7],[2738,2],[2741,5],2749,2768,[2784,2],2809,[2821,8],[2831,2],[2835,22],[2858,7],[2866,2],[2869,5],2877,[2908,2],[2911,3],2929,2947,[2949,6],[2958,3],[2962,4],[2969,2],2972,[2974,2],[2979,2],[2984,3],[2990,12],3024,[3077,8],[3086,3],[3090,23],[3114,16],3133,[3160,3],[3168,2],3200,[3205,8],[3214,3],[3218,23],[3242,10],[3253,5],3261,3294,[3296,2],[3313,2],[3332,9],[3342,3],[3346,41],3389,3406,[3412,3],[3423,3],[3450,6],[3461,18],[3482,24],[3507,9],3517,[3520,7],[3585,48],3634,[3648,7],[3713,2],3716,[3718,5],[3724,24],3749,[3751,10],3762,3773,[3776,5],3782,[3804,4],3840,[3904,8],[3913,36],[3976,5],[4096,43],4159,[4176,6],[4186,4],4193,[4197,2],[4206,3],[4213,13],4238,[4256,38],4295,4301,[4304,43],4348,[4349,332],[4682,4],[4688,7],4696,[4698,4],[4704,41],[4746,4],[4752,33],[4786,4],[4792,7],4800,[4802,4],[4808,15],[4824,57],[4882,4],[4888,67],[4992,16],[5024,86],[5112,6],[5121,620],[5743,17],[5761,26],[5792,75],[5870,11],[5888,13],[5902,4],[5920,18],[5952,18],[5984,13],[5998,3],[6016,52],6103,6108,[6176,89],[6272,41],6314,[6320,70],[6400,31],[6480,30],[6512,5],[6528,44],[6576,26],[6656,23],[6688,53],6823,[6917,47],[6981,7],[7043,30],[7086,2],[7098,44],[7168,36],[7245,3],[7258,36],[7296,9],[7312,43],[7357,3],[7401,4],[7406,6],[7413,2],7418,[7424,192],[7680,278],[7960,6],[7968,38],[8008,6],[8016,8],8025,8027,8029,[8031,31],[8064,53],[8118,7],8126,[8130,3],[8134,7],[8144,4],[8150,6],[8160,13],[8178,3],[8182,7],8305,8319,[8336,13],8450,8455,[8458,10],8469,8472,[8473,5],8484,8486,8488,[8490,16],[8508,4],[8517,5],8526,[8544,41],[11264,47],[11312,47],[11360,133],[11499,4],[11506,2],[11520,38],11559,11565,[11568,56],11631,[11648,23],[11680,7],[11688,7],[11696,7],[11704,7],[11712,7],[11720,7],[11728,7],[11736,7],12293,12294,12295,[12321,9],[12337,5],[12344,5],[12353,86],[12445,3],[12449,90],[12540,4],[12549,43],[12593,94],[12704,32],[12784,16],[13312,6592],[19968,20989],[40960,1165],[42192,46],[42240,269],[42512,16],[42538,2],[42560,47],42623,[42624,30],[42656,80],[42775,9],[42786,103],[42891,53],[42946,9],[42997,13],[43011,3],[43015,4],[43020,23],[43072,52],[43138,50],[43250,6],43259,[43261,2],[43274,28],[43312,23],[43360,29],[43396,47],43471,[43488,5],43494,[43495,9],[43514,5],[43520,41],[43584,3],[43588,8],[43616,23],43642,[43646,50],43697,[43701,2],[43705,5],43712,43714,[43739,3],[43744,11],43762,[43763,2],[43777,6],[43785,6],[43793,6],[43808,7],[43816,7],[43824,43],[43868,14],[43888,115],[44032,11172],[55216,23],[55243,49],[63744,366],[64112,106],[64256,7],[64275,5],64285,[64287,10],[64298,13],[64312,5],64318,[64320,2],[64323,2],[64326,108],[64467,139],[64612,218],[64848,64],[64914,54],[65008,10],65137,65139,65143,65145,65147,65149,[65151,126],[65313,26],[65345,26],[65382,56],[65440,31],[65474,6],[65482,6],[65490,6],[65498,3],[65536,12],[65549,26],[65576,19],[65596,2],[65599,15],[65616,14],[65664,123],[65856,53],[66176,29],[66208,49],[66304,32],[66349,30],[66384,38],[66432,30],[66464,36],[66504,8],[66513,5],[66560,158],[66736,36],[66776,36],[66816,40],[66864,52],[67072,311],[67392,22],[67424,8],[67584,6],67592,[67594,44],[67639,2],67644,[67647,23],[67680,23],[67712,31],[67808,19],[67828,2],[67840,22],[67872,26],[67968,56],[68030,2],68096,[68112,4],[68117,3],[68121,29],[68192,29],[68224,29],[68288,8],[68297,28],[68352,54],[68416,22],[68448,19],[68480,18],[68608,73],[68736,51],[68800,51],[68864,36],[69248,42],[69296,2],[69376,29],69415,[69424,22],[69552,21],[69600,23],[69635,53],[69763,45],[69840,25],[69891,36],69956,69959,[69968,35],70006,[70019,48],[70081,4],70106,70108,[70144,18],[70163,25],[70272,7],70280,[70282,4],[70287,15],[70303,10],[70320,47],[70405,8],[70415,2],[70419,22],[70442,7],[70450,2],[70453,5],70461,70480,[70493,5],[70656,53],[70727,4],[70751,3],[70784,48],[70852,2],70855,[71040,47],[71128,4],[71168,48],71236,[71296,43],71352,[71424,27],[71680,44],[71840,64],[71935,8],71945,[71948,8],[71957,2],[71960,24],71999,72001,[72096,8],[72106,39],72161,72163,72192,[72203,40],72250,72272,[72284,46],72349,[72384,57],[72704,9],[72714,37],72768,[72818,30],[72960,7],[72968,2],[72971,38],73030,[73056,6],[73063,2],[73066,32],73112,[73440,19],73648,[73728,922],[74752,111],[74880,196],[77824,1071],[82944,583],[92160,569],[92736,31],[92880,30],[92928,48],[92992,4],[93027,21],[93053,19],[93760,64],[93952,75],94032,[94099,13],[94176,2],94179,[94208,6136],[100352,1238],[101632,9],[110592,287],[110928,3],[110948,4],[110960,396],[113664,107],[113776,13],[113792,9],[113808,10],[119808,85],[119894,71],[119966,2],119970,[119973,2],[119977,4],[119982,12],119995,[119997,7],[120005,65],[120071,4],[120077,8],[120086,7],[120094,28],[120123,4],[120128,5],120134,[120138,7],[120146,340],[120488,25],[120514,25],[120540,31],[120572,25],[120598,31],[120630,25],[120656,31],[120688,25],[120714,31],[120746,25],[120772,8],[123136,45],[123191,7],123214,[123584,44],[124928,197],[125184,68],125259,[126464,4],[126469,27],[126497,2],126500,126503,[126505,10],[126516,4],126521,126523,126530,126535,126537,126539,[126541,3],[126545,2],126548,126551,126553,126555,126557,126559,[126561,2],126564,[126567,4],[126572,7],[126580,4],[126585,4],126590,[126592,10],[126603,17],[126625,3],[126629,5],[126635,17],[131072,42718],[173824,4149],[177984,222],[178208,5762],[183984,7473],[194560,542],[196608,4939]],"XID_Continue":[[48,10],[65,26],95,[97,26],170,181,183,186,[192,23],[216,31],[248,458],[710,12],[736,5],748,750,[768,117],[886,2],[891,3],895,902,903,[904,3],908,[910,20],[931,83],[1015,139],[1155,5],[1162,166],[1329,38],1369,[1376,41],[1425,45],1471,[1473,2],[1476,2],1479,[1488,27],[1519,4],[1552,11],[1568,74],[1646,102],1749,[1750,7],[1759,10],[1770,19],1791,1808,1809,[1810,57],[1869,101],[1984,54],2042,2045,[2048,46],[2112,28],[2144,11],[2208,21],[2230,18],[2259,15],[2275,129],[2406,10],2417,[2418,18],[2437,8],[2447,2],[2451,22],[2474,7],2482,[2486,4],2492,2493,[2494,7],[2503,2],[2507,4],2519,[2524,2],[2527,5],[2534,12],2556,2558,[2561,3],[2565,6],[2575,2],[2579,22],[2602,7],[2610,2],[2613,2],[2616,2],2620,[2622,5],[2631,2],[2635,3],2641,[2649,4],2654,[2662,16],[2689,3],[2693,9],[2703,3],[2707,22],[2730,7],[2738,2],[2741,5],2748,2749,[2750,8],[2759,3],[2763,3],2768,[2784,4],[2790,10],2809,[2810,6],2817,[2818,2],[2821,8],[2831,2],[2835,22],[2858,7],[2866,2],[2869,5],2876,2877,2878,2879,2880,[2881,4],[2887,2],[2891,3],[2901,3],[2908,2],[2911,5],[2918,10],2929,2946,2947,[2949,6],[2958,3],[2962,4],[2969,2],2972,[2974,2],[2979,2],[2984,3],[2990,12],[3006,5],[3014,3],[3018,4],3024,3031,[3046,10],3072,[3073,12],[3086,3],[3090,23],[3114,16],3133,[3134,7],[3142,3],[3146,4],[3157,2],[3160,3],[3168,4],[3174,10],3200,3201,[3202,2],[3205,8],[3214,3],[3218,23],[3242,10],[3253,5],3260,3261,3262,3263,[3264,5],3270,[3271,2],[3274,4],[3285,2],3294,[3296,4],[3302,10],[3313,2],[3328,13],[3342,3],[3346,51],[3398,3],[3402,5],[3412,4],[3423,5],[3430,10],[3450,6],3457,[3458,2],[3461,18],[3482,24],[3507,9],3517,[3520,7],3530,[3535,6],3542,[3544,8],[3558,10],[3570,2],[3585,58],[3648,15],[3664,10],[3713,2],3716,[3718,5],[3724,24],3749,[3751,23],[3776,5],3782,[3784,6],[3792,10],[3804,4],3840,[3864,2],[3872,10],3893,3895,3897,[3902,10],[3913,36],[3953,20],[3974,18],[3993,36],4038,[4096,74],[4176,78],[4256,38],4295,4301,[4304,43],4348,[4349,332],[4682,4],[4688,7],4696,[4698,4],[4704,41],[4746,4],[4752,33],[4786,4],[4792,7],4800,[4802,4],[4808,15],[4824,57],[4882,4],[4888,67],[4957,3],[4969,9],[4992,16],[5024,86],[5112,6],[5121,620],[5743,17],[5761,26],[5792,75],[5870,11],[5888,13],[5902,7],[5920,21],[5952,20],[5984,13],[5998,3],[6002,2],[6016,84],6103,6108,6109,[6112,10],[6155,3],[6160,10],[6176,89],[6272,43],[6320,70],[6400,31],[6432,12],[6448,12],[6470,40],[6512,5],[6528,44],[6576,26],[6608,11],[6656,28],[6688,63],6752,6753,6754,[6755,26],6783,[6784,10],[6800,10],6823,[6832,14],[6847,2],[6912,76],[6992,10],[7019,9],[7040,116],[7168,56],[7232,10],[7245,49],[7296,9],[7312,43],[7357,3],[7376,3],[7380,39],[7424,250],[7675,283],[7960,6],[7968,38],[8008,6],[8016,8],8025,8027,8029,[8031,31],[8064,53],[8118,7],8126,[8130,3],[8134,7],[8144,4],[8150,6],[8160,13],[8178,3],[8182,7],[8255,2],8276,8305,8319,[8336,13],[8400,13],8417,[8421,12],8450,8455,[8458,10],8469,8472,[8473,5],8484,8486,8488,[8490,16],[8508,4],[8517,5],8526,[8544,41],[11264,47],[11312,47],[11360,133],[11499,9],[11520,38],11559,11565,[11568,56],11631,11647,[11648,23],[11680,7],[11688,7],[11696,7],[11704,7],[11712,7],[11720,7],[11728,7],[11736,7],[11744,32],12293,12294,12295,[12321,15],[12337,5],[12344,5],[12353,86],[12441,2],[12445,3],[12449,90],[12540,4],[12549,43],[12593,94],[12704,32],[12784,16],[13312,6592],[19968,20989],[40960,1165],[42192,46],[42240,269],[42512,28],[42560,48],[42612,10],42623,[42624,114],[42775,9],[42786,103],[42891,53],[42946,9],[42997,51],43052,[43072,52],[43136,70],[43216,10],[43232,24],43259,[43261,49],[43312,36],[43360,29],[43392,65],43471,[43472,10],[43488,31],[43520,55],[43584,14],[43600,10],[43616,23],43642,43643,43644,43645,[43646,69],[43739,3],[43744,16],43762,[43763,4],[43777,6],[43785,6],[43793,6],[43808,7],[43816,7],[43824,43],[43868,14],[43888,123],44012,44013,[44016,10],[44032,11172],[55216,23],[55243,49],[63744,366],[64112,106],[64256,7],[64275,5],64285,64286,[64287,10],[64298,13],[64312,5],64318,[64320,2],[64323,2],[64326,108],[64467,139],[64612,218],[64848,64],[64914,54],[65008,10],[65024,16],[65056,16],[65075,2],[65101,3],65137,65139,65143,65145,65147,65149,[65151,126],[65296,10],[65313,26],65343,[65345,26],[65382,89],[65474,6],[65482,6],[65490,6],[65498,3],[65536,12],[65549,26],[65576,19],[65596,2],[65599,15],[65616,14],[65664,123],[65856,53],66045,[66176,29],[66208,49],66272,[66304,32],[66349,30],[66384,43],[66432,30],[66464,36],[66504,8],[66513,5],[66560,158],[66720,10],[66736,36],[66776,36],[66816,40],[66864,52],[67072,311],[67392,22],[67424,8],[67584,6],67592,[67594,44],[67639,2],67644,[67647,23],[67680,23],[67712,31],[67808,19],[67828,2],[67840,22],[67872,26],[67968,56],[68030,2],68096,[68097,3],[68101,2],[68108,8],[68117,3],[68121,29],[68152,3],68159,[68192,29],[68224,29],[68288,8],[68297,30],[68352,54],[68416,22],[68448,19],[68480,18],[68608,73],[68736,51],[68800,51],[68864,40],[68912,10],[69248,42],[69291,2],[69296,2],[69376,29],69415,[69424,33],[69552,21],[69600,23],69632,69633,69634,[69635,68],[69734,10],[69759,60],[69840,25],[69872,10],[69888,53],[69942,10],69956,[69957,3],[69968,36],70006,[70016,69],[70089,4],70094,70095,[70096,11],70108,[70144,18],[70163,37],70206,[70272,7],70280,[70282,4],[70287,15],[70303,10],[70320,59],[70384,10],[70400,4],[70405,8],[70415,2],[70419,22],[70442,7],[70450,2],[70453,5],[70459,10],[70471,2],[70475,3],70480,70487,[70493,7],[70502,7],[70512,5],[70656,75],[70736,10],70750,[70751,3],[70784,70],70855,[70864,10],[71040,54],[71096,9],[71128,6],[71168,65],71236,[71248,10],[71296,57],[71360,10],[71424,27],[71453,15],[71472,10],[71680,59],[71840,74],[71935,8],71945,[71948,8],[71957,2],[71960,30],[71991,2],[71995,9],[72016,10],[72096,8],[72106,46],[72154,8],72163,72164,72192,[72193,62],72263,72272,[72273,73],72349,[72384,57],[72704,9],[72714,45],[72760,9],[72784,10],[72818,30],[72850,22],72873,[72874,13],[72960,7],[72968,2],[72971,44],73018,[73020,2],[73023,9],[73040,10],[73056,6],[73063,2],[73066,37],[73104,2],[73107,6],[73120,10],[73440,23],73648,[73728,922],[74752,111],[74880,196],[77824,1071],[82944,583],[92160,569],[92736,31],[92768,10],[92880,30],[92912,5],[92928,55],[92992,4],[93008,10],[93027,21],[93053,19],[93760,64],[93952,75],94031,94032,[94033,55],[94095,17],[94176,2],94179,94180,[94192,2],[94208,6136],[100352,1238],[101632,9],[110592,287],[110928,3],[110948,4],[110960,396],[113664,107],[113776,13],[113792,9],[113808,10],[113821,2],[119141,5],[119149,6],[119163,8],[119173,7],[119210,4],[119362,3],[119808,85],[119894,71],[119966,2],119970,[119973,2],[119977,4],[119982,12],119995,[119997,7],[120005,65],[120071,4],[120077,8],[120086,7],[120094,28],[120123,4],[120128,5],120134,[120138,7],[120146,340],[120488,25],[120514,25],[120540,31],[120572,25],[120598,31],[120630,25],[120656,31],[120688,25],[120714,31],[120746,25],[120772,8],[120782,50],[121344,55],[121403,50],121461,121476,[121499,5],[121505,15],[122880,7],[122888,17],[122907,7],[122915,2],[122918,5],[123136,45],[123184,14],[123200,10],123214,[123584,58],[124928,197],[125136,7],[125184,76],[125264,10],[126464,4],[126469,27],[126497,2],126500,126503,[126505,10],[126516,4],126521,126523,126530,126535,126537,126539,[126541,3],[126545,2],126548,126551,126553,126555,126557,126559,[126561,2],126564,[126567,4],[126572,7],[126580,4],[126585,4],126590,[126592,10],[126603,17],[126625,3],[126629,5],[126635,17],[130032,10],[131072,42718],[173824,4149],[177984,222],[178208,5762],[183984,7473],[194560,542],[196608,4939],[917760,240]]}
+$B.unicode_tables={}
+for(var gc in $B.unicode){$B.unicode_tables[gc]={}
+$B.unicode[gc].forEach(function(item){if(Array.isArray(item)){var step=item[2]||1
+for(var i=0,nb=item[1];i < nb;i+=1){$B.unicode_tables[gc][item[0]+i*step]=true}}else{$B.unicode_tables[gc][item]=true}})}
+for(var key in $B.unicode_identifiers){$B.unicode_tables[key]={}
+for(const item of $B.unicode_identifiers[key]){if(Array.isArray(item)){for(var i=0;i < item[1];i++){$B.unicode_tables[key][item[0]+i]=true}}else{$B.unicode_tables[key][item]=true}}}
+$B.is_unicode_cn=function(i){
+var cn=$B.unicode.Cn
+for(var j=0,len=cn.length;j < len;j++){if(i >=cn[j][0]){if(i < cn[j][0]+cn[j][1]){return true}}
+return false}
+return false}
+;
+;(function($B){var _b_=$B.builtins
+var unicode_tables=$B.unicode_tables
+$B.has_surrogate=function(s){
+for(var i=0;i < s.length;i++){code=s.charCodeAt(i)
+if(code >=0xD800 && code <=0xDBFF){return true}}
+return false}
+$B.String=function(s){var codepoints=[],surrogates=[],j=0
+for(var i=0,len=s.length;i < len;i++){var cp=s.codePointAt(i)
+if(cp >=0x10000){surrogates.push(j)
+i++}
+j++}
+if(surrogates.length==0){return s}
+var res=new String(s)
+res.__class__=str
+res.surrogates=surrogates
+return res}
+function pypos2jspos(s,pypos){
+if(s.surrogates===undefined){return pypos}
+var nb=0
+while(s.surrogates[nb]< pypos){nb++}
+return pypos+nb}
+function jspos2pypos(s,jspos){
+if(s.surrogates===undefined){return jspos}
+var nb=0
+while(s.surrogates[nb]+nb < jspos){nb++}
+return jspos-nb}
+var str={__class__:_b_.type,__dir__:_b_.object.__dir__,$infos:{__module__:"builtins",__name__:"str"},$is_class:true,$native:true}
+function normalize_start_end($){var len
+if(typeof $.self=="string"){len=$.self.length}else{len=str.__len__($.self)}
+if($.start===null ||$.start===_b_.None){$.start=0}else if($.start < 0){$.start+=len
+$.start=Math.max(0,$.start)}
+if($.end===null ||$.end===_b_.None){$.end=len}else if($.end < 0){$.end+=len
+$.end=Math.max(0,$.end)}
+if(! _b_.isinstance($.start,_b_.int)||! _b_.isinstance($.end,_b_.int)){throw _b_.TypeError.$factory("slice indices must be integers "+
+"or None or have an __index__ method")}
+if($.self.surrogates){$.js_start=pypos2jspos($.self,$.start)
+$.js_end=pypos2jspos($.self,$.end)}}
+function reverse(s){
+return s.split("").reverse().join("")}
+function check_str(obj,prefix){if(obj instanceof String ||typeof obj=="string"){return}
+if(! _b_.isinstance(obj,str)){throw _b_.TypeError.$factory((prefix ||'')+
+"must be str, not "+$B.class_name(obj))}}
+function to_chars(s){
+var chars=[]
+for(var i=0,len=s.length;i < len;i++){var code=s.charCodeAt(i)
+if(code >=0xD800 && code <=0xDBFF){chars.push(s.substr(i,2))
+i++}else{chars.push(s.charAt(i))}}
+return chars}
+function to_codepoints(s){
+if(s.codepoints){return s.codepoints}
+var cps=[]
+for(var i=0,len=s.length;i < len;i++){var code=s.charCodeAt(i)
+if(code >=0xD800 && code <=0xDBFF){var v=0x10000
+v+=(code & 0x03FF)<< 10
+v+=(s.charCodeAt(i+1)& 0x03FF)
+cps.push(v)
+i++}else{cps.push(code)}}
+return s.codepoints=cps}
+str.__add__=function(self,other){if(! _b_.isinstance(other,str)){try{return $B.$getattr(other,"__radd__")(self)}catch(err){throw _b_.TypeError.$factory("Can't convert "+
+$B.class_name(other)+" to str implicitly")}}
+return $B.String(self+other)}
+str.__contains__=function(self,item){if(! _b_.isinstance(item,str)){throw _b_.TypeError.$factory("'in ' requires "+
+"string as left operand, not "+$B.class_name(item))}
+if(item.__class__===str ||_b_.isinstance(item,str)){var nbcar=item.length}else{var nbcar=_b_.len(item)}
+if(nbcar==0){
+return true}
+var len=self.length
+if(len==0){return nbcar==0}
+for(var i=0,len=self.length;i < len;i++){if(self.substr(i,nbcar)==item){return true}}
+return false}
+str.__delitem__=function(){throw _b_.TypeError.$factory("'str' object doesn't support item deletion")}
+str.__dir__=_b_.object.__dir__
+str.__eq__=function(self,other){if(_b_.isinstance(other,_b_.str)){return other.valueOf()==self.valueOf()}
+return _b_.NotImplemented}
+function preformat(self,fmt){if(fmt.empty){return _b_.str.$factory(self)}
+if(fmt.type && fmt.type !="s"){throw _b_.ValueError.$factory("Unknown format code '"+fmt.type+
+"' for object of type 'str'")}
+return self}
+str.__format__=function(self,format_spec){var fmt=new $B.parse_format_spec(format_spec)
+if(fmt.sign !==undefined){throw _b_.ValueError.$factory(
+"Sign not allowed in string format specifier")}
+if(fmt.precision){self=self.substr(0,fmt.precision)}
+fmt.align=fmt.align ||"<"
+return $B.format_width(preformat(self,fmt),fmt)}
+str.__getitem__=function(self,arg){var len=str.__len__(self)
+if(_b_.isinstance(arg,_b_.int)){var pos=arg
+if(arg < 0){pos+=len}
+if(pos >=0 && pos < len){var jspos=pypos2jspos(self,pos)
+if(self.codePointAt(jspos)>=0x10000){return $B.String(self.substr(jspos,2))}else{return self[jspos]}}
+throw _b_.IndexError.$factory("string index out of range")}
+if(_b_.isinstance(arg,_b_.slice)){var s=_b_.slice.$conv_for_seq(arg,len),start=pypos2jspos(self,s.start),stop=pypos2jspos(self,s.stop),step=s.step
+var res="",i=null
+if(step > 0){if(stop <=start){return ""}
+for(var i=start;i < stop;i+=step){res+=self[i]}}else{if(stop >=start){return ''}
+for(var i=start;i > stop;i+=step){res+=self[i]}}
+return $B.String(res)}
+if(_b_.isinstance(arg,_b_.bool)){return self.__getitem__(_b_.int.$factory(arg))}
+throw _b_.TypeError.$factory("string indices must be integers")}
+var prefix=2,suffix=3,mask=(2**32-1),str_hash_cache={}
+str.$nb_str_hash_cache=0
+function fnv(p){if(p.length==0){return 0}
+var x=prefix
+x=(x ^(p[0]<< 7))& mask
+for(var i=0,len=p.length;i < len;i++){x=((1000003*x)^ p[i])& mask}
+x=(x ^ p.length)& mask
+x=(x ^ suffix)& mask
+if(x==-1){x=-2}
+return x}
+str.__hash__=function(self){if(str_hash_cache[self]!==undefined){return str_hash_cache[self]}
+str.$nb_str_hash_cache++
+if(str.$nb_str_hash_cache > 100000){
+str.$nb_str_hash_cache=0
+str_hash_cache={}}
+try{return str_hash_cache[self]=fnv(to_codepoints(self))}catch(err){console.log('error hash, cps',self,to_codepoints(self))
+throw err}}
+str.__init__=function(self,arg){self.valueOf=function(){return arg}
+self.toString=function(){return arg}
+return _b_.None}
+var str_iterator=$B.make_iterator_class("str_iterator")
+str.__iter__=function(self){return str_iterator.$factory(to_chars(self))}
+str.__len__=function(self){if(self.surrogates===undefined){return self.length}
+if(self.len !==undefined){return self.len}
+var len=self.len=self.valueOf().length-self.surrogates.length
+return len}
+var kwarg_key=new RegExp("([^\\)]*)\\)")
+var NotANumber=function(){this.name="NotANumber"}
+var number_check=function(s){if(! _b_.isinstance(s,[_b_.int,_b_.float])){throw new NotANumber()}}
+var get_char_array=function(size,char){if(size <=0){return ""}
+return new Array(size+1).join(char)}
+var format_padding=function(s,flags,minus_one){var padding=flags.padding
+if(! padding){
+return s}
+s=s.toString()
+padding=parseInt(padding,10)
+if(minus_one){
+padding-=1}
+if(! flags.left){return get_char_array(padding-s.length,flags.pad_char)+s}else{
+return s+get_char_array(padding-s.length,flags.pad_char)}}
+var format_int_precision=function(val,flags){var precision=flags.precision
+if(!precision){return val.toString()}
+precision=parseInt(precision,10)
+var s
+if(val.__class__===$B.long_int){s=$B.long_int.to_base(val,10)}else{s=val.toString()}
+if(s[0]==="-"){return "-"+get_char_array(precision-s.length+1,"0")+s.slice(1)}
+return get_char_array(precision-s.length,"0")+s}
+var format_float_precision=function(val,upper,flags,modifier){var precision=flags.precision
+if(isFinite(val)){return modifier(val,precision,flags,upper)}
+if(val===Infinity){val="inf"}else if(val===-Infinity){val="-inf"}else{val="nan"}
+if(upper){return val.toUpperCase()}
+return val}
+var format_sign=function(val,flags){if(flags.sign){if(val >=0){return "+"}}else if(flags.space){if(val >=0){return " "}}
+return ""}
+var str_format=function(val,flags){
+flags.pad_char=" "
+return format_padding(str.$factory(val),flags)}
+var num_format=function(val,flags){number_check(val)
+if(val.__class__===$B.long_int){val=$B.long_int.to_base(val,10)}else{val=parseInt(val)}
+var s=format_int_precision(val,flags)
+if(flags.pad_char==="0"){if(val < 0){s=s.substring(1)
+return "-"+format_padding(s,flags,true)}
+var sign=format_sign(val,flags)
+if(sign !==""){return sign+format_padding(s,flags,true)}}
+return format_padding(format_sign(val,flags)+s,flags)}
+var repr_format=function(val,flags){flags.pad_char=" "
+return format_padding(_b_.repr(val),flags)}
+var ascii_format=function(val,flags){flags.pad_char=" "
+return format_padding(_b_.ascii(val),flags)}
+var _float_helper=function(val,flags){number_check(val)
+if(! flags.precision){if(! flags.decimal_point){flags.precision=6}else{flags.precision=0}}else{flags.precision=parseInt(flags.precision,10)
+validate_precision(flags.precision)}
+return parseFloat(val)}
+var trailing_zeros=/(.*?)(0+)([eE].*)/,leading_zeros=/\.(0*)/,trailing_dot=/\.$/
+var validate_precision=function(precision){
+if(precision > 20){precision=20}}
+var floating_point_format=function(val,upper,flags){val=_float_helper(val,flags),v=val.toString(),v_len=v.length,dot_idx=v.indexOf('.')
+if(dot_idx < 0){dot_idx=v_len}
+if(val < 1 && val >-1){var zeros=leading_zeros.exec(v),numzeros
+if(zeros){numzeros=zeros[1].length}else{numzeros=0}
+if(numzeros >=4){val=format_sign(val,flags)+format_float_precision(val,upper,flags,_floating_g_exp_helper)
+if(!flags.alternate){var trl=trailing_zeros.exec(val)
+if(trl){val=trl[1].replace(trailing_dot,"")+trl[3]}}else{if(flags.precision <=1){val=val[0]+"."+val.substring(1)}}
+return format_padding(val,flags)}
+flags.precision=(flags.precision ||0)+numzeros
+return format_padding(format_sign(val,flags)+
+format_float_precision(val,upper,flags,function(val,precision){return val.toFixed(_b_.min(precision,v_len-dot_idx)+
+numzeros)}),flags
+)}
+if(dot_idx > flags.precision){val=format_sign(val,flags)+format_float_precision(val,upper,flags,_floating_g_exp_helper)
+if(! flags.alternate){var trl=trailing_zeros.exec(val)
+if(trl){val=trl[1].replace(trailing_dot,"")+trl[3]}}else{if(flags.precision <=1){val=val[0]+"."+val.substring(1)}}
+return format_padding(val,flags)}
+return format_padding(format_sign(val,flags)+
+format_float_precision(val,upper,flags,function(val,precision){if(!flags.decimal_point){precision=_b_.min(v_len-1,6)}else if(precision > v_len){if(! flags.alternate){precision=v_len}}
+if(precision < dot_idx){precision=dot_idx}
+return val.toFixed(precision-dot_idx)}),flags
+)}
+var _floating_g_exp_helper=function(val,precision,flags,upper){if(precision){--precision}
+val=val.toExponential(precision)
+var e_idx=val.lastIndexOf("e")
+if(e_idx > val.length-4){val=val.substring(0,e_idx+2)+"0"+val.substring(e_idx+2)}
+if(upper){return val.toUpperCase()}
+return val}
+var floating_point_decimal_format=function(val,upper,flags){val=_float_helper(val,flags)
+return format_padding(format_sign(val,flags)+
+format_float_precision(val,upper,flags,function(val,precision,flags){val=val.toFixed(precision)
+if(precision===0 && flags.alternate){val+='.'}
+return val}),flags
+)}
+var _floating_exp_helper=function(val,precision,flags,upper){val=val.toExponential(precision)
+var e_idx=val.lastIndexOf("e")
+if(e_idx > val.length-4){val=val.substring(0,e_idx+2)+"0"+val.substring(e_idx+2)}
+if(upper){return val.toUpperCase()}
+return val}
+var floating_point_exponential_format=function(val,upper,flags){val=_float_helper(val,flags)
+return format_padding(format_sign(val,flags)+
+format_float_precision(val,upper,flags,_floating_exp_helper),flags)}
+var signed_hex_format=function(val,upper,flags){var ret
+number_check(val)
+if(val.__class__===$B.long_int){ret=$B.long_int.to_base(val,16)}else{ret=parseInt(val)
+ret=ret.toString(16)}
+ret=format_int_precision(ret,flags)
+if(upper){ret=ret.toUpperCase()}
+if(flags.pad_char==="0"){if(val < 0){ret=ret.substring(1)
+ret="-"+format_padding(ret,flags,true)}
+var sign=format_sign(val,flags)
+if(sign !==""){ret=sign+format_padding(ret,flags,true)}}
+if(flags.alternate){if(ret.charAt(0)==="-"){if(upper){ret="-0X"+ret.slice(1)}
+else{ret="-0x"+ret.slice(1)}}else{if(upper){ret="0X"+ret}
+else{ret="0x"+ret}}}
+return format_padding(format_sign(val,flags)+ret,flags)}
+var octal_format=function(val,flags){number_check(val)
+var ret
+if(val.__class__===$B.long_int){ret=$B.long_int.to_base(8)}else{ret=parseInt(val)
+ret=ret.toString(8)}
+ret=format_int_precision(ret,flags)
+if(flags.pad_char==="0"){if(val < 0){ret=ret.substring(1)
+ret="-"+format_padding(ret,flags,true)}
+var sign=format_sign(val,flags)
+if(sign !==""){ret=sign+format_padding(ret,flags,true)}}
+if(flags.alternate){if(ret.charAt(0)==="-"){ret="-0o"+ret.slice(1)}
+else{ret="0o"+ret}}
+return format_padding(ret,flags)}
+function series_of_bytes(val,flags){if(val.__class__ && val.__class__.$buffer_protocol){var it=_b_.iter(val),ints=[]
+while(true){try{ints.push(_b_.next(it))}catch(err){if(err.__class__===_b_.StopIteration){var b=_b_.bytes.$factory(ints)
+return format_padding(_b_.bytes.decode(b,"ascii"),flags)}
+throw err}}}else{try{bytes_obj=$B.$getattr(val,"__bytes__")
+return format_padding(_b_.bytes.decode(bytes_obj),flags)}catch(err){if(err.__class__===_b_.AttributeError){throw _b_.TypeError.$factory("%b does not accept '"+
+$B.class_name(val)+"'")}
+throw err}}}
+var single_char_format=function(val,flags){if(_b_.isinstance(val,str)&& val.length==1){return val}else if(_b_.isinstance(val,_b_.bytes)&& val.source.length==1){val=val.source[0]}else{try{val=_b_.int.$factory(val)}catch(err){throw _b_.TypeError.$factory("%c requires int or char")}}
+return format_padding(_b_.chr(val),flags)}
+var num_flag=function(c,flags){if(c==="0" && ! flags.padding && ! flags.decimal_point && ! flags.left){flags.pad_char="0"
+return}
+if(!flags.decimal_point){flags.padding=(flags.padding ||"")+c}else{flags.precision=(flags.precision ||"")+c}}
+var decimal_point_flag=function(val,flags){if(flags.decimal_point){
+throw new UnsupportedChar()}
+flags.decimal_point=true}
+var neg_flag=function(val,flags){flags.pad_char=" "
+flags.left=true}
+var space_flag=function(val,flags){flags.space=true}
+var sign_flag=function(val,flags){flags.sign=true}
+var alternate_flag=function(val,flags){flags.alternate=true}
+var char_mapping={"b":series_of_bytes,"s":str_format,"d":num_format,"i":num_format,"u":num_format,"o":octal_format,"r":repr_format,"a":ascii_format,"g":function(val,flags){return floating_point_format(val,false,flags)},"G":function(val,flags){return floating_point_format(val,true,flags)},"f":function(val,flags){return floating_point_decimal_format(val,false,flags)},"F":function(val,flags){return floating_point_decimal_format(val,true,flags)},"e":function(val,flags){return floating_point_exponential_format(val,false,flags)},"E":function(val,flags){return floating_point_exponential_format(val,true,flags)},"x":function(val,flags){return signed_hex_format(val,false,flags)},"X":function(val,flags){return signed_hex_format(val,true,flags)},"c":single_char_format,"0":function(val,flags){return num_flag("0",flags)},"1":function(val,flags){return num_flag("1",flags)},"2":function(val,flags){return num_flag("2",flags)},"3":function(val,flags){return num_flag("3",flags)},"4":function(val,flags){return num_flag("4",flags)},"5":function(val,flags){return num_flag("5",flags)},"6":function(val,flags){return num_flag("6",flags)},"7":function(val,flags){return num_flag("7",flags)},"8":function(val,flags){return num_flag("8",flags)},"9":function(val,flags){return num_flag("9",flags)},"-":neg_flag," ":space_flag,"+":sign_flag,".":decimal_point_flag,"#":alternate_flag}
+var UnsupportedChar=function(){this.name="UnsupportedChar"}
+str.__mod__=function(self,args){var length=self.length,pos=0 |0,argpos=null,getitem
+if(_b_.isinstance(args,_b_.tuple)){argpos=0 |0}else{getitem=$B.$getattr(args,"__getitem__",_b_.None)}
+var ret=''
+var $get_kwarg_string=function(s){
+++pos
+var rslt=kwarg_key.exec(s.substring(newpos))
+if(! rslt){throw _b_.ValueError.$factory("incomplete format key")}
+var key=rslt[1]
+newpos+=rslt[0].length
+try{var self=getitem(key)}catch(err){if(err.__class__===_b_.KeyError){throw err}
+throw _b_.TypeError.$factory("format requires a mapping")}
+return get_string_value(s,self)}
+var $get_arg_string=function(s){
+var self
+if(argpos===null){
+self=args}else{self=args[argpos++]
+if(self===undefined){throw _b_.TypeError.$factory(
+"not enough arguments for format string")}}
+return get_string_value(s,self)}
+var get_string_value=function(s,self){
+var flags={"pad_char":" "}
+do{var func=char_mapping[s[newpos]]
+try{if(func===undefined){throw new UnsupportedChar()}else{var ret=func(self,flags)
+if(ret !==undefined){return ret}
+++newpos}}catch(err){if(err.name=="UnsupportedChar"){invalid_char=s[newpos]
+if(invalid_char===undefined){throw _b_.ValueError.$factory("incomplete format")}
+throw _b_.ValueError.$factory(
+"unsupported format character '"+invalid_char+
+"' (0x"+invalid_char.charCodeAt(0).toString(16)+
+") at index "+newpos)}else if(err.name==="NotANumber"){var try_char=s[newpos],cls=self.__class__
+if(!cls){if(typeof(self)==="string"){cls="str"}else{cls=typeof(self)}}else{cls=cls.$infos.__name__}
+throw _b_.TypeError.$factory("%"+try_char+
+" format: a number is required, not "+cls)}else{throw err}}}while(true)}
+var nbph=0
+do{var newpos=self.indexOf("%",pos)
+if(newpos < 0){ret+=self.substring(pos)
+break}
+ret+=self.substring(pos,newpos)
+++newpos
+if(newpos < length){if(self[newpos]==="%"){ret+="%"}else{nbph++
+if(self[newpos]==="("){++newpos
+ret+=$get_kwarg_string(self)}else{ret+=$get_arg_string(self)}}}else{
+throw _b_.ValueError.$factory("incomplete format")}
+pos=newpos+1}while(pos < length)
+if(argpos !==null){if(args.length > argpos){throw _b_.TypeError.$factory(
+"not enough arguments for format string")}else if(args.length < argpos){throw _b_.TypeError.$factory(
+"not all arguments converted during string formatting")}}else if(nbph==0){throw _b_.TypeError.$factory(
+"not all arguments converted during string formatting")}
+return ret}
+str.__mro__=[_b_.object]
+str.__mul__=function(){var $=$B.args("__mul__",2,{self:null,other:null},["self","other"],arguments,{},null,null)
+if(! _b_.isinstance($.other,_b_.int)){throw _b_.TypeError.$factory(
+"Can't multiply sequence by non-int of type '"+
+$B.class_name($.other)+"'")}
+return $.self.valueOf().repeat($.other < 0 ? 0 :$.other)}
+str.__ne__=function(self,other){return other.valueOf()!==self.valueOf()}
+function __newobj__(){
+var $=$B.args('__newobj__',0,{},[],arguments,{},'args',null),args=$.args
+var res=args[1]
+res.__class__=args[0]
+return res}
+str.__reduce_ex__=function(self){return $B.fast_tuple([__newobj__,$B.fast_tuple([self.__class__ ||_b_.str,self]),_b_.None,_b_.None])}
+str.__repr__=function(self){
+var t=$B.special_string_repr,
+repl='',chars=to_chars(self)
+for(var i=0;i < chars.length;i++){var cp=_b_.ord(chars[i])
+if(t[cp]!==undefined){repl+=t[cp]}else if($B.is_unicode_cn(cp)){var s=cp.toString(16)
+while(s.length < 4){s='0'+s}
+repl+='\\u'+s}else if(cp < 0x20 ||(cp >=0x7f && cp < 0xa0)){cp=cp.toString(16)
+if(cp.length < 2){cp='0'+cp}
+repl+='\\x'+cp}else if(cp >=0x300 && cp <=0x36F){repl+="\u200B"+chars[i]+' '}else if(cp.toString(16)=='feff'){repl+='\\ufeff'}else{repl+=chars[i]}}
+var res=repl
+if(res.search('"')==-1 && res.search("'")==-1){return "'"+res+"'"}else if(self.search('"')==-1){return '"'+res+'"'}
+var qesc=new RegExp("'","g")
+res="'"+res.replace(qesc,"\\'")+"'"
+return res}
+str.__rmod__=function(){var $=$B.args('__rmod__',2,{self:null,other:null},['self','other'],arguments,{},null,null)
+return str.__mod__($.other,$.self)}
+str.__rmul__=function(self,other){if(_b_.isinstance(other,_b_.int)){other=_b_.int.numerator(other)
+var res=''
+while(other > 0){res+=self
+other--}
+return res}
+return _b_.NotImplemented}
+str.__setattr__=function(self,attr,value){if(typeof self==="string"){if(str.hasOwnProperty(attr)){throw _b_.AttributeError.$factory("'str' object attribute '"+
+attr+"' is read-only")}else{throw _b_.AttributeError.$factory(
+"'str' object has no attribute '"+attr+"'")}}
+_b_.dict.$setitem(self.__dict__,attr,value)
+return $N}
+str.__setitem__=function(self,attr,value){throw _b_.TypeError.$factory(
+"'str' object does not support item assignment")}
+var combining=[]
+for(var cp=0x300;cp <=0x36F;cp++){combining.push(String.fromCharCode(cp))}
+var combining_re=new RegExp("("+combining.join("|")+")","g")
+str.__str__=function(self){var repl='',chars=to_chars(self)
+if(chars.length==self.length){return self.replace(combining_re,"\u200B$1")}
+for(var i=0;i < chars.length;i++){var cp=_b_.ord(chars[i])
+if(cp >=0x300 && cp <=0x36F){repl+="\u200B"+chars[i]}else{repl+=chars[i]}}
+return repl}
+str.toString=function(){return "string!"}
+var $comp_func=function(self,other){if(typeof other !=="string"){return _b_.NotImplemented}
+return self > other}
+$comp_func+=""
+var $comps={">":"gt",">=":"ge","<":"lt","<=":"le"}
+for(var $op in $comps){eval("str.__"+$comps[$op]+'__ = '+$comp_func.replace(/>/gm,$op))}
+var $notimplemented=function(self,other){throw _b_.NotImplementedError.$factory(
+"OPERATOR not implemented for class str")}
+str.capitalize=function(self){var $=$B.args("capitalize",1,{self},["self"],arguments,{},null,null)
+if(self.length==0){return ""}
+return self.charAt(0).toUpperCase()+self.substr(1)}
+str.casefold=function(self){var $=$B.args("casefold",1,{self},["self"],arguments,{},null,null),res="",char,cf,chars=to_chars($.self)
+for(var i=0,len=chars.length;i < len;i++){char=chars[i]
+cf=$B.unicode_casefold[char]
+if(cf){cf.forEach(function(cp){res+=String.fromCharCode(cp)})}else{res+=char.toLowerCase()}}
+return res}
+str.center=function(){var $=$B.args("center",3,{self:null,width:null,fillchar:null},["self","width","fillchar"],arguments,{fillchar:" "},null,null),self=$.self
+if($.width <=self.length){return self}
+var pad=parseInt(($.width-self.length)/2),res=$.fillchar.repeat(pad)
+res+=self+res
+if(res.length < $.width){res+=$.fillchar}
+return res}
+str.count=function(){var $=$B.args("count",4,{self:null,sub:null,start:null,stop:null},["self","sub","start","stop"],arguments,{start:null,stop:null},null,null)
+if(!(typeof $.sub.valueOf()=="string")){throw _b_.TypeError.$factory("Can't convert '"+$B.class_name($.sub)+
+"' object to str implicitly")}
+var substr=$.self
+if($.start !==null){var _slice
+if($.stop !==null){_slice=_b_.slice.$factory($.start,$.stop)}else{_slice=_b_.slice.$factory($.start,$.self.length)}
+substr=str.__getitem__.apply(null,[$.self].concat(_slice))}else{if($.self.length+$.sub.length==0){return 1}}
+if($.sub.length==0){if($.start==$.self.length){return 1}else if(substr.length==0){return 0}
+return substr.length+1}
+var n=0,pos=0
+while(pos < substr.length){pos=substr.indexOf($.sub,pos)
+if(pos >=0){n++
+pos+=$.sub.length}else{break}}
+return n}
+str.encode=function(){var $=$B.args("encode",3,{self:null,encoding:null,errors:null},["self","encoding","errors"],arguments,{encoding:"utf-8",errors:"strict"},null,null)
+if($.encoding=="rot13" ||$.encoding=="rot_13"){
+var res=""
+for(var i=0,len=$.self.length;i < len ;i++){var char=$.self.charAt(i)
+if(("a" <=char && char <="m")||("A" <=char && char <="M")){res+=String.fromCharCode(String.charCodeAt(char)+13)}else if(("m" < char && char <="z")||
+("M" < char && char <="Z")){res+=String.fromCharCode(String.charCodeAt(char)-13)}else{res+=char}}
+return res}
+return _b_.bytes.__new__(_b_.bytes,$.self,$.encoding,$.errors)}
+str.endswith=function(){
+var $=$B.args("endswith",4,{self:null,suffix:null,start:null,end:null},["self","suffix","start","end"],arguments,{start:0,end:null},null,null)
+normalize_start_end($)
+var suffixes=$.suffix
+if(! _b_.isinstance(suffixes,_b_.tuple)){suffixes=[suffixes]}
+var chars=to_chars($.self),s=chars.slice($.start,$.end)
+for(var i=0,len=suffixes.length;i < len;i++){var suffix=suffixes[i]
+if(! _b_.isinstance(suffix,str)){throw _b_.TypeError.$factory(
+"endswith first arg must be str or a tuple of str, not int")}
+if(suffix.length <=s.length &&
+s.slice(s.length-suffix.length).join('')==suffix){return true}}
+return false}
+str.expandtabs=function(self,tabsize){var $=$B.args("expandtabs",2,{self:null,tabsize:null},["self","tabsize"],arguments,{tabsize:8},null,null)
+var s=$B.$GetInt($.tabsize),col=0,pos=0,res="",chars=to_chars(self)
+if(s==1){return self.replace(/\t/g," ")}
+while(pos < chars.length){var car=chars[pos]
+switch(car){case "\t":
+while(col % s > 0){res+=" ";
+col++}
+break
+case "\r":
+case "\n":
+res+=car
+col=0
+break
+default:
+res+=car
+col++
+break}
+pos++}
+return res}
+str.find=function(){
+var $=$B.args("str.find",4,{self:null,sub:null,start:null,end:null},["self","sub","start","end"],arguments,{start:0,end:null},null,null)
+check_str($.sub)
+normalize_start_end($)
+var len=str.__len__($.self),sub_len=str.__len__($.sub)
+if(sub_len==0 && $.start==len){return len}
+if(len+sub_len==0){return-1}
+var js_start=pypos2jspos($.self,$.start),js_end=pypos2jspos($.self,$.end),ix=$.self.substring(js_start,js_end).indexOf($.sub)
+if(ix==-1){return-1}
+return jspos2pypos($.self,js_start+ix)}
+$B.parse_format=function(fmt_string){
+var elts=fmt_string.split(":"),name,conv,spec,name_ext=[]
+if(elts.length==1){
+name=fmt_string}else{
+name=elts[0]
+spec=elts.splice(1).join(":")}
+var elts=name.split("!")
+if(elts.length > 1){name=elts[0]
+conv=elts[1]}
+if(name !==undefined){
+function name_repl(match){name_ext.push(match)
+return ""}
+var name_ext_re=/\.[_a-zA-Z][_a-zA-Z0-9]*|\[[_a-zA-Z][_a-zA-Z0-9]*\]|\[[0-9]+\]/g
+name=name.replace(name_ext_re,name_repl)}
+return{name:name,name_ext:name_ext,conv:conv,spec:spec ||"",string:fmt_string}}
+$B.split_format=function(self){
+var pos=0,_len=self.length,car,text="",parts=[],rank=0
+while(pos < _len){car=self.charAt(pos)
+if(car=="{" && self.charAt(pos+1)=="{"){
+text+="{"
+pos+=2}else if(car=="}" && self.charAt(pos+1)=="}"){
+text+="}"
+pos+=2}else if(car=="{"){
+parts.push(text)
+var end=pos+1,nb=1
+while(end < _len){if(self.charAt(end)=="{"){nb++;end++}
+else if(self.charAt(end)=="}"){nb--;end++
+if(nb==0){
+var fmt_string=self.substring(pos+1,end-1)
+var fmt_obj=$B.parse_format(fmt_string)
+fmt_obj.raw_name=fmt_obj.name
+fmt_obj.raw_spec=fmt_obj.spec
+if(!fmt_obj.name){fmt_obj.name=rank+""
+rank++}
+if(fmt_obj.spec !==undefined){
+function replace_nested(name,key){if(key==""){
+return "{"+rank+++"}"}
+return "{"+key+"}"}
+fmt_obj.spec=fmt_obj.spec.replace(/\{(.*?)\}/g,replace_nested)}
+parts.push(fmt_obj)
+text=""
+break}}else{end++}}
+if(nb > 0){throw _b_.ValueError.$factory("wrong format "+self)}
+pos=end}else{text+=car
+pos++}}
+if(text){parts.push(text)}
+return parts}
+str.format=function(self){
+var last_arg=$B.last(arguments)
+if(last_arg.$nat=="mapping"){var mapping=last_arg.mapping,getitem=$B.$getattr(mapping,"__getitem__")
+var args=[]
+for(var i=0,len=arguments.length-1;i < len;i++){args.push(arguments[i])}
+var $=$B.args("format",1,{self:null},["self"],args,{},"$args",null)}else{var $=$B.args("format",1,{self:null},["self"],arguments,{},"$args","$kw"),mapping=$.$kw,
+getitem=function(key){return _b_.dict.$getitem(mapping,key)}}
+var parts=$B.split_format($.self)
+var res="",fmt
+for(var i=0;i < parts.length;i++){
+if(typeof parts[i]=="string"){res+=parts[i];
+continue}
+fmt=parts[i]
+if(fmt.spec !==undefined){
+function replace_nested(name,key){if(/\d+/.exec(key)){
+return _b_.tuple.__getitem__($.$args,parseInt(key))}else{
+return _b_.dict.__getitem__($.$kw,key)}}
+fmt.spec=fmt.spec.replace(/\{(.*?)\}/g,replace_nested)}
+if(fmt.name.charAt(0).search(/\d/)>-1){
+var pos=parseInt(fmt.name),value=_b_.tuple.__getitem__($.$args,pos)}else{
+var value=getitem(fmt.name)}
+for(var j=0;j < fmt.name_ext.length;j++){var ext=fmt.name_ext[j]
+if(ext.charAt(0)=="."){
+value=$B.$getattr(value,ext.substr(1))}else{
+var key=ext.substr(1,ext.length-2)
+if(key.charAt(0).search(/\d/)>-1){key=parseInt(key)}
+value=$B.$getattr(value,"__getitem__")(key)}}
+if(fmt.conv=="a"){value=_b_.ascii(value)}
+else if(fmt.conv=="r"){value=_b_.repr(value)}
+else if(fmt.conv=="s"){value=_b_.str.$factory(value)}
+if(value.$is_class ||value.$factory){
+res+=value.__class__.__format__(value,fmt.spec)}else{res+=$B.$getattr(value,"__format__")(fmt.spec)}}
+return res}
+str.format_map=function(self,mapping){var $=$B.args("format_map",2,{self:null,mapping:null},['self','mapping'],arguments,{},null,null)
+return str.format(self,{$nat:'mapping',mapping})}
+str.index=function(self){
+var res=str.find.apply(null,arguments)
+if(res===-1){throw _b_.ValueError.$factory("substring not found")}
+return res}
+str.isascii=function(self){
+for(var i=0,len=self.length;i < len;i++){if(self.charCodeAt(i)> 127){return false}}
+return true}
+str.isalnum=function(self){
+var $=$B.args("isalnum",1,{self:null},["self"],arguments,{},null,null),cp
+for(var char of to_chars(self)){cp=_b_.ord(char)
+if(unicode_tables.Ll[cp]||
+unicode_tables.Lu[cp]||
+unicode_tables.Lm[cp]||
+unicode_tables.Lt[cp]||
+unicode_tables.Lo[cp]||
+unicode_tables.Nd[cp]||
+unicode_tables.digits[cp]||
+unicode_tables.numeric[cp]){continue}
+return false}
+return true}
+str.isalpha=function(self){
+var $=$B.args("isalpha",1,{self:null},["self"],arguments,{},null,null),cp
+for(var char of to_chars(self)){cp=_b_.ord(char)
+if(unicode_tables.Ll[cp]||
+unicode_tables.Lu[cp]||
+unicode_tables.Lm[cp]||
+unicode_tables.Lt[cp]||
+unicode_tables.Lo[cp]){continue}
+return false}
+return true}
+str.isdecimal=function(self){
+var $=$B.args("isdecimal",1,{self:null},["self"],arguments,{},null,null),cp
+for(var char of to_chars(self)){cp=_b_.ord(char)
+if(! unicode_tables.Nd[cp]){return false}}
+return self.length > 0}
+str.isdigit=function(self){
+var $=$B.args("isdigit",1,{self:null},["self"],arguments,{},null,null),cp
+for(var char of to_chars(self)){cp=_b_.ord(char)
+if(! unicode_tables.digits[cp]){return false}}
+return self.length > 0}
+str.isidentifier=function(self){
+var $=$B.args("isidentifier",1,{self:null},["self"],arguments,{},null,null)
+if(self.length==0){return false}
+var chars=to_chars(self)
+if(unicode_tables.XID_Start[_b_.ord(chars[0])]===undefined){return false}else{for(var char of chars){var cp=_b_.ord(char)
+if(unicode_tables.XID_Continue[cp]===undefined){return false}}}
+return true}
+str.islower=function(self){
+var $=$B.args("islower",1,{self:null},["self"],arguments,{},null,null),has_cased=false,cp
+for(var char of to_chars(self)){cp=_b_.ord(char)
+if(unicode_tables.Ll[cp]){has_cased=true
+continue}else if(unicode_tables.Lu[cp]||unicode_tables.Lt[cp]){return false}}
+return has_cased}
+str.isnumeric=function(self){
+var $=$B.args("isnumeric",1,{self:null},["self"],arguments,{},null,null)
+for(var char of to_chars(self)){if(! unicode_tables.numeric[_b_.ord(char)]){return false}}
+return self.length > 0}
+var unprintable={},unprintable_gc=['Cc','Cf','Co','Cs','Zl','Zp','Zs']
+str.isprintable=function(self){
+if(Object.keys(unprintable).length==0){for(var i=0;i < unprintable_gc.length;i++){var table=unicode_tables[unprintable_gc[i]]
+for(var cp in table){unprintable[cp]=true}}
+unprintable[32]=true}
+var $=$B.args("isprintable",1,{self:null},["self"],arguments,{},null,null)
+for(var char of to_chars(self)){if(unprintable[_b_.ord(char)]){return false}}
+return true}
+str.isspace=function(self){
+var $=$B.args("isspace",1,{self:null},["self"],arguments,{},null,null),cp
+for(var char of to_chars(self)){cp=_b_.ord(char)
+if(! unicode_tables.Zs[cp]&&
+$B.unicode_bidi_whitespace.indexOf(cp)==-1){return false}}
+return self.length > 0}
+str.istitle=function(self){
+var $=$B.args("istitle",1,{self:null},["self"],arguments,{},null,null)
+return self.length > 0 && str.title(self)==self}
+str.isupper=function(self){
+var $=$B.args("islower",1,{self:null},["self"],arguments,{},null,null),is_upper=false,cp
+for(var char of to_chars(self)){cp=_b_.ord(char)
+if(unicode_tables.Lu[cp]){is_upper=true
+continue}else if(unicode_tables.Ll[cp]||unicode_tables.Lt[cp]){return false}}
+return is_upper}
+str.join=function(){var $=$B.args("join",2,{self:null,iterable:null},["self","iterable"],arguments,{},null,null)
+var iterable=_b_.iter($.iterable),res=[],count=0
+while(1){try{var obj2=_b_.next(iterable)
+if(! _b_.isinstance(obj2,str)){throw _b_.TypeError.$factory("sequence item "+count+
+": expected str instance, "+$B.class_name(obj2)+
+" found")}
+res.push(obj2)}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
+else{throw err}}}
+return res.join($.self)}
+str.ljust=function(self){var $=$B.args("ljust",3,{self:null,width:null,fillchar:null},["self","width","fillchar"],arguments,{fillchar:" "},null,null),len=str.__len__(self)
+if($.width <=len){return self}
+return self+$.fillchar.repeat($.width-len)}
+str.lower=function(self){var $=$B.args("lower",1,{self:null},["self"],arguments,{},null,null)
+return self.toLowerCase()}
+str.lstrip=function(self,x){var $=$B.args("lstrip",2,{self:null,chars:null},["self","chars"],arguments,{chars:_b_.None},null,null),self=$.self,chars=$.chars
+if(chars===_b_.None){return self.trimStart()}
+while(self.length > 0){var flag=false
+for(var char of chars){if(self.startsWith(char)){self=self.substr(char.length)
+flag=true
+break}}
+if(! flag){return $.self.surrogates ? $B.String(self):self}}
+return ''}
+str.maketrans=function(){var $=$B.args("maketrans",3,{x:null,y:null,z:null},["x","y","z"],arguments,{y:null,z:null},null,null)
+var _t=$B.empty_dict()
+if($.y===null && $.z===null){
+if(! _b_.isinstance($.x,_b_.dict)){throw _b_.TypeError.$factory(
+"maketrans only argument must be a dict")}
+var items=_b_.list.$factory(_b_.dict.items($.x))
+for(var i=0,len=items.length;i < len;i++){var k=items[i][0],v=items[i][1]
+if(! _b_.isinstance(k,_b_.int)){if(_b_.isinstance(k,_b_.str)&& k.length==1){k=_b_.ord(k)}else{throw _b_.TypeError.$factory("dictionary key "+k+
+" is not int or 1-char string")}}
+if(v !==_b_.None && ! _b_.isinstance(v,[_b_.int,_b_.str])){throw _b_.TypeError.$factory("dictionary value "+v+
+" is not None, integer or string")}
+_b_.dict.$setitem(_t,k,v)}
+return _t}else{
+if(!(_b_.isinstance($.x,_b_.str)&& _b_.isinstance($.y,_b_.str))){throw _b_.TypeError.$factory("maketrans arguments must be strings")}else if($.x.length !==$.y.length){throw _b_.TypeError.$factory(
+"maketrans arguments must be strings or same length")}else{var toNone={}
+if($.z !==null){
+if(! _b_.isinstance($.z,_b_.str)){throw _b_.TypeError.$factory(
+"maketrans third argument must be a string")}
+for(var i=0,len=$.z.length;i < len;i++){toNone[_b_.ord($.z.charAt(i))]=true}}
+for(var i=0,len=$.x.length;i < len;i++){var key=_b_.ord($.x.charAt(i)),value=$.y.charCodeAt(i)
+_b_.dict.$setitem(_t,key,value)}
+for(var k in toNone){_b_.dict.$setitem(_t,parseInt(k),_b_.None)}
+return _t}}}
+str.maketrans.$type="staticmethod"
+str.partition=function(){var $=$B.args("partition",2,{self:null,sep:null},["self","sep"],arguments,{},null,null)
+if($.sep==""){throw _b_.ValueError.$factory("empty separator")}
+check_str($.sep)
+var chars=to_chars($.self),i=$.self.indexOf($.sep)
+if(i==-1){return _b_.tuple.$factory([$.self,"",""])}
+return _b_.tuple.$factory([chars.slice(0,i).join(''),$.sep,chars.slice(i+$.sep.length).join('')])}
+str.removeprefix=function(){var $=$B.args("removeprefix",2,{self:null,prefix:null},["self","prefix"],arguments,{},null,null)
+if(!_b_.isinstance($.prefix,str)){throw _b_.ValueError.$factory("prefix should be str, not "+
+`'${$B.class_name($.prefix)}'`)}
+if(str.startswith($.self,$.prefix)){return $.self.substr($.prefix.length)}
+return $.self.substr(0)}
+str.removesuffix=function(){var $=$B.args("removesuffix",2,{self:null,prefix:null},["self","suffix"],arguments,{},null,null)
+if(!_b_.isinstance($.suffix,str)){throw _b_.ValueError.$factory("suffix should be str, not "+
+`'${$B.class_name($.prefix)}'`)}
+if($.suffix.length > 0 && str.endswith($.self,$.suffix)){return $.self.substr(0,$.self.length-$.suffix.length)}
+return $.self.substr(0)}
+function $re_escape(str){var specials="[.*+?|()$^"
+for(var i=0,len=specials.length;i < len;i++){var re=new RegExp("\\"+specials.charAt(i),"g")
+str=str.replace(re,"\\"+specials.charAt(i))}
+return str}
+str.replace=function(self,old,_new,count){
+var $=$B.args("replace",4,{self:null,old:null,new:null,count:null},["self","old","new","count"],arguments,{count:-1},null,null),count=$.count,self=$.self,old=$.old,_new=$.new
+check_str(old,"replace() argument 1 ")
+check_str(_new,"replace() argument 2 ")
+if(! _b_.isinstance(count,[_b_.int,_b_.float])){throw _b_.TypeError.$factory("'"+$B.class_name(count)+
+"' object cannot be interpreted as an integer")}else if(_b_.isinstance(count,_b_.float)){throw _b_.TypeError.$factory("integer argument expected, got float")}
+if(count==0){return self}
+if(count.__class__==$B.long_int){count=parseInt(count.value)}
+if(old==""){if(_new==""){return self}
+if(self==""){return _new}
+var elts=self.split("")
+if(count >-1 && elts.length >=count){var rest=elts.slice(count).join("")
+return _new+elts.slice(0,count).join(_new)+rest}else{return _new+elts.join(_new)+_new}}else{var elts=str.split(self,old,count)}
+var res=self,pos=-1
+if(old.length==0){var res=_new
+for(var i=0;i < elts.length;i++){res+=elts[i]+_new}
+return res+rest}
+if(count < 0){count=res.length}
+while(count > 0){pos=res.indexOf(old,pos)
+if(pos < 0){break}
+res=res.substr(0,pos)+_new+res.substr(pos+old.length)
+pos=pos+_new.length
+count--}
+return res}
+str.rfind=function(self,substr){
+var $=$B.args("rfind",4,{self:null,sub:null,start:null,end:null},["self","sub","start","end"],arguments,{start:0,end:null},null,null)
+normalize_start_end($)
+check_str($.sub)
+var len=str.__len__($.self),sub_len=str.__len__($.sub)
+if(sub_len==0){if($.js_start > len){return-1}else{return str.__len__($.self)}}
+var js_start=pypos2jspos($.self,$.start),js_end=pypos2jspos($.self,$.end),ix=$.self.substring(js_start,js_end).lastIndexOf($.sub)
+if(ix==-1){return-1}
+return jspos2pypos($.self,js_start+ix)-$.start}
+str.rindex=function(){
+var res=str.rfind.apply(null,arguments)
+if(res==-1){throw _b_.ValueError.$factory("substring not found")}
+return res}
+str.rjust=function(self){var $=$B.args("rjust",3,{self:null,width:null,fillchar:null},["self","width","fillchar"],arguments,{fillchar:" "},null,null)
+var len=str.__len__(self)
+if($.width <=len){return self}
+return $B.String($.fillchar.repeat($.width-len)+self)}
+str.rpartition=function(self,sep){var $=$B.args("rpartition",2,{self:null,sep:null},["self","sep"],arguments,{},null,null)
+check_str($.sep)
+var self=reverse($.self),sep=reverse($.sep)
+var items=str.partition(self,sep).reverse()
+for(var i=0;i < items.length;i++){items[i]=items[i].split("").reverse().join("")}
+return items}
+str.rsplit=function(self){var $=$B.args("rsplit",3,{self:null,sep:null,maxsplit:null},["self","sep","maxsplit"],arguments,{sep:_b_.None,maxsplit:-1},null,null),sep=$.sep
+var rev_str=reverse($.self),rev_sep=sep===_b_.None ? sep :reverse($.sep),rev_res=str.split(rev_str,rev_sep,$.maxsplit)
+rev_res.reverse()
+for(var i=0;i < rev_res.length;i++){rev_res[i]=reverse(rev_res[i])}
+return rev_res}
+str.rstrip=function(self,x){var $=$B.args("rstrip",2,{self:null,chars:null},["self","chars"],arguments,{chars:_b_.None},null,null),self=$.self,chars=$.chars
+if(chars===_b_.None){return self.trimEnd()}
+while(self.length > 0){var flag=false
+for(var char of chars){if(self.endsWith(char)){self=self.substr(0,self.length-char.length)
+flag=true
+break}}
+if(! flag){return $.self.surrogates ? $B.String(self):self}}
+return ''}
+str.split=function(){var $=$B.args("split",3,{self:null,sep:null,maxsplit:null},["self","sep","maxsplit"],arguments,{sep:_b_.None,maxsplit:-1},null,null),sep=$.sep,maxsplit=$.maxsplit,self=$.self,pos=0
+if(maxsplit.__class__===$B.long_int){maxsplit=parseInt(maxsplit.value)}
+if(sep==""){throw _b_.ValueError.$factory("empty separator")}
+if(sep===_b_.None){var res=[]
+while(pos < self.length && self.charAt(pos).search(/\s/)>-1){pos++}
+if(pos===self.length-1){return[self]}
+var name=""
+while(1){if(self.charAt(pos).search(/\s/)==-1){if(name==""){name=self.charAt(pos)}else{name+=self.charAt(pos)}}else{if(name !==""){res.push(name)
+if(maxsplit !==-1 && res.length==maxsplit+1){res.pop()
+res.push(name+self.substr(pos))
+return res}
+name=""}}
+pos++
+if(pos > self.length-1){if(name){res.push(name)}
+break}}
+return res.map($B.String)}else{var res=[],s="",seplen=sep.length
+if(maxsplit==0){return[self]}
+while(pos < self.length){if(self.substr(pos,seplen)==sep){res.push(s)
+pos+=seplen
+if(maxsplit >-1 && res.length >=maxsplit){res.push(self.substr(pos))
+return res.map($B.String)}
+s=""}else{s+=self.charAt(pos)
+pos++}}
+res.push(s)
+return res.map($B.String)}}
+str.splitlines=function(self){var $=$B.args('splitlines',2,{self:null,keepends:null},['self','keepends'],arguments,{keepends:false},null,null)
+if(!_b_.isinstance($.keepends,[_b_.bool,_b_.int])){throw _b_.TypeError('integer argument expected, got '+
+$B.get_class($.keepends).__name)}
+var keepends=_b_.int.$factory($.keepends),res=[],self=$.self,start=0,pos=0
+if(!self.length){return res}
+while(pos < self.length){if(self.substr(pos,2)=='\r\n'){res.push(self.slice(start,keepends ? pos+2 :pos))
+start=pos=pos+2}else if(self[pos]=='\r' ||self[pos]=='\n'){res.push(self.slice(start,keepends ? pos+1 :pos))
+start=pos=pos+1}else{pos++}}
+if(start < self.length){res.push(self.slice(start))}
+return res.map($B.String)}
+str.startswith=function(){
+var $=$B.args("startswith",4,{self:null,prefix:null,start:null,end:null},["self","prefix","start","end"],arguments,{start:0,end:null},null,null)
+normalize_start_end($)
+var prefixes=$.prefix
+if(! _b_.isinstance(prefixes,_b_.tuple)){prefixes=[prefixes]}
+var s=$.self.substring($.start,$.end)
+for(var prefix of prefixes){if(! _b_.isinstance(prefix,str)){throw _b_.TypeError.$factory("endswith first arg must be str "+
+"or a tuple of str, not int")}
+if(s.substr(0,prefix.length)==prefix){return true}}
+return false}
+str.strip=function(){var $=$B.args("strip",2,{self:null,chars:null},["self","chars"],arguments,{chars:_b_.None},null,null)
+if($.chars===_b_.None){return $.self.trim()}
+return str.rstrip(str.lstrip($.self,$.chars),$.chars)}
+str.swapcase=function(self){var $=$B.args("swapcase",1,{self},["self"],arguments,{},null,null),res="",cp
+for(var char of to_chars(self)){cp=_b_.ord(char)
+if(unicode_tables.Ll[cp]){res+=char.toUpperCase()}else if(unicode_tables.Lu[cp]){res+=char.toLowerCase()}else{res+=char}}
+return res}
+str.title=function(self){var $=$B.args("title",1,{self},["self"],arguments,{},null,null),state,cp,res=""
+for(var char of to_chars(self)){cp=_b_.ord(char)
+if(unicode_tables.Ll[cp]){if(! state){res+=char.toUpperCase()
+state="word"}else{res+=char}}else if(unicode_tables.Lu[cp]||unicode_tables.Lt[cp]){res+=state ? char.toLowerCase():char
+state="word"}else{state=null
+res+=char}}
+return res}
+str.translate=function(self,table){var res=[],getitem=$B.$getattr(table,"__getitem__"),cp
+for(var char of to_chars(self)){cp=_b_.ord(char)
+try{var repl=getitem(cp)
+if(repl !==_b_.None){if(typeof repl=="string"){res.push(repl)}else if(typeof repl=="number"){res.push(String.fromCharCode(repl))}}}catch(err){res.push(char)}}
+return res.join("")}
+str.upper=function(self){var $=$B.args("upper",1,{self:null},["self"],arguments,{},null,null)
+return self.toUpperCase()}
+str.zfill=function(self,width){var $=$B.args("zfill",2,{self:null,width:null},["self","width"],arguments,{},null,null),len=str.__len__(self)
+if($.width <=len){return self}
+switch(self.charAt(0)){case "+":
+case "-":
+return self.charAt(0)+
+"0".repeat($.width-len)+self.substr(1)
+default:
+return "0".repeat($.width-len)+self}}
+str.$factory=function(arg,encoding,errors){if(arguments.length==0){return ""}
+if(arg===undefined){return $B.UndefinedClass.__str__()}else if(arg===null){return ''}
+if(encoding !==undefined){
+var $=$B.args("str",3,{arg:null,encoding:null,errors:null},["arg","encoding","errors"],arguments,{encoding:"utf-8",errors:"strict"},null,null),encoding=$.encoding,errors=$.errors}
+if(typeof arg=="string" ||arg instanceof String ||
+typeof arg=="number"){if(isFinite(arg)){return arg.toString()}}
+try{if(arg.$is_class ||arg.$factory){
+var func=$B.$getattr(arg.__class__,"__str__")
+return func(arg)}
+if(arg.__class__ && arg.__class__===_b_.bytes &&
+encoding !==undefined){
+return _b_.bytes.decode(arg,$.encoding,$.errors)}
+var klass=arg.__class__ ||$B.get_class(arg)
+if(klass===undefined){return $B.JSObj.__str__($B.JSObj.$factory(arg))}
+var method=$B.$getattr(klass ,"__str__",null)
+if(method===null ||
+(arg.__class__ && arg.__class__ !==_b_.object &&
+method===_b_.object.__str__)){var method=$B.$getattr(klass,"__repr__")}}
+catch(err){console.log("no __str__ for",arg)
+console.log("err ",err)
+if($B.debug > 1){console.log(err)}
+console.log("Warning - no method __str__ or __repr__, "+
+"default to toString",arg)
+throw err}
+return $B.$call(method)(arg)}
+str.__new__=function(cls){if(cls===undefined){throw _b_.TypeError.$factory("str.__new__(): not enough arguments")}
+return{__class__:cls}}
+$B.set_func_names(str,"builtins")
+var StringSubclass=$B.StringSubclass={__class__:_b_.type,__mro__:[_b_.object],$infos:{__module__:"builtins",__name__:"str"},$is_class:true}
+for(var $attr in str){if(typeof str[$attr]=="function"){StringSubclass[$attr]=(function(attr){return function(){var args=[],pos=0
+if(arguments.length > 0){var args=[arguments[0].valueOf()],pos=1
+for(var i=1,len=arguments.length;i < len;i++){args[pos++]=arguments[i]}}
+return str[attr].apply(null,args)}})($attr)}}
+StringSubclass.__new__=function(cls){return{__class__:cls}}
+$B.set_func_names(StringSubclass,"builtins")
+_b_.str=str
+$B.parse_format_spec=function(spec){if(spec==""){this.empty=true}else{var pos=0,aligns="<>=^",digits="0123456789",types="bcdeEfFgGnosxX%",align_pos=aligns.indexOf(spec.charAt(0))
+if(align_pos !=-1){if(spec.charAt(1)&& aligns.indexOf(spec.charAt(1))!=-1){
+this.fill=spec.charAt(0)
+this.align=spec.charAt(1)
+pos=2}else{
+this.align=aligns[align_pos]
+this.fill=" "
+pos++}}else{align_pos=aligns.indexOf(spec.charAt(1))
+if(spec.charAt(1)&& align_pos !=-1){
+this.align=aligns[align_pos]
+this.fill=spec.charAt(0)
+pos=2}}
+var car=spec.charAt(pos)
+if(car=="+" ||car=="-" ||car==" "){this.sign=car
+pos++
+car=spec.charAt(pos)}
+if(car=="#"){this.alternate=true;pos++;car=spec.charAt(pos)}
+if(car=="0"){
+this.fill="0"
+if(align_pos==-1){this.align="="}
+pos++
+car=spec.charAt(pos)}
+while(car && digits.indexOf(car)>-1){if(this.width===undefined){this.width=car}else{this.width+=car}
+pos++
+car=spec.charAt(pos)}
+if(this.width !==undefined){this.width=parseInt(this.width)}
+if(this.width===undefined && car=="{"){
+var end_param_pos=spec.substr(pos).search("}")
+this.width=spec.substring(pos,end_param_pos)
+console.log("width","["+this.width+"]")
+pos+=end_param_pos+1}
+if(car==","){this.comma=true
+pos++
+car=spec.charAt(pos)}
+if(car=="."){if(digits.indexOf(spec.charAt(pos+1))==-1){throw _b_.ValueError.$factory(
+"Missing precision in format spec")}
+this.precision=spec.charAt(pos+1)
+pos+=2
+car=spec.charAt(pos)
+while(car && digits.indexOf(car)>-1){this.precision+=car
+pos++
+car=spec.charAt(pos)}
+this.precision=parseInt(this.precision)}
+if(car && types.indexOf(car)>-1){this.type=car
+pos++
+car=spec.charAt(pos)}
+if(pos !==spec.length){throw _b_.ValueError.$factory("Invalid format specifier: "+spec)}}
+this.toString=function(){return(this.fill===undefined ? "" :_b_.str.$factory(this.fill))+
+(this.align ||"")+
+(this.sign ||"")+
+(this.alternate ? "#" :"")+
+(this.sign_aware ? "0" :"")+
+(this.width ||"")+
+(this.comma ? "," :"")+
+(this.precision ? "."+this.precision :"")+
+(this.type ||"")}}
+$B.format_width=function(s,fmt){if(fmt.width && s.length < fmt.width){var fill=fmt.fill ||" ",align=fmt.align ||"<",missing=fmt.width-s.length
+switch(align){case "<":
+return s+fill.repeat(missing)
+case ">":
+return fill.repeat(missing)+s
+case "=":
+if("+-".indexOf(s.charAt(0))>-1){return s.charAt(0)+fill.repeat(missing)+s.substr(1)}else{return fill.repeat(missing)+s}
+case "^":
+var left=parseInt(missing/2)
+return fill.repeat(left)+s+fill.repeat(missing-left)}}
+return s}
+function fstring_expression(start){this.type="expression"
+this.start=start
+this.expression=""
+this.conversion=null
+this.fmt=null}
+function fstring_error(msg,pos){error=Error(msg)
+error.position=pos
+throw error}
+$B.parse_fstring=function(string){
+var elts=[],pos=0,current="",ctype=null,nb_braces=0,expr_start,car
+while(pos < string.length){if(ctype===null){car=string.charAt(pos)
+if(car=="{"){if(string.charAt(pos+1)=="{"){ctype="string"
+current="{"
+pos+=2}else{ctype="expression"
+expr_start=pos+1
+nb_braces=1
+pos++}}else if(car=="}"){if(string.charAt(pos+1)==car){ctype="string"
+current="}"
+pos+=2}else{fstring_error(" f-string: single '}' is not allowed",pos)}}else{ctype="string"
+current=car
+pos++}}else if(ctype=="string"){
+var i=pos
+while(i < string.length){car=string.charAt(i)
+if(car=="{"){if(string.charAt(i+1)=="{"){current+="{"
+i+=2}else{elts.push(current)
+ctype="expression"
+expr_start=i+1
+pos=i+1
+break}}else if(car=="}"){if(string.charAt(i+1)==car){current+=car
+i+=2}else{fstring_error(" f-string: single '}' is not allowed",pos)}}else{current+=car
+i++}}
+pos=i+1}else if(ctype=="debug"){
+while(string.charAt(i)==" "){i++}
+if(string.charAt(i)=="}"){
+elts.push(current)
+ctype=null
+current=""
+pos=i+1}}else{
+var i=pos,nb_braces=1,nb_paren=0,current=new fstring_expression(expr_start)
+while(i < string.length){car=string.charAt(i)
+if(car=="{" && nb_paren==0){nb_braces++
+current.expression+=car
+i++}else if(car=="}" && nb_paren==0){nb_braces-=1
+if(nb_braces==0){
+if(current.expression==""){fstring_error("f-string: empty expression not allowed",pos)}
+elts.push(current)
+ctype=null
+current=""
+pos=i+1
+break}
+current.expression+=car
+i++}else if(car=="\\"){
+throw Error("f-string expression part cannot include a"+
+" backslash")}else if(nb_paren==0 && car=="!" && current.fmt===null &&
+":}".indexOf(string.charAt(i+2))>-1){if(current.expression.length==0){throw Error("f-string: empty expression not allowed")}
+if("ars".indexOf(string.charAt(i+1))==-1){throw Error("f-string: invalid conversion character:"+
+" expected 's', 'r', or 'a'")}else{current.conversion=string.charAt(i+1)
+i+=2}}else if(car=="(" ||car=='['){nb_paren++
+current.expression+=car
+i++}else if(car==")" ||car==']'){nb_paren--
+current.expression+=car
+i++}else if(car=='"'){
+if(string.substr(i,3)=='"""'){var end=string.indexOf('"""',i+3)
+if(end==-1){fstring_error("f-string: unterminated string",pos)}else{var trs=string.substring(i,end+3)
+trs=trs.replace("\n","\\n\\")
+current.expression+=trs
+i=end+3}}else{var end=string.indexOf('"',i+1)
+if(end==-1){fstring_error("f-string: unterminated string",pos)}else{current.expression+=string.substring(i,end+1)
+i=end+1}}}else if(nb_paren==0 && car==":"){
+current.fmt=true
+var cb=0,fmt_complete=false
+for(var j=i+1;j < string.length;j++){if(string[j]=='{'){if(string[j+1]=='{'){j+=2}else{cb++}}else if(string[j]=='}'){if(string[j+1]=='}'){j+=2}else if(cb==0){fmt_complete=true
+var fmt=string.substring(i+1,j)
+current.format=$B.parse_fstring(fmt)
+i=j
+break}else{cb--}}}
+if(! fmt_complete){fstring_error('invalid format',pos)}}else if(car=="="){
+var ce=current.expression,last_char=ce.charAt(ce.length-1),last_char_re=('()'.indexOf(last_char)>-1 ? "\\" :"")+last_char
+if(ce.length==0 ||
+nb_paren > 0 ||
+string.charAt(i+1)=="=" ||
+"=!<>:".search(last_char_re)>-1){
+current.expression+=car
+i+=1}else{
+tail=car
+while(string.charAt(i+1).match(/\s/)){tail+=string.charAt(i+1)
+i++}
+elts.push(current.expression+tail)
+while(ce.match(/\s$/)){ce=ce.substr(0,ce.length-1)}
+current.expression=ce
+ctype="debug"
+i++}}else{current.expression+=car
+i++}}
+if(nb_braces > 0){fstring_error("f-string: expected '}'",pos)}}}
+if(current.length > 0){elts.push(current)}
+for(var elt of elts){if(typeof elt=="object"){if(elt.fmt_pos !==undefined &&
+elt.expression.charAt(elt.fmt_pos)!=':'){console.log('mauvais format',string,elts)
+throw Error()}}}
+return elts}
+var _chr=$B.codepoint2jsstring=function(i){if(i >=0x10000 && i <=0x10FFFF){var code=(i-0x10000)
+return String.fromCodePoint(0xD800 |(code >> 10))+
+String.fromCodePoint(0xDC00 |(code & 0x3FF))}else{return String.fromCodePoint(i)}}
+var _ord=$B.jsstring2codepoint=function(c){if(c.length==1){return c.charCodeAt(0)}
+var code=0x10000
+code+=(c.charCodeAt(0)& 0x03FF)<< 10
+code+=(c.charCodeAt(1)& 0x03FF)
+return code}})(__BRYTHON__)
+;
+;(function($B){var _b_=$B.builtins
+function $err(op,other){var msg="unsupported operand type(s) for "+op+
+" : 'int' and '"+$B.class_name(other)+"'"
+throw _b_.TypeError.$factory(msg)}
+function int_value(obj){
+if(typeof obj=="boolean"){return obj ? 1 :0}
+return obj.$brython_value !==undefined ? obj.$brython_value :obj}
+var int={__class__:_b_.type,__dir__:_b_.object.__dir__,__mro__:[_b_.object],$infos:{__module__:"builtins",__name__:"int"},$is_class:true,$native:true,$descriptors:{"numerator":true,"denominator":true,"imag":true,"real":true}}
+int.as_integer_ratio=function(){var $=$B.args("as_integer_ratio",1,{self:null},["self"],arguments,{},null,null)
+return $B.$list([$.self,1])}
+int.from_bytes=function(){var $=$B.args("from_bytes",3,{bytes:null,byteorder:null,signed:null},["bytes","byteorder","signed"],arguments,{signed:false},null,null)
+var x=$.bytes,byteorder=$.byteorder,signed=$.signed,_bytes,_len
+if(_b_.isinstance(x,[_b_.bytes,_b_.bytearray])){_bytes=x.source
+_len=x.source.length}else{_bytes=_b_.list.$factory(x)
+_len=_bytes.length
+for(var i=0;i < _len;i++){_b_.bytes.$factory([_bytes[i]])}}
+if(byteorder=="big"){_bytes.reverse()}else if(byteorder !="little"){throw _b_.ValueError.$factory(
+"byteorder must be either 'little' or 'big'")}
+var num=_bytes[0]
+if(signed && num >=128){num=num-256}
+var _mult=256
+for(var i=1;i < _len;i++){num=$B.add($B.mul(_mult,_bytes[i]),num)
+_mult=$B.mul(_mult,256)}
+if(! signed){return num}
+if(_bytes[_len-1]< 128){return num}
+return $B.sub(num,_mult)}
+int.to_bytes=function(){var $=$B.args("to_bytes",3,{self:null,len:null,byteorder:null,signed:null},["self","len","byteorder","*","signed"],arguments,{signed:false},null,null),self=$.self,len=$.len,byteorder=$.byteorder,signed=$.signed
+if(! _b_.isinstance(len,_b_.int)){throw _b_.TypeError.$factory("integer argument expected, got "+
+$B.class_name(len))}
+if(["little","big"].indexOf(byteorder)==-1){throw _b_.ValueError.$factory(
+"byteorder must be either 'little' or 'big'")}
+if(_b_.isinstance(self,$B.long_int)){return $B.long_int.to_bytes(self,len,byteorder,signed)}
+if(self < 0){if(! signed){throw _b_.OverflowError.$factory(
+"can't convert negative int to unsigned")}
+self=Math.pow(256,len)+self}
+var res=[],value=self
+while(value > 0){var quotient=Math.floor(value/256),rest=value-256*quotient
+res.push(rest)
+if(res.length > len){throw _b_.OverflowError.$factory("int too big to convert")}
+value=quotient}
+while(res.length < len){res.push(0)}
+if(byteorder=="big"){res.reverse()}
+return{
+__class__:_b_.bytes,source:res}}
+int.__abs__=function(self){return _b_.abs(self)}
+int.__add__=function(self,other){self=int_value(self)
+if(_b_.isinstance(other,int)){if(other.__class__==$B.long_int){return $B.long_int.__add__($B.long_int.$factory(self),$B.long_int.$factory(other))}
+other=int_value(other)
+var res=self+other
+if(res > $B.min_int && res < $B.max_int){return res}else{return $B.long_int.__add__($B.long_int.$factory(self),$B.long_int.$factory(other))}}
+return _b_.NotImplemented}
+int.__bool__=function(self){return int_value(self).valueOf()==0 ? false :true}
+int.__ceil__=function(self){return Math.ceil(int_value(self))}
+int.__divmod__=function(self,other){if(! _b_.isinstance(other,int)){return _b_.NotImplemented}
+return $B.fast_tuple([int.__floordiv__(self,other),int.__mod__(self,other)])}
+int.__eq__=function(self,other){
+if(_b_.isinstance(other,int)){return self.valueOf()==int_value(other).valueOf()}
+if(_b_.isinstance(other,_b_.float)){return self.valueOf()==other.valueOf()}
+if(_b_.isinstance(other,_b_.complex)){if(other.$imag !=0){return _b_.False}
+return self.valueOf()==other.$real}
+return _b_.NotImplemented}
+int.__float__=function(self){return new Number(self)}
+function preformat(self,fmt){if(fmt.empty){return _b_.str.$factory(self)}
+if(fmt.type && 'bcdoxXn'.indexOf(fmt.type)==-1){throw _b_.ValueError.$factory("Unknown format code '"+fmt.type+
+"' for object of type 'int'")}
+var res
+switch(fmt.type){case undefined:
+case "d":
+res=self.toString()
+break
+case "b":
+res=(fmt.alternate ? "0b" :"")+self.toString(2)
+break
+case "c":
+res=_b_.chr(self)
+break
+case "o":
+res=(fmt.alternate ? "0o" :"")+self.toString(8)
+break
+case "x":
+res=(fmt.alternate ? "0x" :"")+self.toString(16)
+break
+case "X":
+res=(fmt.alternate ? "0X" :"")+self.toString(16).toUpperCase()
+break
+case "n":
+return self }
+if(fmt.sign !==undefined){if((fmt.sign==" " ||fmt.sign=="+" )&& self >=0){res=fmt.sign+res}}
+return res}
+int.__format__=function(self,format_spec){var fmt=new $B.parse_format_spec(format_spec)
+if(fmt.type && 'eEfFgG%'.indexOf(fmt.type)!=-1){
+return _b_.float.__format__(self,format_spec)}
+fmt.align=fmt.align ||">"
+var res=preformat(self,fmt)
+if(fmt.comma){var sign=res[0]=="-" ? "-" :"",rest=res.substr(sign.length),len=rest.length,nb=Math.ceil(rest.length/3),chunks=[]
+for(var i=0;i < nb;i++){chunks.push(rest.substring(len-3*i-3,len-3*i))}
+chunks.reverse()
+res=sign+chunks.join(",")}
+return $B.format_width(res,fmt)}
+int.__floordiv__=function(self,other){if(other.__class__===$B.long_int){return $B.long_int.__floordiv__($B.long_int.$factory(self),other)}
+if(_b_.isinstance(other,int)){other=int_value(other)
+if(other==0){throw _b_.ZeroDivisionError.$factory("division by zero")}
+return Math.floor(self/other)}
+return _b_.NotImplemented}
+int.__hash__=function(self){if(self.$brython_value){
+var hash_method=$B.$getattr(self.__class__,'__hash__')
+if(hash_method===int.__hash__){if(typeof self.$brython_value=="number"){return self.$brython_value}else{
+return $B.long_int.__hash__(self.$brython_value)}}else{return hash_method(self)}}
+return self.valueOf()}
+int.__index__=function(self){return int_value(self)}
+int.__init__=function(self,value){if(value===undefined){value=0}
+self.toString=function(){return value}
+return _b_.None}
+int.__int__=function(self){return self}
+int.__invert__=function(self){return ~self}
+int.__lshift__=function(self,other){self=int_value(self)
+if(_b_.isinstance(other,int)){other=int_value(other)
+try{return int.$factory($B.long_int.__lshift__($B.long_int.$factory(self),$B.long_int.$factory(other)))}catch(err){console.log('err in lshift',self,other)
+throw err}}
+return _b_.NotImplemented}
+int.__mod__=function(self,other){
+if(_b_.isinstance(other,_b_.tuple)&& other.length==1){other=other[0]}
+if(other.__class__===$B.long_int){return $B.long_int.__mod__($B.long_int.$factory(self),other)}
+if(_b_.isinstance(other,int)){other=int_value(other)
+if(other===false){other=0}
+else if(other===true){other=1}
+if(other==0){throw _b_.ZeroDivisionError.$factory(
+"integer division or modulo by zero")}
+return(self % other+other)% other}
+return _b_.NotImplemented}
+int.__mul__=function(self,other){self=int_value(self)
+if(_b_.isinstance(other,int)){if(other.__class__==$B.long_int){return $B.long_int.__mul__($B.long_int.$factory(self),$B.long_int.$factory(other))}
+other=int_value(other)
+var res=self*other
+if(res > $B.min_int && res < $B.max_int){return res}else{return int.$factory($B.long_int.__mul__($B.long_int.$factory(self),$B.long_int.$factory(other)))}}
+return _b_.NotImplemented}
+int.__ne__=function(self,other){var res=int.__eq__(self,other)
+return(res===_b_.NotImplemented)? res :!res}
+int.__neg__=function(self){return-self}
+int.__new__=function(cls,value){if(cls===undefined){throw _b_.TypeError.$factory("int.__new__(): not enough arguments")}else if(! _b_.isinstance(cls,_b_.type)){throw _b_.TypeError.$factory("int.__new__(X): X is not a type object")}
+if(cls===int){return int.$factory(value)}
+return{
+__class__:cls,__dict__:$B.empty_dict(),$brython_value:value ||0}}
+int.__pos__=function(self){return self}
+function extended_euclidean(a,b){var d,u,v
+if(b==0){return[a,1,0]}else{[d,u,v]=extended_euclidean(b,a % b)
+return[d,v,u-Math.floor(a/b)*v]}}
+int.__pow__=function(self,other,z){if(! _b_.isinstance(other,int)){return _b_.NotImplemented}
+if(typeof other=="number" ||_b_.isinstance(other,int)){other=int_value(other)
+switch(other.valueOf()){case 0:
+return int.$factory(1)
+case 1:
+return int.$factory(self.valueOf())}
+if(z !==undefined && z !==_b_.None){
+if(z==1){return 0}
+var result=1,base=self % z,exponent=other,long_int=$B.long_int
+if(exponent < 0){var gcd,inv,_
+[gcd,inv,_]=extended_euclidean(self,z)
+if(gcd !==1){throw _b_.ValueError.$factory("not relative primes: "+
+self+' and '+z)}
+return int.__pow__(inv,-exponent,z)}
+while(exponent > 0){if(exponent % 2==1){if(result*base > $B.max_int){result=long_int.__mul__(
+long_int.$factory(result),long_int.$factory(base))
+result=long_int.__mod__(result,z)}else{result=(result*base)% z}}
+exponent=exponent >> 1
+if(base*base > $B.max_int){base=long_int.__mul__(long_int.$factory(base),long_int.$factory(base))
+base=long_int.__mod__(base,z)}else{base=(base*base)% z}}
+return result}
+var res=Math.pow(self.valueOf(),other.valueOf())
+if(res > $B.min_int && res < $B.max_int){return other > 0 ? res :new Number(res)}else if(res !==Infinity && !isFinite(res)){return res}else{if($B.BigInt){return{
+__class__:$B.long_int,value:($B.BigInt(self)**$B.BigInt(other)).toString(),pos:true}}
+return $B.long_int.__pow__($B.long_int.$from_int(self),$B.long_int.$from_int(other))}}
+if(_b_.isinstance(other,_b_.float)){other=_b_.float.numerator(other)
+if(self >=0){return new Number(Math.pow(self,other))}else{
+return _b_.complex.__pow__($B.make_complex(self,0),other)}}else if(_b_.isinstance(other,_b_.complex)){var preal=Math.pow(self,other.$real),ln=Math.log(self)
+return $B.make_complex(preal*Math.cos(ln),preal*Math.sin(ln))}
+var rpow=$B.$getattr(other,"__rpow__",_b_.None)
+if(rpow !==_b_.None){return rpow(self)}
+$err("**",other)}
+function __newobj__(){
+var $=$B.args('__newobj__',0,{},[],arguments,{},'args',null),args=$.args
+var res=args.slice(1)
+res.__class__=args[0]
+return res}
+int.__reduce_ex__=function(self){return $B.fast_tuple([__newobj__,$B.fast_tuple([self.__class__ ||int,int_value(self)]),_b_.None,_b_.None,_b_.None])}
+int.__repr__=function(self){$B.builtins_repr_check(int,arguments)
+return int_value(self).toString()}
+int.__rshift__=function(self,other){self=int_value(self)
+if(typeof other=="number" ||_b_.isinstance(other,int)){other=int_value(other)
+return int.$factory($B.long_int.__rshift__($B.long_int.$factory(self),$B.long_int.$factory(other)))}
+return _b_.NotImplemented}
+int.__setattr__=function(self,attr,value){if(typeof self=="number" ||typeof self=="boolean"){var cl_name=$B.class_name(self)
+if(_b_.dir(self).indexOf(attr)>-1){throw _b_.AttributeError.$factory("attribute '"+attr+
+`' of '${cl_name}' objects is not writable`)}else{throw _b_.AttributeError.$factory(`'${cl_name}' object`+
+` has no attribute '${attr}'`)}
+throw _b_.AttributeError.$factory(msg)}
+_b_.dict.$setitem(self.__dict__,attr,value)
+return _b_.None}
+int.__sub__=function(self,other){self=int_value(self)
+if(_b_.isinstance(other,int)){if(other.__class__==$B.long_int){return $B.long_int.__sub__($B.long_int.$factory(self),$B.long_int.$factory(other))}
+other=int_value(other)
+var res=self-other
+if(res > $B.min_int && res < $B.max_int){return res}else{return $B.long_int.__sub__($B.long_int.$factory(self),$B.long_int.$factory(other))}}
+return _b_.NotImplemented}
+int.__truediv__=function(self,other){if(_b_.isinstance(other,int)){other=int_value(other)
+if(other==0){throw _b_.ZeroDivisionError.$factory("division by zero")}
+if(other.__class__===$B.long_int){return new Number(self/parseInt(other.value))}
+return new Number(self/other)}
+return _b_.NotImplemented}
+int.bit_count=function(self){var s=_b_.bin(_b_.abs(self)),nb=0
+for(var x of s){if(x=='1'){nb++}}
+return nb}
+int.bit_length=function(self){var s=_b_.bin(self)
+s=$B.$getattr(s,"lstrip")("-0b")
+return s.length }
+int.numerator=function(self){return int_value(self)}
+int.denominator=function(self){return int.$factory(1)}
+int.imag=function(self){return int.$factory(0)}
+int.real=function(self){return self}
+for(var attr of['numerator','denominator','imag','real']){int[attr].setter=(function(x){return function(self,value){throw _b_.AttributeError.$factory(`attribute '${x}' of `+
+`'${$B.class_name(self)}' objects is not writable`)}})(attr)}
+$B.max_int32=(1 << 30)*2-1
+$B.min_int32=-$B.max_int32
+var $op_func=function(self,other){self=int_value(self)
+if(typeof other=="number" ||_b_.isinstance(other,int)){if(other.__class__===$B.long_int){return $B.long_int.__sub__($B.long_int.$factory(self),$B.long_int.$factory(other))}
+other=int_value(other)
+if(self > $B.max_int32 ||self < $B.min_int32 ||
+other > $B.max_int32 ||other < $B.min_int32){return $B.long_int.__sub__($B.long_int.$factory(self),$B.long_int.$factory(other))}
+return self-other}
+return _b_.NotImplemented}
+$op_func+=""
+var $ops={"&":"and","|":"or","^":"xor"}
+for(var $op in $ops){var opf=$op_func.replace(/-/gm,$op)
+opf=opf.replace(new RegExp("sub","gm"),$ops[$op])
+eval("int.__"+$ops[$op]+"__ = "+opf)}
+var $comp_func=function(self,other){if(other.__class__===$B.long_int){return $B.long_int.__lt__(other,$B.long_int.$factory(self))}
+if(_b_.isinstance(other,int)){other=int_value(other)
+return self.valueOf()> other.valueOf()}else if(_b_.isinstance(other,_b_.float)){return self.valueOf()> _b_.float.numerator(other)}else if(_b_.isinstance(other,_b_.bool)){return self.valueOf()> _b_.bool.__hash__(other)}
+if(_b_.hasattr(other,"__int__")||_b_.hasattr(other,"__index__")){return int.__gt__(self,$B.$GetInt(other))}
+return _b_.NotImplemented}
+$comp_func+=""
+for(var $op in $B.$comps){eval("int.__"+$B.$comps[$op]+"__ = "+
+$comp_func.replace(/>/gm,$op).
+replace(/__gt__/gm,"__"+$B.$comps[$op]+"__").
+replace(/__lt__/,"__"+$B.$inv_comps[$op]+"__"))}
+var r_opnames=["add","sub","mul","truediv","floordiv","mod","pow","lshift","rshift","and","xor","or","divmod"]
+for(var r_opname of r_opnames){if(int["__r"+r_opname+"__"]===undefined &&
+int['__'+r_opname+'__']){int["__r"+r_opname+"__"]=(function(name){return function(self,other){if(_b_.isinstance(other,int)){other=int_value(other)
+return int["__"+name+"__"](other,self)}
+return _b_.NotImplemented}})(r_opname)}}
+var $valid_digits=function(base){var digits=""
+if(base===0){return "0"}
+if(base < 10){for(var i=0;i < base;i++){digits+=String.fromCharCode(i+48)}
+return digits}
+var digits="0123456789"
+for(var i=10;i < base;i++){digits+=String.fromCharCode(i+55)}
+return digits}
+int.$factory=function(value,base){
+if(value===undefined){return 0}
+if(typeof value=="number" &&
+(base===undefined ||base==10)){return parseInt(value)}
+if(_b_.isinstance(value,_b_.complex)){throw _b_.TypeError.$factory("can't convert complex to int")}
+var $ns=$B.args("int",2,{x:null,base:null},["x","base"],arguments,{"base":10},null,null),value=$ns["x"],base=$ns["base"]
+if(_b_.isinstance(value,_b_.float)&& base==10){value=_b_.float.numerator(value)
+if(value < $B.min_int ||value > $B.max_int){return $B.long_int.$from_float(value)}
+else{return value > 0 ? Math.floor(value):Math.ceil(value)}}
+if(!(base >=2 && base <=36)){
+if(base !=0){throw _b_.ValueError.$factory("invalid base")}}
+if(typeof value=="number"){if(base==10){if(value < $B.min_int ||value > $B.max_int){return $B.long_int.$factory(value)}
+return value}else if(value.toString().search("e")>-1){
+throw _b_.OverflowError.$factory("can't convert to base "+base)}else{var res=parseInt(value,base)
+if(value < $B.min_int ||value > $B.max_int){return $B.long_int.$factory(value,base)}
+return res}}
+if(value===true){return Number(1)}
+if(value===false){return Number(0)}
+if(value.__class__===$B.long_int){var z=parseInt(value.value)
+if(z > $B.min_int && z < $B.max_int){return z}
+else{return value}}
+base=$B.$GetInt(base)
+function invalid(value,base){throw _b_.ValueError.$factory("invalid literal for int() with base "+
+base+": '"+_b_.str.$factory(value)+"'")}
+if(_b_.isinstance(value,_b_.str)){value=value.valueOf()}
+if(typeof value=="string"){var _value=value.trim(),
+sign=''
+if(_value.startsWith('+')||value.startsWith('-')){var sign=_value[0]
+_value=_value.substr(1)}
+if(_value.length==2 && base==0 &&
+(_value=="0b" ||_value=="0o" ||_value=="0x")){throw _b_.ValueError.$factory("invalid value")}
+if(_value.length > 2){var _pre=_value.substr(0,2).toUpperCase()
+if(base==0){if(_pre=="0B"){base=2}
+if(_pre=="0O"){base=8}
+if(_pre=="0X"){base=16}}else if(_pre=="0X" && base !=16){invalid(_value,base)}
+else if(_pre=="0O" && base !=8){invalid(_value,base)}
+if((_pre=="0B" && base==2)||_pre=="0O" ||_pre=="0X"){_value=_value.substr(2)
+while(_value.startsWith("_")){_value=_value.substr(1)}}}else if(base==0){
+base=10}
+var _digits=$valid_digits(base),_re=new RegExp("^[+-]?["+_digits+"]"+
+"["+_digits+"_]*$","i"),match=_re.exec(_value)
+if(match===null){invalid(value,base)}else{value=_value.replace(/_/g,"")}
+if(base <=10 && ! isFinite(value)){invalid(_value,base)}
+var res=parseInt(sign+value,base)
+if(res < $B.min_int ||res > $B.max_int){return $B.long_int.$factory(value,base)}
+return res}
+if(_b_.isinstance(value,[_b_.bytes,_b_.bytearray])){return int.$factory($B.$getattr(value,"decode")("latin-1"),base)}
+for(var special_method of["__int__","__index__","__trunc__"]){var num_value=$B.$getattr(value.__class__ ||$B.get_class(value),special_method,_b_.None)
+if(num_value !==_b_.None){return $B.$call(num_value)(value)}}
+throw _b_.TypeError.$factory(
+"int() argument must be a string, a bytes-like "+
+"object or a number, not '"+$B.class_name(value)+"'")}
+$B.set_func_names(int,"builtins")
+_b_.int=int
+$B.$bool=function(obj){
+if(obj===null ||obj===undefined ){return false}
+switch(typeof obj){case "boolean":
+return obj
+case "number":
+case "string":
+if(obj){return true}
+return false
+default:
+if(obj.$is_class){return true}
+var klass=obj.__class__ ||$B.get_class(obj),missing={},bool_method=$B.$getattr(klass,"__bool__",missing)
+if(bool_method===missing){try{return _b_.len(obj)> 0}
+catch(err){return true}}else{var res=$B.$call(bool_method)(obj)
+if(res !==true && res !==false){throw _b_.TypeError.$factory("__bool__ should return "+
+"bool, returned "+$B.class_name(res))}
+return res}}}
+var bool={__bases__:[int],__class__:_b_.type,__mro__:[int,_b_.object],$infos:{__name__:"bool",__module__:"builtins"},$is_class:true,$native:true,$descriptors:{"numerator":true,"denominator":true,"imag":true,"real":true}}
+bool.__and__=function(self,other){if(_b_.isinstance(other,bool)){return self && other}else if(_b_.isinstance(other,int)){return int.__and__(bool.__index__(self),int.__index__(other))}
+return _b_.NotImplemented}
+bool.__float__=function(self){return self ? new Number(1):new Number(0)}
+bool.__hash__=bool.__index__=bool.__int__=function(self){if(self.valueOf())return 1
+return 0}
+bool.__neg__=function(self){return-$B.int_or_bool(self)}
+bool.__or__=function(self,other){if(_b_.isinstance(other,bool)){return self ||other}else if(_b_.isinstance(other,int)){return int.__or__(bool.__index__(self),int.__index__(other))}
+return _b_.NotImplemented}
+bool.__pos__=$B.int_or_bool
+bool.__repr__=function(self){$B.builtins_repr_check(bool,arguments)
+return self ? "True" :"False"}
+bool.__xor__=function(self,other){if(_b_.isinstance(other,bool)){return self ^ other ? true :false}else if(_b_.isinstance(other,int)){return int.__xor__(bool.__index__(self),int.__index__(other))}
+return _b_.NotImplemented}
+bool.$factory=function(){
+var $=$B.args("bool",1,{x:null},["x"],arguments,{x:false},null,null)
+return $B.$bool($.x)}
+bool.numerator=int.numerator
+bool.denominator=int.denominator
+bool.real=int.real
+bool.imag=int.imag
+_b_.bool=bool
+$B.set_func_names(bool,"builtins")})(__BRYTHON__)
+;
+;(function($B){
+var _b_=$B.builtins
+try{eval("window")}catch(err){window=self}
+var long_int={__class__:_b_.type,__mro__:[_b_.int,_b_.object],$infos:{__module__:"builtins",__name__:"int"},$is_class:true,$native:true,$descriptors:{"numerator":true,"denominator":true,"imag":true,"real":true}}
+var max_safe_divider=$B.max_int/9
+function add_pos(v1,v2){
+return{
+__class__:long_int,value:(BigInt(v1)+BigInt(v2)).toString(),pos:true}}
+var len=((Math.pow(2,53)-1)+'').length-1
+function binary_pos(t){var nb_chunks=Math.ceil(t.length/len),chunks=[],pos,start,nb,bin=[]
+for(var i=0;i < nb_chunks;i++){pos=t.length-(i+1)*len
+start=Math.max(0,pos)
+nb=pos-start
+chunks.push(t.substr(start,len+nb))}
+chunks=chunks.reverse()
+chunks.forEach(function(chunk,i){chunks[i]=parseInt(chunk)})
+var rest
+var carry=Math.pow(10,15)
+while(chunks[chunks.length-1]> 0){chunks.forEach(function(chunk,i){rest=chunk % 2
+chunks[i]=Math.floor(chunk/2)
+if(rest && i < chunks.length-1){chunks[i+1]+=carry}})
+bin.push(rest)
+if(chunks[0]==0){chunks.shift()}}
+bin=bin.reverse().join('')
+return bin}
+function binary(obj){var bpos=binary_pos(obj.value)
+if(obj.pos){return bpos}
+var res=''
+for(var i=0,len=bpos.length;i < len;i++){res+=bpos.charAt(i)=="0" ? "1":"0"}
+var add1=add_pos(res,"1").value
+add1=res.substr(0,res.length-add1.length)+add1
+return add1}
+function comp_pos(v1,v2){
+if(v1.length > v2.length){return 1}
+else if(v1.length < v2.length){return-1}
+else{if(v1 > v2){return 1}
+else if(v1 < v2){return-1}}
+return 0}
+function divmod_by_safe_int(t,n){
+if(n==1){return[t,0]}
+var quotient=BigInt(t)/BigInt(n),rest=BigInt(t)-quotient*BigInt(n)
+console.log("divmod by safe int")
+return[from_BigInt(quotient),from_BigInt(rest)]}
+function divmod_pos(v1,v2){
+var a={__class__:long_int,value:(BigInt(v1)/BigInt(v2)).toString(),pos:true},b={__class__:long_int,value:(BigInt(v1)% BigInt(v2)).toString(),pos:true}
+return[a,b]}
+function split_chunks(s,size){var nb=Math.ceil(s.length/size),chunks=[],len=s.length
+for(var i=0;i < nb;i++){var pos=len-size*(i+1)
+if(pos < 0){size+=pos;pos=0}
+chunks.push(parseInt(s.substr(pos,size)))}
+return chunks}
+function mul_pos(x,y){
+return long_int.$factory(from_BigInt(BigInt(x)*BigInt(y)))}
+function sub_pos(v1,v2){
+return{
+__class__:long_int,value:(BigInt(v1)-BigInt(v2)).toString(),pos:true}}
+function to_BigInt(x){var res=$B.BigInt(x.value)
+if(x.pos){return res}
+return-res}
+function to_int(long_int){return long_int.pos ? parseInt(long_int.value):-parseInt(long_int.value)}
+function from_BigInt(y){var pos=y >=0
+y=y.toString()
+y=y.endsWith("n")? y.substr(0,y.length-1):y
+y=y.startsWith('-')? y.substr(1):y
+return intOrLong({__class__:long_int,value:y,pos:pos})}
+long_int.$from_float=function(value){var s=Math.abs(value).toString(),v=s
+if(s.search("e")>-1){var t=/-?(\d)(\.\d+)?e([+-])(\d*)/.exec(s),n1=t[1],n2=t[2],pos=t[3],exp=t[4]
+if(pos=="+"){if(n2===undefined){v=n1+"0".repeat(exp-1)}else{v=n1+n2+"0".repeat(exp-1-n2.length)}}}
+return{__class__:long_int,value:v,pos:value >=0}}
+function preformat(self,fmt){if(fmt.empty){return _b_.str.$factory(self)}
+if(fmt.type && 'bcdoxXn'.indexOf(fmt.type)==-1){throw _b_.ValueError.$factory("Unknown format code '"+fmt.type+
+"' for object of type 'int'")}
+var res
+switch(fmt.type){case undefined:
+case "d":
+res=self.toString()
+break
+case "b":
+res=(fmt.alternate ? "0b" :"")+BigInt(self.value).toString(2)
+break
+case "c":
+res=_b_.chr(self)
+break
+case "o":
+res=(fmt.alternate ? "0o" :"")+BigInt(self.value).toString(8)
+break
+case "x":
+res=(fmt.alternate ? "0x" :"")+BigInt(self.value).toString(16)
+break
+case "X":
+res=(fmt.alternate ? "0X" :"")+BigInt(self.value).toString(16).toUpperCase()
+break
+case "n":
+return self }
+if(fmt.sign !==undefined){if((fmt.sign==" " ||fmt.sign=="+" )&& self >=0){res=fmt.sign+res}}
+return res}
+long_int.__format__=function(self,format_spec){var fmt=new $B.parse_format_spec(format_spec)
+if(fmt.type && 'eEfFgG%'.indexOf(fmt.type)!=-1){
+return _b_.float.__format__(self,format_spec)}
+fmt.align=fmt.align ||">"
+var res=preformat(self,fmt)
+if(fmt.comma){var sign=res[0]=="-" ? "-" :"",rest=res.substr(sign.length),len=rest.length,nb=Math.ceil(rest.length/3),chunks=[]
+for(var i=0;i < nb;i++){chunks.push(rest.substring(len-3*i-3,len-3*i))}
+chunks.reverse()
+res=sign+chunks.join(",")}
+return $B.format_width(res,fmt)}
+long_int.__abs__=function(self){return{__class__:long_int,value:self.value,pos:true}}
+long_int.__add__=function(self,other){if(_b_.isinstance(other,_b_.float)){return _b_.float.$factory(to_int(self)+other)}
+if(typeof other=="number"){other=long_int.$factory(_b_.str.$factory(other))}else if(other.__class__ !==long_int){if(_b_.isinstance(other,_b_.bool)){other=long_int.$factory(other ? 1 :0)}else if(_b_.isinstance(other,_b_.int)){
+other=long_int.$factory(_b_.str.$factory(_b_.int.__index__(other)))}else{return _b_.NotImplemented}}
+return from_BigInt(to_BigInt(self)+to_BigInt(other))}
+long_int.__and__=function(self,other){if(typeof other=="number"){other=long_int.$factory(_b_.str.$factory(other))}
+return from_BigInt(to_BigInt(self)& to_BigInt(other))}
+long_int.__divmod__=function(self,other){if(typeof other=="number"){other=long_int.$factory(_b_.str.$factory(other))}
+var a=to_BigInt(self),b=to_BigInt(other),quotient
+if((a >=0 && b > 0)||(a <=0 && b < 0)){quotient=a/b}else{quotient=a/b-BigInt(1)}
+var rest=a-quotient*b
+return $B.fast_tuple([from_BigInt(quotient),from_BigInt(rest)])}
+long_int.__eq__=function(self,other){if(typeof other=="number"){other=long_int.$factory(_b_.str.$factory(other))}
+return self.value==other.value && self.pos==other.pos}
+long_int.__float__=function(self){if(! isFinite(parseFloat(self.value))){throw _b_.OverflowError.$factory("int too big to convert to float")}
+return new Number((self.pos ? 1 :-1)*parseFloat(self.value))}
+long_int.__floordiv__=function(self,other){if(_b_.isinstance(other,_b_.float)){return _b_.float.$factory(to_int(self)/other)}
+if(typeof other=="number" && Math.abs(other)< $B.max_safe_divider){var t=self.value,res=divmod_by_safe_int(t,other),pos=other > 0 ? self.pos :!self.pos
+return{__class__:long_int,value:res[0],pos:pos}}
+var res=intOrLong(long_int.__divmod__(self,other)[0])
+return res}
+long_int.__ge__=function(self,other){if(typeof other=="number"){other=long_int.$factory(_b_.str.$factory(other))}
+if(self.pos !=other.pos){return ! other.pos}
+if(self.value.length > other.value.length){return self.pos}
+else if(self.value.length < other.value.length){return ! self.pos}
+else{return self.pos ? self.value >=other.value :
+self.value <=other.value}}
+long_int.__gt__=function(self,other){return ! long_int.__le__(self,other)}
+long_int.__hash__=function(self){var modulus=$B.fast_long_int("2305843009213693951",true),self_pos=$B.fast_long_int(self.value,true)
+var _hash=$B.long_int.__mod__(self_pos,modulus)
+if(typeof _hash=="number"){_hash=self.pos ? _hash :-_hash}else{_hash.pos=self.pos}
+return self.__hashvalue__=_hash}
+long_int.__index__=function(self){
+var res='',temp=self.value,d
+while(true){d=divmod_pos(temp,"2")
+res=d[1].value+res
+temp=d[0].value
+if(temp=="0"){break}}
+if(! self.pos){
+var nres="",flag=false
+for(var len=res.length-1,i=len;i >=0 ;i--){var bit=res.charAt(i)
+if(bit=="0"){if(flag){nres="1"+nres}else{nres="0"+nres}}else{if(flag){nres="0"+nres}
+else{flag=true;nres="1"+nres}}}
+nres="1"+nres
+res=nres}else{res="0"+res}
+return intOrLong(res)}
+long_int.__invert__=function(self){return long_int.__sub__(long_int.$factory("-1"),self)}
+long_int.__le__=function(self,other){if(typeof other=="number"){other=long_int.$factory(_b_.str.$factory(other))}
+if(self.pos !==other.pos){return ! self.pos}
+if(self.value.length > other.value.length){return ! self.pos}
+else if(self.value.length < other.value.length){return self.pos}
+else{return self.pos ? self.value <=other.value :
+self.value >=other.value}}
+long_int.__lt__=function(self,other){return !long_int.__ge__(self,other)}
+long_int.__lshift__=function(self,shift){if(shift.__class__==long_int){shift=shift.value}
+return intOrLong({__class__:long_int,value:(BigInt(self.value)<< BigInt(shift)).toString(),pos:self.pos})}
+long_int.__mod__=function(self,other){return intOrLong(long_int.__divmod__(self,other)[1])}
+long_int.__mro__=[_b_.int,_b_.object]
+long_int.__mul__=function(self,other){switch(self){case Number.NEGATIVE_INFINITY:
+case Number.POSITIVE_INFINITY:
+if($B.rich_comp("__eq__",other,0)){return NaN}
+else if(_b_.getattr(other,"__gt__")(0)){return self}
+else{return-self}}
+if(_b_.isinstance(other,_b_.float)){return _b_.float.$factory(to_int(self)*other)}
+if(typeof other=="number"){other=long_int.$factory(other)}
+other_value=other.value
+other_pos=other.pos
+if(other.__class__ !==long_int && _b_.isinstance(other,_b_.int)){
+var value=_b_.int.__index__(other)
+other_value=_b_.str.$factory(value)
+other_pos=value > 0}
+return from_BigInt(to_BigInt(self)*to_BigInt(other))}
+long_int.__ne__=function(self,other){var res=long_int.__eq__(self,other)
+return res===_b_.NotImplemented ? res :!res}
+long_int.__neg__=function(obj){return{__class__:long_int,value:obj.value,pos:! obj.pos}}
+long_int.__or__=function(self,other){other=long_int.$factory(other)
+var v1=long_int.__index__(self)
+var v2=long_int.__index__(other)
+if(v1.length < v2.length){var temp=v2;v2=v1;v1=temp}
+var start=v1.length-v2.length
+var res=v1.substr(0,start)
+for(var i=0;i < v2.length;i++){if(v1.charAt(start+i)=="1" ||v2.charAt(i)=="1"){res+="1"}
+else{res+="0"}}
+return intOrLong(long_int.$factory(res,2))}
+long_int.__pos__=function(self){return self}
+long_int.__pow__=function(self,power,z){if(typeof power=="number"){power=long_int.$from_int(power)}else if(_b_.isinstance(power,_b_.int)){
+power=long_int.$factory(_b_.str.$factory(_b_.int.__index__(power)))}else if(! _b_.isinstance(power,long_int)){var msg="power must be an integer, not '"
+throw _b_.TypeError.$factory(msg+$B.class_name(power)+"'")}
+if(! power.pos){if(self.value=="1"){return self}
+return long_int.$factory("0")}else if(power.value=="0"){return long_int.$factory("1")}
+var s=$B.BigInt(self.value),b=$B.BigInt(1),x=$B.BigInt(power.value),z=z===undefined ? z :typeof z=="number" ? $B.BigInt(z):
+$B.BigInt(z.value)
+if(z===undefined){return{
+__class__:long_int,value:(s**x).toString(),pos:true}}
+while(x > 0){if(x % $B.BigInt(2)==1){b=b*s}
+x=x/$B.BigInt(2)
+if(x > 0){s=s*s}
+if(z !==undefined){b=b % z}}
+return{__class__:long_int,value:b.toString(),pos:true}}
+long_int.__rshift__=function(self,shift){if(shift.__class__===long_int){shift=shift.value}
+return intOrLong(
+{__class__:long_int,value:(BigInt(self.value)>> BigInt(shift)).toString(),pos:self.pos}
+)}
+long_int.__str__=long_int.__repr__=function(self){var res=""
+if(! self.pos){res+='-'}
+return res+self.value}
+long_int.__sub__=function(self,other){if(_b_.isinstance(other,_b_.float)){other=other instanceof Number ? other :other.$brython_value
+return _b_.float.$factory(to_int(self)-other)}
+if(typeof other=="number"){other=long_int.$factory(_b_.str.$factory(other))}
+if($B.BigInt){}
+var res
+if(self.pos && other.pos){switch(comp_pos(self.value,other.value)){case 1:
+res=sub_pos(self.value,other.value)
+break
+case 0:
+res={__class__:long_int,value:"0",pos:true}
+break
+case-1:
+res=sub_pos(other.value,self.value)
+res.pos=false
+break}
+return intOrLong(res)}else if(! self.pos && ! other.pos){switch(comp_pos(self.value,other.value)){case 1:
+res=sub_pos(self.value,other.value)
+res.pos=false
+break
+case 0:
+res={__class__:long_int,value:"0",pos:true}
+break
+case-1:
+res=sub_pos(other.value,self.value)
+break}
+return intOrLong(res)}else if(self.pos && ! other.pos){return intOrLong(add_pos(self.value,other.value))}else{res=add_pos(self.value,other.value)
+res.pos=false
+return intOrLong(res)}}
+long_int.__truediv__=function(self,other){if(_b_.isinstance(other,long_int)){return _b_.float.$factory(to_int(self)/to_int(other))}else if(_b_.isinstance(other,_b_.int)){return _b_.float.$factory(to_int(self)/other)}else if(_b_.isinstance(other,_b_.float)){return _b_.float.$factory(to_int(self)/other)}else{throw _b_.TypeError.$factory(
+"unsupported operand type(s) for /: 'int' and '"+
+$B.class_name(other)+"'")}}
+long_int.__xor__=function(self,other){other=long_int.$factory(other)
+var v1=long_int.__index__(self),v2=long_int.__index__(other)
+if(v1.length < v2.length){var temp=v2;v2=v1;v1=temp}
+var start=v1.length-v2.length
+var res=v1.substr(0,start)
+for(var i=0;i < v2.length;i++){if(v1.charAt(start+i)=="1" && v2.charAt(i)=="0"){res+="1"}
+else if(v1.charAt(start+i)=="0" && v2.charAt(i)=="1"){res+="1"}
+else{res+="0"}}
+return intOrLong(long_int.$factory(res,2))}
+long_int.bit_count=function(self){var s=_b_.bin(_b_.abs(self)),nb=0
+for(var x of s){if(x=='1'){nb++}}
+return nb}
+long_int.bit_length=function(self){return binary(self).length}
+function _infos(self){
+var nbits=$B.long_int.bit_length(self),pow2=2n**BigInt(nbits-1),rest=BigInt(self.value)-pow2,relative_rest=new Number(rest)/new Number(pow2)
+return{nbits,pow2,rest,relative_rest}}
+long_int.$log2=function(x){if(! x.pos){throw _b_.ValueError.$factory('math domain error')}
+var infos=_infos(x)
+return _b_.float.$factory(infos.nbits-1+
+Math.log(1+infos.relative_rest/Math.LN2))}
+long_int.$log10=function(x){if(! x.pos){throw _b_.ValueError.$factory('math domain error')}
+var exp=x.value.length-1,mant=eval(x.value[0]+'.'+x.value.substr(1))
+return _b_.float.$factory(exp+Math.log10(mant))}
+long_int.numerator=function(self){return self}
+long_int.denominator=function(self){return _b_.int.$factory(1)}
+long_int.imag=function(self){return _b_.int.$factory(0)}
+long_int.real=function(self){return self}
+long_int.to_base=function(self,base){
+if(base==2){return binary_pos(self.value)}
+var res="",v=self.value
+while(v > 0){var dm=divmod_pos(v,base.toString())
+res=parseInt(dm[1].value).toString(base)+res
+v=dm[0].value
+if(v==0){break}}
+return res}
+long_int.to_bytes=function(self,len,byteorder,signed){
+var res=[],v=self.value
+if(! $B.$bool(signed)&& ! self.pos){throw _b_.OverflowError.$factory("can't convert negative int to unsigned")}
+while(v > 0){var dm=divmod_pos(v,256)
+v=parseInt(dm[0].value)
+res.push(parseInt(dm[1].value))
+if(res.length > len){throw _b_.OverflowError.$factory("int too big to convert")}}
+while(res.length < len){res.push(0)}
+if(byteorder=='big'){res.reverse()}
+return _b_.bytes.$factory(res)}
+function digits(base){
+var is_digits={}
+for(var i=0;i < base;i++){if(i==10){break}
+is_digits[i]=true}
+if(base > 10){
+for(var i=0;i < base-10;i++){is_digits[String.fromCharCode(65+i)]=true
+is_digits[String.fromCharCode(97+i)]=true}}
+return is_digits}
+var MAX_SAFE_INTEGER=Math.pow(2,53)-1
+var MIN_SAFE_INTEGER=-MAX_SAFE_INTEGER
+function isSafeInteger(n){return(typeof n==="number" &&
+Math.round(n)===n &&
+MIN_SAFE_INTEGER <=n &&
+n <=MAX_SAFE_INTEGER)}
+function intOrLong(long){
+var v=parseInt(long.value)*(long.pos ? 1 :-1)
+if(v > MIN_SAFE_INTEGER && v < MAX_SAFE_INTEGER){return v}
+return long}
+long_int.$from_int=function(value){return{__class__:long_int,value:value.toString(),pos:value > 0}}
+long_int.$factory=function(value,base){if(arguments.length > 2){throw _b_.TypeError.$factory("long_int takes at most 2 arguments ("+
+arguments.length+" given)")}
+if(base===undefined){base=10}
+else if(! _b_.isinstance(base,_b_.int)){throw _b_.TypeError.$factory("'"+$B.class_name(base)+
+"' object cannot be interpreted as an integer")}
+if(base < 0 ||base==1 ||base > 36){throw _b_.ValueError.$factory(
+"long_int.$factory() base must be >= 2 and <= 36")}
+if(typeof value=="number"){var pos=value >=0,value=Math.abs(value),res
+if(isSafeInteger(value)){res=long_int.$from_int(value)}
+else if(value.constructor==Number){var s=value.toString(),pos_exp=s.search("e")
+if(pos_exp >-1){var mant=s.substr(0,pos_exp),exp=parseInt(s.substr(pos_exp+1)),point=mant.search(/\./)
+if(point >-1){var nb_dec=mant.substr(point+1).length
+if(nb_dec > exp){var res=mant.substr(0,point)+
+mant.substr(point+1).substr(0,exp)
+res=long_int.$from_int(res)}else{var res=mant.substr(0,point)+
+mant.substr(point+1)+'0'.repeat(exp-nb_dec)
+res=long_int.$from_int(res)}}else{res=long_int.$from_int(mant+'0'.repeat(exp))}}else{var point=s.search(/\./)
+if(point >-1){res=long_int.$from_int(s.substr(0,point))}else{res=long_int.$from_int(s)}}}
+else{throw _b_.ValueError.$factory(
+"argument of long_int is not a safe integer")}
+res.pos=pos
+return res}else if(_b_.isinstance(value,_b_.float)){if(value===Number.POSITIVE_INFINITY ||
+value===Number.NEGATIVE_INFINITY){return value}
+if(value >=0){value=new Number(Math.round(value.value))}
+else{value=new Number(Math.ceil(value.value))}}else if(_b_.isinstance(value,_b_.bool)){if(value.valueOf()){return _b_.int.$factory(1)}
+return _b_.int.$factory(0)}else if(value.__class__===long_int){return value}else if(_b_.isinstance(value,_b_.int)){
+value=value.$brython_value+""}else if(_b_.isinstance(value,_b_.bool)){value=_b_.bool.__int__(value)+""}else if(typeof value !="string"){throw _b_.ValueError.$factory(
+"argument of long_int must be a string, not "+
+$B.class_name(value))}
+var has_prefix=false,pos=true,start=0
+while(value.charAt(0)==" " && value.length){value=value.substr(1)}
+while(value.charAt(value.length-1)==" " && value.length){value=value.substr(0,value.length-1)}
+if(value.charAt(0)=="+"){has_prefix=true}
+else if(value.charAt(0)=="-"){has_prefix=true;pos=false}
+if(has_prefix){
+if(value.length==1){
+throw _b_.ValueError.$factory(
+'long_int argument is not a valid number: "'+value+'"')}else{value=value.substr(1)}}
+while(start < value.length-1 && value.charAt(start)=="0"){start++}
+value=value.substr(start)
+var is_digits=digits(base),point=-1
+for(var i=0;i < value.length;i++){if(value.charAt(i)=="." && point==-1){point=i}else if(false){
+var mant=value.substr(0,i)
+if(/^[+-]?\d+$/.exec(value.substr(i+1))){exp=parseInt(value.substr(i+1))}else{throw Error("wrong exp "+value.substr(i+1))}
+if(point !=-1){mant=mant.substr(0,point)+mant.substr(point+1)
+exp=exp+point-1}
+point=-1
+value=mant+"0".repeat(exp-mant.length)
+break}
+else if(! is_digits[value.charAt(i)]){throw _b_.ValueError.$factory(
+'long_int argument is not a valid number: "'+value+'"')}}
+if(point !=-1){value=value.substr(0,point)}
+if(base !=10){
+var coef="1",v10=long_int.$factory(0),ix=value.length
+while(ix--){var digit_base10=parseInt(value.charAt(ix),base).toString(),digit_by_coef=mul_pos(coef,digit_base10).value
+v10=add_pos(v10.value,digit_by_coef)
+coef=mul_pos(coef,base.toString()).value}
+return v10}
+return{__class__:long_int,value:value,pos:pos}}
+function extended_euclidean_algorithm(a,b){
+var s=0,old_s=1,t=1,old_t=0,r=b,old_r=a,quotient,tmp
+while($B.rich_comp('__ne__',r,0)){quotient=$B.rich_op('__floordiv__',old_r,r)
+tmp=$B.rich_op('__sub__',old_r,$B.rich_op('__mul__',quotient,r))
+old_r=r
+r=tmp
+tmp=$B.rich_op('__sub__',old_s,$B.rich_op('__mul__',quotient,s))
+old_s=s
+s=tmp
+tmp=$B.rich_op('__sub__',old_t,$B.rich_op('__mul__',quotient,t))
+old_t=t
+t=tmp}
+return[old_r,old_s,old_t]}
+function inverse_of(n,p){
+var gcd,x,y
+[gcd,x,y]=extended_euclidean_algorithm(n,p)
+if($B.rich_comp('__ne__',gcd,1)){
+throw Error(
+`${n} has no multiplicative inverse '
+ 'modulo ${p}`)}else{return $B.rich_op('__mod__',x,p)}}
+$B.inverse_of=inverse_of
+$B.set_func_names(long_int,"builtins")
+$B.long_int=long_int
+$B.fast_long_int=function(value,pos){return{__class__:$B.long_int,value:value,pos:pos}}})(__BRYTHON__)
+;
+;(function($B){var _b_=$B.builtins
+var object=_b_.object
+function $err(op,other){var msg="unsupported operand type(s) for "+op+
+": 'float' and '"+$B.class_name(other)+"'"
+throw _b_.TypeError.$factory(msg)}
+function float_value(obj){
+return obj.$brython_value !==undefined ? obj.$brython_value :obj}
+var float={__class__:_b_.type,__dir__:object.__dir__,$infos:{__module__:"builtins",__name__:"float"},$is_class:true,$native:true,$descriptors:{"numerator":true,"denominator":true,"imag":true,"real":true}}
+float.numerator=function(self){return float_value(self)}
+float.denominator=function(self){return _b_.int.$factory(1)}
+float.imag=function(self){return _b_.int.$factory(0)}
+float.real=function(self){return float_value(self)}
+float.__float__=function(self){return float_value(self)}
+$B.shift1_cache={}
+float.as_integer_ratio=function(self){self=float_value(self)
+if(self.valueOf()==Number.POSITIVE_INFINITY ||
+self.valueOf()==Number.NEGATIVE_INFINITY){throw _b_.OverflowError.$factory("Cannot pass infinity to "+
+"float.as_integer_ratio.")}
+if(! Number.isFinite(self.valueOf())){throw _b_.ValueError.$factory("Cannot pass NaN to "+
+"float.as_integer_ratio.")}
+var tmp=frexp(self.valueOf()),fp=tmp[0],exponent=tmp[1]
+for(var i=0;i < 300;i++){if(fp==Math.floor(fp)){break}else{fp*=2
+exponent--}}
+numerator=_b_.int.$factory(fp)
+py_exponent=_b_.abs(exponent)
+denominator=1
+var x
+if($B.shift1_cache[py_exponent]!==undefined){x=$B.shift1_cache[py_exponent]}else{x=$B.$getattr(1,"__lshift__")(py_exponent)
+$B.shift1_cache[py_exponent]=x}
+py_exponent=x
+if(exponent > 0){numerator=$B.rich_op("__mul__",numerator,py_exponent)}else{denominator=py_exponent}
+return $B.fast_tuple([_b_.int.$factory(numerator),_b_.int.$factory(denominator)])}
+float.__abs__=function(self){return new Number(Math.abs(float_value(self)))}
+float.__bool__=function(self){self=float_value(self)
+return _b_.bool.$factory(self.valueOf())}
+float.__divmod__=function(self,other){if(! _b_.isinstance(other,[_b_.int,float])){return _b_.NotImplemented}
+return $B.fast_tuple([float.__floordiv__(self,other),float.__mod__(self,other)])}
+float.__eq__=function(self,other){self=float_value(self)
+other=float_value(other)
+if(isNaN(self)&& isNaN(other)){return false}
+if(_b_.isinstance(other,_b_.int)){return self==other}
+if(_b_.isinstance(other,float)){
+return self.valueOf()==other.valueOf()}
+if(_b_.isinstance(other,_b_.complex)){if(other.$imag !=0){return false}
+return self==other.$real}
+return _b_.NotImplemented}
+float.__floordiv__=function(self,other){self=float_value(self)
+other=float_value(other)
+if(_b_.isinstance(other,[_b_.int,float])){if(other.valueOf()==0){throw _b_.ZeroDivisionError.$factory('division by zero')}
+return float.$factory(Math.floor(self/other))}
+return _b_.NotImplemented}
+float.fromhex=function(arg){
+if(! _b_.isinstance(arg,_b_.str)){throw _b_.ValueError.$factory("argument must be a string")}
+var value=arg.trim()
+switch(value.toLowerCase()){case "+inf":
+case "inf":
+case "+infinity":
+case "infinity":
+return $FloatClass(Infinity)
+case "-inf":
+case "-infinity":
+return $FloatClass(-Infinity)
+case "+nan":
+case "nan":
+return $FloatClass(Number.NaN)
+case "-nan":
+return $FloatClass(-Number.NaN)
+case "":
+throw _b_.ValueError.$factory("could not convert string to float")}
+var mo=/^(\d*)(\.?)(\d*)$/.exec(value)
+if(mo !==null){var res=parseFloat(mo[1]),coef=16
+if(mo[2]){for(var digit of mo[3]){res+=parseInt(digit,16)/coef
+coef*=16}}
+return $FloatClass(res)}
+var _m=/^(\+|-)?(0x)?([0-9A-F]+\.?)?(\.[0-9A-F]+)?(p(\+|-)?\d+)?$/i.exec(value)
+if(_m==null){throw _b_.ValueError.$factory("invalid hexadecimal floating-point string")}
+var _sign=_m[1],_int=parseInt(_m[3]||'0',16),_fraction=_m[4]||'.0',_exponent=_m[5]||'p0'
+if(_sign=="-"){_sign=-1}else{_sign=1}
+var _sum=_int
+for(var i=1,len=_fraction.length;i < len;i++){_sum+=parseInt(_fraction.charAt(i),16)/Math.pow(16,i)}
+return new Number(_sign*_sum*Math.pow(2,parseInt(_exponent.substring(1))))}
+float.__getformat__=function(arg){if(arg=="double" ||arg=="float"){return "IEEE, little-endian"}
+throw _b_.ValueError.$factory("__getformat__() argument 1 must be "+
+"'double' or 'float'")}
+function preformat(self,fmt){if(fmt.empty){return _b_.str.$factory(self)}
+if(fmt.type && 'eEfFgGn%'.indexOf(fmt.type)==-1){throw _b_.ValueError.$factory("Unknown format code '"+fmt.type+
+"' for object of type 'float'")}
+if(isNaN(self)){if(fmt.type=="f" ||fmt.type=="g"){return "nan"}
+else{return "NAN"}}
+if(self==Number.POSITIVE_INFINITY){if(fmt.type=="f" ||fmt.type=="g"){return "inf"}
+else{return "INF"}}
+if(fmt.precision===undefined && fmt.type !==undefined){fmt.precision=6}
+if(fmt.type=="%"){self*=100}
+if(fmt.type=="e"){var res=self.toExponential(fmt.precision),exp=parseInt(res.substr(res.search("e")+1))
+if(Math.abs(exp)< 10){res=res.substr(0,res.length-1)+"0"+
+res.charAt(res.length-1)}
+return res}
+if(fmt.precision !==undefined){
+var prec=fmt.precision
+if(prec==0){return Math.round(self)+""}
+var res=self.toFixed(prec),pt_pos=res.indexOf(".")
+if(fmt.type !==undefined &&
+(fmt.type=="%" ||fmt.type.toLowerCase()=="f")){if(pt_pos==-1){res+="."+"0".repeat(fmt.precision)}else{var missing=fmt.precision-res.length+pt_pos+1
+if(missing > 0){res+="0".repeat(missing)}}}else if(fmt.type && fmt.type.toLowerCase()=="g"){var exp_fmt=preformat(self,{type:"e"}).split("e"),exp=parseInt(exp_fmt[1])
+if(-4 <=exp && exp < fmt.precision){res=preformat(self,{type:"f",precision:fmt.precision-1-exp})}else{res=preformat(self,{type:"e",precision:fmt.precision-1})}
+var parts=res.split("e")
+if(fmt.alternate){if(parts[0].search(/\./)==-1){parts[0]+='.'}}else{if(parts[1]){var signif=parts[0]
+while(signif.endsWith("0")){signif=signif.substr(0,signif.length-1)}
+if(signif.endsWith(".")){signif=signif.substr(0,signif.length-1)}
+parts[0]=signif}}
+res=parts.join("e")
+if(fmt.type=="G"){res=res.toUpperCase()}
+return res}else if(fmt.type===undefined){fmt.type="g"
+res=preformat(self,fmt)
+fmt.type=undefined}else{var res1=self.toExponential(fmt.precision-1),exp=parseInt(res1.substr(res1.search("e")+1))
+if(exp <-4 ||exp >=fmt.precision-1){var elts=res1.split("e")
+while(elts[0].endsWith("0")){elts[0]=elts[0].substr(0,elts[0].length-1)}
+res=elts.join("e")}}}else{var res=_b_.str.$factory(self)}
+if(fmt.type===undefined ||"gGn".indexOf(fmt.type)!=-1){
+if(res.search("e")==-1){while(res.charAt(res.length-1)=="0"){res=res.substr(0,res.length-1)}}
+if(res.charAt(res.length-1)=="."){if(fmt.type===undefined){res+="0"}
+else{res=res.substr(0,res.length-1)}}}
+if(fmt.sign !==undefined){if((fmt.sign==" " ||fmt.sign=="+" )&& self > 0){res=fmt.sign+res}}
+if(fmt.type=="%"){res+="%"}
+return res}
+float.__format__=function(self,format_spec){self=float_value(self)
+var fmt=new $B.parse_format_spec(format_spec)
+fmt.align=fmt.align ||">"
+var raw=preformat(self,fmt).split('.'),_int=raw[0]
+if(fmt.comma){var len=_int.length,nb=Math.ceil(_int.length/3),chunks=[]
+for(var i=0;i < nb;i++){chunks.push(_int.substring(len-3*i-3,len-3*i))}
+chunks.reverse()
+raw[0]=chunks.join(",")}
+return $B.format_width(raw.join("."),fmt)}
+float.__hash__=function(self){if(self===undefined){return float.__hashvalue__ ||$B.$py_next_hash--}
+var _v=self.valueOf()
+if(_v===Infinity){return 314159}
+if(_v===-Infinity){return-271828}
+if(isNaN(_v)){return 0}
+if(_v==Math.round(_v)){return Math.round(_v)}
+var r=frexp(_v)
+r[0]*=Math.pow(2,31)
+var hipart=_b_.int.$factory(r[0])
+r[0]=(r[0]-hipart)*Math.pow(2,31)
+var x=hipart+_b_.int.$factory(r[0])+(r[1]<< 15)
+return x & 0xFFFFFFFF}
+function isninf(x){var x1=x
+if(_b_.isinstance(x,float)){x1=float.numerator(x)}
+return x1==-Infinity ||x1==Number.NEGATIVE_INFINITY}
+function isinf(x){var x1=x
+if((! x instanceof Number)&& _b_.isinstance(x,float)){x1=float.numerator(x)}
+return x1==Infinity ||x1==-Infinity ||
+x1==Number.POSITIVE_INFINITY ||x1==Number.NEGATIVE_INFINITY}
+function isnan(x){var x1=x
+if(_b_.isinstance(x,float)){x1=float.numerator(x)}
+return isNaN(x1)}
+function fabs(x){if(x==0){return new Number(0)}
+return x > 0 ? float.$factory(x):float.$factory(-x)}
+function frexp(x){var x1=x
+if(_b_.isinstance(x,float)){x1=x.valueOf()}
+if(isNaN(x1)||isinf(x1)){return[x1,-1]}else if(x1==0){return[0,0]}
+var sign=1,ex=0,man=x1
+if(man < 0.){sign=-sign
+man=-man}
+while(man < 0.5){man*=2.0
+ex--}
+while(man >=1.0){man*=0.5
+ex++}
+man*=sign
+return[man,ex]}
+function ldexp(x,i){if(isninf(x)){return float.$factory('-inf')}
+if(isinf(x)){return float.$factory('inf')}
+var y=x
+if(_b_.isinstance(x,float)){y=x.valueOf()}
+if(y==0){return y}
+var j=i
+if(_b_.isinstance(i,float)){j=i.valueOf()}
+return y*Math.pow(2,j)}
+float.$funcs={isinf,isninf,isnan,fabs,frexp,ldexp}
+float.hex=function(self){
+self=float_value(self)
+var DBL_MANT_DIG=53,
+TOHEX_NBITS=DBL_MANT_DIG+3-(DBL_MANT_DIG+2)% 4
+switch(self.valueOf()){case Infinity:
+case-Infinity:
+case Number.NaN:
+case-Number.NaN:
+return self
+case-0:
+return "-0x0.0p0"
+case 0:
+return "0x0.0p0"}
+var _a=frexp(fabs(self.valueOf())),_m=_a[0],_e=_a[1],_shift=1-Math.max(-1021-_e,0)
+_m=ldexp(_m,_shift)
+_e-=_shift
+var _int2hex="0123456789ABCDEF".split(""),_s=_int2hex[Math.floor(_m)]
+_s+='.'
+_m-=Math.floor(_m)
+for(var i=0;i <(TOHEX_NBITS-1)/4;i++){_m*=16.0
+_s+=_int2hex[Math.floor(_m)]
+_m-=Math.floor(_m)}
+var _esign="+"
+if(_e < 0){_esign="-"
+_e=-_e}
+if(self.value < 0){return "-0x"+_s+"p"+_esign+_e}
+return "0x"+_s+"p"+_esign+_e}
+float.__init__=function(self,value){return _b_.None}
+float.__int__=function(self){return parseInt(self)}
+float.is_integer=function(self){return _b_.int.$factory(self)==self}
+float.__mod__=function(self,other){
+self=float_value(self)
+other=float_value(other)
+if(other==0){throw _b_.ZeroDivisionError.$factory("float modulo")}
+if(_b_.isinstance(other,_b_.int)){other=_b_.int.numerator(other)
+return new Number((self % other+other)% other)}
+if(_b_.isinstance(other,float)){
+var q=Math.floor(self/other),r=self-other*q
+return new Number(r)}
+return _b_.NotImplemented}
+float.__mro__=[object]
+float.__mul__=function(self,other){self=float_value(self)
+other=float_value(other)
+if(_b_.isinstance(other,_b_.int)){if(other.__class__==$B.long_int){return new Number(self*parseFloat(other.value))}
+other=_b_.int.numerator(other)
+return new Number(self*other)}
+if(_b_.isinstance(other,float)){return new Number(self*float_value(other))}
+return _b_.NotImplemented}
+float.__ne__=function(self,other){var res=float.__eq__(self,other)
+return res===_b_.NotImplemented ? res :! res}
+float.__neg__=function(self){return new Number(-float_value(self))}
+float.__new__=function(cls,value){if(cls===undefined){throw _b_.TypeError.$factory("float.__new__(): not enough arguments")}else if(! _b_.isinstance(cls,_b_.type)){throw _b_.TypeError.$factory("float.__new__(X): X is not a type object")}
+if(cls===float){return float.$factory(value)}
+return{
+__class__:cls,__dict__:$B.empty_dict(),$brython_value:value ||0}}
+float.__pos__=function(self){return float_value(self)}
+float.__pow__=function(self,other){self=float_value(self)
+other=float_value(other)
+var other_int=_b_.isinstance(other,_b_.int)
+if(other_int ||_b_.isinstance(other,float)){if(self==1){return new Number(1)}
+if(other==0){return new Number(1)}
+if(self==-1 &&
+(! isFinite(other)||other.__class__===$B.long_int ||
+! $B.is_safe_int(other))&&
+! isNaN(other)){return new Number(1)}else if(self==0 && isFinite(other)&& other < 0){throw _b_.ZeroDivisionError.$factory("0.0 cannot be raised "+
+"to a negative power")}else if(self==Number.NEGATIVE_INFINITY && ! isNaN(other)){if(other < 0 && other % 2==1){return new Number(-0.0)}else if(other < 0){return new Number(0)}
+else if(other > 0 && other % 2==1){return Number.NEGATIVE_INFINITY}else{return Number.POSITIVE_INFINITY}}else if(self==Number.POSITIVE_INFINITY && ! isNaN(other)){return other > 0 ? self :new Number(0)}
+if(other==Number.NEGATIVE_INFINITY && ! isNaN(self)){return Math.abs(self)< 1 ? Number.POSITIVE_INFINITY :
+new Number(0)}else if(other==Number.POSITIVE_INFINITY && ! isNaN(self)){return Math.abs(self)< 1 ? new Number(0):
+Number.POSITIVE_INFINITY}
+if(self < 0 &&
+! $B.$getattr(other,"__eq__")(_b_.int.$factory(other))){
+return _b_.complex.__pow__($B.make_complex(self,0),other)}
+return float.$factory(Math.pow(self,other))}
+return _b_.NotImplemented}
+function __newobj__(){
+var $=$B.args('__newobj__',0,{},[],arguments,{},'args',null),args=$.args
+var res=args.slice(1)
+res.__class__=args[0]
+return res}
+float.__reduce_ex__=function(self){return $B.fast_tuple([__newobj__,$B.fast_tuple([self.__class__ ||_b_.int,float_value(self)]),_b_.None,_b_.None,_b_.None])}
+float.__repr__=function(self){$B.builtins_repr_check(float,arguments)
+self=float_value(self).valueOf()
+if(self==Infinity){return 'inf'}else if(self==-Infinity){return '-inf'}else if(isNaN(self)){return 'nan'}else if(self===0){if(1/self===-Infinity){return '-0.0'}
+return '0.0'}
+var res=self+""
+if(res.search(/[.eE]/)==-1){res+=".0"}
+var split_e=res.split(/e/i)
+if(split_e.length==2){var mant=split_e[0],exp=split_e[1]
+if(exp.startsWith('-')){exp_str=parseInt(exp.substr(1))+''
+if(exp_str.length < 2){exp_str='0'+exp_str}
+return mant+'e-'+exp_str}}
+var x,y
+[x,y]=res.split('.')
+var sign=''
+if(x[0]=='-'){x=x.substr(1)
+sign='-'}
+if(x.length > 16){var exp=x.length-1,int_part=x[0],dec_part=x.substr(1)+y
+while(dec_part.endsWith("0")){dec_part=dec_part.substr(0,dec_part.length-1)}
+var mant=int_part
+if(dec_part.length > 0){mant+='.'+dec_part}
+return sign+mant+'e+'+exp}else if(x=="0"){var exp=0
+while(exp < y.length && y.charAt(exp)=="0"){exp++}
+if(exp > 3){
+var rest=y.substr(exp),exp=(exp+1).toString()
+while(rest.endsWith("0")){rest=rest.substr(0,res.length-1)}
+var mant=rest[0]
+if(rest.length > 1){mant+='.'+rest.substr(1)}
+if(exp.length==1){exp='0'+exp}
+return sign+mant+'e-'+exp}}
+return _b_.str.$factory(res)}
+float.__setattr__=function(self,attr,value){if(self.constructor===Number){if(float[attr]===undefined){throw _b_.AttributeError.$factory("'float' object has no attribute '"+
+attr+"'")}else{throw _b_.AttributeError.$factory("'float' object attribute '"+
+attr+"' is read-only")}}
+self[attr]=value
+return _b_.None}
+float.__truediv__=function(self,other){self=float_value(self)
+other=float_value(other)
+if(_b_.isinstance(other,[_b_.int,float])){if(other.valueOf()==0){throw _b_.ZeroDivisionError.$factory("division by zero")}
+return float.$factory(self/other)}
+return _b_.NotImplemented}
+var $op_func=function(self,other){self=float_value(self)
+other=float_value(other)
+if(_b_.isinstance(other,_b_.int)){if(typeof other=="boolean"){return other ? self-1 :self}else if(other.__class__===$B.long_int){return float.$factory(self-parseInt(other.value))}else{return float.$factory(self-other)}}
+if(_b_.isinstance(other,float)){return float.$factory(self-other)}
+return _b_.NotImplemented}
+$op_func+=""
+var $ops={"+":"add","-":"sub"}
+for(var $op in $ops){var $opf=$op_func.replace(/-/gm,$op)
+$opf=$opf.replace(/__rsub__/gm,"__r"+$ops[$op]+"__")
+eval("float.__"+$ops[$op]+"__ = "+$opf)}
+var $comp_func=function(self,other){self=float_value(self)
+other=float_value(other)
+if(_b_.isinstance(other,_b_.int)){if(other.__class__===$B.long_int){return self > parseInt(other.value)}
+return self > other.valueOf()}
+if(_b_.isinstance(other,float)){return self > other}
+if(_b_.isinstance(other,_b_.bool)){return self.valueOf()> _b_.bool.__hash__(other)}
+if(_b_.hasattr(other,"__int__")||_b_.hasattr(other,"__index__")){return _b_.int.__gt__(self,$B.$GetInt(other))}
+var inv_op=$B.$getattr(other,"__le__",_b_.None)
+if(inv_op !==_b_.None){return inv_op(self)}
+throw _b_.TypeError.$factory(
+"unorderable types: float() > "+$B.class_name(other)+"()")}
+$comp_func+=""
+for(var $op in $B.$comps){eval("float.__"+$B.$comps[$op]+"__ = "+
+$comp_func.replace(/>/gm,$op).
+replace(/__gt__/gm,"__"+$B.$comps[$op]+"__").
+replace(/__le__/,"__"+$B.$inv_comps[$op]+"__"))}
+var r_opnames=["add","sub","mul","truediv","floordiv","mod","pow","lshift","rshift","and","xor","or","divmod"]
+for(var r_opname of r_opnames){if(float["__r"+r_opname+"__"]===undefined &&
+float['__'+r_opname+'__']){float["__r"+r_opname+"__"]=(function(name){return function(self,other){if(_b_.isinstance(other,_b_.int)){other=float_value(_b_.int.numerator(other))
+return float["__"+name+"__"](other,self)}else if(_b_.isinstance(other,float)){other=float_value(other)
+return float["__"+name+"__"](other,self)}
+return _b_.NotImplemented}})(r_opname)}}
+function $FloatClass(value){return new Number(value)}
+function to_digits(s){
+var arabic_digits="\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",res=""
+for(var i=0;i < s.length;i++){var x=arabic_digits.indexOf(s[i])
+if(x >-1){res+=x}
+else{res+=s[i]}}
+return res}
+float.$factory=function(value){switch(value){case undefined:
+return $FloatClass(0.0)
+case Number.MAX_VALUE:
+return $FloatClass(Infinity)
+case-Number.MAX_VALUE:
+return $FloatClass(-Infinity)
+case true:
+return new Number(1)
+case false:
+return new Number(0)}
+if(typeof value=="number"){return new Number(value)}
+if(_b_.isinstance(value,float)){return float_value(value)}
+if(_b_.isinstance(value,_b_.bytes)){var s=$B.$getattr(value,"decode")("latin-1")
+return float.$factory($B.$getattr(value,"decode")("latin-1"))}
+if(typeof value=="string"){value=value.trim()
+switch(value.toLowerCase()){case "+inf":
+case "inf":
+case "+infinity":
+case "infinity":
+return Number.POSITIVE_INFINITY
+case "-inf":
+case "-infinity":
+return Number.NEGATIVE_INFINITY
+case "+nan":
+case "nan":
+return Number.NaN
+case "-nan":
+return-Number.NaN
+case "":
+throw _b_.ValueError.$factory("count not convert string to float")
+default:
+value=value.charAt(0)+value.substr(1).replace(/_/g,"")
+value=to_digits(value)
+if(isFinite(value))return $FloatClass(eval(value))
+else{
+_b_.str.encode(value,"latin-1")
+throw _b_.ValueError.$factory(
+"Could not convert to float(): '"+
+_b_.str.$factory(value)+"'")}}}
+var klass=value.__class__ ||$B.get_class(value),num_value=$B.to_num(value,["__float__","__index__"])
+if(value !==Number.POSITIVE_INFINITY && ! isFinite(num_value)){throw _b_.OverflowError.$factory('int too large to convert to float')}
+if(num_value !==null){return num_value}
+throw _b_.TypeError.$factory("float() argument must be a string or a "+
+"number, not '"+$B.class_name(value)+"'")}
+$B.$FloatClass=$FloatClass
+$B.set_func_names(float,"builtins")
+var FloatSubclass=$B.FloatSubclass={__class__:_b_.type,__mro__:[object],$infos:{__module__:"builtins",__name__:"float"},$is_class:true}
+for(var $attr in float){if(typeof float[$attr]=="function"){FloatSubclass[$attr]=(function(attr){return function(){var args=[],pos=0
+if(arguments.length > 0){var args=[arguments[0].valueOf()],pos=1
+for(var i=1,len=arguments.length;i < len;i++){args[pos++]=arguments[i]}}
+return float[attr].apply(null,args)}})($attr)}}
+$B.set_func_names(FloatSubclass,"builtins")
+_b_.float=float})(__BRYTHON__)
+;
+;(function($B){var _b_=$B.builtins
+function $UnsupportedOpType(op,class1,class2){throw _b_.TypeError.$factory("unsupported operand type(s) for "+
+op+": '"+class1+"' and '"+class2+"'")}
+var complex={__class__:_b_.type,__dir__:_b_.object.__dir__,$infos:{__module__:"builtins",__name__:"complex"},$is_class:true,$native:true,$descriptors:{real:true,imag:true}}
+complex.__abs__=function(self){var _rf=isFinite(self.$real),_if=isFinite(self.$imag)
+if((_rf && isNaN(self.$imag))||(_if && isNaN(self.$real))||
+(isNaN(self.$imag)&& isNaN(self.$real))){return NaN}
+if(! _rf ||! _if){return Infinity}
+var mag=Math.sqrt(Math.pow(self.$real,2)+Math.pow(self.$imag,2))
+if(!isFinite(mag)&& _rf && _if){
+throw _b_.OverflowError.$factory("absolute value too large")}
+return mag}
+complex.__add__=function(self,other){if(_b_.isinstance(other,complex)){return make_complex(self.$real+other.$real,self.$imag+other.$imag)}
+if(_b_.isinstance(other,_b_.int)){other=_b_.int.numerator(other)
+return make_complex($B.add(self.$real,other.valueOf()),self.$imag)}
+if(_b_.isinstance(other,_b_.float)){return make_complex(self.$real+other.valueOf(),self.$imag)}
+return _b_.NotImplemented}
+complex.__bool__=function(self){return(self.$real !=0 ||self.$imag !=0)}
+complex.__complex__=function(self){return self}
+complex.__eq__=function(self,other){if(_b_.isinstance(other,complex)){return self.$real.valueOf()==other.$real.valueOf()&&
+self.$imag.valueOf()==other.$imag.valueOf()}
+if(_b_.isinstance(other,_b_.int)){if(self.$imag !=0){return false}
+return self.$real==other.valueOf()}
+if(_b_.isinstance(other,_b_.float)){if(self.$imag !=0){return false}
+return self.$real==other.valueOf()}
+return _b_.NotImplemented}
+complex.__hash__=function(self){
+return self.$imag*1000003+self.$real}
+complex.__init__=function(){return _b_.None}
+complex.__invert__=function(self){return ~self}
+complex.__mro__=[_b_.object]
+complex.__mul__=function(self,other){if(_b_.isinstance(other,complex)){return make_complex(self.$real*other.$real-self.$imag*other.$imag,self.$imag*other.$real+self.$real*other.$imag)}else if(_b_.isinstance(other,_b_.int)){return make_complex(self.$real*other.valueOf(),self.$imag*other.valueOf())}else if(_b_.isinstance(other,_b_.float)){return make_complex(self.$real*other,self.$imag*other)}else if(_b_.isinstance(other,_b_.bool)){if(other.valueOf()){return self}
+return make_complex(0,0)}
+$UnsupportedOpType("*",complex,other)}
+complex.__ne__=function(self,other){var res=complex.__eq__(self,other)
+return res===_b_.NotImplemented ? res :! res}
+complex.__neg__=function(self){return make_complex(-self.$real,-self.$imag)}
+complex.__new__=function(cls){if(cls===undefined){throw _b_.TypeError.$factory('complex.__new__(): not enough arguments')}
+var res,missing={},args=$B.args("complex",3,{cls:null,real:null,imag:null},["cls","real","imag"],arguments,{real:0,imag:missing},null,null),$real=args.real,$imag=args.imag
+if(typeof $real=="string"){if($imag !==missing){throw _b_.TypeError.$factory("complex() can't take second arg "+
+"if first is a string")}else{var arg=$real
+$real=$real.trim()
+if($real.startsWith("(")&& $real.endsWith(")")){$real=$real.substr(1)
+$real=$real.substr(0,$real.length-1)}
+var complex_re=/^\s*([\+\-]*[0-9_]*\.?[0-9_]*(e[\+\-]*[0-9_]*)?)([\+\-]?)([0-9_]*\.?[0-9_]*(e[\+\-]*[0-9_]*)?)(j?)\s*$/i
+var parts=complex_re.exec($real)
+function to_num(s){var res=parseFloat(s.charAt(0)+s.substr(1).replace(/_/g,""))
+if(isNaN(res)){throw _b_.ValueError.$factory("could not convert string "+
+"to complex: '"+arg+"'")}
+return res}
+if(parts===null){throw _b_.ValueError.$factory("complex() arg is a malformed string")}else if(parts[_real]=="." ||parts[_imag]=="." ||
+parts[_real]==".e" ||parts[_imag]==".e" ||
+parts[_real]=="e" ||parts[_imag]=="e"){throw _b_.ValueError.$factory("complex() arg is a malformed string")}else if(parts[_j]!=""){if(parts[_sign]==""){$real=0
+if(parts[_real]=="+" ||parts[_real]==""){$imag=1}else if(parts[_real]=='-'){$imag=-1}else{$imag=to_num(parts[_real])}}else{$real=to_num(parts[_real])
+$imag=parts[_imag]=="" ? 1 :to_num(parts[_imag])
+$imag=parts[_sign]=="-" ?-$imag :$imag}}else{$real=to_num(parts[_real])
+$imag=0}
+res={__class__:complex,$real:$real ||0,$imag:$imag ||0}
+return res}}
+$imag=$imag===missing ? 0 :$imag
+if(arguments.length==2 && $real.__class__===complex && $imag==0){return $real}
+if(_b_.isinstance($real,[_b_.float,_b_.int])&&
+_b_.isinstance($imag,[_b_.float,_b_.int])){res={__class__:complex,$real:$real,$imag:$imag}
+return res}
+var real_to_num=$B.to_num($real,["__complex__","__float__","__index__"])
+if(real_to_num===null){throw _b_.TypeError.$factory("complex() first argument must be a "+
+" string or a number, not '"+$B.class_name($real)+"'")}
+$real=real_to_num
+$imag=_convert($imag)
+if(! _b_.isinstance($real,_b_.float)&& ! _b_.isinstance($real,_b_.int)&&
+! _b_.isinstance($real,_b_.complex)){throw _b_.TypeError.$factory("complex() argument must be a string "+
+"or a number")}
+if(typeof $imag=="string"){throw _b_.TypeError.$factory("complex() second arg can't be a string")}
+if(! _b_.isinstance($imag,_b_.float)&& ! _b_.isinstance($imag,_b_.int)&&
+! _b_.isinstance($imag,_b_.complex)&& $imag !==missing){throw _b_.TypeError.$factory("complex() argument must be a string "+
+"or a number")}
+$imag=complex.__mul__(complex.$factory("1j"),$imag)
+return complex.__add__($imag,$real)}
+complex.__pos__=function(self){return self}
+function complex2expo(cx){var norm=Math.sqrt((cx.$real*cx.$real)+(cx.$imag*cx.$imag)),sin=cx.$imag/norm,cos=cx.$real/norm,angle
+if(cos==0){angle=sin==1 ? Math.PI/2 :3*Math.PI/2}
+else if(sin==0){angle=cos==1 ? 0 :Math.PI}
+else{angle=Math.atan(sin/cos)}
+return{norm:norm,angle:angle}}
+function hypot(){var $=$B.args("hypot",0,{},[],arguments,{},"args",null)
+return _b_.float.$factory(Math.hypot(...$.args))}
+function c_powi(x,n){if(n > 0){return c_powu(x,n)}else{return c_quot(c_1,c_powu(x,-n))}}
+function c_powu(x,n){var r,p,mask=1,r=c_1,p=x
+while(mask > 0 && n >=mask){if(n & mask){r=c_prod(r,p);}
+mask <<=1;
+p=c_prod(p,p)}
+return r;}
+function c_prod(a,b){return make_complex(
+a.$real*b.$real-a.$imag*b.$imag,a.$real*b.$imag+a.$imag*b.$real)}
+function c_quot(a,b){var r,
+abs_breal=_b_.abs(b.$real),abs_bimag=_b_.abs(b.$imag)
+if($B.rich_comp('__ge__',abs_breal,abs_bimag)){
+if(abs_breal==0.0){throw _b_.ZeroDivisionError.$factory()}else{var ratio=b.$imag/b.$real,denom=b.$real+b.$imag*ratio
+return make_complex((a.$real+a.$imag*ratio)/denom,(a.$imag-a.$real*ratio)/denom)}}else if(abs_bimag >=abs_breal){
+var ratio=b.$real/b.$imag,denom=b.$real*ratio+b.$imag;
+if(b.$imag==0.0){throw _b_.ZeroDivisionError.$factory()}
+return make_complex(
+(a.real*ratio+a.imag)/denom,(a.imag*ratio-a.real)/denom)}else{
+return _b_.float('nan')}}
+complex.__pow__=function(self,other){
+if(other==1){return self}
+if((_b_.isinstance(other,_b_.int)&& _b_.abs(other)< 100)||
+(other.$imag==0.0 && other.$real==_b_.floor(other.$real)&&
+_b_.abs(other.$real)<=100.0)){return c_powi(self,other)}
+var exp=complex2expo(self),angle=exp.angle,res=Math.pow(exp.norm,other)
+if(_b_.isinstance(other,[_b_.int,_b_.float])){return make_complex(res*Math.cos(angle*other),res*Math.sin(angle*other))}else if(_b_.isinstance(other,complex)){
+var x=other.$real,y=other.$imag
+var pw=Math.pow(exp.norm,x)*Math.pow(Math.E,-y*angle),theta=y*Math.log(exp.norm)-x*angle
+return make_complex(pw*Math.cos(theta),pw*Math.sin(theta))}else{throw _b_.TypeError.$factory("unsupported operand type(s) "+
+"for ** or pow(): 'complex' and '"+
+$B.class_name(other)+"'")}}
+complex.__radd__=function(self,other){if(_b_.isinstance(other,_b_.bool)){other=other ? 1 :0}
+if(_b_.isinstance(other,[_b_.int,_b_.float])){return make_complex(other+self.$real,self.$imag)}
+return _b_.NotImplemented}
+complex.__repr__=function(self){$B.builtins_repr_check(complex,arguments)
+var real=_b_.str.$factory(self.$real),imag=_b_.str.$factory(self.$imag)
+if(imag.endsWith('.0')){imag=imag.substr(0,imag.length-2)}
+if(self.$imag instanceof Number && self.$imag==parseInt(self.$imag)){if(self.$imag==0 && 1/self.$imag===-Infinity){imag="-0"}}
+if(self.$real==0){if(1/self.$real < 0){if(imag.startsWith('-')){return "-0"+imag+"j"}
+return "-0+"+imag+"j"}else{return imag+"j"}}
+if(self.$imag > 0 ||isNaN(self.$imag)){return "("+real+"+"+imag+"j)"}
+if(self.$imag==0){if(1/self.$imag < 0){return "("+real+"-0j)"}
+return "("+real+"+0j)"}
+return "("+real+"-"+_b_.str.$factory(-self.$imag)+"j)"}
+complex.__rmul__=function(self,other){if(_b_.isinstance(other,_b_.bool)){other=other ? 1 :0}
+if(_b_.isinstance(other,[_b_.int,_b_.float])){return make_complex(other*self.$real,other*self.$imag)}
+return _b_.NotImplemented}
+complex.__sqrt__=function(self){if(self.$imag==0){return complex(Math.sqrt(self.$real))}
+var r=self.$real,i=self.$imag,_a=Math.sqrt((r+sqrt)/2),_b=Number.sign(i)*Math.sqrt((-r+sqrt)/2)
+return make_complex(_a,_b)}
+complex.__sub__=function(self,other){if(_b_.isinstance(other,complex)){return make_complex(self.$real-other.$real,self.$imag-other.$imag)}
+if(_b_.isinstance(other,_b_.int)){other=_b_.int.numerator(other)
+return make_complex($B.sub(self.$real,other.valueOf()),self.$imag)}
+if(_b_.isinstance(other,_b_.float)){return make_complex(self.$real-other.valueOf(),self.$imag)}
+return _b_.NotImplemented}
+complex.__truediv__=function(self,other){if(_b_.isinstance(other,complex)){if(other.$real==0 && other.$imag==0){throw _b_.ZeroDivisionError.$factory("division by zero")}
+var _num=self.$real*other.$real+self.$imag*other.$imag,_div=other.$real*other.$real+other.$imag*other.$imag
+var _num2=self.$imag*other.$real-self.$real*other.$imag
+return make_complex(_num/_div,_num2/_div)}
+if(_b_.isinstance(other,_b_.int)){if(! other.valueOf()){throw _b_.ZeroDivisionError.$factory('division by zero')}
+return complex.__truediv__(self,complex.$factory(other.valueOf()))}
+if(_b_.isinstance(other,_b_.float)){if(! other.valueOf()){throw _b_.ZeroDivisionError.$factory("division by zero")}
+return complex.__truediv__(self,complex.$factory(other.valueOf()))}
+$UnsupportedOpType("//","complex",other.__class__)}
+complex.conjugate=function(self){return make_complex(self.$real,-self.$imag)}
+complex.__ior__=complex.__or__
+var r_opnames=["add","sub","mul","truediv","floordiv","mod","pow","lshift","rshift","and","xor","or"]
+for(var r_opname of r_opnames){if(complex["__r"+r_opname+"__"]===undefined &&
+complex['__'+r_opname+'__']){complex["__r"+r_opname+"__"]=(function(name){return function(self,other){if(_b_.isinstance(other,[_b_.int,_b_.float])){other=make_complex(other,0)
+return complex["__"+name+"__"](other,self)}else if(_b_.isinstance(other,complex)){return complex["__"+name+"__"](other,self)}
+return _b_.NotImplemented}})(r_opname)}}
+var $comp_func=function(self,other){if(other===undefined ||other==_b_.None){return _b_.NotImplemented}
+throw _b_.TypeError.$factory("no ordering relation "+
+"is defined for complex numbers")}
+$comp_func+=''
+for(var $op in $B.$comps){eval("complex.__"+$B.$comps[$op]+"__ = "+
+$comp_func.replace(/>/gm,$op))}
+complex.real=function(self){return new Number(self.$real)}
+complex.real.setter=function(){throw _b_.AttributeError.$factory("readonly attribute")}
+complex.imag=function(self){return new Number(self.$imag)}
+complex.imag.setter=function(){throw _b_.AttributeError.$factory("readonly attribute")}
+var _real=1,_real_mantissa=2,_sign=3,_imag=4,_imag_mantissa=5,_j=6
+var type_conversions=["__complex__","__float__","__index__"]
+var _convert=function(num){var klass=num.__class__ ||$B.get_class(num)
+for(var i=0;i < type_conversions.length;i++){var missing={},method=$B.$getattr(klass,type_conversions[i],missing)
+if(method !==missing){return method(num)}}
+return null}
+var make_complex=$B.make_complex=function(real,imag){return{
+__class__:complex,$real:real,$imag:imag}}
+var c_1=make_complex(1,0)
+complex.$factory=function(){return complex.__new__(complex,...arguments)}
+$B.set_func_names(complex,"builtins")
+_b_.complex=complex})(__BRYTHON__)
+;
+;(function($B){
+var _b_=$B.builtins
+var str_hash=_b_.str.__hash__,$N=_b_.None
+var set_ops=["eq","le","lt","ge","gt","sub","rsub","and","or","xor"]
+function is_sublist(t1,t2){
+for(var i=0,ilen=t1.length;i < ilen;i++){var x=t1[i],flag=false
+for(var j=0,jlen=t2.length;j < jlen;j++){if($B.rich_comp("__eq__",x,t2[j])){t2.splice(j,1)
+flag=true
+break}}
+if(! flag){return false}}
+return true}
+dict_view_op={__eq__:function(t1,t2){return t1.length==t2.length && is_sublist(t1,t2)},__ne__:function(t1,t2){return ! dict_view_op.__eq__(t1,t2)},__lt__:function(t1,t2){return t1.length < t2.length && is_sublist(t1,t2)},__gt__:function(t1,t2){return dict_view_op.__lt__(t2,t1)},__le__:function(t1,t2){return t1.length <=t2.length && is_sublist(t1,t2)},__ge__:function(t1,t2){return dict_view_op.__le__(t2,t1)},__and__:function(t1,t2){var items=[]
+for(var i=0,ilen=t1.length;i < ilen;i++){var x=t1[i]
+flag=false
+for(var j=0,jlen=t2.length;j < jlen;j++){if($B.rich_comp("__eq__",x,t2[j])){t2.splice(j,1)
+items.push(x)
+break}}}
+return items},__or__:function(t1,t2){var items=t1
+for(var j=0,jlen=t2.length;j < jlen;j++){var y=t2[j],flag=false
+for(var i=0,ilen=t1.length;i < ilen;i++){if($B.rich_comp("__eq__",y,t1[i])){t2.splice(j,1)
+flag=true
+break}}
+if(! flag){items.push(y)}}
+return items}}
+$B.make_view=function(name){var klass=$B.make_class(name,function(d,items,set_like){return{
+__class__:klass,__dict__:$B.empty_dict(),counter:-1,dict:d,items:items,len:items.length,set_like:set_like}})
+for(var i=0,len=set_ops.length;i < len;i++){var op="__"+set_ops[i]+"__"
+klass[op]=(function(op){return function(self,other){
+if(self.set_like){return _b_.set[op](_b_.set.$factory(self),_b_.set.$factory(other))}else{
+if(other.__class__ !==klass){return false}
+var other_items=_b_.list.$factory(other)
+return dict_view_op[op](self.items,other_items)}}})(op)}
+klass.__iter__=function(self){var it=klass.$iterator.$factory(self.items)
+it.test_change=function(){return self.dict.$version !=self.dict_version}
+return it}
+klass.__len__=function(self){return self.len}
+klass.__repr__=function(self){return klass.$infos.__name__+'('+_b_.repr(self.items)+')'}
+$B.set_func_names(klass,"builtins")
+return klass}
+var dict={__class__:_b_.type,__mro__:[_b_.object],$infos:{__module__:"builtins",__name__:"dict"},$is_class:true,$native:true,$match_mapping_pattern:true }
+dict.$to_obj=function(d){
+var res={}
+for(var key in d.$string_dict){res[key]=d.$string_dict[key][0]}
+return res}
+function to_list(d,ix){var items=[],item
+if(d.$jsobj){items=[]
+for(var attr in d.$jsobj){if((! attr.startsWith("$"))&&
+((! d.$exclude)||! d.$exclude(attr))){var val=d.$jsobj[attr]
+if(val===undefined){val=_b_.NotImplemented}
+else if(val===null){val=$N}
+items.push([attr,val])}}}else if(_b_.isinstance(d,_b_.dict)){for(var k in d.$numeric_dict){items.push([parseFloat(k),d.$numeric_dict[k]])}
+for(var k in d.$string_dict){items.push([k,d.$string_dict[k]])}
+for(var k in d.$object_dict){d.$object_dict[k].forEach(function(item){items.push(item)})}
+items.sort(function(a,b){return a[1][1]-b[1][1]})
+items=items.map(function(item){return[item[0],item[1][0]]})}
+if(ix !==undefined){res=items.map(function(item){return item[ix]})
+return res}else{items.__class__=_b_.tuple
+return items.map(function(item){item.__class__=_b_.tuple;return item}
+)}}
+$B.dict_to_list=to_list
+var $copy_dict=function(left,right){var _l=to_list(right),si=dict.$setitem
+right.$version=right.$version ||0
+var right_version=right.$version ||0
+for(var i=0,len=_l.length;i < len;i++){si(left,_l[i][0],_l[i][1])
+if(right.$version !=right_version){throw _b_.RuntimeError.$factory("dict mutated during update")}}}
+function rank(self,hash,key){
+var pairs=self.$object_dict[hash]
+if(pairs !==undefined){for(var i=0,len=pairs.length;i < len;i++){if($B.rich_comp("__eq__",key,pairs[i][0])){return i}}}
+return-1}
+dict.__bool__=function(){var $=$B.args("__bool__",1,{self:null},["self"],arguments,{},null,null)
+return dict.__len__($.self)> 0}
+dict.__class_getitem__=function(cls,item){
+if(! Array.isArray(item)){item=[item]}
+return $B.GenericAlias.$factory(cls,item)}
+dict.__contains__=function(){var $=$B.args("__contains__",2,{self:null,key:null},["self","key"],arguments,{},null,null),self=$.self,key=$.key
+if(self.$jsobj){return self.$jsobj[key]!==undefined}
+switch(typeof key){case "string":
+return self.$string_dict.hasOwnProperty(key)
+case "number":
+return self.$numeric_dict[key]!==undefined}
+var hash=_b_.hash(key)
+if(self.$str_hash[hash]!==undefined &&
+$B.rich_comp("__eq__",key,self.$str_hash[hash])){return true}
+if(self.$numeric_dict[hash]!==undefined &&
+$B.rich_comp("__eq__",key,hash)){return true}
+return rank(self,hash,key)>-1}
+dict.__delitem__=function(){var $=$B.args("__eq__",2,{self:null,arg:null},["self","arg"],arguments,{},null,null),self=$.self,arg=$.arg
+if(self.$jsobj){if(self.$jsobj[arg]===undefined){throw _b_.KeyError.$factory(arg)}
+delete self.$jsobj[arg]
+return $N}
+switch(typeof arg){case "string":
+if(self.$string_dict[arg]===undefined){throw _b_.KeyError.$factory(_b_.str.$factory(arg))}
+delete self.$string_dict[arg]
+delete self.$str_hash[str_hash(arg)]
+self.$version++
+return $N
+case "number":
+if(self.$numeric_dict[arg]===undefined){throw _b_.KeyError.$factory(_b_.str.$factory(arg))}
+delete self.$numeric_dict[arg]
+self.$version++
+return $N}
+var hash=_b_.hash(arg),ix
+if((ix=rank(self,hash,arg))>-1){self.$object_dict[hash].splice(ix,1)}else{throw _b_.KeyError.$factory(_b_.str.$factory(arg))}
+self.$version++
+return $N}
+dict.__eq__=function(){var $=$B.args("__eq__",2,{self:null,other:null},["self","other"],arguments,{},null,null),self=$.self,other=$.other
+if(! _b_.isinstance(other,dict)){return false}
+if(self.$jsobj){self=jsobj2dict(self.$jsobj)}
+if(other.$jsobj){other=jsobj2dict(other.$jsobj)}
+if(dict.__len__(self)!=dict.__len__(other)){return false}
+if(self.$string_dict.length !=other.$string_dict.length){return false}
+for(var k in self.$numeric_dict){if(other.$numeric_dict.hasOwnProperty(k)){if(!$B.rich_comp("__eq__",other.$numeric_dict[k][0],self.$numeric_dict[k][0])){return false}}else if(other.$object_dict.hasOwnProperty(k)){var pairs=other.$object_dict[k],flag=false
+for(var i=0,len=pairs.length;i < len;i++){if($B.rich_comp("__eq__",k,pairs[i][0])&&
+$B.rich_comp("__eq__",self.$numeric_dict[k],pairs[i][1])){flag=true
+break}}
+if(! flag){return false}}else{return false}}
+for(var k in self.$string_dict){if(!other.$string_dict.hasOwnProperty(k)||
+!$B.rich_comp("__eq__",other.$string_dict[k][0],self.$string_dict[k][0])){return false}}
+for(var hash in self.$object_dict){var pairs=self.$object_dict[hash]
+var other_pairs=[]
+if(other.$numeric_dict[hash]!==undefined){other_pairs.push([hash,other.$numeric_dict[hash]])}
+if(other.$object_dict[hash]!==undefined){other_pairs=other_pairs.concat(other.$object_dict[hash])}
+if(other_pairs.length==0){return false}
+for(var i=0,len_i=pairs.length;i < len_i;i++){var flag=false
+var key=pairs[i][0],value=pairs[i][1][0]
+for(var j=0,len_j=other_pairs.length;j < len_j;j++){if($B.rich_comp("__eq__",key,other_pairs[j][0])&&
+$B.rich_comp("__eq__",value,other_pairs[j][1][0])){flag=true
+break}}
+if(! flag){return false}}}
+return true}
+dict.__getitem__=function(){var $=$B.args("__getitem__",2,{self:null,arg:null},["self","arg"],arguments,{},null,null),self=$.self,arg=$.arg
+return dict.$getitem(self,arg)}
+dict.$getitem=function(self,arg,ignore_missing){
+if(self.$jsobj){if(self.$exclude && self.$exclude(arg)){throw _b_.KeyError.$factory(arg)}
+if(self.$jsobj[arg]===undefined){if(self.$jsobj.hasOwnProperty &&
+self.$jsobj.hasOwnProperty(arg)){return $B.Undefined}
+throw _b_.KeyError.$factory(arg)}
+return self.$jsobj[arg]}
+switch(typeof arg){case "string":
+if(self.$string_dict.hasOwnProperty(arg)){return self.$string_dict[arg][0]}
+break
+case "number":
+if(self.$numeric_dict[arg]!==undefined){return self.$numeric_dict[arg][0]}
+break}
+var hash=_b_.hash(arg),_eq=function(other){return $B.rich_comp("__eq__",arg,other)}
+if(typeof arg=="object"){arg.$hash=hash }
+var sk=self.$str_hash[hash]
+if(sk !==undefined && _eq(sk)){return self.$string_dict[sk][0]}
+if(self.$numeric_dict[hash]!==undefined && _eq(hash)){return self.$numeric_dict[hash][0]}
+if(_b_.isinstance(arg,_b_.str)){
+if(self.$string_dict.hasOwnProperty(arg.valueOf())){return self.$string_dict[arg.valueOf()][0]}}
+var ix=rank(self,hash,arg)
+if(ix >-1){return self.$object_dict[hash][ix][1][0]}
+if(! ignore_missing){if(self.__class__ !==dict && ! ignore_missing){try{var missing_method=$B.$getattr(self.__class__,"__missing__",_b_.None)}catch(err){console.log(err)}
+if(missing_method !==_b_.None){return missing_method(self,arg)}}}
+throw _b_.KeyError.$factory(arg)}
+dict.__hash__=_b_.None
+function init_from_list(self,args){var i=-1,stop=args.length-1,si=dict.__setitem__
+while(i++< stop){var item=args[i]
+if(item.length !=2){throw _b_.ValueError.$factory("dictionary "+
+`update sequence element #${i} has length 1; 2 is required`)}
+switch(typeof item[0]){case 'string':
+self.$string_dict[item[0]]=[item[1],self.$order++]
+self.$str_hash[str_hash(item[0])]=item[0]
+self.$version++
+break
+case 'number':
+if(item[0]!=0 && item[0]!=1){self.$numeric_dict[item[0]]=[item[1],self.$order++]
+self.$version++
+break}
+default:
+si(self,item[0],item[1])
+break}}}
+dict.__init__=function(self,first,second){if(first===undefined){return $N}
+if(second===undefined){if(first.$nat !='kw' && $B.get_class(first)===$B.JSObj){for(var key in first){self.$string_dict[key]=[first[key],self.$order++]}
+return _b_.None}else if(first.$jsobj){self.$jsobj={}
+for(var attr in first.$jsobj){self.$jsobj[attr]=first.$jsobj[attr]}
+return $N}else if(Array.isArray(first)){init_from_list(self,first)
+return $N}}
+var $=$B.args("dict",1,{self:null},["self"],arguments,{},"first","second")
+var args=$.first
+if(args.length > 1){throw _b_.TypeError.$factory("dict expected at most 1 argument"+
+", got 2")}else if(args.length==1){args=args[0]
+if(args.__class__===dict){['$string_dict','$str_hash','$numeric_dict','$object_dict'].
+forEach(function(d){for(key in args[d]){self[d][key]=args[d][key]}})}else if(_b_.isinstance(args,dict)){$copy_dict(self,args)}else{var keys=$B.$getattr(args,"keys",null)
+if(keys !==null){var gi=$B.$getattr(args,"__getitem__",null)
+if(gi !==null){
+gi=$B.$call(gi)
+var kiter=_b_.iter($B.$call(keys)())
+while(true){try{var key=_b_.next(kiter),value=gi(key)
+dict.__setitem__(self,key,value)}catch(err){if(err.__class__===_b_.StopIteration){break}
+throw err}}
+return $N}}
+if(! Array.isArray(args)){args=_b_.list.$factory(args)}
+init_from_list(self,args)}}
+var kw=$.second.$string_dict
+for(var attr in kw){switch(typeof attr){case "string":
+self.$string_dict[attr]=[kw[attr][0],self.$order++]
+self.$str_hash[str_hash(attr)]=attr
+break
+case "number":
+self.$numeric_dict[attr]=[kw[attr][0],self.$order++]
+break
+default:
+si(self,attr,kw[attr][0])
+break}}
+return $N}
+dict.__iter__=function(self){return _b_.iter(dict.keys(self))}
+dict.__ior__=function(self,other){
+dict.update(self,other)
+return self}
+dict.__len__=function(self){var _count=0
+if(self.$jsobj){for(var attr in self.$jsobj){if(attr.charAt(0)!="$" &&
+((! self.$exclude)||! self.$exclude(attr))){_count++}}
+return _count}
+for(var k in self.$numeric_dict){_count++}
+for(var k in self.$string_dict){_count++}
+for(var hash in self.$object_dict){_count+=self.$object_dict[hash].length}
+return _count}
+dict.__ne__=function(self,other){return ! dict.__eq__(self,other)}
+dict.__new__=function(cls){if(cls===undefined){throw _b_.TypeError.$factory("int.__new__(): not enough arguments")}
+var instance={__class__:cls,$numeric_dict :{},$object_dict :{},$string_dict :{},$str_hash:{},$version:0,$order:0}
+if(cls !==dict){instance.__dict__=$B.empty_dict()}
+return instance}
+dict.__or__=function(self,other){
+if(! _b_.isinstance(other,dict)){return _b_.NotImplemented}
+var res=dict.copy(self)
+dict.update(res,other)
+return res}
+function __newobj__(){
+var $=$B.args('__newobj__',0,{},[],arguments,{},'args',null),args=$.args
+var res=$B.empty_dict()
+res.__class__=args[0]
+return res}
+dict.__reduce_ex__=function(self,protocol){return $B.fast_tuple([__newobj__,$B.fast_tuple([self.__class__]),_b_.None,_b_.None,dict.items(self)])}
+dict.__repr__=function(self){$B.builtins_repr_check(dict,arguments)
+if(self.$jsobj){
+return dict.__repr__(jsobj2dict(self.$jsobj,self.$exclude))}
+if($B.repr.enter(self)){return "{...}"}
+var res=[],items=to_list(self)
+items.forEach(function(item){try{res.push(_b_.repr(item[0])+": "+_b_.repr(item[1]))}catch(err){throw err}})
+$B.repr.leave(self)
+return "{"+res.join(", ")+"}"}
+dict.__ror__=function(self,other){
+if(! _b_.isinstance(other,dict)){return _b_.NotImplemented}
+var res=dict.copy(other)
+dict.update(res,self)
+return res}
+dict.__setitem__=function(self,key,value){var $=$B.args("__setitem__",3,{self:null,key:null,value:null},["self","key","value"],arguments,{},null,null)
+return dict.$setitem($.self,$.key,$.value)}
+dict.$setitem=function(self,key,value,$hash){
+if(self.$jsobj){if(self.$from_js){
+value=$B.pyobj2jsobj(value)}
+if(self.$jsobj.__class__===_b_.type){self.$jsobj[key]=value
+if(key=="__init__" ||key=="__new__"){
+self.$jsobj.$factory=$B.$instance_creator(self.$jsobj)}}else{self.$jsobj[key]=value}
+return $N}
+if(key instanceof String){key=key.valueOf()}
+switch(typeof key){case "string":
+if(self.$string_dict===undefined){console.log("pas de string dict",self,key,value)}
+if(self.$string_dict.hasOwnProperty(key)){self.$string_dict[key][0]=value}else{self.$string_dict[key]=[value,self.$order++]
+self.$str_hash[str_hash(key)]=key
+self.$version++}
+return $N
+case "number":
+if(self.$numeric_dict[key]!==undefined){
+self.$numeric_dict[key][0]=value}else{
+var done=false
+if((key==0 ||key==1)&&
+self.$object_dict[key]!==undefined){for(const item of self.$object_dict[key]){if((key==0 && item[0]===false)||
+(key==1 && item[0]===true)){
+item[1][0]=value
+done=true}}}
+if(! done){
+self.$numeric_dict[key]=[value,self.$order++]}
+self.$version++}
+return $N
+case "boolean":
+var num=key ? 1 :0
+if(self.$numeric_dict[num]!==undefined){var order=self.$numeric_dict[num][1]
+self.$numeric_dict[num]=[value,order]
+return}
+if(self.$object_dict[num]!==undefined){self.$object_dict[num].push([key,[value,self.$order++]])}else{self.$object_dict[num]=[[key,[value,self.$order++]]]}}
+var hash=$hash===undefined ? _b_.hash(key):$hash,_eq=function(other){return $B.rich_comp("__eq__",key,other)}
+if(self.$numeric_dict[hash]!==undefined && _eq(hash)){self.$numeric_dict[hash]=[value,self.$numeric_dict[hash][1]]
+self.$version++
+return $N}
+var sk=self.$str_hash[hash]
+if(sk !==undefined && _eq(sk)){self.$string_dict[sk]=[value,self.$string_dict[sk][1]]
+self.$version++
+return $N}
+if($hash){if(self.$object_dict[$hash]!==undefined){self.$object_dict[$hash].push([key,[value,self.$order++]])}else{self.$object_dict[$hash]=[[key,[value,self.$order++]]]}
+self.$version++
+return $N}
+var ix=rank(self,hash,key)
+if(ix >-1){
+self.$object_dict[hash][ix][1]=[value,self.$object_dict[hash][ix][1][1]]
+return $N}else if(self.$object_dict.hasOwnProperty(hash)){self.$object_dict[hash].push([key,[value,self.$order++]])}else{self.$object_dict[hash]=[[key,[value,self.$order++]]]}
+self.$version++
+return $N}
+$B.make_rmethods(dict)
+dict.clear=function(){
+var $=$B.args("clear",1,{self:null},["self"],arguments,{},null,null),self=$.self
+self.$numeric_dict={}
+self.$string_dict={}
+self.$str_hash={}
+self.$object_dict={}
+if(self.$jsobj){for(var attr in self.$jsobj){if(attr.charAt(0)!=="$" && attr !=="__class__"){delete self.$jsobj[attr]}}}
+self.$version++
+self.$order=0
+return $N}
+dict.copy=function(self){
+var $=$B.args("copy",1,{self:null},["self"],arguments,{},null,null),self=$.self,res=$B.empty_dict()
+$copy_dict(res,self)
+return res}
+dict.fromkeys=function(){var $=$B.args("fromkeys",3,{cls:null,keys:null,value:null},["cls","keys","value"],arguments,{value:_b_.None},null,null),keys=$.keys,value=$.value
+var klass=$.cls,res=$B.$call(klass)(),keys_iter=$B.$iter(keys)
+while(1){try{var key=_b_.next(keys_iter)
+if(klass===dict){dict.$setitem(res,key,value)}
+else{$B.$getattr(res,"__setitem__")(key,value)}}catch(err){if($B.is_exc(err,[_b_.StopIteration])){return res}
+throw err}}}
+dict.get=function(){var $=$B.args("get",3,{self:null,key:null,_default:null},["self","key","_default"],arguments,{_default:$N},null,null)
+try{
+return dict.$getitem($.self,$.key,true)}catch(err){if(_b_.isinstance(err,_b_.KeyError)){return $._default}
+else{throw err}}}
+var dict_items=$B.make_view("dict_items",true)
+dict_items.$iterator=$B.make_iterator_class("dict_itemiterator")
+dict.items=function(self){var $=$B.args('items',1,{self:null},['self'],arguments,{},null,null)
+var items=to_list(self),set_like=true
+for(var i=0,len=items.length;i < len;i++){try{_b_.hash(items[i][1])}catch(err){set_like=false
+break}}
+var values=to_list(self)
+var it=dict_items.$factory(self,values,set_like)
+it.dict_version=self.$version
+return it}
+var dict_keys=$B.make_view("dict_keys")
+dict_keys.$iterator=$B.make_iterator_class("dict_keyiterator")
+dict.keys=function(self){var $=$B.args('keys',1,{self:null},['self'],arguments,{},null,null)
+var it=dict_keys.$factory(self,to_list(self,0),true)
+it.dict_version=self.$version
+return it}
+dict.pop=function(){var missing={},$=$B.args("pop",3,{self:null,key:null,_default:null},["self","key","_default"],arguments,{_default:missing},null,null),self=$.self,key=$.key,_default=$._default
+try{var res=dict.__getitem__(self,key)
+dict.__delitem__(self,key)
+return res}catch(err){if(err.__class__===_b_.KeyError){if(_default !==missing){return _default}
+throw err}
+throw err}}
+dict.popitem=function(self){try{var itm=_b_.next(_b_.iter(dict.items(self)))
+dict.__delitem__(self,itm[0])
+return _b_.tuple.$factory(itm)}catch(err){if(err.__class__==_b_.StopIteration){throw _b_.KeyError.$factory("'popitem(): dictionary is empty'")}}}
+dict.setdefault=function(){var $=$B.args("setdefault",3,{self:null,key:null,_default:null},["self","key","_default"],arguments,{_default:$N},null,null),self=$.self,key=$.key,_default=$._default
+try{
+return dict.$getitem(self,key,true)}catch(err){if(err.__class__ !==_b_.KeyError){throw err}
+if(_default===undefined){_default=$N}
+var hash=key.$hash
+key.$hash=undefined
+dict.$setitem(self,key,_default,hash)
+return _default}}
+dict.update=function(self){var $=$B.args("update",1,{"self":null},["self"],arguments,{},"args","kw"),self=$.self,args=$.args,kw=$.kw
+if(args.length > 0){var o=args[0]
+if(_b_.isinstance(o,dict)){if(o.$jsobj){o=jsobj2dict(o.$jsobj)}
+$copy_dict(self,o)}else if(_b_.hasattr(o,"keys")){var _keys=_b_.list.$factory($B.$call($B.$getattr(o,"keys"))())
+for(var i=0,len=_keys.length;i < len;i++){var _value=$B.$getattr(o,"__getitem__")(_keys[i])
+dict.$setitem(self,_keys[i],_value)}}else{var it=_b_.iter(o),i=0
+while(true){try{var item=_b_.next(it)}catch(err){if(err.__class__===_b_.StopIteration){break}
+throw err}
+try{key_value=_b_.list.$factory(item)}catch(err){throw _b_.TypeError.$factory("cannot convert dictionary"+
+" update sequence element #"+i+" to a sequence")}
+if(key_value.length !==2){throw _b_.ValueError.$factory("dictionary update "+
+"sequence element #"+i+" has length "+
+key_value.length+"; 2 is required")}
+dict.$setitem(self,key_value[0],key_value[1])
+i++}}}
+$copy_dict(self,kw)
+self.$version++
+return $N}
+var dict_values=$B.make_view("dict_values")
+dict_values.$iterator=$B.make_iterator_class("dict_valueiterator")
+dict.values=function(self){var $=$B.args('values',1,{self:null},['self'],arguments,{},null,null)
+var values=to_list(self,1)
+var it=dict_values.$factory(self,values,false)
+it.dict_version=self.$version
+return it}
+dict.$factory=function(){var res=dict.__new__(dict)
+var args=[res]
+for(var i=0,len=arguments.length;i < len ;i++){args.push(arguments[i])}
+dict.__init__.apply(null,args)
+return res}
+_b_.dict=dict
+$B.set_func_names(dict,"builtins")
+dict.__class_getitem__=_b_.classmethod.$factory(dict.__class_getitem__)
+$B.empty_dict=function(){return{
+__class__:dict,$numeric_dict :{},$object_dict :{},$string_dict :{},$str_hash:{},$version:0,$order:0}}
+dict.fromkeys=_b_.classmethod.$factory(dict.fromkeys)
+$B.getset_descriptor=$B.make_class("getset_descriptor",function(klass,attr){return{
+__class__:$B.getset_descriptor,__doc__:_b_.None,cls:klass,attr:attr}}
+)
+$B.getset_descriptor.__repr__=$B.getset_descriptor.__str__=function(self){return ``}
+$B.set_func_names($B.getset_descriptor,"builtins")
+var mappingproxy=$B.mappingproxy=$B.make_class("mappingproxy",function(obj){if(_b_.isinstance(obj,dict)){
+var res=$B.obj_dict(dict.$to_obj(obj))}else{var res=$B.obj_dict(obj)}
+res.__class__=mappingproxy
+return res}
+)
+mappingproxy.$match_mapping_pattern=true
+mappingproxy.__repr__=function(){return ''}
+mappingproxy.__setitem__=function(){throw _b_.TypeError.$factory("'mappingproxy' object does not support "+
+"item assignment")}
+for(var attr in dict){if(mappingproxy[attr]!==undefined ||
+["__class__","__mro__","__new__","__init__","__delitem__","clear","fromkeys","pop","popitem","setdefault","update"].indexOf(attr)>-1){continue}
+if(typeof dict[attr]=="function"){mappingproxy[attr]=(function(key){return function(){return dict[key].apply(null,arguments)}})(attr)}else{mappingproxy[attr]=dict[attr]}}
+$B.set_func_names(mappingproxy,"builtins")
+function jsobj2dict(x,exclude){exclude=exclude ||function(){return false}
+var d=$B.empty_dict()
+for(var attr in x){if(attr.charAt(0)!="$" && ! exclude(attr)){if(x[attr]===null){d.$string_dict[attr]=[_b_.None,d.$order++]}else if(x[attr]===undefined){continue}else if(x[attr].$jsobj===x){d.$string_dict[attr]=[d,d.$order++]}else{d.$string_dict[attr]=[$B.$JS2Py(x[attr]),d.$order++]}}}
+return d}
+$B.obj_dict=function(obj,exclude){var klass=obj.__class__ ||$B.get_class(obj)
+if(klass !==undefined && klass.$native){throw $B.attr_error("__dict__",obj)}
+var res=$B.empty_dict()
+res.$jsobj=obj
+res.$exclude=exclude ||function(){return false}
+return res}
+var jsobj_as_pydict=$B.jsobj_as_pydict=$B.make_class('jsobj_as_pydict',function(jsobj,exclude){return{
+__class__:jsobj_as_pydict,obj:jsobj,exclude:exclude ? exclude :function(){return false},new_keys:[]}}
+)
+jsobj_as_pydict.__contains__=function(self,key){if(self.new_keys.indexOf(key)>-1){return true}
+return !(self.exclude(key)||self.obj[key]===undefined)}
+jsobj_as_pydict.__delitem__=function(self,key){jsobj_as_pydict.__getitem__(self,key)
+delete self.obj[key]
+var ix=self.new_keys.indexOf(key)
+if(ix >-1){self.new_keys.splice(ix,1)}}
+jsobj_as_pydict.__eq__=function(self,other){if(other.__class__ !==jsobj_as_pydict){return _b_.NotImplemented}
+var self1=$B.empty_dict()
+other1=$B.empty_dict()
+dict.__init__(self1,jsobj_as_pydict.items(self))
+dict.__init__(other1,jsobj_as_pydict.items(other))
+return dict.__eq__(self1,other1)}
+jsobj_as_pydict.__getitem__=function(self,key){if(jsobj_as_pydict.__contains__(self,key)){return self.obj[key]}
+throw _b_.KeyError.$factory(key)}
+jsobj_as_pydict.__iter__=function(self){return _b_.iter(jsobj_as_pydict.keys(self))}
+jsobj_as_pydict.__len__=function(self){var len=0
+for(var key in self.obj){if(! self.exclude(key)){len++}}
+return len+self.new_keys.length}
+jsobj_as_pydict.__repr__=function(self){if($B.repr.enter(self)){return "{...}"}
+var res=[],items=_b_.list.$factory(jsobj_as_pydict.items(self))
+for(var item of items){res.push(_b_.repr(item[0])+": "+_b_.repr(item[1]))}
+$B.repr.leave(self)
+return "{"+res.join(", ")+"}"}
+jsobj_as_pydict.__setitem__=function(self,key,value){if(self.exclude(key)&& self.new_keys.indexOf(key)==-1){self.new_keys.push(key)}
+self.obj[key]=value}
+jsobj_as_pydict.get=function(self,key,_default){_default=_default===undefined ? _b_.None :_default
+if(self.exclude(key)||self.obj[key]===undefined){return _default}
+return self.obj[key]}
+jsobj_as_pydict.items=function(self){var items=[]
+for(var key in self.obj){if(self.exclude(key)&& self.new_keys.indexOf(key)==-1){continue}
+items.push($B.fast_tuple([key,self.obj[key]]))}
+var set_like=true
+for(var item of items){try{_b_.hash(item[1])}catch(err){set_like=false
+break}}
+var it=dict_items.$factory(self,items,set_like)
+it.dict_version=self.$version
+return it}
+jsobj_as_pydict.keys=function(self){var lst=[]
+for(var key in self.obj){if(self.exclude(key)&& self.new_keys.indexOf(key)==-1){continue}
+lst.push(key)}
+var it=dict_keys.$factory(self,lst,true)
+it.dict_version=self.$version
+return it}
+jsobj_as_pydict.values=function(self){var values=[]
+for(var key in self.obj){if(self.exclude(key)&& self.new_keys.indexOf(key)==-1){continue}
+values.push(self.obj[key])}
+var it=dict_values.$factory(self,values,false)
+it.dict_version=self.$version
+return it}
+$B.set_func_names(jsobj_as_pydict,'builtins')})(__BRYTHON__)
+;
+;(function($B){var _b_=$B.builtins,object=_b_.object,getattr=$B.$getattr,isinstance=_b_.isinstance,$N=_b_.None
+function check_not_tuple(self,attr){if(self.__class__===tuple){throw $B.attr_error(attr,self)}}
+function $list(){
+return list.$factory.apply(null,arguments)}
+var list={__class__:_b_.type,__mro__:[object],$infos:{__module__:"builtins",__name__:"list"},$is_class:true,$native:true,$match_sequence_pattern:true,
+__dir__:object.__dir__}
+list.__add__=function(self,other){if($B.get_class(self)!==$B.get_class(other)){var this_name=$B.class_name(self)
+var radd=$B.$getattr(other,'__radd__',null)
+if(radd===null){throw _b_.TypeError.$factory('can only concatenate '+
+this_name+' (not "'+$B.class_name(other)+
+'") to '+this_name)}
+return _b_.NotImplemented}
+var res=self.slice(),is_js=other.$brython_class=="js"
+for(const item of other){res.push(is_js ? $B.$JS2Py(item):item)}
+res.__brython__=true
+if(isinstance(self,tuple)){res=tuple.$factory(res)}
+return res}
+list.__class_getitem__=function(cls,item){
+if(! Array.isArray(item)){item=[item]}
+return $B.GenericAlias.$factory(cls,item)}
+list.__contains__=function(self,item){var $=$B.args("__contains__",2,{self:null,item:null},["self","item"],arguments,{},null,null),self=$.self,item=$.item
+var _eq=function(other){return $B.rich_comp("__eq__",item,other)}
+var i=0
+while(i < self.length){if(_eq(self[i])){return true}
+i++}
+return false}
+list.__delitem__=function(self,arg){if(isinstance(arg,_b_.int)){var pos=arg
+if(arg < 0){pos=self.length+pos}
+if(pos >=0 && pos < self.length){self.splice(pos,1)
+return $N}
+throw _b_.IndexError.$factory($B.class_name(self)+
+" index out of range")}
+if(isinstance(arg,_b_.slice)){var step=arg.step
+if(step===$N){step=1}
+var start=arg.start
+if(start===$N){start=step > 0 ? 0 :self.length}
+var stop=arg.stop
+if(stop===$N){stop=step > 0 ? self.length :0}
+if(start < 0){start=self.length+start}
+if(stop < 0){stop=self.length+stop}
+var res=[],i=null,pos=0
+if(step > 0){if(stop > start){for(var i=start;i < stop;i+=step){if(self[i]!==undefined){res[pos++]=i}}}}else{if(stop < start){for(var i=start;i > stop;i+=step){if(self[i]!==undefined){res[pos++]=i}}
+res.reverse()}}
+var i=res.length
+while(i--){self.splice(res[i],1)}
+return $N}
+if(_b_.hasattr(arg,"__int__")||_b_.hasattr(arg,"__index__")){list.__delitem__(self,_b_.int.$factory(arg))
+return $N}
+throw _b_.TypeError.$factory($B.class_name(self)+
+" indices must be integer, not "+$B.class_name(arg))}
+list.__eq__=function(self,other){var klass=isinstance(self,list)? list :tuple
+if(isinstance(other,klass)){if(other.length==self.length){var i=self.length
+while(i--){if(! $B.rich_comp("__eq__",self[i],other[i])){return false}}
+return true}
+return false}
+return _b_.NotImplemented}
+list.__getitem__=function(self,key){
+$B.check_no_kw("__getitem__",self,key)
+$B.check_nb_args("__getitem__",2,arguments)
+return list.$getitem(self,key)}
+list.$getitem=function(self,key){var klass=(self.__class__ ||$B.get_class(self))
+var factory=function(list_res){list_res.__class__=klass
+return list_res}
+var int_key
+try{int_key=$B.PyNumber_Index(key)}catch(err){}
+if(int_key !==undefined){var items=self.valueOf(),pos=int_key
+if(int_key < 0){pos=items.length+pos}
+if(pos >=0 && pos < items.length){return items[pos]}
+throw _b_.IndexError.$factory($B.class_name(self)+
+" index out of range")}
+if(key.__class__===_b_.slice ||isinstance(key,_b_.slice)){
+if(key.start===_b_.None && key.stop===_b_.None &&
+key.step===_b_.None){return self.slice()}
+var s=_b_.slice.$conv_for_seq(key,self.length)
+var res=[],i=null,items=self.valueOf(),pos=0,start=s.start,stop=s.stop,step=s.step
+if(step > 0){if(stop <=start){return factory(res)}
+for(var i=start;i < stop;i+=step){res[pos++]=items[i]}
+return factory(res)}else{if(stop > start){return factory(res)}
+for(var i=start;i > stop;i+=step){res[pos++]=items[i]}
+return factory(res)}}
+throw _b_.TypeError.$factory($B.class_name(self)+
+" indices must be integer, not "+$B.class_name(key))}
+list.__ge__=function(self,other){if(! isinstance(other,[list,_b_.tuple])){return _b_.NotImplemented}
+var i=0
+while(i < self.length){if(i >=other.length){return true}
+if($B.rich_comp("__eq__",self[i],other[i])){i++}
+else{res=$B.$getattr(self[i],"__ge__")(other[i])
+if(res===_b_.NotImplemented){throw _b_.TypeError.$factory("unorderable types: "+
+$B.class_name(self[i])+"() >= "+
+$B.class_name(other[i])+"()")}else{return res}}}
+return other.length==self.length}
+list.__gt__=function(self,other){if(! isinstance(other,[list,_b_.tuple])){return _b_.NotImplemented}
+var i=0
+while(i < self.length){if(i >=other.length){return true}
+if($B.rich_comp("__eq__",self[i],other[i])){i++}
+else{res=$B.$getattr(self[i],"__gt__")(other[i])
+if(res===_b_.NotImplemented){throw _b_.TypeError.$factory("unorderable types: "+
+$B.class_name(self[i])+"() > "+
+$B.class_name(other[i])+"()")}else return res}}
+return false}
+list.__hash__=$N
+list.__iadd__=function(){var $=$B.args("__iadd__",2,{self:null,x:null},["self","x"],arguments,{},null,null)
+var x=list.$factory($B.$iter($.x))
+for(var i=0;i < x.length;i++){$.self.push(x[i])}
+return $.self}
+list.__imul__=function(){var $=$B.args("__imul__",2,{self:null,x:null},["self","x"],arguments,{},null,null),x=$B.$GetInt($.x),len=$.self.length,pos=len
+if(x==0){list.clear($.self);return $.self}
+for(var i=1;i < x;i++){for(j=0;j < len;j++){$.self[pos++]=$.self[j]}}
+return $.self}
+list.__init__=function(self,arg){var $=$B.args('__init__',1,{self:null},['self'],arguments,{},'args',null),self=$.self,args=$.args
+if(args.length > 1){throw _b_.TypeError.$factory('expected at most 1 argument, got '+
+args.length)}
+var arg=args[0]
+var len_func=$B.$call($B.$getattr(self,"__len__")),pop_func=$B.$getattr(self,"pop",$N)
+if(pop_func !==$N){pop_func=$B.$call(pop_func)
+while(len_func()){pop_func()}}
+if(arg===undefined){return $N}
+var arg=$B.$iter(arg),next_func=$B.$call($B.$getattr(arg,"__next__")),pos=len_func()
+while(1){try{var res=next_func()
+self[pos++]=res}catch(err){if(err.__class__===_b_.StopIteration){break}
+else{throw err}}}
+return $N}
+var list_iterator=$B.make_iterator_class("list_iterator")
+list_iterator.__reduce__=list_iterator.__reduce_ex__=function(self){return $B.fast_tuple([_b_.iter,$B.fast_tuple([list.$factory(self)]),0])}
+list.__iter__=function(self){return list_iterator.$factory(self)}
+list.__le__=function(self,other){var res=list.__ge__(self,other)
+if(res===_b_.NotImplemented){return res}
+return ! res}
+list.__len__=function(self){return self.length}
+list.__lt__=function(self,other){if(! isinstance(other,[list,_b_.tuple])){return _b_.NotImplemented}
+var i=0
+while(i < self.length){if(i >=other.length){return false}
+if($B.rich_comp("__eq__",self[i],other[i])){i++}else{res=$B.$getattr(self[i],"__lt__")(other[i])
+if(res===_b_.NotImplemented){throw _b_.TypeError.$factory("unorderable types: "+
+$B.class_name(self[i])+"() >= "+
+$B.class_name(other[i])+"()")}else{return res}}}
+return other.length > self.length}
+list.__mul__=function(self,other){if(isinstance(other,_b_.int)){other=_b_.int.numerator(other)
+var res=[],$temp=self.slice(),len=$temp.length
+for(var i=0;i < other;i++){for(var j=0;j < len;j++){res.push($temp[j])}}
+res.__class__=self.__class__
+return res}
+if(_b_.hasattr(other,"__int__")||_b_.hasattr(other,"__index__")){return list.__mul__(self,_b_.int.$factory(other))}
+var rmul=$B.$getattr(other,'__rmul__',null)
+if(rmul===null){throw _b_.TypeError.$factory(`can't multiply sequence by non-int `+
+`of type '${$B.class_name(other)}'`)}
+return _b_.NotImplemented}
+list.__new__=function(cls,...args){if(cls===undefined){throw _b_.TypeError.$factory("list.__new__(): not enough arguments")}
+var res=[]
+res.__class__=cls
+res.__brython__=true
+res.__dict__=$B.empty_dict()
+return res}
+function __newobj__(){
+var $=$B.args('__newobj__',0,{},[],arguments,{},'args',null),args=$.args
+var res=args.slice(1)
+res.__class__=args[0]
+return res}
+list.__reduce_ex__=function(self){return $B.fast_tuple([__newobj__,$B.fast_tuple([self.__class__]),_b_.None,_b_.iter(self)])}
+list.__repr__=function(self){$B.builtins_repr_check(list,arguments)
+return list_repr(self)}
+function list_repr(self){
+if($B.repr.enter(self)){
+return '[...]'}
+var _r=[],res
+for(var i=0;i < self.length;i++){_r.push(_b_.repr(self[i]))}
+if(_b_.isinstance(self,tuple)){if(self.length==1){res="("+_r[0]+",)"}else{res="("+_r.join(", ")+")"}}else{res="["+_r.join(", ")+"]"}
+$B.repr.leave(self)
+return res}
+list.__rmul__=function(self,other){return list.__mul__(self,other)}
+list.__setattr__=function(self,attr,value){if(self.__class__===list ||self.__class__===tuple){var cl_name=$B.class_name(self)
+if(list.hasOwnProperty(attr)){throw _b_.AttributeError.$factory("'"+cl_name+
+"' object attribute '"+attr+"' is read-only")}else{throw _b_.AttributeError.$factory(
+"'"+cl_name+" object has no attribute '"+attr+"'")}}
+_b_.dict.$setitem(self.__dict__,attr,value)
+return $N}
+list.__setitem__=function(){var $=$B.args("__setitem__",3,{self:null,key:null,value:null},["self","key","value"],arguments,{},null,null),self=$.self,arg=$.key,value=$.value
+list.$setitem(self,arg,value)}
+list.$setitem=function(self,arg,value){
+if(typeof arg=="number" ||isinstance(arg,_b_.int)){var pos=arg
+if(arg < 0){pos=self.length+pos}
+if(pos >=0 && pos < self.length){self[pos]=value}else{throw _b_.IndexError.$factory("list index out of range")}
+return $N}
+if(isinstance(arg,_b_.slice)){var s=_b_.slice.$conv_for_seq(arg,self.length)
+if(arg.step===null){$B.set_list_slice(self,s.start,s.stop,value)}else{$B.set_list_slice_step(self,s.start,s.stop,s.step,value)}
+return $N}
+if(_b_.hasattr(arg,"__int__")||_b_.hasattr(arg,"__index__")){list.__setitem__(self,_b_.int.$factory(arg),value)
+return $N}
+throw _b_.TypeError.$factory("list indices must be integer, not "+
+$B.class_name(arg))}
+list.append=function(self,x){$B.check_no_kw("append",self,x)
+$B.check_nb_args("append",2,arguments)
+self.push(x)
+return $N}
+list.clear=function(){var $=$B.args("clear",1,{self:null},["self"],arguments,{},null,null)
+while($.self.length){$.self.pop()}
+return $N}
+list.copy=function(){var $=$B.args("copy",1,{self:null},["self"],arguments,{},null,null)
+var res=$.self.slice()
+res.__class__=self.__class__
+res.__brython__=true
+return res}
+list.count=function(){var $=$B.args("count",2,{self:null,x:null},["self","x"],arguments,{},null,null)
+var res=0,_eq=function(other){return $B.rich_comp("__eq__",$.x,other)},i=$.self.length
+while(i--){if(_eq($.self[i])){res++}}
+return res}
+list.extend=function(){var $=$B.args("extend",2,{self:null,t:null},["self","t"],arguments,{},null,null)
+var other=list.$factory($B.$iter($.t))
+for(var i=0;i < other.length;i++){$.self.push(other[i])}
+return $N}
+list.index=function(){var missing={},$=$B.args("index",4,{self:null,x:null,start:null,stop:null},["self","x","start" ,"stop"],arguments,{start:0,stop:missing},null,null),self=$.self,start=$.start,stop=$.stop
+var _eq=function(other){return $B.rich_comp("__eq__",$.x,other)}
+if(start.__class__===$B.long_int){start=parseInt(start.value)*(start.pos ? 1 :-1)}
+if(start < 0){start=Math.max(0,start+self.length)}
+if(stop===missing){stop=self.length}
+else{if(stop.__class__===$B.long_int){stop=parseInt(stop.value)*(stop.pos ? 1 :-1)}
+if(stop < 0){stop=Math.min(self.length,stop+self.length)}
+stop=Math.min(stop,self.length)}
+for(var i=start;i < stop;i++){if(_eq(self[i])){return i}}
+throw _b_.ValueError.$factory(_b_.repr($.x)+" is not in "+
+$B.class_name(self))}
+list.insert=function(){var $=$B.args("insert",3,{self:null,i:null,item:null},["self","i","item"],arguments,{},null,null)
+$.self.splice($.i,0,$.item)
+return $N}
+list.pop=function(){var missing={}
+var $=$B.args("pop",2,{self:null,pos:null},["self","pos"],arguments,{pos:missing},null,null),self=$.self,pos=$.pos
+check_not_tuple(self,"pop")
+if(pos===missing){pos=self.length-1}
+pos=$B.$GetInt(pos)
+if(pos < 0){pos+=self.length}
+var res=self[pos]
+if(res===undefined){throw _b_.IndexError.$factory("pop index out of range")}
+self.splice(pos,1)
+return res}
+list.remove=function(){var $=$B.args("remove",2,{self:null,x:null},["self","x"],arguments,{},null,null)
+for(var i=0,len=$.self.length;i < len;i++){if($B.rich_comp("__eq__",$.self[i],$.x)){$.self.splice(i,1)
+return $N}}
+throw _b_.ValueError.$factory(_b_.str.$factory($.x)+" is not in list")}
+list.reverse=function(self){var $=$B.args("reverse",1,{self:null},["self"],arguments,{},null,null),_len=$.self.length-1,i=parseInt($.self.length/2)
+while(i--){var buf=$.self[i]
+$.self[i]=$.self[_len-i]
+$.self[_len-i]=buf}
+return $N}
+function $partition(arg,array,begin,end,pivot)
+{var piv=array[pivot]
+array=swap(array,pivot,end-1)
+var store=begin
+if(arg===null){if(array.$cl !==false){
+var le_func=_b_.getattr(array.$cl,"__le__")
+for(var ix=begin;ix < end-1;++ix){if(le_func(array[ix],piv)){array=swap(array,store,ix);
+++store}}}else{for(var ix=begin;ix < end-1;++ix){if($B.$getattr(array[ix],"__le__")(piv)){array=swap(array,store,ix)
+++store}}}}else{var len=array.length
+for(var ix=begin;ix < end-1;++ix){var x=arg(array[ix])
+if(array.length !==len){throw _b_.ValueError.$factory("list modified during sort")}
+if($B.$getattr(x,"__le__")(arg(piv))){array=swap(array,store,ix)
+++store}}}
+array=swap(array,end-1,store)
+return store}
+function swap(_array,a,b){var tmp=_array[a]
+_array[a]=_array[b]
+_array[b]=tmp
+return _array}
+function $qsort(arg,array,begin,end){if(end-1 > begin){var pivot=begin+Math.floor(Math.random()*(end-begin))
+pivot=$partition(arg,array,begin,end,pivot)
+$qsort(arg,array,begin,pivot)
+$qsort(arg,array,pivot+1,end)}}
+function $elts_class(self){
+if(self.length==0){return null}
+var cl=$B.get_class(self[0]),i=self.length
+while(i--){if($B.get_class(self[i])!==cl){return false}}
+return cl}
+list.sort=function(self){var $=$B.args("sort",1,{self:null},["self"],arguments,{},null,"kw")
+check_not_tuple(self,"sort")
+var func=$N,reverse=false,kw_args=$.kw,keys=_b_.list.$factory(_b_.dict.keys(kw_args))
+for(var i=0;i < keys.length;i++){if(keys[i]=="key"){func=kw_args.$string_dict[keys[i]][0]}else if(keys[i]=="reverse"){reverse=kw_args.$string_dict[keys[i]][0]}else{throw _b_.TypeError.$factory("'"+keys[i]+
+"' is an invalid keyword argument for this function")}}
+if(self.length==0){return}
+if(func !==$N){func=$B.$call(func)}
+self.$cl=$elts_class(self)
+var cmp=null;
+if(func===$N && self.$cl===_b_.str){if(reverse){cmp=function(b,a){return $B.$AlphabeticalCompare(a,b)}}else{cmp=function(a,b){return $B.$AlphabeticalCompare(a,b)}}}else if(func===$N && self.$cl===_b_.int){if(reverse){cmp=function(b,a){return a-b}}else{cmp=function(a,b){return a-b}}}else{if(func===$N){if(reverse){cmp=function(b,a){res=$B.$getattr(a,"__lt__")(b)
+if(res===_b_.NotImplemented){throw _b_.TypeError.$factory("unorderable types: "+
+$B.class_name(b)+"() < "+
+$B.class_name(a)+"()")}
+if(res){if(a==b){return 0}
+return-1}
+return 1}}else{cmp=function(a,b){res=$B.$getattr(a,"__lt__")(b)
+if(res===_b_.NotImplemented){throw _b_.TypeError.$factory("unorderable types: "+
+$B.class_name(a)+"() < "+
+$B.class_name(b)+"()")}
+if(res){if(a==b){return 0}
+return-1}
+return 1}}}else{if(reverse){cmp=function(b,a){var _a=func(a),_b=func(b)
+res=$B.$getattr(_a,"__lt__")(_b)
+if(res===_b_.NotImplemented){throw _b_.TypeError.$factory("unorderable types: "+
+$B.class_name(b)+"() < "+
+$B.class_name(a)+"()")}
+if(res){if(_a==_b){return 0}
+return-1}
+return 1}}else{cmp=function(a,b){var _a=func(a),_b=func(b)
+res=$B.$getattr(_a,"__lt__")(_b)
+if(res===_b_.NotImplemented){throw _b_.TypeError.$factory("unorderable types: "+
+$B.class_name(a)+"() < "+
+$B.class_name(b)+"()")}
+if(res){if(_a==_b){return 0}
+return-1}
+return 1}}}}
+$B.$TimSort(self,cmp)
+return(self.__brython__ ? $N :self)}
+$B.$list=function(t){t.__brython__=true
+t.__class__=_b_.list
+return t}
+list.$factory=function(){if(arguments.length==0){return[]}
+var $=$B.args("list",1,{obj:null},["obj"],arguments,{},null,null),obj=$.obj
+if(Array.isArray(obj)){
+obj=obj.slice()
+obj.__brython__=true;
+if(obj.__class__==tuple){var res=obj.slice()
+res.__class__=list
+return res}
+return obj}
+var res=[],pos=0,arg=$B.$iter(obj),next_func=$B.$call($B.$getattr(arg,"__next__"))
+while(1){try{res[pos++]=next_func()}catch(err){if(!isinstance(err,_b_.StopIteration)){throw err}
+break}}
+res.__brython__=true
+return res}
+$B.set_func_names(list,"builtins")
+list.__class_getitem__=_b_.classmethod.$factory(list.__class_getitem__)
+var JSArray=$B.JSArray=$B.make_class("JSArray",function(array){return{
+__class__:JSArray,js:array}}
+)
+JSArray.__repr__=JSArray.__str__=function(){return ""}
+function make_args(args){var res=[args[0].js]
+for(var i=1,len=args.length;i < len;i++){res.push(args[i])}
+return res}
+for(var attr in list){if($B.JSArray[attr]!==undefined){continue}
+if(typeof list[attr]=="function"){$B.JSArray[attr]=(function(fname){return function(){return $B.$JS2Py(list[fname].apply(null,make_args(arguments)))}})(attr)}}
+$B.set_func_names($B.JSArray,"builtins")
+function $tuple(arg){return arg}
+var tuple={__class__:_b_.type,__mro__:[object],$infos:{__module__:"builtins",__name__:"tuple"},$is_class:true,$native:true,$match_sequence_pattern:true,}
+var tuple_iterator=$B.make_iterator_class("tuple_iterator")
+tuple.__iter__=function(self){return tuple_iterator.$factory(self)}
+tuple.$factory=function(){var obj=list.$factory(...arguments)
+obj.__class__=tuple
+return obj}
+$B.fast_tuple=function(array){array.__class__=tuple
+array.__brython__=true
+array.__dict__=$B.empty_dict()
+return array}
+for(var attr in list){switch(attr){case "__delitem__":
+case "__iadd__":
+case "__imul__":
+case "__setitem__":
+case "append":
+case "extend":
+case "insert":
+case "remove":
+case "reverse":
+break
+default:
+if(tuple[attr]===undefined){if(typeof list[attr]=="function"){tuple[attr]=(function(x){return function(){return list[x].apply(null,arguments)}})(attr)}}}}
+tuple.__eq__=function(self,other){
+if(other===undefined){return self===tuple}
+return list.__eq__(self,other)}
+function c_mul(a,b){s=((parseInt(a)*b)& 0xFFFFFFFF).toString(16)
+return parseInt(s.substr(0,s.length-1),16)}
+tuple.__hash__=function(self){
+var x=0x3456789
+for(var i=0,len=self.length;i < len;i++){var y=_b_.hash(self[i])
+x=c_mul(1000003,x)^ y & 0xFFFFFFFF}
+return x}
+tuple.__init__=function(){
+return $N}
+tuple.__new__=function(cls,...args){if(cls===undefined){throw _b_.TypeError.$factory("list.__new__(): not enough arguments")}
+var self=[]
+self.__class__=cls
+self.__brython__=true
+self.__dict__=$B.empty_dict()
+var arg=$B.$iter(args[0]),next_func=$B.$call($B.$getattr(arg,"__next__"))
+while(1){try{var item=next_func()
+self.push(item)}
+catch(err){if(err.__class__===_b_.StopIteration){break}
+else{throw err}}}
+return self}
+tuple.__reduce_ex__=function(self){return $B.fast_tuple([__newobj__,$B.fast_tuple([self.__class__].concat(self.slice())),_b_.None,_b_.None])}
+tuple.__repr__=function(self){$B.builtins_repr_check(tuple,arguments)
+return list_repr(self)}
+$B.set_func_names(tuple,"builtins")
+_b_.list=list
+_b_.tuple=tuple
+_b_.object.__bases__=tuple.$factory()
+_b_.type.__bases__=$B.fast_tuple([_b_.object])})(__BRYTHON__)
+;
+;(function($B){
+var _b_=$B.builtins
+var $GeneratorReturn={}
+$B.generator_return=function(value){return{__class__:$GeneratorReturn,value:value}}
+$B.generator=$B.make_class("generator",function(func,name){
+var res=function(){var gen=func.apply(null,arguments)
+gen.$name=name ||'generator'
+gen.$func=func
+gen.$has_run=false
+return{
+__class__:$B.generator,js_gen:gen}}
+res.$infos=func.$infos
+res.$is_genfunc=true
+res.$name=name
+return res}
+)
+$B.generator.__iter__=function(self){return self}
+$B.generator.__next__=function(self){return $B.generator.send(self,_b_.None)}
+$B.generator.__str__=function(self){var name=self.js_gen.$name ||'generator'
+if(self.js_gen.$func && self.js_gen.$func.$infos){name=self.js_gen.$func.$infos.__qualname__}
+return ``}
+$B.generator.close=function(self){var save_stack=$B.frames_stack.slice()
+if(self.$frame){$B.frames_stack.push(self.$frame)}
+try{$B.generator.throw(self,_b_.GeneratorExit.$factory())}catch(err){if(! $B.is_exc(err,[_b_.GeneratorExit,_b_.StopIteration])){$B.frames_stack=save_stack
+throw _b_.RuntimeError.$factory("generator ignored GeneratorExit")}}
+$B.frames_stack=save_stack}
+function trace(){return $B.frames_stack.slice()}
+$B.generator.send=function(self,value){
+var gen=self.js_gen
+gen.$has_run=true
+if(gen.$finished){throw _b_.StopIteration.$factory(value)}
+if(gen.gi_running===true){throw _b_.ValueError.$factory("generator already executing")}
+gen.gi_running=true
+var save_stack=$B.frames_stack.slice()
+if(self.$frame){$B.frames_stack.push(self.$frame)}
+try{var res=gen.next(value)}catch(err){gen.$finished=true
+$B.frames_stack=save_stack
+throw err}
+if($B.last($B.frames_stack)===self.$frame){$B.leave_frame()}
+$B.frames_stack=save_stack
+if(res.value && res.value.__class__===$GeneratorReturn){gen.$finished=true
+throw _b_.StopIteration.$factory(res.value.value)}
+gen.gi_running=false
+if(res.done){throw _b_.StopIteration.$factory(res.value)}
+return res.value}
+$B.generator.throw=function(self,type,value,traceback){var gen=self.js_gen,exc=type
+if(exc.$is_class){if(! _b_.issubclass(type,_b_.BaseException)){throw _b_.TypeError.$factory("exception value must be an "+
+"instance of BaseException")}else if(value===undefined){exc=$B.$call(exc)()}else if(_b_.isinstance(value,type)){exc=value}}else{if(value===undefined){value=exc}else{exc=$B.$call(exc)(value)}}
+if(traceback !==undefined){exc.$traceback=traceback}
+var save_stack=$B.frames_stack.slice()
+if(self.$frame){$B.frames_stack.push(self.$frame)}
+var res=gen.throw(exc)
+$B.frames_stack=save_stack
+if(res.done){throw _b_.StopIteration.$factory("StopIteration")}
+return res.value}
+$B.set_func_names($B.generator,"builtins")
+$B.async_generator=$B.make_class("async_generator",function(func){var f=function(){var gen=func.apply(null,arguments)
+var res=Object.create(null)
+res.__class__=$B.async_generator
+res.js_gen=gen
+return res}
+return f}
+)
+var ag_closed={}
+$B.async_generator.__aiter__=function(self){return self}
+$B.async_generator.__anext__=function(self){return $B.async_generator.asend(self,_b_.None)}
+$B.async_generator.aclose=function(self){self.js_gen.$finished=true
+return _b_.None}
+$B.async_generator.asend=async function(self,value){var gen=self.js_gen
+if(gen.$finished){throw _b_.StopAsyncIteration.$factory(value)}
+if(gen.ag_running===true){throw _b_.ValueError.$factory("generator already executing")}
+gen.ag_running=true
+var save_stack=$B.frames_stack.slice()
+if(self.$frame){$B.frames_stack.push(self.$frame)}
+try{var res=await gen.next(value)}catch(err){gen.$finished=true
+$B.frames_stack=save_stack
+throw err}
+if($B.last($B.frames_stack)===self.$frame){$B.leave_frame()}
+$B.frames_stack=save_stack
+if(res.done){throw _b_.StopAsyncIteration.$factory(value)}
+if(res.value.__class__===$GeneratorReturn){gen.$finished=true
+throw _b_.StopAsyncIteration.$factory(res.value.value)}
+gen.ag_running=false
+return res.value}
+$B.async_generator.athrow=async function(self,type,value,traceback){var gen=self.js_gen,exc=type
+if(exc.$is_class){if(! _b_.issubclass(type,_b_.BaseException)){throw _b_.TypeError.$factory("exception value must be an "+
+"instance of BaseException")}else if(value===undefined){value=$B.$call(exc)()}}else{if(value===undefined){value=exc}else{exc=$B.$call(exc)(value)}}
+if(traceback !==undefined){exc.$traceback=traceback}
+var save_stack=$B.frames_stack.slice()
+if(self.$frame){$B.frames_stack.push(self.$frame)}
+await gen.throw(value)
+$B.frames_stack=save_stack}
+$B.set_func_names($B.async_generator,"builtins")})(__BRYTHON__)
+;
+;(function($B){var _b_=$B.builtins,object=_b_.object,_window=self
+function $getMouseOffset(target,ev){ev=ev ||_window.event;
+var docPos=$getPosition(target);
+var mousePos=$mouseCoords(ev);
+return{x:mousePos.x-docPos.x,y:mousePos.y-docPos.y};}
+function $getPosition(e){var left=0,top=0,width=e.width ||e.offsetWidth,height=e.height ||e.offsetHeight,scroll=document.scrollingElement.scrollTop
+while(e.offsetParent){left+=e.offsetLeft
+top+=e.offsetTop
+e=e.offsetParent}
+left+=e.offsetLeft ||0
+top+=e.offsetTop ||0
+if(e.parentElement){
+var parent_pos=$getPosition(e.parentElement)
+left+=parent_pos.left
+top+=parent_pos.top}
+return{left:left,top:top,width:width,height:height}}
+function trace(msg){var elt=document.getElementById("trace")
+if(elt){elt.innerText+=msg}}
+function $mouseCoords(ev){if(ev.type.startsWith("touch")){var res={}
+res.x=_b_.int.$factory(ev.touches[0].screenX)
+res.y=_b_.int.$factory(ev.touches[0].screenY)
+res.__getattr__=function(attr){return this[attr]}
+res.__class__="MouseCoords"
+return res}
+var posx=0,posy=0
+if(!ev){var ev=_window.event}
+if(ev.pageX ||ev.pageY){posx=ev.pageX
+posy=ev.pageY}else if(ev.clientX ||ev.clientY){posx=ev.clientX+document.body.scrollLeft+
+document.documentElement.scrollLeft
+posy=ev.clientY+document.body.scrollTop+
+document.documentElement.scrollTop}
+var res={}
+res.x=_b_.int.$factory(posx)
+res.y=_b_.int.$factory(posy)
+res.__getattr__=function(attr){return this[attr]}
+res.__class__="MouseCoords"
+return res}
+var $DOMNodeAttrs=["nodeName","nodeValue","nodeType","parentNode","childNodes","firstChild","lastChild","previousSibling","nextSibling","attributes","ownerDocument"]
+$B.$isNode=function(o){
+return(
+typeof Node==="object" ? o instanceof Node :
+o && typeof o==="object" && typeof o.nodeType==="number" &&
+typeof o.nodeName==="string"
+)}
+$B.$isNodeList=function(nodes){
+try{var result=Object.prototype.toString.call(nodes)
+var re=new RegExp("^\\[object (HTMLCollection|NodeList)\\]$")
+return(typeof nodes==="object" &&
+re.exec(result)!==null &&
+nodes.length !==undefined &&
+(nodes.length==0 ||
+(typeof nodes[0]==="object" && nodes[0].nodeType > 0))
+)}catch(err){return false}}
+var $DOMEventAttrs_W3C=["NONE","CAPTURING_PHASE","AT_TARGET","BUBBLING_PHASE","type","target","currentTarget","eventPhase","bubbles","cancelable","timeStamp","stopPropagation","preventDefault","initEvent"]
+var $DOMEventAttrs_IE=["altKey","altLeft","button","cancelBubble","clientX","clientY","contentOverflow","ctrlKey","ctrlLeft","data","dataFld","dataTransfer","fromElement","keyCode","nextPage","offsetX","offsetY","origin","propertyName","reason","recordset","repeat","screenX","screenY","shiftKey","shiftLeft","source","srcElement","srcFilter","srcUrn","toElement","type","url","wheelDelta","x","y"]
+$B.$isEvent=function(obj){var flag=true
+for(var i=0;i < $DOMEventAttrs_W3C.length;i++){if(obj[$DOMEventAttrs_W3C[i]]===undefined){flag=false;break}}
+if(flag){return true}
+for(var i=0;i < $DOMEventAttrs_IE.length;i++){if(obj[$DOMEventAttrs_IE[i]]===undefined){return false}}
+return true}
+var $NodeTypes={1:"ELEMENT",2:"ATTRIBUTE",3:"TEXT",4:"CDATA_SECTION",5:"ENTITY_REFERENCE",6:"ENTITY",7:"PROCESSING_INSTRUCTION",8:"COMMENT",9:"DOCUMENT",10:"DOCUMENT_TYPE",11:"DOCUMENT_FRAGMENT",12:"NOTATION"}
+var Attributes=$B.make_class("Attributes",function(elt){return{__class__:Attributes,elt:elt}}
+)
+Attributes.__contains__=function(){var $=$B.args("__getitem__",2,{self:null,key:null},["self","key"],arguments,{},null,null)
+if($.self.elt instanceof SVGElement){return $.self.elt.hasAttributeNS(null,$.key)}else if(typeof $.self.elt.hasAttribute=="function"){return $.self.elt.hasAttribute($.key)}
+return false}
+Attributes.__delitem__=function(){var $=$B.args("__getitem__",2,{self:null,key:null},["self","key"],arguments,{},null,null)
+if(!Attributes.__contains__($.self,$.key)){throw _b_.KeyError.$factory($.key)}
+if($.self.elt instanceof SVGElement){$.self.elt.removeAttributeNS(null,$.key)
+return _b_.None}else if(typeof $.self.elt.hasAttribute=="function"){$.self.elt.removeAttribute($.key)
+return _b_.None}}
+Attributes.__getitem__=function(){var $=$B.args("__getitem__",2,{self:null,key:null},["self","key"],arguments,{},null,null)
+if($.self.elt instanceof SVGElement &&
+$.self.elt.hasAttributeNS(null,$.key)){return $.self.elt.getAttributeNS(null,$.key)}else if(typeof $.self.elt.hasAttribute=="function" &&
+$.self.elt.hasAttribute($.key)){return $.self.elt.getAttribute($.key)}
+throw _b_.KeyError.$factory($.key)}
+Attributes.__iter__=function(self){self.$counter=0
+var attrs=self.elt.attributes,items=[]
+for(var i=0;i < attrs.length;i++){items.push(attrs[i].name)}
+self.$items=items
+return self}
+Attributes.__next__=function(){var $=$B.args("__next__",1,{self:null},["self"],arguments,{},null,null)
+if($.self.$counter < $.self.$items.length){var res=$.self.$items[$.self.$counter]
+$.self.$counter++
+return res}else{throw _b_.StopIteration.$factory("")}}
+Attributes.__setitem__=function(){var $=$B.args("__setitem__",3,{self:null,key:null,value:null},["self","key","value"],arguments,{},null,null)
+if($.self.elt instanceof SVGElement &&
+typeof $.self.elt.setAttributeNS=="function"){$.self.elt.setAttributeNS(null,$.key,$.value)
+return _b_.None}else if(typeof $.self.elt.setAttribute=="function"){$.self.elt.setAttribute($.key,$.value)
+return _b_.None}
+throw _b_.TypeError.$factory("Can't set attributes on element")}
+Attributes.__repr__=Attributes.__str__=function(self){var attrs=self.elt.attributes,items=[]
+for(var i=0;i < attrs.length;i++){items.push(attrs[i].name+': "'+
+self.elt.getAttributeNS(null,attrs[i].name)+'"')}
+return '{'+items.join(", ")+'}'}
+Attributes.get=function(){var $=$B.args("get",3,{self:null,key:null,deflt:null},["self","key","deflt"],arguments,{deflt:_b_.None},null,null)
+try{return Attributes.__getitem__($.self,$.key)}catch(err){if(err.__class__===_b_.KeyError){return $.deflt}else{throw err}}}
+Attributes.keys=function(){return Attributes.__iter__.apply(null,arguments)}
+Attributes.items=function(){var $=$B.args("values",1,{self:null},["self"],arguments,{},null,null),attrs=$.self.elt.attributes,values=[]
+for(var i=0;i < attrs.length;i++){values.push([attrs[i].name,attrs[i].value])}
+return _b_.list.__iter__(values)}
+Attributes.values=function(){var $=$B.args("values",1,{self:null},["self"],arguments,{},null,null),attrs=$.self.elt.attributes,values=[]
+for(var i=0;i < attrs.length;i++){values.push(attrs[i].value)}
+return _b_.list.__iter__(values)}
+$B.set_func_names(Attributes,"")
+var DOMEvent=$B.DOMEvent=$B.make_class("DOMEvent",function(evt_name){
+return DOMEvent.__new__(DOMEvent,evt_name)}
+)
+DOMEvent.__new__=function(cls,evt_name){var ev=new Event(evt_name)
+ev.__class__=DOMEvent
+if(ev.preventDefault===undefined){ev.preventDefault=function(){ev.returnValue=false}}
+if(ev.stopPropagation===undefined){ev.stopPropagation=function(){ev.cancelBubble=true}}
+return ev}
+function dom2svg(svg_elt,coords){
+var pt=svg_elt.createSVGPoint()
+pt.x=coords.x
+pt.y=coords.y
+return pt.matrixTransform(svg_elt.getScreenCTM().inverse())}
+DOMEvent.__getattribute__=function(self,attr){switch(attr){case '__repr__':
+case '__str__':
+return function(){return ''}
+case 'x':
+return $mouseCoords(self).x
+case 'y':
+return $mouseCoords(self).y
+case 'data':
+if(self.dataTransfer !==null){return Clipboard.$factory(self.dataTransfer)}
+return $B.$JS2Py(self['data'])
+case 'target':
+if(self.target !==undefined){return DOMNode.$factory(self.target)}
+case 'char':
+return String.fromCharCode(self.which)
+case 'svgX':
+if(self.target instanceof SVGSVGElement){return Math.floor(dom2svg(self.target,$mouseCoords(self)).x)}
+throw _b_.AttributeError.$factory("event target is not an SVG "+
+"element")
+case 'svgY':
+if(self.target instanceof SVGSVGElement){return Math.floor(dom2svg(self.target,$mouseCoords(self)).y)}
+throw _b_.AttributeError.$factory("event target is not an SVG "+
+"element")}
+var res=self[attr]
+if(res !==undefined){if(typeof res=="function"){var func=function(){var args=[]
+for(var i=0;i < arguments.length;i++){args.push($B.pyobj2jsobj(arguments[i]))}
+return res.apply(self,arguments)}
+func.$infos={__name__:res.name,__qualname__:res.name}
+return func}
+return $B.$JS2Py(res)}
+throw $B.attr_error(attr,self)}
+var $DOMEvent=$B.$DOMEvent=function(ev){ev.__class__=DOMEvent
+ev.$no_dict=true
+if(ev.preventDefault===undefined){ev.preventDefault=function(){ev.returnValue=false}}
+if(ev.stopPropagation===undefined){ev.stopPropagation=function(){ev.cancelBubble=true}}
+return ev}
+$B.set_func_names(DOMEvent,"browser")
+var Clipboard=$B.make_class('Clipboard',function(data){return{
+__class__ :Clipboard,__dict__:$B.empty_dict(),data :data}}
+)
+Clipboard.__getitem__=function(self,name){return self.data.getData(name)}
+Clipboard.__setitem__=function(self,name,value){self.data.setData(name,value)}
+$B.set_func_names(Clipboard,"")
+function $EventsList(elt,evt,arg){
+this.elt=elt
+this.evt=evt
+if(_b_.isinstance(arg,_b_.list)){this.callbacks=arg}
+else{this.callbacks=[arg]}
+this.remove=function(callback){var found=false
+for(var i=0;i < this.callbacks.length;i++){if(this.callbacks[i]===callback){found=true
+this.callback.splice(i,1)
+this.elt.removeEventListener(this.evt,callback,false)
+break}}
+if(! found){throw _b_.KeyError.$factory("not found")}}}
+var OpenFile=$B.OpenFile={__class__:_b_.type,
+__mro__:[object],$infos:{__module__:"",__name__:"OpenFile"},$is_class:true}
+OpenFile.$factory=function(file,mode,encoding){var res={__class__:$OpenFileDict,file:file,reader:new FileReader()}
+if(mode==="r"){res.reader.readAsText(file,encoding)}else if(mode==="rb"){res.reader.readAsBinaryString(file)}
+return res}
+OpenFile.__getattr__=function(self,attr){if(self["get_"+attr]!==undefined){return self["get_"+attr]}
+return self.reader[attr]}
+OpenFile.__setattr__=function(self,attr,value){var obj=self.reader
+if(attr.substr(0,2)=="on"){
+var callback=function(ev){return value($DOMEvent(ev))}
+obj.addEventListener(attr.substr(2),callback)}else if("set_"+attr in obj){return obj["set_"+attr](value)}else if(attr in obj){obj[attr]=value}else{_b_.setattr(obj,attr,value)}}
+$B.set_func_names(OpenFile,"")
+var dom={File :function(){},FileReader :function(){}}
+dom.File.__class__=_b_.type
+dom.File.__str__=function(){return ""}
+dom.FileReader.__class__=_b_.type
+dom.FileReader.__str__=function(){return ""}
+var DOMNode=$B.make_class('browser',function(elt){return elt}
+)
+DOMNode.__add__=function(self,other){
+var res=TagSum.$factory()
+res.children=[self],pos=1
+if(_b_.isinstance(other,TagSum)){res.children=res.children.concat(other.children)}else if(_b_.isinstance(other,[_b_.str,_b_.int,_b_.float,_b_.list,_b_.dict,_b_.set,_b_.tuple])){res.children[pos++]=DOMNode.$factory(
+document.createTextNode(_b_.str.$factory(other)))}else if(_b_.isinstance(other,DOMNode)){res.children[pos++]=other}else{
+try{res.children=res.children.concat(_b_.list.$factory(other))}
+catch(err){throw _b_.TypeError.$factory("can't add '"+
+$B.class_name(other)+"' object to DOMNode instance")}}
+return res}
+DOMNode.__bool__=function(self){return true}
+DOMNode.__contains__=function(self,key){
+if(self.nodeType==9 && typeof key=="string"){return document.getElementById(key)!==null}
+if(self.length !==undefined && typeof self.item=="function"){for(var i=0,len=self.length;i < len;i++){if(self.item(i)===key){return true}}}
+return false}
+DOMNode.__del__=function(self){
+if(!self.parentNode){throw _b_.ValueError.$factory("can't delete "+_b_.str.$factory(self))}
+self.parentNode.removeChild(self)}
+DOMNode.__delattr__=function(self,attr){if(self[attr]===undefined){throw _b_.AttributeError.$factory(
+`cannot delete DOMNode attribute '${attr}'`)}
+delete self[attr]
+return _b_.None}
+DOMNode.__delitem__=function(self,key){if(self.nodeType==9){
+var res=self.getElementById(key)
+if(res){res.parentNode.removeChild(res)}
+else{throw _b_.KeyError.$factory(key)}}else{
+self.parentNode.removeChild(self)}}
+DOMNode.__dir__=function(self){var res=[]
+for(var attr in self){if(attr.charAt(0)!="$"){res.push(attr)}}
+res.sort()
+return res}
+DOMNode.__eq__=function(self,other){return self==other}
+DOMNode.__getattribute__=function(self,attr){switch(attr){case "attrs":
+return Attributes.$factory(self)
+case "children":
+case "child_nodes":
+case "class_name":
+case "html":
+case "parent":
+case "text":
+return DOMNode[attr](self)
+case "height":
+case "left":
+case "top":
+case "width":
+if(self.tagName=="CANVAS" && self[attr]){return self[attr]}
+if(self instanceof SVGElement){return self[attr].baseVal.value}
+var computed=window.getComputedStyle(self).
+getPropertyValue(attr)
+if(computed !==undefined){var prop=Math.floor(parseFloat(computed)+0.5)
+return isNaN(prop)? computed :prop}else if(self.style[attr]){return parseInt(self.style[attr])}else{throw _b_.AttributeError.$factory("style."+attr+
+" is not set for "+_b_.str.$factory(self))}
+case "x":
+case "y":
+if(!(self instanceof SVGElement)){var pos=$getPosition(self)
+return attr=="x" ? pos.left :pos.top}
+case "clear":
+case "closest":
+return function(){return DOMNode[attr].call(null,self,...arguments)}
+case "headers":
+if(self.nodeType==9){
+var req=new XMLHttpRequest();
+req.open("GET",document.location,false)
+req.send(null);
+var headers=req.getAllResponseHeaders()
+headers=headers.split("\r\n")
+var res=$B.empty_dict()
+for(var i=0;i < headers.length;i++){var header=headers[i]
+if(header.strip().length==0){continue}
+var pos=header.search(":")
+res.__setitem__(header.substr(0,pos),header.substr(pos+1).lstrip())}
+return res}
+break
+case "location":
+attr="location"
+break}
+if(attr=="select" && self.nodeType==1 &&
+["INPUT","TEXTAREA"].indexOf(self.tagName.toUpperCase())>-1){return function(selector){if(selector===undefined){self.select();return _b_.None}
+return DOMNode.select(self,selector)}}
+if(attr=="query" && self.nodeType==9){
+var res={__class__:Query,_keys :[],_values :{}}
+var qs=location.search.substr(1).split('&')
+if(location.search !=""){for(var i=0;i < qs.length;i++){var pos=qs[i].search("="),elts=[qs[i].substr(0,pos),qs[i].substr(pos+1)],key=decodeURIComponent(elts[0]),value=decodeURIComponent(elts[1])
+if(res._keys.indexOf(key)>-1){res._values[key].push(value)}else{res._keys.push(key)
+res._values[key]=[value]}}}
+return res}
+var property=self[attr]
+if(property !==undefined && self.__class__ &&
+self.__class__.__module__ !="browser.html" &&
+self.__class__.__module__ !="browser.svg" &&
+! self.__class__.$webcomponent){
+var bases=self.__class__.__bases__
+var show_message=true
+for(var base of bases){if(base.__module__=="browser.html"){show_message=false
+break}}
+if(show_message){var from_class=$B.$getattr(self.__class__,attr,_b_.None)
+if(from_class !==_b_.None){var frame=$B.last($B.frames_stack),line=frame[1].$lineno
+console.info("Warning: line "+line+", "+self.tagName+
+" element has instance attribute '"+attr+"' set."+
+" Attribute of class "+$B.class_name(self)+
+" is ignored.")}}}
+if(property===undefined){
+if(self.tagName){var ce=customElements.get(self.tagName.toLowerCase())
+if(ce !==undefined && ce.$cls !==undefined){
+var save_class=self.__class__
+self.__class__=ce.$cls
+try{var res=_b_.object.__getattribute__(self,attr)
+self.__class__=save_class
+return res}catch(err){self.__class__=save_class
+if(! $B.is_exc(err,[_b_.AttributeError])){throw err}}}}
+return object.__getattribute__(self,attr)}
+var res=property
+if(res !==undefined){if(res===null){return _b_.None}
+if(typeof res==="function"){if(res.$is_func){
+return res}
+var func=(function(f,elt){return function(){var args=[],pos=0
+for(var i=0;i < arguments.length;i++){var arg=arguments[i]
+if(typeof arg=="function"){
+if(arg.$cache){var f1=arg.$cache}else{var f1=function(dest_fn){return function(){try{return dest_fn.apply(null,arguments)}catch(err){$B.handle_error(err)}}}(arg)
+arg.$cache=f1}
+args[pos++]=f1}else if(_b_.isinstance(arg,DOMNode)){args[pos++]=arg}else if(arg===_b_.None){args[pos++]=null}else if(arg.__class__==_b_.dict){args[pos++]=_b_.dict.$to_obj(arg)}else{args[pos++]=arg}}
+var result=f.apply(elt,args)
+return $B.$JS2Py(result)}})(res,self)
+func.$infos={__name__ :attr,__qualname__:attr}
+func.$is_func=true
+func.$python_function=res
+return func}
+if(attr=='style'){return $B.JSObj.$factory(self[attr])}
+if(Array.isArray(res)){return res}
+return $B.$JS2Py(res)}
+return object.__getattribute__(self,attr)}
+DOMNode.__getitem__=function(self,key){if(self.nodeType==9){
+if(typeof key.valueOf()=="string"){var res=self.getElementById(key)
+if(res){return DOMNode.$factory(res)}
+throw _b_.KeyError.$factory(key)}else{try{var elts=self.getElementsByTagName(key.$infos.__name__),res=[]
+for(var i=0;i < elts.length;i++){res.push(DOMNode.$factory(elts[i]))}
+return res}catch(err){throw _b_.KeyError.$factory(_b_.str.$factory(key))}}}else{if((typeof key=="number" ||typeof key=="boolean")&&
+typeof self.item=="function"){var key_to_int=_b_.int.$factory(key)
+if(key_to_int < 0){key_to_int+=self.length}
+var res=DOMNode.$factory(self.item(key_to_int))
+if(res===undefined){throw _b_.KeyError.$factory(key)}
+return res}else if(typeof key=="string" &&
+self.attributes &&
+typeof self.attributes.getNamedItem=="function"){var attr=self.attributes.getNamedItem(key)
+if(!!attr){return attr.value}
+throw _b_.KeyError.$factory(key)}}}
+DOMNode.__hash__=function(self){return self.__hashvalue__===undefined ?
+(self.__hashvalue__=$B.$py_next_hash--):
+self.__hashvalue__}
+DOMNode.__iter__=function(self){
+if(self.length !==undefined && typeof self.item=="function"){var items=[]
+for(var i=0,len=self.length;i < len;i++){items.push(DOMNode.$factory(self.item(i)))}}else if(self.childNodes !==undefined){var items=[]
+for(var i=0,len=self.childNodes.length;i < len;i++){items.push(DOMNode.$factory(self.childNodes[i]))}}
+return $B.$iter(items)}
+DOMNode.__le__=function(self,other){
+if(self.nodeType==9){self=self.body}
+if(_b_.isinstance(other,TagSum)){for(var i=0;i < other.children.length;i++){self.appendChild(other.children[i])}}else if(typeof other=="string" ||typeof other=="number"){var txt=document.createTextNode(other.toString())
+self.appendChild(txt)}else if(other instanceof Node){self.appendChild(other)}else{try{
+var items=_b_.list.$factory(other)
+items.forEach(function(item){DOMNode.__le__(self,item)})}catch(err){throw _b_.TypeError.$factory("can't add '"+
+$B.class_name(other)+"' object to DOMNode instance")}}
+return self }
+DOMNode.__len__=function(self){return self.length}
+DOMNode.__mul__=function(self,other){if(_b_.isinstance(other,_b_.int)&& other.valueOf()> 0){var res=TagSum.$factory()
+var pos=res.children.length
+for(var i=0;i < other.valueOf();i++){res.children[pos++]=DOMNode.clone(self)()}
+return res}
+throw _b_.ValueError.$factory("can't multiply "+self.__class__+
+"by "+other)}
+DOMNode.__ne__=function(self,other){return ! DOMNode.__eq__(self,other)}
+DOMNode.__next__=function(self){self.$counter++
+if(self.$counter < self.childNodes.length){return DOMNode.$factory(self.childNodes[self.$counter])}
+throw _b_.StopIteration.$factory("StopIteration")}
+DOMNode.__radd__=function(self,other){
+var res=TagSum.$factory()
+var txt=DOMNode.$factory(document.createTextNode(other))
+res.children=[txt,self]
+return res}
+DOMNode.__str__=DOMNode.__repr__=function(self){var attrs=self.attributes,attrs_str="",items=[]
+if(attrs !==undefined){var items=[]
+for(var i=0;i < attrs.length;i++){items.push(attrs[i].name+'="'+
+self.getAttributeNS(null,attrs[i].name)+'"')}}
+var proto=Object.getPrototypeOf(self)
+if(proto){var name=proto.constructor.name
+if(name===undefined){
+var proto_str=proto.constructor.toString()
+name=proto_str.substring(8,proto_str.length-1)}
+items.splice(0,0,name)
+return "<"+items.join(" ")+">"}
+var res=""}
+DOMNode.__setattr__=function(self,attr,value){
+if(attr.substr(0,2)=="on" && attr.length > 2){
+if(!$B.$bool(value)){
+DOMNode.unbind(self,attr.substr(2))}else{
+DOMNode.bind(self,attr.substr(2),value)}}else{switch(attr){case "left":
+case "top":
+case "width":
+case "height":
+if(_b_.isinstance(value,_b_.int)&& self.nodeType==1){self.style[attr]=value+"px"
+return _b_.None}else{throw _b_.ValueError.$factory(attr+" value should be"+
+" an integer, not "+$B.class_name(value))}
+break}
+if(DOMNode["set_"+attr]!==undefined){return DOMNode["set_"+attr](self,value)}
+function warn(msg){console.log(msg)
+var frame=$B.last($B.frames_stack)
+if($B.debug > 0){var info=frame[1].$line_info.split(",")
+console.log("module",info[1],"line",info[0])
+if($B.$py_src.hasOwnProperty(info[1])){var src=$B.$py_src[info[1]]
+console.log(src.split("\n")[parseInt(info[0])-1])}}else{console.log("module",frame[2])}}
+var proto=Object.getPrototypeOf(self),nb=0
+while(!!proto && proto !==Object.prototype && nb++< 10){var descriptors=Object.getOwnPropertyDescriptors(proto)
+if(!!descriptors &&
+typeof descriptors.hasOwnProperty=="function"){if(descriptors.hasOwnProperty(attr)){if(!descriptors[attr].writable &&
+descriptors[attr].set===undefined){warn("Warning: property '"+attr+
+"' is not writable. Use element.attrs['"+
+attr+"'] instead.")}
+break}}else{break}
+proto=Object.getPrototypeOf(proto)}
+if(self.style && self.style[attr]!==undefined){warn("Warning: '"+attr+"' is a property of element.style")}
+self[attr]=value
+return _b_.None}}
+DOMNode.__setitem__=function(self,key,value){if(typeof key=="number"){self.childNodes[key]=value}else if(typeof key=="string"){if(self.attributes){if(self instanceof SVGElement){self.setAttributeNS(null,key,value)}else if(typeof self.setAttribute=="function"){self.setAttribute(key,value)}}}}
+DOMNode.abs_left={__get__:function(self){return $getPosition(self).left},__set__:function(){throw _b_.AttributeError.$factory("'DOMNode' objectattribute "+
+"'abs_left' is read-only")}}
+DOMNode.abs_top={__get__:function(self){return $getPosition(self).top},__set__:function(){throw _b_.AttributeError.$factory("'DOMNode' objectattribute "+
+"'abs_top' is read-only")}}
+DOMNode.attach=DOMNode.__le__
+DOMNode.bind=function(self,event){
+var $=$B.args("bind",4,{self:null,event:null,func:null,options:null},["self","event","func","options"],arguments,{func:_b_.None,options:_b_.None},null,null),self=$.self,event=$.event,func=$.func,options=$.options
+if(func===_b_.None){
+return function(f){return DOMNode.bind(self,event,f)}}
+var callback=(function(f){return function(ev){try{return f($DOMEvent(ev))}catch(err){if(err.__class__ !==undefined){$B.handle_error(err)}else{try{$B.$getattr($B.stderr,"write")(err)}
+catch(err1){console.log(err)}}}}}
+)(func)
+callback.$infos=func.$infos
+callback.$attrs=func.$attrs ||{}
+callback.$func=func
+if(typeof options=="boolean"){self.addEventListener(event,callback,options)}else if(options.__class__===_b_.dict){self.addEventListener(event,callback,_b_.dict.$to_obj(options))}else if(options===_b_.None){self.addEventListener(event,callback,false)}
+self.$events=self.$events ||{}
+self.$events[event]=self.$events[event]||[]
+self.$events[event].push([func,callback])
+return self}
+DOMNode.children=function(self){var res=[]
+if(self.nodeType==9){self=self.body}
+for(var child of self.children){res.push(DOMNode.$factory(child))}
+return res}
+DOMNode.child_nodes=function(self){var res=[]
+if(self.nodeType==9){self=self.body}
+for(child of self.childNodes){res.push(DOMNode.$factory(child))}
+return res}
+DOMNode.clear=function(self){
+var $=$B.args("clear",1,{self:null},["self"],arguments,{},null,null)
+if(self.nodeType==9){self=self.body}
+while(self.firstChild){self.removeChild(self.firstChild)}}
+DOMNode.Class=function(self){if(self.className !==undefined){return self.className}
+return _b_.None}
+DOMNode.class_name=function(self){return DOMNode.Class(self)}
+DOMNode.clone=function(self){var res=DOMNode.$factory(self.cloneNode(true))
+var events=self.$events ||{}
+for(var event in events){var evt_list=events[event]
+evt_list.forEach(function(evt){var func=evt[0]
+DOMNode.bind(res,event,func)})}
+return res}
+DOMNode.closest=function(self,selector){
+var $=$B.args("closest",2,{self:null,selector:null},["self","selector"],arguments,{},null,null)
+var res=self.closest(selector)
+if(res===null){throw _b_.KeyError.$factory("no parent with selector "+selector)}
+return DOMNode.$factory(res)}
+DOMNode.bindings=function(self){
+var res=$B.empty_dict()
+for(var key in self.$events){_b_.dict.$setitem(res,key,self.$events[key].map(x=> x[1]))}
+return res}
+DOMNode.events=function(self,event){self.$events=self.$events ||{}
+var evt_list=self.$events[event]=self.$events[event]||[],callbacks=[]
+evt_list.forEach(function(evt){callbacks.push(evt[1])})
+return callbacks}
+function make_list(node_list){var res=[]
+for(var i=0;i < node_list.length;i++){res.push(DOMNode.$factory(node_list[i]))}
+return res}
+DOMNode.get=function(self){
+var args=[]
+for(var i=1;i < arguments.length;i++){args.push(arguments[i])}
+var $ns=$B.args("get",0,{},[],args,{},null,"kw"),$dict={},items=_b_.list.$factory(_b_.dict.items($ns["kw"]))
+items.forEach(function(item){$dict[item[0]]=item[1]})
+if($dict["name"]!==undefined){if(self.getElementsByName===undefined){throw _b_.TypeError.$factory("DOMNode object doesn't support "+
+"selection by name")}
+return make_list(self.getElementsByName($dict['name']))}
+if($dict["tag"]!==undefined){if(self.getElementsByTagName===undefined){throw _b_.TypeError.$factory("DOMNode object doesn't support "+
+"selection by tag name")}
+return make_list(self.getElementsByTagName($dict["tag"]))}
+if($dict["classname"]!==undefined){if(self.getElementsByClassName===undefined){throw _b_.TypeError.$factory("DOMNode object doesn't support "+
+"selection by class name")}
+return make_list(self.getElementsByClassName($dict['classname']))}
+if($dict["id"]!==undefined){if(self.getElementById===undefined){throw _b_.TypeError.$factory("DOMNode object doesn't support "+
+"selection by id")}
+var id_res=document.getElementById($dict['id'])
+if(! id_res){return[]}
+return[DOMNode.$factory(id_res)]}
+if($dict["selector"]!==undefined){if(self.querySelectorAll===undefined){throw _b_.TypeError.$factory("DOMNode object doesn't support "+
+"selection by selector")}
+return make_list(self.querySelectorAll($dict['selector']))}
+return res}
+DOMNode.getContext=function(self){
+if(!("getContext" in self)){throw _b_.AttributeError.$factory("object has no attribute 'getContext'")}
+return function(ctx){return $B.JSObj.$factory(self.getContext(ctx))}}
+DOMNode.getSelectionRange=function(self){
+if(self["getSelectionRange"]!==undefined){return self.getSelectionRange.apply(null,arguments)}}
+DOMNode.html=function(self){var res=self.innerHTML
+if(res===undefined){if(self.nodeType==9 && self.body){res=self.body.innerHTML}else{res=_b_.None}}
+return res}
+DOMNode.index=function(self,selector){var items
+if(selector===undefined){items=self.parentElement.childNodes}else{items=self.parentElement.querySelectorAll(selector)}
+var rank=-1
+for(var i=0;i < items.length;i++){if(items[i]===self){rank=i;break}}
+return rank}
+DOMNode.inside=function(self,other){
+var elt=self
+while(true){if(other===elt){return true}
+elt=elt.parentNode
+if(! elt){return false}}}
+DOMNode.options=function(self){
+return new $OptionsClass(self)}
+DOMNode.parent=function(self){if(self.parentElement){return DOMNode.$factory(self.parentElement)}
+return _b_.None}
+DOMNode.reset=function(self){
+return function(){self.reset()}}
+DOMNode.scrolled_left={__get__:function(self){return $getPosition(self).left-
+document.scrollingElement.scrollLeft},__set__:function(){throw _b_.AttributeError.$factory("'DOMNode' objectattribute "+
+"'scrolled_left' is read-only")}}
+DOMNode.scrolled_top={__get__:function(self){return $getPosition(self).top-
+document.scrollingElement.scrollTop},__set__:function(){throw _b_.AttributeError.$factory("'DOMNode' objectattribute "+
+"'scrolled_top' is read-only")}}
+DOMNode.select=function(self,selector){
+if(self.querySelectorAll===undefined){throw _b_.TypeError.$factory("DOMNode object doesn't support "+
+"selection by selector")}
+return make_list(self.querySelectorAll(selector))}
+DOMNode.select_one=function(self,selector){
+if(self.querySelector===undefined){throw _b_.TypeError.$factory("DOMNode object doesn't support "+
+"selection by selector")}
+var res=self.querySelector(selector)
+if(res===null){return _b_.None}
+return DOMNode.$factory(res)}
+DOMNode.setSelectionRange=function(self){
+if(this["setSelectionRange"]!==undefined){return(function(obj){return function(){return obj.setSelectionRange.apply(obj,arguments)}})(this)}else if(this["createTextRange"]!==undefined){return(function(obj){return function(start_pos,end_pos){if(end_pos==undefined){end_pos=start_pos}
+var range=obj.createTextRange()
+range.collapse(true)
+range.moveEnd("character",start_pos)
+range.moveStart("character",end_pos)
+range.select()}})(this)}}
+DOMNode.set_class_name=function(self,arg){self.setAttribute("class",arg)}
+DOMNode.set_html=function(self,value){if(self.nodeType==9){self=self.body}
+self.innerHTML=_b_.str.$factory(value)}
+DOMNode.set_style=function(self,style){
+if(typeof style==='string'){self.style=style}else if(!_b_.isinstance(style,_b_.dict)){throw _b_.TypeError.$factory("style must be str or dict, not "+
+$B.class_name(style))}
+var items=_b_.list.$factory(_b_.dict.items(style))
+for(var i=0;i < items.length;i++){var key=items[i][0],value=items[i][1]
+if(key.toLowerCase()=="float"){self.style.cssFloat=value
+self.style.styleFloat=value}else{switch(key){case "top":
+case "left":
+case "width":
+case "height":
+case "borderWidth":
+if(_b_.isinstance(value,_b_.int)){value=value+"px"}}
+self.style[key]=value}}}
+DOMNode.set_text=function(self,value){if(self.nodeType==9){self=self.body}
+self.innerText=_b_.str.$factory(value)
+self.textContent=_b_.str.$factory(value)}
+DOMNode.set_value=function(self,value){self.value=_b_.str.$factory(value)}
+DOMNode.submit=function(self){
+return function(){self.submit()}}
+DOMNode.text=function(self){if(self.nodeType==9){self=self.body}
+var res=self.innerText ||self.textContent
+if(res===null){res=_b_.None}
+return res}
+DOMNode.toString=function(self){if(self===undefined){return 'DOMNode'}
+return self.nodeName}
+DOMNode.trigger=function(self,etype){
+if(self.fireEvent){self.fireEvent("on"+etype)}else{var evObj=document.createEvent("Events")
+evObj.initEvent(etype,true,false)
+self.dispatchEvent(evObj)}}
+DOMNode.unbind=function(self,event){
+self.$events=self.$events ||{}
+if(self.$events==={}){return _b_.None}
+if(event===undefined){for(var event in self.$events){DOMNode.unbind(self,event)}
+return _b_.None}
+if(self.$events[event]===undefined ||
+self.$events[event].length==0){return _b_.None}
+var events=self.$events[event]
+if(arguments.length==2){
+for(var i=0;i < events.length;i++){var callback=events[i][1]
+self.removeEventListener(event,callback,false)}
+self.$events[event]=[]
+return _b_.None}
+for(var i=2;i < arguments.length;i++){var callback=arguments[i],flag=false,func=callback.$func
+if(func===undefined){
+var found=false
+for(var j=0;j < events.length;j++){if(events[j][0]===callback){var func=callback,found=true
+break}}
+if(!found){throw _b_.TypeError.$factory("function is not an event callback")}}
+for(var j=0;j < events.length;j++){if($B.$getattr(func,'__eq__')(events[j][0])){var callback=events[j][1]
+self.removeEventListener(event,callback,false)
+events.splice(j,1)
+flag=true
+break}}
+if(!flag){throw _b_.KeyError.$factory('missing callback for event '+event)}}}
+$B.set_func_names(DOMNode,"browser")
+var Query=$B.make_class("query")
+Query.__contains__=function(self,key){return self._keys.indexOf(key)>-1}
+Query.__getitem__=function(self,key){
+var result=self._values[key]
+if(result===undefined){throw _b_.KeyError.$factory(key)}else if(result.length==1){return result[0]}
+return result}
+var Query_iterator=$B.make_iterator_class("query string iterator")
+Query.__iter__=function(self){return Query_iterator.$factory(self._keys)}
+Query.__setitem__=function(self,key,value){self._values[key]=[value]
+return _b_.None}
+Query.__str__=Query.__repr__=function(self){
+var elts=[]
+for(var key in self._values){for(const val of self._values[key]){elts.push(encodeURIComponent(key)+"="+encodeURIComponent(val))}}
+if(elts.length==0){return ""}else{return "?"+elts.join("&")}}
+Query.getfirst=function(self,key,_default){
+var result=self._values[key]
+if(result===undefined){if(_default===undefined){return _b_.None}
+return _default}
+return result[0]}
+Query.getlist=function(self,key){
+var result=self._values[key]
+if(result===undefined){return[]}
+return result}
+Query.getvalue=function(self,key,_default){try{return Query.__getitem__(self,key)}
+catch(err){if(_default===undefined){return _b_.None}
+return _default}}
+Query.keys=function(self){return self._keys}
+$B.set_func_names(Query,"")
+var TagSum=$B.make_class("TagSum",function(){return{
+__class__:TagSum,children:[],toString:function(){return "(TagSum)"}}}
+)
+TagSum.appendChild=function(self,child){self.children.push(child)}
+TagSum.__add__=function(self,other){if($B.get_class(other)===TagSum){self.children=self.children.concat(other.children)}else if(_b_.isinstance(other,[_b_.str,_b_.int,_b_.float,_b_.dict,_b_.set,_b_.list])){self.children=self.children.concat(
+DOMNode.$factory(document.createTextNode(other)))}else{self.children.push(other)}
+return self}
+TagSum.__radd__=function(self,other){var res=TagSum.$factory()
+res.children=self.children.concat(
+DOMNode.$factory(document.createTextNode(other)))
+return res}
+TagSum.__repr__=function(self){var res="
diff --git a/ogcardeck/deck1.py b/ogcardeck/deck1.py index c9e2cc6..3224666 100644 --- a/ogcardeck/deck1.py +++ b/ogcardeck/deck1.py @@ -47,11 +47,9 @@ html = f"""
-