Slide 1

Slide 1 text

ϞόΠϧܾࡁΞϓϦͷ࡞Γํ How to develop a mobile payment app @kenmaz merpay #iosdc iOSDC Japan 2019 Sep. 9th, 2019

Slide 2

Slide 2 text

ࠓ೔࿩͢͜ͱ wϞόΠϧܾࡁΞϓϦ֓ཁ wࣾձతഎܠɾ๏཯ͷ࿩ wΞϓϦͷߏ੒͢Δٕज़ཁૉ w"QQMF1BZͷ࢓૊Έ wίʔυܾࡁͷ࢓૊Έ wطଘΞϓϦ΁ͷܾࡁػೳͷ૊ΈࠐΈ

Slide 3

Slide 3 text

ϞόΠϧܾࡁΞϓϦΛ औΓרࣾ͘ձతഎܠ

Slide 4

Slide 4 text

ܦࡁ࢈ۀল ΩϟογϡϨεɾϏδϣϯ https://www.meti.go.jp/policy/mono_info_service/cashless/index.html ೥ ೥ ‐ ೥ ‐ ‐

Slide 5

Slide 5 text

wຊਓ֬ೝʹؔ͢Δ๏վਖ਼ F,:$ wΩϟογϡϨεਪਐڠٞձ wίʔυܾࡁ౷Ұ࢓༷ʮ+123ʯͷࡦఆ w+123ීٴࣄۀ wΩϟογϡϨεɾফඅऀؐݩࣄۀ ˠϞόΠϧܾࡁࣄۀʹࢀೖ͠΍͍͢؀ڥʹ ΩϟογϡϨεීٴʹ޲͚ͨಈ͖ ޙड़ ޙड़ IUUQTDBTIMFTTHPKQ

Slide 6

Slide 6 text

ϞόΠϧܾࡁΞϓϦͷߏ੒ཁૉ

Slide 7

Slide 7 text

ϞόΠϧܾࡁΞϓϦͷߏ੒ཁૉ $BTI*O $BTI0VU 8BMMFU

Slide 8

Slide 8 text

$BTI*O ೖۚखஈ wۜߦޱ࠲͔Βνϟʔδ wίϯϏχνϟʔδ wΫϨδοτΧʔυ wݸਓؒૹۚ wϑϦϚΞϓϦͷച্ۚ wʜ

Slide 9

Slide 9 text

$BTI0VU ग़ۚखஈ w"QQMF1BZ wίʔυܾࡁ wωοτܾࡁ wݸਓؒૹۚ wۜߦޱ࠲ৼࠐ ޙड़ ޙड़

Slide 10

Slide 10 text

8BMMFU $BTI*O $BTI0VU

Slide 11

Slide 11 text

"QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU ۜߦޱ࠲νϟʔδ ίϯϏχ"5. νϟʔδ ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ ࢿܾۚࡁ๏

Slide 12

Slide 12 text

ۜߦޱ࠲νϟʔδ ίϯϏχ"5. νϟʔδ ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ "QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU લ෷ࣜࢧ෷͍खஈൃߦۀ ϙΠϯτ IUUQTXXXTLFTTBJKQJOGPMBXIUNM

Slide 13

Slide 13 text

"QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU ۜߦޱ࠲νϟʔδ ίϯϏχ"5. νϟʔδ ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ ऩೲ୅ߦۀ ˞ٞ࿦͋Γ ˞஫ IUUQTTUPSJBMBXKQCMPH

Slide 14

Slide 14 text

"QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU ۜߦޱ࠲νϟʔδ ίϯϏχ"5. νϟʔδ ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ ࢿۚҠಈۀ IUUQTXXXTLFTTBJKQJOGPMBXIUNM

Slide 15

Slide 15 text

