涅盘是什么意思| 什么是佛跳墙| 颇负盛名的颇是什么意思| 药材种植什么最赚钱| 什么是头寸| 负压是什么意思| 双侧附睾头囊肿是什么意思| 症瘕痞块是什么意思| 螃蟹是什么季节吃的| 梦见大象是什么预兆| 血肌酐低是什么原因| 经行是什么意思| 一马平川什么意思| 情窦初开什么意思| 长裙配什么鞋子好看| 活动性肺结核是什么意思| 什么是风象星座| 重阳节为什么要插茱萸| 监守自盗什么意思| 自身免疫性肝病是什么意思| 九什么一毛| 甲鱼喜欢吃什么| dw手表是什么档次| 唐氏筛查高风险是什么意思| 茶油是什么油| 825是什么意思| o型血和什么血型最配| nsaids是什么药| hbeag阳性是什么意思| 导滞是什么意思| 腰间盘膨出吃什么药效果好| 河粉为什么叫河粉| 阻生牙是什么意思| 辰砂是什么| 小囊性灶是什么意思| 丑时是什么时候| pc是什么意思| 念叨是什么意思| 什么样的笑容| 梦见自己被抢劫了预示什么| 胃烧心吃什么能缓解| 喝什么茶能减肥| 鸵鸟心态什么意思| 歌姬是什么意思| 你算什么男人歌词| 世界上最可怕的动物是什么| 失足是什么意思| 为什么会尿酸高| 预防中暑喝什么水| 男性什么适合长期泡水喝| 揽子是什么意思| 隐血十一是什么意思| mchc偏低是什么意思| 为什么不建议打卧蚕呢| t2是什么意思| 笑是什么意思| 下肢浮肿是什么原因引起的| 球菌阳性是什么意思| 鹅喜欢吃什么食物| 夏天喝什么茶减肥| 女生适合养什么狗| 在什么前面用英语怎么说| 透明隔间腔是什么意思| prn医学上是什么意思| 丹毒用什么药膏| 牡蛎是什么| 什么东西补气血效果最好| 什么是原发性高血压和继发性高血压| 副乳挂什么科| 歹且念什么| 甘油三酯高是指什么| 邪犯少阳证是什么意思| 什么不惧| 牵引车是什么车| 邹字五行属什么| 什么牌子的空调好| 排卵期同房要注意什么| 大连机场叫什么名字| 奇亚籽有什么功效| 什么主筋骨| 彩蛋是什么意思| 抽动症是什么原因造成的| 左下腹痛是什么原因| 老年人睡眠多是什么原因| 四月初五是什么星座| 什么洗面奶好用| 夏天脸上皮肤痒是什么原因| 肌炎有什么症状| 潦草什么意思| 生活老师是做什么的| 车水马龙是什么意思| graff是什么牌子| 经常出鼻血是什么原因| pr间期缩短什么意思| 鹿沼土是什么土| 区号是什么| 睡眠障碍应该挂什么科室| 取环是什么意思| 眼睛肿疼是什么原因引起的| 尼姑庵是什么意思| 玻璃心是什么意思| 男性霉菌感染用什么药| 会字五行属什么| 宝宝拉肚子挂什么科| 怀孕吃什么水果最好| 吃什么食物补钾| 11月什么星座| 春晓的晓是什么意思| 中药什么时候喝| 胜利在什么| 梦见别人装修房子是什么预兆| 肺囊肿是什么病严重吗| 81年的鸡是什么命| 徐长卿是什么药| 三天没有大便是什么原因| 山川载不动太多悲哀是什么歌| 一厢情愿什么意思| 淳字五行属什么| y谷氨酰基转移酶高是什么原因| 为什么身份证后面有个x| 九月十五日是什么星座| 焗油是什么意思| 女以念什么| 回笼觉是什么意思| 脑梗的症状是什么| 白斑有什么症状图片| 吃什么养肝| 质询是什么意思| 荆轲姓什么| 皮肤黏膜是什么| 嗓子疼吃什么药好| 滑膜炎吃什么好得快| 行房时硬度不够是什么原因| 咳嗽不能吃什么水果| 脑梗会引起什么症状| 手上长汗疱疹用什么药| 吃什么尿酸降得快| 怕什么| nhl医学上是什么意思| 结果是什么意思| ca724是什么意思| 脑炎是什么病严重吗| 什么眼霜去眼袋效果好| 软饮料是指什么| 金代表什么生肖| 缪斯女神什么意思| 纤维瘤是什么病| 便秘喝什么药| 不饱和脂肪酸是什么意思| 椰浆和椰汁有什么区别| 为什么会有口腔溃疡| 12月20日什么星座| 农历7月15是什么节| 樱桃和车厘子有什么区别| 充电宝什么品牌最好| 鱼肉百姓什么意思| 道德经适合什么人看| 牡丹花是什么颜色的| 枉是什么意思| 早餐吃什么最减肥瘦身| 感染乙肝病毒有什么症状| 座山雕什么意思| 翻来覆去是什么意思| 梦见小孩生病什么预兆| 青葱岁月是什么意思| 反酸水是什么原因| 正部级是什么级别| 玉米须加什么治痛风| 甲沟炎是什么原因引起的| 瑞舒伐他汀钙片什么时候吃| 乳头痛是什么原因| 贫血吃什么东西好| 南乳和腐乳有什么区别| 煮红枣为什么有白色的漂浮物| 喝完酒胃疼吃什么药| 钟乳石是什么| 尿蛋白弱阳性什么意思| 青羊药片有什么功效| 拉肚子吃什么蔬菜| 现在什么冰箱最好| 九月十号是什么节日| 什么时候恢复高考| 田螺吃什么食物| 丑时五行属什么| 痰多是什么原因引起的| 疱疹有什么症状表现| 睡觉中途总醒什么原因| 霉菌阴道炎用什么药| 猕猴桃什么时候成熟| 十一朵玫瑰花代表什么意思| 看演唱会需要准备什么| 码是什么单位| 葡萄糖升高说明什么| 美林是什么药| 紫薇是什么意思| 大量出汗是什么原因引起的| 宝宝胀气是什么原因引起的| 什么动物吃蜘蛛| 喝什么补血| 尿液发红是什么原因| 什么人容易得间质瘤| 化生是什么意思| 个子矮吃什么才能长高| 胭脂是什么东西| 父母是什么意思| 屌丝是什么| cpi指数上涨意味着什么| 老年人经常头晕是什么原因造成的| 情感和感情有什么区别| 味甘是什么意思| 瑕疵什么意思| 五月份是什么星座| uspoloassn是什么牌子| 屑是什么意思| 胃轻度肠化是什么意思| 埃及艳后叫什么| 泰迪哼哼唧唧表示什么| 敖包是什么意思| 层出不穷什么意思| 转氨酶高吃什么药效果好| 什么菊花茶降火最好| 肝属什么| 孕妇感冒了对胎儿有什么影响| 类风湿什么症状| 苏州机场叫什么名字| 戒奶涨奶痛有什么缓解方法| 胚发育成什么| 随意是什么意思| 宫颈鳞状上皮增生是什么意思| 屁多是什么原因造成的| 老白茶属于什么茶| 孕妇牙痛有什么办法| 送巧克力代表什么意思| 朱砂有什么用| 多囊卵巢综合症吃什么食物好| 留守儿童是什么意思| 女性尿检能查出什么病| 什么叫肺结节| 红茶有什么功效| 喝水经常呛到是什么原因| 脑心通主治什么病| 同位素是什么| 一心一意指什么生肖| 吃什么药能延迟射精| 头发没有光泽是什么原因| 外阴瘙痒用什么药膏好| who医学上是什么意思| 卵巢囊肿是什么原因引起的| 杀手锏是什么意思| 婴儿头发竖起来是什么原因| 脑震荡是什么症状| 淀粉可以用什么代替| 拉伤筋用什么药好| 上颚疼吃什么药| 吃什么药能来月经| 尿隐血是什么原因引起的| b2驾照能开什么车| 缺镁吃什么药| 什么是植物神经功能紊乱| 任性妄为是什么意思| 985211是什么意思| 瞌睡多什么原因| 眼泪为什么是咸的| 九月24日是什么星座| 百度Lompat ke isi

