PKsTmeta.xmlr张晓坤XMindR3.7.8.201807240049122794#FFFFFFPK\TPKsT content.xmlݿ"@前端飞升之路01-移动Web02-JS基础03-WebApi04-js高级05-ajax06-项目07-nodejs08-vue09-项目10-react前端三层:HTML CSS JS服务器交互企业框架如何写好总结?1.知识点三要素1.作用学习的目的是为了解决今后开发中的问题,如果对知识点作用不清晰,那么用的时候很难想起来2.语法语法是代码的根本,必须要非常的熟悉。 如果语法不清晰,不知道怎么写。 那么很有可能就是自身花的时间和精力不够。 语法不熟悉也可以作为一个学习状态的预警。3.应用场景/注意点 应用场景是由作用决定的。 有的语法,属于用的特别多的。 应用场景可以不用单独写 有的语法,用的很少,可能存在一些特定的应用场景。 这个时候就需要单独写总结注意点决定bug解决能力有的语法在书写的时候由于一些细节,很容易出现bug。 这个时候就需要单独总结,否则今后出现bug,可能我们连原因都找不到2.写总结术语1.应用型知识点1.作用格式: 主语 的作用是 功能描述示例 : 多分支语法 的作用是 多个条件判断2.语法可通过备注的方式添加语法 if(条件1){ 条件1成立时需要执行的代码 }else if(条件2){ 条件2成立时需要执行的代码 }else if(条件3){ 条件2成立时需要执行的代码 } ..... else{ 如果前面所有条件都不满足,则执行else代码 } 注意点 (1)多分支所有的大括号代码最多只会执行一个,只有当前面的条件不满足,才会进入后面的条件判断 (2)多分支一定要以if开头,后面else if可以多个,结尾else可以省语法 if(条件1){ 条件1成立时需要执行的代码 }else if(条件2){ 条件2成立时需要执行的代码 }else if(条件3){ 条件2成立时需要执行的代码 } ..... else{ 如果前面所有条件都不满足,则执行else代码 } 注意点 (1)多分支所有的大括号代码最多只会执行一个,只有当前面的条件不满足,才会进入后面的条件判断 (2)多分支一定要以if开头,后面else if可以多个,结尾else可以省3.应用场景/注意点示例 : if-else if-else多分支语句注意点: 只有上面条件不成立,才会执行下面的条件判断2.理论概念性知识点1.作用格式:主语 谓语/形容词 宾语示例: 作用域 是 变量可以使用的范围主语:作用域宾语:范围形容语: 变量可以使用前端大总结移动web第一天全天目标使用字体图标简化网页中装饰性图标实现方式使用位移、缩放、旋转、渐变效果丰富网页元素的呈现方式字体图标目标使用字体图标简化网页中装饰性图标实现方式学习内容字体图标介绍iconfont图标库特点字体图标看起来是图,本质是字加载速度快兼容性高灵活性高通过字体属性控制样式下载登录后,选择目标图标,加入购物车在购物车中添加至项目后, 在项目中下载使用Unicode编码引入iconfont.css样式表标签粘贴Unicode编码标签调用类名iconfont类名引入iconfont.css样式表标签调用类名iconfont(font-family)icon-xx(图标对应的类名)svg上传作用: 图标库中的图标无法满足项目需求步骤1. 上传SVG图标2. 去除颜色提交3. 加购物车并下载使用平面转换目标使用位移、缩放、旋转、渐变效果丰富网页呈现方式学习内容平面转换介绍平面x和y 2条坐标轴组成的屏幕x轴正值向右y轴正值向下转换改变盒子形态位置角度大小属性: transform位移translate(x, y)translateX()translateY()定位盒子居中定位绝对定位left:50%top:50%位移translate(-50%, -50%)旋转rotate(角度)单位:deg旋转方向正值:顺时针负值:逆时针转换中心点属性transform-origin取值关键词topbottomcenterleftright百分比px多重转换定义同时改变盒子的多个形态注意旋转放在最后旋转会改变坐标轴向缩放scale(倍数)大于1,表示放大小于1,表示缩小渐变目标使用background-image属性添加渐变背景效果学习内容基本写法background-image: linear-gradient( 颜色1, 颜色2, ...... );透明渐变background-image: linear-gradient( transparent, rgba(0, 0, 0, .6) );第二天全天目标使用空间转换、动画效果丰富网页元素的呈现方式空间转换目标使用位移、缩放、旋转等空间转换效果丰富网页呈现方式学习内容空间转换介绍坐标轴X、Y、ZZ轴与用户视线方向重叠属性transform空间位移完整写法translate3d(x, y, z)某个坐标轴位移translateX()translateY()translateZ()透视作用产生近大远小,近实远虚的视觉效果概念视距:用户眼睛和屏幕的距离写法perspective: 值;添加给父级取值一般800-1200px之间空间旋转旋转rotateX()rotateY()rotateZ()左手法则左手握住旋转轴,大拇指指向坐标轴正值方向, 四根手指弯曲方向为旋转正值方向立体呈现作用让子级处于真正的3D空间内写法transform-style: preserve-3d;添加给父级缩放完整写法scale3d(x, y, z)某个坐标轴缩放scaleX()scaleY()scaleZ()动画目标使用关键帧动画效果,给网页元素添加动画特效,提升用户体验学习内容动画介绍基本使用定义动画@keyframes{ from {} to {} }@keyframes{ 0% {} 20% {} 50% {} 100% {} }使用动画animation: 动画名称 动画时长;animation属性复合属性写法animation:动画名称 动画时长 速度曲线 延迟时间 重复次数 动画方向 执行完毕时状态;注意事项取值不分先后顺序必须赋值项:动画名称和动画时长若出现2个时间:第一个时间为动画时长, 第二个时间为延迟时间拆分写法(了解)animation-name:动画名称animation-duration:动画时长animation-delay:延迟时间animation-fill-mode:动画执行完毕时状态forwards:最后一帧状态backwards:第一帧状态(默认值)animation-timing-function:速度曲线steps(数字) : 逐帧动画animation-iteration-count:重复次数infinite:无限循环animation-direction:动画方向alternate:反向animation-play-state:动画播放状态paused:暂停通常配合:hover使用逐帧动画作用精灵动画搭配精灵图使用核心动画速度曲线为steps(N)N与精灵图小图个数相同多组动画作用:一个元素添加多个动画效果写法animation: 动画1,动画2,动画N;第三四天全天目标了解移动端与PC端屏幕和网页布局的差异,能够使用Flex布局模型布局移动端网页百分比布局目标了解百分比布局方案学习内容特点流式布局宽度自适应,高度固定布局方式宽度为半分比写法FLex布局目标使用Flex布局模型完成网页基本布局效果学习内容Flex的优势和特点浏览器提倡的布局模型,页面渲染性能高布局简单、方便避免浮动脱标的问题兼容性较高(不兼容低版本浏览器)组成部分弹性容器(父级, 添加display:flex的盒子)弹性盒子(子级)主轴(默认水平)侧轴(默认垂直)主侧轴对齐方式主轴justify-contentcenter:居中space-between:间距出现在弹性盒子之间space-evenly:父子级间距都相同space-around:间距出现在弹性盒子两侧视觉效果: 子级之间的间距是父级左右两侧间距的2倍侧轴align-items(控制所有弹性盒子)center:居中stretch:默认值, 拉伸align-self(控制某个弹性盒子)弹性伸缩比flex: 整数数字;占用父级剩余尺寸的份数第五天全天目标使用rem布局方案,实现视口宽度不同,网页元素宽高等比缩放效果rem目标实现在不同宽度的设备中,网页元素尺寸等比缩放效果学习内容rem介绍相对单位,相对于HTML标签字号计算尺寸1rem = 1HTML标签字号基本使用1. 给HTML标签添加字号2. 设置元素尺寸为rem单位媒体查询基本使用视口不同,添加不同的根字号@media (视口宽度) { 差异化CSS样式 }rem布局流程1. 媒体查询添加根字号@media (视口宽度) { html { font-size: 37.5px; } }2. flexible添加根字号<script src="flexible.js"></script>less目标掌握Less常用语法学习内容less介绍CSS预处理器,让CSS具备逻辑和计算能力浏览器和网页不识别less,目前需要将less文件导出CSS文件,HTML引入CSS文件插件EasyLess语法注释单行// 注释内容ctrl + //* 注释内容 */alt + shift + A嵌套作用生成后代选择器写法父选择器 { 子选择器{} }&表示当前选择器, 不会生成后代选择器运算作用完成常用数学计算写法除法(xx / xx)xx ./ xx变量作用存储数据,方便修改和使用用法1. 定义变量@变量名: 值;2. 使用变量CSS属性: @变量;导入作用引入其他less文件写法@import: ‘文件及路径’;导出导出CSS文件控制所有Less导出路径修改EasyLess插件1. 设置 → 搜索easy → 在settings.json中编辑2. 添加代码:"out": "目标存储路径"(文件夹以/结束)单独控制某个Less文件导出路径less文件第一行添加 // out:路径禁止导出CSS文件less文件第一行添加: // out: false第六天全天目标使用vw布局方案,实现视口宽度不同,网页元素宽高等比缩放效果vw / vh目标使用vw布局方案,实现视口宽度不同,网页元素宽高等比缩放效果学习内容vw和vh基本使用vw和vh为相对单位,相对视口尺寸计算结果1vw = 1/100视口宽度1vh = 1/100视口高度布局流程1. 根据设计稿确定1vw尺寸2. px单位转换成vw单位尺寸px / (1/100视口宽度)vh弊端vh是相对视口高度计算尺寸需要考虑全面屏,视口高度尺寸偏大第七天全天目标了解响应式网页特点,知道响应式布局的核心技术:媒体查询的用法了解BootStrap框架使用方法和手册用法,能够使用BootStrap框架开发响应式网页媒体查询目标能够使用媒体查询写法,检测不同的响应断点,设置差异化CSS样式学习内容max-width / min-width书写顺序案例隐藏效果其他写法完整写法link写法BootStrap目标掌握BootStrap框架基本用法掌握BootStrap框架手册用法学习内容BootStrap介绍UI框架封装了大量的HTML、CSS、JavaScript,只需要按照框架要求书写代码,即可快速完成对应的效果下载生产环境压缩的代码开发可以直接使用less源码基于less的源码包可学习使用使用全局CSS样式栅格系统介绍作用:响应式布局原理将网页等分成12等分,每个元素占对应的份数使用大屏响应断点>= 1200px类前缀col-lg-*版心1170px中屏响应断点>= 992px类前缀col-md-*版心970px小屏响应断点>= 768类前缀col-sm-*版心750px超小屏响应断点< 768px类前缀col-xs-*版心100%标签样式表格按钮.....组件作用:封装常见功能的HTML+CSS分类布局组件1. 引入样式表2. 复制粘贴结构,修改内容字体图标1. 引入样式表2. 空标签粘贴类名插件介绍封装了常见功能的交互效果,包含HTML、CSS、JavaScript使用步骤1. 引入样式表2. 引入js2.1 jQuery.js2.2 bootstrap.js3. 复制结构,修改内容定制作用:针对项目定义bootstrap框架步骤1. 导航菜单:定制2. 输入对应的Less变量值3. 编译并下载,使用新框架-1移动Webjs基础-1js入门1. JavaScript是运行在浏览器编程语言2.前端三老铁HTML : 确定网页结构CSS : 确定网页样式JS : 确定网页交互3.js组成三个部分ECMAScript确定js的语法规范DOMjs动态操作网页内容BOMjs动态操作浏览器窗口4.js三种书写位置行内:写在标签内部内联:写在script标签里面, script标签放在</body>上方外联:写在js文件中,使用script标签的src属性引入5.js两种注释写法// 单行注释/* 多行注释 */6.输入与输出语句弹出提示框 : alert()页面输出: document.write()控制台输出: console.log()弹出输入框: prompt()弹出确认框: confirm()数据类型1.简单数据类型(值类型)number数值类型一切数学中数字作用:数学计算string字符串类型一切 引号包起来的内容单引号 ''拼接: +双引号 ""反引号(模板字符串) ``${变量名}作用:展示文本boolean布尔类型只有两个值 true:真 flase:假作用:表示条件成立/不成立undefined未定义变量有声明,未赋值。 默认值是undefinednull空值主动赋值, 要存东西,但是暂时不知道存什么2.复杂数据类型(引用类型)3.检测数据类型typeof 数据 : 得到一个字符串,告诉你数据是什么类型4.数据类型转换隐式转换: 运算符两边数据类型不一样,编译器会先转成一样之后计算转string: 连接符转number转boolean显式转换转number转整数: parseInt(数据)转小数: parseFloat(数据)其他类型(布尔) : Number(数据)转string常用: String(数据)可以转undefined与null变量名.toString()不可以转undefined与null,会报错转Boolean : Boolean(数据)falseundefinednull0-0''NaNfalsedocument.alltrue除false之外的一切数据变量1.变量作用: 在内存中存储数据2.变量语法声明变量 : let 变量名在内存中开辟空间赋值: 变量名 = 值把右边输入存入左边的变量取值: 变量名3.变量注意点(1)let变量不允许重复声明(2)变量赋值的时候会先销毁旧值,然后存入新值(3)变量给变量赋值,先拷贝后赋值4.变量命名规则与规范规则: 强制遵守,不遵守就会报错。开头 :字母 下划线_ $后面:字母 下划线_ $ 数字不能使用关键字规范:大家都养成的习惯取名最好是英语名词多个单词驼峰命名:首字母小写,后面单词首字母大写运算符与表达式算术运算符:作用:算术运算+-*/%赋值运算符赋值运算符左边一定是变量,因为只有变量才可以存储数据=右边数据存入左边的变量+=自身加多少-=*=/=%=自增自减(自身+1 -1)自增: num++自减: num--比较运算符(关系运算符)作用:比较运算, 判断条件是否成立。(成立/不成立)> >= < <= ==(相等) != ===(全等) !====:只比较值,不比较数据类型===: 先比较类型,后比较值重要知识点1.运算符不能单独使用,需要与运算数据一起组成式子。称之为表达式2.表达式一定会有运算结果,要么打印,要么存入变量3.关系(比较)表达式结果一定是布尔类型, true:成立 false:不成立逻辑运算符作用:计算多个条件关系&&:一假则假(全真为真)||:一真则真(全假为假)!: 取反 true变false,false变true逻辑中断逻辑运算符的结果是 左边 或 右边 式子的值,不一定是布尔类型&& :找假左边式子为false,则返回左边式子的值。 否则返回右边式子的值||:找真左边式子为true,则返回左边式子的值。 否则返回右边式子的值流程控制顺序结构(默认)代码从上往下依次执行分支结构if语句: 用于条件判断if单分支: if(条件){ 分支代码 }用于单个条件判断注意点: 条件代码可以是哪些(1)关系表达式: 结果一定是布尔类型(2)布尔类型的值(3)其他值: 会隐式转换成布尔类型来判断条件if-else双分支: if(条件){ }else{ }用于两个互斥条件注意点: if大括号与else大括号 一定只会执行一个。(不会都执行,也不会都不执行)if-else if-else多分支: if(条件1){ }else if(条件2){ }else{ }用于多个条件判断注意点:所有的大括号最多只会执行一个,只有当上面条件不成立,才会进入下面条件判断必须以if开头, 后面可以写多个else if,结尾else可以省略三元表达式式子 ? 代码1 : 代码2如果式子为true,则执行代码1,否则执行代码2如果代码1和代码2有运算结果,三元表达式的结果就是他们的值switch-case:固定值匹配switch(匹配值){ }注意点匹配值和case值 一定是全等break作用是结束switch-case,如果省略则会穿透穿透: 代码从上一个case无条件执行到下一个case合理穿透: 多个匹配值需要执行的代码相同循环结构代码重复执行while循环:用于循环次数不明确for循环:用于循环次数明确循环结构场景1.找出指定范围符合条件的数:筛选功能(1)遍历指定范围的数(2)找出符合条件的数2.求累加和 : 求和(1)声明变量存储结果(2)遍历数量(3)累加3.求最大值/最小值(1)声明变量存储结果求最大值 let max = -Infinity求最小值 let max = Infinity(2)遍历数量(3)依次比较大小循环结构关键字break:结束整个循环语句,立即执行循环外面代码continue:结束本次循环体,立即进入下一次循环体数组1.数组作用一个变量存储多个数据2.数组三要素元素:数组中的数据下标:元素的位置下标从0开始递增长度:元素的数量长度 = 最大下标 + 13.数组语法1.声明let 数组名 = [元素1,元素2,元素3,…………]2.取值数组名[下标]3.赋值数组名[下标] = 值4.遍历固定for循环 for(let i = 0;i<arr.length;i++){ arr[i] }4.数组操作数组名[下标]下标存在,则是获取元素值下标不存在,则是获取undefined数组名[下标] = 值下标存在,则是 修改 元素值下标不存在,则是动态新增元素末尾新增: 数组.push( 元素1,元素,…………)开头新增: 数组.unshift(元素1,元素,…………)删除末尾: 数组.pop( )删除开头: 数组.shift()删除指定位置: 数组.splice(起始位置,删除数量)函数1.函数作用存储代码,解决代码复用2.函数语法声明函数:存储代码function 函数名(){ 函数体代码:需要复用的代码 }声明函数的时候,不会执行函数体代码调用函数:执行函数体代码函数名()3.函数参数3.1 参数作用: 调用者 传递数据给 函数3.2 参数语法传:调用者函数名( 实参 )收:函数function 函数名( 形参 ){ 函数体 }3.3 传参原理实参给形参赋值3.4 传参注意点实参与形参数量可以不一致,但是按照顺序一一赋值每一次传参都是独立的过程,互不影响4.函数返回值4.1 返回值作用: 函数 传递数据给 调用者4.2 返回语法传:函数function 函数名( 形参 ){ 函数体; return 返回值 }收:函数let 变量名 = 函数名( 实参 )4.3 返回值注意点(1)如果函数没有return,则默认返回值是undefined(2)return关键字可以结束函数体执行, return后面的代码不会执行5.函数三个执行流程1.传参:实参给形参赋值2.执行函数体3.返回值6.函数返回值注意点(1)如果函数没有return,则默认返回值是undefined(2)return关键字可以结束函数体执行, return后面的代码不会执行对象1.对象作用一个变量存储多个数据数组:有序存储。 下标从0开始递增对象:无序存储。属性名和属性值一一对应2.对象语法声明对象let 对象名 = { 属性名:属性名 }对象取值对象名.属性名对象名['属性名']特点(1)属性名存在,则是获取属性值(2)属性名不存在,则是获取undefined对象赋值对象名.属性名 = 值对象名['属性名'] = 值特点(1)属性名存在,则是'修改'属性值(2)属性名不存在,则是新增属性3.对象遍历固定格式for-in循环for(let key in 对象名){ 对象名[key] }注意点:只能使用字符串语法取值4.环境对象 this谁调我我,我就指向谁提示: 这个this相当于中文的 ‘我’ 字, 谁说出来,就代表谁js基础webapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selected查节点查子元素父元素.children查兄弟元素上一个元素元素.previousElementSibling下一个元素元素.nextElementSibling查父元素元素.parentNode(1)在内存创建空标签: document.createElement('标签名')(2)设置内容(3)添加到页面dom新增到最后面: 父元素.appendChild(元素)新增到元素前面: 父元素.insertBefore( 新增元素, 哪个元素前面 )父元素.removeChild(子元素)事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }事件源.addEventListener('事件类型',事件处理函数)3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave鼠标移动: onmousemove键盘事件输入事件: oninput实时获取输入框文本成为焦点: onfocus失去焦点: onblur键盘按下: onkeydown监听enter键键盘松开: onkeyup页面事件页面移动: window.onmousemove页面滚动: window.onscroll页面滚动距离 : document.documentElement.scrollTop页面大小变化 : window.onresize页面视口宽度 : document.documentElement.clientWidth5.事件对象1.事件对象作用 :存储与事件相关的数据 (浏览器自动捕获鼠标坐标与键盘按键,自动存储对象)2.如何获取事件对象给事件处理函数添加形参 e3.事件对象常用属性e.pageX / e.pageY : 获取鼠标触发点 到 页面左上角距离e.key获取按键字符串 ‘Enter’ 'Tab'e.keyCode获取按键ASCII码 13e.preventDefalt()阻止form和a默认事件e.stopPropagation()阻止事件流6.事件流(事件冒泡与事件捕获)1.事件冒泡 : 触发元素事件,依次触发父级元素‘同名事件’元素->父元素->body->html->document->window2.事件捕获触发元素事件,从最顶级父元素依次往里触发‘同名事件’window->document->html->body->父元素->元素3.事件流三个阶段1.事件捕获2.事件目标3.事件冒泡7.事件委托1.事件委托 : 给父元素注册,委托给子元素处理(1)给父元素注册事件(2)判断委托子元素2.事件委托原理 : 事件冒泡3.事件委托注意点:不能用this, this指向父元素需要用e.target, 指向触发事件的子元素4.事件委托应用:动态新增元素注册事件网页特效offset家族获取元素 ‘自身’ 宽高与位置元素.offsetWidth / 元素.offsetHeightwidth+padding+border元素.offsetLeft / 元素.offsetTop自身 到 定位父元素 左/上 内边框距离scroll家族获取元素 ‘内容’ 宽高与位置元素.scrollWidth / 元素.scrollHeight内容宽高元素.scrollLeft / 元素.scrollTop内容位置 : 滚动条滚动的距离应用固定导航回到顶部 设置页面scrollTop为0client家族获取元素 ‘可视区域’ 宽高与位置元素.clientWidth / 元素clientHeight视口大小元素.clientLeft / 元素.clientTop左边框和上边框宽度应用:响应式(横竖屏适配)BOM1.定时器1.定时器作用一段代码 间隔时间 反复执行2.定时器语法永久定时器 setInterval()开启: let timeID = setInterval( 回调函数, 时间间隔 )清除: clearInterval(timeID)一次定时器 setTimeout()开启: let timeID = setTimeout( 回调函数, 时间间隔 )清除: clearTimeout(timeID)3.定时器场景一次定时器: 3s消失广告永久定时器秒杀无限轮播2.五大对象window:浏览器窗口特点1.是js中的顶级对象, 所有的全局函数,对象都是window里面的成员2.window的成员使用时可以省略window3.window的top属性不能作为变量名方法打开窗口: window.open()关闭窗口: window.close()事件window.onload事件(入口函数)DOM树 + 外部资源 加载完毕后执行window.onbeforeunload事件(关闭事件)页面关闭的时候执行,一般用于存储数据location : 地址栏跳转网页 location.href = 'url'location.assign('url') : 跳转location.replace('url') : 替换(不能回退)location.reload() : 刷新history : 历史记录history.back() : 回退一页history.forward() : 前进一页history.go( 数字 )负数 : 回退 -1页 -2页0 : 刷新正数: 前进 1页 2页navigator : 用户信息(了解)naviagtor.userAgentscreen : 用户电脑屏幕(了解)3.存储器 localStorage与sessionStorage1.作用一致:都是存储数据存储大小: 5MB只能存储字符串2.语法一致:设置:setItem('属性名',属性值)获取: getItem('属性名)删除: removeItem('属性名)清空: clear()3.面试点:两者区别localStorage : 硬盘存储sessionStorage:内存存储正则1. 正则是 对字符串进行匹配运算 的对象2.作用 : 对字符串进行匹配运算文本格式校验手机号验证码账号6-203.语法(1)声明 new RegExp('正则')/正则/(2)校验test() true:通过 false:不通过元字符[][^].\^$?*+{}()|字符类预定义类 \d : 数字 \w : 字母+数字+下划线_边界 严格匹配: /^$/量词分组webapijs高级-11.面向对象1.面向对象1. 面向对象 是注重结果 思维方式面向过程: 注重过程面向对象: 注重结果2. 面向对象本质是对面向过程的封装2.内置对象数组对象/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20join()reveser()sort()concat()字符串let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你indexOf()split()substr()toLocaleLowerCase()3.构造函数new原理1.工厂函数和构造函数工厂函数: 用于创建对象的 函数构造函数 : new 调用的函数通途一致:都是创建对象2.new关键字原理4个步骤a.创建空对象b.this指向这个对象c.对象赋值d.返回这个对象3.构造函数内部使用returnreturn 值类型。 无效,返回new创建的对象return 引用类型。 有效,覆盖new创建的对象4.原型对象1.原型对象 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。2.作用内存资源浪费 + 全局变量污染3.构造函数、原型对象、实例对象的关系构造函数: 有一个prototype属性, 指向原型对象原型对象 : 有一个constructor属性,指向构造函数实例对象 : 有一个__proto__属性,指向原型对象5.原型链原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构对象访问原型链规则 : 就近原则先访问自己,自己没有找原型,原型没有找原型的原型,此类类推直到原型链终点null. 如果还没有,属性则获取undefined, 方法则报错xxx is not funtion原型链 : 继承2.函数进阶1.this指向普通函数 函数名() : this指向window对象方法 对象名.方法名() : this指向对象构造函数 new 函数名(): this指向new创建的实例对象2.函数上下文调用伪数组转真数组 : Array.from(伪数组)数组求最大值: Math.max(...数组名)3.闭包闭包 = 函数 + 上下文引用作用: 解决变量污染4.递归函数内部调用自己作用: 遍历dom树 + 深拷贝3.ES6新语法js高级ajax-11.前后端交互流程1.了解服务器 : 提供某种服务器的机器(计算机)qq音乐音频服务器迅雷文件服务器qq邮箱邮件服务器爱奇艺视频服务器谷歌web服务器2. 了解前端 访问 服务器的几种方式1. 直接在地址栏输入网址2. a标签的href属性3. location.href = 'url'4. AJAX网页不会跳转网页会跳转( 全局刷新 )3. 了解什么是ajax (1) ajax技术 : 在网页不跳转的情况下 向服务器请求数据 (2)ajax应用场景: 局部刷新4. 前后端交互三个流程1. 请求 (前端)2.处理 (后端)3.响应(后端)2.ajax工作原理1.ajax工作流程(1)创建xhr对象let xhr = new XMLHttpRequest()(2)设置请求方法和地址xhr.open('请求方法','请求地址')(3)发送请求xhr.send()(4)注册响应事件xhr.onload = function(){}2. xhr对象的请求状态码0: 请求未初始化 (open之前)1: 服务器连接已建立 (open之后)2: 请求已接收 ( 服务器已经收到你的请求 )3: 请求处理中 ( 服务器正在处理你的请求 )4: 请求已完成,且响应已就绪 ( 服务器完成响应, onload事件就是在这里执行 )3.ajax组成部分Ajax(阿贾克斯):全称 Asynchronous Javascript And XML(异步的js与xml)说人话: 用js发送异步的网络请求A : Asynchronous 异步同步 : 指的是代码按照从上往下顺序执行异步 : 代码不会立即执行,而是要等一会儿执行目前我们学过的ECMAScript只有两个语法是异步的: 定时器 与 ajaxDOM事件也是属于异步的,但是这个是属于DOM的执行机制。所以一般在讨论js同步和异步的时候,主要以js为主,DOM一般不讨论。J:JavascriptA :AndX : XML 与 XMLHttpRequestXML : 解决跨平台数据传输。在JSON没有出来以前, 网络传输主要以XML格式数据为主。 后来JSON问世,逐渐取代XML。3.HTTP工作原理(本阶段常见面试点)1. get与post区别a.传参方式不同get请求直接在url传参'url?key=value'post在请求体传参 xhr.send('key=value')xhr.setReauestHeader('Content-type','application/x-www-form-urlencoded')2. 数据大小不同 * get有大小限制, 一般 2-5 MB * post没有大小限制 (文件上传)3. 传输速度不同 * get传输速度快 * post传输速度慢4. 安全性不同 * get安全性低 * post安全性高 (登录、注册必须是post请求)2. put与patch区别全局更新: put局部更新: patch3.HTTP原理 : 网络传输协议发送请求 : 请求报文请求行请求地址 + 请求方法请求头浏览器告诉服务器,发给你的数据是什么格式Content-type: application/x-www-form-urlencoded请求体请求参数响应请求: 响应报文响应行响应状态码2xx : 成功200成功3xx : 重定向302 重定向4xx : 前端问题400参数错误 403没有权限 404 路径错误 413文件超过最大限制5xx : 服务器问题500服务器内部错误服务器ip地址响应头服务器告诉浏览器,发给你的数据是什么格式Content-Type: application/json; charset=utf-8响应体响应数据4. 发送ajax原理:: 发送请求报文5. 网页从输入url到渲染的流程1. DNS解析 域名解析成ip2. TCP三次握手保证数据传输的 安全 + 可靠3.HTTP连接请求处理响应4.渲染引擎渲染返回的HTML文件6.函数防抖和节流防抖单位时间内,频繁触发事件。 以最后一次为准应用: 输入框输入事件流程 : 节流单位时间内,频繁触发事件。只触发一次应用:解决高频事件( 滚动条事件 )流程 :4.实战案例1. 新闻列表后台给的img网址有可能会省略前面的域名, 需要自己加上2.水果详情 : url跳转传参原理: 一个完整的url跳转由路径决定,参数不影响跳转http://域名/detail.html? id = 1http://域名/detail.html? id = 2这两个url虽然不一样,但是路径是一致的,只是参数不同。所以还是跳转同一个页面3.网络请求loading实现思路4.文件上传(1)创建FormData对象,将文件添加到FormData对象let fd = new FormData()fd.append('参数名', 文件 )(2)ajax发送请求请求体就是 fd(1)自动设置请求头 为 文件请求头(2)自动将文件转为二进制5.文件预览ajaxPK[[[PKsT styles.xml(XקPKi-X(XPKsT2Revisions/3qslg5ttc9dc93lf408u4055dt/revisions.xmluPKdmPKsT2Revisions/1v2kic4tubfihjdrqm9qctegmt/revisions.xmlPK~APKsT2Revisions/5728fou9ciqnams3veghe08grr/revisions.xmlPKPKsT2Revisions/0dc76832kepcpe43ankdeq2a8v/revisions.xml)PKPKsT2Revisions/215ms6619c167umkvuiscq179u/revisions.xmluPK\ QPKsT2Revisions/7qhbqgd3e2v7e2958b8ckp758q/revisions.xmlnPKl snPKsT*attachments/03b1llb6eh87ie54ft88frull5.png 5ʉPNG  IHDR;m4IDATx;rƖqhРrPlƙInC jrn/Bϓ'#~FD" *u_m^Af` d66@f` d66@f` d66@f`~0SUxYwNny"_Aؐd6#a /5 ?9-a1 @U?u|q݃V\h`M{IqƋ ǶAf &tkfojnrpl+e{xjnm2px<۝pmۥ)ŗlD` d66@f` Ke6<iw0̓kWN.N/`W}=x~M`}vϧVb?|3e̎_Lϖzf"/rE 6\I.}쒥2?۷`zCf'ͭӝ>Tqa۟}o=C#K~ؚ 2[0&`o`qH~o0w*>8O9'w=e̾qڡJɄ\Z^9N5lX2Ӯ>Ԍ<98hB"\߮udvwS'>&`Ga\R~ Uf0=1bpB5dv25jgg.uǟuvT~gxz>Vܵݗ~np͹+]~쫿fޖٹBaf7eu].M>{>Oo}|Yfk!8[s9bf~}s'-ӟs2y&q5ky6pvçoG|g2{};A2;Wl )pq/\/]WBb{R{bX2pꥆE~6lHmKv]ⲶbY#3l 7"7kw< Df` d66ppxdFf GEfMoL!eOv>y 8`gP>k4<. 6dvoLJ`=Cٽown>o1l&?2{!_}CfI.m2 [ b]nzᔘ{+싨 ԕ-٭ɿ^֎oؾN +[ [ =xWg>rr:VC0a a<$9ݿ1# _qvz+ޙ|[mP{iomyL~n.>50c_J?6~B}Q3'` dp`d66@f` d66@f(6Q&z7lrkaz)h@f(npzLH8;a;m涨*M}c/c6PܨP8*d>Bf?o>O֪+QvԶ# 7+s딧:znXyYfvC`'+\Վ 7K醎Օ2)UEG|I;1<- " 7j俹us*auoy̎ВBrj8%yNefN#6Ph,5z>?;i.E>:s~f3&|dzp73 >bv05?Kץ{!> 6P\/6~[_%x=U2Ef(}ϣd%t[w|y #l 2@q8[ٹ[‹ތ`l/z{ƓJdy }{@f(g0DY8=ԎnU 52@qi/A>]8c ӂֹH[" @Gf(6Qm8:2Dqtdl N/.2hl8*2hxy6}(q*pdTd'_/}… ק O 128̎_.>9Wd4oߜc_ y{*v}f%1@_FFfO0D!o;t"puYԙ_:v<gUljr6gBt?4V}2N)`?20\>=_UtmP=}`J1owbޗTNVn}>3n5^zƹCrQ8{`nu=h^xg2ۏ-3{6iomyL~n.>50?ilvم~OfCll 2ll 6PmM_oӕo@6ֶRЀ6PHgR8LqwnwPnmQU*ƌ__mQۡp|UraA}~*|٭UMd+Wm' Gf(n4Wf)O7tܰANV6ek3~XAf(nTmXs =k*{Kɪ ]qZ%^dj8O\/6Pܨ!N̍1NTUifܧ PSr  3;w/(FdF[efPyY cUYSml+t?@f(6Qm8:2DqtdlБ&#M@Gf(6Qm^4 藺ϓLAf(GfGf(GfGf(GfGf(gyoW=I<ڙ~)ZџL3sqMlz cog}^ akl-‡K9=C|@m^xm2 o9ݏ˽Kz7ϙ= d6P\/<G5DK趞EmAFdzq2sg녙_'3ۛ-- 6P\a,'qzݪ^?/5^''`kdz'^}qu7wsDf(6Qm8:2DqtdlБ&#2ll 2ll 2ll 2ϧs)1/ݏw߾%Ji-n,nCfFf` d66@f` d66@f` d663~$p"ߝ%\U3pXdLj3"[eVGfϤ2gpM[phdL2{MfjS$߽=<:1`2h_ þMwr7ye[a:sjCf7욻^w89-ȇ\) ӕHf>٭u >#>]w&;Bf7 c8Hg3;MfF̖'3{l'\gdv>_ݡpsm\dfGln{x?0Ώ 엕!==߾o&\?7'D?3^✥r?~zMd66@f` d66@f(6Qc]aqq)rZծ99O"5jf*Kp{Ed\ ?Ϧ'\Y\jz;oak[I?j;J.'vJIfz+V6P]7=P Q< 'zUEį 7~={Vh*P\U46/0\vslŹ&/̞klɖYac+ټj;WknhsC#ϻ-2@qxx`=ֳy3;8%bʡ8Jy3[ymo쐹b>2@qWH(j%__!m}F5 ,ؐzr[jSnaoOM0/ٹs})F]d6쪀%95ei99Q 5gM_6kZn%2;>GM)n~\4}0d⮚3x@єmbfk6DYN>v4! +dvmo)jlAr(χ_;U1^q}4=ٞ o|mQC3,PnA<3 2W>,5\!^CU=AO>K9:{Bmf;dm'm6RkP[┊iN}נ_ DfWePwr+f?We4%U -; QXB}f3k d\r5 UFyhM `g2sS;Zu_佐bз}xdqrcqCfǧ3;Gy1Kf+ mܖ&[UYPCu=.쑉Wrϙ-7cnŞs:e-Y͑HymmGps[M͙֞rkn ;jm)rKa m\" oxD{Xf]evq@Bf+Biqe離*'!hClō4ob$ˡVJ3kjo(R6<&̹֓vG\UKmQ`2 $7$WyiM~k%̯i1mnwB⑥U}mQּv}KMjRE>s~f~3?m9\/a vCk;a/?}&>?dxN{+=8w)n2hXsxަn?9'o]~k5KsuN}횐ٚM<[Vp' >‡鞠mm_: jny&Q4ۛ+BYYB.7r_^2v,gg;f|Ԍ!=뙊?ξK%gn]_g[S/-P%Qk̲ܗjK->ֿs9ٟw-2sz8xHs* 2nPӗE4 dvf&a2;ik4{lރw&837.(qt)EJ^p=Y>| or~?`K e[ wse3ջlHR'cnGInp8anTT,Bh~^ܨbS(%u.s/KC՚rPCR1W5.M)4K%yIjzƙ2>1Ob;{13^a3!2ll UfkwIv, ;I#Vɼ=Dd,5Kefiv-\C57I[DfcpwLjX*V0Muhk؆s[Gu̞7UUGܩW~,fw+~|ekFEiBu.7lV44lCs:ff'~<||J)Xۥml}G:2rԡT0V7Hn_MV 47מ 8#fv!}\cxs4!WB#jO[ߺFІ<[.{deɌlغ ϶x? ;O>K'd2+ .yo59v<͟s:6Q[fJ4{fKS.CAŶJR(7)Xy%#m>%{V~d>v<l>_ rvf"HsJ$WdFEezNiweA(MKnd␱*Sg خ={` Xw?ծcfv7sa3!2ll "0]~jm]_]mРen֞%~gFfS]3[9Y 7,ҼUsI_d,pVn1F[NSmO՛L~vdr3L96;H^'OB+ SWkߏb߿m)N鰙=od5ZsK mm[Kyv-W8Jj傖l6,>quou[^^yn W:XmjO#u̎~<||E|@v2{SNa̞›jtnB2;h>9>Rvܱ{Qxz?e(M /tg=S*6p73!cb!{쀦˺dߪ:xi j;W޼`ہx/=͵S}|ٖB鹗Y(KR2V,~p}x̎#텵G MY֣95Vfw45nr傦duC)Kn%x)ުhԗLvNآpK3;?z|}}êu=z>=:{=^nSJ4sNO"]˾' wS7t?-[ܧMSyL\ɣ߹wQ8WPQ8ȉK͓uЄм o.Skk?PhvĊбev_JLctSs^prP>Om磤0z;>8+yas`ɮ{)!qg7F]W_2? \#]|~K6Dw>z]?J+a,ٹk2VuIfQ*XuRĶ̅qg=nt;s4?RzEqU> "7(-ɵiJU H=f[bVftC "r'+Ԥ;.s*HYa۲Uf7*Uoqm-oHUłțexLJw5>Qob2[>Q8kߐ pCxKWq=Q/ 1]_y`~UC.y)X|Ưvx ŮAҰ9l{՘~="eaj+V/{ila͖9b e86㙕l_XVݸK 7)^N4wõ"s]a\@[RJ:3n{n>&4LQC%-Y&5{$Kʺ`<%Al]Egp1Z*٧Ɉ=zf}f@EY ϯs ɝx&\ݨ!:tErU"g-ͻF[k+<ֳ=U;%y᪙6|bj?8Zf~o<66&|)}.&ׯkuQ0of'FOs/E_ ?ө9Y.rĄWS{Z2g.\NiSV%[+¶wJUU]|`Rub.r`~v8_oG8m>|luj+;r/ŝ88r]P~נ'VBz{cn Vxkory Kk}U HzPX?~?6lB/4٪v,;hڦϠ,5 ;aݮ,SEӕgx+则=~]ۙ`?L`? d66ppxd&~+mhXcϻfFXۆ+C[3ٓEfBB5d嚓+iFQMo3ZMV.RnUٓƩM#Cd͹~y/go:R ŭ(sSΔXUq妩 iU|zq uaO{8!'{$V3{lp7̮=_MXU} SmODgғEf0=|ĻuDc=ysdvϳ)׫aQ&Wtixbm\ۢ 6]Fo׎qtwo /vv͔#s&׳)+6VO쪦:iVZsħk~oIUgطXr8rQK뮙wY"k ysJɵaC ҜC`;֙\|:&G]Ӱw4*PƘ>;4XmnYɄ-\|u.R)ܬuF ;.J֙k{%J귢!P{Cm\J6+̵;vX3ᜩ d66@f` d66vv 2|9J桁Vgg !k7H*'}ɹ }.ŋ؟ 3+7Ͼ}ۼN d6wc3}?pFzIENDB`PK%B5 5PKsT*attachments/1ql038i8mud6386sj67qov88sh.pngPNG  IHDRB)IDATx xkkim@-M$H9ƀjh@j<5APB[jTD@ ZOE[j9<3w>fvvyfcp}?šG7Q&!  DcF٫8v .dמroD"\1^»լcLbl 2(d L0Qs˘׋(*aQ5` r [Z& @nSa+gV1T<dL0Qr0SV>J@Q6R5+VRP M(9rv9>JK=%q?+E'4& OTl)Wěpw) {?x% ڴ7~љ3 M L@02Ea)z{^o^p>L4M`ﱖCrq#1ZhD.a-V=TAFPhD_[4~0i+=;Hr2GڵЊ>񁂏wց *,aH%^:&Գ`@~IO Ʒ7ʀx]ߛᵇcw{^e'%Lzñ=#(ސ7Zq 覭;m&"%B_2SmnΟ4 yBO|lDY|.|~[|Q4QEjYk:y˽'~|M?(rT3w3O}=:FLtٯ?ǝ3֘(+9D,3E{2ϕ<縉f:h+-f GٱafL93\ʿy=0D׬}ppkMl۶-ꪉNU 肩cg(=] yA 7̤ hcn&W&:T T9*a"y RđHU?W&:=5w/"H0TʻImUƣ'qOQjySf  Bi8(/u!T:~e%YQzsy~J♪+ 9zkR43QU jN=o!3b{JK'Bܮ/ӢCEa)5/g}e񞾁3?A dCj+1QETIJ 1u=3%Tdq^UguAYvwOw(g*TmbN\?( e Db] ɠ,k *,>YG~g +r(ijTD5҃*~ew˼N8rk>K^KzpEҿ˧)d(j(bY]=Gbl)B*8&˵R d`2M˕2DUyWx+jlR *P>IL(qMD*Oޗ?asѵc3({m Bx\eR *~I D' iaALN "9$;>vTQ`>=0ѥ3|j1RQ!5?Z63Q;j4HML)ʕy41T僚UMf8qod*V !Xŀ9V .@Wh`**@f"\*Okbb UrB`^^ %`(qD*';AL(] >__V^dIM)ME%HHOLTP2tF!){/aN 1[jnWvjXtꓤEdwbw;cZ;"X.lI]$%IdJ`*M|\/8)4K"t&DAJ}S:Q QMMS4T߭0!S]\kyRm+W娾w&zzD*~D3kDo.}F& {U |W?C}+cghg:7s,iOzLQgetxD|]8rS<';]YI׭kXA\$D0hM*QoI)ilo>yPb&B2.7XZ\DhS?xp^\DRI|V;OYnbW,)b C}1b1XhO `>wre/ 9rTΌ 3oQ)@n1媓wrIaNYLKZ`))K'T ᵏ)GLЙ+zVQᵏ #n1QY!RgB7S&Vbߦۛ/&LR,I{ Z&͢R+VGL6ծHZRQj+&^V%  'hҖQq Eݔ0 %.d je쐁6MGe { ~cUN-gǖ D+ f{7JY,B)/;B%ܽ%RoPU'ns!ihzWwj0zn52Qel()ndѲu^z[k:^,s|cIKg4L/cVʾYd8A7ܶ{3+V~>`DϸJhZn^+5xKvM"LMT\IcŲ ?> ͥ^<ݥ>MmB^xH~ɟX#zrT2)DL}sY~BbZ͜G\-ꆌfH;w_l^^Sa.KwQ~0)x+^=+'Xu%5* [ q/aiQvS"H}]i&2L_z,ƫ UAsi&\Y:MSMaٰ9g!ȨMf¢BG'W|:6dɻ&jlY_gB,*_ ;:C[ΌV.*lĊIfտ5ӯ~AuLcFҰ511Quj& @tO:\M(|d2œ_Qޏog`Kʷ\5QB;"Ve[FSs 䘥缡CHD ½Z9Jדy1JV]?Eu?y Xb1GnVNK! å _HOmi}LMDK c\yz&d0:m!SH@RS0m$ 2㽗 Ma2r*ז kLS ٗy^Xyk?昏[ȭ.er0QQ)k~gʨ׌&*wOYT1QdiLT5W*6 D)Nꚏj"<hn|ED 6Edž)2bJP .nb|\'{U'ﻔ&3-Ui|euv>ܭR(S(f秩4C*/3#j<7Ux$z@#a2.~A^± T1gILs=94Qmzƣ2Q!Y4nw6Qt&dMFK+DLxJUv͓Dej= afA_ iel0_/c֖oz>rdaZ\ te 0Qq&1Ww$LTjԭbI8mTawSK㗽Ө$MTT8I.6qf}ݠv`%Xe'Ci?\]j] MtU'j#):I33QSԆ gRb(&条퉶&~)i1Q߂D`2n x%rv9xQ3!n V[db=AmcD_=ynu+GMfbt=-;/N"O~CVI/d䂤A"&ZAv> +>Ѝ'Xd孍Z >.5gS 8 YȇK>4U]MtޣZV4;ruϤ&|n䦞4Qn*]`@|2, zi|7(#'ʤ'OB=ei~_+~9:]DEgo kjyRSȍEKDK9tI-ak 'hWHYZ`ީB U/Q*<"{(3%ngJ{/Mzx꾡F[4~OfByϴ޿p"'3l0Ql(taf{d;E,'~6f(Y3L݉b k4׻i}w,=&-%ɈG+T ܆쇯y2s&kH5J1\~*/y䣡??C^ eŃC‘IH4]h.XH L)%3|&+'N č[BJU<@;qpN9C-D{QD+9! X0)NHGt(eFZoncoS?C)i MT="C-q^Ҏi+ReNX-.]&9uJ]s>ڹX8?ȿ8YO5%T7(!_J*%YM8⑌Jc EiZc7Ъ`f-IE [8aDJLT+@:%jJ=@X ڤ|G+Sm'։*c."+nXX8*sԘ4YY r'k $>kndݵI8M%V˕D=2xS") (apx&o&(?iH&JH>j72QB=iDub DFG[D"o2#ա Rk׮/Ë5vuMDI=zC|Eꄻvx4DŠO=5NØhw4𥪝C'G=MsSD'\k)@v\˲GMeiz&ʫrrr( zv eCb8.e DUk(i}[%"P͘v;.FVD'];n;w;٭gAX$"&TT5 TDŚ$ ^:اq2*DFMXD$:NCukR΢Fee;2dy=B@:xaADr7ǧ?g ͛@^)2?*Dswvrf96 @`Zs82zO)w`F̕/}jqտ/; L׳htZß&zNW?A{T VFߑor(&j _hcc9gҪI?oΰHDV0\q$+V/m)a^@&j oMtIioS> $?{0^V7_ , ZC*<_>q˒Sc5 y]7FD#̶]F eޏ&j Lth8^:G6E( h 32(?TčBQ|L5NOA_|g'2!H`pDNOz︍~~Ĭ2`q",ODᲉΛ[c)/ŧ7A.̷?_ 9_9mݹ,yDuV}(KM^đǛ\pξ8$B4l."$ ܱfŊ[j}ht̟L;ݍ妉Y#%JGɁ_?Ρ Yʿ{i&hwwꎯ;XqrD=6-Ѯ樉_K&7!0&*7>{OpTfdc1=,]@ iG1 4I? t>wd5Fz_Opó\&X̺3J{so QmqVerD@3칯/oVVT0A 9z|A_>:s}nnvK?NUgSRU!\3 dkNva2"Bpֽ)o-~͌?-TEfg5^E2!wL& V7/8?& V X"蓞wnHmlFG|!8ato'D)yy{?(.! 7ITK8B4l_wrucLEv.>*aIk7UwF"84s'E|62QOIG]go12\6Ir ۪t; Jgɂ>?{1#L*¼dE ¢xojBj^ nm\0x<|;= I 'Z欝3߅ҺIѸ\I+GW3sr%%]wFmԺnWW&L{ eKK!1).hae$DJ &Ȣ,%zf1QE4ůI cDf$SD+sDy-c/yNA0QM]Q 愉F T }jhpY=-&ێQ4Qc FCr%A4BTϬ\I=ĕ\3Dz _VjjHjg1,z25Dq=%گ7ΫPiDeBej`?=\rxA~!GP5t7ͽw׈NQt^I,ՁߌcI/%XOC&5ǎօD2s/"v?^d#w0ML/c&v] `pD 6wmsQ_ hg u?v ]2!MfO;!,0W|tim)¢ LN)+D<$L\yfG ʽyLḱE% z:q;<+zX7%\WDa]}^C{R'n'ahPS`ְW KETOqvd. 7zl0QkثW_%_?Q__\Hyky&諾YRNٻf DE 18(:fW.Wp,6Q /i~ D[p> :t;gGCTkqK̿n~>W"&sӁ3: ߎ+HYQF7E\-Jp ҏS{ΈK/hnDCsyv4:rsD3| !$ٟeS0Q;ojlFYs{@LTUF}PrvNKL@9!32ru&>ڹXB]%l瑏v,#>+&D[ j1&<<\5i? ij? t`|N∄0SM;#NS=h/fޡ. r]u &rh_R4QUB F ݈w2WɺX5Y6PLn HL?nL4SG(*!A)l|KўeIdTQ|P & rKs^ \%(&*V&jD/>UokWܜDe2 H͋j4HQpZΪ ㅉ2p2iPLD+ 'NF%w.Qa~o  ' I Fi=HY$:sƗD*wM̴R7&ȑTG2`]^ &*+L7(]"K8`6=m۶ZgH M?~J׿ԡ۹9;b*e}L4H&j1&jh*D#Ԧ uKa%Ex288~ԽQfLDNpv.f5Dbm 'WjLTN 5 ։ 02.\Rf 6mz@K^C5D1 *5l4#&/?\&jLLI' ÃgΧ&'瓞.fA<Iah/ ͨ։D ESh~DXm"{W[F+WZwCskvblOڱ'JI&\3ihRvI(MNuɖU5%SB?Qd"=,؋MgdvDn{,X@0Km/zS`՞Yj{u;gR2&žB$΃eA{c gE}v9A5`WhƼpCEN9K}+KɞO&kAQTi9!E5tJ_1у/ 糿˳E2X- =d&mm!}j?\[hE!A=DM9C[8e;g_ j@nFFm&zϝ_pv.rrZt`0QkdjW\%ZEn D?Q¢7ޏ &j,]톅>۹<;I6Жh Z#KW[9ݡ۹<;I4E쁉Z#KW0Q cވTz7gOKyfJ@v,3rKݮ<,]D"4?TȄ2P!k>g˳bZLT/~!-A/g2}Tț&n &H& @h3QLg6( D% u#//MP7?;۹<;5J!5j'⍔c0Q+9zX`~x a5h.jh8kWՔMGD˳j OerB_҄ [D["!zXREM԰WU j{x˳D꘨G]>|W:djDG:˙#u˼&jkq}0^xn,j(̈NEIG2b*_ 0ѤPV DlFr1zlߛ9.[|Csyv l@0!ފ-@H5wrD9n`ʙ:zr(iF6s?\Bz{))#EE{Q&j]m47S`g#b^%@07~kxV_5W{{&{ŗ˳bVz=6bְD)ZzxeO(KEX n۶mӦ4 Ys;L4ˋ\3t Gn (gޡ[E\3v]5lquy~ʼn۹<;Cn1(]aQ@vvvZo?@0,P!::`LvOnD9IM& A2¢]6Pߜ>‰۹<;C"fG辳O`ְ"Q˔^N$'n~ݼ_7?38e 5,aQD ?Y|g)qp錸+F5 ʶ}|Eesev>|k(;\DuL^0пIw\RWdF53/;q;fwӁրo| ,z z@#H&;w`1ث/ 3oq#D)]z;@!@&jL@Rm^5 M{R'n` =uK(=vTf؊%'Y~3wӥ| DM 4bj'a_-}VsgvS::]uK1b =ZaԀh؀jXS[OMtNrvn pP@Sa(,CXA0Q! ڿ`iT 5{&?D]]ILD@JXhqhZBO\s|5A`PzY*^ _{5 XBxqRgD&N2]$̜c}4;(c^N]Mg8d_J[[ots ='4 ~ & 6l1DofKDᐉVTsz}jD,?gjjg'T?38 J:͖PZù?Y9ségL,;bvKй Qr* $0Qk8g%Cij3L_6Z@bi& 0Qk8jE\}55RvM(ύ;͟< KE)xd<4D5GrD?FF]?9zs(EF>{l!aQ1D>Mz$ QJQ{9yeaq 5Ed3G &X' 6ӄr$AßfvLTb9_=elj*1Z**& 6QMT/&wt};;?7Lh=Lldm)Daa MTb/?\ʢwr& 6Bm)z+Z&j Dgg?g1i[[CVn-T;b8Ԗ|;0QkDZ}6lp-T7ܻO܄( h) 5`m{^O;bϟ9g)1=ň|&j oM;:* ?CDkn'4yL Eb?o}@*B1w a ߁Z+}fy'Qw~rIi?+$LQ-0Qkxb(Ϥt/0UpP#(&Fk`D;+&{]x^X=>xfc˽'&z٬3OOZxRPް+D)A~W} #5tjjJ$DayDURW M GKl)7˼k?0cdݦz]~DW.;FwnzS/CL56Q /i_ &|h$̽r8߂0Q0RJLtL7A2xO;=0Q0c-D % L1|I+ETryֱrY Pv5ҏóOomHxgL=ŃC\Gv_|t`|NЎev G^ޠ>D}=:Q7DI#$=r:)2DSJ[[l+]Œ(Б!A7GGoO2!*ɨ (zbw&j(M:E(M RWL2NQN֘x )/&f",-VF[RyN@Ltjo*"?LW<2s%R4Q1ۮ2DДI_Nu##&" *"hsl MT4TLmLT:"(= ـ<z`B@Tsg,Iy䱉, C՟zC9DgDA~Kg)α<6Q-XcER=)~/c|>b& =f`O|3å!DELB4T"M!z*i9ITqPunMJzDZ%}d`#XMeC<0Q5Dv{?0<#`!svt*grlܮWn./\ryfgYm8U%8f3'Y:ߗM_|%ҍ̾U eʕ }FW GdC(x9)p[]vŰ;WJ̰vbJv~t8|jLӶ#YE3*xxwn]L1Qp%?MF.PLh$š|! 54WYiʫ7Gj_1K-VD6hN3U*ón6N6-)`0U45R9f3_w$Ÿ2u_bn>ރu X==Z& Yz&&:KK%oj5Z}G#]-"җ336&YpXR+f7Q'+ĂKսX-tqT~IH'hbN| M쒧#"0QNȖS&0L*0QHf'LOƊ씉vLqL4m&>S~ɪ/ErN;@6Q]+kJ_(&jB^k0X;7忁&j (O ſu3 Ryh%4%Jj>ClaGCJ 5҅2>&Ru22,ʶmʣVU eQAMWn:1Q@FaQ[kbB˪V3'XNu~&j7hyEwtNzs⋝vwL9 ϶Ox}o?ſ6m}m1>`_::s3u準3iiK]-w6w7>422~M#[68Gr}C˵ - [7ϫoʺԍnu#g66^\pQMÌچ k.՟_S^XݴX9u]յSk'WLXU3*6262QQUQljVG+hEu" #e(_翄.wc&JdK5Q(LjHUNEUis$׳ukJSx)]ZhMY'i]Is"-*#/ֹ휯&JDI`yOpP`o#}_EG& Q.5ɥ{|6 'P[v=CbVkJo q奮瀪F3 gퟬc_Y]v&P˥$hIJ|d_}U ם3D&SWviDUuiJ(c3텙Lʓ c:l,Rt3ݥD -*`u/yI5 Qg?撅t_rz)4˃M{~ iw|H0Q)DFpK GDuR 'J#bmq-Rfwߢwt/N>-38-}tFRmcdc#q*O]/Ȝ\=fi/ǗU&5ud |m:&/_DSym|:&/!#%YmYYiJ8q?6X06v:3Y=WaD5 li<+oD7QMKW2qM470۝g*Z!2jdBF&"E}YmDvmtjR"#w 9*ig^{'ƪmlR[7h{K]ljy: >c+x o qBx4VD+"hem.ZXQ9*^Y^YQ;*6*6fP^{XUn}j~Zj4|FpVmE53kG^R8v캑s.k[}Zl+67!=ݴf/kRK룝u*dKte&iwOZ5 0QJqDG& IR}Бn5U/ Ud)t#Lʖ4]RwM#nj9dM#TI3eFLV;w:*#F5u/}#'G\u];F1QGivoyL(ͿALT\ `b 1Q5LtBL7haUW4|D),qʨ}kGjK_S,Vj_t`ʨD{ViD);FLT<.QcmT!;O`͚7mz&*D)>NU@X3Q"~Zm&!o' G,gdy1mBi5` XS,&+Ҝ[W&&JJݸ].~%?LTh& n%ʥNgb\;w5SLQF]`) I'NK:QK[e^W#'Z & \]Oqr%5&KSJɚT&jNv!My֎ժlVnIga( hQ/LgDQtk%+h]!{_:Zc?WWϴr،2zc3pU"&kNgOC ;^TI՚]Un'W]V}f\v`Gw5x[mL¥` i{Ϸx2*#ZҴ2C0R:-ubdhM^%n"ODN(f Lj|i=ym*#v F0Q[KgRLTBoqkFTLuz[TƋPfa7RYg 4jYTG /w]$mlsҞ };noj[92uqc? Yzj~2R1mO1M}wj@_OcZq_l}M53+;rO Y0χ(L(J!&*%wDa`뛮2u}³5 3"1 Ckg.<ZR5偊Q_0ՍaD! 70X8+psl4P4B.~lYS(lrVI"x& ]9Rk}ꚳ]Ƥr]Z%hDMXV@4H?>P!l2qGbu?2 7Y_JPIUF L/p Mt!W'ZYqG]]{z2QZ`&@ŀA#DZ'VVU3޵p=ϴ2(tob@ )7 0QεBϼ7ZYCO0Dw 17Q?D0Q:2# mn!:Xz D0&3`zj{4tdۊpO4cD8O+;;&t-%ZCE\D uMC<I|9DW25`2U5:'#_Q5 QTDM-}9l QLtK &j D}\3N:¼CK_ H L0Ѱ|ughy"/;+Wͷ!5@Dih /cHb4 -`րF*bvR9mE =`ր6SYe*/~l5Dl.cE[$z"Q&=`@z*Ǘ40<7Q+D+c="R%&c8E }Wd4M4ZYObvmϵX$ @D=}ҏz1DZSU1!*lh胱q5 \aʘ 5 n |#a^DH(MAL5x1D\۸Vwx?6'l+ x<-[Q>X8!+(69.9ȗ:UYٲ]@3$zf& @Dŀ(M"SZ0 :IޚhuWњ M/ Cef68Jf6qe|5X_\ywfeM?xվ= :x=0DPL >WW,ykmݨu̯<;}nKsv"ܨX5O :de4,-),RJ@t 1Q8Up"&*R ?M4ZQ1q^eꚾ(""6 ninI,W IvLR:;EiSl+O:VOgh㐝MaJjg:` 'Tu"B& cЛ7;XA&/uºظ$ㄉהK!*jk \QL%l7EoNvD]26ۍ՟A3/$Ͼb)a-g MIr:WR{em)D,` ߛ(- @Q0uMziT8R,:l3QU4H#5L7]LI`y,{yhԪ=.ҧ=J+]4Q\I &맘>>2aJ'ѡBDLyh=”q R[j%SJtL41JU5MDE0^êSad5N;Q5e`?:'7hEJ=їfjեU#kLM\J;MTOEvBn LDo&KL'<"Ras,uL-w$3442_Is{MTk0Q%fޥoR20Qk䛉VT5%&>!ϿT$T{* ;`$qŚ+D%5Qm~dpi^)&dLygq/"jT>iM&30K&*ܢ6biasX [~Ft[)dLfU1zu潞Q0 jLD!OR7'KlhGV#;kD"̟h|N+ 0Qk䝉֌KL˙xEX'K%W*{RnOTݳ & ktQ7nz`5D+;h<"aDyG 7ӘA}ҞaX:¼NKOGjLZ#LMj49'ZY7Ѷq[="m7iBԱIU'P()ְkIiU󇊸 @pZ#gL*6u}tLxv%FEz[ϿcRl Wg5NII`.[[fVƐ,q&y*+H6:ONԳT> evNRTx(9i=श'Uϼ7S"}'o5 3ZvO'_8 ։!C Q4 K|m:&/_Ӥ{-92&Zp!%9h%=M6q-= V[&R;q9u~k\yAh =DY*%Kt"_E**rգF^ÿp9׳1c } &ox8Y*6Mm+5gRJcusUյSjQ]7f"c1G7똸K3Dtkc1ֆ`37Q1 .N 3RU%iv٭-vQoUTN:zI/vL>qy0>Asv!2 3S }>ĵBCߛa@ThX$jc&ZU3 GVt-B1UZn䥮=X 0*1Э!.8=|o>#LgT(ITT& ^1cܻVF `0Qk䞉jϡ{ail۸_;~[<@4`y)mm\~[KOFu̯c h[ES:׳v!7MCp5rD<յSƙ񱏘kh]SohHE2QQ}et=jޏ<&j\5H}3Tl0N[;&rgCCp5rDY$JQL]$p5rD ]tqj>-*?. ')+9h(nF(OS|U m}_eltXTIso?n pjLe |&j66𔕣㟨bJUYPF9+4(6=ׁZ#&:"qAA *_!iA[G)C阨 P4W(&:DpILU=_~ݍD_8n^ћ#յSZG߯rЮF}ΪO,2Q3TG h 3<u|n.iJ8QACΈ=}h0M4]IV6ϫ{fmqNҧM`@Egcy.E@>cI2&*AQ-:BM\@RIMutU`NKnW6x=HLا`4iBj^JSmgJZ%!HԔ6m4t>)Pe̟ 23|nPGD.^ DXUјh:]2'j>(/TD""py\<<sbb]bȨC @‡&>7Q[DMZjj"¢$fTFK7%xMTj+P*J?fVjHPhMUu 'O@`DcN]/sa+'&Ji! Q;*Ih4|f?gE`Ę0;ZzE}nRQ~z f5)~V,YӔo·B z1':ĵ'@&IاKW7ID3U`3Sd穫BŕHdf14#e^@{1 kH2ywSx5"b55c*@)cH1lt D< f~Vj Y̎P L0Q ]e̾@ z`րrϘ'-naP߁Z& 09Uv<sP@Z& ^1R_pǞ8t{CらXG9u7~Pi=`]<-_P6N{G5'_2Ovڇy]l0R?ŃC:v.H)lzq)[UKz?N%370 5F /9_s\z`[M⋒*R{W>LTt#o1gKE"LĈš 03{hďk*ˢn PN(G<9MTPn![Kg#Z=uʽ3ʺg74i6ѻ$D,wnQ];o<4G F" KcGicE5YIh\H-|7ru n)cBݤ:M NHIITj;mhMb'۾3:3G[,9g cwٻ 8^0g^7=9i5&*":UeUj#Dp9Yb/ DҋTErtf]l3Qk"՘J~8( MtPqht.0Q;BKH/EqSCשˋG)IaeۈlR!2bƙhqISld{09rxK*$!"2TH[Iԓ-D cI,?>Ϣ$X~\~Q}7SJNí4Q0ԉ *VEt#w Fg&[D'UÖh}&JjQc`⸉rhZ0*bJnv IJaA' jrMT?XEEGnk~Jާ*}QI#TI4O)*?np@$rL4bՖ:Mͩr5&FbIi5!MKs ݧQN/j D.W{2ъ r<7A@8naLJE)5/0Q+v%=/gs+ɭQ2ѽy}h n6-&ZnM[MTޞ69Z`U$K+,Q2hQ$ZliAJC/ )WB3{"'=pA%&jUm1Q}35Q\ihڱ4uX: &j֮T)RLH1FՉE*8D:3U& 54-*Téi&0Dn-rƝƝ'WĢ0_tγ.W{hsMtdRJ!Rhp4 e%?~ONT38Oi0d獒AҬt)/k1Qc~Q R&7N4,%29 i)_ť˅WC 읯N0qDC˴'n&yhcjrF=bqR_G{HwXcb&?K=,*gWMTz5/jjX )ih=-f( *犿\*Si`2':ZT-r3Q{<`nⶉFiZcIZ{)B/V2Ѱc),/ԉ*!RTx4EH{e$9QRD$yf؀T$*·o/A>uՆU p/)XM!d>aїSVRKnקp&Z~K1T~4++r3DsM1ZDA6v4C ˂R PK L40ى6g;T-h]LTG˅1: Q L40Y;_✭Q5ͱUXuDWCjV_.-OAiT7 GM]Cw}w=ڻ~ ?5;jou۾zmW{~/ZŁ -k2OgXjͫ>qn/e|يGқZzӃKgɲw/^vK_rGYtE7_ַr__/Ά`^s]_-߅,v? _,yfM;u.:t|aJk:% NNd}}dG;uG:W;ً]W: ϻ؟u?b;ف.ΗؗOug=c<4cOz=v26d|.O0|}gQ}o{gow}fF7{{omaa==]=2|][Sֲ,{:7z2[RS7z^_(h>hD0l3.r g*9Æv4r ގG0iOO;߷Ïhz)?Æ+ߥaéj?NаJ4ld,4r`d_d_#R0rF;!>rG? >>Kc`.=^ .a=͇ 9!6z9а׺}=޽4l;hp{ٻ̂aPV*9 #zee/6,1^0rPh>h5>"x!k~a4P?es/nG3Mhͯ& @cd L4λS5uDh L4MXZ 9Mt1"2 @lD,N}~޾E7/_[y/^w/{,{6.7oͣV|p-oMio^U;][25Z9ٕk=?Wko\s5wZ3k~}=. =RkŢ2otI/o^N+!c%5gJ-kʼ{]o烙7|?;?wxznnlS7n!{gf~>G|6Pɇi>o`xKc>olFM²֖=^#4/=>-&s]W n宨`'o.ޘB' ]8X'{tUbɎwƝoN;%mR4W:K4;'BO;3j$ތ{~λ~G;hB ~l<L4. `kŃblܺ{|ǯdd[x5MP鶾-Go=;xذ̻oa ۺWY0rm4l#[.ý=}aÆzE6<û7u{ Glwtqj3u[>jasG#?.pذ;n hG4lǞp</Æ.޳5:B#oouC0l"9tWawKJip |F OL|‘?ӌm 9{;?F#m:pDutזLVh-=/_*D,a@a֤yc^]O/X4=iYZMk-]c{O->6C/]}2"u0QECL W (ĥkmްH*}0Q.ᶉrG-Dk.\i 7g^7=9X__|n(xy~|˴J>Gop MTKJK zHˮBi9%W"$)]l+cv^9>x2js.Woê9sM-<+ˋGu؅&{EyEL fZ%& -60)&ZRc; q?m I>,o<$Ó3+I5Q>nLq L&*8qMI%Hڧ\%t+rg\~pd&L]>Fn6QE)nUY{nD&!>jƭK[p3-dvӛ"0d5/1K-.;]_N.:q5&oރr]l :&PDpixd &jMUp M4Rh)ȇ蝗.Jrhjr%mC[M6%{fT77H_b)M%(Yd{OM]O5 ݬDPzx&0QᴉR4TXc6"/2&j2dS7UX}4+V*ffƔDŪYCM=&j5PC)bTc՘vK9z {ai٪R450b8 -RMuS fLw&r*əUj(D5d&R'ZSRL[8maGe>QjhLT:Q xbTЮnkYo_甲ݓY]U;8WrL4Ch/*͜anhod5ܾuL4v<-Q㼐 R:U-5qWbZ,o)vT>٦TTˬP'r47h H{ezchMJ<:`Yq8oJ& ..}"ƭTK5*.L2-QheԲ|JDmiykQ2 `|&(@QD( h>`Ev\ĉ`EL(`&:mbD̶ == (@Q8n\Cw D7le4!2 ( M疑t,;dž~K0QpDmZ/`EᶉŠdT0jNcE( M383lK\ShZB@ḉIiwJRdh%6QKcib`rV"&:UIg&ՀRQ(@Q8mU'JΊymӰRT6S|L(7QǀL40Q& P0|D&(@QD( h>`EL(`։鶦 L4sDE) ~+/jYL4sD˂*Vjٸ%cP`.G˚ }m}/ Ƙh(0GpDM쟈ٶA?``lߵ{lӪ&Ƽk ̻^hz^/&ʊ1ˢL|{0ZMkhd6D3)]k[Fɼ7CRsDxEn} F-Nm2[d1M 큉g65kcòMb αn9&:8Tu&^bTDN &=mq ('Lb >Y{V,4&ZJ&Jm(@ฉr(iٚ)LNMJVٱT}P;P$ 70&JMF=L/*ERuUv͘:43&Jz:QqD2d %GD-UChRTA𭵮-&*Cbe5*(ZevD@ഉsVO &c)VUEv@㶉X`fj]WIĦ#Σc m8o:&ZcH*ϓ90 eL^%G˘(D( h>`EL(`L40Q& P0|D&(@QDr&:xW7L{QikׯG\<;1+'Sg?4n⾉o?mC}`lO2Ri5ݵKW7>۠Ǵ!:%.ybt{xp-3_+AnxkJæWyQe}oƻ?TA:}w]x+6z'zEᩋ}G7'|gzg8xm8?=k-6(H۱c_rp'N??O~/9`\Cw D7ldhQr|]Շ/]^VXN=~t)IgQQ$Mwʁ,9'T:ICDdiӽ '?y'#?B"aTp`@0cū&Ð ģeR5Qs3 6D՗渜Dqw\mA>`t蠼EV3Q{g</V. Z}:$c{++OgLNVLY Sb_9+&*B ( eF$[u|lwpgD ,?].K?KZި>Ddc کhbX'nN:j1VRL)݌\'Z#/XYj/azG(@q u3#:u=-eV*lЩۮj"5&,#UUibӯzS)T/*6)~*&WC5i4Q>%uP]Ń' Tf`EL(`ɫ^]^mtu<`wkཡT; }m}/aN7m'bmPٚ96Tʮ箎Nk2VRߵEoXP$ip>(pDznIb:0Z̳/]^nϼ0ozrFOO#7:H{'T0>zLSoB}htw?7"r&JT!IJǻ6>oWNrO[&nK. VF⦖Zpy@T C0rfՅ|:ygHgZ3>px?mVURam }R.~ha!iR[OjҶՇ$s7LeY#҂ە#wd Iפ^$Q}UBrz/Wɩ+k G#|WtgS%h5VRҫij݄p M38SwhcpidL.zPZ S?&9f%eG+ E'D-{PnC+ S&RP hb]N+謈-AW)& -70&JI(XBJMIĴnf% QL459EԶ!-EŠ12%; bXDSH9tDfFGސ|Щj1Q.^%I*Lc8mn[A˘CȐNTUFc`5ѬXdqS^f 5DC Mz3"5PC 5n)Ga/L;8mZS:cnaŒI@4U#`7Y%9>PuV՟bb]58o[24R'ZSRL[8mDJ&ü2& (wM<jhW75isJY%mK}Vث^9&!EJ|LwԪ' 4sQL[mbZX:RL4v<-Q㼐 R:U-5qWbZ,o)vT>٦TTˬP'r4}w$TIތE5*0괂MgἉ:F+(PлRXW ph>`-l鍪E-ukU\&hK[ڗl'fm>>ZM( h>`EL(`L40Q& P0|DLz6Q{}MyW{jqD֝)Ggt7㴉UхUF-&z y&5t@qQFe:\[rD_~Ѧ߆(t6Q[F-G-5D?=um'\>uɦX&zFTE7Q/Fwc k E7L=1{7?Uf2/KlζF&:tpN**p8 ᶉ'+A4C{)'AL͒(d+PK k0Q[oOY&Iy^odk#zBb^%/Ǘ8Rv SN4+ ى&DTRr(aMׅ(OW$3yꦬERD͒u5tguK eihڱԃ62 Zv2&ZW5bІ(bi,SL-k_ܫvHI /,D1R[RfW`ⴉHrUĹypT&SIci&סj),nhodKD'j_WI>I@yf&e>䴛瑲i'' ajF;EMTګxɞ*ܞoEIENDB`PK]UؐΐPKsT*attachments/1quplq9707a2a94ml3q2lcg5ih.png[vPNG  IHDR&*^ɪ[PIDATxM&ǝ׭}KCb=h}ZۻfZ{I0c !۲.s/BB=0{ѥiAj@N>d?O>U_T?ODDfe*2|ݜƋfqemf\#rTGP :"@uD.E'goݿǔuo_u~h\woニ;7!rݽzeM{|uc;GgW7_ mJ#Wsѻohr1 SCY(\yXE=qq+:qA+8qqّ8rF.q<B2#eE.&P!rTGP :"@u{NBL_x5M|kbOoJىm[N]L)~5j^߽kvE7paGW֓8N)vReZɚɂޝ=rBJg*\kEY5y|Wu90U&>_ay9i]*˴Fn!:{g*ĚE@[)=`_fj&]7.HYa')=bn;h+s+ I͵$\&Y,WYaR`Dȕ{}O\w ]c0rkܾ.Y$:ϮyVS֚\ ~{>P~.ٗ | 雗\(>?ȥOBKh[uzWrJ+3aUم2 eS#WW^}v$]s[5+MC[{Yᕲȥ8Sh"bu%'M2 9+?Xs2Ɗ|d7+vMWX7\EW?rie~7~P{#A f\ ,6\8r).sX"7o*/ %Ϫ\S5p&5s&$wO~EhlSY*!} ;5V~|c X#s= .[E. \Yq!}͡:(% {}|\EQD|Kx8rMܑcKi%!OlYbqr/Ү D.楰2T% uֺl:7LW/u/2+Y嬃K.#k+m;ȥ\,2tgi.a[^7W.YW]{ m4o5x75_y.`e?/I퓺\*kn"dF{qGfQ1xc[98Yfm3d. kYvr|NN{d]&x z+uY^Mu{U,BDk{;TV,/BɯI-@uD.\#rTGP"ה'aVzGkzvEU۳vK;%?ғPV ?PVgʂPL{)G4DyEJF\sxd53eAl/sLh.QZc\8ڶvkգ\[KjVg\`%WYx],[.<մ v% N`ӄJGv%txJ޺`^'!ibo9W C AgR9d"^TV6_чZ)!ZhdWXkwnnwk,>qwKЍ92rRVYS qI,44e.nCXg^KV=%[{{ӔkӍ+'+5tҬU$e8)|%/YJ"Wj)KZ%9 @ɑkʤOH}>:E IG@YОf剤loo@kɪȕ[<"urm~\-:Dʋ{@B„9fdoI5Uq^~ͦӓj[2VS!r9e֟X|4`ʯM<ۅk.bZk  R~H#H"ٹVOpȦTp\攘r,8Cצ'X$9r_ȯe[ ƋRܼT۔rS`U[rSBnO}r^kSo)v >?%iFgdV_<őKجŖZ#|Y5{Y%9%_(=sy*tYK*O }&o ;}ȥ M:UmeN ͉]ЀGv.t-9ou (x^=cK^QK*Bbe(k@f> _54`i6{K.sJ8K 5iJNd]ڧBxJi];r Jy tY#Q"濚˝h P2*rip VtUjeN Mݓw63EJ}ʾPǝ\5]~Ai5#ӋQ|s8rthN okl.X ,\#rTGP UϘH,gV2rif^!lYL͈uT E siM\ۋ kB}?}Q35׬vM\^I>".@u؜U#bAJSD.08߳G76LYI:"@uD.\#rTͣ`DR-Pڻ~[;o?@n  r%y3~쑫+۸!?YD.`Qrod_"r?$r2%rF"Klɲ,N,f b[Nf2aD.q j-?Aq;[,)D.`]ʹ,4[؋%eT&u 'Q.e@9\ʑ+"W2Q lȕgn,Dѕ5.?rҁ]U*geFb#^f2SQ)GmT}vdkH =/f\}xZ*Hj, ةUG.{FGp 2M}KKp I" &ŬXSn_8s/tAM`rf?DG׏fk]qȏ;2ǼReC"#[ke lcnf 3>VK[uZyk.=Kr,ܻ&q/ ?F%a%k&`\#rTGP :"WN>{|TqQ *U S0M|XY#`IDܧFl_b]Z vYrWɏVal*e\aYEPdv0JW<*;Y(85#rvb]r0$3DVYSEbEJ ed9o`~OwT}s/__6^y\ kݑ*&,Yc#",mh]vɮe*̚緤]7`B\FY#UOҜЇ͕ IH[brE'&T'o˿XYHsM~7:7kLfTQҸ9$w]~jK2Tؾ)xp)%W$v8Ჽw=4xB-7U"5ʘR`96uhbRIO'ǐ#UVrrPlsS\{IF:d䊤6÷ᜅ#WqG;&E"׶^#Βx rqmܡ1331CB{rG*no}>*du9A%7++(E]gZ#r5FvEVs[ZQ2@\!nGɌa03$woPPnpIx鏚мY%ȕLT7#b%Di3XlN_Zތ|ʿ·;}en\؝\oiaZi+[;Kx+kd+nXGej>/uĬ(eeM\v0ȕ݌HA]VYmsΪHlW: 9O̭`́8e"jYu'1~X/&\67&,%Ǚ\PW%7#|N.k=aQ9Dw- ?L֘wi+v5L?"MoȪ'zo&{i,Z嶉 ֟NjlӹSȅjV֣Rǖۧ&aykFVRčoz.&> r.vFEE\>Mo u\#rTGP+JR[czi6{v򨳅5LNG%l0q;< \\-.wsE.Aڶ|eUKj$ʪuѷ-Mחɝ'-M [|m:ڬ>Cݘrw/f5-< cVj 5K M4Wd5WD.s'0x n'y z>Җ4/AM5&kܴ7oN'+R=eԔz.=\%9Kkn]kt‹ȥp ?kj+O֮b{S$S"&UdrF~\9$ڸfJقwp.7]`[WUԸdN$ {0rE'Wu1Mٽr] =c˪ v]}=Z3^vԷ3kV.ٱbExkߋ]۟UdzJWXw3BkjNT~Nb Pf=`5cU4mSyʍ\X\΁Hֽ;Wͻ9R29 o}+BM38i[g٣;ȵy%6e ҄[r۷U${b3(51Xoiˈٿ!? ݃N"snVR8rX0ߍ(8W +msJZX\ ̄Y2esaw*b?66e 8 :Gv$݇hɸQh.쑫k6V'Az`Fmk{n|b?+8AB]WC* ȥߠ *ryW3ڑ,rCYlrG.aKU\aG.gz͑1}iS#W3?yȳ>f\]>6e=e$K1v\NTYM 8[4UPuF.}E a/Gq]=2 {03FUkJz64e~6[\+ЋEzY'k&]-2XSSQ)D4_=4W-s ʾ'U#vS^$}+y]";~PX\yPȧV^45Y%Rb\vQnyo?*8 VRQuG./{L_W.\V R&= I5Wa:Br(tȥ!X؋F֔M߼ʫ8],*(ydr4{g`oJNlByj\=4$ _Pw50~ٶ)^EKk _~I"=R6)#WGF9#Vh&7[Pk#Ij/BMkZ#YI(,<Mo'zJYô!+_y4Bzh@g5h =:$5jQq\ٿM,ufUE.%ق7V):m%@w0Y :VrP5]>%hbZIۅp&W2g_MdKpkv/ky5),x."Wyzքȥj}?;/Nh*An4{HwJ./l'»UYo9Cg_ߗbxȕuJ_ ]W. .潧-~}+W F謲fw-o2Dmvlq,`;[fQ+%וqfe_="&VQ{8&G.V膇W~jkfLVRIFXU⑫[ m۬=\uװp- .9{/r0 +5ٲ~W04Wmќx/,5)\En>Kol}AloM m,HE[F2ܙSβK= gDX;ڻȕ:鲑;K!5]E(\ؑ{-teTڊ#WVkM<~5˛݋j$r\|'r\=~vT:+B"jl"(o,F KZk5+^\mc>qE(%ˠ﭅f+ ]y-,8L g{GYErQ pE"Ɔ?g\}xZpm1ʌN\RR+5=i֪#}r|7+', zaak~;(.3F.M JFܳ+ MT^=9z~WJcJNZ?xS/UVb͢vaͮc kQSEH22ŝʍ+;t% o)t*({}ej(\ueF_i"MՊp1G}-/Ù[ʠ)/+du4!rVة4Sb4V5rͥ`UdE4Fc?|׉o)k/^TI#U֩Md GBX%Yᙬʓ<4򊱃[,ӷ&kV);)TD'77i,F.}q6+'<ɲTg@r_d/U"D.t*%;y=+wu+%`pۯP$eK%ɭ# Nh|gbUt\JU֪N0T0ʥIrje2rW'rfݩS'uЁ]ȕ̐*sFb#^f (הRnR8qp!.; .ܠ|s-iZ5bNḓ@Ne+w~FI` ' g}ʍL+_)8p<@uD.\#rTGP :"@uE߿WϽ]||Yѝ7ѝMa|K2g~~{ax΋ ~*\o?x/Jي?95r5I΋Mf3Yޏ\D.Dg(9+~gW\$r\ rOz,"kD.j)\y^x4zۑ~W>lXnԮ2{? :ܾkn֋\>{;N'f}׾&'wb^~hm@-+>w8G_Y'#1Agj F |[ON74o/?p\Mg\T~͝oz3fF,;STtIg\mc߸}oS[a8|/𻉆j#6c>lx~L`#Wl|uйX:wf4By1VpkՖm|k~[>H`r#Wl |rj|Ն{Fn/z\'rV%+4w>I F!o-MP\0Fy!E9s3Fi;I~j'#WR]R2Vω\,lv–(ӹe>?B7Bd"ć͋fN2iՆD Ԣ'c͋MF6N۾~6wm:"@uD.\#rTGU#rTGP :"@uD.\#rTGP :"@uD.\#rTGP :"@uWn*"@uD.\<|zO(Ξ~eW_~񏭷N~E zsoq^5 prwn|GW+GW6֮Z\Oȵe#Wt>3wJﮜ˵_/ d-n,L+\o?x/Bk>bw"Ѫ:Z^J ȵj\ͰP_k V%͎֘V&oB[\Cko.:5s\VxdY"O`ܷ 0/P.M2ӄ3kjHsYo~\}=vTɌJf놔wF56ޚSn?'-zp .'r H;6lr#745FU3ծ8lw)UrXSD.舑˸DF최 t9n\ఓ}F9挍s[NI9xשS2أ?H.&T=`& g\lȵ,TU#{%\Nvi'Zm;݈Y#1wOl!ݝrX;leE&<`oڠ̷ [^i_;/wVƢ͊;=Ga#tcQ1wuhTJv G.# \.F<}2Ν:}XϜefGUMrXއeONv"tf[Ӱ+xqLKFyC ;A>ksw ktߦ4"Wc̣:?h e9W%v} gvr>&i?=A\3 _c?yHD,3W,yEƧ<4!Ƙb_HW bk޳UםXxuijE'\.V(Tβϝ >߱~5߱ r!l斢4B$#rTGP]F/7v^bC 89ػ.S)W²-O,Op긓S0+`ӟɦo_b]Zgi-k"\ |xk*AAhJ1{Cf$UM2 j*^Ғ+#g2ϚvDWOίW"Wr`~.G9CWV2rr`++_*U \ %ѾDfwpn^݉bIX r-%&dDYw!ϕM&FNY$rISilr~^ EN\RY݅Q.͎4EhqoYnY"W2`_Gjj&7*2#הT@Ŋ*EYҷr_ZgRTr#8j*k"읽\緊FlXB?Tz$sD.'o4>r)ʎfGKY6 CjG&77jrS&F.eciJU>Ų"S` #Wy\J^baN,H.C/:u:B/n-VOdoi)`%RSbOGf-GTR_MB@2uMP2b)p2$7q+r%r^Xy*8߬c`zeѱ%(M#Xr Ɋ˂sreYfSeUG;Yw*8?JZY}aup#6)Nn4TV{a͑ky5Ys \#rTGP :"@u^ ۻo {O>={Kr|/^| P>Dlui'gMr=qGgϿ}g2Vs{zFj"W$fż{o"רUwW;}GUoD^z/^[o~=(NwXq\}m|lWwÏy{~}kׅmUqx{j6)75iƿ%g6wN.㮸M?wn5KY2CR5b\-En_}ᇝ#[m'uĿqn t#p[+5AgOW?}l~IV8{_xfK{^|͊ ؅G"57ۈ%l>Tsj:vmZW}m7be \M"6>9=쨭Q?^i퍑M1ƴb!A8_mb磛?7׿,&6ctJe2^Z}͝wgfw?wO6d2"N>~W܎oӘ쑫x;$1ryG_\/K!:{ ّv45d.Wz d'?9,-q"\Dk\9ڼqRIFge " K$rukdf5T̝ ϝ&"Se(moGb]D~ţD .G.V4#d+:\ȵL|O2nek><կ7?okfK;<#`A MI&*|[<Ո\Z\RHn,zȜzx5^! mSb~ͿM&/sar%kh7𐢜j;1гO t"4lIM&Bio78#!S\GZmć'7QIqC:|b.G.v'ͧ dL>xB$\ 9uhϲ<$"4+-X"rĢ;?M x9mh=)r5-׻GlWlӘs})Z}.> X^{M]|"\dD.`'e h}C\`D.\#rTGurn[eXܭf5Lb2f%p,yٹLD.uyYƌ˩u"WYN江22h.h)⼾Xp!\~ģʮ% uaIe;re~;%:ˊ; t{] uڭ3Ź)jrG|1T.x]rC#irC۬&rR(\4b(r]?>r|7+'4 l ^=*ڣݬL%MiŝІsYӌ &+P*s&&Taɂf F}\wÓ8>YV/oV';**tv'ױryl5U.ly#Y\֒.}\MruF]QJ9.ʿA$0N} tȕlۗ7dnRy 2ɖ6B0$ Vg%ƹۓ%MQw$+\g\rLʊS'wB1\ȥ,e1w'4D5,S~Jb?X`K0ʑK.yr`?7cS5r[09r9 ~[,l{1v\fqrNo 154\K$w\}ƮDH7P%׳ ՘͢<\4Z'u5ky] e_zwh62̺-玩C r?30ɍ/XnD+h"Gg~~nw0k?/ׯ}[oWCpYE l~޷v^"ר+w"nlMrV^o%?u^~Շ}o;Vs}OWD<?G6Ho}Xp"rV0O+|0Kn)6KϬZ]xs23j<ӯefSfm3[ݾ;5oG,۔D"u4PkvbtX(rEk5ݖ7DcÚJ|ޫuxjƱ݂lG4j|Ǻ~ a} [<ewQ#W(+:\ȵv'`Y)g5q嚇)v1q\.'@F\ͩ#z"̟r,#m\aUx?0kG?"s F?ۻBcX1ϛ}ִO T䒦6YHlkH0M-"xXĢ2y.Wu' lՑbsV\GGhةhd@T:gYi,nzj~bћԝ#?7&; $k˚Dfe9#%VbV|CM]w'\.Zu䚊#x<D\M;E\Ow-1v/ŏ\;GP F.0\#rTGZ׾W/}Y̻_W}mn VL|  Kys_)}MGZ<7<͛[Ѻ/+Vq˼C罒c|wy1C_>K,{̀ȵbϿzy7[!r/n8+AVr/h+Yдq"z|g^I7ȕ +9D́}{kBvړx~0Lz?};3A]{hZ_72Ūy^8R/J^+RQ@4RlFއyN>۸v]w͎65nٸFۅkzˋbCs"§߬?`WwD:wjwNdkliV.w^2s0,- Uvm޲W߾mc%Dƾ]q>l<7mn`sc]evj(S1Uy/F. F `VOOޝ5pv;VJF!ID}g )6hjLIl[~eF0 ̝jR5dni|ykRmzXNƊl^wYt0o{,Sq n/b^_覄HHm_8>.܍8!3QIrH7^Xgo^k ~DʮPnGc cxlmzi$r ;!p}-g.f\ eHeLD 7[+nupWѹ$'oXV3v" XNqnj\Mi4Fgf8uVo-SmBr;Bca1*^4eYP-Bcdneܕ RU<~켬jN 5pC;7l愰BqFf&yJFVb]\W@W)ro7aM/_K\R[c λh.7LGٳ7}0lM> gnjTd2ۑ}'me!RGFݥ?X'ig67I<"sz4g{ٲ9};o7iݞO>b?a/n )?d!t՞>/P:%>/`O0O,,G6XzpfKZ ̝weg ~>3I'5׬YkP#0\i1G>(/B0ގL$ެ {Rp c+ƩKg ]%~Ǝ+.<}}&HI D{\Ehʜf.9 2 Rxz#4Hi1 4v .1 NOY"6@E_\\|"0"d'ϤL~JDͯ6y  :"@uD.\#ryƱ.B־Zyz\kUeyzo~~v&k2pAHnP(rGΒZ 9iz"Wkn_u~p|{} q2J񈔰]+cV $ |@"W+w=r7ό`Ki#&-\S%Ų;M%4>e\w_= +6~eܑ!?dE(M |=VM @%D&9ݺ#pjyc]~,Ud-\&6&,,/o6+r)C \!T-1c%8>rT\>aX-"W@3U+6j9J>{pIɽhJU*9IOλS*S|cz"b#=~XWӳޣ;;?6Gw6y;/ɥ'߈\1r5I΋Mf3Y%r䍏Ok^g r\G+F?Zɸ&"r\ kD._,rY;#[m57+rs޻o{ގ\xFZfݹm4P񦄛J6.ٷF_/V5Z+[ͺmeS+179mNf}u rIg\m>ƾqަ$s'QdoC?r4qE.FNwվn-P~>UPg .|x+81{j65l߼4|SlNRIFX7E.mqCßd E.Z =lZwA䊍ح+r\@r{ Z,rn,Fv7ZO?\(׶ݎfp?3~1rwrw7NBO1É#JE.ivy"7 @5 ?z6h$gN(L4rQ+P#.gR?aj># &<$"4+i`:E `D.\#rTGPz#AP uGoW~?=@uGN> >Do=yc!rTGP~D}ūݷ@=\7?j[n2\^zS_ :"@uD."r5U䛭ZwjWmݑ B rTGP :"@uD.\#rTGP :"@uD.\#rTGP :"@uD.\#rTG.#r :"@uD.2#׾~tѕ߹싢Q6xݗ`/XﮜK\#rTW?:˻My.?7]` #/9 l(1 :"@uD.\ՕE泊|5RfjC\< *D.\#rT.QIENDB`PK[[PKsT*attachments/1v9nk7vjgtjiqdcaunsgkvae10.pngi6ɉPNG  IHDRVU6{60IDATxMU3, 25bs4PA':;DΤLY6o7 ݤő&qr3 }F|{[Zv޵w=rgժUSV}lgߕDɫQ l+(f `@)(f `@)(f `@)(f `@)(f `@)(f `@)(f(D%卋vwCTsC,sJ *dd6@;#(xM%cOkG8_گ8l8D)'4i Gݒfx]>L$vsOUO+2{&gߜga'2+=|eʼ^Ūs'ë.<{%wy^^U]}hpzeo (׹}7JE `jFtxmĎ nQ]pˢh)g~\dN#,߿Eb j2Ȃ6( NWBpq ,@%2Z1Y>kdD`BPd>;HTMVfTLOfK7v):DP^&Be|XQ;jr~jW +z_B-9zKt1XtG , b[ ]@eL@NNǂ TC}0*AMf?/ rdl2(zYXf^/X/#+D(0gapUt:ۯ@.6]l_2JO\$q{"L2kr/a(,[> \rEEW`3_N O0ce^;X=c*PlH&r)0%6iB9δT~mJk^&vPc*p0B'*ZX*41V2S~K.AnR9{AND/4s"Lfܬ(H_.+9zȯx q 9Y¥\05FSacD(A0SP 3LA0SP 3LA0SP 3LA0SP 3LA0SP 3LA0SP 3LA0SP 3e x{RYf5z_j޵w\vK+NTpUX ZbKf˦(мdA?SsVeZMfm }1HvOrwz!́Xko:p9%۔*0H L$vsO r>g>IPuk:{B_o{_mz(^T''얟f)Z#/lRB'ë.dݒI*ك͵n &W2=dC/%b% T܉Z'Ad<]cw:58=} QtJ?dUp `X{*vwu T# Taeo SX.?;gj FI7\^\u3 [ݠ|gypƨmMw\+v(EyUP09-gL0 WVBd8-5w,0s LHIHoNi'Uکe>HVeңM;4^[knf!])uȲY85]*_#̻/'S29VlA/̂X:X6, yO0s^=0ABJ-Vl}1I,=6.:_ǪC'pw|o,Ci}X~ `[ҀI f=xpdwȋ d]6IR;; 4s˚Q`{dl H?"W3o¡Z&s)\,FV`DaZ֢X׹̇e;`m8iLA0SP 3LA0SP 3ee |okk?aޗ_SqW^ 8q?9 _x/ׇr u/s~Y~˿koX /|w?]kQ/>Œyc|ue^{GN}pt@_܏_?kc*/ճY# #n( Juǿ|>JA2{MPʷkUuß{ 0C}?תlZ13Q ˞Ny7\ѩ\J~tTk?t<;򏿵|T:ҕ>J]Y7p8uşڦ|]>\f@>󅕍Q3ݎA8+k8o4.MJ~b 42SӕY-8yy7t?C8,s6RTQZӧw:i Q^sn5I,vmutO+ Ԇ#cޱ[7U+?)pP[X(jGwn%S{էZiRolcUlb/pgvgvt'xߛf&Ul&UwSUvLZ5B}cFt!nQX/BZVl*Vפ^koIS}W7{/ך{;GQ]de'x5XT@kRomS+Sk];tm6R<[gz)uR-u)lGUf̣ W<\C@4Kcӷ_]Yݐt;BBirF@le8^6Ft糘Sf{& ($ oqviTD#fv9ɨ(PYD"4I٥ p 3$BcMhw"T8^cJ9]dn:ZUrcK%B#w@wUܦt? ,͙ SM6:MK(I 4ja,s1#ԙtfǴaLw6ef(} S tf8誺%k?.s;QHr𳶹M_-\0*dΎqgFfXH'uE=3Yj Nwtn:bvj 3u;#vwXs_۪6<@B'gIE i,x/BP3hpI~;55ƪz2 6/#b l~)">h]G& ˌNj=P9o(W)}US5QX Qfx·|V2o?~^\^À*8׸l ͸];c7_w ,(`~;B˨ l2<3_Ś!R83BWh__>0-P 3LK& 8wm ɤ7Ȏ]8 m c$˗QCa ,ՒfZƗ(b Lj)&_6Iy%jM[խƥs'ë.<{ޥڢ(H[C)4pY˧,6< (g JOOA V`N3O*v n\&E?9cG{ǢcX WoV\-1e**eqBtrgYTڒ@G;xbVm\C0*V4'qR`4ʘkM9}D|qƪz<;]|@5A"F̎>'~Br=#8 ֡ȸ) @*d"C5/F 9ݥ>K*Q rLnYh9LU*Lц'9;f:d7{GEM'g&3| 2O(Fe =_ω09LVQ c 9F DPYWU''63K*0ٶP( T{Hc #H^2Hw`>nh\s% k"~ ʗV1b`wGtlߤ᜽'~+=X@)Dk'\N G:K8%@SSP"P 3LA0SP 3LA0S>}껟xkmGG5]V}~l쮚yK6|CƼV-\GU_#UT֍ y~;xt?;8:86էO@~OPcQ&ahq5~Sѳ@[Dxw:H`8<ݴ# jq/D,f4#pݕzm8 :E{[ww0w>x5V^i"E's41a͑^>DIڗтV_ݾU _ՅV))P]f_Gi֠{! Ta_*^CF[$ WҞh~Hg ho?**@ #@Px,^{~c(MA,hW{ލ Q 3I(ÙUh=ͅI%B yow~P)%B -T!?%_@́T4.ن^jF3EVI 3u f`V KSC*0YvWTW?cA3d MiINu=fxF 4R w4f>n/Ad ͅIND#2x"kuR"4'B3hdf@*Ui̅w,bP黕ߡѻAڠ@qP^'{y;T45tg/Q2(V`hTd%sAgIK祈5)jF1` RID*l FNM3[OXN|jڡUJ<4[t& O CĺBw9é#ho/Y3WTPf+0(c U`DcFarr"P^hWeAciZ)0N jg}n!D@a,$ٻg$sЎ*0Yz ,'_ظGbp&ITaJ W`z2! ɀ)*g \f"Lf9YD*Ɏۗ__stg ^˛gWS.(fKaUL'׹!i@1ASv =aL("^k;56N,h3"58EYO3/sol^@F3=.9f 61,ȯaΖCLko~Q ̍)p0YLM+LA0SP 3LA0SP 3e |ӧ鉷@^__{}/_y4g;߾r+ܟ(˼{?vKn|p}卵̞* vZoW@|vYrG3zo&ɽ/};pXwοNyuͶs/h/ p'P2%hژNoW?r:B%tKaӗr"LJUx!PX+ST`l.^n9di0I&?&saT2AڅS]9fʅƋ ?QӳQg;>\zr(Н P`ρaؤIl7ke MiINu3fXGf j4q(04'RF(0S8o\:3Z'1A{1Q$ 'NZ.3l})B`@ɽJ 46v+'Z'1TP7ٴ6~)w4t"/@X+U`?Z͙ #if@&:bޤht>͞ I4n֬w\-2Mb `*ەcO%h jOIRݐ `F( *~Vj:3ߗ4f-D>9 ,8ЙbnihDf݌ʗ,d51$F[:[D)-GdQ 3E?$x/bo·67+YPs   8+/E`@)(f `,=tj6CNҤQ퉜)@Y8 1{G *jvE])'\MU4X:I*5v(9"kfz lsα1׼k)иQ=0T`D܇gd [%;ie, _\p" o$s"d0EFyHo ֹ]z6 fGMjQ雤XKmY6bjc-aJ{|#CPX n [PCsB.ǝ*QO4H_8`+}i dޥlgH1=NY Ԋɶ?/b;qX SS`o0!uKSS xe3LA0SP 3LA0S~8:u7sxʽkOO_~vǟv/s~a/~~CyßtuxojAGG?|џ{_?wA/<:ig߿-Gz  P8l.q_/νJWǯzU1)Pl94qhwN6AMyxtJT~RnX۔ ?J?vWv޶cM/{,^y;itiBSm)H# gQ+8f_]Ids1kTLJCE}L~D}Z#Κ=(; r@n}~_jRW2Qo~$SϲU0avLOSquiéON۲ڱ]Y%+Aczc6 >kCuv7֒=QZZ;+F9^u!sb/|b5"K'L֖=3E)k7fX6g9cN'{z :u*Gb ;w7K<8?Å BR]?n>SS{Gw9q6WݻաE> ,w(uRMuidG]fģ*2f!; )PZk'@߾eWuil%d6tE͖ ,T{Yd8 mT=<E.c^.cXLq j̐+~)ԨA[Ѱ 4ӪNk&եb<ˢ*Oþ<&>(pAccxS`tN6AVD'?`1DX8o # hFqJjB/(0DSC_~?|NU CS_Lu&Sa 4]bfEP)R@IfGoRоv &^AxDPMXA[T9/ R E1-J[TPYP%O93hPLM)a}u7?;y[ef(7H*ОP'M59.uew/ĦbgƦDU'tupJgĞL:oՙF)r sBctشo}]IW ~\hBiȌئUUsͺNw(pLN|fڴqYKxw^7uevӄϸ8Uwp?i Hۢgt ,zvw6Aț^A\,\[>q=Xk7Gl 9<Ͻox!f}<}GΑͭY82z . 1SO~T`%%ۇGotѭEp}i$58S%;(s쇝G?6b҂ˉ#!G,G]H .1qa \Jpt0/!4jx&>CBi .i} .i .Ŵ\$*x,&0-J\ FC Ap l\@6. S.;z Wb \ vGi[-Kk]} T]]ºMO.ڔOD:[eQ.Up!!k]@{}\+xƗv H z22tҮ;\b/$H̄.P%ͱ?ZQ07ꧫCpU$RǞ!zt~cy5Fu^eyI]2Fz2QߪjӮֳpkiw62@Q8_)++JZp6$şu\ަ%ޠcTal o=]l!7-=n^ G TF.;ol%w^y[pܒ*'&,v7 i\ KϮH՚0?at}\]XaCO];պxzߗ䭖}JB~d/km KiPt\jY-κםMxC^{Vՠ%4?DIv=)X%Z/95Q'`a$[a={74؜oz/N",j*jA x<+}6YNd t4JFWK%L!3xk\%hU1XK'СႋgW[q `l--㒐^K%<$:,&Ut{Upm۔ٵ: .!dݠ/SOW6 քK &+Drjw5پV^퍝cAnih/z)ǿ}+Vo) V KA?spgf5E \jVk2Xi\0!ߴm^.Qŋq|[U!upCp/yB; L'ba2Xu80퍝ԧ6 ֶre:%o|JTrQ tZD~j%kzs}DWUkRŞJ:y.M-1 jm&/Of23VWAT}-\`bnЗjܗIch@mѓs=%͋oIaJb, |_l;Ap1- #v KV %[TcRŞ;bn nnyvUxC^8KQ S\ /ܠ@6.  dAp9HI,v%0SպV$_4(U`\k\Fn ֵ(u S*CC3IkG RR[2ȳK?L! 9.LYr|b{z\\ -K*}B+Hus\vܧRf9<%^"܉#M!GRF.)2(s&n'1HBӨ=: #%7Ƿc:UV}?Np`hޗK,) "vC`:Z4`j"]>GEj|ةC㩢Ek7LZL#\ @"m.f°.\< \\T1ЀH [ l\@6.  Ȇ4_ŧ>5zq:#L+^J56NdWOZi)x8XxdKZ `,\jfں"mݖ3vUb8;vy7QۂE ' $4rUzWRiVv\Hp!M8}#jk%~"H[%WCݠY )d>WroٗкjKoo4^?&X.2HSHqgؾJ*Wpv$Hz* wt(SIole*JUIv폍.o%`Ee\n58m=*:-4CHnk]K~bϻ*P .G~k#rURMGY+!j5"/['g3j]/Z7U’b֭uk2bz$[QL2t"aR+OWìjaNwKҥvpQFߗ*2ºW ߵ`!^mb:SS)OIx5iۇ9. ]H6cؾ`:Q05 ܑ&bko}K\*.r .w硂DK*m]p\aſNEg1ȁTV^%.K0%aE+ZE8T{\U{3 _ci-tY Yy#ץ$|)u>`rFzWG.}4SO?wk^pYpJǞZ.f݋g+ -3vfIIb'%?ydջz'́K9޴I8G-kFx*][77(nYX~y٬{u٘7{T%'1]ڧA%KT&#^:mn=zbˢNBETr×_#aP!^ޱn mcF/Nh)ZZ?)QG!9;O`_]2 .7f4W |6b?{6%~~o-d^0:|*wI/);dƣv'/wkFRB>NF=-mJPsڂ\$|:$&sUEM;(szMj,ݘOrW{9[bk?mLZp 2\K o.+JBh _$Wc Yփ؅%e}+XmznwQƒ} ,Sn#縔D?]N",VYW+,%)Q~ְ?pwǾղZ_o5ܦB+M={T_fT?Dß;s.%vmZ&^纑/\JjύMEY l%Gu"Y,/p5'j#Җu_2O=XZ~KvKJ^E}R>Z6m\Z 뺌^\x׼0?KuU݉5@pI;&ٳ)'hH{vLM>UgT[p=DqnS?:.rTQEsz@ٺZংCas*[M!$FZbB|cyO>#J8/ Bnݑa/lݨb'"Z-ql o ?*|"T c ROmݚ; +<#i.``,GC;="9ؚ%+ .Nrs1/{VQߒl6zǞV~ױDG!l;/jj=" Jzڤc;p N.`\@6.  dcBOW\@6. rb{?' ?9k.&ع|\nu#Kx`D"ˑãg?}úm[\r 7\=1mqb)T]qȴ\Џ*bZ.OR<ʹ\ЗN r@: .L.rn}<`u\ QpaZ._Gi>U' dAp l\@6.  dAp l\@6.  dAp l\@6.  dAp l\@6. +}sʽ4zI8||sw|屋 @ݳ?x\Ί>Ko߻ZrÃbk/o]m{ėfp= gb;oZ+\P!mEpY {>sN .矺Kt].\^{Gg8or6)Fd,7j?G5Hxٻupގ2jN"y|B2Y)<3mAX]=3BZ}yPڔPKKrPRpo8Rσi._.gQp)ۤ"y,'ؖjAXo53%ELc`(afVjp)'.2xK80<~{V䡆 `H623w+5!c"[3!.\ . Sz{.9.󇥻Gp!:fswJG %{.xw*.eB9PKq9ƃEfWx82+y;]Bo꯻e\ɣ~X sYAxHI.)bRv˦<ȿ93GcGk9joO\?Ap l\@6.  dcshٗńenS}~X cngJU.hF .Zˆ]]XfcW. ODnԢ!֥c7/տsB_BR f* #7n?sZsaذ*J+U`Z6"Y8sxt%Ӵlhf{_7‚'X{z,KkOl9u][{-|\K[-LI as K%Әm9@]p tU*ykI`4״bI4։#6CBAWFr3qvKh.eF .-K%߾E׺"+/᜖[ !93ͦ2uC޷a), Ѳ_09abiI|ЦT ,)(l#.]AyhlJPϦ.5٥06MxKG*`\0E5r+AaguaFPQr-'lXs1 ai3;9\[k3$T- uXU0eZ.@<dAp l\@6. rÃ}7w>t_#p_u _W~rβʷ|쉱K~rXKr/}gȒ`86z:kϾl#S3 >x+?sT|vw }CYr4v17}zBQ?w\?jgwgmw*_t .U2ds2dp [;֙y ;Ͼ.kĔ" K^q?h7>n^q{G:{&Ͼ2ѕ1\{aFQ\`5_^1"F12=̳H`$?3׶zQ)Cbae qUEɃKԮ %(A}zPK/c}ЧNEOࢎ,sZ8Cկӛ13}# M#B52hz$FX.<̾>< Dj)˲3F42 x.ԥ0\*I57ebyߋwx mrApV=8T.Ce\zqi5P:1L3P4 c)e!LbƔU (₋nPkl5 .z . Z fKC@"{>Td(ͅԡ"O9{" .PQt渌1TNIS*̭Ɔ-5r1,(Lsu3(Hq"&IE}9 p`]&zRO|vKs*e5ozROOqC9c>Xfцiv.ɹ΀U ]Aۘ׹9i4tNrVƻxZTQceq> gsyIOe\n~~;8@R&GOmc7lƔ@2,6:{OcP"ǡ ƓFwH`8I!6LrT/hifFxR48mκ]>wZ?G|*8v5lky5f\e}Rud{D ɹGOP+1"vuką+\ls^Fpq?xZEjljǡ] G}v1E񰒽/G@|u[**sЇq:,h,x(imtrJis(_۟dߜ \ qsN=Y}_9\[E2 .GY]e]]ƀ.z/:7TBeke13W,C.uh0 d\ -ip?3aPZŠU[v-قV S5Apѩm. Uo_}.,/Ycࢋ .Ŵ4P Z V-k"r{cgKNnl_fG6X[%Ӣ}m$Ĭ\~ۇGoݺd=Nl k98a:Zp zHv2%tt~\d\n9>~y?u(̳^'7/Grw^؟}WqLK.jHRJpy棳w:Yh|Ko߻ZrÃbk/o]m{E[s"#`\"kur~̗EXeX,w֗>.^\"\_?k5R/X{kch롙Oue-}\eƿrT=S02-(7KX[W[g$u|JlrDbg8*Z,\thMe@OV!{".QC<>R i.XS.U&X矺%؂K"^h-+wlKEiP~gʹ򍞒r׋rV۩K .h9w~Vǥ%zp9(W){7 ER4/ֳ(1DO.4Kq|œ6|\<)Gp)_Y6txnՍD3wiTb-EpatK[piYbԑ[F).e[NiNZKZp)CEp)f ?iC\" .ؓ2hp҉Z>K=.+2Xz.1/np<1*ro3?hpiN1PQs\\ %{.xϯ l9.Ʀ\uG>9מxq~hROw4jQJ=ޤn;1%.ۃNJR?t jn"XoS.'[',(oJ.*2ವ|Dt.EXƕG|<ۘ2(*eH lZs .&\-OK\Xw5SL5V:42Bp l\@6Ypy{.:84JtUFh4k%$ۉo"y ֚..fsmN-c,XjpQ .OwӇ'RBi 0.0Y?> 0r ]bi\$;W:lpim`EM6.  dIYp?.  dupr`;/^ry%ܽhKww[S/%)rP\^z{`u][S}|n+6oZ7pŦ\?uٛy9̝^|#.}zupC=eV.7/]Yҹμs-\|\ݫ_uk䣿}ˢ]wtBpK4]V=\_=e_F368JWpWcς9TƗZZR[;Tl1TԤ4~,JPQs\cI|ŴKR?t jif^5Nraw0J+|ɘ+:/qD>UhY"(&\)bRv˦<ȿ9'jU=>,y6[Z\%qCYkf,J6b$ea)|pT|s.7 2Stqe٥UTU# ?E Ep l\@6&\Sv\ЗC2_ a]>i.HI![U 8?fұSۗOl/!oZYu/b*ˉS'qӷ<(kk뾥9)^tiphC?^di;}Ŧh\7}k $V\pCpY!+b*} !$WKُQ˦x+٬_p)ozs"XQ} Kői-no*j0~sfYjpA{qAyW/$G]zzKH[Vr)Jز82sʥYq_;ȗ I(: .Ctl7.u;|~UμqG#AW6:OjDC[nRHrJR?Ǟf}볯{xW|9\'?rÿ-sOᅵo~rstnuI-m?qLe^{6O~ݣ?2^gW~rβJZ/b=.6G*$bxJ˖.tD_\K;{fZr~^8.+2U:g_v=Gw7}!} mGFQ=. 8Q_*Fk_cKm~@ yٶ2%=/_}^;j!&2Q;lgN8W#va ."$̭Yj);ZfE,KR wƯMѴϧ4s+wDyo3Qf7I9UŶbcIVsaG!d\/-l͝η>\__##,U3X㕻6LPzlKܼ{fn3pKjʷKAI<%#;f,Ъ5`ZWYW+םwY2bEQ,,+*TQF{Kz=FHgnʚosV\E`=X2[b',cGEUSαUC3\oօ[WYF).X9Ϝ"+4:6Pu~,-Z6-t|15^Qˬ^mocJJgNݭH!O$-+GIAӥb.sʆlbq)+ID잉.[]Ӷi4}+1ZApyf =,bH򇱢+c:祭1E+[هT-c4WC۲Saq $i~I3fpFAm!O-$K$Wzn19w1`TDۓ RTK9TF4)s{(.4|#Pgȟ@6 .X!KS,(wBX{Je>bthQ5"\iI?z\OAaE{ҳ2C%oe1[ARZY=}K_ootO+ƀ`QelJ-=.jHTeK@.t M|cO_m<:'lZ c:j2(SaRv-i:?dג<wZ~KUcFm*."\%Y5EPSEhPs\\s׻RlGOE"qLm>)X1=:ZO%tis M~XFFG=._o#mL-Ms)gMlɦ#"$D`[3;? |:z;]#7%žʩ'zL5BI5;mN tT@pQNn<Ҭ͍Ul}>J3436Ál-O//ݛK6vj>myػҲYb̫'f1V4ǥ ST %+jvϪ1_J㢅J.#ܹM.wpTf4v0>խQ}汣3`lUQ2b(Jݗh 2NRNS--tru$gH_, qI =C/q ͹Nr[T앑?Fe~:&iƺ*k4+"=~nWfWҡ0ė*Cp l\@6.  .& d1;ߺKwWij*)OM8TzW|_Px[Wrcbsכ-DqM>lwWEO$ Ejʟ˘\{TK^%\0 .EQzKc~5gs!w~vzZRYT*{YL3n)p6T =wqzZbRt,~ʼis])}3]KeKw?S-;NDZƔypY -^ E'R/Dkz\,.(b 9\OO_()T烪.$*k<8c6S%rKsr./wp5e?R&_L\)]ϗV.'/z8 .S9M?9b!*`|.mn[ ^0uh&`Ap lHF?&" . ±w2E&eG?=r d8壇0~ZI.>7,`xq l\@6.  xסnH\@6.  d@IENDB`PKi-oIjIPKsT*attachments/2uibvgc5j8bosqtarsineag56a.png2,͉PNG  IHDRN2IDATxϫ%u? jmzQ1B3[hM-epmd 7mƍj̸D#Zu tVZRA0p! 2SMOc{S;̛~y>{y#3#='#] ?>>}z&7S7o^q[K+EB<dzEB<dzEB<dzEB<dzEB<dzEB<dzEB<dzEB<dzEB<dzEB<dzEB(OqO׍D"۬*Oݤ<.Ƿ_K8M93ۻj+__L+!6kVW(<7Nrʧ&5ӒaoͲ}Uq7~l<<&7gޞ[*"=~!}뭷+{bx<:sNw?O_\s⣯7iUޘ]iU2z/*%?jG6~qI]=ؗqP}k}# KTңMT{)=u3.zO D^ۯ#'2%܍ijc}'Zs%nGĐj&_=3*e/%f@ms?ЬI{ӎ:G޶]ty[/oأ[~Ԧ|PJioH< :m=5Ǐ{< .BVGEٱY}.br;Vs&Ll*a˛73ay7#a\?KY>@4lx>Umko{Hr]PT]$TVrϑUo(,J)\L,EtΨofR =}K{^F ewtTܠ~_j(1p c;G?~Sj3>5 ɺOl ֊dxZ9b0nUa_q=x-V ɉ˂#s~/x\$saNM\mdf%}HONmܖHI"[8 ƫTȗWQ^MxWϟ$sk M8{pې?~~-'JvHoAdzEz B<<<.[qނ'gxod𕕯>~,ZFuY#2 YQKYkPdz&76={ŷ^ߨ:x<;+O^$+qO*=7<z7_WOOކS}dzb;4OqJe_mSz+g'JoAϨ <<.[NyKxR[p̂kz #x\ xWmdkӟS K7Rr| 9Wh@ x|<9U<> x|<9U<> x|<9U<>Nـx(n?דaI7"x省.Os7O>8?MXDXm] ݨި?X?Ͽ{GhOoo~*|nkuǻswH|Uǯ...ߜwgǏ "K<>=/n6x "g>|xuKk'O\؟UG7/ϟ?M=^j<~_=ڟw5޿_V$/.Q-Zo n5xq{xΝ1F0]I;JMݻw+j;.tb?x/U[N۹~hW;<*x "k9 5.smW_%&Pbm!moy5/ct^ŷc-ƽ =n%vPvhmW'n^xMr1um x\drpLIێjPYvoU<ޒ/m]${aRaPrVuEn=Gs& x%Ǘx\WfGMmOQt?2V!c놔Ã[ݰA_"b7ވabe+jnW^ [n̽yBu?0iGE{@m=#ql=.[zx9,iz-*{ =6ȆŷAޚͫrpn՗ľ9%n*{s/Zl{u|ʅqKb`%/TxKo3hnt{Ʒ\hzY$OǽZn{SWSQŢ`D}l1>]VCe:v>t=hILJh_բvhecK#xyyܛ6k㣽vњ3 S!nho/=>rTݮ"?>#fL*鷯x ߻LJۋMM,{jb~x|!pMۭʏզ3k<y 2qO؎|kUw[d"x|!xsxyy|IjnwG{^F(nWx7SUG=Un5={ܤV4kWZ⣫'*]蛵-xPvclG}{2T/>?˓-x|!xsxMw]nOy|1;tf֕#ƌa[<65jW^y~i?z徖j{"+b4wlG?eE<9xg_[:_Kt-U/ٮ>o ^{5`[}-*}@ñSՖ_}݊xsxM?Hq/ç-]q㯿";,ǟ ,xzat2 <^qE+Nyax|G'ڧKzuZz/ڜ4gT'gr={O, ( ,x|Y/uApSfŋ) =5n q<<.r|QفuxvzSdq<<.r |G?X9INsq#z}< " Bx9׾Ҩoh 'x\g-[۟0rK[Pq<<.r l%{l'?S9Bcۇ:x<;x\ADg " Vg7}F9\~ZF9POlRx<;x\AGx<;x\dAXI7x,oVğb<dzE %>}dzEĿV x|q=) }$q<<."Wy:x<;x\D B$>}dzEv) uxvnAٯuxvAK63Lax\glI0 <dzEaٯuxv DSq<<.$Max\gl œ_-q D:x<;x\d&Nax\ga) q6j+o "e2q<<.AWuwe ȩ-gex":x\W_xVkRܹ/oضm%ȩ-w B0T:x\\l3)[OvZ<={v1A)>ǯX._Ɩ+^=|) _4n^Ɏ:{u[A۟[~<|pt/c-$>z^ ;dk5Ύ;_q:x|)&fouoD6zg>oVB\s+ٯK13FfƜFYsx95qjSqkuTI~ẃ:x!Sc 8C<6Y.90"x\o2|vȇͿnnFO0Fwfq0zh"uiŴ(q<a-o._B[_o.c ,4:GF|8) q<p+B<dz_- :x<;9=/ 㞗?|) :x<;]y,j9IK| eN/p+BoM8oOO)q[-"wO݄gAHx?W!EW=~P Ywp+B<dzb+_- :x<;kq$>2x\gg0 P{p+B<dz&q"x\gg5?Pp+B<dzb"x\gg?PDtK,I*? [ *Z>Vq<ӣXMADL~'NY:xrfq?ŋ{g<.u83'q<ӻǿT}:]EN|+A <74[+ V:x\j 8瀪[&]E:x\j "x\q+q<ǥ<.E:x\j "x\qΣG^{'O!+q|ٳgUw5߿?n[w[r_1x\K 8WoxSjY:blTp};wę3*q0KlI)cW R\\D\AB7hG']o[(Sy?XU|V03 etfU'jJuԀÁK:x\j5gϖUݻg Aϟ?]Q*;4:x\j}Ϊ'߿?zQi /fq+qbd]v>B(U~]{*]r۔O2<ǥ>펞Y{{>vm#. V:x\jp |Ǚps[;+%W|I;huԀgϞyx-SGQz,/pr<ǥ֛"7{@IDATxKG[s4@-Uյ\\mr = <2}|'ۏV@7m=8lp[_7hd#c OTh75YwFDf\ȈU_D_,`                         c;H^u{VO HL R0b Պ-c2 re+-h$1A=}ǽwӎ]Ϝ~g.!>vz"",6(^<֓;oPX}mIun%p~k#ViYYJΗޞ9;=geuelsb{Р/ڻNճ]a'S~o(Q"}תPdlgzƩTa5Yߍfr.ǿ8=Z.sViͻ)֦gE2^>yW7ԏFd\<{%n<{V]NYD*Vg V c+.XQ7on ')y~{@vP 9鏓/]=&.ıHv{ eo|u)~H2Ѭ@I:bUG՛A(3oۦ?ښG}_ 3Az9R]늀ANX !J2)y^UL@]Zw>4þ ^Ҭ5KnŠys]=F%t)I\9t2u4dAҼծZc> \e@)>6䢷[-$+?;Gv |gFSf@Idȶf'j0Af̡iUA& 2oY\SLttw,M#WCm11H74[U,!Kfc,o?A*dH>ߨ@c eٝ6 oXj`gkڟbؕ.X ԢNZc$ ,F294bѫH 4+&Rq* >*=c tOm1Hg^f^q3HYUZk$ 194ADc]0,9j# JOY3hxL7 -_$~-A} [ϝU=OB9 VRK=8vJ>ZS+ P3Az ٺc\23ZI|U4 mzt f2H |]DBF.Id_2#el+XCj%շAF&KwDm1, 0!0HX"5Q'8 CťAJE5ٻA㱗_RvND8A0Ytq[CY 9O r)SI#_D2A>wO}?xppe{Τ*/j:>L ñ.vn[mAH!7?XO>;7 _}_}Wy>~;?xyծaf0'ȫZR+d=<%LKc(S4ȭ&0|;do`CXc牠8?j6ֵ{WWkE >EoΊֺb+'NAj/c,tSyk-}:JkHO<_,MpA,G+q7ȬEn%_]ڻjztl]FPmr{m-rX|wgim H?1Sg"yIY-FR^?8<7 k%fu%FrZe 1PoHYHK$"iU uFzX!|ijF,(QHwfÐa f @1Aш$u3>ٿ?3Hυ>j(Da}pC݆k G_Ya>^I9J7)NSH^/4haiv0rKF r+ Rۗ{:kG R/Ĩpi "ԗNѐNgrc"cLqԫ\c|_B+ky9o HTF1H4!vTsyh)>yQHav%(CJTQQrMSZ u 7*?BT#,~B^pU+ \TϤѪ'F"oM 3LWlWIcVAfka}\/sayܖ5!ZM̈&ltF1H402h䵡 R"]羋w! ,Ol0=L) [KAj(5ѫg\Fۏ=j` cAd;fkdv / Wq 'M1mր` ͆i%=F栭1HO =>?ٵe<d%^z u; 5?XR[7GIRVl0wIbGd&مyL֤mdNb}w+;)"saT,9g KqTdM֙@17kPFrb,9i 1/s^䯋a.A̩'u"x@T0-mj!D"UTo_=,9vsu:dfj-3.bc-+'yfLy9.߬$ ЁfҔ#u#q/ D ,g[qR bR" 'ʳڗ)Ib$3HӺ|KGW]aǸ6xQ :|F\بg핳Uy0° ~ض%e"ڒZ w}}+ v.-}Ή?!֘ R s͡m\f }dL>>) Aڣϼ62=eDNS_㟋m5#s(=̢"V5g$LCL)1y3<3i2!: g8 AU`;Vqߋ 40HH40HH40HH40HHSg{)|SUm|NH?xppeMo?6v52nWz#s(Zd . \{8b;X#|NEsh)sA]ԡ=jB:{6׉.=a-wi{*o$4c]"e寯[W[dd40!C]d͋B)(m߻>km3d 76'VeQƲ\Q+sm}EyYVZW"r'n?`E9\R(IX:)P իIJUa>}jn~ڑ:UGJ=U,4L U[ z./-5eM~Rt!,OOn+( 25bGfj^H5i#KZgL)\TRYV/l]2FCYiP Io+* 0<#ܡ6͜o+Ct^6HovQw;4MoҁmPJLg2e 1M}o0>: z6fXhOդ!ZgE4N픐 J 4U/∡x_)a,gpe UeyK5`YA,+LhJ8Ȕ94% ADx,)9裸0SʥYc杚P.pcSF(;ѩ$x䥓GH$h`1kgw6cJr)"4GI5EPӊ\J[+˙zbF'g}O5祫'{>#$@ qug 세N@moۓ"3 - ٧wA}s}Zo}vg|USz b w|rf" ґcڄS:nO[LQpYG}鬒:?}riˎ A0AԳon;2.(`@FGt^"S ׹U}R#C):-.1p!2``1gshbPNqLLdtIYflO D¥%62*%`{ò;?)Ve$a,}shD% e\+ rjKA[Z`oL1.U 2ply$ b 1B&"YTKߞ#inLQG7'*`G[$|B1ȡ{"n/  8>F'E|?2å2bgT)>؋vٺAƟ52  1 һTeH ș7a}Ŗ3oF4c j֎$%jckmCΏ>0`$0H0ȜДHb+zd7~Yا?&Z Dbczb , D҅&o/=쓈s 0$@ 7Ȝ94 yONV~FZO?K{$/&  dRJދ E 1  qߋKҬjqDd*SE=G bA 20Hd1` <b xĀA4 hA 2?xppeN ?~ÿ~o|ώUGo/j/_ߙŇ~kӋrfdc]禞:cݠQC)ZqmR:Vψ?S%([]_~[zN>+Zv^ ׋SS|߭ΫHGwww,~rd3 RڧnۗUN\G }/U0=u[_͌9/OeY"U?{0H0a/ߚchAnd }U RTw |NpYeyjX\N1LrhJd "Ӕߪ`1`Cp} Z΃< {Ӕg<`V ESD0/ oսGwS92Зv.bveg aym-W.|vM|u7bმs&Yu{K^~M껛?}wڻzVguozk\]]Q (eδɎޠb3v)橣${KjtZƮ|)R'vy֌t*4xpzycB@&Ő\v:C;1H[4YQ?"3ڄE+*5--:د~ouݷU[{ߢA~MiTh>~+#rz)  bR"symJ5Qb/|pxpzkU}Bj̲Cő{}YΓJmgڪ3CK~9cbKg V:3|9deXgNsF8JtS<UAwD>Վmozv5--3V5 ^߷([dB^^eD}KՍ+6iywV7 Ҿ`a3s-R&1_ 7/6\>S~w\ƻm{fvzs<ŖE!J6ەȢ: ) RQFJ,Ӎ;-;5ɦ(4Q"T6W ;9,RyZ_m1Hfr R}$M4Z_47\.mR Ҕc [ : s6<ߢЏOo2YFWl|gkY,utBT=㧲]rDv0ۺkƦbͽ-[y .jэr˅6M28"ym(`A:YPgA{l2*&odo1ɽɷt LeL:(>(*q(&eEQ ؖb7tv wR 2[VR??jG"P#Snp#:o cvcg͹mPJrDg)X˹P$`$9hk,*d эZ  O6,hF aA T-Z|__aʜŇ_Y|.QkcPuW 3 +^] ;!P"&o:`lk_Tj&F;ؗ R-#.}RB 3AVͱd{[5Ȁ\d8HO/ֱ  shn\T_ۚʢ4!rxJ:+HE G^,vH{lH\lҚ unYN?15{lo2idNxW1…Y8F0M8V5=#]^ ˸~L1ZISٞ&͹i3Hb!ߕ {|eg֓fgܓRO|s B{(?yZK\~2P/Q͑BC6e8WBL᾿yYήM~|:|:3=AjsA?Ȯ_ZbCh&}w 9\ QQ>5ܓAɘfYζ6㎥u3r}:Q4a;kkAVC!5VE1kK):L*!CGA83R`,Z)ϳ?=4[v ottHu 3YĐ5-VG2ǽލ_xuIAu|ߢ "qLv_./msrduoroKit5ȕY2 ?A Uq_gL ZQ|SI CsŪ%Aѩsh dW +I"CTރbI@O[>/3māAcYc%r R W̧C3o\ag${ :{_JG (G+ki:ڮ_#A2 2y[,2A+zi<+9D[B3bNq}۵KJ?Ԓ8$IY є,.QGMIϸ7+kXV > :>j 2~IHsAGU t\S4+u! uF] @$ OnM9/1Ⱥr6<9zqrM`b a0Y3}Hp%~z#s! zh0ٲʣ組.w;ͪ)T\8FwRW4.zZ~Ίd/̬r=HH&0e) zdbp{K@z.0|gIs|>`5G:5휂g7/eۦe4&b0 3Hsd$/I6g{M{Վ Ǎ ,Ԏs=4Dxc  0A=}ǽw}mE<(սzt9v`ӫA.-9]k⍙:U{t a6;'Nwxꡣ/jJG(SRB|q}͌Ն##2A^6`LbkVvR1.ho7i/6H  l略Q֫=m fkіjXj;:nf}Ɔ%5Z %E-Dds}WI1H炑70 a td9nNʋO,gh  R8vAW Ҳ7년 j{pd,sz1gbon;tĀ20$@3Z#:$`x!v~'oڽ @ X>{b0ȗ8?vmWj 2gw6DEr. 0 S|, >7 SߧE [qY䲏R:g{G'w- ,ݧ1H `F3H;. %?U۟DȰkN,ϭw kK;Sɧ#<(Pe B\VھH>|EFJ2%LzܼX+kq&Q볦L8)zMpasbUe,/2VW7hEu%"}3i?J(?A  ()~-B*sRUypO{ګvNafՑROU #Cbu^KKo|KjMlk찔0]**Sۊ4 CL;럙פ>RAZ_23Su kTA[pѐ"C#֞6 0$@ #ܡ6͜o+Ct^6HovQw;4MoҁmPJLg2e 1n]l ;8a?]`EbivL^X?I8Όnw6vqݹwc3?qڊOAIIN̳l9XXfE6?w'\ kNmwNrzCG'v_wjg-ْη8 5EzZKHXi]0܎R;A@`ĸyv`;g{ryGG%&Ml=a_ 7xߌҩV;11~3H r 9wtrǽם~hB=bE.{K 43I=)> ;N~3H큤bA.9M5\'4H0\PvɌ\G^JliXS§tܞZz5*,ܽމYuyk#Fztd 8>I:1Aa94HrG {dh@*Cb.iP_dy;MQhe=8Kύg7ߵ֩f.p| ׉ 2cMHHt%dtO;]wcq}b[{u r~92Oֳ~ ̎ r CAᕝ r$Z/rV&>a!TŽD:bڽy'̼V 7/6\>S^,p繋wg'^)af,"w@Aʨ@j3\ :k@*PƛGe0AzViV w r93d+$$1N eGAl7d{ƹj8ˮw۬ +ep_?Ĵ }y_?pϿ~?u~}kmQoo2ŇoMxr_8h2tˉ 'dدD7TZ/~2~1M+~-bZ@V-nggO ~˯հU[_vwzz oKF)לTkuK=dJJ$)IKydhMɽ>.M [~^:y&1 S)[z{{9K.ϔ@sEm2dVΪ˟(AZ{+,ka/]=x){M}pZ^zan K0H!~ǝZV$g&5 g YIab;";il _t6(Yj)_f<Hjc}IXcp Nu,X+o$rGžvYuy;9]k⍙_n|{Fb@eÃ\w5Yb[n^Ͻh&BO ҿ0Uuݚ_훩w I% r'n?upi,٨d\{G!-ҏVDmVͶD19 D~ BgK5rYk0H>_rU_b½B!S+4H]ta >x7 uˑ oj,˃>OV(ѯYKzy˽F{ZVeGAZ֨z0hتC7+J:?Q_V(nu.- YnR+_B+?`LNϠZ-vf_l5HZnA/g,JSgK㷖"zzc2s~*z4PPX缺wԮ$ fzն:<%-M͋B Kl+EuR/X ,*afX6mL0fb7 gEr6H;BYry!SIiK JBO +g4N~z (|&zb;FWͺ+RTeNJ'zzdj_ήѺз(p˪NO6_]nob۞]17cVkL^Kq  r9w_)1eV,3 < ˶g)` 9ȢbAkC[ Rh3T[I9Ɲ.k侣 ҝbxHdz rVySp?GA<-AkA䝝QyN5O RX)Nh-h 'fҝ,lG~0m`2VS+kac&M{j]UUgҸ/g1H[YO?ؘzI=?Cfenk(s2ƌOq0drB/p|@hZ}^B s UcRn/u-7T:*-2O7:^(!]&:Ak<`Ź4Ҟm*7OB)w\lX>K6rw,AcY## _yV1!XDzW_ƜkEK2:xUI6ͅyTssjr(dd~DAckRʨIA[#a^zhS^<8}S'^%F5|88>޺~QM!ܢNx[3ds Rua &)=qA\PW1ȝm}tꥬn) \^u)_| 4;kn}JNV˛o mtq+L _KA,Y~}"JZ2EAZlZ&FN`0 3г8 NzA|v6Ș#jza7+b΀e#K(N&Qv29 S=rv+j#A$ Bu= >Ȏ DŽegǠZºc&Z4A:Zv56UQV2^ D4 &XhF&!=d8z1)yl1Ȗ)&M|}qnB` ?>6zC 'A$ HAD9ˉ c2"u0Nscf>{ WImvv2kQOĢwJ%/NWμ\OYlY ` sGP,<YFj{Nb)ҙqLd &kx/ٚθkNVd2ya9/0H4H5G*L ` X!x$ V0 0HG*L ` X!x$ V0 V ;%__sQߝϿ~?/cW~B޻J.zo^[I&Ibg<w헯^u.5;tf˹Ezv B,f'ʪW<{ $&Dyau0yM7ϛ{[ʷ RaY3.G\&b /zg[V@i cuHYJP)ؖH>2㝊}w[*6kn=_mrpk0Ů9ܼX{3ybokno}]qoSukͮPoCf~/0H2-JX2Wb\BQ(9~6ѣ&!h8H5}y;|e$9hk,0Yb>8d +jpP\-^qޖ=1XH-g Jz 4A+ O֖::ok1F𓟿)8AnF?J= g̬J 0 =H^˞P_D\ǘXOvN%p? 4ja X! @=~]wH pq9RZz0yْ;y[[֓6X %+F>'ÊᕋKKT, ݝ)]Q'hlIֹ6ņ0Ar<4m+KK+NS3DyN)NR;Ÿ0*$ 1A^XXvN5n{XGŭd#=Ht˶H`+pYIabr>za.a)JA,vmx7fƜ(cgq2jsL^-0HGe3׬%&ĔK?Zzܤ6ƹN΅ae Vڄ9űB.T40Ԧ&*\0–7ʹ-$ B nta<{ FW<~o r] V"|^Rx?PXy=82.`+?RэὌ}\y0HG*L ` X!x$ V0 0HG*L ` X!x$ V0 7H- n >1ȯu3ubl|cD"bT]<[G$0HH40HH40HH4046Fø=n=6d-*N<+|pl [T _"ZWRX3F7ӻGػڱSL%'έaP2ȼcZky)O=ttbE{7zVݲk^m%Jdkp.TtY_'6i{L0c݃uumg&CLY- iP o WsRŜYl #;'N'\V,r_]Jjd B59 q ;q'" " etJs#q%iB}֞ R sin;GAV^::rjS|<92؈>g3Ȍ94Q (ә) !]AD41HX)94"K H _t3 cBs[?- ]1[|{}7#dAdZCOV, S8vqcLC# "lƈƘ,v|AP0Az  @:7[^ 2fJK+c{aO 3cd{hJPH+]Xctoy2$35u+rbp YA̡QyLY$Gr:z K7ȼ94*2;Y`7i0$A@$A@$A@+ep蝲:v5W~ƮRћ_?wOx~k9^GW}/IAF_YNwl #˹ܟ> \k߿tNVN;)h`ٿ?wiI StmQ:( rz?yv9{'\v$lpxxՖ+[>&> \xC͋?I,ƺ=%wOg+j(Da}p뭗U4Jn*QL?9Xz'lPZzdR&:;xcZwoYBz 'פ@2呞>:Qό*r cWD5(~ɘ?~12rY"zc+NL A/d)>yQHav%(CJTQt#MMS13.x(S32骀jcFXQ.F "a Poi:51j/V */?5?McBf`RJkԸRڒi4EQq*"I6%9mMaqEPVTu3 X4jV>0GZܗS:I$oZ>H 2Ժ@ 5  '^4MNJiJxRV lFʨoi63i: ;fNi0A5q:铕Bl+N Wԧ6}`A[n ٔ` yR(]rYE.b"zekҼiñ1Ȥy"20UF1j9vdH_̳ 4XJWLFq_s D.d&NS;fMzY6tg̵[c& I5=#]^ ˸~F7fdsʍ5ƜʫYsmx4z`uUX"Τ =5i1H˚qcDl+|%a=F .s֩%d9ڌ; 1j2T5lY Hu˯l刱9V:I\N_vq9dXoJ:GzAkb[' {xJ=`Dc*=RnF5WeJcSOE?̑ @cV?XS3vv^_g,m4;i  re8&u'ز4u9ڒb?s{ދ `S'G;+>Mh^GZQyG$A@$A@6H`` i`¹Hbſ{)"Wo7˳Sa{w /Fk 7hdL;(P74r\/&gw60HGo~>s\l|,|ֿekE=t*jV'*ye`-Aq5dP8u(QɐaWJisX[2b~_ 2P>@ 7gת-22W.dE\!X&M|/nl3ܜDpmUiFRKXup_Qkߨ\fnKgu,tXGd2ߟ>N^mNRJN>QO=@z?Xt+ݷn Z./}Bk`(]iBV[TiŸVQj#djN..gh^H5i#+U[g|G)X,D+ _|>R&=h1&8Qnuź ֑d`ܡ6͜o+Bt^BVp;4MoaRR,g2d F|8F*AA+k51MFke')YlLAF.#4@nILF'ΤիA#1@ָS+[LlVaG>ѧj&=gi e UWUE Bd0AhjIjGX7ŠU9vܲZ9Zilk]MA12WF ֑d`#8tk jNMG53l Nke8=Zg#-s 3iwVoQk ůY;.>3G( ֑u4H%@h^h Ci.S YlQ Kp,jͳ vYJW &# 24w] 3E|:\*r<`}AD~g9bu%a~KF;;y&+z'8(#np,SIS+5,7)LdeHԆKFsWU*\ֿ=;gOmP:;,ٞNhEu sCQF+j9@=[= wX7&c:Z2טȢ 9fQ7Ketz*tӷhB:ngpDd  ~-˺Vo B`g9=7 ;\04H0?q(B&4Yr_Z9eYQmUe2(cY~q9jW"Z:8Zj][*Wμ/;3H{c,@c O<$ ,̘ !S#vzN YYT$IWCT .*X,D+ i YSBAi耎W#AfΡ 0Hm⑞+*kjRM\ӒHc6dJb聼d"k;A:n (|aVL #1hV1tϥ;jڑ;M+,[gZedT+oV; [ZgYFn=.q1NT~ *x)I@}1-LCIAfldKHp`Ge{d 2z1.c*1aV ɾbt7zCy7/&e̡)5P<0Hst;'M4`y@{|}噲OF38m> љA9Vl' @^DlOU* ܝVZec(ՎE,ٞNn":gGu}vuR>l/Ϭ294``Y g`ǦJjmQ-ޜ%JvcY9 TWi.WM'/6:.{ՍumOe%;,>޳>u,ikmHe:;&xFJgDr^ R Xd穾 s/A5f5EC WٛT rMMˆ,A@$A@$A@$A@$19|ۿgt}t׷J_b70KმǮTw#}W3d?5_z4XqA^wxpXb4Di?/7qGX/&g~qǒd!^-kL~߾ ;zxbrmNxrZ"bKT)ӑ!HxCMʙjyECZ `혐A>z;Ug"i:é"% ZjR>y8ƝvS)N/Oܿl7 Twúfoi~rRY.Ε-uYMm;讉0NDA޶3ϟx 2 ֐ d=Q=6˴O7k{5RJҕ>c#vWW$ѻ+JMd%UC- jbW۷}>/se6dbvA ސRANRdH=y@IaZ=(IUt9WE%phV>N̫{ j̘㮿Uο(b| "l1z`9NJkӢZ  &חPSfS+P7?V(>ؓRw7Н3KBN>n`9A6 SS킐<w}5 5:l42^oT7Hװ?9C'VnqJtd(ne9ǚ8w=53@MB ޳b# Azf ˸qLhyuXpUeX)ڄldPM4"aHbAqR |13ڌ;V +oK0ș5^9yPOQlL[oȚ\gf, C3kjsɡa=H1!9/Vx' @ )c&@Ih!2ry]`&PTvz?Q_)`w 8`XVV h#" "ʱ \W+6UU WM2L^~u3&LK8 8 8(H 0?$q$q$q䮻;ro,٩cݺnm`epSؓ˟OawJ'>9m(Y$."#Nm,ulg ăwg_AFy`(] Onaw /c絕W3[Y~rק1 ӹl`pť_}u!mdp4pD[f;NXNrya6dMAkSoVnG ͒U:!Ÿ O'GGXTʦ%7%7z\v"d2Wa2U7JҨ;,iskְ=C2L󴘞=#*_)ƦI-+y坔\hVak)j=WpY]m>~iW/asΎzumnJ."k{/ui4ln54.cVökz&C5z&\N8a ;Ma<_Xc-;7I 07)+[݊ gRɻBn}u_!m2+{ozAԅKYZJvujf{ ̤jjAcaN":wn2 .8HQ8k\#OFs㯨d}kx{z$= IS':Yjʆő3^fkAqV\AvP[plq|bnNA6}]Wn w rIaz-)4b۴?kJWd,vr,[gKQ9Jå,L+AC PUcV_4=>MzIA.pD:"r bW r!n|'I4B6_2    N?    ӟԿ\>^;ti$@$q$q$qzWS\,7X     @)H(H(HtP/6CWxfdґ,?^EAGAGA÷znioQ:~6K?F0 ?    Ng> Vris0d:~$   3cA~LOAqSIENDB`PKZ ~{y{PKsT*attachments/5kualn38lpftd032usv51bgtkg.pngD'PNG  IHDR֋7DIDATx1o4u`숙RPlP#&WT|%,'KW`@T %+j \%k@|Up;u1kU==}f=h|7gzLm\yxx4FelUqr]lݮy@.+p06DaCa74FelU~s\va< Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,Ϊxf cXިk}{% zw}l+ ]KhE@,ZY kd WNثV+ё΍z3YۉwS ryPY<S7s=ݏΰbgZU4y|Ҡ& C0Hv6=ߕ}lJhEЊ h(^[%kgUުtVvkN;?Sf///u.V#{HA"}oct-VckF7_JH?1O^\\u޽{:#\u\XWTCvvMZY kd Sv&ӑ᝴&eK 3vV$;> "+{B*j: !lK=ժ/.VOxfi͸өhZZ'#ЊZPKVY??Ol'%;lٻw2 #n ^# zx1z~~׿.>r=ЊY":C+VwcEVwJVtss9EjE (ᓑS-궋 0iakz#:E=\ VDVghEC.Y3TъU\8tI\A|V7c>@٨/(FiIYau&~FiEW|cЊZPK֡bǭ 08Uy=4lTiUg...FggvVEt(+z.~b3!Gn|"U~qu^Qox1)"chEduV4W*>'N)'dAt"o󈒠3苞7t%$a=pZ.ReԱm)9F!ڸٜV1󥌡C+"3xmua+ZL9dN+ ҕqRјdZ'٤9UF37شeӛJ+ ' ʯBqUwv|F#VDVghEC.YV4lVxed-[C9?"OGtj:}яbx,YioVY>tLH~^\I!F@C8T6YiZY kd [Qv#;Fs˝,g. }ZTo:~PUc9hW߰>+/쳽_OӳgJ^~:3wqЊՙVyn<97,c^Q|绻;Zm'ls@GG4%?g%ёO>9z{{}ݝkW}gE=?{n\dٙhE{j0҆HW~P1^/ )B)&}țffr]lf܏lf.Q+"kYƊ6k 4(#J+QPqAז!Ǽ4:40Zj+Ȼwc?:Z?Њ]jE&YW)ԗy?jB L"Y륺Łk0hN^4:+IIô׊3YZ:PXQЊY":C+VwcEqH>lFһo^3#{Yڌ˦1!ut#A.E$xހ gH ygΤNyХP{}>ZY kd"i!x{rJyEor֊>#}KxeydF"|Q*wṞJ}{Rjd׶i s&\ӊZPKV_U;<3pRSvoQ;' GzC&Ӽ^$}d7O j}6Y ci( hEduV4岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm,XmF0h΍"˘٪b岻̻]///\Viaxm,XYb+ew8VrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm,X^*ҙeUtttfrapef岻+b, Q"rye.06DaЊZe岻"(XA+"kY,}W"ЊX. f^( ZYb㼲\vVJ m߯ #OOOONN޿{{||/"oJʯ;mFɻ-B>7ycЊZ%ewhEP0VE~f!{yzw>?:ߌF'H^(j2o#$y|@w>AcЊZ%ewhEP̊.//YjE *@ęWZQ[euZ_~Utf-HeADA+"kY,;?,EA2+J+W:>g@ TSd?CqsaV6zRv]]] 7ӊDW ]~#o ppDA+"kY,;?,EAdEOOOQ/M]zpoPV$oFO$} XIVwtoX|jǠ,םK"ЊXHqfd뼹9F~H'ݮG=6pT@Gm)rZQгB@:Y~tR!-#VlԟTa~yʬ(ӠҊ/$^*kKlQ?+;<&^w~.Y.@+b?yZ9~E^%] {YYXvv&~ayy}'} Y](ODž^~=<~biӲje iԁmx[ZNK>_\Ul: yd.ЊXh Zu ?Y5]xbIQMlz:eqm6q+tsZBp [QH*}V'u=[+P+tZB~WЉDUY(-_a e:<<;?,7EZk"N{=h`D_sIbEvݲ8K)s)}?i+լla~Wy!]F;~J"٩nN_+볢N1[A2͊\xӊ:jTZj>6ƊaLش?;bOo;?,7EZ+v.ϊ3B_cvnWxU!jeO^6=-ic}CfVo<"&/׿WD܊Þ׊ĿOh>}O%4KkĿf=MwVĊ!=Uvkt|\zKʕ۝3bEa+. cAfEQVtkDA+VV8=m%z{|ɓ?2Sa|Zd=^{~ъܳtYhE@Xӊ;xu:=:ҹ]:s塬HO:2GwZQ_w5YvR=s+A+ϬB@׊ij3;jd+*k؊4m)KPZ3|u妻B+bia}֑+ BʦEo$ţv;72zk^Q(>@(YlY:Ѯ;~,%F$"c893&yM+.VHO"lON*+vœ&%|c3=g.ЊXZ\Urqvj KIGbgv{,ݮ|1MM 23QK:(`Sar ~ȩ3l z ViAK"8D^K>+Hdzdvx+ҕ/(#De |Ӳ7OםK" !=Xzz"#TkB瀇nV\Vg%#Y}ByZ& ǿU]wJg z VQ3(* o,̊Z/tZ'2NoБRo{eW+.#/MfE٧z=0}]yXn," (AO͚wy( VfqݿV^ymU~R>+JW^Nꤗ*;qVTk^ۺ"ЊX. oZ^E־3Pt(Њ2Ҋ2Gf%YQv;CV7z,*1=7m^ӊ_/ u|(+6>.8,EA\F'$chz(HGoQFWy_%f ǥ t"=g{zC~z}OLfE٬>+Y;㲏r]Zeaxm,hˊBi|=J&5: svLS+7RGU&;ޔt&ej5xuqծ֥٪ϘH㲏r]Zeaxm,hΊt@Ohx`jǘ; K=5 Y/kcqtGVwXWQ)ǢtZw:,^6[Iy㼲\vVrY^ 06=c+ewhEshEA,Z5,e岻X P+m(o_:?f&Ye*`Q,Z="ZQE(kL,݊_AŢC+҅VTʢqr vbъB+eъpr9xEhEЊtUYl.?u< KV%hEЊhEA,oVs*Uh,Z="ZQE(Vd b7ˢhEЊhEA,Z5,VĢC+UhE z,ZbYOOOju}}=msBVrhE PVoE+Z&K|,>>͍d.՗ԊV.w~VD+ eъAlfYyXOOOW+~#btzz-G$f5"@R+ "]@g;@+UhE z,ZQYR"ңG!8[Ov "ZQU(Vd b7ˢê{9zzo#"y ]VTʢYͲhEV$ GnnntIzad#;@+UkEImci:F謜C8VtwwWJߜl'<>Rҕޒ-}DKHX?Fla2gcZZJ>/OdͶ.S9 cEd-ű㱲[ozݠ(.dg΃'mm-YlHZW}<^l,q"#h z,ZX#:ҊT...fN+҈E},ovЊaъ@Y"k[Yh ,ROOON+sǰd7AKrhE PVoE+Z2+S%]m>^q!MT((QZ;@+UhE z,Zk΍r "ZQU(Vd b7ˢhEЊhEA,Z5,VĢC+rlE}WӹtYȢYͲhE@,Z="Va[uѬ0x2i .0vVd b7ˢhEЊkEOOOl>k z鯾+J [Q%Ny WTmUhE z,ZVdhV^;tdzҘԐHL_"6\]+:V4VoE+bъ-Њ:/®v"\I|x￑rҊhE z,ZVdK+~kEzO'yBYTnnn@Q'XGhE z,ZVdK+/y硧-֊{ʗKʋъͲhE@,Z=H<忺؊DtV}{ਾl Vd b7ˢhE"Y?=t< Ίtg}l$$ѝK%ȿggg;mӟuhE"k[Yh |f3Aw?Ur?ԏ>͛o woHo d#,+䇑LӛyE1}Ֆ:gjӊhE z Voe[\pYڒN6²"u&γN5(jζ>;;KC]9!+禥Wq'p^h(,VĢ؊)DYz>Cfym_+#q6&]VoE+bъjE,܊?t">23[+z~~֓4~9Oك;/PfЊZVdK+ZLBv|\\\o(++ѵ]]]E_C]/$5*ylWZP[YE+V@+ҹDetNLrq\ZO˿uF>>uV4VoE+bъ-ЊAD+ 6ƉGRѪ<z{%4"LzmR9Z2  cghE z,ZVdhVԗz&7,nm#ī/fуq}ఫۄ:RhE_VDЊX"{hEVEj*,Z5,VĢC+rfEX PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+e׊x/t} V#mYHVsd͹Qu_̻]=hǛ'\kQ1308VDֲX+bqȞ/8Vız PYͲhE@,Z="ZQE(Vd b7ˢhEЊhEA,Z5,VĢC+UhE z,ZVdVTʢYͲhE@,Z="ZQE(Vd b7ˢhEЊhEA,Z5,VĢC+UhE z,ZVdVTʢYͲhE@,Z="ZQE(Vd b7ˢhEЊhEA,Z5,VĢC+UhE z,ZVdVTʢYͲhE@,Z="ZQE(Vd b7ˢhEЊhEA,Z5,VĢC+UhE z,ZVdVTʢYͲhE@,Z="ZQE(Vd b7ˢhEЊhEA,Z5,VĢC+UhE z,ZVdVTʢYͲhE@,Z="ZQE(Vd b7ˢhEЊhEA,Z5,VĢC+UhE z,ZVdVTʢYͲhE@,Z="ZQE(Vd b7ˢhEЊhEA,Z5,VĢC+UhE z,ZVdVTʢYͲhE@,Z="ZQE(Vd b7ˢhEЊhEA,Z5,VĢC+UhE z,ZVdVTʢYͲhE@,Z="ZQE(Vynt|xx8̑6c$9T\~sܨٺͼ2h_}?|"ea,S9 cEd-ű" ֜rH pcEUA,A՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Yǵ̒t%a ?%~_7m%,3r&NJZ7+aqq"#h z,ZVdVTʢYͲhE@i_thE PVoE+bޮVi;@+UhE z,Z̬׬둯~iC5:3-G;@+UhE z,Zl竫Uku'dU|'Q+oT1{hEhEA,Z5,V4KrD\Yj!gggïU+QYTY Mi3J33C+E+eъAlfYX:V p YâUhE z,ZQExNy1VW:;lJ!ЙO;[B+E+eъAlfYYWWW.OiEXT'u, ]V;RhEhEA,Z5,V4?+p^(^/ ,ζ7 @ZQu(Vd b7ˢ kH5(PGhaLɷZ<,ZQu(Vd b7ˢe\uxfiRt+bPBdLhEhEA,Z5,VTәEMwǏ V V؞xb޽{´FЊaъ@Y"k[Y:Ko$QIcKwcEz&Z6Rh.:E+՛eъT>ƌgeVCD+*y~~cE) 0Ö h:E+՛eъfc]\\HKwFcEfje}o@+E+eъAlfYyXb?zwЁTSXӾ\Olw_7Yr@ Kq}UkE?\6GHg><<UHE1UEg d.\,bH}_ŧ8jf]dɅ"2C'….g}_8VT4k[Yъg\p?~y,/ PVouyEw3:.`g}+ڽ]Rc_@6:E+՛ehڏx&(8F+ eъAlfY=3/Y0"tPp "ZQU(Vd b7:Ƶd#Z((8Z*E+՛e>hwi\~shEЊhEA,Z5,wbъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE PVoE+bъъ*@Y"k[YE+VD+eъAlfY" Z"E+՛eъX"{hE Pqh6!->p V#mYHVsd͹Quye+DX`c-5r&NJZcE@97@XNJ@YnBhE@,ᵱ VDֲX" D7!" XA+"kY,Z Zeaxm, ,M06DaЊZVĂ&VrY^ 0hEd-E+bAqB+b, Q"Ţ \Ƃ( Vg?%|L KV% \Ƃ( Vą˴]ᵱ Vf9xv.n;@+2eaxm, qY݁˾/ЊqY^ 0f_G|fYe*݁˾/ЊqY^ 0f4ʸ㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm, ,>+ewhEP,ᵱ VDֲX.8,EA\Ƃ( ZYb㼲\vVrY^ 0hEd-岏r]Zeaxm,XmF0h΍"˘٪b岻̻]///\Viaxm,ESXIENDB`PK4DDPKsT*attachments/5qnmplm7q9et4cvppd812em84j.png6ɉPNG  IHDR=о6IDATxKrJ@5L 4qDO(ѽ7ފwb{:4 <}`u}>zzsۻۯ o>Eu-z3o/>?]|l>|}JJ<h[Q0yY.I`:"# `J_0VoeWd̅[0 .[cWd{+2T`v[x zo@OtϯNT>2i+n?ss8ZWTf8tǎ*hE0ފ< hF{Eyur"&;V} 7:7tat02Y7SMѰ2j@٨^2[l_6Q- R[&;R:SCJ-R&.~K9@fZ7>ݘu";˹mp[zL[bLkřkx-͎Vqab+]iw ׬au.wxk\R3-M4JVbm(;&[ʮʕlE9lnyU[sYى2ڨ6Mv/-![Uiũg)7FL=qф6l؊.oLn[M- h[ EPi#\a-eͭe]}o='VMfV?oY-yܨrI2c+V'89YI>Lf2-e҇]c!0z9Gȷ-LrKK}*'SX&.B=o%GU'ZkXM{f fm/nVLx'z[f:J[4Ii[Su)wY>Ɂ8K:2!eUvtg$ʞTv[]{39t=[x zo@O- ='qϢ:[iTzs&oӋOݴPLNQHh7*gtn{*90O-P-yErpb=í~ފoh[yOX1%g^L?c({%S'yGpGm[/ѭV9M*xKu ki36po)ztHˆuw/ޟ542~(%[S_Us(`JV>Lkg9N(IV4D]3GK1|~?r~©$-jɧC*x fu̏WLG:Su 3Fۂ/ߌ$|͉8PdO!i)jIeI5t zo@O- ='& o-5Wt Zx @ ޺<\v[AP*֠OI.Hex [jt*0H[Qp~&r/'/5Rho@Va*NG&u Uqg(#OL s2ob>څ!VJ uNn(}3K9%x0 /L{tHSё]݈[ҿdYizw'pQo*h-Giw5ͷκwf. IY뛊ocr8tI^V@C V'OYw2}4o,ykwc[)'Ԭ%.U* ;͜]!)/|u@voSH`[σ1\J]KØ8Dױ{xD"8 9_fo:}l]~d塾_–ޚ 2 ޚaCXn . ޚaQ(;.[x zo@O[8`f~VeGlGweCV7Z٦ՌEh%oe5)<i-}&,Ն^&'*aT2"CFqO+ozVУY˽J۰L4=w̔"ϕc)X1x ҇{:qEL1-JXQ' h*qr 5kT [[rykfC7QTMz fXӫIi~|pVL zoƥ0yq*Wt5W\IB8Ax >8xqL)#⠼<ޒ-+HXmngCԶ%j >6%>w 2'm垁<(M*&LZ.M;:[mc1*$"{˴'^LrT^fhRbJ *1-+o&q^-aPm'aܨs^[+}jCe%/ M6Q\W?S)1w1]wffoɹ`r-P6S/uLtP/m*Oȓ#RMx0]ʑdJ 4VТQGMzoQ&KJ7C-9p |I dv'Yyrs#~M] VjC1(r&]QvOȤ* [x zo@O- ='V-X=x zo@O-z篫o@sV=v[/~_S [x zo@O[ŧbo |qϏOhhŠuX[x zb]Iȭu u< Y`- ='[x zo@O- ='[x zo@O- ='[x zo@O- =1A51'hBS&]B| cQUЄDX+[ε*:,nH.Ɓ>)bmE%8xKP% ATfP-n- ^ٹw} cu r.Xzӵ[AtΥMhcqB$5\L(5/%c։dȇU|r[2[KX0V ,oG` 5> ]=<}z1*<?B'綌}8O %!XJV.Kjx V)*\.zjPQbNy#u.Qz+0YUP PEkJ)yo:HRcN ,lP Q>%ukWӫА[ ǣ6NWj[Cc̷WmăŜ[[ǣCu}rh"oԨϷɷ4b"X\K">HYME72r8 d٦xaJњjɷL%ɷ`QLvg^Oh>zhoHJ)[B\7W6Mī] gxJdg*UoFf''UŴ ͙*yݍdI #)GΡ*^nr' `'[x zbro_| W//' Si+ R歆zK\Uxg>xKKs5PJ-zZ\^Sҽ$+_W26LSS޷bt0n>m*I0f{~[ROb{)Q]P|K!GZ<E7rpwCއm[wEa;&ԳVoȜ;e?|V1 $' -GBkE(SY >&+֐6?ZlVoJ(gr[A@oº5$J譚AXJ9O@#7<7.i+򩣜i4%OY )y+Ԟ>ď+*zd`NdcVɭ&oX^[r1M{qXZ[_} @Coe^^CJkX&+|m𘕜 J:M9R؄Kỽn"fӜԃ!pYֿt>QCuVo̓[B5re]VqQ^ |VR"yKy4ykv?U}ClDM-Skf󖐴%Yu9&Y؎@Y8Ax .j`N-9c@-(]3[[18$ڔnt:U.n}WN/ߒg: z.oeO)#[tЫdIk.wAV_19 3[=tay1qs [\m1Y-Mo9½0] fs(VY[-u[l'U@\bnsOW\O5VMyy}30,p5Z9\1^Ɣqnypx rǒa\ ^ݔ:4Snn+4VrVLj*F2 S`%&UT!GywǬj[r͡.od!X1x zo@O- ='j ?Xu?:Atէ[daKA[e"o5 ++nƣ |[1o5!%7|n]?K|,I>/0hH(&/4}~u+ 0q0^_l> o ( 1 ToⴌǮL놋o V鑉F!#Y&pb`E98Ÿas`e;͜R`Ɣk3\-aux'$ >xµU=|2@tS_0 C^QE9B5ql@n*f1!9+ BuU{+o3>٦ o.ԡ~YqOįBGU;)lŵ)'ٴQ|c7_Ѿzo3}Q*~J?&xUno u=aYv\ImEUM#7Er M?!ar_&oZުg|k'IocV4=[l=>ch%!O3lxU-+5m[ڭ"IK< ֹh(G`DՠWl r帣~ۉ*zK?!Joii--YM>V Cvyo~_CIZ ߮yR# %\"LЖc>\[vϩ̬#0,0í4u\xN)o2>ƃ[@_ :q3DZ*JQ'ʞw;&IG+;j 1. j*FpRo5-bhV߮spϛu{3o5d85Ւ`- ='Īo5G#I@`>_6c&s6%{Cš'' rVW|Ffo OPuvf_nW̙,ǔiW_ |+WC+Iܽ~#˳^ont;<7tѽշUޔqޫU%$[)')ԕZVoi>nN{|KY@ӊ\ڋ%šB0VpF>: r$O:YXvQx *UȷJ!<՗@_9@W#[_4go W{Kʅf5~幦rH_Y킲(-őSV׭M+(YYviAU.| zjLuɐ `O2WP&gw8gf UK|2` [$ .s2I2X6S<tʽ+o@O- ='[x zo@O- ='[x zo@O- ='[x zo@OL--_l*?Qe`ǢjUd,–Sb}1 ;CK|->W̧ˠ->[w kɒ+ո5E,3DB6w[LtPN-zL5,N'*{K'o U4 [Z4-M%U\X>.Oq,xX:=Ò9e!s[!1:+󭜫J$,.ڧM4z-DxK>Yo }%:2RmG 2r8l)9)+QJӱx-XsUtna Nu8 )a7kyAH_p&H>/.xFLG?'y+uXAg$zL|)fdqBoɧ)P>XD(-E-],: ex  zo@O- ='8`9oR֪j~6sW?[ 9cj PRӐdSү; )c)X(_S.G-c+ořzHY^ zF _n닾̻]|W·M-y6}+x=봸6k[j՟wMc篫ה0j:^.͊-FƠ2KHh-}σ,ɱ6i@yDCt[W>9։du[}|9:R4a-zK޸NY@=c}:9=h?oi.a[qb½^|KF/h[\Cڔ:BxDh߷aKs4)@KAaMA,[M!9չ O&gN-fld}ު8ϙ| rdTUdMͽkM6h.fZ0 eu uq=a$[%^wV-Ԑk´ ޒy+sy*.oLze'}rkL#o kɯ5*Պ~jbx]97Ҙݴ~+- į-ya!}yG|.I 3?T[rOWov/6$[#ZS8*jMZ拤!82L9\T@53,H\<ޒY3MNȁ؝⊎}}(}J)?^J) a8ǒYk?i[˾VÜFʒ͏([T!-r4ୈ]dRW-x zo@O- =*oHՃKuO%5wr\D?2uoQMCLN]ց):bfw4a'e.5ݲ[wsw-_7b_XoWQ&b3')xkmH}˥o6!&=-G1S}jԬvhx ୅FW:Ncntl`6?h('J4nVhƾ]&:FyR1PPelwMCō,aa>p|v@=k6 #Ga:_ec8l@ު=|<<}qnre1c8sN]۲4{#1e U ȏ7o߷cU5qPqi%r_.wC@8x[ۯc]Mr _kk 8r2-[ul~Lei)(S2i#UG$ڔKʫ0T+z+.[u &7V_=BM_[u$ yXFE߉7ȷ` ު#vfįsvQZʑ;Y|| [uz<\^8.s_aAy EoS%&V%- zq@UnɃ~bʭHo5L+OSiBh r- ='[x zo-"4VlJs?󭨹w֟bȕj*q̛iqEMwċ >!qVy׭ՆQ{un &Z-rT60ʙoDYxk|.GS~ۣtH(^8bL5fwy+-8IS_qq+'!4>(G9-LR:5mɻArEߨs|k,鶻chH~ gd +6^XX3|}%N&`mɬ֗J.E: /^Ǯozsxkј>XΠ{?qU.GI +ߪV\XՊ%6gCPU|3p#hL(6F 4罹:'e4n['߲Br?){%π<:W%LrlXo#ZxLJl 4z!Oxy&/mGQT) uގI5em-7Aq[rB&xtcN.*yrq_HSk &o &Sb@ѵ)nSr>nzo%% ުf9'ܿd*/6QQ]ܽbIe0*n/wLi2\tKN^lV4kWz>!EoôM|V# V҄T.^æoE.j.̔FJCC^+o嶲ioɯc7{o1MBJ*Dy:ub[09!ŨmW,)ٚmdrCX\ V%q[VOfoxo!eK/(OTкbrq`*b>K5$g~>oY7oUtyreNys2^P̺8bM]-NPSaq5ZAVf&=~%_ӿ>Pqa o7:[-]Rx Fx[P>&h5 Z6 do9F]3E-_YXu(+L"7ŏo8Zrϕi#k୅ ?sʈ?TZ(/^oTҚa*+T`+ְ'J:߈'[x zbUՃƤW段\[{9<~>ִ~Y@oPIp V`Ɏ{^Vӫܖri.U4_\RvLmX8ņXGEc)ۧҰ4W4’Yor__o~Zo-GU7D*&1ȺF@6to\?WaQ[wד>m_՟x߁6X篫W_`}VO.;ɾ9"Eș \l.,U+֏bn Z?*p3קup!O}+7΅ÿ`LF,8ݛįdUm5,GK<>0IVd3<^޸ַ)YpdEnanr a?Z\ڍu;>A.)kАf2s5+%4~OiŲFo,א6Gcoүw~˯6ޒ"'z@uUց;Və 7u&Uzk.[§=W>0V-]t|Z1$$5R T X3urH嶰2U]0|a[Gy-{Jdy Q68a8c). osRSg4XOn^#-r-ͽ*{K3bt]uqlz$+;f{);#tOXly>(9KK#/I+5ń~S~Ly܄~ |蘰3/^Z coo./PW=M`nHFb@L`*i^b>!ټ܂0}zKb̟FXxkLgXūqbe)"meJkh|j9ܽzk!):cw+p{>t"n_@-]Ś]\ךv8lHX^ꬓ싆ɍƶ(֯PyPUp.i we~fQ*ne4c܂ͻ@O#,˜L2ݟj[)&<[x zo@O- .[x zo@O-ŃG [u}~=yk1Urxծ',7yOٷvxpx< %L 9{0Wd@e\Oc. PoqEhY"\[O. K{+2…` q[x zo@O- ='B 䥨IENDB`PKX!66PKsT*attachments/6cc3b86jbnauqlr56r9iaiggfc.png?`PNG  IHDRsD_`IDATxq-Iyy%VxR"?2mAfHnl boB b3ٝ$s,±1<0c;M^<Ɔ5as N v/bbWr*Ȏt;绷^:}SOwU߯K؝/}Kc7O=؇{[0K(!}F[47oP+FX oe SߐA#|C ab7hoA#,PL}C 2ho_ߠV@1 47ʠ(!}F[47oP+FX oe SߐA#|C ab7hoA#,PL}C 2ho_ߠV@1 47ʠ(!}F[47իWo… w}wMqxE#/^t͛7r#9coH_r]p5QjISpu-tA64ߌ^ 47\%H(beS8yd,{%9"%H6.IxNCwBPoUFt-Q )'mI$R6fFab궕+n%pt\d%?j+G~ڂ m+lYAA6aI,LaS"0V%6E#R*T4ˉ*Y4fD8jA4"1TIfM\+FXn%jr56(_O֬-l4n5H?cu%'6N!roȟnM#e=ܳLɾ +׈.)G'K=KOz8r-ϕA#,PL\0ppcU˕11r% k)V#@q5&ƪF&[ &5Ah Vrk4+Qm!!)x׏:eu6֢Fq]?4мܩfp} abZB o%X&ɽc@QX-5kSQ^kTh *8v%D! DFڰð5Ģw#yoԈФOXяp*!vzHG2GNϕA#,PL+U#(hDЖ!u3GkVJG-,FfY#ea@@cLN`ɺ{'Fя8SO|!u$˒ިU#oQh)?%(تiFt!m"r$,XE6F YGD060AE#:*׮Q:07<(z!b-KK~Z2'ׂƑ S%?6u}3_>W@1@Y#幵6kkQաD eB^冄$%^|y8tWXUw AXd#R]wkrt>TN%g/#zdqQ~4gQp/Op} abZFlmiԈ0 1{ZvO.vg=y,(*j[66hWN| yN5URT->=v"[YF|@)F^z*\+FXV`Otk`HW{4vf,l4"zuG+ $&>X#mm$hi9|lUJn9i6ͮ|\#y?E|?p} abZ=iD>Q|ǼF@1hD(7?oL֩H:&½{rTF6NMwmiƃɚّC C8OϕA#,PL+P0PD]˭s ӻmsE#:kr(Q#BUjԈ|$ѺKF.jQ4CT2")%A #7F:4jZ6\+FXV`k{FG8i|_mLhԈWkL~whDRQ~n6 Yzvj-ϭ1OB ehFp?>W@1VLSֈE?<-aRwXɧ &hn{B$^bBF哝wш/@ä\+FXV`F$^A4Bg]\WE| ƀmo<4jDalDo9ۢ! `‹dP:Z,pn.'9h,>W@1@A=1 zj$AdOޟ#Ȱ+,o|ߝmh!E%([GD6M#:BF#HVU2=W\$?Я2hih\û '9>hD rrrU J_r 4b׍'TWcoHֈ)L3ЩcOGt:/*%^No i2hi?)|^S5"L8x7vd_!nIr !ZЧeQ#w=:6875BI~~MXF-X˾\#tm`ĺpIzLJs,\+FXNxW_q# HϏ;?SJ>n'ӛ7oߎlD~7vݻD&=lvGAO>W@1MHX,\Jhё|K!H˧eeG.]-˿ƃHHz˗e͓OOnhdWF/\y Y(Hj/9Hۦ򴝭_ʠ(r$ބ;c !RvDðDtk$tű'4پ8em؆LFҨYeu5r.^(3.hCrf4/F%&قyH$ h =?ƕCse S߼/Pgw$F,v"or!Xʾ$ʲ84)_)ѱ&;leN4!<׈FIBi|`bWOr4{7{aM[|=6 =Gkt/Fߵl8EfF Cse Sh V%L)߻n!z,5e$,i z,+!v3DA Hv C66D BZB;N+JW؝y/3ET> Mz`l\+FX:F۴B}v'׃#E++h+Bh (CblՈHv\̶ TCAzlA_tԈ]=xd,uA7se ShC6 5B;x`8B5)zMHhb+Ű[=Lx`AȻ$'"!9;G#BPϫnaᴳse SU뻖Q3~a_[ a/.Rw50h]#'$9"@akKOpFp΀TxBh ]Qڎ5(fFG޽AcaFXzEc޻<ONN$%D "9tkv8#FSBJ>hL-kDîBbdG678^+ظi[84>W@1^?O-G&A}(pi!X6 :m7J߇uш.a[s0@EQ#tjIrg/?fJ~Y#v.-CYPALF]tmZlsp} ab.&ohDcT$pqY'ä@Y!jکu㶊p>ثCXbPhBE=;5rbab)\2hKGC!k56vkBEV8h ?ICɰ_#ϲurYr ܟFl j0Fmʠ(.і !üiF\\N[Qn;$ŇP_#NGL)zhD'4"&]kjMϕA#,PL=B^W{Pr1;:rÚkֱF1“G7B:4{~rϟԈѕ4Y[RH4"o%>86",FZ]n~\\+FXCQk.5"yFu_S#_62*>m2ysX|`?~VSV !+qGiħ+L&iԈ- q]Ia>4/{ m\S݅i>W@1GXn5g3h]4B7QM#q2M51SC@ۇBkD0yi6p+oֈp 9ڢ:d'-gmvՈsPэw96Xr}ab }2"D$[S <ڮ FhKCHr2_em`ak$pu;l}-GDVt;Cii;rɈ@x3rp} ab { M74'0OCEY%|}.Q}csr[z֍]5B5糤s&z=se SO8By1$5b1 m71fҜcFȚѸY^GJk !5B3 x}dSB$LX&=YዉF$ N4%t56$$&ft;ً5bdGƏ[+]3y&q[fJPO-|խ-`[W\x aNJ#vx#4B#Qmzڕ0R6B5$dJX~';sRGT]Fwta~ gOh(PVRkp<%q$@#,mZA5Bz[;ҟ<h`(*[H<0H;/؍5o}|#s9]OP,Y4Dj׺g\Du Nב.ٵ_4&h475mD2ڏ?:^'u6' v7n]94{5g6QFY9ȝ\#Bai)FM2%$ bBy,t*hkY$ohA#,f|C(]#^R/31]ޚ7iOak[WQҩt]w5A#, ft^6gٯF(ueX|#yѮ!` :TEG`A#,aFj>/z݁mil :yQJ!cki@#|F9><ϬujtDqo}6<ʠb*eqjw'xC:X).;6R,?-He7hDm$ONN ˅1NLfm}kүm:']wÌJ # z!Z4T҈7$ ,6G-m}dp@#|F٪F\|9QddMB8ϕ~%#^X4B[Z!%x=Z0tuOFhF@Ra3hoЈ2[5B_OꚿVO$ ꣭뱓JXl-[V4B!h?jyVNF˿R? ݊h47hD.c#4؇X8}44%:h]NƗOFhZ|^0*XK.CA#4\${B_Ylϊ5~ThK6}mi#<2ـ0/n[e4B7O-ԸkXA#|F ųq@$iȔ/A"+l-Q@#,$aEcbeqyص AQjrߠe;AS%捭zA+O^+WQ,4B Y#}+5"!~*F]ɖ%Pu747hD4B'T={%˝B^{`OWqDV)a1`Pt<׶|泋F<'?Ƨtl^#A#$7m^Z ./9Gٴ]Ey䑝h'hq Qe{`gۨɀK2E1hoЈz8 l{V LWh\DR&S1̨}k5GAv׈xI4 F4T@+v舁4hu0e(S^6FL4y#aeЦm%ˍ#uź9 Q@` 4vdp˘BψޛLz_E]/{ЈŒ wZ#lRiCgJ鶹@#|F)kU7ooMUٸxR_4V08h0C Ÿ|BI]nӈ<Ţeˀ>37sPaVFijXWΉ'ߠVXLuᅟjqD0F$P}qFcae7hoA#,4Sm'x6jN: L?ICgo\V  2h&BCgoܸ?T|Y7ڵi|$ \|F[4B^L)B*!19;ot^E0D2բiYK4be;hoA#,43<ԤNtt$DTBLA!e7hoA#,/ܔWeS<f>'f, !ߠV@1 55].O" >VA@ 뛉h+oN}vXF3!}FIh@#,f|CpЈ)FX &o'w1c|S }FIh@#,.@pЈ)0 )me7 hV|_pЈ)F3=+ӏ7ߗ!@#$4b LhDF,hFLiJ= &S0z1E#'4`A#$4b F/hDF,hFL4ЈpЈ)FXqn1 S4B#4MB#aabFOhFIh@#,^Lш 8X7 hы)? &S0z1E#'4`A#$4b F/hDF,hFL4ЈpЈ)FXqn1 S4B#4MB#aabFOhFIh@#,^Lш 8X7 hы)? &S0z1E#'4`A#$4b F/hDF,hFL4ЈpЈ)FXqn1 S4B#4MB#aabFOhFIh@#,^Lш 8X7 hы)? &S0z1E#'4`A#$4b F/hDF,/z<;Ò׼?}=ٷ|lo ƪh@#,^Lш 8XkggHKk^b EKw=?Y. ۶V!S0z1E#'4`q{J\m* ":_=n܂8Anb!g~-х$YX9S0z1E#'4`bb_- Kd7?I֔u[pn gDQ3S0z1E#'4`ڐuo^mPKdo 4+ >Mhы)?KЦ " !ixaH^گ!.1@K4b F/hDF,.5B" mq[#4d!@# hDF,~q/i+M[Bh|<3qt\W1 j1CrjT#{Mh"ϯ.&rEUw]sވ|D9]!M4b\#hDž4BA.=!kh\hu|y/ڤmS~K<2WnS_B#|bW+FHuӡmy}֋dCŶNQn Ј)FXI#txv3Z,<>x޹Ibs:",yfB#D#VC_j8A#m ]Ոc,M%4b F/Јp ykNhBSmG)bit_yzu>I.7xxS#4=u4" 514Cb:mT׵C6,羬Ј)FXC#4 yפm~̏?qwH>+NʹU#ꪹ!ؐ\)qI0uIDFL4tpaɠnig*&QxK.1".-J Vxc4i4B]hzMF譅,=#քFL4tpaSʽY"*WhFՕt ܷFHygbƵiz6" $4b F/k\)#^Ҙv}|1PV{ ~4ϾOio>Udܘu!yQrc|:Sh@#,^L:ƓjRK(L Pw8X+LrYG$ONIMOCb[-An* Ј)FXU#BSD[GzQZ(3$ 8XiQ>dCWnhg.зvЫ\p}8+h05"&iw{Fk3F$gD5`yukA%Z#aabKD#d}H(ZX>֛5ЈpЈ)FXIƇÈ.a3Y8՝K: 8X7 hы{nH6qMy2;IuZ %YgшpЈ)FXI,w <6Moz^x\ sЋaxFF,hFL4t𤸎/ /9tL>?t7cl}NLW&F,hFL4tF&3BExBO:/D D&p SB#4MB#aab,׌,ƚTߜЈpЈ)FXVxQF,hFL4ЈpЈ)FXqn1 S4B#4MB#aabFOhFIh@#,^Lш 8X7 hы)? &S0z1E#'4`A#$4b F/hDF,hFL4ЈpЈ)FXq Ouϯ>&4b F/hDF,h ja4b؄FL4ЈF46S0z1E#'4`1kD@1 S4B#F'_yvЈa1 S4B#]5/  1lB#aabFOh]#j &4b F/hDF,]4bpPЈa1 S4B#FI 4b؄FL4ЈM#* 1lB#aabFOhkDA =6S0z1E#'4`5@(hİ hы)?jDePЈa1 S4B#@(hİ hы)?(-1hİ hы)?1''?d0F$htD.Se1aabFqB` ;"FXh( l1aabFHˇb1aabFн ;"FXhvFw`B#,^L4EXI*\+TjFIGZʀ4afv#2@(د=ĊYdAӽձraI~?@AFf&^~#l;?xWU[ӌpH[R0:HP6 > 'FwEGKBA=ys6:׈EmPW 0$?O_"Ww׶jD[96r9,FX 4E/G+k?ff46aFpH#5subF-6uFYGʯ[ oӈB9LF?l-e فF \B)k^@׈ctilhDx^+R?ҋ~թ  /$#,6h]4=jH_;5 0ak9,FX 4b%JY# SGAq\lӈ;88 ǛGyiDIkA. "ɰ<ĶH?^^3$zjz&. a03;~qwi_* lkHpU+a%vΐXkK}&H>'+cӈMQ#1f4:hؕ@<ʭgc|;W#:Wz~IzɖH'!omaIve7JW[SdG9F+٧h,C{y|&,65mXq ߵ:u]V4zFtǍ@Vۗ淒q֘[n ]maIV ypF9I炁Ft?:kLu`Wj,zTh3s{PhDBc@ :wmoT.~_VMF$7֍ʝM{;ny9h~P#NPA#,l/hDF4k aw1u A Fw`B#,..A#rP 47aw1u s]'X KBA#|.'Y K"Fe L|SF  ho߄ !4‚b\P@h"נqS`B#,..94K|A b8&X KG#uaw1u!h473`B#,..N]݉ !4‚b@@#|3k`E໘ğF Iޯq||˗/}ݍ7l{OcY7/` ,ꯙ !4‚bO@btR0 \Wv,<::ʷ {1Ⱦ3YlwߞF@ l… qÃlYS ߈r`y"ŋw}׾G^gF45F|glD顰F^](w@g4=F 5L}Hjq^,H}}F#Гh1 FY"}43e|_#hd @HP|Y0H4b$I™F\*&~Fr#'g4=W#iԈd4Y#Y9:4b.\}}F#Г4F\rE,taiW̟<ӈW]Y?rfԘPu0F@Ok_]TЈ~5GPua5B߬qeFH6ۈ.|2h4zRS#AbB> .w}{L4BCxRg{S `}}F#Г5/4,D " 7nxꩧ’هD# M@wUv[ h}}F#Гa5BBxkII \}$+X)|D3ƆTTbA>t%+6knG| g4=P#DTٟ]o3x}…BuL2OlD<#>=\zU]D}}F#Г5B!lSbf~퍳KIo|gxxF E_H Z5\BSDw|_#hd(ė[@ C7>}}`B#,..D#Bw1k>O|S qw1_>O|S׈BwOr 47,Bh%=5b՝p{w{9fho|_'X KzjꉌJ$f !4‚b꒞!5~V*'rذ>O|S 2|Fw`B#,..A# Fw`B#,..A# Fw`B#,..A# Fw`B#,..A# Fw`B#,..A# Fw`B#,..A# Fw`B#,..A# 0F,~/>?)d0F@ONha@#f4=A# F:h4zF@uB# h1F 4b @#,4hĬFX@#ů}71Fe 1Fe 1Fe 1Fe#>~5F:h4B]'uMhDNhaP4F:h4B{ 4b @#,ʦF|5F:h4BA#1Fe#|5F:h4BԈK@#f4lÏ.kB# uB# hF4b @#,F8ؿ!uMhDNhaP4F:h4B|:'4nF:h4BA#1FeS#~9p 4b @#,F8&uMhDNhaP65_&4"ЈY'4F(5F:h4BRF@1Fe# sB# uB# h#uMhDNhaP6/5F:h4BԈE@#f4huB# h_&4"\io[Ə>w<86%4bFA#4҈z>'vڦoO[G4bFA#po&4"ύ_4bz_ÓO>9֮دF.=ɒD#D C~/\_'w}?C4|_}eYAk/M5?Khhw}&1!3oh}FCow*j4bϠFe#~3$AL<5_+_m]%m s+O|~WՈrڪU{_>ڣFaP65t WZ?6O߷Z"21WG{*_h->dK4h4B;eVrǕ%m#-pJ#b/^40>٦\,fMA#jFA#Mxjt՟[[Fg<9ZsB#[_4CdI< K<06"x8o-F@#,F8gO.%ͯVs7lJ5\#Ԫe_ \= /\-Wda+`!< W'hLJuOQ4 h4BԈOS#{߿y%?钐kxwe^g=lWtOh|bu5lK?+$WI5Fȧ|E!4B\A;GrUFzXfe#^I7ݫ?-/oFgcg_"[7^#ՈR,X~ci%j ԡ I.l|J3<թhFa:˱FeS#>5@: gVn_%_?zk g36 9iXOGzc5ݨ:R=vkvFMN1lFtD#h4BٯFU6x߇hZHX_W~x.!'r8]PI$)w9bjD}F3<͑,Y6NjFT0)0 | wo[ނ҈nSTC^+acr:zԜf–C6~W<:ԛ7B;)㘆D#vdMy#F0F({ш_ ݓOCի-ȒnMl"kĻfG$hTT}\,n=!Х!!}7G aoC#FA#pO\|_誸}j7|ca¦t#a=k7UOE\!ЈUyXU~ė`߽m:Dܣ> ”]h|+i{?uS/Omh4BԈOO=amN}gV=vݑ!uoK~Ԁ]y5އlO'XCW$įoYY6( «FA#pҞ^Uh OM~Gkj[q$lJ5B|/z65G|eXmϑiHcF0F(iDHyxsV!-hKC fXMEQ9tyB# h~b$7o,Y,# }?~]蔔k/oSTN 4b @#,ʦFiڭ?կը J!Q_B _࣫N Y၏-y?L}Kζ)V@#f4]#`e,b@ B)W= /mhDNhaP6?H?Oozٰ__ٲOx9[b?a~BF@1Fe0.^4B [߶x>z9[(N d"h=Npݑ6NȦ64F:h4B􎟼 ׅa7}t:?-[uq=kux?iXM CV+'4"ЈY'4F(i{IH%W-Y|]6P7ЈY'4F(~5F:h4BA#1Fe#@@#f4huB# h&4"ЈY'4F('uMhDNhaP651RׄF@1Fe#>kB# uB# hN@#f4lOH]hĬFX@#M8kB# uB# h?qRׄF@1FeS#>F@#f4huB# h?k 4b @#, F@ЈY'4F(_%uMhDNhaP4F:h4B?QRׄF@1F@#?hĬFX@#pxWH]hĬFX@#4N?qD8Fl5F;h4BA#1FeS#~5F;h4B DQ#~GB?n9ʠ!uMhDPoe ЈkB#  2ӈN(kB#  2hĬR?kB#  2hĬRIF8jedGOpx2b-w)b!zn[#x'Pvq  #2ho_sJ[8$k[fQƍqܫF4H'X"hčaoQritrz\nF 1q>W@1+wx4iD ?FĊ\DՈJ.Z"0Fw%7q)2ho_ѐ_,h!dk5f5bm m<bX bp} abaW=:lh))إSC7(!S4"@H !5)P#RU04S# *ʠ(6cuО| N cF=> ?=6U#:n'6kFFwa>\47܇z|qϽ(jnJ'fmGwj>wjDȡg&oX,< ypBg2k~7,\47毶"hPL5t䉆Fv",K^:F$1[JÌٵS#ih#kC2hse S `.S;4S m!+uk2eʠ(*G#iHk4L5+u^KEaydJA#Bhӈ𸊢>%Hqhp} abꛡW:1vF r hy_~v4բM#vFlE# ϕA#,PL}3TjFگ[ 5 "/oܚ~tzS!寺+Mg tO4;#ʠ($g4:~|fA\At8X#[ rY'o6й=5b> sse S߶;" byr˓5{Ոrp%4\v}ya.sse S_mt˅Xo7\Gʶ mVD#t~1&T;qUֈ0R$HʕR4=\+FXjL-~+4NhxKgsse S_Xo}{(?!Am(>Tv$̀)[` Q95.emKh mY}%mVSKᕞse S"u,ELc]xϙB=jJS9686A8QGV D] ,' S_ -*-.Sꩧ>#A#,PL}C 2ho_ߠV@1 47ʠ(!}F[47oP+FX oe SߐA#|C ab7hoA#,PL}C 2ho_ߠV@1 47ʠ(!}F[47oP+FX oe SߐA#|C ab7hoA#,PL}C 2ho_ߠVC-̲IENDB`PK?D`?`PKsT*attachments/7ka637qkg0r9vogau2m82md5nf.png/AЉPNG  IHDR R/IDATxMei}񻯍Ԣ)U(B5 !$B@ؓc"$ ;/Fvcl&CAfptA0-ɪrϹo>/sn}CS}yys}~9ϹΎO31#'9qxz9;O?z?yý\̮?<Ջw`R0'N.a=^=?؟tvwzsˉ{gK7.FXN\̼JNQ B940>;PNl`o~'"9Q]_9L_`vD뜨Fb9!`&eN0 ;]N0 $@BN$@BN$@2ޜ8 m>qmle4n7l<4WoE9i{n9X7v?6e*(տlװ3K59atiתGzӓ05m.)*{v-uNE45kP޶`JkOP MBXJ31#EPr8'mo-4hl| pp,6[֦]X TTWצ6cUNT3/4N̉઒+I"'\)'U6~!ΉƫhG 9J,'?anfFHD햛xM%W2&eDZWp x)֡`$sev[w;-FDZ75 e"祲}-O[9a.;i9qr1;{zP|UÑj\4W)jUvUUZnYEE;{$4Ŝ8<-هX25Ke׻svqPJ_ɲ=n[V{zkywX wM0'n\/7vk| k.rd͉Kxq8޿<{p#0?9VNMLը7OmJՙ_ZUῑNȉQ %QBOl#' ƪ媯ھf&M5YJ^I.CNtYF1sq:?!r@Nʉ`ŸXeW֭qY]/:  uSJëICKOe(+K͉ff"kNk%_9Jl zz*XNu6M5Sobq٢TyHjGs16[(n%"!);] Hί,fsB#sbFN4^p(^5X:`^KFF}gBwr"Aj^Dꪜ?̦j?qR+0V-]O\)I۾hs\fd٬%3y+WlFY681v2*p㎝GN?KS"8VXh6Ͳ'j[*ql6yN{llW94 Ra=b'ΦE;⬶ʛrB9hW qMܱcȉӕ<;5 ⦜Д$#~igk0/2俕\D`*i|ܱ Jwq۷]~\iH K)nw9ɆFJL3-5wM96WX{\a4i3J"߱EoSY>'L%QnZY*ɥlo$˜wpi~Nha=V0PH$ +k@.iʖqPb(Xwy*HKvc''6.VԼ:A(psC-Z(r͆b`:`N=@9 h:uM/ bc gs6+c~V'-sB7 "'Hs> lGlN֔}c ~g[V'Џ2 ep:+/FŶ+lH\Yew:n1>(隐FW™~p~aBgfR DNNt^2 3X4'INhM9p^7!hBN@S6Qi=Qӈ*8'IwrͩlJ#$m%@BN$@BN$@BN$rCgy2>CN,}/aLRLNK-s,{|WberJ2Yok*AK9a[}~jF/Tp'5oB.UގE8^J τsCO 3Xs"3Sׂ0&bgf" Ts֝Kꅗ7By/al_iӛeYhsজpL/aF瀜fN޿<{pc{̓뗳N9[j%/ Z~Xż?LNmb9i'4Qdz=*Ѓ)@`~h9TV襌;М gֱgky<,U(i5w]M0'nAӒOo^]y8;m[Mkm*֙ωdb[C1u# rBĜ89z(<-J);'LfNA2'uG3|D_s"3~6BNdwPv<HmjDppbkSNW$,3b5&2(=;瓩 l ^,j* u"O ՞xJߟ#$c ez9|1%/-Nlq{iT996儲i/Oȇ@aȻ 'Jv} `NC^[8v7>ZɏI4"})W`xʝJ~+LX뷱ճ@؊S3A6rb]sT?\!]tLX*9qR샔,Xd|&3>V} cե=UR8 ,=qiw(1x VWfoy ȉwmc?L1אa쓜^֪yNS]B5IO7}ygeEe/ɜhQ㮽\sT6h"'dSVg/4i _9NǎALyS&o˗'{7A[^T;m!'dwU< O0> ]Eg6ɉN O`i;s" SNu}]Ҽi&fjMج%e ɮsD!S2? EHH]͠HC-mD綛3efDNsB9oo>sBdDOԣ|4>Ѳ-s"|;EGy]+Ĵ!Mue/k*T¶s9$.lf@5~s@|e1 &QSʐ݆ MVKuʓ9׷A1C9T QOغup"a5q{CmON'fdnkT&rB#*= J!'&X(H H dv|r-<'yI5FH8VR5gv ^3r"L(w֝? '*yggnM8'ޟ]?ΑrfM@u9=[0M5'nٻ<߿ۜpqƽwzs{OMgO śzDl U>:՜xfgDiDծ= /*K$GٺˉBg"'{NΞ(sqg3o?t huk8]wM@W\̉[w7՜8yb3H H H H H H H H H H H H H H H 8#0f6ݠߟ0q0' .'),'#2TN0 0PN0 1HN0 sr !'r !'V9y@BN$@BN$@BN$@BN$@BN$@BN$@BN$@BN$@BN$@BN$@BN$@BN$@ , qރ𵟼_T[o=}塏G/G.mL`n_>:f ''>?y%8||>{rț|o?o_a̸T97o~{)QbVݻfQQ֐ZrOԇX?/3وo }{\:3 FEi[wZE ʉuV}^z׋^/n:_[NtpPK|עGrW2'=_ZLw??jj4_U ^ɋՕ]ĆBm-~/ SDˁ3~NXZogxw6ȉuW}sҢ{CD_l\z٣_Ώ98xo~}]vN4t›Xg񳍿7)kt^S|Saۑ5]D(Y m^,ek e$'엞N09ظ ap":]w&JOdĢ_(m-FKO{(o*uՐE*x ?-\NbBœϿkٟujr4+r)OT}(9!j^whw+UNC [^?w{}oLmu ^z{;x}KuĵwzNen)>SgX Q/6orj$hOzd۽eVҼr%Ӫtl։ei~ EE?q~8 wa|9\ ґ3~^l=JAT4,θ 2H|'\)CIyW˔[;kz)ϋ29 9 91mgSpsv 91m9lk}"'!R/q͔VHjڹ>Ӣl~ο}Ygy;Z$WcK 6^ O_o~wp5?yO{[o|΋7\y-W2{־ʧo7ۜ^Z--88DPܮD+u—C/uɐFdQ  ߎD쇵)/~7>ۑWꟼs"ם MɳUFj|ert'V?d]Ib~SDX+ڲpNDvٯ@T 9:j(&.8-8'9Qڔ!vNӿjUW}NԿ)ig-rLZ۪}c^n߷ܶhWs-u3`'ΜnG`^æN تmU?|nӟPLd]qsO}K57'SUuii:mߴSͫK뜈.lAlSrPΎ{P]^te'K)9nIDcUU(.=E :RcWx}i{ FfQM^NUCzD |iN9ќj$/Tˉo~)vJE$Gj8hrN8?]BQ(<G؟Ȭarq6ͬ$.dȃr"w'g֜P^2"1>Q14s ù/ŬZ 2 WkNl̷}ӷwzՏ! y 9B*WbL q5Ms :EJ;IKyo;ܘs+6ܱmosPh; w)=<}So=DuDZj5.%WVNay{a9[@i;=/sƶ;5DBoCѽ#'Jo ކ[Rpy(t(Ϲ)znybnh녛k @,}3SfӉBN Ǽ?_ϧfw_*#'|C&UFN$@BN$@ʉOg'w/`<uZ<=|#^w{vypbFH Hbo_=1|cC087'n#!kO$@BN$@Duϋ3h'r !'r !'r !'w叜9+IENDB`PKɘV//PKsT*attachments/7q2g0svp17cee1q5m0cv2eddc9.pngD仉PNG  IHDRZ)*CIDATx흿:;i8păl h`0sN_V}LZI97rԙhŵHJ?>E-qQ'X7-xN`1i/?xw_}0Ӥ ESMZ4Ut*?|ۻ?|~x6KVV?}0ST>F~0Oj$j,8j90P+IMTipn5`i58kWZqk 85Xpj0:ޅc@ƀ  07?_^@w6_~fOz5_:\.-ܯNr`/SJxLf?UGfv*aʴ\xaQ efuxe5z;Ug[~/K23\F+-]YדZ׿} jV dx6][<%.4Gt*6uQ&MnhGiK2k55U.bQF(?/*4glxa\`%|XNKaA.!UҢ)EtWSn1'~ԨY4ݪ:9a3j`.vR4vkNjj]Q]^Y\a)ˍ58àPJ\Vٍ SLo5^?X24P]ZD2jpE7~py5jpطU/4FkQxu`"[ȶ4p(+h0b^BlmP1QSm]i$*qxB֞Obb\bӃ-qr^0.G6=!MWCגɯT hD4U-+x %0'xޙWchX N>w3;\ԯm W]!RݮC9w2֩0z5u8CPgi{~c8 PR"IiE ]`⭍R'QN1Cv-Cb2tU bۊ:bޤFRh S]ws[nݞp4쬤  04` h0ޜ>d_>7V GlӪ%l~`w['[ˆW)(wQ~,6AwT9j#}k%Jl. Qnѝ%l6< +už58($㽝=XZfݫûyus͗0^jw⬕;/o*3y:`^)Sܯ;;f8|)%8?y o,z+1;*^OS˩+?DQ`sQAYk5Qakp=/c;`S8NAx o} ^fˠ폿S.Ǘ [|*-;Pur.  6vuh/I6R49x`w˔l̻O糓w3YX@8 ~O%8QGn$牚%̍U%K 8ouUOY\Humoѹ[2D`[#ܾ(6otI_1~ ie:k o\V .,JˮX^0z84tӃ^t)s9͇^+Y\-R5Xiu3K{M#kf=.\-m6Il` Ib;E{Pؽn8Lh<//mjcJFxrUOw.^v{lD[i-.rAO9%}T^h#]Ŷ]-s:vOfi)VaKQT"`p fq|md0ޱN*CG^.rrmi}e*xJ}#Q,Tioc ^ߓI ^ϯr;4x撣T~a.R4k]kXQU0 ꥥ%1t࠿;wcW¬&v\ ˜syyhOCL3T\ tX&YZGpZ4XI+5Xk07!]kpqTԉ4~5cӆ.ҽyS?eVȥPeɦyye2po *X+je&_{s0i/u\"Z҅%~rvwxRkIvV L}kuVbu"qT.5σڶ ~X858 z귷S_Y}k,kˍ,ݤu#G`W-!s#Ww8{A>O}_ۖݮK/.zYԓ8h,{æ |i^da $G-񪬒Mj؏!9r#)?ԝߛ{Y k{ĸ^.n_na2#x7)[WnTua>-)-&JPP4j &D,DVN~L 4؞!ޖՒi klhKKoR$8+/ᆲrp&D]MDLH4vIcE>MeO^p Vgh0l7mLfݾ4mi{ȵG/ Vl<կN+Lǎc;jp58b`Kb/7O\ !uk()0rFbo%r8%rF'D%(ˎy.fK)S,)a,V-uƲ>O2 t:Wjw[),S^`HS;om\<إQx5ؒ'1p\ƒ4?8PPq+:)%taʺJ PΝ߬YDNcƓ,j/2)Gr{I4X<-[sb0QnKd4.^}@ 5VC(~MK~58^ɍɔCw ~L_ǧġl #槥zX7Ga,U"Y ݅T;|Q M4]Y"(TlόȣX0YK1Nl`Q*eatWйЀJ_im#l(%"Q+}a) pVA=#).ŲE{r dQ" 1} F-i`^i)WR˱7bFR%z} "OjTkp]Z5:kY*~:M-kp:r+Z,%X.+r~jee d\wͷ%X4R/)<8fq i䮊?%O.jrEMK&{KdLXp"m}ZqӅZ@T;1c@ƀ  04` h0`1c@ƀ  04` h0`1c@ƀ  04` h0`1c@ƀ  0}hUXKE]sl:lZBƪ-A*?۵S4u#M /\U\\!2M4/qikL.ŮJ5&† 52wv >ֽٚzw @d|;*\.>ۗ_3{N{oIu{7`>w= ϧ†y>?*?`Jxr/?x),zHDy5޳ hp8hݫࢳ]Ɂ:k?N["1QtY:\n,G ^ VbJNRm) [A{r;53c*`Majz7o1r 僫K]6x5rmPCK kO8@D:ʃ;Ug 6^b4FU^G?8w_?3VxE[(!]UIGݍ[o , SŐ|XӾ! 0)h?`!ZùI8>+jO~pi .:\X5Y]l[)s\mC_ 9H;ipm: —Yb[:dBӕή5>蔫0wdgpKaDmPpk7bs@ɺ^UIVcHzzv1 (*&&ss_'+#.W{Ŵ-6o$Q04` h0`1cph?}ZͲo2hTOu9`=C1[ `_>y((nx^{v'$lx6>蟉?Y}nIO=߶n"Kz˶<hp* TTVWؕn _=iy%}B.9}˳sgYlXدRQa.v^%Q_!NB.Hf 37c|6{ ؼ5 6΂nqmƽVm<+_@aWCr{o=\I-G"9r˛j1Ŝ_RXiVy@w5mS77z\614XIK=wY* ߦHn ")bK>&f/@;G`a<\< w`H;=gg k4xEY(ኯ^z=-{V0*T,ZD\Omawb/#^C+k#b6]W>|{ F-`JI`Q|~CA3E/m_@+*eI]N$wvE~+xSaGqwMlQ3i@RKx=`4jz]3EKr+U;vXa]4Q4U_i~~qFԚu58ȟ/cSgxޚ,m^ib:9{Z{5YTEctgW9國hFts=J~pKblKЫ4x ΟsYU?<A4<ddYm \48z:PnN^ VѴw|FYG Q\=TX(nxƴ LxX-fnm#hp8_2:O7;ܩdc h7x!܁b!ȺJ-qo ՝rEEۚj+p^g@6WEʢW:jpop# JW; oR6/,Un-ipEIsSm½:Kٜp6*2 ;eو0;^U7QD% ۠Rϻ*  ;G/%5xmuFt4Sڅ]²Ill >QC{ҳx JRŻl* l-bru'\Wg,NgTBTTV[ɫlS26Ggr7un5>I^5)( 3 q %g3M1IV,AׂKez<14]/4 k'H|qބ z&M3_I0'C'xd̔L LjZˆ$ZqmUgDIV+SE]osN٭oЇ0bvoC9Cqrs}WX7{/W\FӍuƄa9wD37ɂ݂?% ipS8;[,g^{Ѱg৤߾e\'Wj9a$5h0`1c@ƀ ^%Gl>ԥ`y Y OrkO4/)q|o)n7w( )l˧$귿btQ@ ֓};.Y&+I_ Pad$!?uiUptJZ3$bL12 WCzl;&?'0rG;iEOp8 b9Wos *z=UGݯ)=FhI;[]sc G`&q7|ȈusGtaNVpݪ1S3<ߦ=^CSE{Xݏ!s#ErUa[aYq!GlCnfG6^!^?8wDP S-,:JHStq]rGżR[6?"B 6zzSa`(XeES 4X?`:*ٵ33yH`$s.@|VW 7%6s48Q\)]Q6Chsub.#kDx/v?~D|bikp'?O5=,J`Ԙ,[SɃU`\t:#x uDϋn5TWmYm #>bJ“u=E0>Y P\D0S}487eºhe M$Rez\{/Lw.~/cJϢjLQ4 )|g z `Yr9vő٫S5*Y1{m)W[x VJ8lD-i[o&)9Me`S|/@a}&@+h0`1c@ư] 86h0`1c@ƀ  04` h0`1c@ƀ  04` h0`1c@ƀ C#Ϯ_~8vm<x~[0ܒ#7LxI5>70n6_Fo_~]>1 3ކ}Тnڴ|xguYEq_zn4LX"R˝a|5΢k7Gsw<ܾ7hp+?ؒ`4LUϓN48?t`IQt Qӯ}vSw`qu{"xNNf*e:72~:S``Ijt눧I>5)-QN+>km6Al6||>8hFOZ58 ,&EW# )5%a⯫[,mZ`ekaIEe<: UA6 pz.6~Hl|rӫ+ӌaqB;<VBp`ڤ3yhPRq:z _%MG'wL R* ^$mL#482cnˣ,?Dro|Bn58)7:r(ChLK&8_=Xu_*5}•.’5x\+2,~r\0 9ZQF4,0[R~qRx;K_9凤n-Xx Th|d\W4x\dIJ!rJc.lbfkvhp օT.JwG,Z"g)\(%۷6D4MB,*[MϠN_}WtjƬR~5t=/^օD-bz%jc^q]4*{3\ڶ1H{{ 8vD޼fobڱ6R] ^L2Ҷ"mMRsr0ddGljE%_o#e_v7z?j%rc=h+]+\;naX\ÃQIL=G^'K^Lڜ]ͧی<߫^7.,lX!BTv ^|Y.qv %iu\]-\ZK/;/[z٩eHs=Jovʔmk&eMQl| ŗS^yh6+]6z]t;g N FsWJ7GTV,lL?}sX O=a%a)Dw"j(Q$ؖbMeqC^<ڼڸw:F]UQ]Z%h"uMVW]0VQC2}P`(U|]*}7. l70B.ĝjp&iCB]/puE~)mT~p:c"룫*0|Xu^ =Xu_m|ER{j-|KJ)D<{?ɱ&亚Z.ٺ孨zAQBڅai-fӛ8ŻK<[ )c9>ž°31b1ݛ({KJnRÓw5/eܪDp՝]M.fŮNj:dK! 4iBkITҐUŭRLU_MFo.* WQTucb_HPACӁ+߸iR|iЦ-6J6X6.+nKD@샺,2KG0:uaO OnFd`1c@ƀ ;{l-z12c-us7hwjW]; A{oج|@W%.~g@,bW( ^!s?C](2%k֨]T'4؍*4o1Q,b+ִ=r)|IҲ+i.uj5j/ P$BjQŁk\\t!Ĵe7YI5;sSmٲӶ pnvl¬ƾNQu:_#pWDNnԄxvUM!P?TrVV|a*W|j; o)6F5l@X[бF:_o>UM_V۰^-vdc5xpWn7%&Nh+t#**mhp3=4X!OXF:]/;~z'Q,Y8QxkŰ`ޜjB_ew.WmclYtONkըU=kc3j n֛\F,%*^OżE8?Pxw.bYjY"d:Ыo|ENR $ Pg\݊^tjp-yeWcNM,񦗯PvRϋ|D8[Aӡe8Ĭ(J+5X, S7Dtstd|g) 텞L[9^@!.>2q\C,_dԊQQpESO[ * >OxE9[QΨ0K4&sk4WUp::5q0!jQLrI^P? :STv> Nf8Z[2RE֥F:T,b^+WUHZx^ v)xql/&R>z\}?8Fs^{W>]b]SfjLr@i)~E5[NY.ļt`u٧+.(-Vc6«E*ݕ=zxS]4X8U(1캨bc!,(*7hexQ1i _}!m<P6XD1|T"Q.74W$a>yJ#\u=뿮\^ az;.׊ K.2L\.xUX1EJz s8Gܾ;-nr` le"")YZb s}1zg)Xݪ~9[]MV*Tcl~n*ƶL.,\=yqsRCLxK`B_[9AG]]FrQuji!:dw?6UN&oڒ8܎&g|N~(_q6S%}z?c:L9\⺵= -i]w :l_s=!<Q9U4K?W- Ah~\|C~K٣\kbEmE5ؾɫzK,.cq@{dpUCWϝb%od^^hg,}=UNƇ YQ,j3K  7͝W~JEiu@4Q4Yt 04` h0`1c@wLK-^B7!ysr;fkU+`ȁHT ԳaK{.Y p -3ѹ 6m=jpct%u~Vr{0nE'aOFXa=qvj;J`@眷z/..mD*r t`eR]aNs@,0}"{˫o \ f9Xc3mOo> BKLJz VĊ"N!{.BL[a, hyX-NxH|pwKσG\`zylv:o/hK ,Ѹ.zrmWX xOn'ӚѮv]r(Jћ=@ #hp;N)M,5:M=S]+>Izbz4鑜׎guhP0 4D_d1LQSu[]s r.,3 odRvzYNɺtIE#]zsV f9NHwY|ҝ4Sit[KL%^:7ld6 @WBuy[yˈe4` h0`1c@ƀ7%ƀ  0Z .r/|85x輯U_6(oog|ۻWݘ+9OM\t^Ĵm=hEgwRh?+ <° Y`+I([Y` HW Vce>sj0t`Vc8ޅc@ƀ  04` h0`1c@ƀJgIENDB`PK~4+ DDPKsT<Revisions/0dc76832kepcpe43ankdeq2a8v/rev-2-1642068154489.xmljs基础-1js入门1. JavaScript是运行在浏览器编程语言2.前端三老铁HTML : 确定网页结构CSS : 确定网页样式JS : 确定网页交互3.js组成三个部分ECMAScript确定js的语法规范DOMjs动态操作网页内容BOMjs动态操作浏览器窗口4.js三种书写位置行内:写在标签内部内联:写在script标签里面, script标签放在</body>上方外联:写在js文件中,使用script标签的src属性引入5.js两种注释写法// 单行注释/* 多行注释 */6.输入与输出语句弹出提示框 : alert()页面输出: document.write()控制台输出: console.log()弹出输入框: prompt()弹出确认框: confirm()数据类型1.简单数据类型(值类型)number数值类型一切数学中数字作用:数学计算string字符串类型一切 引号包起来的内容单引号 ''拼接: +双引号 ""反引号(模板字符串) ``${变量名}作用:展示文本boolean布尔类型只有两个值 true:真 flase:假作用:表示条件成立/不成立undefined未定义变量有声明,未赋值。 默认值是undefinednull空值主动赋值, 要存东西,但是暂时不知道存什么2.复杂数据类型(引用类型)3.检测数据类型typeof 数据 : 得到一个字符串,告诉你数据是什么类型4.数据类型转换隐式转换: 运算符两边数据类型不一样,编译器会先转成一样之后计算转string: 连接符转number转boolean显式转换转number转整数: parseInt(数据)转小数: parseFloat(数据)其他类型(布尔) : Number(数据)转string常用: String(数据)可以转undefined与null变量名.toString()不可以转undefined与null,会报错转Boolean : Boolean(数据)falseundefinednull0-0''NaNfalsedocument.alltrue除false之外的一切数据变量1.变量作用: 在内存中存储数据2.变量语法声明变量 : let 变量名在内存中开辟空间赋值: 变量名 = 值把右边输入存入左边的变量取值: 变量名3.变量注意点(1)let变量不允许重复声明(2)变量赋值的时候会先销毁旧值,然后存入新值(3)变量给变量赋值,先拷贝后赋值4.变量命名规则与规范规则: 强制遵守,不遵守就会报错。开头 :字母 下划线_ $后面:字母 下划线_ $ 数字不能使用关键字规范:大家都养成的习惯取名最好是英语名词多个单词驼峰命名:首字母小写,后面单词首字母大写运算符与表达式算术运算符:作用:算术运算+-*/%赋值运算符赋值运算符左边一定是变量,因为只有变量才可以存储数据=右边数据存入左边的变量+=自身加多少-=*=/=%=自增自减(自身+1 -1)自增: num++自减: num--比较运算符(关系运算符)作用:比较运算, 判断条件是否成立。(成立/不成立)> >= < <= ==(相等) != ===(全等) !====:只比较值,不比较数据类型===: 先比较类型,后比较值重要知识点1.运算符不能单独使用,需要与运算数据一起组成式子。称之为表达式2.表达式一定会有运算结果,要么打印,要么存入变量3.关系(比较)表达式结果一定是布尔类型, true:成立 false:不成立逻辑运算符作用:计算多个条件关系&&:一假则假(全真为真)||:一真则真(全假为假)!: 取反 true变false,false变true逻辑中断逻辑运算符的结果是 左边 或 右边 式子的值,不一定是布尔类型&& :找假左边式子为false,则返回左边式子的值。 否则返回右边式子的值||:找真左边式子为true,则返回左边式子的值。 否则返回右边式子的值流程控制顺序结构(默认)代码从上往下依次执行分支结构if语句: 用于条件判断if单分支: if(条件){ 分支代码 }用于单个条件判断注意点: 条件代码可以是哪些(1)关系表达式: 结果一定是布尔类型(2)布尔类型的值(3)其他值: 会隐式转换成布尔类型来判断条件if-else双分支: if(条件){ }else{ }用于两个互斥条件注意点: if大括号与else大括号 一定只会执行一个。(不会都执行,也不会都不执行)if-else if-else多分支: if(条件1){ }else if(条件2){ }else{ }用于多个条件判断注意点:所有的大括号最多只会执行一个,只有当上面条件不成立,才会进入下面条件判断必须以if开头, 后面可以写多个else if,结尾else可以省略三元表达式式子 ? 代码1 : 代码2如果式子为true,则执行代码1,否则执行代码2如果代码1和代码2有运算结果,三元表达式的结果就是他们的值switch-case:固定值匹配switch(匹配值){ }注意点匹配值和case值 一定是全等break作用是结束switch-case,如果省略则会穿透穿透: 代码从上一个case无条件执行到下一个case合理穿透: 多个匹配值需要执行的代码相同循环结构代码重复执行while循环:用于循环次数不明确for循环:用于循环次数明确循环结构场景1.找出指定范围符合条件的数:筛选功能(1)遍历指定范围的数(2)找出符合条件的数2.求累加和 : 求和(1)声明变量存储结果(2)遍历数量(3)累加3.求最大值/最小值(1)声明变量存储结果求最大值 let max = -Infinity求最小值 let max = Infinity(2)遍历数量(3)依次比较大小循环结构关键字break:结束整个循环语句,立即执行循环外面代码continue:结束本次循环体,立即进入下一次循环体数A1.数组作用一个变量存储多个数据2.数组三要素元素:数组中的数据下标:元素的位置下标从0开始递增长度:元素的数量长度 = 最大下标 + 13.数组语法1.声明let 数组名 = [元素1,元素2,元素3,…………]2.取值数组名[下标]3.赋值数组名[下标] = 值4.遍历固定for循环 for(let i = 0;i<arr.length;i++){ arr[i] }4.数组操作数组名[下标]下标存在,则是获取元素值下标不存在,则是获取undefined数组名[下标] = 值下标存在,则是 修改 元素值下标不存在,则是动态新增元素末尾新增: 数组.push( 元素1,元素,…………)开头新增: 数组.unshift(元素1,元素,…………)删除末尾: 数组.pop( )删除开头: 数组.shift()删除指定位置: 数组.splice(起始位置,删除数量)函数1.函数作用存储代码,解决代码复用2.函数语法声明函数:存储代码function 函数名(){ 函数体代码:需要复用的代码 }声明函数的时候,不会执行函数体代码调用函数:执行函数体代码函数名()3.函数参数3.1 参数作用: 调用者 传递数据给 函数3.2 参数语法传:调用者函数名( 实参 )收:函数function 函数名( 形参 ){ 函数体 }3.3 传参原理实参给形参赋值3.4 传参注意点实参与形参数量可以不一致,但是按照顺序一一赋值每一次传参都是独立的过程,互不影响4.函数返回值4.1 返回值作用: 函数 传递数据给 调用者4.2 返回语法传:函数function 函数名( 形参 ){ 函数体; return 返回值 }收:函数let 变量名 = 函数名( 实参 )4.3 返回值注意点(1)如果函数没有return,则默认返回值是undefined(2)return关键字可以结束函数体执行, return后面的代码不会执行5.函数三个执行流程1.传参:实参给形参赋值2.执行函数体3.返回值6.函数返回值注意点(1)如果函数没有return,则默认返回值是undefined(2)return关键字可以结束函数体执行, return后面的代码不会执行对象1.对象作用一个变量存储多个数据数组:有序存储。 下标从0开始递增对象:无序存储。属性名和属性值一一对应2.对象语法声明对象let 对象名 = { 属性名:属性名 }对象取值对象名.属性名对象名['属性名']特点(1)属性名存在,则是获取属性值(2)属性名不存在,则是获取undefined对象赋值对象名.属性名 = 值对象名['属性名'] = 值特点(1)属性名存在,则是'修改'属性值(2)属性名不存在,则是新增属性3.对象遍历固定格式for-in循环for(let key in 对象名){ 对象名[key] }注意点:只能使用字符串语法取值4.环境对象 this谁调我我,我就指向谁提示: 这个this相当于中文的 ‘我’ 字, 谁说出来,就代表谁js基础PK@o!PKsT<Revisions/0dc76832kepcpe43ankdeq2a8v/rev-4-1644395987097.xmljs基础-1js入门1. JavaScript是运行在浏览器编程语言2.前端三老铁HTML : 确定网页结构CSS : 确定网页样式JS : 确定网页交互3.js组成三个部分ECMAScript确定js的语法规范DOMjs动态操作网页内容BOMjs动态操作浏览器窗口4.js三种书写位置行内:写在标签内部内联:写在script标签里面, script标签放在</body>上方外联:写在js文件中,使用script标签的src属性引入5.js两种注释写法// 单行注释/* 多行注释 */6.输入与输出语句弹出提示框 : alert()页面输出: document.write()控制台输出: console.log()弹出输入框: prompt()弹出确认框: confirm()数据类型1.简单数据类型(值类型)number数值类型一切数学中数字作用:数学计算string字符串类型一切 引号包起来的内容单引号 ''拼接: +双引号 ""反引号(模板字符串) ``${变量名}作用:展示文本boolean布尔类型只有两个值 true:真 flase:假作用:表示条件成立/不成立undefined未定义变量有声明,未赋值。 默认值是undefinednull空值主动赋值, 要存东西,但是暂时不知道存什么2.复杂数据类型(引用类型)3.检测数据类型typeof 数据 : 得到一个字符串,告诉你数据是什么类型4.数据类型转换隐式转换: 运算符两边数据类型不一样,编译器会先转成一样之后计算转string: 连接符转number转boolean显式转换转number转整数: parseInt(数据)转小数: parseFloat(数据)其他类型(布尔) : Number(数据)转string常用: String(数据)可以转undefined与null变量名.toString()不可以转undefined与null,会报错转Boolean : Boolean(数据)falseundefinednull0-0''NaNfalsedocument.alltrue除false之外的一切数据变量1.变量作用: 在内存中存储数据2.变量语法声明变量 : let 变量名在内存中开辟空间赋值: 变量名 = 值把右边输入存入左边的变量取值: 变量名3.变量注意点(1)let变量不允许重复声明(2)变量赋值的时候会先销毁旧值,然后存入新值(3)变量给变量赋值,先拷贝后赋值4.变量命名规则与规范规则: 强制遵守,不遵守就会报错。开头 :字母 下划线_ $后面:字母 下划线_ $ 数字不能使用关键字规范:大家都养成的习惯取名最好是英语名词多个单词驼峰命名:首字母小写,后面单词首字母大写运算符与表达式算术运算符:作用:算术运算+-*/%赋值运算符赋值运算符左边一定是变量,因为只有变量才可以存储数据=右边数据存入左边的变量+=自身加多少-=*=/=%=自增自减(自身+1 -1)自增: num++自减: num--比较运算符(关系运算符)作用:比较运算, 判断条件是否成立。(成立/不成立)> >= < <= ==(相等) != ===(全等) !====:只比较值,不比较数据类型===: 先比较类型,后比较值重要知识点1.运算符不能单独使用,需要与运算数据一起组成式子。称之为表达式2.表达式一定会有运算结果,要么打印,要么存入变量3.关系(比较)表达式结果一定是布尔类型, true:成立 false:不成立逻辑运算符作用:计算多个条件关系&&:一假则假(全真为真)||:一真则真(全假为假)!: 取反 true变false,false变true逻辑中断逻辑运算符的结果是 左边 或 右边 式子的值,不一定是布尔类型&& :找假左边式子为false,则返回左边式子的值。 否则返回右边式子的值||:找真左边式子为true,则返回左边式子的值。 否则返回右边式子的值流程控制顺序结构(默认)代码从上往下依次执行分支结构if语句: 用于条件判断if单分支: if(条件){ 分支代码 }用于单个条件判断注意点: 条件代码可以是哪些(1)关系表达式: 结果一定是布尔类型(2)布尔类型的值(3)其他值: 会隐式转换成布尔类型来判断条件if-else双分支: if(条件){ }else{ }用于两个互斥条件注意点: if大括号与else大括号 一定只会执行一个。(不会都执行,也不会都不执行)if-else if-else多分支: if(条件1){ }else if(条件2){ }else{ }用于多个条件判断注意点:所有的大括号最多只会执行一个,只有当上面条件不成立,才会进入下面条件判断必须以if开头, 后面可以写多个else if,结尾else可以省略三元表达式式子 ? 代码1 : 代码2如果式子为true,则执行代码1,否则执行代码2如果代码1和代码2有运算结果,三元表达式的结果就是他们的值switch-case:固定值匹配switch(匹配值){ }注意点匹配值和case值 一定是全等break作用是结束switch-case,如果省略则会穿透穿透: 代码从上一个case无条件执行到下一个case合理穿透: 多个匹配值需要执行的代码相同循环结构代码重复执行while循环:用于循环次数不明确for循环:用于循环次数明确循环结构场景1.找出指定范围符合条件的数:筛选功能(1)遍历指定范围的数(2)找出符合条件的数2.求累加和 : 求和(1)声明变量存储结果(2)遍历数量(3)累加3.求最大值/最小值(1)声明变量存储结果求最大值 let max = -Infinity求最小值 let max = Infinity(2)遍历数量(3)依次比较大小循环结构关键字break:结束整个循环语句,立即执行循环外面代码continue:结束本次循环体,立即进入下一次循环体数组1.数组作用一个变量存储多个数据2.数组三要素元素:数组中的数据下标:元素的位置下标从0开始递增长度:元素的数量长度 = 最大下标 + 13.数组语法1.声明let 数组名 = [元素1,元素2,元素3,…………]2.取值数组名[下标]3.赋值数组名[下标] = 值4.遍历固定for循环 for(let i = 0;i<arr.length;i++){ arr[i] }4.数组操作数组名[下标]下标存在,则是获取元素值下标不存在,则是获取undefined数组名[下标] = 值下标存在,则是 修改 元素值下标不存在,则是动态新增元素末尾新增: 数组.push( 元素1,元素,…………)开头新增: 数组.unshift(元素1,元素,…………)删除末尾: 数组.pop( )删除开头: 数组.shift()删除指定位置: 数组.splice(起始位置,删除数量)函数1.函数作用存储代码,解决代码复用2.函数语法声明函数:存储代码function 函数名(){ 函数体代码:需要复用的代码 }声明函数的时候,不会执行函数体代码调用函数:执行函数体代码函数名()3.函数参数3.1 参数作用: 调用者 传递数据给 函数3.2 参数语法传:调用者函数名( 实参 )收:函数function 函数名( 形参 ){ 函数体 }3.3 传参原理实参给形参赋值3.4 传参注意点实参与形参数量可以不一致,但是按照顺序一一赋值每一次传参都是独立的过程,互不影响4.函数返回值4.1 返回值作用: 函数 传递数据给 调用者4.2 返回语法传:函数function 函数名( 形参 ){ 函数体; return 返回值 }收:函数let 变量名 = 函数名( 实参 )4.3 返回值注意点(1)如果函数没有return,则默认返回值是undefined(2)return关键字可以结束函数体执行, return后面的代码不会执行5.函数三个执行流程1.传参:实参给形参赋值2.执行函数体3.返回值6.函数返回值注意点(1)如果函数没有return,则默认返回值是undefined(2)return关键字可以结束函数体执行, return后面的代码不会执行对象1.对象作用一个变量存储多个数据数组:有序存储。 下标从0开始递增对象:无序存储。属性名和属性值一一对应2.对象语法声明对象let 对象名 = { 属性名:属性名 }对象取值对象名.属性名对象名['属性名']特点(1)属性名存在,则是获取属性值(2)属性名不存在,则是获取undefined对象赋值对象名.属性名 = 值对象名['属性名'] = 值特点(1)属性名存在,则是'修改'属性值(2)属性名不存在,则是新增属性3.对象遍历固定格式for-in循环for(let key in 对象名){ 对象名[key] }注意点:只能使用字符串语法取值4.环境对象 this谁调我我,我就指向谁提示: 这个this相当于中文的 ‘我’ 字, 谁说出来,就代表谁js基础PK$TPKsT<Revisions/0dc76832kepcpe43ankdeq2a8v/rev-5-1647689765186.xmljs基础-1js入门1. JavaScript是运行在浏览器编程语言2.前端三老铁HTML : 确定网页结构CSS : 确定网页样式JS : 确定网页交互3.js组成三个部分ECMAScript确定js的语法规范DOMjs动态操作网页内容BOMjs动态操作浏览器窗口4.js三种书写位置行内:写在标签内部内联:写在script标签里面, script标签放在</body>上方外联:写在js文件中,使用script标签的src属性引入5.js两种注释写法// 单行注释/* 多行注释 */6.输入与输出语句弹出提示框 : alert()页面输出: document.write()控制台输出: console.log()弹出输入框: prompt()弹出确认框: confirm()数据类型1.简单数据类型(值类型)number数值类型一切数学中数字作用:数学计算string字符串类型一切 引号包起来的内容单引号 ''拼接: +双引号 ""反引号(模板字符串) ``${变量名}作用:展示文本boolean布尔类型只有两个值 true:真 flase:假作用:表示条件成立/不成立undefined未定义变量有声明,未赋值。 默认值是undefinednull空值主动赋值, 要存东西,但是暂时不知道存什么2.复杂数据类型(引用类型)3.检测数据类型typeof 数据 : 得到一个字符串,告诉你数据是什么类型4.数据类型转换隐式转换: 运算符两边数据类型不一样,编译器会先转成一样之后计算转string: 连接符转number转boolean显式转换转number转整数: parseInt(数据)转小数: parseFloat(数据)其他类型(布尔) : Number(数据)转string常用: String(数据)可以转undefined与null变量名.toString()不可以转undefined与null,会报错转Boolean : Boolean(数据)falseundefinednull0-0''NaNfalsedocument.alltrue除false之外的一切数据变量1.变量作用: 在内存中存储数据2.变量语法声明变量 : let 变量名在内存中开辟空间赋值: 变量名 = 值把右边输入存入左边的变量取值: 变量名3.变量注意点(1)let变量不允许重复声明(2)变量赋值的时候会先销毁旧值,然后存入新值(3)变量给变量赋值,先拷贝后赋值4.变量命名规则与规范规则: 强制遵守,不遵守就会报错。开头 :字母 下划线_ $后面:字母 下划线_ $ 数字不能使用关键字规范:大家都养成的习惯取名最好是英语名词多个单词驼峰命名:首字母小写,后面单词首字母大写运算符与表达式算术运算符:作用:算术运算+-*/%赋值运算符赋值运算符左边一定是变量,因为只有变量才可以存储数据=右边数据存入左边的变量+=自身加多少-=*=/=%=自增自减(自身+1 -1)自增: num++自减: num--比较运算符(关系运算符)作用:比较运算, 判断条件是否成立。(成立/不成立)> >= < <= ==(相等) != ===(全等) !====:只比较值,不比较数据类型===: 先比较类型,后比较值重要知识点1.运算符不能单独使用,需要与运算数据一起组成式子。称之为表达式2.表达式一定会有运算结果,要么打印,要么存入变量3.关系(比较)表达式结果一定是布尔类型, true:成立 false:不成立逻辑运算符作用:计算多个条件关系&&:一假则假(全真为真)||:一真则真(全假为假)!: 取反 true变false,false变true逻辑中断逻辑运算符的结果是 左边 或 右边 式子的值,不一定是布尔类型&& :找假左边式子为false,则返回左边式子的值。 否则返回右边式子的值||:找真左边式子为true,则返回左边式子的值。 否则返回右边式子的值流程控制顺序结构(默认)代码从上往下依次执行分支结构if语句: 用于条件判断if单分支: if(条件){ 分支代码 }用于单个条件判断注意点: 条件代码可以是哪些(1)关系表达式: 结果一定是布尔类型(2)布尔类型的值(3)其他值: 会隐式转换成布尔类型来判断条件if-else双分支: if(条件){ }else{ }用于两个互斥条件注意点: if大括号与else大括号 一定只会执行一个。(不会都执行,也不会都不执行)if-else if-else多分支: if(条件1){ }else if(条件2){ }else{ }用于多个条件判断注意点:所有的大括号最多只会执行一个,只有当上面条件不成立,才会进入下面条件判断必须以if开头, 后面可以写多个else if,结尾else可以省略三元表达式式子 ? 代码1 : 代码2如果式子为true,则执行代码1,否则执行代码2如果代码1和代码2有运算结果,三元表达式的结果就是他们的值switch-case:固定值匹配switch(匹配值){ }注意点匹配值和case值 一定是全等break作用是结束switch-case,如果省略则会穿透穿透: 代码从上一个case无条件执行到下一个case合理穿透: 多个匹配值需要执行的代码相同循环结构代码重复执行while循环:用于循环次数不明确for循环:用于循环次数明确循环结构场景1.找出指定范围符合条件的数:筛选功能(1)遍历指定范围的数(2)找出符合条件的数2.求累加和 : 求和(1)声明变量存储结果(2)遍历数量(3)累加3.求最大值/最小值(1)声明变量存储结果求最大值 let max = -Infinity求最小值 let max = Infinity(2)遍历数量(3)依次比较大小循环结构关键字break:结束整个循环语句,立即执行循环外面代码continue:结束本次循环体,立即进入下一次循环体数组1.数组作用一个变量存储多个数据2.数组三要素元素:数组中的数据下标:元素的位置下标从0开始递增长度:元素的数量长度 = 最大下标 + 13.数组语法1.声明let 数组名 = [元素1,元素2,元素3,…………]2.取值数组名[下标]3.赋值数组名[下标] = 值4.遍历固定for循环 for(let i = 0;i<arr.length;i++){ arr[i] }4.数组操作数组名[下标]下标存在,则是获取元素值下标不存在,则是获取undefined数组名[下标] = 值下标存在,则是 修改 元素值下标不存在,则是动态新增元素末尾新增: 数组.push( 元素1,元素,…………)开头新增: 数组.unshift(元素1,元素,…………)删除末尾: 数组.pop( )删除开头: 数组.shift()删除指定位置: 数组.splice(起始位置,删除数量)函数1.函数作用存储代码,解决代码复用2.函数语法声明函数:存储代码function 函数名(){ 函数体代码:需要复用的代码 }声明函数的时候,不会执行函数体代码调用函数:执行函数体代码函数名()3.函数参数3.1 参数作用: 调用者 传递数据给 函数3.2 参数语法传:调用者函数名( 实参 )收:函数function 函数名( 形参 ){ 函数体 }3.3 传参原理实参给形参赋值3.4 传参注意点实参与形参数量可以不一致,但是按照顺序一一赋值每一次传参都是独立的过程,互不影响4.函数返回值4.1 返回值作用: 函数 传递数据给 调用者4.2 返回语法传:函数function 函数名( 形参 ){ 函数体; return 返回值 }收:函数let 变量名 = 函数名( 实参 )4.3 返回值注意点(1)如果函数没有return,则默认返回值是undefined(2)return关键字可以结束函数体执行, return后面的代码不会执行5.函数三个执行流程1.传参:实参给形参赋值2.执行函数体3.返回值6.函数返回值注意点(1)如果函数没有return,则默认返回值是undefined(2)return关键字可以结束函数体执行, return后面的代码不会执行对象1.对象作用一个变量存储多个数据数组:有序存储。 下标从0开始递增对象:无序存储。属性名和属性值一一对应2.对象语法声明对象let 对象名 = { 属性名:属性名 }对象取值对象名.属性名对象名['属性名']特点(1)属性名存在,则是获取属性值(2)属性名不存在,则是获取undefined对象赋值对象名.属性名 = 值对象名['属性名'] = 值特点(1)属性名存在,则是'修改'属性值(2)属性名不存在,则是新增属性3.对象遍历固定格式for-in循环for(let key in 对象名){ 对象名[key] }注意点:只能使用字符串语法取值4.环境对象 this谁调我我,我就指向谁提示: 这个this相当于中文的 ‘我’ 字, 谁说出来,就代表谁js基础PKHPKsT<Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-1-1642068154536.xml?webapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selectedBOM事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave键盘事件输入事件: oninput5.事件冒泡webapiPKВyb ??PKsT<Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-2-1642142666929.xml ?webapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selectedBOM事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave键盘事件输入事件: oninput5.事件冒泡webapiPK& q%? ?PKsT<Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-3-1642305873044.xml-@ҿwebapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selectedBOM事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave键盘事件输入事件: oninput成为焦点: onfocus失去焦点: onblur5.事件冒泡webapiPK;+2@-@PKsT<Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-4-1642500173863.xmlQMwebapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selected查节点查子元素父元素.children查兄弟元素上一个元素元素.previousElementSibling下一个元素元素.nextElementSibling查父元素元素.parentNode(1)在内存创建空标签: document.createElement('标签名')(2)设置内容(3)添加到页面dom新增到最后面: 父元素.appendChild(元素)新增到元素前面: 父元素.insertBefore( 新增元素, 哪个元素前面 )父元素.removeChild(子元素)BOM定时器1.定时器作用2.定时器语法3.定时器场景事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave键盘事件输入事件: oninput成为焦点: onfocus失去焦点: onblur5.事件冒泡webapiPK싞VMQMPKsT<Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-5-1642587802233.xmlyrwebapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selected查节点查子元素父元素.children查兄弟元素上一个元素元素.previousElementSibling下一个元素元素.nextElementSibling查父元素元素.parentNode(1)在内存创建空标签: document.createElement('标签名')(2)设置内容(3)添加到页面dom新增到最后面: 父元素.appendChild(元素)新增到元素前面: 父元素.insertBefore( 新增元素, 哪个元素前面 )父元素.removeChild(子元素)BOM定时器1.定时器作用一段代码 间隔时间 反复执行2.定时器语法永久定时器 setInterval()开启: let timeID = setInterval( 回调函数, 时间间隔 )清除: clearInterval(timeID)一次定时器 setTimeout()开启: let timeID = setTimeout( 回调函数, 时间间隔 )清除: clearTimeout(timeID)3.定时器场景一次定时器: 3s消失广告永久定时器秒杀无限轮播事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }事件源.addEventListener('事件类型',事件处理函数)3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave鼠标移动: onmousemove键盘事件输入事件: oninput实时获取输入框文本成为焦点: onfocus失去焦点: onblur键盘按下: onkeydown监听enter键键盘松开: onkeyup页面事件页面移动: window.onmousemove5.事件对象1.事件对象作用 :存储与事件相关的数据 (浏览器自动捕获鼠标坐标与键盘按键,自动存储对象)2.如何获取事件对象给事件处理函数添加形参 e3.事件对象常用属性e.pageX / e.pageY : 获取鼠标触发点 到 页面左上角距离e.key获取按键字符串 ‘Enter’ 'Tab'e.keyCode获取按键ASCII码 13e.preventDefalt()阻止form和a默认事件e.stopPropagation()阻止事件流6.事件流(事件冒泡与事件捕获)1.事件冒泡 : 触发元素事件,依次触发父级元素‘同名事件’元素->父元素->body->html->document->window2.事件捕获触发元素事件,从最顶级父元素依次往里触发‘同名事件’window->document->html->body->父元素->元素3.事件流三个阶段1.事件捕获2.事件目标3.事件冒泡7.事件委托1.事件委托 : 给父元素注册,委托给子元素处理(1)给父元素注册事件(2)判断委托子元素2.事件委托原理 : 事件冒泡3.事件委托注意点:不能用this, this指向父元素需要用e.target, 指向触发事件的子元素4.事件委托应用:动态新增元素注册事件网页特效正则webapiPKo>"~ryrPKsT<Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-6-1642761374448.xmlwebapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selected查节点查子元素父元素.children查兄弟元素上一个元素元素.previousElementSibling下一个元素元素.nextElementSibling查父元素元素.parentNode(1)在内存创建空标签: document.createElement('标签名')(2)设置内容(3)添加到页面dom新增到最后面: 父元素.appendChild(元素)新增到元素前面: 父元素.insertBefore( 新增元素, 哪个元素前面 )父元素.removeChild(子元素)BOM定时器1.定时器作用一段代码 间隔时间 反复执行2.定时器语法永久定时器 setInterval()开启: let timeID = setInterval( 回调函数, 时间间隔 )清除: clearInterval(timeID)一次定时器 setTimeout()开启: let timeID = setTimeout( 回调函数, 时间间隔 )清除: clearTimeout(timeID)3.定时器场景一次定时器: 3s消失广告永久定时器秒杀无限轮播事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }事件源.addEventListener('事件类型',事件处理函数)3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave鼠标移动: onmousemove键盘事件输入事件: oninput实时获取输入框文本成为焦点: onfocus失去焦点: onblur键盘按下: onkeydown监听enter键键盘松开: onkeyup页面事件页面移动: window.onmousemove页面滚动: window.onscroll页面滚动距离 : document.documentElement.scrollTop页面大小变化 : window.onresize页面视口宽度 : document.documentElement.clientWidth5.事件对象1.事件对象作用 :存储与事件相关的数据 (浏览器自动捕获鼠标坐标与键盘按键,自动存储对象)2.如何获取事件对象给事件处理函数添加形参 e3.事件对象常用属性e.pageX / e.pageY : 获取鼠标触发点 到 页面左上角距离e.key获取按键字符串 ‘Enter’ 'Tab'e.keyCode获取按键ASCII码 13e.preventDefalt()阻止form和a默认事件e.stopPropagation()阻止事件流6.事件流(事件冒泡与事件捕获)1.事件冒泡 : 触发元素事件,依次触发父级元素‘同名事件’元素->父元素->body->html->document->window2.事件捕获触发元素事件,从最顶级父元素依次往里触发‘同名事件’window->document->html->body->父元素->元素3.事件流三个阶段1.事件捕获2.事件目标3.事件冒泡7.事件委托1.事件委托 : 给父元素注册,委托给子元素处理(1)给父元素注册事件(2)判断委托子元素2.事件委托原理 : 事件冒泡3.事件委托注意点:不能用this, this指向父元素需要用e.target, 指向触发事件的子元素4.事件委托应用:动态新增元素注册事件网页特效offset家族获取元素 ‘自身’ 宽高与位置元素.offsetWidth / 元素.offsetHeightwidth+padding+border元素.offsetLeft / 元素.offsetTop自身 到 定位父元素 左/上 内边框距离scroll家族获取元素 ‘内容’ 宽高与位置元素.scrollWidth / 元素.scrollHeight内容宽高元素.scrollLeft / 元素.scrollTop内容位置 : 滚动条滚动的距离应用固定导航回到顶部 设置页面scrollTop为0client家族获取元素 ‘可视区域’ 宽高与位置元素.clientWidth / 元素clientHeight视口大小元素.clientLeft / 元素.clientTop左边框和上边框宽度应用:响应式(横竖屏适配)正则webapiPK3RZPKsT<Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-7-1642846874878.xmlwebapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selected查节点查子元素父元素.children查兄弟元素上一个元素元素.previousElementSibling下一个元素元素.nextElementSibling查父元素元素.parentNode(1)在内存创建空标签: document.createElement('标签名')(2)设置内容(3)添加到页面dom新增到最后面: 父元素.appendChild(元素)新增到元素前面: 父元素.insertBefore( 新增元素, 哪个元素前面 )父元素.removeChild(子元素)事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }事件源.addEventListener('事件类型',事件处理函数)3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave鼠标移动: onmousemove键盘事件输入事件: oninput实时获取输入框文本成为焦点: onfocus失去焦点: onblur键盘按下: onkeydown监听enter键键盘松开: onkeyup页面事件页面移动: window.onmousemove页面滚动: window.onscroll页面滚动距离 : document.documentElement.scrollTop页面大小变化 : window.onresize页面视口宽度 : document.documentElement.clientWidth5.事件对象1.事件对象作用 :存储与事件相关的数据 (浏览器自动捕获鼠标坐标与键盘按键,自动存储对象)2.如何获取事件对象给事件处理函数添加形参 e3.事件对象常用属性e.pageX / e.pageY : 获取鼠标触发点 到 页面左上角距离e.key获取按键字符串 ‘Enter’ 'Tab'e.keyCode获取按键ASCII码 13e.preventDefalt()阻止form和a默认事件e.stopPropagation()阻止事件流6.事件流(事件冒泡与事件捕获)1.事件冒泡 : 触发元素事件,依次触发父级元素‘同名事件’元素->父元素->body->html->document->window2.事件捕获触发元素事件,从最顶级父元素依次往里触发‘同名事件’window->document->html->body->父元素->元素3.事件流三个阶段1.事件捕获2.事件目标3.事件冒泡7.事件委托1.事件委托 : 给父元素注册,委托给子元素处理(1)给父元素注册事件(2)判断委托子元素2.事件委托原理 : 事件冒泡3.事件委托注意点:不能用this, this指向父元素需要用e.target, 指向触发事件的子元素4.事件委托应用:动态新增元素注册事件网页特效offset家族获取元素 ‘自身’ 宽高与位置元素.offsetWidth / 元素.offsetHeightwidth+padding+border元素.offsetLeft / 元素.offsetTop自身 到 定位父元素 左/上 内边框距离scroll家族获取元素 ‘内容’ 宽高与位置元素.scrollWidth / 元素.scrollHeight内容宽高元素.scrollLeft / 元素.scrollTop内容位置 : 滚动条滚动的距离应用固定导航回到顶部 设置页面scrollTop为0client家族获取元素 ‘可视区域’ 宽高与位置元素.clientWidth / 元素clientHeight视口大小元素.clientLeft / 元素.clientTop左边框和上边框宽度应用:响应式(横竖屏适配)BOM1.定时器1.定时器作用一段代码 间隔时间 反复执行2.定时器语法永久定时器 setInterval()开启: let timeID = setInterval( 回调函数, 时间间隔 )清除: clearInterval(timeID)一次定时器 setTimeout()开启: let timeID = setTimeout( 回调函数, 时间间隔 )清除: clearTimeout(timeID)3.定时器场景一次定时器: 3s消失广告永久定时器秒杀无限轮播2.五大对象window:浏览器窗口特点1.是js中的顶级对象, 所有的全局函数,对象都是window里面的成员2.window的成员使用时可以省略window3.window的top属性不能作为变量名方法打开窗口: window.open()关闭窗口: window.close()事件window.onload事件(入口函数)DOM树 + 外部资源 加载完毕后执行window.onbeforeunload事件(关闭事件)页面关闭的时候执行,一般用于存储数据location : 地址栏跳转网页 location.href = 'url'location.assign('url') : 跳转location.replace('url') : 替换(不能回退)location.reload() : 刷新history : 历史记录history.back() : 回退一页history.forward() : 前进一页history.go( 数字 )负数 : 回退 -1页 -2页0 : 刷新正数: 前进 1页 2页navigator : 用户信息(了解)naviagtor.userAgentscreen : 用户电脑屏幕(了解)3.存储器 localStorage与sessionStorage1.作用一致:都是存储数据存储大小: 5MB只能存储字符串2.语法一致:设置:setItem('属性名',属性值)获取: getItem('属性名)删除: removeItem('属性名)清空: clear()3.面试点:两者区别localStorage : 硬盘存储sessionStorage:内存存储正则webapiPK=3PKsT<Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-8-1642933654001.xmlwebapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selected查节点查子元素父元素.children查兄弟元素上一个元素元素.previousElementSibling下一个元素元素.nextElementSibling查父元素元素.parentNode(1)在内存创建空标签: document.createElement('标签名')(2)设置内容(3)添加到页面dom新增到最后面: 父元素.appendChild(元素)新增到元素前面: 父元素.insertBefore( 新增元素, 哪个元素前面 )父元素.removeChild(子元素)事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }事件源.addEventListener('事件类型',事件处理函数)3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave鼠标移动: onmousemove键盘事件输入事件: oninput实时获取输入框文本成为焦点: onfocus失去焦点: onblur键盘按下: onkeydown监听enter键键盘松开: onkeyup页面事件页面移动: window.onmousemove页面滚动: window.onscroll页面滚动距离 : document.documentElement.scrollTop页面大小变化 : window.onresize页面视口宽度 : document.documentElement.clientWidth5.事件对象1.事件对象作用 :存储与事件相关的数据 (浏览器自动捕获鼠标坐标与键盘按键,自动存储对象)2.如何获取事件对象给事件处理函数添加形参 e3.事件对象常用属性e.pageX / e.pageY : 获取鼠标触发点 到 页面左上角距离e.key获取按键字符串 ‘Enter’ 'Tab'e.keyCode获取按键ASCII码 13e.preventDefalt()阻止form和a默认事件e.stopPropagation()阻止事件流6.事件流(事件冒泡与事件捕获)1.事件冒泡 : 触发元素事件,依次触发父级元素‘同名事件’元素->父元素->body->html->document->window2.事件捕获触发元素事件,从最顶级父元素依次往里触发‘同名事件’window->document->html->body->父元素->元素3.事件流三个阶段1.事件捕获2.事件目标3.事件冒泡7.事件委托1.事件委托 : 给父元素注册,委托给子元素处理(1)给父元素注册事件(2)判断委托子元素2.事件委托原理 : 事件冒泡3.事件委托注意点:不能用this, this指向父元素需要用e.target, 指向触发事件的子元素4.事件委托应用:动态新增元素注册事件网页特效offset家族获取元素 ‘自身’ 宽高与位置元素.offsetWidth / 元素.offsetHeightwidth+padding+border元素.offsetLeft / 元素.offsetTop自身 到 定位父元素 左/上 内边框距离scroll家族获取元素 ‘内容’ 宽高与位置元素.scrollWidth / 元素.scrollHeight内容宽高元素.scrollLeft / 元素.scrollTop内容位置 : 滚动条滚动的距离应用固定导航回到顶部 设置页面scrollTop为0client家族获取元素 ‘可视区域’ 宽高与位置元素.clientWidth / 元素clientHeight视口大小元素.clientLeft / 元素.clientTop左边框和上边框宽度应用:响应式(横竖屏适配)BOM1.定时器1.定时器作用一段代码 间隔时间 反复执行2.定时器语法永久定时器 setInterval()开启: let timeID = setInterval( 回调函数, 时间间隔 )清除: clearInterval(timeID)一次定时器 setTimeout()开启: let timeID = setTimeout( 回调函数, 时间间隔 )清除: clearTimeout(timeID)3.定时器场景一次定时器: 3s消失广告永久定时器秒杀无限轮播2.五大对象window:浏览器窗口特点1.是js中的顶级对象, 所有的全局函数,对象都是window里面的成员2.window的成员使用时可以省略window3.window的top属性不能作为变量名方法打开窗口: window.open()关闭窗口: window.close()事件window.onload事件(入口函数)DOM树 + 外部资源 加载完毕后执行window.onbeforeunload事件(关闭事件)页面关闭的时候执行,一般用于存储数据location : 地址栏跳转网页 location.href = 'url'location.assign('url') : 跳转location.replace('url') : 替换(不能回退)location.reload() : 刷新history : 历史记录history.back() : 回退一页history.forward() : 前进一页history.go( 数字 )负数 : 回退 -1页 -2页0 : 刷新正数: 前进 1页 2页navigator : 用户信息(了解)naviagtor.userAgentscreen : 用户电脑屏幕(了解)3.存储器 localStorage与sessionStorage1.作用一致:都是存储数据存储大小: 5MB只能存储字符串2.语法一致:设置:setItem('属性名',属性值)获取: getItem('属性名)删除: removeItem('属性名)清空: clear()3.面试点:两者区别localStorage : 硬盘存储sessionStorage:内存存储正则1. 正则是 对字符串进行匹配运算 的对象2.作用 : 对字符串进行匹配运算文本格式校验手机号验证码账号6-203.语法(1)声明 new RegExp('正则')/正则/(2)校验test() true:通过 false:不通过元字符[][^].\^$?*+{}()|字符类预定义类 \d : 数字 \w : 字母+数字+下划线_边界 严格匹配: /^$/量词分组webapiPKT)PKsT<Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-9-1645203194632.xmlwebapi-1webapi1.前端三老铁HTML: 确定结构CSS : 确定样式JS : 确定交互2. JS组成三部分ECMAScript : 确定js的语法规范DOMdocument object model : 操作(增删改查)网页内容BOM操作浏览器窗口3. web = dom + bom 一套操作网页内容+浏览器窗口的 函数参数功能返回值DOM增删改查查元素document.querySelector('选择器')/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'/* 学习目标: 两个查询函数语法 1.获取单个元素 : document.querySelector('选择器') 2.获取多个元素 : document.querySelectorAll('选择器') 3.两者区别 querySelector() : 得到dom对象, 可以直接使用dom语法修改 querySelectorAll() : 得到数组, 不可以直接使用dom语法。 需要通过下标先取出里面的dom对象 */ /** * @description: 获取满足条件的第一个元素 * @param {string} 选择器字符串 * @return: dom对象 | null */ let box = document.querySelector('.box') console.log( box ) /** * @description: 获取满足条件 所有元素 * @param {string} 选择器字符串 * @return: 一定是伪数组 (有三要素下标、元素、长度。 但是没有数组方法 ) */ let boxList = document.querySelectorAll('.box') console.log( boxList ) document.querySelectorAll('.box')[0].style.backgroundColor = 'red'document.querySelectorAll('选择器')两者区别querySelector() : 得到dom对象, 直接使用dom语法querySelectorAll() : 得到数组,不能直接使用dom语法。 一定要通过下标取出里面的dom对象,才可以使用dom语法查元素属性内容属性元素.innerText : 获取文本元素.innerHTML : 获取文本 + 标签HTML属性元素.属性名改图片:img.src改链接:a.hrefCSS属性单个修改: 元素.style.样式名 = 样式值多个修改: 元素.className = '类名'classList语法新增: 元素.classList.add('类名')移除: 元素.classList.remove('类名')切换: 元素.classList.toggle('类名')有则移除,无则新增有则移除,无则新增注意点:如果css属性有-,需要转小驼峰。(1)去掉- (2)-后面首字母大写css行内权重表单属性表单值(输入框文本)元素.value表单状态(布尔)是否禁用元素.disabled是否选中(radio与checkbox)元素.checked是否选中(option)元素.selected查节点查子元素父元素.children查兄弟元素上一个元素元素.previousElementSibling下一个元素元素.nextElementSibling查父元素元素.parentNode(1)在内存创建空标签: document.createElement('标签名')(2)设置内容(3)添加到页面dom新增到最后面: 父元素.appendChild(元素)新增到元素前面: 父元素.insertBefore( 新增元素, 哪个元素前面 )父元素.removeChild(子元素)事件1.事件交互 三要素1. 事件源 : 什么元素2.事件类型 : 什么时刻3.事件处理函数2.注册事件事件源.事件类型 = 事件处理函数box.onclick = function(){ }事件源.addEventListener('事件类型',事件处理函数)3.事件注意点3.1 事件注册的时候不会执行。 (函数声明的时候不执行)3.2 用户触发事件,浏览器捕捉交互,自动帮我们调用事件处理函数 (浏览器自动调用函数)4.事件类型鼠标事件鼠标单击: onclick鼠标双击: ondblclick鼠标移入: onmouseenter鼠标移出: onmouseleave鼠标移动: onmousemove键盘事件输入事件: oninput实时获取输入框文本成为焦点: onfocus失去焦点: onblur键盘按下: onkeydown监听enter键键盘松开: onkeyup页面事件页面移动: window.onmousemove页面滚动: window.onscroll页面滚动距离 : document.documentElement.scrollTop页面大小变化 : window.onresize页面视口宽度 : document.documentElement.clientWidth5.事件对象1.事件对象作用 :存储与事件相关的数据 (浏览器自动捕获鼠标坐标与键盘按键,自动存储对象)2.如何获取事件对象给事件处理函数添加形参 e3.事件对象常用属性e.pageX / e.pageY : 获取鼠标触发点 到 页面左上角距离e.key获取按键字符串 ‘Enter’ 'Tab'e.keyCode获取按键ASCII码 13e.preventDefalt()阻止form和a默认事件e.stopPropagation()阻止事件流6.事件流(事件冒泡与事件捕获)1.事件冒泡 : 触发元素事件,依次触发父级元素‘同名事件’元素->父元素->body->html->document->window2.事件捕获触发元素事件,从最顶级父元素依次往里触发‘同名事件’window->document->html->body->父元素->元素3.事件流三个阶段1.事件捕获2.事件目标3.事件冒泡7.事件委托1.事件委托 : 给父元素注册,委托给子元素处理(1)给父元素注册事件(2)判断委托子元素2.事件委托原理 : 事件冒泡3.事件委托注意点:不能用this, this指向父元素需要用e.target, 指向触发事件的子元素4.事件委托应用:动态新增元素注册事件网页特效offset家族获取元素 ‘自身’ 宽高与位置元素.offsetWidth / 元素.offsetHeightwidth+padding+border元素.offsetLeft / 元素.offsetTop自身 到 定位父元素 左/上 内边框距离scroll家族获取元素 ‘内容’ 宽高与位置元素.scrollWidth / 元素.scrollHeight内容宽高元素.scrollLeft / 元素.scrollTop内容位置 : 滚动条滚动的距离应用固定导航回到顶部 设置页面scrollTop为0client家族获取元素 ‘可视区域’ 宽高与位置元素.clientWidth / 元素clientHeight视口大小元素.clientLeft / 元素.clientTop左边框和上边框宽度应用:响应式(横竖屏适配)BOM1.定时器1.定时器作用一段代码 间隔时间 反复执行2.定时器语法永久定时器 setInterval()开启: let timeID = setInterval( 回调函数, 时间间隔 )清除: clearInterval(timeID)一次定时器 setTimeout()开启: let timeID = setTi73meout( 回调函数, 时间间隔 )清除: clearTimeout(timeID)3.定时器场景一次定时器: 3s消失广告永久定时器秒杀无限轮播2.五大对象window:浏览器窗口特点1.是js中的顶级对象, 所有的全局函数,对象都是window里面的成员2.window的成员使用时可以省略window3.window的top属性不能作为变量名方法打开窗口: window.open()关闭窗口: window.close()事件window.onload事件(入口函数)DOM树 + 外部资源 加载完毕后执行window.onbeforeunload事件(关闭事件)页面关闭的时候执行,一般用于存储数据location : 地址栏跳转网页 location.href = 'url'location.assign('url') : 跳转location.replace('url') : 替换(不能回退)location.reload() : 刷新history : 历史记录history.back() : 回退一页history.forward() : 前进一页history.go( 数字 )负数 : 回退 -1页 -2页0 : 刷新正数: 前进 1页 2页navigator : 用户信息(了解)naviagtor.userAgentscreen : 用户电脑屏幕(了解)3.存储器 localStorage与sessionStorage1.作用一致:都是存储数据存储大小: 5MB只能存储字符串2.语法一致:设置:setItem('属性名',属性值)获取: getItem('属性名)删除: removeItem('属性名)清空: clear()3.面试点:两者区别localStorage : 硬盘存储sessionStorage:内存存储正则1. 正则是 对字符串进行匹配运算 的对象2.作用 : 对字符串进行匹配运算文本格式校验手机号验证码账号6-203.语法(1)声明 new RegExp('正则')/正则/(2)校验test() true:通过 false:不通过元字符[][^].\^$?*+{}()|字符类预定义类 \d : 数字 \w : 字母+数字+下划线_边界 严格匹配: /^$/量词分组webapiPK1cA7PKsT<Revisions/215ms6619c167umkvuiscq179u/rev-1-1641895051970.xmlG前端飞升之路01-移动Web02-JS基础03-WebApi04-js高级05-ajax06-项目07-nodejs08-vue09-项目10-react前端三层:HTML CSS JS服务器交互企业框架如何写好总结?1.知识点三要素1.作用学习的目的是为了解决今后开发中的问题,如果对知识点作用不清晰,那么用的时候很难想起来2.语法语法是代码的根本,必须要非常的熟悉。 如果语法不清晰,不知道怎么写。 那么很有可能就是自身花的时间和精力不够。 语法不熟悉也可以作为一个学习状态的预警。3.应用场景/注意点 应用场景是由作用决定的。 有的语法,属于用的特别多的。 应用场景可以不用单独写 有的语法,用的很少,可能存在一些特定的应用场景。 这个时候就需要单独写总结注意点决定bug解决能力有的语法在书写的时候由于一些细节,很容易出现bug。 这个时候就需要单独总结,否则今后出现bug,可能我们连原因都找不到2.写总结术语1.应用型知识点1.作用格式1: 主语 用于解决 问题描述示例1 : 前端大总结PKLGPKsT<Revisions/215ms6619c167umkvuiscq179u/rev-2-1641897152517.xml'W前端飞升之路01-移动Web02-JS基础03-WebApi04-js高级05-ajax06-项目07-nodejs08-vue09-项目10-react前端三层:HTML CSS JS服务器交互企业框架如何写好总结?1.知识点三要素1.作用学习的目的是为了解决今后开发中的问题,如果对知识点作用不清晰,那么用的时候很难想起来2.语法语法是代码的根本,必须要非常的熟悉。 如果语法不清晰,不知道怎么写。 那么很有可能就是自身花的时间和精力不够。 语法不熟悉也可以作为一个学习状态的预警。3.应用场景/注意点 应用场景是由作用决定的。 有的语法,属于用的特别多的。 应用场景可以不用单独写 有的语法,用的很少,可能存在一些特定的应用场景。 这个时候就需要单独写总结注意点决定bug解决能力有的语法在书写的时候由于一些细节,很容易出现bug。 这个时候就需要单独总结,否则今后出现bug,可能我们连原因都找不到2.写总结术语1.应用型知识点1.作用格式: 主语 的作用是 功能描述示例 : 多分支语法 的作用是 多个条件判断2.语法可通过备注的方式添加语法 if(条件1){ 条件1成立时需要执行的代码 }else if(条件2){ 条件2成立时需要执行的代码 }else if(条件3){ 条件2成立时需要执行的代码 } ..... else{ 如果前面所有条件都不满足,则执行else代码 } 注意点 (1)多分支所有的大括号代码最多只会执行一个,只有当前面的条件不满足,才会进入后面的条件判断 (2)多分支一定要以if开头,后面else if可以多个,结尾else可以省语法 if(条件1){ 条件1成立时需要执行的代码 }else if(条件2){ 条件2成立时需要执行的代码 }else if(条件3){ 条件2成立时需要执行的代码 } ..... else{ 如果前面所有条件都不满足,则执行else代码 } 注意点 (1)多分支所有的大括号代码最多只会执行一个,只有当前面的条件不满足,才会进入后面的条件判断 (2)多分支一定要以if开头,后面else if可以多个,结尾else可以省3.应用场景/注意点示例 : if-else if-else多分支语句注意点: 只有上面条件不成立,才会执行下面的条件判断2.理论概念性知识点1.作用格式:主语 谓语/形容词 宾语示例: 作用域 是 变量可以使用的范围主语:作用域宾语:范围形容语: 变量可以使用前端大总结PKYu''PKsT<Revisions/215ms6619c167umkvuiscq179u/rev-3-1642068154467.xml(前端飞升之路01-移动Web02-JS基础03-WebApi04-js高级05-ajax06-项目07-nodejs08-vue09-项目10-react前端三层:HTML CSS JS服务器交互企业框架如何写好总结?1.知识点三要素1.作用学习的目的是为了解决今后开发中的问题,如果对知识点作用不清晰,那么用的时候很难想起来2.语法语法是代码的根本,必须要非常的熟悉。 如果语法不清晰,不知道怎么写。 那么很有可能就是自身花的时间和精力不够。 语法不熟悉也可以作为一个学习状态的预警。3.应用场景/注意点 应用场景是由作用决定的。 有的语法,属于用的特别多的。 应用场景可以不用单独写 有的语法,用的很少,可能存在一些特定的应用场景。 这个时候就需要单独写总结注意点决定bug解决能力有的语法在书写的时候由于一些细节,很容易出现bug。 这个时候就需要单独总结,否则今后出现bug,可能我们连原因都找不到2.写总结术语1.应用型知识点1.作用格式: 主语 的作用是 功能描述示例 : 多分支语法 的作用是 多个条件判断2.语法可通过备注的方式添加语法 if(条件1){ 条件1成立时需要执行的代码 }else if(条件2){ 条件2成立时需要执行的代码 }else if(条件3){ 条件2成立时需要执行的代码 } ..... else{ 如果前面所有条件都不满足,则执行else代码 } 注意点 (1)多分支所有的大括号代码最多只会执行一个,只有当前面的条件不满足,才会进入后面的条件判断 (2)多分支一定要以if开头,后面else if可以多个,结尾else可以省语法 if(条件1){ 条件1成立时需要执行的代码 }else if(条件2){ 条件2成立时需要执行的代码 }else if(条件3){ 条件2成立时需要执行的代码 } ..... else{ 如果前面所有条件都不满足,则执行else代码 } 注意点 (1)多分支所有的大括号代码最多只会执行一个,只有当前面的条件不满足,才会进入后面的条件判断 (2)多分支一定要以if开头,后面else if可以多个,结尾else可以省3.应用场景/注意点示例 : if-else if-else多分支语句注意点: 只有上面条件不成立,才会执行下面的条件判断2.理论概念性知识点1.作用格式:主语 谓语/形容词 宾语示例: 作用域 是 变量可以使用的范围主语:作用域宾语:范围形容语: 变量可以使用前端大总结PKO ((PKsT<Revisions/215ms6619c167umkvuiscq179u/rev-4-1647249811219.xml5(前端飞升之路01-移动Web02-JS基础03-WebApi04-js高级05-ajax06-项目07-nodejs08-vue09-项目10-react前端三层:HTML CSS JS服务器交互企业框架如何写好总结?1.知识点三要素1.作用学习的目的是为了解决今后开发中的问题,如果对知识点作用不清晰,那么用的时候很难想起来2.语法语法是代码的根本,必须要非常的熟悉。 如果语法不清晰,不知道怎么写。 那么很有可能就是自身花的时间和精力不够。 语法不熟悉也可以作为一个学习状态的预警。3.应用场景/注意点 应用场景是由作用决定的。 有的语法,属于用的特别多的。 应用场景可以不用单独写 有的语法,用的很少,可能存在一些特定的应用场景。 这个时候就需要单独写总结注意点决定bug解决能力有的语法在书写的时候由于一些细节,很容易出现bug。 这个时候就需要单独总结,否则今后出现bug,可能我们连原因都找不到2.写总结术语1.应用型知识点1.作用格式: 主语 的作用是 功能描述示例 : 多分支语法 的作用是 多个条件判断2.语法可通过备注的方式添加语法 if(条件1){ 条件1成立时需要执行的代码 }else if(条件2){ 条件2成立时需要执行的代码 }else if(条件3){ 条件2成立时需要执行的代码 } ..... else{ 如果前面所有条件都不满足,则执行else代码 } 注意点 (1)多分支所有的大括号代码最多只会执行一个,只有当前面的条件不满足,才会进入后面的条件判断 (2)多分支一定要以if开头,后面else if可以多个,结尾else可以省语法 if(条件1){ 条件1成立时需要执行的代码 }else if(条件2){ 条件2成立时需要执行的代码 }else if(条件3){ 条件2成立时需要执行的代码 } ..... else{ 如果前面所有条件都不满足,则执行else代码 } 注意点 (1)多分支所有的大括号代码最多只会执行一个,只有当前面的条件不满足,才会进入后面的条件判断 (2)多分支一定要以if开头,后面else if可以多个,结尾else可以省3.应用场景/注意点示例 : if-else if-else多分支语句注意点: 只有上面条件不成立,才会执行下面的条件判断2.理论概念性知识点1.作用格式:主语 谓语/形容词 宾语示例: 作用域 是 变量可以使用的范围主语:作用域宾语:范围形容语: 变量可以使用前端大总结PK W:(5(PKsT<Revisions/3qslg5ttc9dc93lf408u4055dt/rev-1-1647249811284.xml")ajax-11.前后端交互流程1.了解服务器 : 提供某种服务器的机器(计算机)qq音乐音频服务器迅雷文件服务器qq邮箱邮件服务器爱奇艺视频服务器谷歌web服务器2. 了解前端 访问 服务器的几种方式1. 直接在地址栏输入网址2. a标签的href属性3. location.href = 'url'4. AJAX网页不会跳转网页会跳转( 全局刷新 )3. 了解什么是ajax (1) ajax技术 : 在网页不跳转的情况下 向服务器请求数据 (2)ajax应用场景: 局部刷新4. 前后端交互三个流程1. 请求 (前端)2.处理 (后端)3.响应(后端)2.ajax工作原理(1)创建xhr对象let xhr = new XMLHttpRequest()(2)设置请求方法和地址xhr.open('请求方法','请求地址')(3)发送请求xhr.send()(4)注册响应事件xhr.onload = function(){}3.HTTP工作原理(本阶段常见面试点)1. get与post区别a.传参方式不同get请求直接在url传参'url?key=value'post在请求体传参 xhr.send('key=value')xhr.setReauestHeader('Content-type','application/x-www-form-urlencoded')4.实战案例1. 新闻列表后台给的img网址有可能会省略前面的域名, 需要自己加上ajaxPKm""PKsT<Revisions/3qslg5ttc9dc93lf408u4055dt/rev-2-1647337991750.xmlX'ajax-11.前后端交互流程1.了解服务器 : 提供某种服务器的机器(计算机)qq音乐音频服务器迅雷文件服务器qq邮箱邮件服务器爱奇艺视频服务器谷歌web服务器2. 了解前端 访问 服务器的几种方式1. 直接在地址栏输入网址2. a标签的href属性3. location.href = 'url'4. AJAX网页不会跳转网页会跳转( 全局刷新 )3. 了解什么是ajax (1) ajax技术 : 在网页不跳转的情况下 向服务器请求数据 (2)ajax应用场景: 局部刷新4. 前后端交互三个流程1. 请求 (前端)2.处理 (后端)3.响应(后端)2.ajax工作原理(1)创建xhr对象let xhr = new XMLHttpRequest()(2)设置请求方法和地址xhr.open('请求方法','请求地址')(3)发送请求xhr.send()(4)注册响应事件xhr.onload = function(){}3.HTTP工作原理(本阶段常见面试点)1. get与post区别a.传参方式不同get请求直接在url传参'url?key=value'post在请求体传参 xhr.send('key=value')xhr.setReauestHeader('Content-type','application/x-www-form-urlencoded')4.实战案例1. 新闻列表后台给的img网址有可能会省略前面的域名, 需要自己加上2.水果详情 : url跳转传参原理: 一个完整的url跳转由路径决定,参数不影响跳转http://域名/detail.html? id = 1http://域名/detail.html? id = 2这两个url虽然不一样,但是路径是一致的,只是参数不同。所以还是跳转同一个页面3.网络请求loading实现思路ajaxPK]'X'PKsT<Revisions/3qslg5ttc9dc93lf408u4055dt/rev-3-1647511930369.xml=Dajax-11.前后端交互流程1.了解服务器 : 提供某种服务器的机器(计算机)qq音乐音频服务器迅雷文件服务器qq邮箱邮件服务器爱奇艺视频服务器谷歌web服务器2. 了解前端 访问 服务器的几种方式1. 直接在地址栏输入网址2. a标签的href属性3. location.href = 'url'4. AJAX网页不会跳转网页会跳转( 全局刷新 )3. 了解什么是ajax (1) ajax技术 : 在网页不跳转的情况下 向服务器请求数据 (2)ajax应用场景: 局部刷新4. 前后端交互三个流程1. 请求 (前端)2.处理 (后端)3.响应(后端)2.ajax工作原理1.ajax工作流程(1)创建xhr对象let xhr = new XMLHttpRequest()(2)设置请求方法和地址xhr.open('请求方法','请求地址')(3)发送请求xhr.send()(4)注册响应事件xhr.onload = function(){}2. xhr对象的请求状态码0: 请求未初始化 (open之前)1: 服务器连接已建立 (open之后)2: 请求已接收 ( 服务器已经收到你的请求 )3: 请求处理中 ( 服务器正在处理你的请求 )4: 请求已完成,且响应已就绪 ( 服务器完成响应, onload事件就是在这里执行 )3.ajax组成部分Ajax(阿贾克斯):全称 Asynchronous Javascript And XML(异步的js与xml)说人话: 用js发送异步的网络请求A : Asynchronous 异步同步 : 指的是代码按照从上往下顺序执行异步 : 代码不会立即执行,而是要等一会儿执行目前我们学过的ECMAScript只有两个语法是异步的: 定时器 与 ajaxDOM事件也是属于异步的,但是这个是属于DOM的执行机制。所以一般在讨论js同步和异步的时候,主要以js为主,DOM一般不讨论。J:JavascriptA :AndX : XML 与 XMLHttpRequestXML : 解决跨平台数据传输。在JSON没有出来以前, 网络传输主要以XML格式数据为主。 后来JSON问世,逐渐取代XML。3.HTTP工作原理(本阶段常见面试点)1. get与post区别a.传参方式不同get请求直接在url传参'url?key=value'post在请求体传参 xhr.send('key=value')xhr.setReauestHeader('Content-type','application/x-www-form-urlencoded')2. 数据大小不同 * get有大小限制, 一般 2-5 MB * post没有大小限制 (文件上传)3. 传输速度不同 * get传输速度快 * post传输速度慢 4. 安全性不同 * get安全性低 * post安全性高 (登录、注册必须是post请求)2. put与patch区别全局更新: put局部更新: patch4.实战案例1. 新闻列表后台给的img网址有可能会省略前面的域名, 需要自己加上2.水果详情 : url跳转传参原理: 一个完整的url跳转由路径决定,参数不影响跳转http://域名/detail.html? id = 1http://域名/detail.html? id = 2这两个url虽然不一样,但是路径是一致的,只是参数不同。所以还是跳转同一个页面3.网络请求loading实现思路ajaxPK[==PKsT<Revisions/3qslg5ttc9dc93lf408u4055dt/rev-4-1647599002940.xmle,ajax-11.前后端交互流程1.了解服务器 : 提供某种服务器的机器(计算机)qq音乐音频服务器迅雷文件服务器qq邮箱邮件服务器爱奇艺视频服务器谷歌web服务器2. 了解前端 访问 服务器的几种方式1. 直接在地址栏输入网址2. a标签的href属性3. location.href = 'url'4. AJAX网页不会跳转网页会跳转( 全局刷新 )3. 了解什么是ajax (1) ajax技术 : 在网页不跳转的情况下 向服务器请求数据 (2)ajax应用场景: 局部刷新4. 前后端交互三个流程1. 请求 (前端)2.处理 (后端)3.响应(后端)2.ajax工作原理1.ajax工作流程(1)创建xhr对象let xhr = new XMLHttpRequest()(2)设置请求方法和地址xhr.open('请求方法','请求地址')(3)发送请求xhr.send()(4)注册响应事件xhr.onload = function(){}2. xhr对象的请求状态码0: 请求未初始化 (open之前)1: 服务器连接已建立 (open之后)2: 请求已接收 ( 服务器已经收到你的请求 )3: 请求处理中 ( 服务器正在处理你的请求 )4: 请求已完成,且响应已就绪 ( 服务器完成响应, onload事件就是在这里执行 )3.ajax组成部分Ajax(阿贾克斯):全称 Asynchronous Javascript And XML(异步的js与xml)说人话: 用js发送异步的网络请求A : Asynchronous 异步同步 : 指的是代码按照从上往下顺序执行异步 : 代码不会立即执行,而是要等一会儿执行目前我们学过的ECMAScript只有两个语法是异步的: 定时器 与 ajaxDOM事件也是属于异步的,但是这个是属于DOM的执行机制。所以一般在讨论js同步和异步的时候,主要以js为主,DOM一般不讨论。J:JavascriptA :AndX : XML 与 XMLHttpRequestXML : 解决跨平台数据传输。在JSON没有出来以前, 网络传输主要以XML格式数据为主。 后来JSON问世,逐渐取代XML。3.HTTP工作原理(本阶段常见面试点)1. get与post区别a.传参方式不同get请求直接在url传参'url?key=value'post在请求体传参 xhr.send('key=value')xhr.setReauestHeader('Content-type','application/x-www-form-urlencoded')2. 数据大小不同 * get有大小限制, 一般 2-5 MB * post没有大小限制 (文件上传)3. 传输速度不同 * get传输速度快 * post传输速度慢4. 安全性不同 * get安全性低 * post安全性高 (登录、注册必须是post请求)2. put与patch区别全局更新: put局部更新: patch3.HTTP原理 : 网络传输协议发送请求 : 请求报文请求行请求地址 + 请求方法请求头浏览器告诉服务器,发给你的数据是什么格式Content-type: application/x-www-form-urlencoded请求体请求参数响应请求: 响应报文响应行响应状态码2xx : 成功200成功3xx : 重定向302 重定向4xx : 前端问题400参数错误 403没有权限 404 路径错误 413文件超过最大限制5xx : 服务器问题500服务器内部错误服务器ip地址响应头服务器告诉浏览器,发给你的数据是什么格式Content-Type: application/json; charset=utf-8响应体响应数据4. 发送ajax原理:: 发送请求报文5. 网页从输入url到渲染的流程1. DNS解析 域名解析成ip2. TCP三次握手保证数据传输的 安全 + 可靠3.HTTP连接请求处理响应4.渲染引擎渲染返回的HTML文件6.函数防抖和节流防抖单位时间内,频繁触发事件。 以最后一次为准应用: 输入框输入事件流程 : 节流单位时间内,频繁触发事件。只触发一次应用:解决高频事件( 滚动条事件 )流程 :4.实战案例1. 新闻列表后台给的img网址有可能会省略前面的域名, 需要自己加上2.水果详情 : url跳转传参原理: 一个完整的url跳转由路径决定,参数不影响跳转http://域名/detail.html? id = 1http://域名/detail.html? id = 2这两个url虽然不一样,但是路径是一致的,只是参数不同。所以还是跳转同一个页面3.网络请求loading实现思路4.文件上传(1)创建FormData对象,将文件添加到FormData对象let fd = new FormData()fd.append('参数名', 文件 )(2)ajax发送请求请求体就是 fd(1)自动设置请求头 为 文件请求头(2)自动将文件转为二进制5.文件预览ajaxPK5(eePKsT<Revisions/5728fou9ciqnams3veghe08grr/rev-1-1642068154536.xmlzjs高级js高级PK>zPKsT<Revisions/5728fou9ciqnams3veghe08grr/rev-2-1643100091541.xml:\js高级-11.面向对象1.面向对象1. 面向对象 是注重结果 思维方式面向过程: 注重过程面向对象: 注重结果2. 面向对象本质是对面向过程的封装2.内置对象数组对象/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20字符串let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你3.构造函数new原理1.工厂函数和构造函数工厂函数: 用于创建对象的 函数构造函数 : new 调用的函数通途一致:都是创建对象2.new关键字原理4个步骤a.创建空对象b.this指向这个对象c.对象赋值d.返回这个对象3.构造函数内部使用returnreturn 值类型。 无效,返回new创建的对象return 引用类型。 有效,覆盖new创建的对象4.原型对象1.原型对象 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。2.作用内存资源浪费 + 全局变量污染3.构造函数、原型对象、实例对象的关系构造函数: 有一个prototype属性, 指向原型对象原型对象 : 有一个constructor属性,指向构造函数实例对象 : 有一个__proto__属性,指向原型对象2.函数进阶3.ES6新语法js高级PK \ܨ::PKsT<Revisions/5728fou9ciqnams3veghe08grr/rev-3-1644395987143.xmlBPjs高级-11.面向对象1.面向对象1. 面向对象 是注重结果 思维方式面向过程: 注重过程面向对象: 注重结果2. 面向对象本质是对面向过程的封装2.内置对象数组对象/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20字符串let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你3.构造函数new原理1.工厂函数和构造函数工厂函数: 用于创建对象的 函数构造函数 : new 调用的函数通途一致:都是创建对象2.new关键字原理4个步骤a.创建空对象b.this指向这个对象c.对象赋值d.返回这个对象3.构造函数内部使用returnreturn 值类型。 无效,返回new创建的对象return 引用类型。 有效,覆盖new创建的对象4.原型对象1.原型对象 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。2.作用内存资源浪费 + 全局变量污染3.构造函数、原型对象、实例对象的关系构造函数: 有一个prototype属性, 指向原型对象原型对象 : 有一个constructor属性,指向构造函数实例对象 : 有一个__proto__属性,指向原型对象5.原型链原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构对象访问原型链规则 : 就近原则先访问自己,自己没有找原型,原型没有找原型的原型,此类类推直到原型链终点null. 如果还没有,属性则获取undefined, 方法则报错xxx is not funtion原型链 : 继承2.函数进阶3.ES6新语法1.class类函数 : 相当于构造函数class关键字 : 构造函数extends关键字 : 原型继承super关键字 : 子类中调用父类的方法js高级PKG9BBPKsT<Revisions/5728fou9ciqnams3veghe08grr/rev-4-1644485836931.xmlK$js高级-11.面向对象1.面向对象1. 面向对象 是注重结果 思维方式面向过程: 注重过程面向对象: 注重结果2. 面向对象本质是对面向过程的封装2.内置对象数组对象/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20字符串let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你3.构造函数new原理1.工厂函数和构造函数工厂函数: 用于创建对象的 函数构造函数 : new 调用的函数通途一致:都是创建对象2.new关键字原理4个步骤a.创建空对象b.this指向这个对象c.对象赋值d.返回这个对象3.构造函数内部使用returnreturn 值类型。 无效,返回new创建的对象return 引用类型。 有效,覆盖new创建的对象4.原型对象1.原型对象 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。2.作用内存资源浪费 + 全局变量污染3.构造函数、原型对象、实例对象的关系构造函数: 有一个prototype属性, 指向原型对象原型对象 : 有一个constructor属性,指向构造函数实例对象 : 有一个__proto__属性,指向原型对象5.原型链原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构对象访问原型链规则 : 就近原则先访问自己,自己没有找原型,原型没有找原型的原型,此类类推直到原型链终点null. 如果还没有,属性则获取undefined, 方法则报错xxx is not funtion原型链 : 继承2.函数进阶1.this指向普通函数 函数名() : this指向window对象方法 对象名.方法名() : this指向对象构造函数 new 函数名(): this指向new创建的实例对象2.函数上下文调用伪数组转真数组 : Array.from(伪数组)数组求最大值: Math.max(...数组名)3.闭包闭包 = 函数 + 上下文引用作用: 解决变量污染4.递归函数内部调用自己作用: 遍历dom树 + 深拷贝3.ES6新语法1.class类函数 : 相当于构造函数class关键字 : 构造函数extends关键字 : 原型继承super关键字 : 子类中调用父类的方法js高级PK0hOKKPKsT<Revisions/5728fou9ciqnams3veghe08grr/rev-5-1646733982704.xml Ljs高级-11.面向对象1.面向对象1. 面向对象 是注重结果 思维方式面向过程: 注重过程面向对象: 注重结果2. 面向对象本质是对面向过程的封装2.内置对象数组对象/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20字符串let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你3.构造函数new原理1.工厂函数和构造函数工厂函数: 用于创建对象的 函数构造函数 : new 调用的函数通途一致:都是创建对象2.new关键字原理4个步骤a.创建空对象b.this指向这个对象c.对象赋值d.返回这个对象3.构造函数内部使用returnreturn 值类型。 无效,返回new创建的对象return 引用类型。 有效,覆盖new创建的对象4.原型对象1.原型对象 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。2.作用内存资源浪费 + 全局变量污染3.构造函数、原型对象、实例对象的关系构造函数: 有一个prototype属性, 指向原型对象原型对象 : 有一个constructor属性,指向构造函数实例对象 : 有一个__proto__属性,指向原型对象5.原型链原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构对象访问原型链规则 : 就近原则先访问自己,自己没有找原型,原型没有找原型的原型,此类类推直到原型链终点null. 如果还没有,属性则获取undefined, 方法则报错xxx is not funtion原型链 : 继承2.函数进阶1.this指向普通函数 函数名() : this指向window对象方法 对象名.方法名() : this指向对象构造函数 new 函数名(): this指向new创建的实例对象2.函数上下文调用伪数组转真数组 : Array.from(伪数组)数组求最大值: Math.max(...数组名)3.闭包闭包 = 函数 + 上下文引用作用: 解决变量污染4.递归函数内部调用自己作用: 遍历dom树 + 深拷贝3.ES6新语法1.class类函数 : 相当于构造函数class关键字 : 构造函数extends关键字 : 原型继承super关键字 : 子类中调用父类的方法js高级PKeL LPKsT<Revisions/5728fou9ciqnams3veghe08grr/rev-6-1646828327872.xmlPjs高级-11.面向对象1.面向对象1. 面向对象 是注重结果 思维方式面向过程: 注重过程面向对象: 注重结果2. 面向对象本质是对面向过程的封装2.内置对象数组对象/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20join()reveser()sort()concat()字符串let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你indexOf()split()substr()toLocaleLowerCase()3.构造函数new原理1.工厂函数和构造函数工厂函数: 用于创建对象的 函数构造函数 : new 调用的函数通途一致:都是创建对象2.new关键字原理4个步骤a.创建空对象b.this指向这个对象c.对象赋值d.返回这个对象3.构造函数内部使用returnreturn 值类型。 无效,返回new创建的对象return 引用类型。 有效,覆盖new创建的对象4.原型对象1.原型对象 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。2.作用内存资源浪费 + 全局变量污染3.构造函数、原型对象、实例对象的关系构造函数: 有一个prototype属性, 指向原型对象原型对象 : 有一个constructor属性,指向构造函数实例对象 : 有一个__proto__属性,指向原型对象5.原型链原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构对象访问原型链规则 : 就近原则先访问自己,自己没有找原型,原型没有找原型的原型,此类类推直到原型链终点null. 如果还没有,属性则获取undefined, 方法则报错xxx is not funtion原型链 : 继承2.函数进阶1.this指向普通函数 函数名() : this指向window对象方法 对象名.方法名() : this指向对象构造函数 new 函数名(): this指向new创建的实例对象2.函数上下文调用伪数组转真数组 : Array.from(伪数组)数组求最大值: Math.max(...数组名)3.闭包闭包 = 函数 + 上下文引用作用: 解决变量污染4.递归函数内部调用自己作用: 遍历dom树 + 深拷贝3.ES6新语法1.class类函数 : 相当于构造函数class关键字 : 构造函数extends关键字 : 原型继承super关键字 : 子类中调用父类的方法js高级PKG `$PPPKsT<Revisions/5728fou9ciqnams3veghe08grr/rev-7-1646991605018.xmlPjs高级-11.面向对象1.面向对象1. 面向对象 是注重结果 思维方式面向过程: 注重过程面向对象: 注重结果2. 面向对象本质是对面向过程的封装2.内置对象数组对象/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20join()reveser()sort()concat()字符串let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你indexOf()split()substr()toLocaleLowerCase()3.构造函数new原理1.工厂函数和构造函数工厂函数: 用于创建对象的 函数构造函数 : new 调用的函数通途一致:都是创建对象2.new关键字原理4个步骤a.创建空对象b.this指向这个对象c.对象赋值d.返回这个对象3.构造函数内部使用returnreturn 值类型。 无效,返回new创建的对象return 引用类型。 有效,覆盖new创建的对象4.原型对象1.原型对象 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。2.作用内存资源浪费 + 全局变量污染3.构造函数、原型对象、实例对象的关系构造函数: 有一个prototype属性, 指向原型对象原型对象 : 有一个constructor属性,指向构造函数实例对象 : 有一个__proto__属性,指向原型对象5.原型链原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构对象访问原型链规则 : 就近原则先访问自己,自己没有找原型,原型没有找原型的原型,此类类推直到原型链终点null. 如果还没有,属性则获取undefined, 方法则报错xxx is not funtion原型链 : 继承2.函数进阶1.this指向普通函数 函数名() : this指向window对象方法 对象名.方法名() : this指向对象构造函数 new 函数名(): this指向new创建的实例对象2.函数上下文调用伪数组转真数组 : Array.from(伪数组)数组求最大值: Math.max(...数组名)3.闭包闭包 = 函数 + 上下文引用作用: 解决变量污染4.递归函数内部调用自己作用: 遍历dom树 + 深拷贝3.ES6新语法1.class类函数 : 相当于构造函数class关键字 : 构造函数extends关键字 : 原型继承super关键字 : 子类中调用父类的方法js高级PKXPPPKsT<Revisions/5728fou9ciqnams3veghe08grr/rev-8-1647057456505.xmlqLjs高级-11.面向对象1.面向对象1. 面向对象 是注重结果 思维方式面向过程: 注重过程面向对象: 注重结果2. 面向对象本质是对面向过程的封装2.内置对象数组对象/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20join()reveser()sort()concat()字符串let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你indexOf()split()substr()toLocaleLowerCase()3.构造函数new原理1.工厂函数和构造函数工厂函数: 用于创建对象的 函数构造函数 : new 调用的函数通途一致:都是创建对象2.new关键字原理4个步骤a.创建空对象b.this指向这个对象c.对象赋值d.返回这个对象3.构造函数内部使用returnreturn 值类型。 无效,返回new创建的对象return 引用类型。 有效,覆盖new创建的对象4.原型对象1.原型对象 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。2.作用内存资源浪费 + 全局变量污染3.构造函数、原型对象、实例对象的关系构造函数: 有一个prototype属性, 指向原型对象原型对象 : 有一个constructor属性,指向构造函数实例对象 : 有一个__proto__属性,指向原型对象5.原型链原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构对象访问原型链规则 : 就近原则先访问自己,自己没有找原型,原型没有找原型的原型,此类类推直到原型链终点null. 如果还没有,属性则获取undefined, 方法则报错xxx is not funtion原型链 : 继承2.函数进阶1.this指向普通函数 函数名() : this指向window对象方法 对象名.方法名() : this指向对象构造函数 new 函数名(): this指向new创建的实例对象2.函数上下文调用伪数组转真数组 : Array.from(伪数组)数组求最大值: Math.max(...数组名)3.闭包闭包 = 函数 + 上下文引用作用: 解决变量污染4.递归函数内部调用自己作用: 遍历dom树 + 深拷贝3.ES6新语法js高级PKC$vLqLPKsT<Revisions/5728fou9ciqnams3veghe08grr/rev-9-1647249811254.xmlLnjs高级-11.面向对象1.面向对象1. 面向对象 是注重结果 思维方式面向过程: 注重过程面向对象: 注重结果2. 面向对象本质是对面向过程的封装2.内置对象数组对象/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20/* 1.内置对象 : js作者提供好了对象,封装了很多方法,直接使用即可 2.内置对象api : 内置对象的方法 小节: 学习内置对象不需要死记硬背, 常用的熟能生巧 */ let arr = [88,60,50,100,90,20] //new Array(88,60,50,100,90,20) /*1.数组增删改查操作 (1)arr.push() :数组最后面添加元素 (2)arr.unshift() :数组最前面添加元素 (3)arr.pop() :删除数组最后一个元素 (4)arr.shift() :删除数组第一个元素 (5)arr.splice() :删除数组任意下标元素 */ /* 2. arr.reverse() : 翻转数组 */ arr.reverse() console.log(arr)//[20, 90, 100, 50, 60, 88] /* 3. arr.sort() */ //参数是一个回调函数,代表排序规则 arr.sort( function(a,b){ // return a-b//从小到大 return b-a//从大到小 } ) console.log( arr ) /* 4. arr.join('分隔符') : 把数组每一个元素拼接成一个字符串 */ let str = arr.join('|') console.log( str )//100|90|88|60|50|20join()reveser()sort()concat()字符串let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你let str = '我是黑马颜值担当ikun爱你么么哒' //1.字符串和数组有点类似,也有长度和下标 console.log( str.length ) console.log( str[2] )//'黑' // for(let i = 0;i<str.length;i++){ // console.log(str[i]); // } //2.其他学习过的常用方法 /* str.replace('A','B') : A替换成B str.trim() : 去除字符串两头的空格 */ //3. str.indexOf('字符串') : 获取字符串首字符在str中的下标 /* 如果字符串存在, 则返回首字符下标 如果字符串不存在,则返回固定值 -1 应用场景: 判断 str中有没有 '字符串',如果没有则-1,有则下标 */ let index1 = str.indexOf('黑马') console.log( index1 )//2 let index2 = str.indexOf('武汉') console.log( index2 )//-1 let index3 = str.indexOf('黑你') console.log( index3 )//-1 //4. str.split('分隔符') : 使用分隔符将字符串切割成一个数组 //提取网址中的参数 let urlStr = 'http://www.itheima.com?phone=123&subject=前端' let arr1 = urlStr.split('?') console.log(arr1)//['http://www.itheima.com', 'phone=123&subject=前端'] let arr2 = urlStr.split('=') console.log( arr2 )//['http://www.itheima.com?phone', '123&subject', '前端'] //5. str.substr(index,length) 从index下标开始往后截取length长度的字符串 console.log( str.substr(2,6) )//从2下标开始往后截取6个字 黑马颜值担当 //6.大小写转换(中文没有大小写) : 文字验证码一般不区分大小写 console.log( 'adaSFSDsfdsSDFS'.toLocaleLowerCase() )//adasfsdsfdssdfs console.log( 'adaSFSDsfdsSDFS'.toLocaleUpperCase() )//ADASFSDSFDSSDFS console.log( '中国我爱你'.toLocaleUpperCase() )//中国我爱你indexOf()split()substr()toLocaleLowerCase()3.构造函数new原理1.工厂函数和构造函数工厂函数: 用于创建对象的 函数构造函数 : new 调用的函数通途一致:都是创建对象2.new关键字原理4个步骤a.创建空对象b.this指向这个对象c.对象赋值d.返回这个对象3.构造函数内部使用returnreturn 值类型。 无效,返回new创建的对象return 引用类型。 有效,覆盖new创建的对象4.原型对象1.原型对象 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。2.作用内存资源浪费 + 全局变量污染3.构造函数、原型对象、实例对象的关系构造函数: 有一个prototype属性, 指向原型对象原型对象 : 有一个constructor属性,指向构造函数实例对象 : 有一个__proto__属性,指向原型对象5.原型链原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构对象访问原型链规则 : 就近原则先访问自己,自己没有找原型,原型没有找原型的原型,此类类推直到原型链终点null. 如果还没有,属性则获取undefined, 方法则报错xxx is not funtion原型链 : 继承2.函数进阶1.this指向普通函数 函数名() : this指向window对象方法 对象名.方法名() : this指向对象构造函数 new 函数名(): this指向new创建的实例对象2.函数上下文调用伪数组转真数组 : Array.from(伪数组)数组求最大值: Math.max(...数组名)3.闭包闭包 = 函数 + 上下文引用作用: 解决变量污染4.递归函数内部调用自己作用: 遍历dom树 + 深拷贝3.ES6新语法js高级PKjLLPKsT<Revisions/7qhbqgd3e2v7e2958b8ckp758q/rev-1-1641895051984.xml移动web第一天全天目标使用字体图标简化网页中装饰性图标实现方式使用位移、缩放、旋转、渐变效果丰富网页元素的呈现方式字体图标目标使用字体图标简化网页中装饰性图标实现方式学习内容字体图标介绍iconfont图标库特点字体图标看起来是图,本质是字加载速度快兼容性高灵活性高通过字体属性控制样式下载登录后,选择目标图标,加入购物车在购物车中添加至项目后, 在项目中下载使用Unicode编码引入iconfont.css样式表标签粘贴Unicode编码标签调用类名iconfont类名引入iconfont.css样式表标签调用类名iconfont(font-family)icon-xx(图标对应的类名)svg上传作用: 图标库中的图标无法满足项目需求步骤1. 上传SVG图标2. 去除颜色提交3. 加购物车并下载使用平面转换目标使用位移、缩放、旋转、渐变效果丰富网页呈现方式学习内容平面转换介绍平面x和y 2条坐标轴组成的屏幕x轴正值向右y轴正值向下转换改变盒子形态位置角度大小属性: transform位移translate(x, y)translateX()translateY()定位盒子居中定位绝对定位left:50%top:50%位移translate(-50%, -50%)旋转rotate(角度)单位:deg旋转方向正值:顺时针负值:逆时针转换中心点属性transform-origin取值关键词topbottomcenterleftright百分比px多重转换定义同时改变盒子的多个形态注意旋转放在最后旋转会改变坐标轴向缩放scale(倍数)大于1,表示放大小于1,表示缩小渐变目标使用background-image属性添加渐变背景效果学习内容基本写法background-image: linear-gradient( 颜色1, 颜色2, ...... );透明渐变background-image: linear-gradient( transparent, rgba(0, 0, 0, .6) );第二天全天目标使用空间转换、动画效果丰富网页元素的呈现方式空间转换目标使用位移、缩放、旋转等空间转换效果丰富网页呈现方式学习内容空间转换介绍坐标轴X、Y、ZZ轴与用户视线方向重叠属性transform空间位移完整写法translate3d(x, y, z)某个坐标轴位移translateX()translateY()translateZ()透视作用产生近大远小,近实远虚的视觉效果概念视距:用户眼睛和屏幕的距离写法perspective: 值;添加给父级取值一般800-1200px之间空间旋转旋转rotateX()rotateY()rotateZ()左手法则左手握住旋转轴,大拇指指向坐标轴正值方向, 四根手指弯曲方向为旋转正值方向立体呈现作用让子级处于真正的3D空间内写法transform-style: preserve-3d;添加给父级缩放完整写法scale3d(x, y, z)某个坐标轴缩放scaleX()scaleY()scaleZ()动画目标使用关键帧动画效果,给网页元素添加动画特效,提升用户体验学习内容动画介绍基本使用定义动画@keyframes{ from {} to {} }@keyframes{ 0% {} 20% {} 50% {} 100% {} }使用动画animation: 动画名称 动画时长;animation属性复合属性写法animation:动画名称 动画时长 速度曲线 延迟时间 重复次数 动画方向 执行完毕时状态;注意事项取值不分先后顺序必须赋值项:动画名称和动画时长若出现2个时间:第一个时间为动画时长, 第二个时间为延迟时间拆分写法(了解)animation-name:动画名称animation-duration:动画时长animation-delay:延迟时间animation-fill-mode:动画执行完毕时状态forwards:最后一帧状态backwards:第一帧状态(默认值)animation-timing-function:速度曲线steps(数字) : 逐帧动画animation-iteration-count:重复次数infinite:无限循环animation-direction:动画方向alternate:反向animation-play-state:动画播放状态paused:暂停通常配合:hover使用逐帧动画作用精灵动画搭配精灵图使用核心动画速度曲线为steps(N)N与精灵图小图个数相同多组动画作用:一个元素添加多个动画效果写法animation: 动画1,动画2,动画N;第三四天全天目标了解移动端与PC端屏幕和网页布局的差异,能够使用Flex布局模型布局移动端网页百分比布局目标了解百分比布局方案学习内容特点流式布局宽度自适应,高度固定布局方式宽度为半分比写法FLex布局目标使用Flex布局模型完成网页基本布局效果学习内容Flex的优势和特点浏览器提倡的布局模型,页面渲染性能高布局简单、方便避免浮动脱标的问题兼容性较高(不兼容低版本浏览器)组成部分弹性容器(父级, 添加display:flex的盒子)弹性盒子(子级)主轴(默认水平)侧轴(默认垂直)主侧轴对齐方式主轴justify-contentcenter:居中space-between:间距出现在弹性盒子之间space-evenly:父子级间距都相同space-around:间距出现在弹性盒子两侧视觉效果: 子级之间的间距是父级左右两侧间距的2倍侧轴align-items(控制所有弹性盒子)center:居中stretch:默认值, 拉伸align-self(控制某个弹性盒子)弹性伸缩比flex: 整数数字;占用父级剩余尺寸的份数第五天全天目标使用rem布局方案,实现视口宽度不同,网页元素宽高等比缩放效果rem目标实现在不同宽度的设备中,网页元素尺寸等比缩放效果学习内容rem介绍相对单位,相对于HTML标签字号计算尺寸1rem = 1HTML标签字号基本使用1. 给HTML标签添加字号2. 设置元素尺寸为rem单位媒体查询基本使用视口不同,添加不同的根字号@media (视口宽度) { 差异化CSS样式 }rem布局流程1. 媒体查询添加根字号@media (视口宽度) { html { font-size: 37.5px; } }2. flexible添加根字号<script src="flexible.js"></script>less目标掌握Less常用语法学习内容less介绍CSS预处理器,让CSS具备逻辑和计算能力浏览器和网页不识别less,目前需要将less文件导出CSS文件,HTML引入CSS文件插件EasyLess语法注释单行// 注释内容ctrl + //* 注释内容 */alt + shift + A嵌套作用生成后代选择器写法父选择器 { 子选择器{} }&表示当前选择器, 不会生成后代选择器运算作用完成常用数学计算写法除法(xx / xx)xx ./ xx变量作用存储数据,方便修改和使用用法1. 定义变量@变量名: 值;2. 使用变量CSS属性: @变量;导入作用引入其他less文件写法@import: ‘文件及路径’;导出导出CSS文件控制所有Less导出路径修改EasyLess插件1. 设置 → 搜索easy → 在settings.json中编辑2. 添加代码:"out": "目标存储路径"(文件夹以/结束)单独控制某个Less文件导出路径less文件第一行添加 // out:路径禁止导出CSS文件less文件第一行添加: // out: false第六天全天目标使用vw布局方案,实现视口宽度不同,网页元素宽高等比缩放效果vw / vh目标使用vw布局方案,实现视口宽度不同,网页元素宽高等比缩放效果学习内容vw和vh基本使用vw和vh为相对单位,相对视口尺寸计算结果1vw = 1/100视口宽度1vh = 1/100视口高度布局流程1. 根据设计稿确定1vw尺寸2. px单位转换成vw单位尺寸px / (1/100视口宽度)vh弊端vh是相对视口高度计算尺寸需要考虑全面屏,视口高度尺寸偏大第七天全天目标了解响应式网页特点,知道响应式布局的核心技术:媒体查询的用法了解BootStrap框架使用方法和手册用法,能够使用BootStrap框架开发响应式网页媒体查询目标能够使用媒体查询写法,检测不同的响应断点,设置差异化CSS样式学习内容max-width / min-width书写顺序案例隐藏效果其他写法完整写法link写法BootStrap目标掌握BootStrap框架基本用法掌握BootStrap框架手册用法学习内容BootStrap介绍UI框架封装了大量的HTML、CSS、JavaScript,只需要按照框架要求书写代码,即可快速完成对应的效果下载生产环境压缩的代码开发可以直接使用less源码基于less的源码包可学习使用使用全局CSS样式栅格系统介绍作用:响应式布局原理将网页等分成12等分,每个元素占对应的份数使用大屏响应断点>= 1200px类前缀col-lg-*版心1170px中屏响应断点>= 992px类前缀col-md-*版心970px小屏响应断点>= 768类前缀col-sm-*版心750px超小屏响应断点< 768px类前缀col-xs-*版心100%</topics>标签样式表格按钮.....组件作用:封装常见功能的HTML+CSS分类布局组件1. 引入样式表2. 复制粘贴结构,修改内容字体图标1. 引入样式表2. 空标签粘贴类名插件介绍封装了常见功能的交互效果,包含HTML、CSS、JavaScript使用步骤1. 引入样式表2. 引入js2.1 jQuery.js2.2 bootstrap.js3. 复制结构,修改内容定制作用:针对项目定义bootstrap框架步骤1. 导航菜单:定制2. 输入对应的Less变量值3. 编译并下载,使用新框架-1移动WebPKoPKsTThumbnails/thumbnail.pngPNG  IHDRQ )VIDATxsٝyy˽l찻a6]a~0k~ L4ki`samT{`=13GHA K=h*({j?M@V6hl4kܶ%.[/Va\#boȳ&\tF\(ʳm6l?J|4̂xy,B퀾zF?9b~uVseZ2{eK~fӹGθvrexz@ٿ40-[si+Uhi{l7H8&9{pigvsF)$qzڱ.aF\;"FK.(d^&E@!sN(%BFW؀e^B`v̭hz*G k=oOɌXM ClsJuг=)h^ L@%-rhoez۲w, ԯ8 ϼ|vb<0*1oFz̜ng%B3d^_ w~?yIG`RHRfKG5YzA*=:zk!u^7Ÿi\1BԟNˎ36Ywc̼BFykwN~J?5|r_J-Yyu^ʢ@# / y2/i= )S2&{֐iqz!{uz{f%qj@%]Ftq; wJϵQ& "w)˙y51@au^ Ϩ:ƱÃ5@5G=zəנyR -ysWxƾ!a5ɯgKͼ@WFG8)'?FZc캻Nȼԟy%ɩg:vlIo'_R>ͮJ+DKKE{KcDG#e^x>sEs*dG2gƬ;ƲŽDl8b1WLc*Ve%VF^A@ Zʰ_{v|CzN+sC+j rVvqt!+N[ڳ-KzE/V;捣ŏؐyT,!q+[y)ef+S/2 8=mŎ\.o|skŘ :[j]EyUŘk5pƕۑ"ϩW)B3/)1֠+‰MQwXnԎJc{c[+ϙyk2#41 jd^&5(EA9虗uuVy)JQgvѳƄd^Vå슒>̅-KiPGV{ם~R&!*Z: ڔwӯ+:M C^n#]4yI13s17Aۈݢ{D?~%V2/%ԳoJ̢G֪k] *^qzZ(1 Stc؞=KLع3zVK% Zt5J䍺꼒V c2/ Su^.'Uر~dwT 08+uVzZԧ6n!v uC!@ݐynȼP7d^>yk4˔x|fA]ϜqZ=ph9ȼ ̲KwB=x?03Gw]h^|;zli֠y-yd43C{WRݥB=9d^yYϪ2f81\zfј[& "@ݐynȼP7d^2/  U}{kn}abbbbinSʿY<ȼ3{ハ7^>7oxT01111MBNGWO\~Ry7cLYnuv?ϑ?|_&a" n>4V_ycyê[>B݉OfoT 2/`;Oݫ/d^x]􍕪[Bױ Nխ`!ƨSn 0F7N\~Ru+wȼ1:+_;d^0/*Aчü}d^,n9V%t0%jLMM7ֲg3+?PfoT]05=j[{Erwr8!4-nNwrY"̖r\I͐bN8fG;ýsOu5Za?Y 9zcF8V q=^Wo_TnoёZ-,dދ ̵Ubo1 wW:3/i 'v;VCfd^d8ymedwun浓],qdn8~S(3wA:a6 7i3ZH?h(+|134$OV=<9}Ի8[>Pj{ߺuy= `?Ao>4ptS*G.xZ7Pҟ USv Su6^2cc3ӍFڸ/#q{EuJb\hĦw&*^6b=3_%zk[3(_:K&0.G?ZXyWu+2u.̈3l4 EsL=T)V%t/8o[lZBt}u^yA_'"̫N/)eyk+\sb;CYW{G8$KRn6@.S&4ɖٷ4#.! Vd^!_7z wH؋ȼq$j:$9wmUbmf2 g7ͮJ~O׏'Ͱ:YfǹU$$We^5hy*J\qG +g3c/3va:(x=Q52/-%c0*0RG|tjfy68yg/JBzg{UbI3Wt貒~Ѱ꾼_:$s@d6{MHR_AGm;b'hlq%͊*釁׮9`iFAЍWs$YkwFtФH~_zq>J3àҡS럫՘OY%g^WspmLW&`!ERV \\CxAj'TM#*؊~ juhfԐE$-q`8-ؒ )F`W8O 㫯1FřIFV%#ʚc8╳7 w^Ru+Jb>y]/3yICl.뽍Z?k/leEu|⠌*Bt,;*mu||+9lDih4 /֒څpəSr)(i^9w=րAG;̫јc KZ`dh ȼ޾;3j*sYޜRͦ5V 郛':/0ȼ8wUbt,ozGXRrZ \՟k1Ʀŭ3o6'*?ʼ̔%鬊6Q sgYFRf.F5A;t}2~n*L"䲳^e`8y dcgPҝa\7VeXXW2Q^ g^YN(y#ya'9ݾ(U,=8(Fi'Ϳ63lI>7cFʼnOfoT݊5>GـI)*Pt +qזYWoGZHclU- E\ ]'#/oðkԤMtrz{CQ)6iGأȼ8rfխsZ꣫\TרR#J˼ҼLZ[qi,92/3C;+$ R5brm:/;IW,/]&NYWJjd;6zZ˪ zN6DDJ3 r˾6꼔+*0+Sx!qe Sb)ͽ@( !wQK3/FSE(2/`,>[YVy;|Vխƭݜnokh5jZ ѻ77bޢܛ`"w`fVvazY^gߔy?׏k +ine_=ar9xH!"ӢgQ[=hk͍c[0j~3u7} k)7_Mtag\CbhVpӦ$Y\yIB' ےNٺr.CuMiV34ؿuEÏe JK]#O'ɳ_]_r~O?_JB_ DxzyGw 9nZƚ;Sط4ûi7C9'T*/?֛Z&Ў%rOڲ~뒢4s,u*5FuHW;v@ lg̺< W1K#J{0J7Q#I:]_WS]~Z|U!@8(FԤp iseuycHHr?ݿ89nYϔ@ ClN~J]9]eGė€f,JsNGMU@Wo&W?ޕMdBSЏo/WMw݃0tc>Ѓ{ mW8v6oV|$dzyia3+Xc~Ӫemrl<8)YvXn25>k[q^?kl5*y=/ȼ}joy5ʅu_?g3{l7[O+.wsC2/mJ:fWґle;꼬MK;2l*ʞ+꼒~kZʛh-J_icz]v ̫=Wʕ1dGWӐ&a GjǺ+e܈)XvP:2As98YwFHĪ2Wh]cr\ )2/do\jUx򮾬$ * e7g|;#:w#Xk7yu^j#EѢG{7C/yimLpWx_o3~2X#3 8,Ixiju^Dŕ}qfaX=>Nd&wFZbe^iYe^Z<=H@, 9MڑOiՃL/PKVhϛ)f/^`?!Jv/o Ց5}u3vI:_='i׹Ϗ_|ʼˈJ/az5&!erwPz+r2/{NN:/PcsKwJ;)sX2*,z1}pԽ*j#Az7>ly"j$t跜K:KUrյBɈyo^Mo#MW, r8AX#x iYaקUe u%r᭐gP1C&!r$mk7^urXo̳|;8id֜f6X*őGPsaMwJk&qf 3ÏG͂8ARFX3+ pT#Ȧ-cYOG)ӂtd!kg[MD<:j6"n5<yU>/Ds\J6^Y++)\_eJ&L^_Xr>;~b2꼂J=fIrl?&-FW_6Lt` Jv`fl]}M(+o Bdqq;R%RdVڈ7kb:И9::/g󼌬DouΝKP: Uld??oiL%2K+shږZty ^aWE+VІ|E |~?[fOyBhR (ݭ 2NO@ȼ2j.T ;2/#>93ƺ naQ|ǓNP}UlF}?/۽?[.*F[wљaV`!$s;JN,keYz>wzop̃W7N\~2&(ȼ7;vi+s0P5근3Մ~w]ڻ#gw[s3מz[칩~e[\ݬ|_*VtKW @82M7ێ'/ZW)O敮r2xKB:k]oo<}cs7 w{ֽ!?]|_*>buE92Y WR }ϼ &`aWcz_xi-67;<z8zS]hWbg^ӟ8??|_*ȼ#ypJ `#Jsk{H/O\d^ٞ[05- 975L0其"Bjğh5_ߐ%R|%[5^曳6m}?}`쌵Mmq吃6K:;+s[5͛ ho[[u9D/C'i`hd^54Թe*k^~_߯[@}-gTzߎ~C֗K:רMM.dE+^H*"Nw3w+_\\Tg6$a N^]9/&WN z'U:f/Ve^-ͼ9š6W6S rt8a6Kti\`cFcHAs_frM*;!ԏ}6ȼw'.T:J#6ȑ#+O뼔y d^jMGw9~uխu^Qt?{˿>VĵG铘BwKzx{jD*7o.]x*w߲հH+R]̼6}<}~GD5 *ȳWB@2I49rf Aa|t&($U)]uGFIKԄG)Q0%n+yyv+lwD^:BS;v!mi z9J"/F}ZQ7ؕV4846w.Cj3d.#8cڌgܣٮ`GaTWF |6ƀ6}yO2*= ˙CشJ;gh& ;/ n[:%)etD{aPQ'ԱYC5ZWrD)g^8Q&w܁k\\jSFJ@5YZs3מV PsaMV^. !csK[~G5) I@5jw{gV`p<0:2-u_|~_uCP7VyUu+g8ޞf>[xt73 |m;?F۽wԹN S?-٭ WVtěj/V{SխIxĈzݞy1^|ݙt}/gͱcKJg-ygn˓=˿㋿gZ\܅cd^Uu`]h/!(ͥn>\DCg^Vܕ,R^WxaVKɋD_d^YYdu\jWݟNWr2111y/ 2*lsW`j@wR_ܱM/֦SN48꽏|T]'o|R\dquWוN/Tޝfbb Wezݛ3?(T LA.#O#JʛeΟ+0K3:/y13]+7ͷKkѴz:yu迎w{Y&&&&@EU嵭#g[?-S|++>rvc=}]-#xf ʼ͆l!V hy<#wݹo~ͷ}1g_¿)yUG<ƫ׶yPu+0@ێ]h-un|g[-4HKfَ0+I?iRC뼤0(ǘN)w%;tBRV:N N|^ه |o/=~q#2]uΫ7VnPsaMV`ϩOE^@lN'ʷZZgd˧Py)5Q-tK_ ؜{\W789+_WoͿkOCKW7ģ7VyUu+=G2V RJ[26NFO _[!uxg\ 4걗q- 3+q]9߼w?g^vVGZIWIٍwnJώ4gN y[TӜ]x .'-wv|aKDk]~ `8+R2MDnG93>CnɼuXWz }\ gu^RaIs3UN,%e8e *#~%k]P45s2(vUȼ̫د$ɌjQdމ9EZ{wSJ\3^Qɶ:Prv=OMk,W7}Xu+P̵Uc*ƭ]e/ud |;A 3 μ̲-H}S%v8t6+>kɼ%|s-u&.LG[3/e;(Je RVK$+&˝yiΫe> 0֕[g:$$L"!bVkɚsYj>giV*t blZ٧y$"3?˪[-u]Bխ@7hɼc:(x(:"Z V0rg^f\dDμv;WyT%JK۶~-/3 + 0]QNۨ>L -~ve<5hGiyV?*vYTJoW;=R*3/u[ؘl/!qiMo4BBg d^n?03ߪҹ/;vhG}1xNMJw^t#bL,7c(eП8d 5 d,&mwY%I oCXRslJ{\2FoY%2 fVroY G#ml,A2^ޫh/ٰ06Mf}|̫ Kq#FNri%9y^@Uw^Ru+P?ܳfxz=v@)ȼG;<d}Խ[}R/d^e[Xyw[ꝸdFխ@ix/v~FGUWoͿj[هԊ *R*kAx`803V`Y}=r!W0422zn/=~lfZ/^%%s5 +oKxw_^wկx'*3rګ~nTF̫Lʻ[>`eJ |铲7oV+m0.GUYjo~) 0!|ro~[ozNF%]~ࣻLLLLL5Vt7 d^%@-0$G:BL yqWژ@Jv..ld9_%y}zJWvG--ux:ukO+111112y * قهx쫀,qUi;z?5`6r+\ed^O^kVޥ]hPvRdbbbbd[TcNEOl y.1\6͆VQF b楾V1{ P|f+\ Jj:S] m)h i}ڛn02F#g.nV j!tk-wDp?W/y_' MidmGV}|x#AYhiFe#>0ZXI 6`hn4yJ$ޛgbp5Pu=Aer㼈{؀kE*B5 3?Ʊ Nխ>y@J\ J> wO082 y=MewzZNO=f L=ˋrW; z(z$qy8r#ce&Z`L߬Oe)DػU(p5IMgl;Khn6su|)yd^+|#g.mUP@H4B3MqBOH[p6X4=T2zs_8*jђ @Dn[*,˼D|ku;d[L?sR;ҷS~Mċ>%BvxZ. Yt)m>2Qpk[G?Z\ࣻL0X9kp鞫$R:kAh('x _NNgؐg^l'ꨋY`!9+xhUQbo5ͼJf$by ~Noţhwk2`F |9/WՕ&k3뼔zX,b*mRikkE)uFȼFpU{Fƃʳho!7?Lqnd|+]!GO$xc#]C3j=җ$NPyyigiP\ :*rħSJu*F{F~a6O?g^jEiLkɺ/QЋ=T D3Nbr8c^N2/ϩUOY3-ҴWI`#+;G>d蹮1E53!c*z:/LjғcO9zfLK/vUbw4ތPcȼ*tp!Gz6X7w\2Lvs싴HU{,-sIA)Қ 2-U4Jxs{޵f^ҥYs0:NӪ]WMRTP/d^C[;|b8Wf]fG:'&Is:b$Kbca4V^|[u+5[:K[{BA K~ٌc-Ʉ*c[.qbvlOH֭n y}W;y#hs`$QLW1|t陗Q˼̀d:B6hμ\{x^խ0vf_V`^>S۽l i3jad-;yE-Be^Ҭ9TeGb03}̜K݉T#!tg^P깴sND39blT6GRf_g~*˝y^BUN\ Y\arj_r>"TawH3 ~'cv)Z)Kוl9){ &0Zs3מV cwkɫUSH% qcJ(Ͱ)170l楴8`T]Vbc4\HMopF7S^]tr#I]JiUsXҚrv=rx@& @퉎La,9bfcbAՏ]%yO X?yϼ 4ݴ2lw(M:Ϡ%I@5^nan'ulLYhRM!KN~#FC _'3 }qo`Ϧ?epOCFw)oHc~^d^z\daQ "&I6ܲ7E;I^X^.gf^MhhWt4T9VY{hwM9G:{:/pd^803Vޝ޻߫njaGU摳n]B ZE^CUؕ^YխKV!*'7n]r;n2+v^DU ۋo_|\u+ŐyC,m>`헝Uw,5;҇?Y{{lh[ !fՕkZ]'W82Zk*< *޲F1e1-tw+==}w:^q^]U:3hvΥڸӗ̨50X|Y{\W.yü}hB/Y&:bV#~+⊐x̕{/'?I-ud^"[ #xֳO~_&Er (r ]]|v[N˔ ),3`yҳ=&|>IoXdzmpE?v@=6ٔ!jX.E#aH`z 0Fd^j.V ؅Rg -WuUa=Dw:(-Y(zC̏*e֓,!$,e^k_?*~='e؟KI ĨY'ge+=y{ b<5SZ[,Jo4];%UүbWƯ-|PWo Un;w-+ _>مt([wnYF+ZqbMV"`tb~_ίw-qeQR̫Gk< 7oq1T:fH] L{hmJ㊲67lLڮyyК[Vm7izv"EJ ݡ3нТllE-kevӈ!!0qyvi$^\wvz)^Y楖Ɂ*m_܂>i8|mR:3/BH[S{VVL uG?:¨Ec63/ku^- ohJ2mi UbE2/ȼ 5^u+k<*)g% zm41m6$,8)J{b.NX~Z$* }_zvo}RyY`=`au^Bu^Z5_$f^jZtnǑywưl=ioOd^u^ffD\/LVaߚѬi|p]m2/P2xoq7yd^bȱn<*_̼/[ڨ2˲JAy[#C( Ȕ:̯ݴnɫCА%:PA8+C0ker2/#?gk;6d1X.b$\!u^ʩs];ډܲڎ&׽X 7MZ=5{}hqomg8)"+Tg^'V(eyyd.*)+Lgd^F)/2?\cFZc֨Q":KbBdy.߸zoty2/ Wxf!j̱;<+tě!K<6.ł³T fUq3Ӝ9)2/cu6Qi8O)#< T+ݚ=t )}fܐ><ǚu1sFK0Q>mG0J]Y~k6\efƒnϾX-+>Ͻ~Wce$ekԜ*3- }j _^:zя>[ɫˇ n>nruxυ˟#Zzx™ŇVMi}u(hN0Oj*}6[u^zr[7'6Ju^ҏ;GFɼn# uۋonО[^̓o)>YΤF[QtNͬ+Ä!ېYeJ_>ۘzDNM%VR?owQe iK u^Z̕,Ac6л$|뒟zz֕v3RO@莖ʪSZ\IMuuNYq$y9/%P+(sN*v.D 3Z~TiN/ȼn# u`f}խPK/|^t)eP4 J*R.e5Ie>ȼuUDX^:r!O 3^sn'/V.|tטzsW[?>v}`X3E1ىO^|k^U'߁w3מViR.޿2*&&&&MLV5Թ~UTuԽSh58*kͭfo=~|vg/5X&2/3NT.QaN|嫗 +=Ƅ:3Q4 d37|Ge ˇ`_ٍ̫s79iBHh|ҍ1Zl_'L>Q@R~{嫗t 1=w023[_|\yrTw{Syw|~ԽʣMC;y(jkymkʳÒGpCf^sK1trO?@-μ;'.W۩wW n?gOS;1`O ͼ׶ywQw7"zc#` s14{3qfz)ۚil4[ ]`ܖcl ($QRK%3?O~>ҧTz>"Udf'=,rvxƻ(pQV')Ż(ND̋'3vˇA8B2/#xp>.GB\Eub/1u2&_>VoO7fz1ox=\xeW7ޒV>up434ַH]gFƷKHZ];4_5aI#ȼK]4' 733iҖfſ%YBg5md^02 #V[Q^5)^!.\Л4Vʴ+bz1)!c#UI),j)RQ? X~hl1cxh ^Bn?PW+l*.j2 Re^Aڷ ISG_ƞt˥K4ש+S,ܧ?g^RX_M7GGp~)Dk"ѕ.JS$ FWVs؋Y.w@Od^iCq+*+e/6ƙ'd[2/ISEYrZj' wy76⤰ɜy̫flJ "βo,J95> kٗFzVۙWR94/̿:y%c,! :H+ƭ,r^#-՝=3У4 XOWXyz# l3/QIXd^ڲ/iZ1iQfN|^4!~0V|^/~[,²JZA6i16;*{i aV#Mkv,2Ʒʢr>f0`z&LHNRdxnh%R3/ ?Gc,cJޤϼ~zұ4&\~Po]ērP V* -׷JЗޚ"Ҡvފ]#ܿyE3&x6vo"mEzYw8r4tq2]"=3/4LyFd|%Wy7;xiߕf=NHBŻpg bMGBѷ&qrPgX\j.83v&l(% Giȼt^!@g^u^s1:U~v&lv,:;y 9v&b7fyu˻pVX,H)}K±X Sjmo4;WZL/ z~pҊHg|@jp3(d^^g?7^i| Npy%4)h-VlfO`FDS3/mydHM@*&JNsG$z\**]/eaPm{3m5-muUz$ W.Ƣm\N+ϗTX/.c+!SEev +֫s2B%@"t!RM膺iB]mR'f2[|ׯ> fkiDQqhiD|GÓjZ6]b0nQyItf-2d[ͺ*3C&9ϰ.u^#j'\ " 5:e^VS:&i5f)}Mt\TWH!5sթ:uSq26&yi2@K)0S#B0c+Yug^U?344bӦ8lIA ':yKP \)E&ֶ`+V6uJaڗ.F4V-2Z0ŗGԪg6?q:f%q(ezyimu/XDԅ#yK#49A 抹mkLAMIvM-Jč/VE. 1 6=hU'SM 9\u݃ Xϸ#\j]UGa2/yٹt{׽rpuG:;SWWwlG %hAI h5A+;s:$%$*+lAx.L.MS]1鱍Ayh +꤂:Gd^V8*U];<uȼlp F牍 cS{݅@_1Lڙc@ 2>Jk]X׽p8;hyp 7Ͻu g"2y>898Qs gc){@W ׽Q٨.Nc՝=wsƓ7F,,,zu!JjkIJggN\|zfh~E ܐys8]IܣJ+x^BD݉&@DέG5W:s3{@R;98.B敚wk`a4@AěK\EȼRp@zK׽t2#e׽t{׽t2j''?]w@˹k[{"d^Y {ԕ]׽t2, .?s S^1HF׽Psfhu/ow⪸lzݎ+ ׽@+Ts${IhPog]~> R<bq#4;SfK1bkwk3;/]zĽ{2/b/ WFՁƝ!֍9 3RE=Ʃ2\꼾|Ogʫ՚߿\34FB/Z44|77ؽ M/o,ȵ /7R̉ # Wu}+e[TX=JDM3mj땟.}\_6{>l=_e=AH֪ e,6\/upb2hbVk~浶ߛZ]k!4N&,I4W絿36c^9wm6sjϙxB٪Zphu>I3phXK`.7)NZf^;/O4݅5__imZ 2..MmK;PJbl뼤Lc#mh2/? T $`?tsEOuzW:[ȼsc?wmvry+sˆ 'DN)?Jџė AJb"*(k[djhJߤ/Ra$dʼb2/+O^Ų^I p|R6ɻ꼢`:/)>2go~2ǟ?m.OrSW5ihcqq^_md^|ޑ~=J_z*sˆ3/:/9b.91\w:/n?44b/M|sɼıgd^ Wv^IbʭsMU4nwa܃:y]ًV--/57W^'.>MݨN hR_~H+6c~^ɭ4}We$EbN*,M楙N?ĤyJ[8Q\vKytqQs -WVU+8Vh{꼒t~;^m윺<9&望F&_ikB_w[cڮu>myYym2/hZyŌu^Ҫ1ϟ4%;&취FȊ_6̫-|k׽bμadԺɽ6ƈI̼dOהso'ڞ0F )#?÷?G.E]fOnOwc~{E2yĮ+ڷ8Zge?Ad< - 2{pMm^]p -jU*EF0(bnוY %9+Bt٫읿1GWy4_.{o={뽕Uڎ T43ZkxëW?tG_q~ܵYY3GIWU'idW:/a Z~j( x>iL.o]:0RqIy4Vj}\J@ji#__92X֗ZN0c!jw:Xu }1Zq&6 /A)RSo-}oɳx:/TRCS?b3YxRy57ړ!A m 3>"|#xTקVm$&_~RymB:Jhy֣WCV\8ot S~;~y??_;_&Ѝȼڕcdq҃7{:d^98;<3Wv 8bp1@+=ߙ饵׽t2Uϸp|C敏Fu/cŧFd^q)̑^=uy:w]J|&v K-|#+U%;/N\|ʒ᧳wgKK寯&2׎caKyDugu/pggJoe{lּsRmf}1m?q )L /\b!}~(Imp3EOcL"J{F)d߫j\~DdμLwqrʼ:K-ǥtЦ$\3nޣ!Oq]J(ʽ+)JU#DG%9O GRa>jmi?u+RO(WњF'_>q+R6֯PPk@ d^26yatu/?&6!#9Z:81B6Q+Na>Z^)ocb?Ems@N3/ֻ6,acncuKE5I{g̼:4faاh}EgHbN@ҧ9:O7a?04ȼ:{Ui|} ׽@JB>Vccle3;MLߔ*dGp)]?]ᅲxt#LoLd=ёаB ui鱴E2R*ϼjh;*VDO?I D:3/Į)_mOu0˙?o .d^nZ#$>Yf5mU(ȇӟttȼ:՛c/]9݆G 1")  Z )n\*wsuy yQX,M .(ԯ1kL6-nHn}}{HI92ԿhOd^ƴ%&3GARn׹e)΋_dA+V6?IPJy5:?2;A$G0KۙuxDNFK"r WׂՕ[FA1[jp)OL>jOCni$L'.CA)I}XJb 'yd^ȯ 94e%}WT*jS*ak ,|Ͱ+>(6ܢ2/?RC]*sȼ:7]ڼ0P|EqNpWncJU!: !LP-ω{~nQދ$3ڱ>a0vO)S$7*M1 G.?mU6>0{y }>6njD'p^ 7h>~HS Ǣ3 )!ٺ$e^_/ؼtVà"ta8;<3Wv ֣WCV\SWWw]]&-7ݮ8*,>)Ax/ =34eMBWdž;H^`,QxeO0ż&Z(w61u(O2QI`0d˼WDL(%oq͆@V OTLuy)H2k?8QP"uȼ!: {+r ]\r @!:$z7Ͻu .^z0u/]P M/TW{.Bux(\~Vw Lt{u/]L.o6n{s׽_.P]]t dDҵ;{''igpPWwO'wD1)[7;u:} Xk R3#uO[K s1ֱI' :D鎪q :lL}tzjފ^@Gj a6KHhL|O[)AajUܾ.JD\hG_???qí"|„̫Ph\+hP=|G a.NZA r4to֣W{6r6HGv'lW4 :cHɱVcōՀ,+:?tf_-mjw[tt^OhV_RWb!LA@i|} ׽@jn/=xэ'6 ߲(mh4{#LGb嚡+k_oVj嵭3C9 nyk3/tQ@ƹk[{tFU׽Ι61|HBŒD'J2*u>$6Rzv\*Olxc \~V?]*mHKy ұEk# -^dN)iCA&Lrmlc8UebGVE24jeS ZxZ6xǟ?m._jj{{秏_}r5f:B$9@ 9#'iy>J2EIYZMaOKИк+k]dVU^m/5uU>?ȼARWo'5rGnmO"+D&Y ,221I՝|^aZ$",qI- [ʤZ/Vu^6[Wivtlc[ߌ?F^4*6N?Wcl#+ȼ\l90z{t- Ίi6Ҵ5l>>q|t}..d.@Mm^]h g7XXR?АyIdA:% e$p|s_?ZTn3E#I5dpīDud^}:k2u#V2p}[hc77TZ~ۼ ܛ?iN=XXW.߄4O#"C4Xp.iR|}Vum|E-HhKlfW/G3ޯsf+9 h6J=pԑyp6nc*M›]㝯;y$~R"cLKJɻޝ\e;"tJ1&r_lYWFma u]:Ke%1T["aJ2i{Ih_uzL.o y10R~}:k3Z1[B^i2/yW?wm6Íz7O WϼI^B.9TܙoV?tftqͻ3/{fh))aSpJz󆦢>K"C S$bEsݥVM[V))I]%zWWlFޟnvozX,?VcwXIł9+ŞmvONz?S~ϟ6zuoI"\8fCP̫[U]u0}#52Cq"6c "[鞤~Yro6/ʻ3( BoЩ+s p$yuß1*6ecHtYfa#ibƲaLG6mqd^֣W6iT$Kɞ *)8imi>o)ZSF`O+#['oke}zu+5 sm12sXsfCAS3©MWOj95[֎e`͙U8-?]\*ۅхM׽DՍJowxnh!W39ʼp*̴Ԡ{=*-)O?3i;toe`-VN'=d)Q R^]p0} )N*b6̙W:OoИយя볰y? &\tے˿b̫{yvggv\wu'.>uss噡io寮ܴx}t=n9mt)2V@=dV٨.NRAIW,;0XM\~=:?n[\Kyuo̯Ww]ZZ934x홡[^u _b"8Bȼнɛc/LMm^]p `Y^z8yaMi|} ׽ȼ3Cӧ<6yl{+$.97^^ڙ GuU6jw0g'.>=wmv`-٢_ynoYv}-225XKɼU> lyB$c{2/ ׽ȼdՁ^[d^@3CӮ{trP V*mR1 Zh^d`6CUapV3dz3-pȼd^O̼1u ov3oFcpTcI)[IF1Kjd̩Ww on8_,%g^r9.yVN'+5׽[G aX~/mKYILWږL4 %T 4S:+1Im#`e`Lk $RBe!ϗhKNlJ%i~*J>#`so]^,BH]C*XdHe>˦:ht)/I'M̼ԾWhȼ+w^]^B$D+Hl$y5WƴyY}v>/a2Bj%j#2DrG 2/7^+&]~naIBU&9=kE:Ė53okO^9WBge8d^c/_u eμGwϫ/:jF[u^-Gh"yμԨʮKy#`4>x^].FboI˼,vL^Lyˮ{tͱWﯺ H7]謁bu/-d^@ Kk;g] 6 d^@:'.>uJw^ HN햋}b_,,Z?G^V+h)ŝ4Bz-u;M U` ;³i>qG~YZ{yi3" ?r;j?tJmw_\ԕLmHMV~;ǘy d^@:W{eKNTN%'l+,?uuY//o~uwR.%_wܺ9JyR۴Sd_2Va?~xatA~Ѻz{2ƛȼ׾ә_~w6`ܵ^sFtq2}%RɿcMfΉA y0SyE*`Me^f+MrcB}R1~E{orgʼb浿36k??~XxԕASb2/?j!:7⟟GŪн[^l@&ڠ'pw_wNX+/_] H(VOktH%_[!-%*ts ,ly2^髟jqGej"nzVf{ɍoW{?{xu s< ☋_xA_ )Ss\ ڹk[Ynl$9c5?TQ^;D-ۨ41~>Wq)Kע>&:98cYL ^ +;w.;yewYJr+ M%Bݩ7m\/Tgsp?֎mڮr}>Q~5:F4WwUY%y~ɕ:;G71&@yHa/e`4BsbIuwi<"Ey]:/qEuj9Olmwd5}SY-6^ًlaxm0=KȼoZJS ?Y%}t2/ Ftq2V*q6ezۦ:##RѻO 꿂 ۔?}szl}cf^V CI Q#&YZ934ǯ׶jʻWߘoo6y)Yq(OU;wmZ)Vc#{ѫ{+[IlOg^6s;'Z8$]yY.N6c{ҭ+|aȐ+R)YH}E}}F&KZE RJ-qj_,{ŧggnN溛/ler ' %cıY3ls#HcPNnXɡ4%Urb9 9mߊ|:/H[5U-:ch,?#qbXg>9h %L`ͳtv6f_ E).C2/ ׽rG@!2)/V]\e^@nȼLt{u/|ycȼj]rps{!н׽rwv ]mw`<|akF-+>6X.Ν1xm.g 8JοGhaBLpȼT6j[9q)K._,܃%vƼcI\ds'W2C[Z_;/}d^@;{r~^$>?xP{X.~`y|Fd}qN']=#yC@8)3Hk}vx;y(pTw M^E89U׽v ȼ&\C?uܵY׽ t?2/zuԕ{ tq#C;98Qs н׽@2/@ݹk[{gg*ۮ{d^:BبlN']ȼu lp $#ԍMm^]p y_HF[Z934N B_B)X\/M+fml[%At 4^餹m+W3& %\EDД56V9[nΠrp"'6FNFze1ft $2/@r34wf^A`dKsy{KMlI/ֳ ė4a-7Jԝ.qHceY@eh׾]?*t}^(vlr)T>mL7Pwȼ-F~:y%ȤhZ$Wem)2f^?TxBCmMVB/rֈۅOMa37^+3]B!t =ٓ Żn;}fd]0y ƶf1O\E{_u^A`,貨Rs~Θy)A!ˤ{5bI >(Kz_Og-ldQ:w^Ӷw|Xr FvFhy0L%Umn'ga`,%UY~0f̘y&>J?2KI~L'ybt*G#yŝ>h[j2ri"[=:s;ۭgh>/Zds3CKk;i[.fx5^Ѱ5CurB\#T6j}ySkz()6jǷy5M ibWo{@EiL3˥d^J+,j'*)55vމo&k՝iUty2bN)k p nK)fR1KQk"4-ʭz汍bTsyiU]y:ӑDŽwtFuWo>[m_^ۣUCA4Y*D%?2T.XPWFi{&*84(Lm3/CFA';)“)Y>o)G7)a_''52/@)ԛqcדۚ^yE+dV,jer)ts.A'b#5R7ǓYЄK3t$~'ӿXVW]z|6 c MYUy}EܝPȼEi7B ۗgCo;2Ղ4Kf)KW)3/'2/Êd^J?Q_W`%To_RgL"UmHAp#V _|Jf yIYVw„;PC0Q'Z˨Rǝ]{B: lq L.o6H )/V]";/\)yTcSF\"#jN ;/J{ȼ&\@8wmvryu/@so] <h!U6jUslgcKug/PuJΏ70R0;/N\|{&8W'۟OgK7,יt 2/@^Pi%1ߗ/?q~,ݰyAwrpu/@63{y$8;<| 2/n/=xH 7^R Hp돿Xv @7])y$Xu/@՝=׽-2/dN.oly$O^ly$9U׽-2/dcSF2o^*E_tkUnCW(żعHGZ ρ{6%d^*ɶ%שgGIV$P#GE^KlJiVʹ/OSsSi@"rnuWV*`)iFڔ,{cS%=k9RBRY΋ c ʅхG2AF5 Ur[j.Jc2/6I62/KNcoz^+&;Za4f0`ٽ9y +"ɒo|bҶ>?yF yX_dTw _h׈wQ!j9qX" Ϣu^^rfHͼG3/a%yXȾ+H ]KRRcNڢ~2/TJmȼl 7%) tYEY$yi&+H!4+6ƕQA`)%ȓC˟cXTWϥ,H2m:ͼĺV}l?@ \eLM%2/2ULye^X0qr4#˟?tL,@MFdev+K_0 .TrqfͼvH_Z2ߧUɶƒOj978@#HaʭGRn$,&2Yv'Jg!oS Wf1m$UO=SkV ppD^d^),v $ H7Py36yatu/ sf'\Fd^U]ȼk=Xeeim dGQi|ܵ[^̝ǖ;/\@vd^U|{2/42/v [)rsOȎ zD+7_},{ן8l[οqZm.mu}F/2/5?w 0 3K_|;Sd^SJpu_;?zy9r_GS{Ly@O_::2ո{y@ORp_f7UGd^S?wן>wAsOJ}x䏔YzgIi-EN"Ő([  JDR!i"! x@ N^L==μ=ԯX=yf_};d^R\UU2/d^ Q*?Jԝ̋y4JsUUɼy1\2/Ft*Pw2/K(?d~'K^^"+$b;/_Ud^@ݍ4ZubקxoEߕyUB([i;j'\WO'>xL!UzSKZ V,`W)UZ*ŸgvӝK[?lv*u;U%r 3Wߕ=o~4o]N"NW9d^y4JnAꄝi9~qW4VS)̆:ˏeUW}L)RW?m͹%^/X]f񋗬[~'+yu7X5eZm$Қ顥>wPWo K:V?\9Q̫R2/F0UHe٫HbiɄ+uc.nܿu-%tv*uYӷfUw  3Vl;EFwnlNZ\O!K(ʼ*!hZg 3 VaEȬ# 2;1'@OIՙ;+|dz%>4AY5g^yKNt*<~O|ZȊU٧ȼF)yEZHؘ􍍩>XrN@#Rs\W%d^Rt3: ؗLњ. rccZKwӢO^76Ɵ}drڲ~Oc袽4Y̤]_zJVɼ+y1͹MYc~vm^ɼ*!h]WL Oϝg={'љ^*6׹1nT%W敜#- "3.r{a\N1S2JȼEUU2/Ja_yUB(UU%Npɼӹd^@ɼ.@?*7=Q`V>T#^YZ֝D2/FOW~FWԾCW^YZyjDk$y4֩*?oas{5W_8[;`h<5|z3ǫޢK@ȼhM#id^4 ;}}k:5u:U0*2/jOZݪ:U0*2/jO@y2 !d^'2/jO@y2 !d^'2/jO@y2 !d^'2/jO@y2 !d^'2/jO@y2 !ؾoMTJ)&>-VͬR*Q/o_>Te^02/RSUFfV)(K)TէeѪUJ%J#$RJ):Ui`*ofRyɼRJNU}ZʛYTd^0B+gks'zuFKK|u3mN?'v߲b}-dײ56>5C`Nɼd.уʍ*:q=?Uy,&'p90Q4zPd^kns5Qu=\wxɼd.у ?zfÑ5S{th I(=ܐ3'ᥪu;O 20Q4zP!g^_xl{"xx|7޲RC[p;+s߆[O0cdd^L2DA写yj7?`jpz⍷C=LF$sLTnע'vGsܷG*D$ԭF{}`Py0\Efcã+ߨ< QRkN e^L2DA冖y;):Ke]06mLJ} Apm߷S?^#;ѓ~AN;= ޘ~LkSᚯZy&n_Z>XF)yy"8\pC!Jd/ɼT JEjP2//2/Ucu̅-ܘ 5u^=}I3,zb-_JN}-w-Z_S<`_`}/D{6{gɳ=5+F4}{6`Nk Z`*>4Ae/>||p}Һ=ij qVi|f ۊةemcpaw9h9h+!Wu/6>UrʼT vWpjj]?Y<6'*_I[FІRA6s繯 gֻр .h_Kn;>i귱 N[ע'vk|*:`ڊn+ݶX<_fʼT ^WGycŋTKofA/c}{~zs߆Qr`BЀW޹upg=HwEި%LB^S%y=&h+25(;zf\&d65V8]k9`:`1mţ+.ÍPsS ev]N }=7Kՠjy;).|*hFK2¬xPkVYl?v \rwA_5WeMuzE{!xWTSO?՞j&A^6umy%LП;A=?YW[}5V Kc5zƧd8" )y5AYfbxl&-sk>n'4=DA(ڶtK~r(ֳ缞ek]YK] x6aٓe(vkj={ZX|cs< yRC2In|wQ1R:W^E [ߺ'7Zmr=PhF7pwTPoRC2 o|Jv? +ĺ~ƕV8ԫdA(Z` Р׻|8usWX2&#ϼQreP Ofaٓ+ޕofT Gi+< wOWL[VpXf"2h+_ᱭpBK6Aɼ̫v%jpElXɼ(WaTX2J5 2/Րy9.WJrYrٰy P/W%d^*jNɼ̫v%jpElXɼ(ܗ̫y P2aK5d^jKUy5\F֢\v6d^jKUyɼ(װQף \y킛u7_[z噫eWN/*sy- µnyZweύ<ʒy9.WJrYrٰy P/W%d^êd^k=z/yʲؙ8)y%~3ݯ, }J:O>@Pd^+Wed-egJ5@id^ky ySd+`M,6%㭂iq^zT̫ /0j˼w^E[^z̫z+aYū!jpElXɼ(ܗ̫y P2aU3rP-9̼:ϊfXrQȟ(+ɼJkٽo7]y?oB˙8ɽg}]6o/#wb$E6sgmWuW ~ʼ7VEϜmɼ*/%Vɼ=,XW2{*6uWy%tە1Vql-kfPXgTՏ+'d^ f^3t>;Ǣp9R7}RӏOtw'u=6}-k^~}/vęWt'Ry׌֌ҙWgoŷuWM,:?=wMoՑf^~!|_Gzj_;=ynaV?WB ooUϝ/l/G{Ynfon3g1uU Χ^:?ѻͷ=|Ph[ԄܼwT{ozU+{i=dVs1/WC2U4V3T΋' 7of6*h|vǮFyuzl^U(~ؠd^W%:kT2 3d  uX_U)FYμb NW%[vW3POʗy}sŮ/saᄑӋ;+6#I-.ڝKn2>Dk3WW=w+sկ]Y5/*yl-2vw*qLe%~̫oS.нsܹo}'_ed*Hfad^}$V/FGHnwf~[MR}ކZÚ`7k{wEW˼b['V# [!-{rTƠJ?xJ5'~­j]YUK=zY%$kWcΪ2y *ɼiTѤZɼ"yPљW?uDGE߰:*sMk=3:/sFV:Yg^ /u³كf^ݱ9%d]WIڠBݛjy[{4;w= /\w⊗Ncᯮk<2t'xϖh?iN{Вz&Rͼ>CNw{uܹNv?<~#G]6&W U?(?.T?1/e3!6+ݻ-o wӇ_<{Ҷ}lѰ[% l W#.q腵|ppGܾמ8 .{o}?i3oھg^'X2N37y߽{?gOxu;-ۗwl<2Loul|X%Sd^%Wp+V=Wa,\[Q+鹉WQ'>y,$1Q \ޔy3fFȼ#RAUmūb58ʺ})S.ʸJ5kP2Zw"-i9 r~sŮ/:p#'/8s;ms詋֜oXd^Y6q^=wt_76n]u7;޾K7>g_h^/9*kcye9a'Gsߴ{c=vVc{!ݻ޶u<>|88Nu;=ra:ye]7N_Ya$r'c6}osMhYOb|޿խzϜ~繍Ν:{g뿺W%;,YBL7 e&5Q}ys.|?~ܼ9w}/A̼Ɓul),4W*F;]YqJ}[^]*Έme^ygtK${T3Hf&*:=׿yelWL}ENUld^Ǻ?;8hUn 3f zg^Y7<]a5xǒC?}sy'u=zbpww}ۗvM9Uy,}ghC\f~yŦGO櫞 .w:C.y|/.=o o+k2:U|^bnҊ&z3exG'Bf^M˿9\r9y_ϟ}eg/-\qlwcy%۩ы}~yVUq^epδ[SdvRu+W~xky5>*3I1PXY5̫oM[Ѡq^:S;❷&.dm '='~W{d^@'ۇ3`%pWbzfݕ<22ng1hQa穁<vzGSi$!vɚдĩ+v?Co9sV7*^+61{!}# vJp}7n ן=x+ߨKս0.{ޏ%u 3YS)u0.l{~tds_hO}pM#Jre^C({XD s"kg|'\ 'c>n3ߵ`פg^$7C}iZU3k}5~nɡ7?x h]=5y?MzoyWSjGoțbw$9G\>&f^G%HG=lvUI5,ɼ9;TU0qݛDM|5q^P5V. -3gTѤfZf,xEMϝ_n}fWkk20(\/Pݏnmcnu{|;bZE+vuk?h=]xG?\gŶ2Uve3qyyO .Ւ۞>/3櫞{=]_?{ؗ_˼zח=+ne|N+vw31=Fb[K]^HiCs7m~;25CWF/벹n&n?7YV8ڊ<wy>G7?c6_9XUy$J]S,GvV/;NxG^=@Uyeٌ_+ƪ]]J,0- n mt5'vƿI۞If㓞Եwם=2{V2*Ysye_W&ḿCd^ɼc^i5Ýk92 U敼2?ʼf# Ǭu5| Ϊо(mΘ; v#a`G;kZ+oCF¼efcu/|7npةVW/_=y{^q^*QUlԖ:eβeKW4J3֛z ]:}үw7WOmo鸌Jnsvo>,yۛjc5QgV912 R6`~~~E?=8a%ТOzlyN<017&v/U{띫}yc1NC^vO61 㼊sQ9GYK64^5otNQM1`+tq^*{|@jsA/ȜdtWnTY#wRT+(/zb>*Syh+j4k .M!Qrs%^;M4)=]` ͉sy*Vy~VjpU*,oU̫5kіp n[umgg3і7b?} {K>qЉ pO#{}w??e,2LɁ!z]e^`]Զg_z˩ֵsƓZ;_^/1ȼq:HyOTEU|l1/e3ν_'; wqȼF"qCF;$ʰ KE^6(oe^Xj3uwrw8?ZݽSk Z՗_8z⋯{\;Wy̼6ƞæUՁdRy|&2U̫,.!gs0?`&{ Z2o+toc!Bjq՘kVyupϣ8+c'1ZjVy_+!U3-))y-4L|b5pl`3f}@}[+cyvΠgew?{]}?h;u׎?cXd^sRrL3-y-Kۃ;>,_U/_=o~ς xd^Aq%-өܚ&o>+?.ܹZ8?s]+>Xd^Uֶ*x{DgĈg^yrɍeRr˫X{_<=g_ek6Mϼ+XWȼ0ͼrmfWܸwƮ} '^x~;g!J{LT:q΁uU*EݷY^3vg-9;=blf^ōO\iI%sc[5kX~o+yLnoHkynl2̼ڏzvulW$lW*>j !J2w̫}g^+rr}_tK/lY%Ddj"{dl8eΗ(~OR;]=׃z_o_~]߻`z_omxd^,koSndH}2~p v{ _ȼw&z`LMUstF~@];R}[VbE,X+ѝ;35_#Jr9s6`ߙWbez W,_W*ff&wg^Lm 6rrU_H'Rϙ>He>)֨.F]3W7ZGG:t.n3ze^^ýBK1ѣk$s|ɠ3E}ȼ.MmR3Q&cbbVZf^w`n!!,9k^:8GYuV(j+yݲʂo|̾ބ2gprg^+`QC"!f2W[Yݥ3DU3W9 4\uٽ?y~ឍ;̫ʛ~2bJ#Ϯ˞|՛Q̼&fUmU=wsw-^~fP8+̉ئ[F=ҁڞ7y9W5]e=wmz>W}ǫhFyhZa߼*7Rm՜e5*VuI)Wdi1gyEV8Qub̼2ӕ;d^k9ȢڼƝG7G7N-fg^6N뽿v vk_Z5R浩o}.#KuĿ|}+Y_EUX%Us Tp+s{bkyewLlWsj8S%jyo+:kR1W|^g%3x5+:n+VтXR\޵|xKʼT FW_`ĞQo vU{#nw(T[\nAlb?]{*Oo} 2͹7Za3hs߆W|Խ~gù73ag?4V˜eu;dDžXXD㾣7Zyvkjҡ-)R5e^`6]T ݳ8||8[ 2C3Ak& m+G*yv4bnf-aG*hÁM0) g .<&Ӿ~εj :]A+Lmt&v2izzfו1 w|QjPʼ.nzxE k? _TnXe兂[>+CT*T^WM+ÔwH寢*y3RSτBUoU_U~^pVbk*:6O%6Xu6ZfjxjDa8Fp2/U]uy:a:{V:V8||87 Oen$Ix齝Rm;ӫVsPA Z 'PUp v~5:XJJSm  In+d69!Zu*8xjOPjPu̼B/8|T]jYmNW*&f=WKPy5+_Bxعo:,njKSyr+GM/ak3s/aLخ(A7*!R5(AɼȼT JEjPw~_Tu̅wCH976G~6‘Us ةU0^Je^ VDMHmy4@S=kѪzu9uܱh VFx)yݵ|*:|ۛ+BԄ=?}]pH Fd^0d^@ײ5cm/Qy_ڛx{|H Fd^0d^@׹7u[pXD5|xU owzP#2/d2/X+iD篿J ʫo`jGL# q~DPS2/d2/XWh-Xy&Z-@&L2Pl+p̅%{_`}噈jjݲEO:xfoz1d^0d^@3mNyBߙ@%2#'w+&" !J$2/$ HyPW_c+Ƨd^@ [)5>%d^UJ) ^޾LMr=ȣURֆW&E}kWϪ1"jI@PK2/ ȼZyP@Ԓ 2/d^y$ %d^@-ɼ( ji/o_֩UcD@ȼhM#id^lx}Oo<}V("fK{VzMd^ث@60S/TvSa[1;t˙+>^gyԕ \̫sbUNrDžy|øʍJ@=ɼʼ 3l:rxSiS>;"cAH"v+ kRbz8yyMq1_3t,*H1:9W?gfk8~{!3gYrȼiJ y'0ry'08 `<ɼɼd^I n_PKv vqPKsT\Tmeta.xmlPKsT[[[ content.xmlPKsTi-X(X ]styles.xmlPKsTdm2Revisions/3qslg5ttc9dc93lf408u4055dt/revisions.xmlPKsT~A2Revisions/1v2kic4tubfihjdrqm9qctegmt/revisions.xmlPKsT2kRevisions/5728fou9ciqnams3veghe08grr/revisions.xmlPKsT2Revisions/0dc76832kepcpe43ankdeq2a8v/revisions.xmlPKsT\ Q2Revisions/215ms6619c167umkvuiscq179u/revisions.xmlPKsTl sn2 Revisions/7qhbqgd3e2v7e2958b8ckp758q/revisions.xmlPKsT%B5 5*attachments/03b1llb6eh87ie54ft88frull5.pngPKsT]Uؐΐ*Battachments/1ql038i8mud6386sj67qov88sh.pngPKsT[[*rattachments/1quplq9707a2a94ml3q2lcg5ih.pngPKsT0n6i6*Xattachments/1v9nk7vjgtjiqdcaunsgkvae10.pngPKsTi-oIjI*+attachments/2q8jdfdjhtrp234qi7i45dikm6.pngPKsT¼.22*tattachments/2uibvgc5j8bosqtarsineag56a.pngPKsTZ ~{y{*attachments/4cf2vtcvcggoemecghuet63ks7.pngPKsT4DD*#attachments/5kualn38lpftd032usv51bgtkg.pngPKsTX!66* iattachments/5qnmplm7q9et4cvppd812em84j.pngPKsT?D`?`*dattachments/6cc3b86jbnauqlr56r9iaiggfc.pngPKsTɘV//*attachments/7ka637qkg0r9vogau2m82md5nf.pngPKsT~4+ DD*1attachments/7q2g0svp17cee1q5m0cv2eddc9.pngPKsT@o!<uRevisions/0dc76832kepcpe43ankdeq2a8v/rev-2-1642068154489.xmlPKsT$T<7Revisions/0dc76832kepcpe43ankdeq2a8v/rev-4-1644395987097.xmlPKsTH<+Revisions/0dc76832kepcpe43ankdeq2a8v/rev-5-1647689765186.xmlPKsTВyb ??<O Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-1-1642068154536.xmlPKsT& q%? ?< Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-2-1642142666929.xmlPKsT;+2@-@<T; Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-3-1642305873044.xmlPKsT싞VMQM<{ Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-4-1642500173863.xmlPKsTo>"~ryr< Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-5-1642587802233.xmlPKsT3RZ<< Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-6-1642761374448.xmlPKsT=3< Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-7-1642846874878.xmlPKsTT)<ha Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-8-1642933654001.xmlPKsT1cA7< Revisions/1v2kic4tubfihjdrqm9qctegmt/rev-9-1645203194632.xmlPKsTLG<n Revisions/215ms6619c167umkvuiscq179u/rev-1-1641895051970.xmlPKsTYu''<$ Revisions/215ms6619c167umkvuiscq179u/rev-2-1641897152517.xmlPKsTO ((<; Revisions/215ms6619c167umkvuiscq179u/rev-3-1642068154467.xmlPKsT W:(5(<2Revisions/215ms6619c167umkvuiscq179u/rev-4-1647249811219.xmlPKsTm""<T[Revisions/3qslg5ttc9dc93lf408u4055dt/rev-1-1647249811284.xmlPKsT]'X'<~Revisions/3qslg5ttc9dc93lf408u4055dt/rev-2-1647337991750.xmlPKsT[==<`Revisions/3qslg5ttc9dc93lf408u4055dt/rev-3-1647511930369.xmlPKsT5(ee<Revisions/3qslg5ttc9dc93lf408u4055dt/rev-4-1647599002940.xmlPKsT>z<JRevisions/5728fou9ciqnams3veghe08grr/rev-1-1642068154536.xmlPKsT \ܨ::<MRevisions/5728fou9ciqnams3veghe08grr/rev-2-1643100091541.xmlPKsTG9BB<LjRevisions/5728fou9ciqnams3veghe08grr/rev-3-1644395987143.xmlPKsT0hOKK<Revisions/5728fou9ciqnams3veghe08grr/rev-4-1644485836931.xmlPKsTeL L</Revisions/5728fou9ciqnams3veghe08grr/rev-5-1646733982704.xmlPKsTG `$PP<dRevisions/5728fou9ciqnams3veghe08grr/rev-6-1646828327872.xmlPKsTXPP<7Revisions/5728fou9ciqnams3veghe08grr/rev-7-1646991605018.xmlPKsTC$vLqL<Revisions/5728fou9ciqnams3veghe08grr/rev-8-1647057456505.xmlPKsTjLL<RRevisions/5728fou9ciqnams3veghe08grr/rev-9-1647249811254.xmlPKsTo<Revisions/7qhbqgd3e2v7e2958b8ckp758q/rev-1-1641895051984.xmlPKsTThumbnails/thumbnail.pngPKsTv vqۮMETA-INF/manifest.xmlPK55