ࢿۚҠಈۀ d w ۜߦ౳Ҏ֎ͷऀ͕ҝସऔҾΛۀͱͯ͠ӦΉ΋ͷ w ಺ֳ૯ཧେਉͷొ࿥͕ඞཁ w ̍ճ͋ͨΓͷૹֹۚສԁҎԼ w ߴ౓ͳ૊৫੔උ w ࡒ੓ج൫੔උ w ൜ࡑऩӹҠస๷ࢭ๏ͷن੍Λड͚Δ ࢿܾۚࡁ๏ୈࡾेࣣ৚ IUUQTFMBXTFHPWHPKQTFBSDIFMBXT4FBSDIFMBXT@TFBSDIMTHEFUBJM MBX*E"$

Slide 16

Slide 16 text

൜ࡑऩӹҠస๷ࢭ๏ w ൜ࡑऩӹͷҠసʢʹϚωʔϩϯμϦϯάʣͳ ͲΛ๷ࢭ͢ΔͨΊͷ๏཯ w औҾ࣌֬ೝٛ຿ w औҾ࣌ʹຊਓ֬ೝ ,:$ ͕ඞཁ w Ͳ͏΍ͬͯʁ ൜ࡑʹΑΔऩӹͷҠస๷ࢭʹؔ͢Δ๏཯ୈ࢛৚ IUUQTFMBXTFHPWHPKQTFBSDIFMBXT4FBSDIFMBXT@TFBSDIMTHEFUBJM MBX*E"$ ,:$,OPX:PVS$VTUPNFS

Slide 17

Slide 17 text

༣ศʹΑΔ,:$ w ূ໌ॻͷࣸਅΛΞϓϦ͔ΒΞοϓϩʔυ w ৹ࠪͷޙɺຊਓडऔݶఆॻཹ͕༣ૹ w ̍ʙ̎ि͔͔ؒΔ ܾࡁࣄۀऀ Ξοϓϩʔυ ຊਓडऔݶఆॻཹ ৹ࠪ

Slide 18

Slide 18 text

ۜߦޱ࠲઀ଓʹΑΔ,:$ w ۜߦޱ࠲͕ۜߦʹΑΔ,:$ࡁΈͰ͋Δ͜ͱΛ ࠜڌʹɺΞϓϦͷޱ࠲΋,:$ࡁΈͱΈͳ͢ ,:$ࡁΈ 㲈,:$ࡁΈ

Slide 19

Slide 19 text

F,:$ ͷ๏վਖ਼ʹΑΓɺΦϯϥΠϯͰ׬݁͢Δ ຊਓ֬ೝ F,:$ ͕Մೳʹͳͬͨ IUUQTXXXZPVUVCFDPNXBUDI WLI0Z-WEPT)6

Slide 20

Slide 20 text

"QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU ۜߦޱ࠲νϟʔδ ίϯϏχ"5.νϟʔδ ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ ຊਓ֬ೝ ,:$ ϞόΠϧܾࡁΞϓϦͷߏ੒ཁૉ

Slide 21

Slide 21 text

"QQMF1BZ

Slide 22

Slide 22 text

ͦ΋ͦ΋"QQMF1BZͱ͸ ˠ͘͢͝ศརͰηΩϡΞͳ ΫϨδοτΧʔυϕʔεͷܾࡁํ๏

Slide 23

Slide 23 text

J04 %FWJDF "QQMF τʔΫϯ ϓϩόΠμʔ wΧʔυ໊ٛ wΧʔυ൪߸ '1"/ wηΩϡϦςΟίʔυ %1"/ 4FDVSF &MFNFOU IUUQTTVQQPSUBQQMFDPNKBKQ)5 "QQMF1BZͷΧʔυొ࿥ϑϩʔ '1"/ˠ%1"/ ੜͷΧʔυ൪߸ͱ͸ผͷΧʔυ ൪߸ʢ%1"/τʔΫϯʣʹม׵

Slide 24

Slide 24 text

J04 %FWJDF ͓ళ τʔΫϯ ϓϩόΠμʔ "VUI ✅ %1"/ 4FDVSF &MFNFOU Χʔυ ձࣾ "QQMF1BZͷܾࡁϑϩʔ %1"/ˠ'1"/ '1"/ J04σόΠεʙτʔΫϯϓϩόΠμʔؒͰ ੜͷΧʔυ൪߸ '1"/ Λྲྀͣ͞ʹܾࡁՄೳ