车讯:日内瓦车展首发 新雷克萨斯LS 500h官图

Jak Wikipidiya
百度 本场比赛小南斯、汤普森和胡德复出,这也是双方本赛季常规赛最后一次交手,在3月14日首次交锋中,骑士129-107击败太阳。

Dokumentasi untuk modul ini dapat dibuat di Modul:TableTools/doc

------------------------------------------------------------------------------------
--                                   TableTools                                   --
--                                                                                --
-- This module includes a number of functions for dealing with Lua tables.        --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke.                                               --
------------------------------------------------------------------------------------

local libraryUtil = require('libraryUtil')

local p = {}

-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti

------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
	return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end

------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
	return type(v) == 'number' and v ~= v
end

------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
	checkType('shallowClone', 1, t, 'table')
	local ret = {}
	for k, v in pairs(t) do
		ret[k] = v
	end
	return ret
end

------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(arr)
	checkType('removeDuplicates', 1, arr, 'table')
	local isNan = p.isNan
	local ret, exists = {}, {}
	for _, v in ipairs(arr) do
		if isNan(v) then
			-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
			ret[#ret + 1] = v
		elseif not exists[v] then
			ret[#ret + 1] = v
			exists[v] = true
		end
	end
	return ret
end

------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
	checkType('numKeys', 1, t, 'table')
	local isPositiveInteger = p.isPositiveInteger
	local nums = {}
	for k in pairs(t) do
		if isPositiveInteger(k) then
			nums[#nums + 1] = k
		end
	end
	table.sort(nums)
	return nums
end

------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
	checkType('affixNums', 1, t, 'table')
	checkType('affixNums', 2, prefix, 'string', true)
	checkType('affixNums', 3, suffix, 'string', true)

	local function cleanPattern(s)
		-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
		return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
	end

	prefix = prefix or ''
	suffix = suffix or ''
	prefix = cleanPattern(prefix)
	suffix = cleanPattern(suffix)
	local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'

	local nums = {}
	for k in pairs(t) do
		if type(k) == 'string' then
			local num = mw.ustring.match(k, pattern)
			if num then
				nums[#nums + 1] = tonumber(num)
			end
		end
	end
	table.sort(nums)
	return nums
end

------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
	checkType('numData', 1, t, 'table')
	checkType('numData', 2, compress, 'boolean', true)
	local ret = {}
	for k, v in pairs(t) do
		local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
		if num then
			num = tonumber(num)
			local subtable = ret[num] or {}
			if prefix == '' then
				-- Positional parameters match the blank string; put them at the start of the subtable instead.
				prefix = 1
			end
			subtable[prefix] = v
			ret[num] = subtable
		else
			local subtable = ret.other or {}
			subtable[k] = v
			ret.other = subtable
		end
	end
	if compress then
		local other = ret.other
		ret = p.compressSparseArray(ret)
		ret.other = other
	end
	return ret
end

------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
	checkType('compressSparseArray', 1, t, 'table')
	local ret = {}
	local nums = p.numKeys(t)
	for _, num in ipairs(nums) do
		ret[#ret + 1] = t[num]
	end
	return ret
end

------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
	checkType('sparseIpairs', 1, t, 'table')
	local nums = p.numKeys(t)
	local i = 0
	local lim = #nums
	return function ()
		i = i + 1
		if i <= lim then
			local key = nums[i]
			return key, t[key]
		else
			return nil, nil
		end
	end
end

------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
	checkType('size', 1, t, 'table')
	local i = 0
	for _ in pairs(t) do
		i = i + 1
	end
	return i
end

local function defaultKeySort(item1, item2)
	-- "number" < "string", so numbers will be sorted before strings.
	local type1, type2 = type(item1), type(item2)
	if type1 ~= type2 then
		return type1 < type2
	elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
		return tostring(item1) < tostring(item2)
	else
		return item1 < item2
	end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
	if not checked then
		checkType('keysToList', 1, t, 'table')
		checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
	end

	local arr = {}
	local index = 1
	for k in pairs(t) do
		arr[index] = k
		index = index + 1
	end

	if keySort ~= false then
		keySort = type(keySort) == 'function' and keySort or defaultKeySort
		table.sort(arr, keySort)
	end

	return arr
end

------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
	checkType('sortedPairs', 1, t, 'table')
	checkType('sortedPairs', 2, keySort, 'function', true)

	local arr = p.keysToList(t, keySort, true)

	local i = 0
	return function ()
		i = i + 1
		local key = arr[i]
		if key ~= nil then
			return key, t[key]
		else
			return nil, nil
		end
	end
end

------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
	if type(v) ~= 'table' then
		return false
	end
	local i = 0
	for _ in pairs(v) do
		i = i + 1
		if v[i] == nil then
			return false
		end
	end
	return true
end

------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
	if not pcall(pairs, v) then
		return false
	end
	local i = 0
	for _ in pairs(v) do
		i = i + 1
		if v[i] == nil then
			return false
		end
	end
	return true
end

------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to
-- the index of the last duplicate) and NaN values are ignored.
------------------------------------------------------------------------------------
function p.invert(arr)
	checkType("invert", 1, arr, "table")
	local isNan = p.isNan
	local map = {}
	for i, v in ipairs(arr) do
		if not isNan(v) then
			map[v] = i
		end
	end

	return map
end

------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them
-- never equal to any value (including other NaNs or even themselves).
------------------------------------------------------------------------------------
function p.listToSet(arr)
	checkType("listToSet", 1, arr, "table")
	local isNan = p.isNan
	local set = {}
	for _, v in ipairs(arr) do
		if not isNan(v) then
			set[v] = true
		end
	end

	return set
end

------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
	if type(orig) ~= "table" then
		return orig
	end
	
	-- already_seen stores copies of tables indexed by the original table.
	local copy = already_seen[orig]
	if copy ~= nil then
		return copy
	end
	
	copy = {}
	already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops
	
	for orig_key, orig_value in pairs(orig) do
		copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
	end
	
	if includeMetatable then
		local mt = getmetatable(orig)
		if mt ~= nil then
			setmetatable(copy, _deepCopy(mt, true, already_seen))
		end
	end
	
	return copy
end

function p.deepCopy(orig, noMetatable, already_seen)
	checkType("deepCopy", 3, already_seen, "table", true)
	return _deepCopy(orig, not noMetatable, already_seen or {})
end

------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d}  =>  "acd"
-- sparseConcat{nil, b, c, d}  =>  "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
	local arr = {}

	local arr_i = 0
	for _, v in p.sparseIpairs(t) do
		arr_i = arr_i + 1
		arr[arr_i] = v
	end

	return table.concat(arr, sep, i, j)
end

------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of  the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
	-- requiring module inline so that [[Modul:Exponential search]] which is
	-- only needed by this one function doesn't get millions of transclusions
	local expSearch = require("Modul:Exponential search")
	checkType('length', 1, t, 'table')
	checkType('length', 2, prefix, 'string', true)
	return expSearch(function (i)
		local key
		if prefix then
			key = prefix .. tostring(i)
		else
			key = i
		end
		return t[key] ~= nil
	end) or 0
end

------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if searchElement is a member of the array, and false otherwise.
-- Equivalent to JavaScript array.includes(searchElement) or
-- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed
------------------------------------------------------------------------------------
function p.inArray(array, searchElement, fromIndex)
	checkType("inArray", 1, array, "table")
	-- if searchElement is nil, error?

	fromIndex = tonumber(fromIndex)
	if fromIndex then
		if (fromIndex < 0) then
			fromIndex = #array + fromIndex + 1
		end
		if fromIndex < 1 then fromIndex = 1 end
		for _, v in ipairs({unpack(array, fromIndex)}) do
			if v == searchElement then
				return true
			end
		end
	else
		for _, v in pairs(array) do
			if v == searchElement then
				return true
			end
		end
	end
	return false
end

------------------------------------------------------------------------------------
-- merge
--
-- Given the arrays, returns an array containing the elements of each input array
-- in sequence.
------------------------------------------------------------------------------------
function p.merge(...)
	local arrays = {...}
	local ret = {}
	for i, arr in ipairs(arrays) do
		checkType('merge', i, arr, 'table')
		for _, v in ipairs(arr) do
			ret[#ret + 1] = v
		end
	end
	return ret
end

------------------------------------------------------------------------------------
-- extend
--
-- Extends the first array in place by appending all elements from the second
-- array.
------------------------------------------------------------------------------------
function p.extend(arr1, arr2)
	checkType('extend', 1, arr1, 'table')
	checkType('extend', 2, arr2, 'table')

	for _, v in ipairs(arr2) do
		arr1[#arr1 + 1] = v
	end
end

return p
尿酸520属于什么水平 起死回生是什么生肖 男人要的归属感是什么 92年属猴的是什么命 军犬一般是什么品种
急性肠胃炎可以吃什么 缅甸的首都叫什么名字 969368是什么电话 幽门杆菌的症状是什么 洧是什么意思
类固醇是什么东西 急性痛风吃什么药 夕阳西下是什么意思 活检检查是什么意思 什么样的人容易垂体瘤
粉色是什么颜色配成的 多吃黄瓜有什么好处 检查肠胃挂什么科 珍珠鸟是什么鸟 魂牵梦绕的意思是什么
食是什么生肖hcv9jop5ns6r.cn 二月初二是什么星座hcv9jop6ns7r.cn 双侧筛窦粘膜增厚是什么意思hcv9jop1ns0r.cn 2002年属什么生肖hcv9jop3ns4r.cn 类风湿忌吃什么hcv8jop2ns3r.cn
非甾体抗炎药是什么意思hcv8jop8ns8r.cn 做梦梦见好多蛇是什么预兆hcv9jop1ns6r.cn 感冒吃什么消炎药效果好hcv9jop3ns0r.cn 忍辱负重是什么意思hcv7jop9ns2r.cn 三项规定内容是什么0297y7.com
应无所住而生其心什么意思hcv7jop9ns7r.cn 愤是什么生肖hcv9jop8ns2r.cn 有尿意但是尿不出来是什么原因hcv9jop4ns7r.cn 梦到怀孕生孩子是什么意思hcv8jop8ns1r.cn 空腹洗澡有什么危害clwhiglsz.com
下午茶一般吃什么hcv9jop6ns7r.cn 在五行中属什么hcv9jop1ns1r.cn 一什么雨伞hcv9jop5ns2r.cn 农历8月13日是什么星座beikeqingting.com 兆上面是什么单位creativexi.com
百度