Vue3源码解析,打造自己的Vue3框架,领悟尤大思维精髓|无秘更新中第13章百度网盘下载

Vue3源码解析,打造自己的Vue3框架,领悟尤大思维精髓|无秘更新中第13章百度网盘下载点击快速获取相关资源

Vue3源码解析,打造自己的Vue3框架,领悟尤大思维精髓|无秘更新中第1U u b s i3章课程介绍(A001k o R a C Q 8 ( $013):e U S m h t /

这不是一个高冷、不接地气的源码课!而是一个从开发者实际工作角度出发,结合 Vue 3 的设计机制,通过产出一个精简版 Vu} 3: W 3 8 S + ( b 0 % Ve 3 框架的方式,让大家可以站在 VueB [ n I i ; % ; 0 X 2 P o 3 源码设计者的角度,俯视所有业务场景,彻底搞清楚每一行 Vue 代码背后,Vue 都做了什么!课程的核心设计原则:让更多的人,以更轻松的方式,学习Vue 3 源码J k Z b : +

Vue3源码解析,打造自己的Vue3框架,领悟尤大思维精髓|无秘更新中第13章

Vue3源码解析,打造自己的Vue3框架,领悟尤大思维M o ,K . ? ) . E O E n B i精髓|无秘更新中第13章 4

课程目录:

Vue3源码解析,打造自己的Vue3框架,领悟尤大思; z ( | G N ; $维精髓|无秘更新中第13章 5

文件目录:

Vue3源码解析,打造自己的Vue3框架,领悟尤大思维精髓无秘更新中第13章
│ ├─vue-next-mini-master.z# v 5 / 0 9 g ~ip 83.37KB
│ ├─{10}–第1# + @ , ) / X y0章rune b X & ( % O V (time运行时-构建renderB V q ] Ler渲染器
│ │ ├─[10.10]–10-10框架实现:删除元素,ELEMENT节点的卸载操作.mp4 17.6MB
│ │ ├─` n o } a h _ $ y$ _ _ Y * ( j[10.11]–10-11源码阅读:; . Cclass属性和其他属性的区分挂载.mp4 78.46MB
│ │ ├─[10.12]–10-12深入属性挂载:HTMLAttributes和DO| x L g ^ SMPr.mpW l J n4 64.82MB
│ │ ├─[10.13]–10-13框架实现:区分处理ELEMENT节点的各种[ # : ^ a R属性挂载.mp4 28.85MB
│ │ ├─[10.14]–10-14源码阅读:ELEMENT节点下,style属/ – L q w 1 B |性的挂载和.mp4 65.08MB
│ │ ├─[10.15]–10-15框架实现:EN H C M ; M f z ?LEMENT节点下,style属性的挂载和.mp4 31.6MBT o s n r P D
│ │ ├─[10.16]–10-16源码阅读:ELEMENT节点下,事件的挂载和更新.mp4 111R O 7 * S g m T m.88MB
│ │ ├─[10.17]–10-17深入事件, : A 0 7 =. & B 3 4 Q b \ O更新:vueeventinvoke\ H H S E ( L *rs_ ` _ d U p.mp4 51.69MB
│ │ ├─[10.18]–10-18框架实现:ELEMENT节点下,事件的挂载和更新.mp4 35B {# ) [ b _ j V 9 + g v S.16M+ + * AB
│ │ ├─[10.19]–10-19局部总结:ELEMENT节点的挂载、更新、props打.mp4p G ` 5 , F S 9.96MB
│ │ ├─[10.1]–10-1前言.mp4 14! q 1 C 7 L K.02MB
│ │ ├─V I d[10.20]–R ` * T c D10-20源码/ { ~ & # , R (阅读:renderer渲染器下,Text节点的挂载.mp4 36.98MB
│ │ ├─[10.21]–10-21框架实现:renderer渲染器下,Text节点的挂载.mp4 28.38MB
B Q { , M P – 0 Y │ ├─[10.22]–10-22源码! $ W阅读:renderer渲染器下,Comment节点.mp4 15.33MB
│ │ ├─[10.23]–10-23框架实现:reQ U v , 9nderer渲染器s ? Q下,Cod 7 & :mment节点.mp4 17.67MB
│ │B 8 d t u N P s ? ├─[10.24]–10-24源码阅读:renderer渲染器下,Fragment节.mp4 39.62MB
│ │ ├─Y K X[10.25]–10-25框架实现:renderer渲染器下,FragmentW @ K c P节.mp4 41.5MB
│ │ ├─[10.26]–10-26\ M g g e 9总结.x @ q R % l Fmp4 16.34MB
│ │ ├─[10.2]–10-2源码阅读:初见rX f N 4 [ f ` Dender函数,ELEMENT节点的挂载.mp4 111i – V 1 ? f.01MB
│ │ ├─[10.3]–10-3框架实现:构建renderer基本架构.mp4 8d | u = J y 9 { 59.53MB
│ │ ├─[10.4]–10-4框架` l ( 9 b L 3 U实现:基于ren, | \ E ) Yderer完成ELEMENT节点挂载A M ! %.mp4 4= n 1 K i3.49MB
│ │ ├─[10.5]–10-5框架a # Y ? 4 F p U s实现:r 0 f h l合并渲染架构,得到可用的render函数.mp4 49.61MB
│ │ ├─[10.6]–10-6源码阅读:渲染_ a ; ^ P更新,ELEMs ( i hENT节点的更新操作.mp4.ts 7.94F y F r M E @ \Mv R u L 7 3B
│ │ ├─[10.7]–10-7f T n x框架实现:渲染更新,ELEMENT节g l b ( 6点的更新实现.mp4 92.84MB
│ │ ├8 o T─[10.8]–10-8源码阅读:新旧节点不同元素时,ELEMENT节点的更新操.mp4 39.81MB5 r 1 V 7 t 6 , ~
│ │ └─[10.9]–10-9框架实现:处理新旧节点不同元素时,ELEMENT节点的更.mp4 27.28MB
│ ├─{11}–第11章runtime运行时-A m [ _ ( |组件的设计原理与渲染方案
│ │ ├─O B ( M L p[11.10]–{ + # N11-10框架实现:组件生命周期回调处理逻辑.mp4 41.97MB
│ │ ├─[11.11]–11-11源码阅读:生命回调钩子中访问响应性数据.mp4 40.16MB
│ │ ├─[11.12]–11-12框架实现:生命回调钩子中访问响应性数据.mp4 12.7MB
│ │ ├─[11.13]–11-13源码阅读:响应性数据改变,触发组件的响应性a X ) W D变化.mp4 54.83MB
│ │ ├─[11.14]–11-14框架实现:响应性数据改变,触发组件的响应性变化.mpQB b S a y @4 19.28MB
│ │ ├─[11.15]–118 } q U a d J-15源码阅读:comD ! ppS v ; U ]ositionAPI,setup$ 7 3 i d 9 B函数.mp4 59.47MB
│ │ ├─[11.16]–1A [ 2 A |1-16框架实现:compositionAPI,setup函数.mp4 27.46MB
│ │ ├─[11.17]–11-17总结.mp4 15.83MB
) [ o d 4 │ ├─[11.2]–11-2源码阅读:无状态基础组件挂载{ g .g $ U ; % G v K p 3逻辑.mp4\ 4 k O _ j 89.6MB
│ │ ├─[11.3]–11-3源码阅读:无状态基v $ )q p T K w F Z ; Q 3 ZZ q 2 0 y b n础组件挂v Z m 6 E ^ Y [载逻辑.mp4 69.93MB
│ │ ├─[11.4]–11-4框架实现:完成无状态基础组件的挂载逻辑.mp4 67.51MB
│ │ ├─[11.5]–11-5源码阅读:无状态基础组件更新逻辑.mp4 37.1? G / J _ & U3MB
│ │ ├─[11.6]–11-6局部总结:无状态u \ i {组件的挂载、更m $ B E c | 0 Z /新、, ! w 8卸载总结.mp4 11.98MB
│ │ ├3 % p Y H #─[11.7]–11-7源码阅S C g \ j读:有状. ) R态的响b – / N应性组件挂载逻辑.mp4 85.56MB7 v u R = J I
│ │ └─[11.8]–11-8框架实现:有状态的响应性组件挂载逻辑4 b – x.mp4 18.53MB
│ ├─{12}–第12章runtS F d G ` L A rime运行时-diff算] I . u – [ b T w$ m l e法核心实现
│ │ ├─[12.10]–12o s S A k-1X G 9 g ~ L k v0框架实现:场景四:旧节点多于新节点时的diff比对.mp4 8.61MB
│ │5 n $ : g t { ├─[12.11]–12-11局部总结:前V n E & o & x Y四种diff场G y t v [景的总结与乱序场景.mp4 33MB
│ │ ├─[12.12]–12-12前置知识:场;l @ p % T W 4 n景五:最x A o I长递增\ 8 T子序列.mO ) & `p4; h * 61.49MB
│ │ ├─[12.13]–12-13源码逻辑:场景五:求解最长递增子序列.mp4 1W + * x k J71.24MB
│ │ ├─[12.14]–12-14源码阅读:场景五:乱序t : I R / ) X v下的diff比对.mp4 108.96MB
│ │ ├─[12.15]–12-15源码阅读:& T q ~ C n M A场景五:乱序下的diff比对.3 Z G G) ~ U Bmp4 150.53MB
│ │ ├─[12.16]–12-16框架实现:k % h $ \ s x 2 O场景五:乱序下的diff比对.mp4* { = N p 36.09MB
│ │ ├─[12.17]–12-17总结.mp4 30.05MB
z b 0 * ( │ ├─[12.1]–12, } # 7 J ` r ,-1前言.mp4 19.85MB
│ │ ├, b d x m ( 8 ) I─[12.2]–12-2前置知识:VNode虚拟节点key属性的作用.mp4 24~ ( O w u # D.86MB
│ │ ├─[12.3]–12-3源码阅读:场景一:自前向后的diff对比.mp4 74.85MB
│ │ ├─[12.4]–16 } a g i =2-4框架实现:场景一:自前向后的dil q ? [ i 6 K qff对比.mp4 40.08MB
│ │ ├─[12.5]–12* f +-5源码阅读:场景二:\ $ X P P j % L 8自后向前的diff对比.mp4 36.24MBf w b \ D 8
│ │ ├─[12.6]–12-6框架实现:场景二:自后向前! K e f E # , _ &的diff对比.q h q f e imp4 15.88MA T , !B
│ │ ├─[12.7]–12-7源码阅读:场景三:新节点多余旧节点时的d$ @ V ) p ! tiff比对.mp4 63.07MB
│ │ ├─[12.8]–12-8框架实现:场% e R ?景三:新节点多余旧节点时的diff比对.mp4 1_ ^ \ , J5.98M0 9 q m [ 9 mB
│ │ └─[12.9]–12-9源码阅读:场景四:c @ N n [ % M旧节点E w L多于新节点时的diff比对.mp4 21.17MB
│ ├─{13}–第1A f Y – @ = Z m T3章compiler编译器-编译时核心设计原则iclass=
4 Q | ~ 7 $ │ ├─[13.1]–13-1p O ; & &前言.mp4 41.58MB
│ │ ├─[13.2]–13-2模板编译的核心流程.mp4 18.82MX \ g l B B o xB
│ │ ├─l { f \[13.3]–13-3抽象语法树-AST.mp4 30.02MB
│ │ ├─[13.4]–13n t n g 4 | & k-4ASTU E 3 W转化为JavaScriptAST,获取codege.mp4 37.14MB
│ │ ├─[13.5]–13-5JavaSy ) – T !cripq U n L ? W 8 = ytA1 g – s + , QB L @ & / KST生成rende, b fr函数# U @ N D N代码.mp4 28.23MB
│ │ └─[13.6]–13-6总结.mp4 6.96MB
│ ├─{1}–第1章课程导读
│ │ └─[1.1]–1-1课程导读.mp4 50.9MB
│ ├─{2}–第2章框架设计前瞻-框架设计中的一些基本概念
│ │ ├─[2.10]–2-10运行( i / O时+编译时.mp4 102.79MBD K E { $
│ │ ├─[2.11]–2-11什么是副作用.mp4 24.52MB
│ │ ├─[2.12]–2-12Vue3框架设计概述.h : R p 8 yL 6 @ O F qmp4 29.48D H l Q ` z { h fMB
│ │ ├─[2.13]–2-13扩展:所谓良好的`TypeScript`支持,是如何提供.mp4 39.22MB
│ │ ├─[2.14]–2-14总结.mp4a ) m v U T 3 N 6.53MB
│ │ ├m ; 4 $ S $─[2.1]–2-1前言.m\ F [ Z + r | Sp4 11.99MB
│ │ ├─[2.2]–2-2编? i \ r f L程范式之命U a s O T令式编程.mp4 40.577, ! n X JMB
│ │ ├─[2.3]–2-3编程范式之声明式编程.mp4 26.71MB
│ │ ├─[2.4]–2-4命令式VS声明a l | g式.mp4 43.33MB
Y 5 G & m m D _ │ ├─[2.5]–2-5企业应用的开发与设计原则.mp4 43.37MB
│ │ ├─[2.6]–2-6为什么说框架的设计过程其实是一个不断取* 0 + h 7 Z ` –舍的过n ; ` f . n 6 p程?.mp4 36.33MB
│ │ ├| S _ U ! c B─[2.7]–2-7.T h J r H ; fvue中的html是真实的html吗?.mp4 31.13MB
│ │ ├─[2.8]–2-8什么是运行时?.mp4 102.11MB
│ │ └─[2.9]–2-9什么是编译时?.mp4 44.92c ) – *MB
│ ├─{3}–第3章Vue3源u % r f 9 # E X码结构-搭S | l g s建框架雏形
│ │ ├─[3.10]–3-10模块Q b 0打包器:rollup.mp4 76.31MB
│ │ ├─[3.11]–3-11初见框架雏形:配置路径映射.mp4 36.09MB
│ │n : 5 N u \ h K ├─[3.12]–3-12总结.mp4 9.22MB
│ │ ├─[3.1]–3-! . ~ \ % S T =1前言.mp4 9.05MB
│ │ ├─[3.2]–= | | S c3-2探索源码设计:Vue3源码设计大解析.mp4 72.1, a g4MB
│ │ ├─[3.3]–3-3创建测试实例:在Vue源! # # { ( X码中运行测试实例.mp4 53.94MB
│ │ ├J | P k j z─[3.4]–3-4跟踪解析运行行为:为vue开启SourceMap.mp4 58.2M} ( = A ) 7 T | ZB
│ │ ├─[3.5]–3-5授人以鱼:如何针对源码进行debugger.mp4 32O w ( J u d { $ b.46MB8 ^ Cd 1 g n r & 3 9 C i C f
│ │ ├─[3.6]–3-6授人以渔:\ @ f P 4 k如何D T a o ? j M阅读源码.mp4 43.76MB
│ │ ├─[3.7]–3-7开始搭建自己的框架:创建vue-next-mini.mp P f 8 #P y W 7 7 i t ! r q }p4 41.11MB
│ │ ├─[3.8]–3-; 8 , z I8为框架进行配置:导入ts.mp4 47.7MB
│ │ └─[3.9]–3-9引入代码格式化工具:prettier9 B – Q G让你的代码结构更加规范.mp4 36.45MB
│ ├─{4}–第4章响应系统-响应系J ^ q : ,统的核心设计原则
│ │ ├─[4.1]–4-1前言.mp4 12.52MB
│ │ ├─[4.2]–4-2JS的程序性.mp4n x Q w | Q S 34A I 9 # 7 K =.07MB
│ │ ├─[4.3]–4-? } q w & k Z B $3如何让你的! b F c W _ U程序变得更加2 – r k w J | G 0&am, )} 7 ) d 7 y a , L 1C , z . ~ g Y ; Fp;ldquo;聪明”?.mp4 3[ D ~ % ~4.03MB
│ │ ├─[4.4]–4-4vue2的响应性核心Am + P qPI:ObjY ` + ` sect.definePr.mp4 49.66MB
│ │= 5 b h 5 ├─[4.5]–49 i O V , 7 9 w f-5ObjectB m K.define\ , i jT – K ~ ! ZProperty在设计层– 6 t _ r Y a 2的缺陷.mp4 55.811 W R S LMB
│ │ ├─[4.6]–# v Q . tf { Z ) X t =. P 9 V F l 5 `4a 2 # X E R L ~ K-6vue3的响应性核心API:proxy.mp4% E W f 91.13M8 L D : G T DB
│ │ ├─[4.7]–4-7proxyP ` 5的最佳拍档:Reflect&mdashx W O *;拦截js.mp4 93.54MB
│ │ └─[4.8]–$ ! A L M ? :4-( , K Y f ? H8总结.mp4 11.95MB
│ ├─{5}–第5章响应系) F r Q! e U _ 5 $ l p 7统-初见r+ u w w : L \ M Keactivity模块
│ │ ├─5-13 功能升级:响应数据对应多个 effect.mz b r u )p4 25.43MB
│ │ ├─5-2 源码阅读:r8 A F q { w ueactive 的| m i A ( 9 O N +响应性,跟踪 Vue 3 源v 0 l r N码实现逻辑(1).mp4 112.3MB
A ! b } X P z f { │ ├─5-8 框架实现:构建 effect 函数,生成 Rea} K H S 4 * TctiveEffect 实例.mp4 36.76MB
│ │ ├─[5.10]–5-10框架实现:构建track依赖收集函数.mpd t _4 35.13MB
│ │x M $ E ├─[5.11]–5-11框架实现:构建tri] z M Y k | n v Wgger触发依赖.mp4 23.48MB
│ │ ├─[5.12]–5-18 ( { (2总结:单f } + s ] I ]一依赖的reactive.mp4 24.52MB
C } d u G 6 N ZL O 2 4 e 0 3 ├─[5.14]–5-14框架实现:构建Dep模块,处{ , v理一对多的依赖关系.7 H @ * u ; vmp4 52.59MT 0 I L KB
│ │ ├─[5.15]–5-_ 1 415reactive函数的局限性.mp4I d _ d . I . j [ 33.65MB
│ │ ├─[5.16]–5-1c r u h6总结.mp4 9.28MB
│ │* D T ├─[5.1]–5-1前言.mp4 12.15MB
│ │ ├─[5.3]–5-3源码阅读:reactive的响应性,跟踪Vue3源码实现逻.mp4 99.74MB
│ │ ├─[5.4]–5-4框架实现:Q M j T 3 | R# I : 6 1 ; l建reactive函数,获取proxy实例.mp4 75.88MB
│ │ ├─[5.5]–5-5框架实现:什么是% F & yWeakMap?Q q $ : M /它和Map有什么区别?.mp4 58.2M. $ k %B
│ │ ├─[5.6]–5-6框架实现:crea% W T i ~ X / } uteGeta z 0 ) { * A 3ter&&y 9 $ . z t lamp;cr.Q H lmp4N s x RW 3 N X $ y = j 0 g 54.97MB
│ │ ├─[5.7]–5-7热更新的开发时:提升开发体验.mp4 18.96MB
│ │ └─[5.9]–5-9框架实现:N x P s , w !track&&trigger.mp4 3| S R = \ v5.43MB
│ ├─{6}–第6章响应系统-ref的响应性
│ │ ├─[6.1]–6-1前言.mp4 6.96MB
│ │ ├─[6.2]–6-2源码阅读:ref复y d .杂数据类型的响应性(1).E u 0 * j e _mp4 94.06MB
│ │X / u ├─h n vd L ` p 8 0 : 9 %[6.3]–6: S R [-3源码阅读:ref复y c @ 0 s o % #杂数据类型的响应性(2).mp4 77.24MB
│ │ ├─z , 0[6.4]–] B D }6-4Z & 9 S ! y框架实现:ref函数-构建复杂数据类型的响应性m l H u _ s d.mp4 67.94I 0 2 u 4 ~ (MB
│ │ ├─[6.5]–6J . I-5总结M 9 [:ref复杂数据类型的响应性.mp4 12.6~ N I I ,Y Y f t M V e4MBy Y K
│ │ ├─[6.6]–6-6源码阅读:ref简单数据类型? – , ~的响应性.mp4 66.03MB
│ │ ├─[6.7]–6-7框架实现:ref函数-构建简单数据类型的响应性.mp4 32.85MB
│ │ ├─[6.8]–6-8总结:ref简z C y # t D /单数据类型响应性.mp4 16.9MB
│ │ └─[6.9]–6-9总结.mp4 16.08MB
│ ├─{7}–第7章响应系统-watch&S _ ~amp;amp;&computed
│ │ ├─[7.10]–7-10框架实现:深入schedulY n b . T 6 m }er调度T { q 9 ~ N [ T &系统实现机制.mp4 14} L e % * v BO } [ j * & K 4 n9.89MB
│ │ ├─[7.11]–1 w n + , &7-11框架实现| 1 Q m t f a c n:初步实现watch数据监听器.mp4 112.2MB
│ │ ├─[7.12]–7-12问题o z ( B K ; ?分析:watch下Y G r的依赖收集O t o Z F d原则.mp4 31.23MB
│ │ ├─[7.13]–7-13框架实现:完成watch数据监听器! K [ k q E的依赖收集.mp4 21.1e $ [ ^ $ +9MB
│ │ ├─[7.14]–7-14总结:watch数据侦听器.mp4 9.5MB
│ │ ├─[7.15]–7-15总结.mp4 12.5MB
│ │ ├─[7.1]–7-1开篇.mp4 7.29MB
│ │ ├─[7.2]–7-2源码阅读:k , Gcomputed的响应性,跟踪VuE f ! o A ! , M =e3源码实现逻H | ).mp4 99P 7 N w t.96MB
│ │ ├─[7.3]–7-3源码W 5 R阅读:computed的响应性,跟踪Vue3源码实U 6 , $ [ y Y ; X现逻.mp4 102.31MB
│ │ ├─[7.4]–7-4框架实现:构建ComputedRJ Q 8 = s f 5efImpl,读取w ; { C W 2 h { h计算属性.mp4 62.08MB
│ │ ├─[7.5]–7-5框架实现:computed的P 8 / ]响应性:初见调度器,处理脏的状.mp4 59.36MB
│ │ ├─[7.6]–7-6框架实现:computed的缓o o z + X J S H @存性.mp4 1: 2 ! x W F B I48.65MB
│ │ ├─[7.7]–7-7总结:computed计算属性.mq . { |p4 8.57MB
│ │ ├─[7.8]–7-8源码阅读:响应性的数据监听器watch,跟踪源码实现逻辑(.m\ A 1 R + Mp4 120.34MB
│ │ └─[7.9]–7-9源码阅读:响应性的数据监听器watch,跟踪源码实现逻辑Q F – S P y u h y(.mp4 100.35MB
│ ├─{9}–第9章runtime运行时-构建h函数,生成V7 r 1node
│ │ ├─[9.10]–9-10框架实现:实现剩余场景Text、Commentz Q h [、Frag.mp4 17.6MB
│ │ ├─[9.11]–9-11源码阅读:对class和style的增强处( . 2 7 ! Y B 7理.mp4 44.94MB
│ │ ├─[9.12]–9-12框架实现:完成t ` \虚拟节点下的class和style的增强.mp4 30.9MM F 6 k % ZB
│ │ ├─[9.13]–9-13总结.o e h W 6 #mp4 12.5p 9 W F , oMB
│ │ ├─[9.1]–9-1前言.mp4 10.05MB
│ │ ├─[9.2]–f I x c ,9-2阅读源码:初见h函数,跟踪Vu0 C 7 Me3源码实现基础逻辑c , m 5 n [(1).mp4 5K n | 0 J x x6.96MB
│ │ ├─[9.4]–9-4框架实现:构建h函数,处理ELEM. 1 # ` – #ENT+T$ j { i ] m uEXTCHIt { } [ [ 0 1 V.mp4 100.96MB
d L BO ) 6 M # h F │ ├─[9.5]–9-5源码阅读:h函数,跟踪ELEMEN: F { v ` & mT+ARRAYCHIL.mp4 66.14MB
│ │ ├─[9.6]–9-6框架实现:构建h函数,处理ELEM3 * ? yENT+ARRAYCH.mp4 24.06MB
│ │Z , , 5 _ ├─[9.7]–9-7r 5 m 4 n源码阅读8 N – – V:h函数,组件的本质与对6 k # ` a \ k w w应的VNode.mp4 5U Q 1 4 D ! )5.66MB
│ │ ├─[9.8]–9-8框架实现:处理` ~ B } 6组件的VNode.mpM G & S N Y _4 31.94MB
│ │ └─[9.9]–9-9源码阅读:h函数@ K C,跟踪Text、CoA 9 ) H C { F Pm$ Z / ^ment、Fragm.mp4 43.24MB

点击获o ) E s取课程资源:Vue3源码解析,打造自己的Vue3框架,领悟尤大思维精髓|无秘更新中第13章百度网盘下载

https://zy.98ke.com/zyjn/65052.html?ref=9358

0
没有账号? 注册  忘记密码?