Slide 25

Slide 25 text

$BTI0VUखஈͱͯ͠ͷ "QQMF1BZ ܾࡁΞϓϦͷ࢒ߴͱ"QQMF1BZΛ௚݁

Slide 26

Slide 26 text

"QQMF1BZ*O"QQ1SPWJTJPOJOH

Slide 27

Slide 27 text

Χʔυ ձࣾ "QQMF όʔνϟϧϓϦϖΠυΧʔυͷ
 ൃߦཁٻ Χʔυൃߦ '1"/ %1"/ Χʔυొ࿥ ཁٻ Χʔυొ࿥ "QQMF1BZ*O"QQ1SPWJTJPOJOH

Slide 28

Slide 28 text

1BTT,JU w Χʔυొ࿥ॲཧ w 1,"EE1BZNFOU1BTT7JFX$POUSPMMFS w 1,"EE1BZNFOU1BTT3FRVFTU w ొ࿥ঢ়ଶɾ୺຤ରԠঢ়گͷνΣοΫ w 1,1BTT-JCSBSZ1,1BZNFOU1BTT ˞DPNBQQMFEFWFMPQFSQBZNFOUQBTTQSPWJTJPOJOH&OUJUMFNFOU͕ඞཁ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOQBTTLJU IUUQTEFWFMPQFSBQQMFDPNMJCSBSZBSDIJWFEPDVNFOUBUJPO.JTDFMMBOFPVT3FGFSFODF&OUJUMFNFOU,FZ3FGFSFODF "QQMF1BZBOE1BTT,JU&OUJUMFNFOUT"QQMF1BZBOE1BTT,JU&OUJUMFNFOUTIUNMBQQMF@SFGEPDVJE51$)48

Slide 29

Slide 29 text

༨ஊ"QQMF1BZ$BTI IUUQTTVQQPSUBQQMFDPNKBKQHVJEFJQIPOFJQIDGJPT

Slide 30

Slide 30 text

ίʔυܾࡁ

Slide 31

Slide 31 text

ίʔυܾࡁͷछྨ .FSDIBOU1SFTFOUFE.PEF
 ళฮఏࣔܕ $1. .1. $POTVNFS1SFTFOUFE.PEF
 ར༻ऀఏࣔܕ ੩తಈత

Slide 32

Slide 32 text

ίʔυܾࡁͷ࢓૊Έ ֤ࣾಠࣗ࢓༷ ඇެ։

Slide 33

Slide 33 text

+123 IUUQTOFXTNZOBWJKQBSUJDMF

Slide 34

Slide 34 text

+123 w ΩϟογϡϨεਪਐڠٞձ w ֤ࣄۀऀͱڞʹίʔυܾࡁʹؔ͢Δٕज़ͳ౷Ұ࢓༷ Λཱ֬͠ɺΨΠυϥΠϯΛࡦఆ w 23ίʔυͷσʔλϑΥʔϚοτ w γεςϜͷશମઃܭ w ηΩϡϦςΟཁ݅ͳͲ w ͻͱͭͷ23ίʔυͰෳ਺ͷܾࡁαʔϏε͕ར༻Մೳ IUUQTXXXQBZNFOUTKBQBOPSKQKQRS 23ίʔυ͸ ג σϯιʔ΢Σʔϒͷొ࿥঎ඪͰ͢

Slide 35

Slide 35 text

$1. ར༻ऀఏࣔܕ IUUQTXXXNFSQBZDPNNFSDIBOU

Slide 36

Slide 36 text

$1.ܾࡁͷશମϑϩʔ +123ίʔυܾࡁʹؔ͢Δ౷Ұٕज़࢓༷ΨΠυϥΠϯʲར༻ऀఏࣔܕʳ IUUQTXXXQBZNFOUTKBQBOPSKQXPSEQSFTTXQDPOUFOUVQMPBET$1.@(VJEFMJOF@QEG ίʔυܾࡁࣄۀऀ ᶆܾࡁཁٻ ᶃϫϯλΠϜτʔΫϯΛൃߦ ᶄ23ίʔυόʔίʔυ ͱͯ͠දࣔ ᶅ104Ϩδ୺຤PS Ճໍళ༻ΞϓϦ ͰಡΈࠐΈ

Slide 37

Slide 37 text

ίʔυ࢓༷ ˡ౷Ұόʔίʔυ࢓༷ ˡ౷Ұ23ίʔυ࢓༷

Slide 38

Slide 38 text

౷Ұόʔίʔυ࢓༷ w ࣄۀऀࣝผίʔυ ܻ τʔΫϯ෦ /ܻ w ࠷େԣ෯DNͰදࣔ͢Δ͜ͱ DN

Slide 39

Slide 39 text

౷Ұ23ίʔυ࢓༷ w &.7࢓༷ $1. ˞ ͱڞଘՄೳͳ࢓༷ w ಛఆλάΛݟΔͱ+123ϑΥʔϚοτ͔ &.7 $1. ϑΥʔϚοτ͔൑ผͰ͖Δ w ւ֎ͷίʔυܾࡁࣄۀऀͷίʔυͱͷࣝผ͕Մೳ ˞&.7 $1. &.7$P -$$ ˞ ͕ࡦఆͨ͠άϩʔόϧͳ23ίʔυܾࡁ࢓༷
 ˞&.7$P-$$&.7 ˞ ࢓༷ͳͲΛࡦఆ͢Δٕज़ஂମ
 ˞&.7*$ܕΫϨδοτΧʔυͷ౷Ұن֨ IUUQTXXXFNWDPDPNFNWUFDIOPMPHJFTRSDPEFT

Slide 40

Slide 40 text

l+12399'//////ʜz σίʔυ 5BH આ໌ ௕͞ ஋ ϖΠϝϯτϑΥʔϚοτࣝผࢠ l+123z ΞϓϦέʔγϣϯςϯϓϨʔτ Մม௕ ʜ ' "%'/BNF ϒϥϯυࣝผࢠ Մม௕ lz 5SBDL *%౳ Մม௕ ܾࡁ*% 5-7 λά ௕͞ ஋ ܗࣜ +123 ϑΥʔϚοτ lࣄۀऀࣝผίʔυ ܻ zlτʔΫϯ෦ /ܻ z
 ˠ౷Ұόʔίʔυͱڞ௨

Slide 41

Slide 41 text

23छผ൑ผ +123 &.7 ࣄۀऀࣝผίʔυ൑ผ ˓˓1BZ ☓☓1BZ ˚˚1BZ ւ֎1BZ τʔΫϯ൑ผ Ϣʔβಛఆܾࡁॲཧ։࢝ ˑˑ1BZ &.7ࣄۀऀ൑ผ +123&.7ରԠ
 104୺຤

Slide 42

Slide 42 text

23ίʔυόʔίʔυͷදࣔ import CoreImage import Foundation let payload = “8505JPQR164XX4F08123456785712345678NNNNN." // QRίʔυ let filter = CIFilter(name: "CIQRCodeGenerator")! let data = string.data(using: .utf8) filter.setValue(data, forKey: "inputMessage") filter.setValue("H", forKey: "inputCorrectionLevel") let image = UIImage(ciImage: filter.outputImage!) // όʔίʔυ let filter = CIFilter(name: “CICode128BarcodeGenerator")! จࣈྻɾɾɾ

Slide 43

Slide 43 text

J04d IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFJNBHFDJpMUFSCBSDPEFHFOFSBUPSpMUFS DIBOHFTMBUFTU@NJOPSMBOHVBHFPCKD IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFJNBHFDJpMUFSRSDPEFHFOFSBUPS DIBOHFTMBUFTU@NJOPSMBOHVBHFPCKD

Slide 44

Slide 44 text

$1.ʹ͓͚Δͦͷଞͷཹҙ఺ w 23ίʔυΛදࣔ͢Δͱ͖͸εΫ Ϧʔϯͷً౓Λ࠷େݶʹ্͛Δ w όʔίʔυͱ23ίʔυ͸ಉҰը໘ ʹදࣔ w εΫϦʔϯγϣοτࡱӨ࣌ʹ͸ܯࠂ දࣔ

Slide 45

Slide 45 text

੩త.1. ళฮఏࣔܕ IUUQTKQNFSQBZDPNOFXTRS IUUQTKQNFSQBZDPNOFXTNFSQBZ@PTBLB

Slide 46

Slide 46 text

.1.ܾࡁͷશମϑϩʔ ίʔυܾࡁࣄۀऀ ᶃ੩త23ίʔυΛࡱӨ ᶅܾࡁϦΫΤετ ͷૹ৴ ᶄऔҾֹۚΛೖྗ ᶆ݁Ռදࣔ IUUQTXXXQBZNFOUTKBQBOPSKQXPSEQSFTTXQDPOUFOUVQMPBET.1.@(VJEFMJOF@QEG ίʔυܾࡁʹؔ͢Δ౷Ұٕज़࢓༷ΨΠυϥΠϯʲళฮఏࣔܕʳ ʢᶈళһʹΑΔ֬ೝʣ ᶇళһʹΑΔ
 ֬ೝ

Slide 47

Slide 47 text

౷Ұ੩త23ίʔυ࢓༷ w $1.ͱಉ͘͡&.7࢓༷ .1. ϕʔε w ళฮଆͷ৘ใ͕֨ೲ͞Ε͍ͯΔͷͰ$1.ΑΓ΋৘ ใྔ͸ଟ͍ w ๏ਓɺళ໊ɺࢧళ໊ɺԿ൪ςʔϒϧʜ w औҾֹۚɺ௨՟छผʜ

Slide 48

Slide 48 text

lKQPSQBZNFOUTKBQBOBBBBBBBB BBBBBCCCCDDDDDDEEEEEE ʜz *% આ໌ ௕͞ ஋ lz ࢓༷WFSTJPO lz lz ੩తಈతϑϥά lz ੩త lz ܖ໿ళ৘ใ ܖ໿ళ৘ใ lz औҾ௨՟ lz ԁ lz औҾֹۚ ೚ҙ ʜ ʜ ʜ ʜ *% આ໌ ௕͞ ஋ lz (MPCBM6OJRVF*EFOUJpFS lKQPSQBZNFOUTKBQBOz lz ౷Ұళฮࣝผίʔυ؅ཧϨϕϧ1 lBBBBBBBBBBBBBz lz ౷Ұళฮࣝผίʔυ؅ཧϨϕϧ2 lCCCCz lz ౷Ұళฮࣝผίʔυ؅ཧϨϕϧ3 lDDDDDDz lz ౷Ұళฮࣝผίʔυ؅ཧϨϕϧ4 lEEEEEEz ܖ໿ళ৘ใ ୺຤εςοΧʔྫ l൪ςʔϒϧz ܖ໿ళྫ z৽ڮ̍߸ళz ϒϥϯυྫ z˓˓԰z ๏ਓྫ l˓˓גࣜձࣾz σίʔυ

Slide 49

Slide 49 text

23ίʔυͷεΩϟϯ import AVFoundation let session = AVCaptureSession() let input = try! AVCaptureDeviceInput(device: videoDevice) var output = AVCaptureMetadataOutput() output.setMetadataObjectsDelegate(self, queue: …) session.addInput(input) session.addOutput(self.output) output.metadataObjectTypes = [.qr] session.startRunning() extension …: AVCaptureMetadataOutputObjectsDelegate { public func metadataOutput(.., meta: [AVMetadataObject],..) { … = meta.compactMap { in if let code = $0 as? AVMetadataMachineReadableCodeObject, code.type == .qr, let val = code.stringValue { return val

Slide 50

Slide 50 text

.1.ʹ͓͚Δͦͷଞͷཹҙ఺ w ܾࡁ׬ྃը໘ w εΫγϣ౳ɺը໘ͷِ଄͕༰қ w ΞχϝʔγϣϯɺԻɺλΠϜελ ϯϓͷදࣔͳͲΛߦِ͍଄Λ๷͙ w ར༻ऀɾళһ༻ΞϓϦ΁ͷऔҾ׬ ྃ௨஌

Slide 51

Slide 51 text

+123ίʔυ࢓༷·ͱΊ $1. .1. Կ1BZ Ϣʔβ͸୭ʁ Ͳͷςʔϒϧ ֹۚ Ͳ͜ͷళʁ

Slide 52

Slide 52 text

w 23ίʔυ಺෦ͷ৘ใΛ֬ೝͰ͖Δπʔϧ w ରԠϑΥʔϚοτ w &.7$1..1. w +123$1..1. +1233FBEFS IUUQTHJUIVCDPNLFONB[+1233FBEFS 044

Slide 53

Slide 53 text

طଘΞϓϦ

Slide 54

Slide 54 text

طଘΞϓϦ΁ͷ ܾࡁػೳͷ૊ΈࠐΈ ʙϝϧΧϦϝϧϖΠͷ৔߹ʙ

Slide 55

Slide 55 text

ػೳ͝ͱʹGSBNFXPSLΛ෼ׂ

Slide 56

Slide 56 text

ෳ਺νʔϜʹΑΔಉ࣌։ൃ 4BOECPY 4BOECPYΛ༻͍ͨ։ൃޮ཰Խ

Slide 57

Slide 57 text

%FQFOEFODZ*OKFDUJPO

Slide 58

Slide 58 text

"QQMF1BZ ϓϩϏδϣχϯά ίʔυܾࡁ
 $1. ίʔυܾࡁ
 .1. ઃఆ։࢝ ઃఆ׬ྃ ܾࡁ׬ྃ ܾࡁ׬ྃ J1IPOF࣮ػ 'FMJ$B ίʔυϦʔμʔ࣮ػ J1IPOF࣮ػ Χϝϥ

Slide 59

Slide 59 text

֤छಈ࡞֬ೝʹ࣮ػ͕ඞཁ w ຖճ࣮ػసૹͯ͠։ൃ͠ͳ͍ͱ͍͚ͳ͍ w ೔ʑͷ։ൃ͸J044JNVMBUPS্Ͱ׬͍݁ͨ͠ ˠ%* %FQFOEFODZ*OKFDUJPO Λ࢖͏

Slide 60

Slide 60 text

QSPUPDPM233FBEFS5ZQF\
 GVODNFUBEBUB0VUQVU QBZMPBE4USJOH 
 ^ DMBTT233FBEFS233FBEFS5ZQF\
 GVODNFUBEBUB0VUQVU QBZMPBE4USJOH \
 MFUTFTTJPO"7$BQUVSF4FTTJPOʜ
 ʜ ^ 3FMFBTF#VJME DMBTT233FBEFS4UVC233FBEFS5ZQF\
 GVODNFUBEBUB0VUQVU QBZMPBE4USJOH \
 SFUVSOl%6..:@7"-6&z ^
 ^ %FCVH#VJME ྫ %*ʹΑΔΧϝϥϞδϡʔϧͷ ελϒԽ

Slide 61

Slide 61 text

·ͱΊ wϞόΠϧܾࡁΞϓϦͷഎܠͱߏ੒ٕज़ wΩϟογϡϨεਪਐڠٞձ $BTI*O $BTI0VU F ,:$ w"QQMF1BZ w"QQMF1BZ࢓૊Έ ηΩϡϦςΟ *O"QQ1SPWJTJPOJOH wίʔυܾࡁ w+123࢓༷ $1..1.ͷ࢓༷ wطଘΞϓϦ΁ͷܾࡁػೳͷ૊ΈࠐΈ wGSBNFXPSL෼ׂͱTBOECPY %*

Slide 62

Slide 62 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ IUUQTHJUIVCDPNLFONB[+1233FBEFS